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-09-03 18:04:09 +00:00
|
|
|
import { CustomerInvoice, CustomerInvoicePatchProps, CustomerInvoiceProps } from "../aggregates";
|
2025-06-11 15:13:44 +00:00
|
|
|
import { ICustomerInvoiceRepository } from "../repositories";
|
|
|
|
|
|
2025-09-03 18:04:09 +00:00
|
|
|
export class CustomerInvoiceService {
|
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-09-03 18:04:09 +00:00
|
|
|
* @param companyId - Identificador de la empresa a la que pertenece el cliente.
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Guarda una instancia de CustomerInvoice en persistencia.
|
|
|
|
|
*
|
|
|
|
|
* @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-09-03 18:04:09 +00:00
|
|
|
async saveInvoice(
|
|
|
|
|
invoice: CustomerInvoice,
|
|
|
|
|
transaction: any
|
|
|
|
|
): Promise<Result<CustomerInvoice, Error>> {
|
|
|
|
|
return this.repository.save(invoice, 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-09-03 18:04:09 +00:00
|
|
|
* @param companyId - Identificador UUID de la empresa a la que pertenece el cliente.
|
|
|
|
|
* @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,
|
|
|
|
|
transaction?: any
|
|
|
|
|
): 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-09-03 18:04:09 +00:00
|
|
|
* @param companyId - Identificador UUID de la empresa a la que pertenece el cliente.
|
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.
|
|
|
|
|
* @returns Result<Collection<CustomerInvoice>, Error> - Colección de facturas o error.
|
|
|
|
|
*/
|
2025-09-03 18:04:09 +00:00
|
|
|
async findInvoiceByCriteriaInCompany(
|
|
|
|
|
companyId: UniqueID,
|
2025-06-11 15:13:44 +00:00
|
|
|
criteria: Criteria,
|
|
|
|
|
transaction?: Transaction
|
|
|
|
|
): Promise<Result<Collection<CustomerInvoice>, 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-09-03 18:04:09 +00:00
|
|
|
* @param companyId - Identificador de la empresa a la que pertenece el cliente.
|
|
|
|
|
* @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-09-03 18:04:09 +00:00
|
|
|
async updateInvoiceByIdInCompany(
|
|
|
|
|
companyId: UniqueID,
|
|
|
|
|
invoiceId: UniqueID,
|
|
|
|
|
changes: CustomerInvoicePatchProps,
|
2025-06-11 15:13:44 +00:00
|
|
|
transaction?: Transaction
|
|
|
|
|
): Promise<Result<CustomerInvoice, Error>> {
|
|
|
|
|
// Verificar si la factura existe
|
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-09-03 18:04:09 +00:00
|
|
|
const invoice = invoiceResult.data;
|
|
|
|
|
const updatedInvoice = invoice.update(changes);
|
2025-06-11 15:13:44 +00:00
|
|
|
|
2025-09-03 18:04:09 +00:00
|
|
|
if (updatedInvoice.isFailure) {
|
|
|
|
|
return Result.fail(updatedInvoice.error);
|
2025-06-11 15:13:44 +00:00
|
|
|
}
|
|
|
|
|
|
2025-09-03 18:04:09 +00:00
|
|
|
return Result.ok(updatedInvoice.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-09-03 18:04:09 +00:00
|
|
|
* @param companyId - Identificador de la empresa a la que pertenece el cliente.
|
|
|
|
|
* @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-03 18:04:09 +00:00
|
|
|
async deleteById(
|
|
|
|
|
companyId: UniqueID,
|
|
|
|
|
invoiceId: UniqueID,
|
|
|
|
|
transaction?: Transaction
|
|
|
|
|
): Promise<Result<void, Error>> {
|
|
|
|
|
return this.repository.deleteByIdInCompany(companyId, invoiceId, transaction);
|
2025-06-11 15:13:44 +00:00
|
|
|
}
|
|
|
|
|
}
|