This commit is contained in:
David Arranz 2026-03-29 22:46:29 +02:00
parent dd3f53c2b1
commit 936c440cf3
3 changed files with 67 additions and 20 deletions

View File

@ -11,15 +11,15 @@ export type IssuedInvoiceItemsProps = {
}; };
export class IssuedInvoiceItems extends Collection<IssuedInvoiceItem> { export class IssuedInvoiceItems extends Collection<IssuedInvoiceItem> {
private _languageCode!: LanguageCode; private languageCode!: LanguageCode;
private _currencyCode!: CurrencyCode; private currencyCode!: CurrencyCode;
private _globalDiscountPercentage!: Percentage; private globalDiscountPercentage!: Percentage;
constructor(props: IssuedInvoiceItemsProps) { constructor(props: IssuedInvoiceItemsProps) {
super(props.items ?? []); super(props.items ?? []);
this._languageCode = props.languageCode; this.languageCode = props.languageCode;
this._currencyCode = props.currencyCode; this.currencyCode = props.currencyCode;
this._globalDiscountPercentage = props.globalDiscountPercentage; this.globalDiscountPercentage = props.globalDiscountPercentage;
} }
public static create(props: IssuedInvoiceItemsProps): IssuedInvoiceItems { public static create(props: IssuedInvoiceItemsProps): IssuedInvoiceItems {
@ -40,9 +40,9 @@ export class IssuedInvoiceItems extends Collection<IssuedInvoiceItem> {
// tiene el mismo "currencyCode" y "languageCode" que la colección de items. // tiene el mismo "currencyCode" y "languageCode" que la colección de items.
if ( if (
!( !(
this._languageCode.equals(item.languageCode) && this.languageCode.equals(item.languageCode) &&
this._currencyCode.equals(item.currencyCode) && this.currencyCode.equals(item.currencyCode) &&
this._globalDiscountPercentage.equals(item.globalDiscountPercentage) this.globalDiscountPercentage.equals(item.globalDiscountPercentage)
) )
) )
return false; return false;

View File

@ -1,6 +1,8 @@
import type { CurrencyCode, LanguageCode } from "@repo/rdx-ddd"; import type { CurrencyCode, LanguageCode } from "@repo/rdx-ddd";
import { Collection } from "@repo/rdx-utils"; import { Collection } from "@repo/rdx-utils";
import { InvoiceAmount } from "../../../common";
import type { IssuedInvoiceTax } from "./issued-invoice-tax.entity"; import type { IssuedInvoiceTax } from "./issued-invoice-tax.entity";
export type IssuedInvoiceTaxesProps = { export type IssuedInvoiceTaxesProps = {
@ -10,16 +12,59 @@ export type IssuedInvoiceTaxesProps = {
}; };
export class IssuedInvoiceTaxes extends Collection<IssuedInvoiceTax> { export class IssuedInvoiceTaxes extends Collection<IssuedInvoiceTax> {
private _languageCode!: LanguageCode; private languageCode!: LanguageCode;
private _currencyCode!: CurrencyCode; private currencyCode!: CurrencyCode;
constructor(props: IssuedInvoiceTaxesProps) { constructor(props: IssuedInvoiceTaxesProps) {
super(props.taxes ?? []); super(props.taxes ?? []);
this._languageCode = props.languageCode; this.languageCode = props.languageCode;
this._currencyCode = props.currencyCode; this.currencyCode = props.currencyCode;
} }
public static create(props: IssuedInvoiceTaxesProps): IssuedInvoiceTaxes { public static create(props: IssuedInvoiceTaxesProps): IssuedInvoiceTaxes {
return new IssuedInvoiceTaxes(props); 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());
}
} }

View File

@ -247,15 +247,17 @@ export class Proforma extends AggregateRoot<InternalProformaProps> implements IP
} }
// Mutabilidad // Mutabilidad
public update( public update(patch: ProformaPatchProps): Result<Proforma, Error> {
partialProforma: Partial<Omit<IProformaCreateProps, "companyId">> const candidateProps: InternalProformaProps = {
): Result<Proforma, Error> {
const updatedProps = {
...this.props, ...this.props,
...partialProforma, ...patch,
} as IProformaCreateProps; };
return Proforma.create(updatedProps, this.id); // Validacciones
Object.assign(this.props, candidateProps);
return Result.ok();
} }
public issue(): Result<void, Error> { public issue(): Result<void, Error> {