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

88 lines
2.6 KiB
TypeScript
Raw Normal View History

2025-06-26 11:32:55 +00:00
import { ValidationErrorCollection, ValidationErrorDetail } from "@erp/core/api";
2025-06-26 18:05:33 +00:00
import { UniqueID, UtcDate } from "@repo/rdx-ddd";
2025-06-26 11:32:55 +00:00
import { Result } from "@repo/rdx-utils";
import { CreateCustomerInvoiceCommandDTO } from "../../../common/dto";
import {
CustomerInvoiceNumber,
CustomerInvoiceProps,
CustomerInvoiceSerie,
CustomerInvoiceStatus,
} from "../../domain";
import { extractOrPushError } from "./extract-or-push-error";
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-06-26 18:05:33 +00:00
export function mapDTOToCustomerInvoiceProps(dto: CreateCustomerInvoiceCommandDTO) {
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(
CustomerInvoiceSerie.create(dto.invoice_series),
"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(
UtcDate.createFromISO(dto.operation_date),
"operation_date",
errors
);
//const currency = extractOrPushError(Currency.(dto.currency), "currency", errors);
const currency = dto.currency;
// 🔄 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) {
return Result.fail(new ValidationErrorCollection(errors));
}
const invoiceProps: CustomerInvoiceProps = {
invoiceNumber: invoiceNumber!,
invoiceSeries: invoiceSeries!,
2025-09-04 17:57:04 +00:00
invoiceDate: invoiceDate!,
2025-06-26 11:32:55 +00:00
operationDate: operationDate!,
status: CustomerInvoiceStatus.createDraft(),
currency,
};
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" },
])
);*/
}