Compare commits

...

3 Commits

9 changed files with 51 additions and 16 deletions

View File

@ -47,9 +47,11 @@ export const AuditPage = () => {
<RdxPageContainer width="full"> <RdxPageContainer width="full">
<RdxPageStack spacing="default"> <RdxPageStack spacing="default">
<RdxPageHeader description={t("audit.description")} title={t("audit.title")} /> <RdxPageHeader description={t("audit.description")} title={t("audit.title")} />
{controller.isError && controller.hasUsableData ? ( {controller.isError && controller.hasUsableData ? (
<ErrorAlert message={t("audit.error.refresh")} title={t("audit.error.load")} /> <ErrorAlert message={t("audit.error.refresh")} title={t("audit.error.load")} />
) : null} ) : null}
<div className="flex flex-col gap-4 lg:flex-row"> <div className="flex flex-col gap-4 lg:flex-row">
<AuditFiltersPanel filters={controller.filters} onChange={controller.setFilters} /> <AuditFiltersPanel filters={controller.filters} onChange={controller.setFilters} />
<div className="min-w-0 flex-1 space-y-4"> <div className="min-w-0 flex-1 space-y-4">

View File

@ -0,0 +1,32 @@
import assert from "node:assert/strict";
import test from "node:test";
import { PaymentTermPublicModelMapper } from "./payment-term-public-model.mapper";
test("serializa los porcentajes de las reglas de vencimiento como DTO", () => {
const mapper = new PaymentTermPublicModelMapper();
const result = mapper.toPublicModel({
id: { toString: () => "payment-term-id" },
companyId: { toString: () => "company-id" },
name: { toPrimitive: () => "Al contado" },
description: { map: () => null },
isActive: true,
dueRules: {
getAll: () => [
{
dueDays: { toPrimitive: () => 0 },
percentage: {
toPrimitive: () => ({ value: 10000, scale: 2 }),
toObjectString: () => ({ value: "10000", scale: "2" }),
},
},
],
},
} as never);
assert.deepEqual(result.dueRules[0]?.percentage, {
value: "10000",
scale: "2",
});
});

View File

@ -11,7 +11,7 @@ export class PaymentTermPublicModelMapper {
isActive: paymentTerm.isActive, isActive: paymentTerm.isActive,
dueRules: paymentTerm.dueRules.getAll().map((rule) => ({ dueRules: paymentTerm.dueRules.getAll().map((rule) => ({
dueDays: String(rule.dueDays.toPrimitive()), dueDays: String(rule.dueDays.toPrimitive()),
percentage: rule.percentage.toPrimitive(), percentage: rule.percentage.toObjectString(),
})), })),
}; };
} }

View File

@ -1,3 +1,4 @@
import type { PercentageDTO } from "@erp/core";
import type { UniqueID } from "@repo/rdx-ddd"; import type { UniqueID } from "@repo/rdx-ddd";
import type { Maybe } from "@repo/rdx-utils"; import type { Maybe } from "@repo/rdx-utils";
@ -11,9 +12,6 @@ export interface PaymentTermPublicModel {
isActive: boolean; isActive: boolean;
dueRules: Array<{ dueRules: Array<{
dueDays: string; dueDays: string;
percentage: { percentage: PercentageDTO;
value: string;
scale: number;
};
}>; }>;
} }

View File

@ -1,3 +1,5 @@
import type { PercentageDTO } from "@erp/core";
/** /**
* Datos del plazo de pago que completan a la proforma. * Datos del plazo de pago que completan a la proforma.
*/ */
@ -8,9 +10,6 @@ export interface InvoicePaymentTermReadModel {
isActive: boolean; isActive: boolean;
dueRules: Array<{ dueRules: Array<{
dueDays: string; dueDays: string;
percentage: { percentage: PercentageDTO;
value: string;
scale: number;
};
}>; }>;
} }

View File

@ -69,7 +69,7 @@ test("toCreateProps no materializa VerifactuRecord ni policy en el converter", (
assert.equal(result.data.verifactu.isNone(), true); assert.equal(result.data.verifactu.isNone(), true);
}); });
test("resolvePaymentTerm normaliza percentage.value cuando llega numérico del catálogo", () => { test("resolvePaymentTerm convierte el DTO de porcentaje al formato de dominio", () => {
const converter = new ProformaToIssuedInvoiceConverter(); const converter = new ProformaToIssuedInvoiceConverter();
const companyId = UniqueID.generateNewID(); const companyId = UniqueID.generateNewID();
const paymentTermId = UniqueID.generateNewID(); const paymentTermId = UniqueID.generateNewID();
@ -126,8 +126,8 @@ test("resolvePaymentTerm normaliza percentage.value cuando llega numérico del c
{ {
dueDays: "30", dueDays: "30",
percentage: { percentage: {
value: 10000, value: "10000",
scale: 2, scale: "2",
}, },
}, },
], ],

View File

@ -306,8 +306,8 @@ export class ProformaToIssuedInvoiceConverter implements IProformaToIssuedInvoic
dueRules: paymentTerm.dueRules.map((rule) => ({ dueRules: paymentTerm.dueRules.map((rule) => ({
dueDays: rule.dueDays, dueDays: rule.dueDays,
percentage: { percentage: {
value: String(rule.percentage.value), value: rule.percentage.value,
scale: rule.percentage.scale, scale: Number(rule.percentage.scale),
}, },
})), })),
}, },

View File

@ -76,7 +76,7 @@ test("detail devuelve payment_term enriquecido cuando existe", () => {
dueRules: [ dueRules: [
{ {
dueDays: "0", dueDays: "0",
percentage: { value: "5000", scale: 2 }, percentage: { value: "5000", scale: "2" },
}, },
], ],
}), }),
@ -87,4 +87,8 @@ test("detail devuelve payment_term enriquecido cuando existe", () => {
assert.equal(snapshot.payment_term?.name, "50/50"); assert.equal(snapshot.payment_term?.name, "50/50");
assert.equal(snapshot.payment_term?.is_active, false); assert.equal(snapshot.payment_term?.is_active, false);
assert.equal(snapshot.payment_term?.due_rules.length, 1); assert.equal(snapshot.payment_term?.due_rules.length, 1);
assert.deepEqual(snapshot.payment_term?.due_rules[0]?.percentage, {
value: "5000",
scale: "2",
});
}); });

View File

@ -50,7 +50,7 @@ export class Percentage extends ValueObject<PercentageProps> {
return schema.safeParse(values); return schema.safeParse(values);
} }
static create(props: { value: number; scale?: number }): Result<Percentage> { static create(props: PercentageProps): Result<Percentage> {
const { value, scale = Percentage.DEFAULT_SCALE } = props; const { value, scale = Percentage.DEFAULT_SCALE } = props;
const valueIsValid = Percentage.validate({ value, scale }); const valueIsValid = Percentage.validate({ value, scale });