Presupuestador_web/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts

99 lines
3.2 KiB
TypeScript
Raw Normal View History

2024-07-17 18:10:07 +00:00
import { ArticleIdentifier } from "@/contexts/catalog/domain";
2024-05-26 17:09:43 +00:00
import { ISequelizeMapper, SequelizeMapper } from "@/contexts/common/infrastructure";
2024-07-09 16:21:12 +00:00
import { Description, MoneyValue, Percentage, Quantity, UniqueID } from "@shared/contexts";
2024-05-26 17:09:43 +00:00
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<QuoteItem_Model, QuoteItemCreationAttributes, QuoteItem> {}
export const createQuoteItemMapper = (context: ISalesContext): IQuoteItemMapper =>
new QuoteItemMapper({ context });
class QuoteItemMapper
extends SequelizeMapper<QuoteItem_Model, QuoteItemCreationAttributes, QuoteItem>
implements IQuoteItemMapper
{
protected toDomainMappingImpl(
source: QuoteItem_Model,
params: { sourceParent: Quote_Model }
): QuoteItem {
const { sourceParent } = params;
const id = this.mapsValue(source, "item_id", UniqueID.create);
2024-07-17 18:10:07 +00:00
const articleId = this.mapsValue(source, "id_article", ArticleIdentifier.create);
2024-05-26 17:09:43 +00:00
const props: IQuoteItemProps = {
2024-07-17 18:10:07 +00:00
articleId,
2024-05-26 17:09:43 +00:00
description: this.mapsValue(source, "description", Description.create),
2024-07-09 18:29:02 +00:00
quantity: this.mapsValue(source, "quantity", (quantity) =>
Quantity.create({
amount: quantity,
2024-07-15 16:53:33 +00:00
scale: 2,
2024-07-09 18:29:02 +00:00
})
),
2024-05-26 17:09:43 +00:00
unitPrice: this.mapsValue(source, "unit_price", (unit_price) =>
2024-07-09 16:21:12 +00:00
MoneyValue.create({
2024-05-26 17:09:43 +00:00
amount: unit_price,
currencyCode: sourceParent.currency_code,
2024-07-15 15:41:42 +00:00
scale: 4,
2024-05-26 17:09:43 +00:00
})
),
2024-07-09 16:21:12 +00:00
/*subtotalPrice: this.mapsValue(source, "subtotal_price", (subtotal_price) =>
MoneyValue.create({
amount: subtotal_price,
currencyCode: sourceParent.currency_code,
2024-07-15 15:41:42 +00:00
scale: 4,
2024-07-09 16:21:12 +00:00
})
),
*/
discount: this.mapsValue(source, "discount", (discount) =>
Percentage.create({
amount: discount,
2024-07-15 16:53:33 +00:00
scale: 2,
2024-07-09 16:21:12 +00:00
})
),
/*totalPrice: this.mapsValue(source, "total_price", (total_price) =>
MoneyValue.create({
amount: total_price,
currencyCode: sourceParent.currency_code,
2024-07-15 16:53:33 +00:00
scale: 4,
2024-07-09 16:21:12 +00:00
})
),*/
2024-05-26 17:09:43 +00:00
};
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 {
2024-07-09 16:21:12 +00:00
item_id: source.id.toString(),
2024-05-26 17:09:43 +00:00
quote_id: sourceParent.id.toPrimitive(),
position: index,
2024-07-17 18:10:07 +00:00
id_article: source.articleId.toPrimitive(),
2024-05-26 17:09:43 +00:00
description: source.description.toPrimitive(),
2024-07-15 16:53:33 +00:00
quantity: source.quantity.convertScale(2).toPrimitive(),
unit_price: source.unitPrice.convertScale(4).toPrimitive(),
subtotal_price: source.subtotalPrice.convertScale(4).toPrimitive(),
discount: source.discount.convertScale(2).toPrimitive(),
total_price: source.totalPrice.convertScale(4).toPrimitive(),
2024-05-26 17:09:43 +00:00
};
}
}