import { ISequelizeMapper, SequelizeMapper } from "@/contexts/common/infrastructure"; import { Description, Quantity, UniqueID, UnitPrice } from "@shared/contexts"; import { IQuoteItemProps, Quote, QuoteItem } from "../../domain"; import { ISalesContext } from "../Sales.context"; import { Quote_Model } from "../sequelize"; import { QuoteItemCreationAttributes, QuoteItem_Model } from "../sequelize/quoteItem.model"; export interface IQuoteItemMapper extends ISequelizeMapper {} export const createQuoteItemMapper = (context: ISalesContext): IQuoteItemMapper => new QuoteItemMapper({ context }); class QuoteItemMapper extends SequelizeMapper implements IQuoteItemMapper { protected toDomainMappingImpl( source: QuoteItem_Model, params: { sourceParent: Quote_Model } ): QuoteItem { const { sourceParent } = params; const id = this.mapsValue(source, "item_id", UniqueID.create); const props: IQuoteItemProps = { description: this.mapsValue(source, "description", Description.create), quantity: this.mapsValue(source, "quantity", Quantity.create), unitPrice: this.mapsValue(source, "unit_price", (unit_price) => UnitPrice.create({ amount: unit_price, currencyCode: sourceParent.currency_code, precision: 4, }) ), }; const quoteItemOrError = QuoteItem.create(props, id); if (quoteItemOrError.isFailure) { throw quoteItemOrError.error; } return quoteItemOrError.object; } protected toPersistenceMappingImpl( source: QuoteItem, params: { index: number; sourceParent: Quote } ): QuoteItemCreationAttributes { const { index, sourceParent } = params; return { quote_id: sourceParent.id.toPrimitive(), position: index, item_id: "", //article_id: source.id.toPrimitive(), description: source.description.toPrimitive(), quantity: source.quantity.toPrimitive(), unit_price: source.unitPrice.toPrimitive(), subtotal: 0, total: 0, //subtotal: source.calculateSubtotal().toPrimitive(), //total: source.calculateTotal().toPrimitive(), }; } }