feat: retrieve bills that associated to payment made transaction.

feat: retrieve sale invoices that associated to payment receive transactions.
This commit is contained in:
Ahmed Bouhuolia
2020-10-28 22:41:16 +02:00
parent fd6a3224fa
commit a457005fd8
4 changed files with 93 additions and 4 deletions

View File

@@ -8,6 +8,7 @@ import BaseController from 'api/controllers/BaseController';
import BillPaymentsService from 'services/Purchases/BillPayments'; import BillPaymentsService from 'services/Purchases/BillPayments';
import DynamicListingService from 'services/DynamicListing/DynamicListService'; import DynamicListingService from 'services/DynamicListing/DynamicListService';
import AccountsService from 'services/Accounts/AccountsService'; import AccountsService from 'services/Accounts/AccountsService';
import ResourceController from '../Resources';
/** /**
* Bills payments controller. * Bills payments controller.
@@ -52,6 +53,12 @@ export default class BillsPayments extends BaseController {
asyncMiddleware(this.deleteBillPayment.bind(this)), asyncMiddleware(this.deleteBillPayment.bind(this)),
this.handleServiceError, this.handleServiceError,
); );
router.get('/:id/bills',
this.specificBillPaymentValidateSchema,
this.validationResult,
asyncMiddleware(this.getPaymentBills.bind(this)),
this.handleServiceError,
);
router.get('/:id', router.get('/:id',
this.specificBillPaymentValidateSchema, this.specificBillPaymentValidateSchema,
this.validationResult, this.validationResult,
@@ -190,9 +197,30 @@ export default class BillsPayments extends BaseController {
const { tenantId } = req; const { tenantId } = req;
const { id: billPaymentId } = req.params; const { id: billPaymentId } = req.params;
const billPayment = await this.billPaymentService.getBillPayment(tenantId, billPaymentId); try {
const billPayment = await this.billPaymentService.getBillPayment(tenantId, billPaymentId);
return res.status(200).send({ bill_payment: billPayment });
} catch (error) {
next(error);
}
}
return res.status(200).send({ bill_payment: billPayment }); /**
* Retrieve associated bills for the given payment made.
* @param {Request} req
* @param {Response} res
* @param {NextFunction} next
*/
async getPaymentBills(req: Request, res: Response, next: NextFunction) {
const { tenantId } = req;
const { id: billPaymentId } = req.params;
try {
const bills = await this.billPaymentService.getPaymentBills(tenantId, billPaymentId);
return res.status(200).send({ bills });
} catch (error) {
next(error);
}
} }
/** /**

View File

@@ -40,6 +40,13 @@ export default class PaymentReceivesController extends BaseController {
asyncMiddleware(this.newPaymentReceive.bind(this)), asyncMiddleware(this.newPaymentReceive.bind(this)),
this.handleServiceErrors, this.handleServiceErrors,
); );
router.get(
'/:id/invoices',
this.paymentReceiveValidation,
this.validationResult,
asyncMiddleware(this.getPaymentReceiveInvoices.bind(this)),
this.handleServiceErrors,
);
router.get( router.get(
'/:id', '/:id',
this.paymentReceiveValidation, this.paymentReceiveValidation,
@@ -209,6 +216,26 @@ export default class PaymentReceivesController extends BaseController {
} }
} }
/**
* Retrieve sale invoices that associated with the given payment receive.
* @param {Request} req
* @param {Response} res
* @param {NextFunction} next
*/
async getPaymentReceiveInvoices(req: Request, res: Response, next: NextFunction) {
const { tenantId } = req;
const { id: paymentReceiveId } = req.params;
try {
const invoices = await this.paymentReceiveService.getPaymentReceiveInvoices(
tenantId, paymentReceiveId,
);
return res.status(200).send({ sale_invoices: invoices });
} catch (error) {
next(error);
}
}
/** /**
* Retrieve payment receive list with pagination metadata. * Retrieve payment receive list with pagination metadata.
* @param {Request} req * @param {Request} req

View File

@@ -25,6 +25,7 @@ import TenancyService from 'services/Tenancy/TenancyService';
import DynamicListingService from 'services/DynamicListing/DynamicListService'; import DynamicListingService from 'services/DynamicListing/DynamicListService';
import { entriesAmountDiff, formatDateFields } from 'utils'; import { entriesAmountDiff, formatDateFields } from 'utils';
import { ServiceError } from 'exceptions'; import { ServiceError } from 'exceptions';
import { Bill } from 'models';
const ERRORS = { const ERRORS = {
BILL_VENDOR_NOT_FOUND: 'VENDOR_NOT_FOUND', BILL_VENDOR_NOT_FOUND: 'VENDOR_NOT_FOUND',
@@ -366,6 +367,22 @@ export default class BillPaymentsService {
this.logger.info('[bill_payment] deleted successfully.', { tenantId, billPaymentId }); this.logger.info('[bill_payment] deleted successfully.', { tenantId, billPaymentId });
} }
/**
* Retrieve payment made associated bills.
* @param {number} tenantId -
* @param {number} billPaymentId -
*/
public async getPaymentBills(tenantId: number, billPaymentId: number) {
const { Bill } = this.tenancy.models(tenantId);
const billPayment = await this.getPaymentMadeOrThrowError(tenantId, billPaymentId);
const paymentBillsIds = billPayment.entries.map((entry) => entry.id);
const bills = await Bill.query().whereIn('id', paymentBillsIds);
return bills;
}
/** /**
* Records bill payment receive journal transactions. * Records bill payment receive journal transactions.
* @param {number} tenantId - * @param {number} tenantId -

View File

@@ -26,6 +26,7 @@ import { formatDateFields, entriesAmountDiff } from 'utils';
import { ServiceError } from 'exceptions'; import { ServiceError } from 'exceptions';
import CustomersService from 'services/Contacts/CustomersService'; import CustomersService from 'services/Contacts/CustomersService';
import ItemsEntriesService from 'services/Items/ItemsEntriesService'; import ItemsEntriesService from 'services/Items/ItemsEntriesService';
import { SaleInvoice } from 'models';
const ERRORS = { const ERRORS = {
PAYMENT_RECEIVE_NO_EXISTS: 'PAYMENT_RECEIVE_NO_EXISTS', PAYMENT_RECEIVE_NO_EXISTS: 'PAYMENT_RECEIVE_NO_EXISTS',
@@ -337,7 +338,24 @@ export default class PaymentReceiveService {
} }
return paymentReceive; return paymentReceive;
} }
/**
* Retrieve sale invoices that assocaited to the given payment receive.
* @param {number} tenantId - Tenant id.
* @param {number} paymentReceiveId - Payment receive id.
* @return {Promise<ISaleInvoice>}
*/
public async getPaymentReceiveInvoices(tenantId: number, paymentReceiveId: number) {
const { SaleInvoice } = this.tenancy.models(tenantId);
const paymentReceive = await this.getPaymentReceiveOrThrowError(tenantId, paymentReceiveId);
const paymentReceiveInvoicesIds = paymentReceive.entries.map(entry => entry.invoiceId);
const saleInvoices = await SaleInvoice.query().whereIn('id', paymentReceiveInvoicesIds);
return saleInvoices;
}
/** /**
* Retrieve payment receives paginated and filterable list. * Retrieve payment receives paginated and filterable list.
* @param {number} tenantId * @param {number} tenantId
@@ -442,7 +460,6 @@ export default class PaymentReceiveService {
]); ]);
} }
/** /**
* Saves difference changing between old and new invoice payment amount. * Saves difference changing between old and new invoice payment amount.
* @async * @async