From 5b75fa928677d5b39f91bcd15e7118fd769d5746 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Mon, 2 Dec 2024 18:45:16 +0200 Subject: [PATCH] feat: link discount to mail receipts --- .../GetSaleEstimateMailStateTransformer.ts | 21 +++++ .../GetSaleInvoiceMailStateTransformer.ts | 20 +++++ .../GetSaleReceiptMailStateTransformer.ts | 37 +++++++-- .../EstimateSendMailReceipt.tsx | 55 ++++++++++++- .../withEstimateMailReceiptPreviewProps.tsx | 3 + .../InvoiceCustomize/InvoiceMailReceipt.tsx | 79 ++++++++++++++++++- .../InvoiceMailReceiptPreview.tsx | 1 + .../InvoiceMailReceiptPreviewConnected.tsx | 3 + .../ReceiptSendMailBoot.tsx | 5 +- .../ReceiptSendMailReceipt.tsx | 56 +++++++++++-- .../withReceiptMailReceiptPreviewProps.tsx | 2 + packages/webapp/src/hooks/query/estimates.tsx | 9 +++ packages/webapp/src/hooks/query/invoices.tsx | 9 +++ packages/webapp/src/hooks/query/receipts.tsx | 12 +++ 14 files changed, 294 insertions(+), 18 deletions(-) diff --git a/packages/server/src/services/Sales/Estimates/GetSaleEstimateMailStateTransformer.ts b/packages/server/src/services/Sales/Estimates/GetSaleEstimateMailStateTransformer.ts index c33783bc5..9dd2b749a 100644 --- a/packages/server/src/services/Sales/Estimates/GetSaleEstimateMailStateTransformer.ts +++ b/packages/server/src/services/Sales/Estimates/GetSaleEstimateMailStateTransformer.ts @@ -20,6 +20,16 @@ export class GetSaleEstimateMailStateTransformer extends SaleEstimateTransfromer 'subtotal', 'subtotalFormatted', + 'discountAmount', + 'discountAmountFormatted', + 'discountPercentage', + 'discountPercentageFormatted', + 'discountLabel', + + 'adjustment', + 'adjustmentFormatted', + 'adjustmentLabel', + 'estimateNumber', 'entries', @@ -97,6 +107,17 @@ export class GetSaleEstimateMailStateTransformer extends SaleEstimateTransfromer return estimate.amount; } + /** + * Retrieves the discount label of the estimate. + * @param estimate + * @returns {string} + */ + protected discountLabel(estimate) { + return estimate.discountType === 'percentage' + ? `Discount [${estimate.discountPercentageFormatted}]` + : 'Discount'; + } + /** * Retrieves the formatted total of the estimate. * @param estimate diff --git a/packages/server/src/services/Sales/Invoices/GetSaleInvoiceMailStateTransformer.ts b/packages/server/src/services/Sales/Invoices/GetSaleInvoiceMailStateTransformer.ts index 128080f38..259ea31e7 100644 --- a/packages/server/src/services/Sales/Invoices/GetSaleInvoiceMailStateTransformer.ts +++ b/packages/server/src/services/Sales/Invoices/GetSaleInvoiceMailStateTransformer.ts @@ -28,6 +28,15 @@ export class GetSaleInvoiceMailStateTransformer extends SaleInvoiceTransformer { 'total', 'totalFormatted', + 'discountAmount', + 'discountAmountFormatted', + 'discountPercentage', + 'discountPercentageFormatted', + 'discountLabel', + + 'adjustment', + 'adjustmentFormatted', + 'subtotal', 'subtotalFormatted', @@ -76,6 +85,17 @@ export class GetSaleInvoiceMailStateTransformer extends SaleInvoiceTransformer { return invoice.pdfTemplate?.attributes?.primaryColor; }; + /** + * Retrieves the discount label of the estimate. + * @param estimate + * @returns {string} + */ + protected discountLabel(invoice) { + return invoice.discountType === 'percentage' + ? `Discount [${invoice.discountPercentageFormatted}]` + : 'Discount'; + } + /** * * @param invoice diff --git a/packages/server/src/services/Sales/Receipts/GetSaleReceiptMailStateTransformer.ts b/packages/server/src/services/Sales/Receipts/GetSaleReceiptMailStateTransformer.ts index c127f633a..7a7c41b2c 100644 --- a/packages/server/src/services/Sales/Receipts/GetSaleReceiptMailStateTransformer.ts +++ b/packages/server/src/services/Sales/Receipts/GetSaleReceiptMailStateTransformer.ts @@ -1,7 +1,9 @@ import { Transformer } from '@/lib/Transformer/Transformer'; import { ItemEntryTransformer } from '../Invoices/ItemEntryTransformer'; +import { DiscountType } from '@/interfaces'; +import { SaleReceiptTransformer } from './SaleReceiptTransformer'; -export class GetSaleReceiptMailStateTransformer extends Transformer { +export class GetSaleReceiptMailStateTransformer extends SaleReceiptTransformer { /** * Exclude these attributes from user object. * @returns {Array} @@ -20,14 +22,28 @@ export class GetSaleReceiptMailStateTransformer extends Transformer { 'companyLogoUri', 'primaryColor', 'customerName', + 'total', 'totalFormatted', + + 'discountAmount', + 'discountAmountFormatted', + 'discountPercentage', + 'discountPercentageFormatted', + 'discountLabel', + + 'adjustment', + 'adjustmentFormatted', + 'subtotal', 'subtotalFormatted', + 'receiptDate', 'receiptDateFormatted', + 'closedAtDate', 'closedAtDateFormatted', + 'receiptNumber', 'entries', ]; @@ -86,7 +102,18 @@ export class GetSaleReceiptMailStateTransformer extends Transformer { }; /** - * + * Retrieves the discount label of the estimate. + * @param estimate + * @returns {string} + */ + protected discountLabel(receipt) { + return receipt.discountType === DiscountType.Percentage + ? `Discount [${receipt.discountPercentageFormatted}]` + : 'Discount'; + } + + /** + * Retrieves the subtotal of the receipt. * @param receipt * @returns */ @@ -95,7 +122,7 @@ export class GetSaleReceiptMailStateTransformer extends Transformer { }; /** - * + * Retrieves the formatted subtotal of the receipt. * @param receipt * @returns */ @@ -106,7 +133,7 @@ export class GetSaleReceiptMailStateTransformer extends Transformer { }; /** - * + * Retrieves the receipt date. * @param receipt * @returns */ @@ -115,7 +142,7 @@ export class GetSaleReceiptMailStateTransformer extends Transformer { }; /** - * + * Retrieves the formatted receipt date. * @param {ISaleReceipt} invoice * @returns {string} */ diff --git a/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceipt.tsx b/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceipt.tsx index fcf9d8d36..700249a65 100644 --- a/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceipt.tsx +++ b/packages/webapp/src/containers/Sales/Estimates/EstimateSendMailDrawer/EstimateSendMailReceipt.tsx @@ -1,4 +1,5 @@ import { x } from '@xstyled/emotion'; +import { isEmpty } from 'lodash'; import { Group, Stack } from '@/components'; import { SendMailReceipt, @@ -14,6 +15,14 @@ export interface EstimateSendMailReceiptProps extends SendMailReceiptProps { estimateNumberLabel?: string; estimateNumber: string; + // # Discount + discount?: string; + discountLabel?: string; + + // # Adjustment + adjustment?: string; + adjsutmentLabel?: string; + // # Total. total: string; totalLabel?: string; @@ -47,10 +56,6 @@ export function EstimateSendMailReceipt({ estimateNumberLabel = 'Estimate #', estimateNumber, - // # Total. - total, - totalLabel = 'Total', - // # Expiration date. expirationDateLabel = 'Expiration Date', expirationDate, @@ -65,6 +70,18 @@ export function EstimateSendMailReceipt({ subtotal, subtotalLabel = 'Subtotal', + // # Discount + discount, + discountLabel = 'Discount', + + // # Adjustment + adjustment, + adjsutmentLabel = 'Adjustment', + + // # Total. + total, + totalLabel = 'Total', + // # View estimate button showViewEstimateButton = true, viewEstimateButtonLabel = 'View Estimate', @@ -142,6 +159,36 @@ export function EstimateSendMailReceipt({ + {!isEmpty(discount) && ( + + {discountLabel} + + {discount} + + + )} + + {!isEmpty(adjustment) && ( + + {adjsutmentLabel} + + {adjustment} + + + )} + ))} + {/*---- Subtotal ----*/} + + {subtotalLabel} + + {subtotal} + + + + {/*---- Discount ----*/} + {!isEmpty(discount) && ( + + {discountLabel} + + {discount} + + + )} + + {/*---- Adjustment ----*/} + {!isEmpty(adjustment) && ( + + {adjustmentLabel} + + {adjustment} + + + )} + + {/*---- Total ----*/} + {/*---- Due amount ----*/} + {!isEmpty(discount) && ( + + {discountLabel} + + {discount} + + + )} + + {!isEmpty(adjustment) && ( + + {adjustmentLabel} + + {adjustment} + + + )} + ; + // # Discount + discountAmount: number; + discountAmountFormatted: string; + discountLabel: string; + discountPercentage: number | null; + discountPercentageFormatted: string; + + // # Adjustment + adjustment: number, + adjustmentFormatted: string, + + // # Total total: number; totalFormatted: string;