From 0a03fcdd926238b7e8866d2f091f9251967ba405 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Sat, 24 Oct 2020 12:37:17 +0200 Subject: [PATCH] fix: retrieve bills and bills payments list. --- server/src/api/controllers/Purchases/Bills.ts | 64 +++++++++++++------ .../controllers/Purchases/BillsPayments.ts | 49 ++++++++------ server/src/interfaces/Bill.ts | 6 +- server/src/models/Bill.js | 16 ++++- server/src/models/BillPayment.js | 17 ++++- server/src/services/Purchases/BillPayments.ts | 14 ++-- server/src/services/Purchases/Bills.ts | 31 +++++++++ 7 files changed, 148 insertions(+), 49 deletions(-) diff --git a/server/src/api/controllers/Purchases/Bills.ts b/server/src/api/controllers/Purchases/Bills.ts index f7f0324b7..12229475c 100644 --- a/server/src/api/controllers/Purchases/Bills.ts +++ b/server/src/api/controllers/Purchases/Bills.ts @@ -7,6 +7,7 @@ import BillsService from 'services/Purchases/Bills'; import BaseController from 'api/controllers/BaseController'; import ItemsService from 'services/Items/ItemsService'; import TenancyService from 'services/Tenancy/TenancyService'; +import DynamicListingService from 'services/DynamicListing/DynamicListService'; import { ServiceError } from 'exceptions'; @Service() @@ -20,6 +21,9 @@ export default class BillsController extends BaseController { @Inject() tenancy: TenancyService; + @Inject() + dynamicListService: DynamicListingService; + /** * Router constructor. */ @@ -28,7 +32,7 @@ export default class BillsController extends BaseController { router.post( '/', [ - ...this.billValidationSchema + ...this.billValidationSchema, ], this.validationResult, asyncMiddleware(this.newBill.bind(this)), @@ -44,29 +48,25 @@ export default class BillsController extends BaseController { ); router.get( '/:id', [ - ...this.specificBillValidationSchema + ...this.specificBillValidationSchema, ], this.validationResult, asyncMiddleware(this.getBill.bind(this)), + this.handleServiceError, + ); + router.get( + '/', [ + ...this.billsListingValidationSchema, + ], + this.validationResult, + asyncMiddleware(this.billsList.bind(this)), + this.handleServiceError, + this.dynamicListService.handlerErrorsToResponse, ); - - // router.get( - // '/:id', - // [...this.specificBillValidationSchema], - // this.validationResult, - // asyncMiddleware(this.getBill.bind(this)), - // this.handleServiceError, - // ); - // router.get( - // '/', - // [...this.billsListingValidationSchema], - // this.validationResult, - // asyncMiddleware(this.listingBills.bind(this)), - // this.handleServiceError, - // ); router.delete( - '/:id', - [...this.specificBillValidationSchema], + '/:id', [ + ...this.specificBillValidationSchema + ], this.validationResult, asyncMiddleware(this.deleteBill.bind(this)), this.handleServiceError, @@ -221,8 +221,30 @@ export default class BillsController extends BaseController { * @param {Response} res - * @return {Response} */ - async billsList(req: Request, res: Response) { - + public async billsList(req: Request, res: Response, next: NextFunction) { + const { tenantId } = req; + const filter = { + page: 1, + pageSize: 12, + filterRoles: [], + sortOrder: 'asc', + columnSortBy: 'created_at', + ...this.matchedQueryData(req), + }; + if (filter.stringifiedFilterRoles) { + filter.filterRoles = JSON.parse(filter.stringifiedFilterRoles); + } + try { + const { bills, pagination, filterMeta } = await this.billsService.getBills(tenantId, filter); + + return res.status(200).send({ + bills, + pagination: this.transfromToResponse(pagination), + filter_meta: this.transfromToResponse(filterMeta), + }); + } catch (error) { + next(error); + } } /** diff --git a/server/src/api/controllers/Purchases/BillsPayments.ts b/server/src/api/controllers/Purchases/BillsPayments.ts index d6782af98..f175e09fd 100644 --- a/server/src/api/controllers/Purchases/BillsPayments.ts +++ b/server/src/api/controllers/Purchases/BillsPayments.ts @@ -6,6 +6,7 @@ import asyncMiddleware from 'api/middleware/asyncMiddleware'; import { ServiceError } from 'exceptions'; import BaseController from 'api/controllers/BaseController'; import BillPaymentsService from 'services/Purchases/BillPayments'; +import DynamicListingService from 'services/DynamicListing/DynamicListService'; import AccountsService from 'services/Accounts/AccountsService'; /** @@ -20,6 +21,9 @@ export default class BillsPayments extends BaseController { @Inject() accountsService: AccountsService; + @Inject() + dynamicListService: DynamicListingService; + /** * Router constructor. */ @@ -48,16 +52,19 @@ export default class BillsPayments extends BaseController { asyncMiddleware(this.deleteBillPayment.bind(this)), this.handleServiceError, ); - // router.get('/:id', - // this.specificBillPaymentValidateSchema, - // this.validationResult, - // asyncMiddleware(this.getBillPayment.bind(this)), - // ); - // router.get('/', - // this.listingValidationSchema, - // this.validationResult, - // asyncMiddleware(this.getBillsPayments.bind(this)) - // ); + router.get('/:id', + this.specificBillPaymentValidateSchema, + this.validationResult, + asyncMiddleware(this.getBillPayment.bind(this)), + this.handleServiceError, + ); + router.get('/', + this.listingValidationSchema, + this.validationResult, + asyncMiddleware(this.getBillsPayments.bind(this)), + this.handleServiceError, + this.dynamicListService.handlerErrorsToResponse, + ); return router; } @@ -183,10 +190,9 @@ export default class BillsPayments extends BaseController { const { tenantId } = req; const { id: billPaymentId } = req.params; - const billPayment = await this.billPaymentService - .getBillPaymentWithMetadata(tenantId, billPaymentId); + const billPayment = await this.billPaymentService.getBillPayment(tenantId, billPaymentId); - return res.status(200).send({ bill_payment: { ...billPayment } }); + return res.status(200).send({ bill_payment: billPayment }); } /** @@ -196,13 +202,19 @@ export default class BillsPayments extends BaseController { * @return {Response} */ async getBillsPayments(req: Request, res: Response, next: NextFunction) { - const { tenantId } = req.params; - const billPaymentsFilter = this.matchedQueryData(req); + const { tenantId } = req; + const billPaymentsFilter = { + page: 1, + pageSize: 12, + filterRoles: [], + sortOrder: 'asc', + columnSortBy: 'created_at', + ...this.matchedQueryData(req), + }; try { - const { billPayments, pagination, filterMeta } = await this.billPaymentService - .listBillPayments(tenantId, billPaymentsFilter); - + const { billPayments, pagination, filterMeta } = await this.billPaymentService.listBillPayments(tenantId, billPaymentsFilter); + return res.status(200).send({ bill_payments: billPayments, pagination: this.transfromToResponse(pagination), @@ -273,7 +285,6 @@ export default class BillsPayments extends BaseController { }) } } - console.log(error); next(error); } } \ No newline at end of file diff --git a/server/src/interfaces/Bill.ts b/server/src/interfaces/Bill.ts index b8bffe78b..2b73a8295 100644 --- a/server/src/interfaces/Bill.ts +++ b/server/src/interfaces/Bill.ts @@ -41,4 +41,8 @@ export interface IBill { entries: IItemEntry[], }; - \ No newline at end of file + +export interface IBillsFilter { + page: number, + pageSize: number, +} \ No newline at end of file diff --git a/server/src/models/Bill.js b/server/src/models/Bill.js index 2e7429492..82bbd3524 100644 --- a/server/src/models/Bill.js +++ b/server/src/models/Bill.js @@ -17,6 +17,10 @@ export default class Bill extends TenantModel { return 'bills'; } + static get resourceable() { + return true; + } + /** * Timestamps columns. */ @@ -48,7 +52,7 @@ export default class Bill extends TenantModel { to: 'contacts.id', }, filter(query) { - query.where('contact_type', 'Vendor'); + query.where('contact_service', 'vendor'); } }, @@ -97,4 +101,14 @@ export default class Bill extends TenantModel { .where('id', billId) [changeMethod]('payment_amount', Math.abs(amount)); } + + static get fields() { + return { + created_at: { + label: 'Created at', + column: 'created_at', + columnType: 'date', + }, + } + } } diff --git a/server/src/models/BillPayment.js b/server/src/models/BillPayment.js index 282722a35..8dd198718 100644 --- a/server/src/models/BillPayment.js +++ b/server/src/models/BillPayment.js @@ -16,6 +16,10 @@ export default class BillPayment extends TenantModel { return ['createdAt', 'updatedAt']; } + static get resourceable() { + return true; + } + /** * Relationship mapping. */ @@ -43,7 +47,7 @@ export default class BillPayment extends TenantModel { to: 'contacts.id', }, filter(query) { - query.where('contact_type', 'Vendor'); + query.where('contact_service', 'vendor'); } }, @@ -69,4 +73,15 @@ export default class BillPayment extends TenantModel { } }; } + + + static get fields() { + return { + created_at: { + label: 'Created at', + column: 'created_at', + columnType: 'date', + }, + } + } } diff --git a/server/src/services/Purchases/BillPayments.ts b/server/src/services/Purchases/BillPayments.ts index 4020c86dd..9d230efbf 100644 --- a/server/src/services/Purchases/BillPayments.ts +++ b/server/src/services/Purchases/BillPayments.ts @@ -423,7 +423,7 @@ export default class BillPaymentsService { const dynamicFilter = await this.dynamicListService.dynamicList(tenantId, BillPayment, billPaymentsFilter); this.logger.info('[bill_payment] try to get bill payments list.', { tenantId }); - const { results, pagination } = await BillPayment.query().onBuild(builder => { + const { results, pagination } = await BillPayment.query().onBuild((builder) => { builder.withGraphFetched('vendor'); builder.withGraphFetched('paymentAccount'); dynamicFilter.buildQuery()(builder); @@ -444,15 +444,17 @@ export default class BillPaymentsService { * @param {number} billPaymentId - The bill payment id. * @return {object} */ - async getBillPaymentWithMetadata(tenantId: number, billPaymentId: number) { + public async getBillPayment(tenantId: number, billPaymentId: number) { const { BillPayment } = this.tenancy.models(tenantId); const billPayment = await BillPayment.query() - .where('id', billPaymentId) + .findById(billPaymentId) .withGraphFetched('entries') .withGraphFetched('vendor') - .withGraphFetched('paymentAccount') - .first(); - + .withGraphFetched('paymentAccount'); + + if (!billPayment) { + throw new ServiceError(ERRORS.PAYMENT_MADE_NOT_FOUND); + } return billPayment; } } diff --git a/server/src/services/Purchases/Bills.ts b/server/src/services/Purchases/Bills.ts index 378248d6f..923ad754e 100644 --- a/server/src/services/Purchases/Bills.ts +++ b/server/src/services/Purchases/Bills.ts @@ -12,6 +12,7 @@ import AccountsService from 'services/Accounts/AccountsService'; import InventoryService from 'services/Inventory/Inventory'; import SalesInvoicesCost from 'services/Sales/SalesInvoicesCost'; import TenancyService from 'services/Tenancy/TenancyService'; +import DynamicListingService from 'services/DynamicListing/DynamicListService'; import { formatDateFields } from 'utils'; import { IBillDTO, @@ -21,6 +22,9 @@ import { IItemEntry, IItemEntryDTO, IBillEditDTO, + IPaginationMeta, + IFilterMeta, + IBillsFilter, } from 'interfaces'; import { ServiceError } from 'exceptions'; import ItemsService from 'services/Items/ItemsService'; @@ -59,6 +63,9 @@ export default class BillsService extends SalesInvoicesCost { @Inject('logger') logger: any; + @Inject() + dynamicListService: DynamicListingService; + /** * Validates whether the vendor is exist. * @async @@ -423,6 +430,30 @@ export default class BillsService extends SalesInvoicesCost { ]); } + /** + * Retrieve bills data table list. + * @param {number} tenantId - + * @param {IBillsFilter} billsFilter - + */ + public async getBills( + tenantId: number, + billsFilter: IBillsFilter, + ): Promise<{ bills: IBill, pagination: IPaginationMeta, filterMeta: IFilterMeta }> { + const { Bill } = this.tenancy.models(tenantId); + const dynamicFilter = await this.dynamicListService.dynamicList(tenantId, Bill, billsFilter); + + this.logger.info('[bills] trying to get bills data table.', { tenantId, billsFilter }); + const { results, pagination } = await Bill.query().onBuild((builder) => { + builder.withGraphFetched('vendor'); + dynamicFilter.buildQuery()(builder); + }).pagination(billsFilter.page - 1, billsFilter.pageSize); + + return { + bills: results, + pagination, + filterMeta: dynamicFilter.getResponseMeta(), + }; + } /** * Retrieve the given bill details with associated items entries.