import { formatCurrency } from "@erp/core"; import { FieldDescription, FieldGroup, FieldLegend, FieldSet, Separator, } from "@repo/shadcn-ui/components"; import { cn } from "@repo/shadcn-ui/lib/utils"; import { ReceiptIcon } from "lucide-react"; import { ComponentProps } from "react"; import { useFormContext, useWatch } from "react-hook-form"; import { useInvoiceContext } from "../../context"; import { useTranslation } from "../../i18n"; import { InvoiceFormData } from "../../schemas"; import { PercentageInputField } from "./items/percentage-input-field"; export const InvoiceTotals = (props: ComponentProps<"fieldset">) => { const { t } = useTranslation(); const { control, getValues } = useFormContext(); const { currency_code, language_code, readOnly, taxCatalog } = useInvoiceContext(); const displayTaxes = useWatch({ control, name: "taxes", defaultValue: [], }); const subtotal_amount = useWatch({ control, name: "subtotal_amount", defaultValue: 0, }); return (
{t("form_groups.totals.title")} {t("form_groups.totals.description")}
{/* Sección: Subtotal y Descuentos */}
Subtotal sin descuento {formatCurrency(subtotal_amount, 2, currency_code, language_code)}
Descuento global
-{formatCurrency(getValues("discount_amount"), 2, currency_code, language_code)}
{/* Sección: Base Imponible */}
Base imponible {formatCurrency(getValues("taxable_amount"), 2, currency_code, language_code)}
{/* Sección: Impuestos */}

Impuestos y retenciones

{taxCatalog.groups().map((group) => { // Filtra impuestos de ese grupo const taxesInGroup = displayTaxes?.filter((item) => { const tax = taxCatalog.findByCode(item.tax_code).match( (t) => t, () => undefined ); return tax?.group === group; }); // Si el grupo no tiene impuestos, no renderiza nada if (taxesInGroup?.length === 0) return null; return (
{taxesInGroup?.map((item) => { const tax = taxCatalog.findByCode(item.tax_code).match( (t) => t, () => undefined ); return (
{tax?.name} {formatCurrency(item.taxes_amount, 2, currency_code, language_code)}
); })}
); })}
Total de impuestos {formatCurrency(getValues("taxes_amount"), 2, currency_code, language_code)}
Total de la factura {formatCurrency(getValues("total_amount"), 2, currency_code, language_code)}
); };