FactuGES_ERP/modules/customer-invoices/src/api/application/helpers/build-customer-invoice-from-dto.ts
2025-06-24 20:38:57 +02:00

55 lines
1.8 KiB
TypeScript

import { ValidationErrorCollection, ValidationErrorDetail } from "@erp/core/api";
import { UniqueID, UtcDate } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
import { CreateCustomerInvoiceCommandDTO } from "../../../common/dto";
import { CustomerInvoiceNumber, CustomerInvoiceProps, CustomerInvoiceSerie } from "../../domain";
import { buildInvoiceItemsFromDTO } from "./build-customer-invoice-items-from-dto";
import { extractOrPushError } from "./extract-or-push-error";
export async function buildInvoiceFromDTO(
dto: CreateCustomerInvoiceCommandDTO
): Promise<Result<CustomerInvoiceProps, Error>> {
const errors: ValidationErrorDetail[] = [];
const invoiceNumber = extractOrPushError(
CustomerInvoiceNumber.create(dto.invoice_number),
"invoice_number",
errors
);
const invoiceSeries = extractOrPushError(
CustomerInvoiceSerie.create(dto.invoice_series),
"invoice_series",
errors
);
const issueDate = extractOrPushError(UtcDate.createFromISO(dto.issue_date), "issue_date", errors);
const operationDate = extractOrPushError(
UtcDate.createFromISO(dto.operation_date),
"operation_date",
errors
);
// 🔄 Validar y construir los items de factura con helper especializado
const itemsResult = await buildInvoiceItemsFromDTO(dto.items);
if (itemsResult.isFailure) {
return Result.fail(itemsResult.error);
}
if (errors.length > 0) {
return Result.fail(new ValidationErrorCollection(errors));
}
return Result.ok({
id: UniqueID.create(),
customerId: customerId.data,
invoiceNumber: invoiceNumber.data,
invoiceSeries: invoiceSeries.data,
issueDate: issueDate.data,
operationDate: operationDate.data,
subtotalPrice: subtotalPrice.data,
discount: discount.data,
tax: tax.data,
totalAmount: totalAmount.data,
lines: itemsResult.data,
});
}