FactuGES_ERP/modules/customer-invoices/src/api/application/helpers/map-dto-to-customer-invoice-props.ts

97 lines
2.7 KiB
TypeScript
Raw Normal View History

2025-09-18 08:49:32 +00:00
import {
CurrencyCode,
UniqueID,
UtcDate,
ValidationErrorCollection,
ValidationErrorDetail,
extractOrPushError,
maybeFromNullableVO,
} from "@repo/rdx-ddd";
2025-06-26 11:32:55 +00:00
import { Result } from "@repo/rdx-utils";
2025-09-18 08:49:32 +00:00
import { CreateCustomerInvoiceRequestDTO } from "../../../common";
2025-06-26 11:32:55 +00:00
import {
CustomerInvoiceNumber,
CustomerInvoiceProps,
CustomerInvoiceSerie,
CustomerInvoiceStatus,
} from "../../domain";
import { mapDTOToCustomerInvoiceItemsProps } from "./map-dto-to-customer-invoice-items-props";
/**
* Convierte el DTO a las props validadas (CustomerInvoiceProps).
* No construye directamente el agregado.
*
* @param dto - DTO con los datos de la factura de cliente
2025-06-26 18:05:33 +00:00
* @returns
2025-06-26 11:32:55 +00:00
*
*/
2025-09-18 08:49:32 +00:00
export function mapDTOToCustomerInvoiceProps(dto: CreateCustomerInvoiceRequestDTO) {
2025-06-26 11:32:55 +00:00
const errors: ValidationErrorDetail[] = [];
2025-06-26 18:05:33 +00:00
const invoiceId = extractOrPushError(UniqueID.create(dto.id), "id", errors);
2025-06-26 11:32:55 +00:00
const invoiceNumber = extractOrPushError(
CustomerInvoiceNumber.create(dto.invoice_number),
"invoice_number",
errors
);
const invoiceSeries = extractOrPushError(
2025-09-18 08:49:32 +00:00
maybeFromNullableVO(dto.invoice_series, (value) => CustomerInvoiceSerie.create(value)),
2025-06-26 11:32:55 +00:00
"invoice_series",
errors
);
2025-09-04 17:57:04 +00:00
const invoiceDate = extractOrPushError(
UtcDate.createFromISO(dto.invoice_date),
"invoice_date",
errors
);
2025-06-26 11:32:55 +00:00
const operationDate = extractOrPushError(
2025-09-18 08:49:32 +00:00
maybeFromNullableVO(dto.operation_date, (value) => UtcDate.createFromISO(value)),
2025-06-26 11:32:55 +00:00
"operation_date",
errors
);
2025-09-18 08:49:32 +00:00
const currencyCode = extractOrPushError(
CurrencyCode.create(dto.currency_code),
"currency",
errors
);
2025-06-26 11:32:55 +00:00
// 🔄 Validar y construir los items de factura con helper especializado
const itemsResult = mapDTOToCustomerInvoiceItemsProps(dto.items);
if (itemsResult.isFailure) {
return Result.fail(itemsResult.error);
}
if (errors.length > 0) {
2025-09-18 08:49:32 +00:00
return Result.fail(new ValidationErrorCollection("Customer dto mapping failed", errors));
2025-06-26 11:32:55 +00:00
}
const invoiceProps: CustomerInvoiceProps = {
invoiceNumber: invoiceNumber!,
2025-09-18 08:49:32 +00:00
series: invoiceSeries!,
2025-09-04 17:57:04 +00:00
invoiceDate: invoiceDate!,
2025-06-26 11:32:55 +00:00
operationDate: operationDate!,
status: CustomerInvoiceStatus.createDraft(),
2025-09-18 08:49:32 +00:00
currencyCode: currencyCode!,
2025-06-26 11:32:55 +00:00
};
2025-06-26 18:05:33 +00:00
return Result.ok({ id: invoiceId!, props: invoiceProps });
2025-06-26 11:32:55 +00:00
/*if (hasNoUndefinedFields(invoiceProps)) {
const invoiceOrError = CustomerInvoice.create(invoiceProps, invoiceId);
if (invoiceOrError.isFailure) {
return Result.fail(invoiceOrError.error);
}
return Result.ok(invoiceOrError.data);
}
return Result.fail(
new ValidationErrorCollection([
{ path: "", message: "Error building from DTO: Some fields are undefined" },
])
);*/
}