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

129 lines
4.1 KiB
TypeScript
Raw Normal View History

2025-06-11 13:13:21 +00:00
import { ISequelizeMapper, MapperParamsType, SequelizeMapper } from "@erp/core/api";
2025-05-26 10:38:45 +00:00
import { UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
2025-04-22 08:11:50 +00:00
import { InferCreationAttributes } from "sequelize";
2025-05-26 10:38:45 +00:00
import {
2025-06-11 15:13:44 +00:00
CustomerInvoice,
CustomerInvoiceItem,
CustomerInvoiceItemDescription,
CustomerInvoiceItemDiscount,
CustomerInvoiceItemQuantity,
CustomerInvoiceItemUnitPrice,
2025-05-26 10:38:45 +00:00
} from "../../domain";
2025-06-11 15:13:44 +00:00
import { CustomerInvoiceItemCreationAttributes, CustomerInvoiceItemModel, CustomerInvoiceModel } from "../sequelize";
2025-03-18 08:05:00 +00:00
2025-06-11 15:13:44 +00:00
export interface ICustomerInvoiceItemMapper
extends ISequelizeMapper<CustomerInvoiceItemModel, CustomerInvoiceItemCreationAttributes, CustomerInvoiceItem> {}
2025-03-18 08:05:00 +00:00
2025-06-11 15:13:44 +00:00
export class CustomerInvoiceItemMapper
extends SequelizeMapper<CustomerInvoiceItemModel, CustomerInvoiceItemCreationAttributes, CustomerInvoiceItem>
implements ICustomerInvoiceItemMapper
2025-03-18 08:05:00 +00:00
{
2025-04-22 08:11:50 +00:00
public mapToDomain(
2025-06-11 15:13:44 +00:00
source: CustomerInvoiceItemModel,
2025-04-22 08:11:50 +00:00
params?: MapperParamsType
2025-06-11 15:13:44 +00:00
): Result<CustomerInvoiceItem, Error> {
const { sourceParent } = params as { sourceParent: CustomerInvoiceModel };
2025-04-22 08:11:50 +00:00
2025-05-26 10:38:45 +00:00
// Validación y creación de ID único
2025-04-22 08:11:50 +00:00
const idOrError = UniqueID.create(source.item_id);
2025-05-26 10:38:45 +00:00
if (idOrError.isFailure) {
return Result.fail(idOrError.error);
}
2025-04-22 08:11:50 +00:00
2025-05-26 10:38:45 +00:00
// Validación y creación de descripción
2025-06-11 15:13:44 +00:00
const descriptionOrError = CustomerInvoiceItemDescription.create(source.description || "");
2025-05-26 10:38:45 +00:00
if (descriptionOrError.isFailure) {
return Result.fail(descriptionOrError.error);
}
2025-04-22 08:11:50 +00:00
2025-05-26 10:38:45 +00:00
// Validación y creación de cantidad
2025-06-11 15:13:44 +00:00
const quantityOrError = CustomerInvoiceItemQuantity.create({
2025-04-22 08:11:50 +00:00
amount: source.quantity_amount,
scale: source.quantity_scale,
});
2025-05-26 10:38:45 +00:00
if (quantityOrError.isFailure) {
return Result.fail(quantityOrError.error);
}
2025-04-22 08:11:50 +00:00
2025-05-26 10:38:45 +00:00
// Validación y creación de precio unitario
2025-06-11 15:13:44 +00:00
const unitPriceOrError = CustomerInvoiceItemUnitPrice.create({
2025-04-22 08:11:50 +00:00
amount: source.unit_price_amount,
scale: source.unit_price_scale,
2025-06-11 15:13:44 +00:00
currency_code: sourceParent.customerCustomerInvoice_currency,
2025-04-22 08:11:50 +00:00
});
2025-05-26 10:38:45 +00:00
if (unitPriceOrError.isFailure) {
return Result.fail(unitPriceOrError.error);
}
2025-04-22 08:11:50 +00:00
2025-05-26 10:38:45 +00:00
// Validación y creación de descuento
2025-06-11 15:13:44 +00:00
const discountOrError = CustomerInvoiceItemDiscount.create({
2025-05-26 10:38:45 +00:00
amount: source.discount_amount || 0,
scale: source.discount_scale || 0,
2025-04-22 08:11:50 +00:00
});
2025-05-26 10:38:45 +00:00
if (discountOrError.isFailure) {
return Result.fail(discountOrError.error);
}
2025-03-18 08:05:00 +00:00
2025-05-26 10:38:45 +00:00
// Combinación de resultados
2025-04-22 08:11:50 +00:00
const result = Result.combine([
idOrError,
descriptionOrError,
quantityOrError,
unitPriceOrError,
discountOrError,
]);
2025-03-18 08:05:00 +00:00
2025-04-22 08:11:50 +00:00
if (result.isFailure) {
return Result.fail(result.error);
2025-03-18 08:05:00 +00:00
}
2025-05-26 10:38:45 +00:00
// Creación del objeto de dominio
2025-06-11 15:13:44 +00:00
return CustomerInvoiceItem.create(
2025-04-22 08:11:50 +00:00
{
description: descriptionOrError.data,
quantity: quantityOrError.data,
unitPrice: unitPriceOrError.data,
discount: discountOrError.data,
},
idOrError.data
);
2025-03-18 08:05:00 +00:00
}
2025-04-22 08:11:50 +00:00
public mapToPersistence(
2025-06-11 15:13:44 +00:00
source: CustomerInvoiceItem,
2025-04-22 08:11:50 +00:00
params?: MapperParamsType
2025-06-11 15:13:44 +00:00
): InferCreationAttributes<CustomerInvoiceItemModel, {}> {
2025-04-22 08:11:50 +00:00
const { index, sourceParent } = params as {
index: number;
2025-06-11 15:13:44 +00:00
sourceParent: CustomerInvoice;
2025-04-22 08:11:50 +00:00
};
2025-03-18 08:05:00 +00:00
const lineData = {
parent_id: undefined,
2025-06-11 15:13:44 +00:00
customerCustomerInvoice_id: sourceParent.id.toPrimitive(),
2025-03-18 08:05:00 +00:00
item_type: "simple",
position: index,
item_id: source.id.toPrimitive(),
description: source.description.toPrimitive(),
2025-04-22 08:11:50 +00:00
quantity_amount: source.quantity.toPrimitive().amount,
quantity_scale: source.quantity.toPrimitive().scale,
unit_price_amount: source.unitPrice.toPrimitive().amount,
unit_price_scale: source.unitPrice.toPrimitive().scale,
subtotal_amount: source.subtotalPrice.toPrimitive().amount,
subtotal_scale: source.subtotalPrice.toPrimitive().scale,
discount_amount: source.discount.toPrimitive().amount,
discount_scale: source.discount.toPrimitive().scale,
total_amount: source.totalPrice.toPrimitive().amount,
total_scale: source.totalPrice.toPrimitive().scale,
2025-03-18 08:05:00 +00:00
};
return lineData;
}
}