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">
<RdxPageStack spacing="default">
<RdxPageHeader description={t("audit.description")} title={t("audit.title")} />
{controller.isError && controller.hasUsableData ? (
<ErrorAlert message={t("audit.error.refresh")} title={t("audit.error.load")} />
) : null}
<div className="flex flex-col gap-4 lg:flex-row">
<AuditFiltersPanel filters={controller.filters} onChange={controller.setFilters} />
<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,
dueRules: paymentTerm.dueRules.getAll().map((rule) => ({
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 { Maybe } from "@repo/rdx-utils";
@ -11,9 +12,6 @@ export interface PaymentTermPublicModel {
isActive: boolean;
dueRules: Array<{
dueDays: string;
percentage: {
value: string;
scale: number;
};
percentage: PercentageDTO;
}>;
}

View File

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

View File

@ -69,7 +69,7 @@ test("toCreateProps no materializa VerifactuRecord ni policy en el converter", (
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 companyId = UniqueID.generateNewID();
const paymentTermId = UniqueID.generateNewID();
@ -126,8 +126,8 @@ test("resolvePaymentTerm normaliza percentage.value cuando llega numérico del c
{
dueDays: "30",
percentage: {
value: 10000,
scale: 2,
value: "10000",
scale: "2",
},
},
],

View File

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

View File

@ -76,7 +76,7 @@ test("detail devuelve payment_term enriquecido cuando existe", () => {
dueRules: [
{
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?.is_active, false);
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);
}
static create(props: { value: number; scale?: number }): Result<Percentage> {
static create(props: PercentageProps): Result<Percentage> {
const { value, scale = Percentage.DEFAULT_SCALE } = props;
const valueIsValid = Percentage.validate({ value, scale });