Uecko_ERP/modules/customer-invoices/src/api/application/use-cases/issue-customer-invoice.use-case.ts
2025-09-26 17:00:11 +02:00

73 lines
2.2 KiB
TypeScript

import { EntityNotFoundError, ITransactionManager } from "@erp/core/api";
import { UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
import { CustomerInvoiceNumber, CustomerInvoiceService } from "../../domain";
import { StatusInvoiceIsApprovedSpecification } from "../specs";
type IssueCustomerInvoiceUseCaseInput = {
companyId: UniqueID;
invoice_id: string;
};
export class IssueCustomerInvoiceUseCase {
constructor(
private readonly service: CustomerInvoiceService,
private readonly transactionManager: ITransactionManager
) {}
public execute(params: IssueCustomerInvoiceUseCaseInput) {
const { invoice_id, companyId } = params;
const idOrError = UniqueID.create(invoice_id);
if (idOrError.isFailure) {
return Result.fail(idOrError.error);
}
const invoiceId = idOrError.data;
return this.transactionManager.complete(async (transaction) => {
try {
const invoiceResult = await this.service.getInvoiceByIdInCompany(
companyId,
invoiceId,
transaction
);
if (invoiceResult.isFailure) {
return Result.fail(invoiceResult.error);
}
const invoiceProforma = invoiceResult.data;
const isOk = new StatusInvoiceIsApprovedSpecification().isSatisfiedBy(invoiceProforma);
if (!isOk) {
return Result.fail(
new EntityNotFoundError("Customer invoice", "id", invoiceId.toString())
);
}
// La factura se puede emitir.
// Pedir el número de factura
const newInvoiceNumber = CustomerInvoiceNumber.create("xxx/001").data;
// Asignamos el número de la factura
const issuedInvoiceResult = invoiceProforma.issueInvoice(newInvoiceNumber);
if (issuedInvoiceResult.isFailure) {
return Result.fail(new EntityNotFoundError("Customer invoice", "id", error));
}
const issuedInvoice = issuedInvoiceResult.data;
this.service.saveInvoice(issuedInvoice, transaction);
//return await this.service.IssueInvoiceByIdInCompany(companyId, invoiceId, transaction);
} catch (error: unknown) {
return Result.fail(error as Error);
}
});
}
}