Uecko_ERP/modules/customer-invoices/src/api/application/customer-invoice-application.service.ts

170 lines
6.1 KiB
TypeScript
Raw Normal View History

2025-06-11 15:13:44 +00:00
import { Criteria } from "@repo/rdx-criteria/server";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";
2025-10-04 16:29:14 +00:00
import {
CustomerInvoice,
CustomerInvoicePatchProps,
CustomerInvoiceProps,
} from "../domain/aggregates";
import { ICustomerInvoiceRepository } from "../domain/repositories";
import { CustomerInvoiceListDTO } from "../infrastructure";
export class CustomerInvoiceApplicationService {
2025-06-26 11:32:55 +00:00
constructor(private readonly repository: ICustomerInvoiceRepository) {}
2025-06-11 15:13:44 +00:00
2025-06-26 11:32:55 +00:00
/**
* Construye un nuevo agregado CustomerInvoice a partir de props validadas.
*
2025-10-23 17:29:52 +00:00
* @param companyId - Identificador de la empresa a la que pertenece la factura.
2025-06-26 11:32:55 +00:00
* @param props - Las propiedades ya validadas para crear la factura.
2025-09-03 18:04:09 +00:00
* @param invoiceId - Identificador UUID de la factura (opcional).
2025-06-26 11:32:55 +00:00
* @returns Result<CustomerInvoice, Error> - El agregado construido o un error si falla la creación.
*/
2025-09-03 18:04:09 +00:00
buildInvoiceInCompany(
companyId: UniqueID,
props: Omit<CustomerInvoiceProps, "companyId">,
invoiceId?: UniqueID
): Result<CustomerInvoice, Error> {
return CustomerInvoice.create({ ...props, companyId }, invoiceId);
2025-06-26 11:32:55 +00:00
}
/**
2025-10-03 19:01:38 +00:00
* Guarda una nueva factura y devuelve la factura guardada.
2025-06-26 11:32:55 +00:00
*
2025-10-23 17:29:52 +00:00
* @param companyId - Identificador de la empresa a la que pertenece la factura.
2025-10-03 19:01:38 +00:00
* @param invoice - El agregado a guardar.
* @param transaction - Transacción activa para la operación.
* @returns Result<CustomerInvoice, Error> - El agregado guardado o un error si falla la operación.
*/
2025-10-04 16:29:14 +00:00
async createInvoiceInCompany(
2025-10-03 19:01:38 +00:00
companyId: UniqueID,
invoice: CustomerInvoice,
transaction: Transaction
): Promise<Result<CustomerInvoice, Error>> {
const result = await this.repository.create(invoice, transaction);
if (result.isFailure) {
return Result.fail(result.error);
}
return this.getInvoiceByIdInCompany(companyId, invoice.id, transaction);
}
/**
2025-10-04 16:29:14 +00:00
* Actualiza una factura existente y devuelve la factura actualizada.
2025-10-03 19:01:38 +00:00
*
2025-10-23 17:29:52 +00:00
* @param companyId - Identificador de la empresa a la que pertenece la factura.
2025-06-26 11:32:55 +00:00
* @param invoice - El agregado a guardar.
* @param transaction - Transacción activa para la operación.
* @returns Result<CustomerInvoice, Error> - El agregado guardado o un error si falla la operación.
*/
2025-10-04 16:29:14 +00:00
async updateInvoiceInCompany(
2025-10-03 19:01:38 +00:00
companyId: UniqueID,
2025-09-03 18:04:09 +00:00
invoice: CustomerInvoice,
2025-10-03 19:01:38 +00:00
transaction: Transaction
2025-09-03 18:04:09 +00:00
): Promise<Result<CustomerInvoice, Error>> {
2025-10-03 19:01:38 +00:00
const result = await this.repository.update(invoice, transaction);
if (result.isFailure) {
return Result.fail(result.error);
}
return this.getInvoiceByIdInCompany(companyId, invoice.id, transaction);
2025-06-26 11:32:55 +00:00
}
2025-06-26 18:05:33 +00:00
/**
*
* Comprueba si existe o no en persistencia una factura con el ID proporcionado
*
2025-10-23 17:29:52 +00:00
* @param companyId - Identificador de la empresa a la que pertenece la factura.
2025-09-03 18:04:09 +00:00
* @param invoiceId - Identificador UUID de la factura.
2025-06-26 18:05:33 +00:00
* @param transaction - Transacción activa para la operación.
* @returns Result<Boolean, Error> - Existe la factura o no.
*/
2025-09-03 18:04:09 +00:00
async existsByIdInCompany(
companyId: UniqueID,
invoiceId: UniqueID,
2025-10-03 19:01:38 +00:00
transaction?: Transaction
2025-09-03 18:04:09 +00:00
): Promise<Result<boolean, Error>> {
return this.repository.existsByIdInCompany(companyId, invoiceId, transaction);
2025-06-26 18:05:33 +00:00
}
2025-06-26 11:32:55 +00:00
/**
* Obtiene una colección de facturas que cumplen con los filtros definidos en un objeto Criteria.
*
2025-10-23 17:29:52 +00:00
* @param companyId - Identificador de la empresa a la que pertenece la factura.
2025-06-26 11:32:55 +00:00
* @param criteria - Objeto con condiciones de filtro, paginación y orden.
* @param transaction - Transacción activa para la operación.
2025-09-11 17:52:50 +00:00
* @returns Result<Collection<CustomerInvoiceListDTO>, Error> - Colección de facturas o error.
2025-06-26 11:32:55 +00:00
*/
2025-09-03 18:04:09 +00:00
async findInvoiceByCriteriaInCompany(
companyId: UniqueID,
2025-06-11 15:13:44 +00:00
criteria: Criteria,
transaction?: Transaction
2025-09-11 17:52:50 +00:00
): Promise<Result<Collection<CustomerInvoiceListDTO>, Error>> {
2025-09-03 18:04:09 +00:00
return this.repository.findByCriteriaInCompany(companyId, criteria, transaction);
2025-06-11 15:13:44 +00:00
}
2025-06-26 11:32:55 +00:00
/**
* Recupera una factura por su identificador único.
*
2025-09-03 18:04:09 +00:00
* @param invoiceId - Identificador UUID de la factura.
2025-06-26 11:32:55 +00:00
* @param transaction - Transacción activa para la operación.
* @returns Result<CustomerInvoice, Error> - Factura encontrada o error.
*/
2025-09-03 18:04:09 +00:00
async getInvoiceByIdInCompany(
companyId: UniqueID,
invoiceId: UniqueID,
transaction?: Transaction
): Promise<Result<CustomerInvoice>> {
return await this.repository.getByIdInCompany(companyId, invoiceId, transaction);
2025-06-11 15:13:44 +00:00
}
2025-06-26 11:32:55 +00:00
/**
* Actualiza parcialmente una factura existente con nuevos datos.
2025-09-03 18:04:09 +00:00
* No lo guarda en el repositorio.
2025-06-26 11:32:55 +00:00
*
2025-10-23 17:29:52 +00:00
* @param companyId - Identificador de la empresa a la que pertenece la factura.
2025-09-03 18:04:09 +00:00
* @param invoiceId - Identificador de la factura a actualizar.
2025-06-26 11:32:55 +00:00
* @param changes - Subconjunto de props válidas para aplicar.
* @param transaction - Transacción activa para la operación.
* @returns Result<CustomerInvoice, Error> - Factura actualizada o error.
*/
2025-10-04 16:29:14 +00:00
async patchInvoiceByIdInCompany(
2025-09-03 18:04:09 +00:00
companyId: UniqueID,
invoiceId: UniqueID,
changes: CustomerInvoicePatchProps,
2025-06-11 15:13:44 +00:00
transaction?: Transaction
): Promise<Result<CustomerInvoice, Error>> {
2025-09-03 18:04:09 +00:00
const invoiceResult = await this.getInvoiceByIdInCompany(companyId, invoiceId, transaction);
2025-06-11 15:13:44 +00:00
2025-09-03 18:04:09 +00:00
if (invoiceResult.isFailure) {
return Result.fail(invoiceResult.error);
2025-06-11 15:13:44 +00:00
}
2025-10-04 16:29:14 +00:00
const updated = invoiceResult.data.update(changes);
2025-06-11 15:13:44 +00:00
2025-10-04 16:29:14 +00:00
if (updated.isFailure) {
return Result.fail(updated.error);
2025-06-11 15:13:44 +00:00
}
2025-10-04 16:29:14 +00:00
return Result.ok(updated.data);
2025-06-11 15:13:44 +00:00
}
2025-06-26 11:32:55 +00:00
/**
* Elimina (o marca como eliminada) una factura según su ID.
*
2025-10-23 17:29:52 +00:00
* @param companyId - Identificador de la empresa a la que pertenece la factura.
2025-09-03 18:04:09 +00:00
* @param invoiceId - Identificador UUID de la factura.
2025-06-26 11:32:55 +00:00
* @param transaction - Transacción activa para la operación.
* @returns Result<boolean, Error> - Resultado de la operación.
*/
2025-09-05 11:23:45 +00:00
async deleteInvoiceByIdInCompany(
2025-09-03 18:04:09 +00:00
companyId: UniqueID,
invoiceId: UniqueID,
transaction?: Transaction
2025-10-04 16:29:14 +00:00
): Promise<Result<boolean, Error>> {
2025-09-03 18:04:09 +00:00
return this.repository.deleteByIdInCompany(companyId, invoiceId, transaction);
2025-06-11 15:13:44 +00:00
}
}