Uecko_ERP/modules/customer-invoices/src/web/hooks/calcs/use-calc-invoice-items-totals.ts
2025-10-12 12:43:06 +02:00

78 lines
2.4 KiB
TypeScript

import { MoneyDTO } from "@erp/core";
import { useMoney, usePercentage, useQuantity } from "@erp/core/hooks";
import { useMemo } from "react";
import { InvoiceItemFormData } from "../../schemas";
/**
* Calcula totales derivados de un ítem de factura
*/
export type InvoiceItemTotals = Readonly<{
// valores base ya normalizados a number
quantity: number;
unitAmount: number;
discountPercent: number;
// desgloses numéricos
subtotal: number; // qty * unit
discountAmount: number; // subtotal * (discountPercent/100)
taxableBase: number; // subtotal - discountAmount
taxes: number; // por ahora 0 (o calcula según tax_codes si lo necesitas)
total: number; // taxableBase + taxes
// equivalentes en MoneyDTO (misma divisa/escala que useMoney)
subtotalDTO: MoneyDTO;
discountAmountDTO: MoneyDTO;
taxableBaseDTO: MoneyDTO;
taxesDTO: MoneyDTO;
totalDTO: MoneyDTO;
}>;
/**
* Calcula totales derivados de una línea de factura usando tus hooks de Money/Quantity/Percentage.
*/
export function useCalcInvoiceItemTotals(item?: InvoiceItemFormData): InvoiceItemTotals {
const moneyHelper = useMoney();
const qtyHelper = useQuantity();
const pctHelper = usePercentage();
return useMemo<InvoiceItemTotals>(() => {
// valores base
const quantity = item ? qtyHelper.toNumber(item.quantity) : 0;
const unitAmount = item ? moneyHelper.toNumber(item.unit_amount) : 0;
const discountPercent = item ? pctHelper.toNumber(item.discount_percentage) : 0;
// cálculos
const subtotal = quantity * unitAmount;
const discountAmount = subtotal * (discountPercent / 100);
const taxableBase = subtotal - discountAmount;
// impuestos (ajústalo si quieres aplicar tax_codes)
const taxes = 0;
const total = taxableBase + taxes;
// DTOs
const subtotalDTO = moneyHelper.fromNumber(subtotal);
const discountAmountDTO = moneyHelper.fromNumber(discountAmount);
const taxableBaseDTO = moneyHelper.fromNumber(taxableBase);
const taxesDTO = moneyHelper.fromNumber(taxes);
const totalDTO = moneyHelper.fromNumber(total);
return {
quantity,
unitAmount,
discountPercent,
subtotal,
discountAmount,
taxableBase,
taxes,
total,
subtotalDTO,
discountAmountDTO,
taxableBaseDTO,
taxesDTO,
totalDTO,
};
}, [item, moneyHelper, qtyHelper, pctHelper]);
}