2025-08-11 17:49:52 +00:00
|
|
|
import { SequelizeRepository, errorMapper } from "@erp/core/api";
|
|
|
|
|
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server";
|
|
|
|
|
import { UniqueID } from "@repo/rdx-ddd";
|
|
|
|
|
import { Collection, Result } from "@repo/rdx-utils";
|
2025-08-14 14:58:13 +00:00
|
|
|
import { Transaction } from "sequelize";
|
2025-08-11 17:49:52 +00:00
|
|
|
import { Customer, ICustomerRepository } from "../../domain";
|
|
|
|
|
import { ICustomerMapper } from "../mappers/customer.mapper";
|
|
|
|
|
import { CustomerModel } from "./customer.model";
|
|
|
|
|
|
|
|
|
|
export class CustomerRepository
|
|
|
|
|
extends SequelizeRepository<Customer>
|
|
|
|
|
implements ICustomerRepository
|
|
|
|
|
{
|
|
|
|
|
//private readonly model: typeof CustomerModel;
|
|
|
|
|
private readonly mapper!: ICustomerMapper;
|
|
|
|
|
|
2025-08-14 14:58:13 +00:00
|
|
|
constructor(mapper: ICustomerMapper) {
|
|
|
|
|
super();
|
2025-08-11 17:49:52 +00:00
|
|
|
this.mapper = mapper;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async existsById(id: UniqueID, transaction?: Transaction): Promise<Result<boolean, Error>> {
|
|
|
|
|
try {
|
|
|
|
|
const result = await this._exists(CustomerModel, "id", id.toString(), transaction);
|
|
|
|
|
|
|
|
|
|
return Result.ok(Boolean(result));
|
|
|
|
|
} catch (err: unknown) {
|
|
|
|
|
return Result.fail(errorMapper.toDomainError(err));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* Persiste una nueva factura o actualiza una existente.
|
|
|
|
|
*
|
|
|
|
|
* @param invoice - El agregado a guardar.
|
|
|
|
|
* @param transaction - Transacción activa para la operación.
|
|
|
|
|
* @returns Result<Customer, Error>
|
|
|
|
|
*/
|
|
|
|
|
async save(invoice: Customer, transaction: Transaction): Promise<Result<Customer, Error>> {
|
|
|
|
|
try {
|
|
|
|
|
const data = this.mapper.mapToPersistence(invoice);
|
|
|
|
|
await CustomerModel.upsert(data, { transaction });
|
|
|
|
|
return Result.ok(invoice);
|
|
|
|
|
} catch (err: unknown) {
|
|
|
|
|
return Result.fail(errorMapper.toDomainError(err));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* Busca una factura por su identificador único.
|
|
|
|
|
* @param id - UUID de la factura.
|
|
|
|
|
* @param transaction - Transacción activa para la operación.
|
|
|
|
|
* @returns Result<Customer, Error>
|
|
|
|
|
*/
|
|
|
|
|
async findById(id: UniqueID, transaction: Transaction): Promise<Result<Customer, Error>> {
|
|
|
|
|
try {
|
|
|
|
|
const rawData = await this._findById(CustomerModel, id.toString(), { transaction });
|
|
|
|
|
|
|
|
|
|
if (!rawData) {
|
|
|
|
|
return Result.fail(new Error(`Invoice with id ${id} not found.`));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.mapper.mapToDomain(rawData);
|
|
|
|
|
} catch (err: unknown) {
|
|
|
|
|
return Result.fail(errorMapper.toDomainError(err));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* Consulta facturas usando un objeto Criteria (filtros, orden, paginación).
|
|
|
|
|
* @param criteria - Criterios de búsqueda.
|
|
|
|
|
* @param transaction - Transacción activa para la operación.
|
|
|
|
|
* @returns Result<Customer[], Error>
|
|
|
|
|
*
|
|
|
|
|
* @see Criteria
|
|
|
|
|
*/
|
|
|
|
|
public async findByCriteria(
|
|
|
|
|
criteria: Criteria,
|
|
|
|
|
transaction: Transaction
|
|
|
|
|
): Promise<Result<Collection<Customer>, Error>> {
|
|
|
|
|
try {
|
|
|
|
|
const converter = new CriteriaToSequelizeConverter();
|
|
|
|
|
const query = converter.convert(criteria);
|
|
|
|
|
|
|
|
|
|
console.debug({ criteria, transaction, query, CustomerModel });
|
|
|
|
|
|
|
|
|
|
const instances = await CustomerModel.findAll({
|
|
|
|
|
...query,
|
|
|
|
|
transaction,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
console.debug(instances);
|
|
|
|
|
|
|
|
|
|
return this.mapper.mapArrayToDomain(instances);
|
|
|
|
|
} catch (err: unknown) {
|
|
|
|
|
console.error(err);
|
|
|
|
|
return Result.fail(errorMapper.toDomainError(err));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* Elimina o marca como eliminada una factura.
|
|
|
|
|
* @param id - UUID de la factura a eliminar.
|
|
|
|
|
* @param transaction - Transacción activa para la operación.
|
|
|
|
|
* @returns Result<void, Error>
|
|
|
|
|
*/
|
|
|
|
|
async deleteById(id: UniqueID, transaction: any): Promise<Result<void, Error>> {
|
|
|
|
|
try {
|
|
|
|
|
await this._deleteById(CustomerModel, id, false, transaction);
|
|
|
|
|
return Result.ok<void>();
|
|
|
|
|
} catch (err: unknown) {
|
|
|
|
|
return Result.fail(errorMapper.toDomainError(err));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|