55 lines
1.8 KiB
TypeScript
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,
|
|
});
|
|
}
|