diff --git a/packages/server/src/api/controllers/Purchases/Bills.ts b/packages/server/src/api/controllers/Purchases/Bills.ts index 2cd9e62de..9de79ecf7 100644 --- a/packages/server/src/api/controllers/Purchases/Bills.ts +++ b/packages/server/src/api/controllers/Purchases/Bills.ts @@ -303,7 +303,7 @@ export default class BillsController extends BaseController { try { const bill = await this.billsApplication.getBill(tenantId, billId); - return res.status(200).send(this.transfromToResponse({ bill })); + return res.status(200).send({ bill }); } catch (error) { next(error); } @@ -348,14 +348,11 @@ export default class BillsController extends BaseController { }; try { - const { bills, pagination, filterMeta } = - await this.billsApplication.getBills(tenantId, filter); - - return res.status(200).send({ - bills: this.transfromToResponse(bills), - pagination: this.transfromToResponse(pagination), - filter_meta: this.transfromToResponse(filterMeta), - }); + const billsWithPagination = await this.billsApplication.getBills( + tenantId, + filter + ); + return res.status(200).send(billsWithPagination); } catch (error) { next(error); } diff --git a/packages/server/src/api/controllers/Purchases/BillsPayments.ts b/packages/server/src/api/controllers/Purchases/BillsPayments.ts index a663a3032..984ab6fba 100644 --- a/packages/server/src/api/controllers/Purchases/BillsPayments.ts +++ b/packages/server/src/api/controllers/Purchases/BillsPayments.ts @@ -158,15 +158,11 @@ export default class BillsPayments extends BaseController { const { tenantId } = req; const { vendorId } = this.matchedQueryData(req); - try { - const entries = await this.billPaymentsPages.getNewPageEntries( - tenantId, - vendorId - ); - return res.status(200).send({ - entries: this.transfromToResponse(entries), - }); - } catch (error) {} + const entries = await this.billPaymentsPages.getNewPageEntries( + tenantId, + vendorId + ); + return res.status(200).send({ entries }); } /** @@ -183,16 +179,12 @@ export default class BillsPayments extends BaseController { const { id: paymentReceiveId } = req.params; try { - const { billPayment, entries } = + const billPaymentsWithEditEntries = await this.billPaymentsPages.getBillPaymentEditPage( tenantId, paymentReceiveId ); - - return res.status(200).send({ - bill_payment: this.transfromToResponse(billPayment), - entries: this.transfromToResponse(entries), - }); + return res.status(200).send(billPaymentsWithEditEntries); } catch (error) { next(error); } @@ -304,9 +296,7 @@ export default class BillsPayments extends BaseController { tenantId, billPaymentId ); - return res.status(200).send({ - bill_payment: this.transfromToResponse(billPayment), - }); + return res.status(200).send({ billPayment }); } catch (error) { next(error); } @@ -359,17 +349,12 @@ export default class BillsPayments extends BaseController { }; try { - const { billPayments, pagination, filterMeta } = + const billPaymentsWithPagination = await this.billPaymentsApplication.getBillPayments( tenantId, billPaymentsFilter ); - - return res.status(200).send({ - bill_payments: this.transfromToResponse(billPayments), - pagination: this.transfromToResponse(pagination), - filter_meta: this.transfromToResponse(filterMeta), - }); + return res.status(200).send(billPaymentsWithPagination); } catch (error) { next(error); } diff --git a/packages/server/src/api/controllers/Sales/CreditNotes.ts b/packages/server/src/api/controllers/Sales/CreditNotes.ts index 77b506c7d..4644b55c5 100644 --- a/packages/server/src/api/controllers/Sales/CreditNotes.ts +++ b/packages/server/src/api/controllers/Sales/CreditNotes.ts @@ -26,6 +26,7 @@ import GetCreditNoteAssociatedInvoicesToApply from '@/services/CreditNotes/GetCr import GetCreditNoteAssociatedAppliedInvoices from '@/services/CreditNotes/GetCreditNoteAssociatedAppliedInvoices'; import GetRefundCreditTransaction from '@/services/CreditNotes/GetRefundCreditNoteTransaction'; import GetCreditNotePdf from '../../../services/CreditNotes/GetCreditNotePdf'; +import { ACCEPT_TYPE } from '@/interfaces/Http'; /** * Credit notes controller. * @service @@ -293,7 +294,7 @@ export default class PaymentReceivesController extends BaseController { return [ check('from_account_id').exists().isNumeric().toInt(), check('description').optional(), - + check('amount').exists().isNumeric().toFloat(), check('exchange_rate').optional().isFloat({ gt: 0 }).toFloat(), @@ -438,7 +439,7 @@ export default class PaymentReceivesController extends BaseController { }; /** - * Retrieve the payment receive details. + * Retrieve the credit note details. * @param {Request} req * @param {Response} res * @param {NextFunction} next @@ -451,38 +452,28 @@ export default class PaymentReceivesController extends BaseController { const { tenantId } = req; const { id: creditNoteId } = req.params; - try { + const accept = this.accepts(req); + + const acceptType = accept.types([ + ACCEPT_TYPE.APPLICATION_JSON, + ACCEPT_TYPE.APPLICATION_PDF, + ]); + if (ACCEPT_TYPE.APPLICATION_PDF === acceptType) { + const pdfContent = await this.creditNotePdf.getCreditNotePdf( + tenantId, + creditNoteId + ); + res.set({ + 'Content-Type': 'application/pdf', + 'Content-Length': pdfContent.length, + }); + res.send(pdfContent); + } else { const creditNote = await this.getCreditNoteService.getCreditNote( tenantId, creditNoteId ); - const ACCEPT_TYPE = { - APPLICATION_PDF: 'application/pdf', - APPLICATION_JSON: 'application/json', - }; - // Response formatter. - res.format({ - // Json content type. - [ACCEPT_TYPE.APPLICATION_JSON]: () => { - return res - .status(200) - .send({ credit_note: this.transfromToResponse(creditNote) }); - }, - // Pdf content type. - [ACCEPT_TYPE.APPLICATION_PDF]: async () => { - const pdfContent = await this.creditNotePdf.getCreditNotePdf( - tenantId, - creditNote - ); - res.set({ - 'Content-Type': 'application/pdf', - 'Content-Length': pdfContent.length, - }); - res.send(pdfContent); - }, - }); - } catch (error) { - next(error); + return res.status(200).send({ creditNote }); } }; diff --git a/packages/server/src/api/controllers/Sales/PaymentReceives.ts b/packages/server/src/api/controllers/Sales/PaymentReceives.ts index 20e61fe3a..818fcb713 100644 --- a/packages/server/src/api/controllers/Sales/PaymentReceives.ts +++ b/packages/server/src/api/controllers/Sales/PaymentReceives.ts @@ -14,6 +14,7 @@ import DynamicListingService from '@/services/DynamicListing/DynamicListService' import { PaymentReceivesApplication } from '@/services/Sales/PaymentReceives/PaymentReceivesApplication'; import CheckPolicies from '@/api/middleware/CheckPolicies'; import { ServiceError } from '@/exceptions'; +import { ACCEPT_TYPE } from '@/interfaces/Http'; @Service() export default class PaymentReceivesController extends BaseController { @@ -348,17 +349,12 @@ export default class PaymentReceivesController extends BaseController { }; try { - const { paymentReceives, pagination, filterMeta } = + const paymentsReceivedWithPagination = await this.paymentReceiveApplication.getPaymentReceives( tenantId, filter ); - - return res.status(200).send({ - payment_receives: this.transfromToResponse(paymentReceives), - pagination: this.transfromToResponse(pagination), - filter_meta: this.transfromToResponse(filterMeta), - }); + return res.status(200).send(paymentsReceivedWithPagination); } catch (error) { next(error); } @@ -435,37 +431,34 @@ export default class PaymentReceivesController extends BaseController { const { tenantId } = req; const { id: paymentReceiveId } = req.params; - try { - const ACCEPT_TYPE = { - APPLICATION_PDF: 'application/pdf', - APPLICATION_JSON: 'application/json', - }; - res.format({ - [ACCEPT_TYPE.APPLICATION_JSON]: async () => { - const paymentReceive = - await this.paymentReceiveApplication.getPaymentReceive( - tenantId, - paymentReceiveId - ); - return res.status(200).send({ - payment_receive: paymentReceive, - }); - }, - [ACCEPT_TYPE.APPLICATION_PDF]: async () => { - const pdfContent = - await this.paymentReceiveApplication.getPaymentReceivePdf( - tenantId, - paymentReceiveId - ); - res.set({ - 'Content-Type': 'application/pdf', - 'Content-Length': pdfContent.length, - }); - res.send(pdfContent); - }, + const accept = this.accepts(req); + + const acceptType = accept.types([ + ACCEPT_TYPE.APPLICATION_JSON, + ACCEPT_TYPE.APPLICATION_PDF, + ]); + // Response in pdf format. + if (ACCEPT_TYPE.APPLICATION_PDF === acceptType) { + const pdfContent = + await this.paymentReceiveApplication.getPaymentReceivePdf( + tenantId, + paymentReceiveId + ); + res.set({ + 'Content-Type': 'application/pdf', + 'Content-Length': pdfContent.length, + }); + res.send(pdfContent); + // Response in json format. + } else { + const paymentReceive = + await this.paymentReceiveApplication.getPaymentReceive( + tenantId, + paymentReceiveId + ); + return res.status(200).send({ + payment_receive: paymentReceive, }); - } catch (error) { - next(error); } } @@ -499,7 +492,7 @@ export default class PaymentReceivesController extends BaseController { }; /** - * + * Retrieves the sms details of the given payment receive. * @param {Request} req * @param {Response} res * @param {NextFunction} next @@ -588,10 +581,10 @@ export default class PaymentReceivesController extends BaseController { /** * Handles service errors. - * @param error - * @param req - * @param res - * @param next + * @param {Error} error + * @param {Request} req + * @param {Response} res + * @param {NextFunction} next */ private handleServiceErrors( error: Error, diff --git a/packages/server/src/api/controllers/Sales/SalesEstimates.ts b/packages/server/src/api/controllers/Sales/SalesEstimates.ts index b34c1ccf2..e26b40c30 100644 --- a/packages/server/src/api/controllers/Sales/SalesEstimates.ts +++ b/packages/server/src/api/controllers/Sales/SalesEstimates.ts @@ -334,7 +334,6 @@ export default class SalesEstimatesController extends BaseController { tenantId, estimateId ); - return res.status(200).send({ id: estimateId, message: 'The sale estimate has been approved successfully.', @@ -363,7 +362,6 @@ export default class SalesEstimatesController extends BaseController { tenantId, estimateId ); - return res.status(200).send({ id: estimateId, message: 'The sale estimate has been rejected successfully.', @@ -383,33 +381,30 @@ export default class SalesEstimatesController extends BaseController { const { id: estimateId } = req.params; const { tenantId } = req; - try { - // Response formatter. - res.format({ - // JSON content type. - [ACCEPT_TYPE.APPLICATION_JSON]: async () => { - const estimate = await this.saleEstimatesApplication.getSaleEstimate( - tenantId, - estimateId - ); - return res.status(200).send({ estimate }); - }, - // PDF content type. - [ACCEPT_TYPE.APPLICATION_PDF]: async () => { - const pdfContent = - await this.saleEstimatesApplication.getSaleEstimatePdf( - tenantId, - estimateId - ); - res.set({ - 'Content-Type': 'application/pdf', - 'Content-Length': pdfContent.length, - }); - res.send(pdfContent); - }, + const accept = this.accepts(req); + + const acceptType = accept.types([ + ACCEPT_TYPE.APPLICATION_JSON, + ACCEPT_TYPE.APPLICATION_PDF, + ]); + // Retrieves estimate in pdf format. + if (ACCEPT_TYPE.APPLICATION_PDF == acceptType) { + const pdfContent = await this.saleEstimatesApplication.getSaleEstimatePdf( + tenantId, + estimateId + ); + res.set({ + 'Content-Type': 'application/pdf', + 'Content-Length': pdfContent.length, }); - } catch (error) { - next(error); + res.send(pdfContent); + // Retrieves estimates in json format. + } else { + const estimate = await this.saleEstimatesApplication.getSaleEstimate( + tenantId, + estimateId + ); + return res.status(200).send({ estimate }); } } @@ -427,22 +422,11 @@ export default class SalesEstimatesController extends BaseController { pageSize: 12, ...this.matchedQueryData(req), }; - try { - const { salesEstimates, pagination, filterMeta } = + const salesEstimatesWithPagination = await this.saleEstimatesApplication.getSaleEstimates(tenantId, filter); - res.format({ - [ACCEPT_TYPE.APPLICATION_JSON]: () => { - return res.status(200).send( - this.transfromToResponse({ - salesEstimates, - pagination, - filterMeta, - }) - ); - }, - }); + return res.status(200).send(salesEstimatesWithPagination); } catch (error) { next(error); } diff --git a/packages/server/src/api/controllers/Sales/SalesInvoices.ts b/packages/server/src/api/controllers/Sales/SalesInvoices.ts index c66d2dae1..b45604e43 100644 --- a/packages/server/src/api/controllers/Sales/SalesInvoices.ts +++ b/packages/server/src/api/controllers/Sales/SalesInvoices.ts @@ -14,11 +14,8 @@ import { } from '@/interfaces'; import CheckPolicies from '@/api/middleware/CheckPolicies'; import { SaleInvoiceApplication } from '@/services/Sales/Invoices/SaleInvoicesApplication'; +import { ACCEPT_TYPE } from '@/interfaces/Http'; -const ACCEPT_TYPE = { - APPLICATION_PDF: 'application/pdf', - APPLICATION_JSON: 'application/json', -}; @Service() export default class SaleInvoicesController extends BaseController { @Inject() @@ -403,7 +400,6 @@ export default class SaleInvoicesController extends BaseController { saleInvoiceId, user ); - return res.status(200).send({ id: saleInvoiceId, message: 'The sale invoice has been deleted successfully.', @@ -422,30 +418,32 @@ export default class SaleInvoicesController extends BaseController { const { id: saleInvoiceId } = req.params; const { tenantId, user } = req; - // Response formatter. - return res.format({ - // JSON content type. - [ACCEPT_TYPE.APPLICATION_JSON]: async () => { - const saleInvoice = await this.saleInvoiceApplication.getSaleInvoice( - tenantId, - saleInvoiceId, - user - ); - return res.status(200).send(this.transfromToResponse({ saleInvoice })); - }, - // PDF content type. - [ACCEPT_TYPE.APPLICATION_PDF]: async () => { - const pdfContent = await this.saleInvoiceApplication.saleInvoicePdf( - tenantId, - saleInvoiceId - ); - res.set({ - 'Content-Type': 'application/pdf', - 'Content-Length': pdfContent.length, - }); - res.send(pdfContent); - }, - }); + const accept = this.accepts(req); + + const acceptType = accept.types([ + ACCEPT_TYPE.APPLICATION_JSON, + ACCEPT_TYPE.APPLICATION_PDF, + ]); + // Retrieves invoice in pdf format. + if (ACCEPT_TYPE.APPLICATION_PDF == acceptType) { + const pdfContent = await this.saleInvoiceApplication.saleInvoicePdf( + tenantId, + saleInvoiceId + ); + res.set({ + 'Content-Type': 'application/pdf', + 'Content-Length': pdfContent.length, + }); + res.send(pdfContent); + // Retrieves invoice in json format. + } else { + const saleInvoice = await this.saleInvoiceApplication.getSaleInvoice( + tenantId, + saleInvoiceId, + user + ); + return res.status(200).send({ saleInvoice }); + } } /** * Retrieve paginated sales invoices with custom view metadata. @@ -467,14 +465,10 @@ export default class SaleInvoicesController extends BaseController { ...this.matchedQueryData(req), }; try { - const { salesInvoices, filterMeta, pagination } = + const salesInvoicesWithPagination = await this.saleInvoiceApplication.getSaleInvoices(tenantId, filter); - return res.status(200).send({ - sales_invoices: this.transfromToResponse(salesInvoices), - pagination: this.transfromToResponse(pagination), - filter_meta: this.transfromToResponse(filterMeta), - }); + return res.status(200).send(salesInvoicesWithPagination); } catch (error) { next(error); } @@ -501,9 +495,7 @@ export default class SaleInvoicesController extends BaseController { tenantId, customerId ); - return res.status(200).send({ - sales_invoices: this.transfromToResponse(salesInvoices), - }); + return res.status(200).send({ salesInvoices }); } catch (error) { next(error); } @@ -531,7 +523,6 @@ export default class SaleInvoicesController extends BaseController { invoiceId, writeoffDTO ); - return res.status(200).send({ id: saleInvoice.id, message: 'The given sale invoice has been written-off successfully.', diff --git a/packages/server/src/api/controllers/Sales/SalesReceipts.ts b/packages/server/src/api/controllers/Sales/SalesReceipts.ts index 6151561f8..04edfd9f8 100644 --- a/packages/server/src/api/controllers/Sales/SalesReceipts.ts +++ b/packages/server/src/api/controllers/Sales/SalesReceipts.ts @@ -3,12 +3,17 @@ import { body, check, param, query } from 'express-validator'; import { Inject, Service } from 'typedi'; import asyncMiddleware from '@/api/middleware/asyncMiddleware'; import BaseController from '../BaseController'; -import { ISaleReceiptDTO, SaleReceiptMailOpts, SaleReceiptMailOptsDTO } from '@/interfaces/SaleReceipt'; +import { + ISaleReceiptDTO, + SaleReceiptMailOpts, + SaleReceiptMailOptsDTO, +} from '@/interfaces/SaleReceipt'; import { ServiceError } from '@/exceptions'; import DynamicListingService from '@/services/DynamicListing/DynamicListService'; import CheckPolicies from '@/api/middleware/CheckPolicies'; import { AbilitySubject, SaleReceiptAction } from '@/interfaces'; import { SaleReceiptApplication } from '@/services/Sales/Receipts/SaleReceiptApplication'; +import { ACCEPT_TYPE } from '@/interfaces/Http'; @Service() export default class SalesReceiptsController extends BaseController { @@ -62,9 +67,7 @@ export default class SalesReceiptsController extends BaseController { ); router.get( '/:id/mail', - [ - ...this.specificReceiptValidationSchema, - ], + [...this.specificReceiptValidationSchema], this.validationResult, asyncMiddleware(this.getSaleReceiptMail.bind(this)), this.handleServiceErrors @@ -228,7 +231,6 @@ export default class SalesReceiptsController extends BaseController { tenantId, saleReceiptId ); - return res.status(200).send({ id: saleReceiptId, message: 'Sale receipt has been deleted successfully.', @@ -317,15 +319,10 @@ export default class SalesReceiptsController extends BaseController { ...this.matchedQueryData(req), }; try { - const { data, pagination, filterMeta } = + const salesReceiptsWithPagination = await this.saleReceiptsApplication.getSaleReceipts(tenantId, filter); - const response = this.transfromToResponse({ - data, - pagination, - filterMeta, - }); - return res.status(200).send(response); + return res.status(200).send(salesReceiptsWithPagination); } catch (error) { next(error); } @@ -337,34 +334,34 @@ export default class SalesReceiptsController extends BaseController { * @param {Response} res * @param {NextFunction} next */ - public async getSaleReceipt(req: Request, res: Response, next: NextFunction) { + public async getSaleReceipt(req: Request, res: Response) { const { id: saleReceiptId } = req.params; const { tenantId } = req; - try { - res.format({ - 'application/json': async () => { - const saleReceipt = await this.saleReceiptsApplication.getSaleReceipt( - tenantId, - saleReceiptId - ); - return res.status(200).send({ saleReceipt }); - }, - 'application/pdf': async () => { - const pdfContent = - await this.saleReceiptsApplication.getSaleReceiptPdf( - tenantId, - saleReceiptId - ); - res.set({ - 'Content-Type': 'application/pdf', - 'Content-Length': pdfContent.length, - }); - res.send(pdfContent); - }, + const accept = this.accepts(req); + + const acceptType = accept.types([ + ACCEPT_TYPE.APPLICATION_JSON, + ACCEPT_TYPE.APPLICATION_PDF, + ]); + // Retrieves receipt in pdf format. + if (ACCEPT_TYPE.APPLICATION_PDF == acceptType) { + const pdfContent = await this.saleReceiptsApplication.getSaleReceiptPdf( + tenantId, + saleReceiptId + ); + res.set({ + 'Content-Type': 'application/pdf', + 'Content-Length': pdfContent.length, }); - } catch (error) { - next(error); + res.send(pdfContent); + // Retrieves receipt in json format. + } else { + const saleReceipt = await this.saleReceiptsApplication.getSaleReceipt( + tenantId, + saleReceiptId + ); + return res.status(200).send({ saleReceipt }); } } diff --git a/packages/server/src/services/CreditNotes/GetCreditNotePdf.ts b/packages/server/src/services/CreditNotes/GetCreditNotePdf.ts index c34dfd330..c54c8096e 100644 --- a/packages/server/src/services/CreditNotes/GetCreditNotePdf.ts +++ b/packages/server/src/services/CreditNotes/GetCreditNotePdf.ts @@ -1,6 +1,7 @@ import { Inject, Service } from 'typedi'; import { ChromiumlyTenancy } from '../ChromiumlyTenancy/ChromiumlyTenancy'; import { TemplateInjectable } from '../TemplateInjectable/TemplateInjectable'; +import GetCreditNote from './GetCreditNote'; @Service() export default class GetCreditNotePdf { @@ -10,11 +11,19 @@ export default class GetCreditNotePdf { @Inject() private templateInjectable: TemplateInjectable; + @Inject() + private getCreditNoteService: GetCreditNote; + /** * Retrieve sale invoice pdf content. - * @param {} saleInvoice - + * @param {number} tenantId - Tenant id. + * @param {number} creditNoteId - Credit note id. */ - public async getCreditNotePdf(tenantId: number, creditNote) { + public async getCreditNotePdf(tenantId: number, creditNoteId: number) { + const creditNote = await this.getCreditNoteService.getCreditNote( + tenantId, + creditNoteId + ); const htmlContent = await this.templateInjectable.render( tenantId, 'modules/credit-note-standard',