import type { TaxDefinitionPublicFamily, TaxDefinitionPublicModel } from "@erp/catalogs/api"; import { Tax, type TaxGroup, TaxPercentage } from "@erp/core/api"; import { Result } from "@repo/rdx-utils"; /** * Sirve para mapear TaxDefinitionPublicModel a Tax, * que es el modelo de dominio que se para proforma e issued-invoices. */ export class TaxDefinitionToTaxMapper { public toTax(taxDefinition: TaxDefinitionPublicModel): Result { const group = this.toTaxGroup(taxDefinition.taxFamily); if (group.isFailure) { return Result.fail(group.error); } return Tax.create({ code: taxDefinition.code, name: taxDefinition.name, rate: TaxPercentage.create({ value: taxDefinition.rate.value, }).data, group: group.data, calculationBehavior: taxDefinition.calculationBehavior, }); } private toTaxGroup(taxFamily: TaxDefinitionPublicFamily): Result { switch (taxFamily) { case "iva": case "igic": case "ipsi": case "retention": return Result.ok(taxFamily); case "surcharge": return Result.ok("surcharge"); default: return Result.fail(new Error(`Unsupported tax family: ${String(taxFamily)}`)); } } }