From 688b1bfb566bd3866dbdb3b8fd264484e9ace0cc Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Tue, 24 Feb 2026 02:52:28 +0200 Subject: [PATCH] fix(server): add invoices Map for validateInvoicesRemainingAmount --- .../commands/CreditNoteApplyToInvoices.service.ts | 12 +++++++----- .../types/CreditNoteApplyInvoice.types.ts | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/server/src/modules/CreditNotesApplyInvoice/commands/CreditNoteApplyToInvoices.service.ts b/packages/server/src/modules/CreditNotesApplyInvoice/commands/CreditNoteApplyToInvoices.service.ts index eb4162d86..dc042647a 100644 --- a/packages/server/src/modules/CreditNotesApplyInvoice/commands/CreditNoteApplyToInvoices.service.ts +++ b/packages/server/src/modules/CreditNotesApplyInvoice/commands/CreditNoteApplyToInvoices.service.ts @@ -18,6 +18,7 @@ import { CreditNote } from '@/modules/CreditNotes/models/CreditNote'; import { CreditNoteAppliedInvoice } from '../models/CreditNoteAppliedInvoice'; import { CommandCreditNoteDTOTransform } from '@/modules/CreditNotes/commands/CommandCreditNoteDTOTransform.service'; import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel'; +import { ApplyCreditNoteToInvoicesDto } from '../dtos/ApplyCreditNoteToInvoices.dto'; @Injectable() export class CreditNoteApplyToInvoices { @@ -49,7 +50,7 @@ export class CreditNoteApplyToInvoices { */ public async applyCreditNoteToInvoices( creditNoteId: number, - applyCreditToInvoicesDTO: IApplyCreditToInvoicesDTO, + applyCreditToInvoicesDTO: ApplyCreditNoteToInvoicesDto, ): Promise { // Saves the credit note or throw not found service error. const creditNote = await this.creditNoteModel() @@ -131,11 +132,12 @@ export class CreditNoteApplyToInvoices { invoices: SaleInvoice[], entries: ICreditNoteAppliedToInvoice[], ) => { - const invalidInvoices = invoices.filter((invoice) => { - const entry = entries.find((e) => e.invoiceId === invoice.id); - return entry && invoice.dueAmount < entry.amount; + const invoiceMap = new Map(invoices.map((inv) => [inv.id, inv])); + const invalidEntries = entries.filter((entry) => { + const invoice = invoiceMap.get(entry.invoiceId); + return invoice != null && invoice.dueAmount < entry.amount; }); - if (invalidInvoices.length > 0) { + if (invalidEntries.length > 0) { throw new ServiceError(ERRORS.INVOICES_HAS_NO_REMAINING_AMOUNT); } }; diff --git a/packages/server/src/modules/CreditNotesApplyInvoice/types/CreditNoteApplyInvoice.types.ts b/packages/server/src/modules/CreditNotesApplyInvoice/types/CreditNoteApplyInvoice.types.ts index 7172811ae..d65ef2af3 100644 --- a/packages/server/src/modules/CreditNotesApplyInvoice/types/CreditNoteApplyInvoice.types.ts +++ b/packages/server/src/modules/CreditNotesApplyInvoice/types/CreditNoteApplyInvoice.types.ts @@ -29,6 +29,7 @@ export interface IApplyCreditToInvoicesDeletedPayload { export interface ICreditNoteAppliedToInvoice { amount: number; creditNoteId: number; + invoiceId: number; } export interface ICreditNoteAppliedToInvoiceModel { amount: number;