diff --git a/packages/server/src/database/migrations/20240722085204_amount_applied_column_to_payments_received_table.js b/packages/server/src/database/migrations/20240722085204_amount_applied_column_to_payments_received_table.js index 32b8ae9fb..2643bcd2e 100644 --- a/packages/server/src/database/migrations/20240722085204_amount_applied_column_to_payments_received_table.js +++ b/packages/server/src/database/migrations/20240722085204_amount_applied_column_to_payments_received_table.js @@ -1,7 +1,6 @@ exports.up = function (knex) { return knex.schema.table('payment_receives', (table) => { - table.decimal('unapplied_amount', 13, 3).defaultTo(0); - table.decimal('used_amount', 13, 3).defaultTo(0); + table.decimal('applied_amount', 13, 3).defaultTo(0); table .integer('unearned_revenue_account_id') .unsigned() @@ -12,8 +11,7 @@ exports.up = function (knex) { exports.down = function (knex) { return knex.schema.table('payment_receives', (table) => { - table.dropColumn('unapplied_amount'); - table.dropColumn('used_amount'); + table.dropColumn('applied_amount'); table.dropColumn('unearned_revenue_account_id'); }); }; diff --git a/packages/server/src/services/Sales/PaymentReceives/AutoApplyUnearnedRevenue.ts b/packages/server/src/services/Sales/PaymentReceives/AutoApplyUnearnedRevenue.ts index 2982002ec..bf38f10ab 100644 --- a/packages/server/src/services/Sales/PaymentReceives/AutoApplyUnearnedRevenue.ts +++ b/packages/server/src/services/Sales/PaymentReceives/AutoApplyUnearnedRevenue.ts @@ -31,26 +31,27 @@ export class AutoApplyUnearnedRevenue { ): Promise { const { PaymentReceive, SaleInvoice } = this.tenancy.models(tenantId); - const unappliedPayments = await PaymentReceive.query(trx).where( - 'unappliedAmount', - '>', - 0 - ); const invoice = await SaleInvoice.query(trx) .findById(saleInvoiceId) .throwIfNotFound(); + const unappliedPayments = await PaymentReceive.query(trx) + .where('customerId', invoice.customerId) + .whereRaw('amount - applied_amount > 0') + .whereNotNull('unearnedRevenueAccountId'); + let unappliedAmount = invoice.total; - let appliedTotalAmount = 0; + let appliedTotalAmount = 0; // Total applied amount after applying. const processHandler: ProcessHandler< IPaymentReceive, Promise > = async (unappliedPayment: IPaymentReceive, index: number, pool) => { - const appliedAmount = Math.min(unappliedAmount, unappliedAmount); + const appliedAmount = Math.min(unappliedAmount, unappliedPayment.amount); unappliedAmount = unappliedAmount - appliedAmount; appliedTotalAmount += appliedAmount; + // Stop applying once the unapplied amount reache zero or less. if (appliedAmount <= 0) { pool.stop(); return; @@ -108,7 +109,7 @@ export class AutoApplyUnearnedRevenue { invoiceId, paymentAmount: appliedAmount, }); - await PaymentReceive.query(trx).increment('usedAmount', appliedAmount); + await PaymentReceive.query(trx).increment('appliedAmount', appliedAmount); // Triggers the event `onPaymentReceivedUnearnedRevenue`. await this.eventPublisher.emitAsync( diff --git a/packages/server/src/services/Sales/PaymentReceives/PaymentReceiveDTOTransformer.ts b/packages/server/src/services/Sales/PaymentReceives/PaymentReceiveDTOTransformer.ts index df47ab14a..dc13c44e8 100644 --- a/packages/server/src/services/Sales/PaymentReceives/PaymentReceiveDTOTransformer.ts +++ b/packages/server/src/services/Sales/PaymentReceives/PaymentReceiveDTOTransformer.ts @@ -37,7 +37,6 @@ export class PaymentReceiveDTOTransformer { oldPaymentReceive?: IPaymentReceive ): Promise { const appliedAmount = sumBy(paymentReceiveDTO.entries, 'paymentAmount'); - const unappliedAmount = paymentReceiveDTO.amount - appliedAmount; // Retreive the next invoice number. const autoNextNumber = @@ -55,7 +54,7 @@ export class PaymentReceiveDTOTransformer { ...formatDateFields(omit(paymentReceiveDTO, ['entries', 'attachments']), [ 'paymentDate', ]), - unappliedAmount, + appliedAmount, currencyCode: customer.currencyCode, ...(paymentReceiveNo ? { paymentReceiveNo } : {}), exchangeRate: paymentReceiveDTO.exchangeRate || 1,