FactuGES_ERP/modules/customer-invoices/src/api/domain/value-objects/item-amount.ts

63 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-09-10 18:14:19 +00:00
import { MoneyValue, MoneyValueProps, Percentage, Quantity } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
2025-09-05 11:23:45 +00:00
type ItemAmountProps = Pick<MoneyValueProps, "value" | "currency_code">;
export class ItemAmount extends MoneyValue {
public static DEFAULT_SCALE = 4;
static create({ value, currency_code }: ItemAmountProps) {
const props = {
value: Number(value),
scale: ItemAmount.DEFAULT_SCALE,
currency_code,
};
2025-09-10 18:14:19 +00:00
return Result.ok(new ItemAmount(props));
2025-09-05 11:23:45 +00:00
}
static zero(currency_code: string) {
const props = {
value: 0,
currency_code,
};
2025-09-10 11:57:15 +00:00
return ItemAmount.create(props).data;
2025-09-05 11:23:45 +00:00
}
2025-09-10 18:14:19 +00:00
// Ensure fluent operations keep the subclass type
convertScale(newScale: number) {
const mv = super.convertScale(newScale);
const p = mv.toPrimitive();
return new ItemAmount({ value: p.value, currency_code: p.currency_code });
}
add(addend: MoneyValue) {
const mv = super.add(addend);
const p = mv.toPrimitive();
return new ItemAmount({ value: p.value, currency_code: p.currency_code });
}
subtract(subtrahend: MoneyValue) {
const mv = super.subtract(subtrahend);
const p = mv.toPrimitive();
return new ItemAmount({ value: p.value, currency_code: p.currency_code });
}
multiply(multiplier: number | Quantity) {
const mv = super.multiply(multiplier);
const p = mv.toPrimitive();
return new ItemAmount({ value: p.value, currency_code: p.currency_code });
}
divide(divisor: number | Quantity) {
const mv = super.divide(divisor);
const p = mv.toPrimitive();
return new ItemAmount({ value: p.value, currency_code: p.currency_code });
}
percentage(percentage: number | Percentage) {
const mv = super.percentage(percentage);
const p = mv.toPrimitive();
return new ItemAmount({ value: p.value, currency_code: p.currency_code });
}
2025-09-05 11:23:45 +00:00
}