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;
|
|
|
|
|
}
|
|
|
|
|
}
|