Uecko_ERP/modules/customer-invoices/src/api/infrastructure/mappers/customer-invoice.mapper.ts

113 lines
3.6 KiB
TypeScript
Raw Normal View History

2025-06-11 15:13:44 +00:00
import { ISequelizeMapper, MapperParamsType, SequelizeMapper } from "@erp/core/api";
import { UniqueID, UtcDate } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
2025-06-12 06:55:17 +00:00
import {
CustomerInvoice,
CustomerInvoiceNumber,
CustomerInvoiceSerie,
CustomerInvoiceStatus,
} from "../../domain";
2025-06-11 15:13:44 +00:00
import { CustomerInvoiceCreationAttributes, CustomerInvoiceModel } from "../sequelize";
2025-06-12 06:55:17 +00:00
import { CustomerInvoiceItemMapper } from "./customer-invoice-item.mapper";
2025-06-11 15:13:44 +00:00
export interface ICustomerInvoiceMapper
2025-06-12 06:55:17 +00:00
extends ISequelizeMapper<
CustomerInvoiceModel,
CustomerInvoiceCreationAttributes,
CustomerInvoice
> {}
2025-06-11 15:13:44 +00:00
export class CustomerInvoiceMapper
extends SequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice>
implements ICustomerInvoiceMapper
{
2025-06-12 06:55:17 +00:00
private customerInvoiceItemMapper: CustomerInvoiceItemMapper;
2025-06-11 15:13:44 +00:00
constructor() {
super();
2025-06-12 06:55:17 +00:00
this.customerInvoiceItemMapper = new CustomerInvoiceItemMapper(); // Instanciar el mapper de items
2025-06-11 15:13:44 +00:00
}
2025-06-12 06:55:17 +00:00
public mapToDomain(
source: CustomerInvoiceModel,
params?: MapperParamsType
): Result<CustomerInvoice, Error> {
2025-06-11 15:13:44 +00:00
const idOrError = UniqueID.create(source.id);
2025-06-12 06:55:17 +00:00
const statusOrError = CustomerInvoiceStatus.create(source.invoice_status);
const customerInvoiceSeriesOrError = CustomerInvoiceSerie.create(source.invoice_series);
const customerInvoiceNumberOrError = CustomerInvoiceNumber.create(source.invoice_number);
2025-06-24 18:38:57 +00:00
const issueDateOrError = UtcDate.createFromISO(source.issue_date);
const operationDateOrError = UtcDate.createFromISO(source.operation_date);
2025-06-11 15:13:44 +00:00
const result = Result.combine([
idOrError,
statusOrError,
2025-06-12 06:55:17 +00:00
customerInvoiceSeriesOrError,
customerInvoiceNumberOrError,
2025-06-11 15:13:44 +00:00
issueDateOrError,
operationDateOrError,
]);
if (result.isFailure) {
return Result.fail(result.error);
}
// Mapear los items de la factura
2025-06-12 06:55:17 +00:00
const itemsOrErrors = this.customerInvoiceItemMapper.mapArrayToDomain(source.items, {
2025-06-11 15:13:44 +00:00
sourceParent: source,
...params,
});
if (itemsOrErrors.isFailure) {
return Result.fail(itemsOrErrors.error);
}
2025-06-12 06:55:17 +00:00
const customerInvoiceCurrency = source.invoice_currency || "EUR";
2025-06-11 15:13:44 +00:00
return CustomerInvoice.create(
{
status: statusOrError.data,
2025-06-12 06:55:17 +00:00
customerInvoiceSeries: customerInvoiceSeriesOrError.data,
customerInvoiceNumber: customerInvoiceNumberOrError.data,
2025-06-11 15:13:44 +00:00
issueDate: issueDateOrError.data,
operationDate: operationDateOrError.data,
2025-06-12 06:55:17 +00:00
customerInvoiceCurrency,
2025-06-11 15:13:44 +00:00
items: itemsOrErrors.data,
},
idOrError.data
);
}
2025-06-12 06:55:17 +00:00
public mapToPersistence(
source: CustomerInvoice,
params?: MapperParamsType
): CustomerInvoiceCreationAttributes {
2025-06-11 15:13:44 +00:00
const subtotal = source.calculateSubtotal();
const total = source.calculateTotal();
2025-06-12 06:55:17 +00:00
const items = this.customerInvoiceItemMapper.mapCollectionToPersistence(source.items, params);
2025-06-11 15:13:44 +00:00
return {
id: source.id.toString(),
2025-06-12 06:55:17 +00:00
invoice_status: source.status.toPrimitive(),
invoice_series: source.customerInvoiceSeries.toPrimitive(),
invoice_number: source.customerInvoiceNumber.toPrimitive(),
2025-06-11 15:13:44 +00:00
issue_date: source.issueDate.toPrimitive(),
operation_date: source.operationDate.toPrimitive(),
2025-06-12 06:55:17 +00:00
invoice_language: "es",
invoice_currency: source.customerInvoiceCurrency || "EUR",
2025-06-11 15:13:44 +00:00
subtotal_amount: subtotal.amount,
subtotal_scale: subtotal.scale,
total_amount: total.amount,
total_scale: total.scale,
items,
};
}
}
2025-06-12 06:55:17 +00:00
const customerInvoiceMapper: CustomerInvoiceMapper = new CustomerInvoiceMapper();
export { customerInvoiceMapper };