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> { 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, }); }