From 5f40d508527df1f4ba7b30fcc5dc101a732d5f0f Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Tue, 17 Sep 2024 18:19:28 +0200 Subject: [PATCH] fix: pdf template customization --- .../PdfTemplates/PdfTemplatesController.ts | 28 +++++++++++-------- .../services/PdfTemplate/CreatePdfTemplate.ts | 3 +- .../PdfTemplate/PdfTemplateApplication.ts | 2 +- .../server/src/services/PdfTemplate/types.ts | 6 ++++ .../src/services/Sales/Estimates/utils.ts | 17 ++++++++++- .../src/services/Sales/Invoices/utils.ts | 5 +++- .../PaymentReceivedBrandingTemplate.ts | 2 +- .../services/Sales/PaymentReceived/utils.ts | 11 +++++++- .../src/services/Sales/Receipts/utils.ts | 18 ++++++++++-- .../CreditNoteCustomizeContent.tsx | 4 --- .../EstimateCustomizeContent.tsx | 4 --- .../InvoiceCustomizeContent.tsx | 4 --- .../Sales/Invoices/InvoiceForm/utils.tsx | 1 - .../PaymentReceivedCustomizeContent.tsx | 4 --- .../ReceiptCustomizeContent.tsx | 4 --- .../webapp/src/hooks/query/pdf-templates.ts | 2 +- 16 files changed, 74 insertions(+), 41 deletions(-) diff --git a/packages/server/src/api/controllers/PdfTemplates/PdfTemplatesController.ts b/packages/server/src/api/controllers/PdfTemplates/PdfTemplatesController.ts index baad0cace..c3758250d 100644 --- a/packages/server/src/api/controllers/PdfTemplates/PdfTemplatesController.ts +++ b/packages/server/src/api/controllers/PdfTemplates/PdfTemplatesController.ts @@ -21,7 +21,7 @@ export class PdfTemplatesController extends BaseController { this.validationResult, this.deletePdfTemplate.bind(this) ); - router.put( + router.post( '/:template_id', [ param('template_id').exists().isInt().toInt(), @@ -77,7 +77,10 @@ export class PdfTemplatesController extends BaseController { resource, attributes ); - return res.status(201).send(result); + return res.status(201).send({ + id: result.id, + message: 'The PDF template has been created successfully.', + }); } catch (error) { next(error); } @@ -94,7 +97,10 @@ export class PdfTemplatesController extends BaseController { Number(templateId), editTemplateDTO ); - return res.status(200).send(result); + return res.status(200).send({ + id: result.id, + message: 'The PDF template has been updated successfully.', + }); } catch (error) { next(error); } @@ -109,7 +115,10 @@ export class PdfTemplatesController extends BaseController { tenantId, Number(templateId) ); - return res.status(204).send(); + return res.status(204).send({ + id: templateId, + message: 'The PDF template has been deleted successfully.', + }); } catch (error) { next(error); } @@ -158,13 +167,10 @@ export class PdfTemplatesController extends BaseController { tenantId, Number(templateId) ); - return res - .status(204) - .send({ - id: templateId, - message: - 'The given pdf template has been assigned as default template', - }); + return res.status(204).send({ + id: templateId, + message: 'The given pdf template has been assigned as default template', + }); } catch (error) { next(error); } diff --git a/packages/server/src/services/PdfTemplate/CreatePdfTemplate.ts b/packages/server/src/services/PdfTemplate/CreatePdfTemplate.ts index 02efc83f2..a437b163c 100644 --- a/packages/server/src/services/PdfTemplate/CreatePdfTemplate.ts +++ b/packages/server/src/services/PdfTemplate/CreatePdfTemplate.ts @@ -36,7 +36,7 @@ export class CreatePdfTemplate { tenantId, }); - await PdfTemplate.query(trx).insert({ + const pdfTemplate = await PdfTemplate.query(trx).insert({ templateName, resource, attributes, @@ -45,6 +45,7 @@ export class CreatePdfTemplate { await this.eventPublisher.emitAsync(events.pdfTemplate.onCreated, { tenantId, }); + return pdfTemplate; }); } } diff --git a/packages/server/src/services/PdfTemplate/PdfTemplateApplication.ts b/packages/server/src/services/PdfTemplate/PdfTemplateApplication.ts index 3f0d66be6..5f77475ff 100644 --- a/packages/server/src/services/PdfTemplate/PdfTemplateApplication.ts +++ b/packages/server/src/services/PdfTemplate/PdfTemplateApplication.ts @@ -1,5 +1,5 @@ import { Inject, Service } from 'typedi'; -import { ICreateInvoicePdfTemplateDTO } from './types'; +import { ICreateInvoicePdfTemplateDTO, IEditPdfTemplateDTO } from './types'; import { CreatePdfTemplate } from './CreatePdfTemplate'; import { DeletePdfTemplate } from './DeletePdfTemplate'; import { GetPdfTemplate } from './GetPdfTemplate'; diff --git a/packages/server/src/services/PdfTemplate/types.ts b/packages/server/src/services/PdfTemplate/types.ts index b27c87f0a..abe9345a0 100644 --- a/packages/server/src/services/PdfTemplate/types.ts +++ b/packages/server/src/services/PdfTemplate/types.ts @@ -1,6 +1,12 @@ export enum ERRORS { CANNOT_DELETE_PREDEFINED_PDF_TEMPLATE = 'CANNOT_DELETE_PREDEFINED_PDF_TEMPLATE', } + +export interface IEditPdfTemplateDTO { + templateName: string; + attributes: Record; +} + export interface ICreateInvoicePdfTemplateDTO { // Colors primaryColor?: string; diff --git a/packages/server/src/services/Sales/Estimates/utils.ts b/packages/server/src/services/Sales/Estimates/utils.ts index 2b7c7fd1b..879667893 100644 --- a/packages/server/src/services/Sales/Estimates/utils.ts +++ b/packages/server/src/services/Sales/Estimates/utils.ts @@ -3,5 +3,20 @@ import { EstimatePdfBrandingAttributes } from './constants'; export const transformEstimateToPdfTemplate = ( estimate ): Partial => { - return {}; + return { + expirationDate: estimate.formattedExpirationDate, + estimateNumebr: estimate.estimateNumber, + estimateDate: estimate.formattedEstimateDate, + lines: estimate.entries.map((entry) => ({ + item: entry.item.name, + description: entry.description, + rate: entry.rateFormatted, + quantity: entry.quantityFormatted, + total: entry.totalFormatted, + })), + total: estimate.formattedSubtotal, + subtotal: estimate.formattedSubtotal, + customerNote: estimate.customerNote, + termsConditions: estimate.termsConditions, + }; }; diff --git a/packages/server/src/services/Sales/Invoices/utils.ts b/packages/server/src/services/Sales/Invoices/utils.ts index ed8235678..8131ea2bd 100644 --- a/packages/server/src/services/Sales/Invoices/utils.ts +++ b/packages/server/src/services/Sales/Invoices/utils.ts @@ -9,7 +9,6 @@ export const mergePdfTemplateWithDefaultAttributes = ( brandingTemplate, (val, key) => val !== null && Object.keys(defaultAttributes).includes(key) ); - return { ...defaultAttributes, ...brandingAttributes, @@ -39,5 +38,9 @@ export const transformInvoiceToPdfTemplate = ( quantity: entry.quantityFormatted, total: entry.totalFormatted, })), + taxes: invoice.taxes.map((tax) => ({ + label: tax.name, + amount: tax.taxRateAmountFormatted, + })), }; }; diff --git a/packages/server/src/services/Sales/PaymentReceived/PaymentReceivedBrandingTemplate.ts b/packages/server/src/services/Sales/PaymentReceived/PaymentReceivedBrandingTemplate.ts index 20e01d7e6..625b24d95 100644 --- a/packages/server/src/services/Sales/PaymentReceived/PaymentReceivedBrandingTemplate.ts +++ b/packages/server/src/services/Sales/PaymentReceived/PaymentReceivedBrandingTemplate.ts @@ -18,7 +18,7 @@ export class PaymentReceivedBrandingTemplate { public async getPaymentReceivedPdfTemplate( tenantId: number, paymentTemplateId: number - ): Promise { + ) { const template = await this.getPdfTemplateService.getPdfTemplate( tenantId, paymentTemplateId diff --git a/packages/server/src/services/Sales/PaymentReceived/utils.ts b/packages/server/src/services/Sales/PaymentReceived/utils.ts index beda5e0b9..540aab9ed 100644 --- a/packages/server/src/services/Sales/PaymentReceived/utils.ts +++ b/packages/server/src/services/Sales/PaymentReceived/utils.ts @@ -7,6 +7,15 @@ export const transformPaymentReceivedToPdfTemplate = ( payment: IPaymentReceived ): Partial => { return { - // ...payment + total: payment.formattedAmount, + subtotal: payment.subtotalFormatted, + paymentReceivedNumebr: payment.paymentReceiveNo, + paymentReceivedDate: payment.formattedPaymentDate, + customerName: payment.customer.displayName, + lines: payment.entries.map((entry) => ({ + invoiceNumber: entry.invoice.invoiceNo, + invoiceAmount: entry.invoice.totalFormatted, + paidAmount: entry.paymentAmountFormatted, + })), }; }; diff --git a/packages/server/src/services/Sales/Receipts/utils.ts b/packages/server/src/services/Sales/Receipts/utils.ts index 548ad7001..e1d9ac9d9 100644 --- a/packages/server/src/services/Sales/Receipts/utils.ts +++ b/packages/server/src/services/Sales/Receipts/utils.ts @@ -1,6 +1,20 @@ +import { ISaleReceipt, ISaleReceiptBrandingTemplateAttributes } from "@/interfaces"; -export const transformReceiptToBrandingTemplateAttributes = () => { - return {}; +export const transformReceiptToBrandingTemplateAttributes = (saleReceipt: ISaleReceipt): Partial => { + return { + total: saleReceipt.formattedAmount, + subtotal: saleReceipt.formattedSubtotal, + lines: saleReceipt.entries?.map((entry) => ({ + item: entry.item.name, + description: entry.description, + rate: entry.rateFormatted, + quantity: entry.quantityFormatted, + total: entry.totalFormatted, + })), + + receiptNumber: saleReceipt.receiptNumber, + receiptDate: saleReceipt.formattedReceiptDate, + }; } \ No newline at end of file diff --git a/packages/webapp/src/containers/Sales/CreditNotes/CreditNoteCustomize/CreditNoteCustomizeContent.tsx b/packages/webapp/src/containers/Sales/CreditNotes/CreditNoteCustomize/CreditNoteCustomizeContent.tsx index 8a9ca888d..a5e437754 100644 --- a/packages/webapp/src/containers/Sales/CreditNotes/CreditNoteCustomize/CreditNoteCustomizeContent.tsx +++ b/packages/webapp/src/containers/Sales/CreditNotes/CreditNoteCustomize/CreditNoteCustomizeContent.tsx @@ -37,10 +37,6 @@ export function CreditNoteCustomizeContent() { - - - asdfasdfdsaf #3 - ); } diff --git a/packages/webapp/src/containers/Sales/Estimates/EstimateCustomize/EstimateCustomizeContent.tsx b/packages/webapp/src/containers/Sales/Estimates/EstimateCustomize/EstimateCustomizeContent.tsx index 9d4dd2739..23a67e011 100644 --- a/packages/webapp/src/containers/Sales/Estimates/EstimateCustomize/EstimateCustomizeContent.tsx +++ b/packages/webapp/src/containers/Sales/Estimates/EstimateCustomize/EstimateCustomizeContent.tsx @@ -36,10 +36,6 @@ export function EstimateCustomizeContent() { - - - asdfasdfdsaf #3 - ); } diff --git a/packages/webapp/src/containers/Sales/Invoices/InvoiceCustomize/InvoiceCustomizeContent.tsx b/packages/webapp/src/containers/Sales/Invoices/InvoiceCustomize/InvoiceCustomizeContent.tsx index 0346b989c..988198b57 100644 --- a/packages/webapp/src/containers/Sales/Invoices/InvoiceCustomize/InvoiceCustomizeContent.tsx +++ b/packages/webapp/src/containers/Sales/Invoices/InvoiceCustomize/InvoiceCustomizeContent.tsx @@ -43,10 +43,6 @@ export function InvoiceCustomizeContent() { - - - asdfasdfdsaf #3 - ); } diff --git a/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/utils.tsx b/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/utils.tsx index edc3c91de..659b0d5f3 100644 --- a/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/utils.tsx +++ b/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/utils.tsx @@ -10,7 +10,6 @@ import { compose, transformToForm, repeatValue, - formattedAmount, defaultFastFieldShouldUpdate, } from '@/utils'; import { ERROR } from '@/constants/errors'; diff --git a/packages/webapp/src/containers/Sales/PaymentsReceived/PaymentReceivedCustomize/PaymentReceivedCustomizeContent.tsx b/packages/webapp/src/containers/Sales/PaymentsReceived/PaymentReceivedCustomize/PaymentReceivedCustomizeContent.tsx index b84bbb168..b08b5979e 100644 --- a/packages/webapp/src/containers/Sales/PaymentsReceived/PaymentReceivedCustomize/PaymentReceivedCustomizeContent.tsx +++ b/packages/webapp/src/containers/Sales/PaymentsReceived/PaymentReceivedCustomize/PaymentReceivedCustomizeContent.tsx @@ -37,10 +37,6 @@ export function PaymentReceivedCustomizeContent() { - - - asdfasdfdsaf #3 - ); } diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptCustomize/ReceiptCustomizeContent.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptCustomize/ReceiptCustomizeContent.tsx index abcffae35..fb1a0e06c 100644 --- a/packages/webapp/src/containers/Sales/Receipts/ReceiptCustomize/ReceiptCustomizeContent.tsx +++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptCustomize/ReceiptCustomizeContent.tsx @@ -36,10 +36,6 @@ export function ReceiptCustomizeContent() { - - - asdfasdfdsaf #3 - ); } diff --git a/packages/webapp/src/hooks/query/pdf-templates.ts b/packages/webapp/src/hooks/query/pdf-templates.ts index adba19753..6823b9cee 100644 --- a/packages/webapp/src/hooks/query/pdf-templates.ts +++ b/packages/webapp/src/hooks/query/pdf-templates.ts @@ -98,7 +98,7 @@ export const useEditPdfTemplate = ( >( ({ templateId, values }) => apiRequest - .put(`/pdf-templates/${templateId}`, transfromToSnakeCase(values)) + .post(`/pdf-templates/${templateId}`, transfromToSnakeCase(values)) .then((res) => res.data), { onSuccess: () => {