From 17b3bbe1d8a0650cad690c7f39bac7993a7157e4 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Thu, 28 Nov 2024 18:17:47 +0200 Subject: [PATCH] feat: discount vendor credit --- ...04_add_discount_to_vendor_credits_table.js | 23 ++++++++++++ packages/server/src/models/Bill.ts | 29 +++++++++++---- packages/server/src/models/VendorCredit.ts | 18 ++++++++++ .../Bills/PurchaseInvoiceTransformer.ts | 36 +++++++++++++++++++ .../VendorCredits/VendorCreditTransformer.ts | 36 ++++++++++++++++++- 5 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 packages/server/src/database/migrations/20241128160604_add_discount_to_vendor_credits_table.js diff --git a/packages/server/src/database/migrations/20241128160604_add_discount_to_vendor_credits_table.js b/packages/server/src/database/migrations/20241128160604_add_discount_to_vendor_credits_table.js new file mode 100644 index 000000000..706bad1f7 --- /dev/null +++ b/packages/server/src/database/migrations/20241128160604_add_discount_to_vendor_credits_table.js @@ -0,0 +1,23 @@ +/** + * @param { import("knex").Knex } knex + * @returns { Promise } + */ +exports.up = function(knex) { + return knex.schema.alterTable('vendor_credits', (table) => { + table.decimal('discount', 10, 2).nullable().after('amount'); + table.string('discount_type').nullable().after('discount'); + table.decimal('adjustment', 10, 2).nullable().after('discount_type'); + }); +}; + +/** + * @param { import("knex").Knex } knex + * @returns { Promise } + */ +exports.down = function(knex) { + return knex.schema.alterTable('vendor_credits', (table) => { + table.dropColumn('discount'); + table.dropColumn('discount_type'); + table.dropColumn('adjustment'); + }); +}; diff --git a/packages/server/src/models/Bill.ts b/packages/server/src/models/Bill.ts index 0a296238a..06a1356ee 100644 --- a/packages/server/src/models/Bill.ts +++ b/packages/server/src/models/Bill.ts @@ -104,20 +104,37 @@ export default class Bill extends mixin(TenantModel, [ return this.taxAmountWithheld * this.exchangeRate; } + /** + * Discount amount. + * @returns {number} + */ + get discountAmount() { + return this.discountType === DiscountType.Amount + ? this.discount + : this.subtotal * (this.discount / 100); + } + + /** + * Discount percentage. + * @returns {number | null} + */ + get discountPercentage(): number | null { + return this.discountType === DiscountType.Percentage ? this.discount : null; + } + /** * Invoice total. (Tax included) * @returns {number} */ get total() { - const discountAmount = this.discountType === DiscountType.Amount - ? this.discount - : this.subtotal * (this.discount / 100); - const adjustmentAmount = defaultTo(this.adjustment, 0); return this.isInclusiveTax - ? this.subtotal - discountAmount - adjustmentAmount - : this.subtotal + this.taxAmountWithheld - discountAmount - adjustmentAmount; + ? this.subtotal - this.discountAmount - adjustmentAmount + : this.subtotal + + this.taxAmountWithheld - + this.discountAmount - + adjustmentAmount; } /** diff --git a/packages/server/src/models/VendorCredit.ts b/packages/server/src/models/VendorCredit.ts index 2a7833ace..a880ac623 100644 --- a/packages/server/src/models/VendorCredit.ts +++ b/packages/server/src/models/VendorCredit.ts @@ -58,6 +58,24 @@ export default class VendorCredit extends mixin(TenantModel, [ return this.subtotal * this.exchangeRate; } + /** + * Discount amount. + * @returns {number} + */ + get discountAmount() { + return this.discountType === DiscountType.Amount + ? this.discount + : this.subtotal * (this.discount / 100); + } + + /** + * Discount percentage. + * @returns {number | null} + */ + get discountPercentage(): number | null { + return this.discountType === DiscountType.Percentage ? this.discount : null; + } + /** * Vendor credit total. * @returns {number} diff --git a/packages/server/src/services/Purchases/Bills/PurchaseInvoiceTransformer.ts b/packages/server/src/services/Purchases/Bills/PurchaseInvoiceTransformer.ts index d940d79fa..6fba33c2e 100644 --- a/packages/server/src/services/Purchases/Bills/PurchaseInvoiceTransformer.ts +++ b/packages/server/src/services/Purchases/Bills/PurchaseInvoiceTransformer.ts @@ -24,6 +24,9 @@ export class PurchaseInvoiceTransformer extends Transformer { 'subtotalLocalFormatted', 'subtotalExcludingTaxFormatted', 'taxAmountWithheldLocalFormatted', + 'discountAmountFormatted', + 'discountPercentageFormatted', + 'adjustmentFormatted', 'totalFormatted', 'totalLocalFormatted', 'taxes', @@ -160,6 +163,39 @@ export class PurchaseInvoiceTransformer extends Transformer { }); }; + /** + * Retrieves the formatted discount amount. + * @param {IBill} bill + * @returns {string} + */ + protected discountAmountFormatted = (bill): string => { + return formatNumber(bill.discountAmount, { + currencyCode: bill.currencyCode, + }); + }; + + /** + * Retrieves the formatted discount percentage. + * @param {IBill} bill + * @returns {string} + */ + protected discountPercentageFormatted = (bill): string => { + return bill.discountPercentage + ? `${bill.discountPercentage}%` + : ''; + }; + + /** + * Retrieves the formatted adjustment amount. + * @param {IBill} bill + * @returns {string} + */ + protected adjustmentFormatted = (bill): string => { + return formatNumber(bill.adjustment, { + currencyCode: bill.currencyCode, + }); + }; + /** * Retrieves the total formatted. * @param {IBill} bill diff --git a/packages/server/src/services/Purchases/VendorCredits/VendorCreditTransformer.ts b/packages/server/src/services/Purchases/VendorCredits/VendorCreditTransformer.ts index ba7625562..594c6aa14 100644 --- a/packages/server/src/services/Purchases/VendorCredits/VendorCreditTransformer.ts +++ b/packages/server/src/services/Purchases/VendorCredits/VendorCreditTransformer.ts @@ -17,6 +17,9 @@ export class VendorCreditTransformer extends Transformer { 'formattedCreatedAt', 'formattedCreditsRemaining', 'formattedInvoicedAmount', + 'discountAmountFormatted', + 'discountPercentageFormatted', + 'adjustmentFormatted', 'entries', 'attachments', ]; @@ -33,7 +36,7 @@ export class VendorCreditTransformer extends Transformer { /** * Retireve formatted created at date. - * @param vendorCredit + * @param vendorCredit * @returns {string} */ protected formattedCreatedAt = (vendorCredit): string => { @@ -71,6 +74,37 @@ export class VendorCreditTransformer extends Transformer { }); }; + /** + * Retrieves the formatted discount amount. + * @param {IVendorCredit} credit + * @returns {string} + */ + protected discountAmountFormatted = (credit): string => { + return formatNumber(credit.discountAmount, { + currencyCode: credit.currencyCode, + }); + }; + + /** + * Retrieves the formatted discount percentage. + * @param {IVendorCredit} credit + * @returns {string} + */ + protected discountPercentageFormatted = (credit): string => { + return credit.discountPercentage ? `${credit.discountPercentage}%` : ''; + }; + + /** + * Retrieves the formatted adjustment amount. + * @param {IVendorCredit} credit + * @returns {string} + */ + protected adjustmentFormatted = (credit): string => { + return formatNumber(credit.adjustment, { + currencyCode: credit.currencyCode, + }); + }; + /** * Retrieves the formatted invoiced amount. * @param credit