45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
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<Tax> {
|
|
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<TaxGroup> {
|
|
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)}`));
|
|
}
|
|
}
|
|
}
|