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

110 lines
3.1 KiB
TypeScript
Raw Normal View History

2025-05-02 21:43:51 +00:00
import { Invoice, InvoiceItem, InvoiceItemDescription } from "@/contexts/invoices/domain";
2025-04-22 08:11:50 +00:00
import {
2025-05-04 20:06:57 +00:00
type ISequelizeMapper,
type MapperParamsType,
2025-05-02 21:43:51 +00:00
MoneyValue,
Percentage,
Quantity,
Result,
2025-04-22 08:11:50 +00:00
SequelizeMapper,
2025-05-02 21:43:51 +00:00
UniqueID,
} from "@/core";
import { InvoiceModel } from "../sequelize";
2025-04-22 08:11:50 +00:00
import { InferCreationAttributes } from "sequelize";
2025-05-02 21:43:51 +00:00
import { InvoiceItemCreationAttributes, InvoiceItemModel } from "../sequelize";
2025-03-18 08:05:00 +00:00
export interface IInvoiceItemMapper
2025-04-22 08:11:50 +00:00
extends ISequelizeMapper<InvoiceItemModel, InvoiceItemCreationAttributes, InvoiceItem> {}
2025-03-18 08:05:00 +00:00
2025-04-22 08:11:50 +00:00
export class InvoiceItemMapper
extends SequelizeMapper<InvoiceItemModel, InvoiceItemCreationAttributes, InvoiceItem>
2025-03-18 08:05:00 +00:00
implements IInvoiceItemMapper
{
2025-04-22 08:11:50 +00:00
public mapToDomain(
source: InvoiceItemModel,
params?: MapperParamsType
): Result<InvoiceItem, Error> {
const { sourceParent } = params as { sourceParent: InvoiceModel };
const idOrError = UniqueID.create(source.item_id);
const descriptionOrError = InvoiceItemDescription.create(source.description);
const quantityOrError = Quantity.create({
amount: source.quantity_amount,
scale: source.quantity_scale,
});
const unitPriceOrError = MoneyValue.create({
amount: source.unit_price_amount,
scale: source.unit_price_scale,
currency_code: sourceParent.invoice_currency,
});
const discountOrError = Percentage.create({
amount: source.discount_amount,
scale: source.discount_scale,
});
2025-03-18 08:05:00 +00:00
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-04-22 08:11:50 +00:00
return InvoiceItem.create(
{
description: descriptionOrError.data,
quantity: quantityOrError.data,
unitPrice: unitPriceOrError.data,
discount: discountOrError.data,
},
idOrError.data
//sourceParent
);
2025-03-18 08:05:00 +00:00
}
2025-04-22 08:11:50 +00:00
public mapToPersistence(
2025-03-18 08:05:00 +00:00
source: InvoiceItem,
2025-04-22 08:11:50 +00:00
params?: MapperParamsType
): InferCreationAttributes<InvoiceItemModel, {}> {
const { index, sourceParent } = params as {
index: number;
sourceParent: Invoice;
};
2025-03-18 08:05:00 +00:00
const lineData = {
parent_id: undefined,
invoice_id: sourceParent.id.toPrimitive(),
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;
}
}