From 936c440cf34ee8690cd915b30bcb27178807cd5e Mon Sep 17 00:00:00 2001 From: david Date: Sun, 29 Mar 2026 22:46:29 +0200 Subject: [PATCH] . --- .../issued-invoice-items.collection.ts | 18 +++---- .../issued-invoice-taxes.collection.ts | 53 +++++++++++++++++-- .../aggregates/proforma.aggregate.ts | 16 +++--- 3 files changed, 67 insertions(+), 20 deletions(-) diff --git a/modules/customer-invoices/src/api/domain/issued-invoices/entities/issued-invoice-items/issued-invoice-items.collection.ts b/modules/customer-invoices/src/api/domain/issued-invoices/entities/issued-invoice-items/issued-invoice-items.collection.ts index 66cb7a5a..d9974452 100644 --- a/modules/customer-invoices/src/api/domain/issued-invoices/entities/issued-invoice-items/issued-invoice-items.collection.ts +++ b/modules/customer-invoices/src/api/domain/issued-invoices/entities/issued-invoice-items/issued-invoice-items.collection.ts @@ -11,15 +11,15 @@ export type IssuedInvoiceItemsProps = { }; export class IssuedInvoiceItems extends Collection { - private _languageCode!: LanguageCode; - private _currencyCode!: CurrencyCode; - private _globalDiscountPercentage!: Percentage; + private languageCode!: LanguageCode; + private currencyCode!: CurrencyCode; + private globalDiscountPercentage!: Percentage; constructor(props: IssuedInvoiceItemsProps) { super(props.items ?? []); - this._languageCode = props.languageCode; - this._currencyCode = props.currencyCode; - this._globalDiscountPercentage = props.globalDiscountPercentage; + this.languageCode = props.languageCode; + this.currencyCode = props.currencyCode; + this.globalDiscountPercentage = props.globalDiscountPercentage; } public static create(props: IssuedInvoiceItemsProps): IssuedInvoiceItems { @@ -40,9 +40,9 @@ export class IssuedInvoiceItems extends Collection { // tiene el mismo "currencyCode" y "languageCode" que la colección de items. if ( !( - this._languageCode.equals(item.languageCode) && - this._currencyCode.equals(item.currencyCode) && - this._globalDiscountPercentage.equals(item.globalDiscountPercentage) + this.languageCode.equals(item.languageCode) && + this.currencyCode.equals(item.currencyCode) && + this.globalDiscountPercentage.equals(item.globalDiscountPercentage) ) ) return false; diff --git a/modules/customer-invoices/src/api/domain/issued-invoices/entities/issued-invoice-taxes/issued-invoice-taxes.collection.ts b/modules/customer-invoices/src/api/domain/issued-invoices/entities/issued-invoice-taxes/issued-invoice-taxes.collection.ts index e7086d2e..998cb62d 100644 --- a/modules/customer-invoices/src/api/domain/issued-invoices/entities/issued-invoice-taxes/issued-invoice-taxes.collection.ts +++ b/modules/customer-invoices/src/api/domain/issued-invoices/entities/issued-invoice-taxes/issued-invoice-taxes.collection.ts @@ -1,6 +1,8 @@ import type { CurrencyCode, LanguageCode } from "@repo/rdx-ddd"; import { Collection } from "@repo/rdx-utils"; +import { InvoiceAmount } from "../../../common"; + import type { IssuedInvoiceTax } from "./issued-invoice-tax.entity"; export type IssuedInvoiceTaxesProps = { @@ -10,16 +12,59 @@ export type IssuedInvoiceTaxesProps = { }; export class IssuedInvoiceTaxes extends Collection { - private _languageCode!: LanguageCode; - private _currencyCode!: CurrencyCode; + private languageCode!: LanguageCode; + private currencyCode!: CurrencyCode; constructor(props: IssuedInvoiceTaxesProps) { super(props.taxes ?? []); - this._languageCode = props.languageCode; - this._currencyCode = props.currencyCode; + this.languageCode = props.languageCode; + this.currencyCode = props.currencyCode; } public static create(props: IssuedInvoiceTaxesProps): IssuedInvoiceTaxes { return new IssuedInvoiceTaxes(props); } + + public getTaxableAmount(): InvoiceAmount { + return this.items.reduce( + (acc, tax) => acc.add(tax.taxableAmount), + InvoiceAmount.zero(this.currencyCode.toString()) + ); + } + + public getIvaAmount(): InvoiceAmount { + return this.items.reduce( + (acc, tax) => acc.add(tax.ivaAmount), + InvoiceAmount.zero(this.currencyCode.toString()) + ); + } + + public getRecAmount(): InvoiceAmount { + return this.items.reduce( + (acc, tax) => acc.add(tax.recAmount), + InvoiceAmount.zero(this.currencyCode.toString()) + ); + } + + public getRetentionAmount(): InvoiceAmount { + return this.items.reduce( + (acc, tax) => acc.add(tax.retentionAmount), + InvoiceAmount.zero(this.currencyCode.toString()) + ); + } + + public getTaxesAmount(): InvoiceAmount { + return this.items.reduce( + (acc, tax) => acc.add(tax.taxesAmount), + InvoiceAmount.zero(this.currencyCode.toString()) + ); + } + + public getTransferredTaxesAmount(): InvoiceAmount { + return this.getIvaAmount().add(this.getRecAmount()); + } + + public getNetTaxesAmount(): InvoiceAmount { + return this.getTransferredTaxesAmount().subtract(this.getRetentionAmount()); + } } diff --git a/modules/customer-invoices/src/api/domain/proformas/aggregates/proforma.aggregate.ts b/modules/customer-invoices/src/api/domain/proformas/aggregates/proforma.aggregate.ts index 769fd88e..ed6410a8 100644 --- a/modules/customer-invoices/src/api/domain/proformas/aggregates/proforma.aggregate.ts +++ b/modules/customer-invoices/src/api/domain/proformas/aggregates/proforma.aggregate.ts @@ -247,15 +247,17 @@ export class Proforma extends AggregateRoot implements IP } // Mutabilidad - public update( - partialProforma: Partial> - ): Result { - const updatedProps = { + public update(patch: ProformaPatchProps): Result { + const candidateProps: InternalProformaProps = { ...this.props, - ...partialProforma, - } as IProformaCreateProps; + ...patch, + }; - return Proforma.create(updatedProps, this.id); + // Validacciones + + Object.assign(this.props, candidateProps); + + return Result.ok(); } public issue(): Result {