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

89 lines
3.0 KiB
TypeScript
Raw Normal View History

2024-07-02 20:15:59 +00:00
import { Currency, Language, Note, UTCDateValue, UniqueID } from "@shared/contexts";
2024-05-26 17:09:43 +00:00
import { ISequelizeMapper, SequelizeMapper } from "@/contexts/common/infrastructure";
2024-07-02 20:15:59 +00:00
import { IQuoteProps, Quote, QuoteCustomer, QuoteReference } from "../../domain";
2024-07-01 17:12:15 +00:00
import { QuoteStatus } from "../../domain/entities/Quotes/QuoteStatus";
2024-05-26 17:09:43 +00:00
import { ISalesContext } from "../Sales.context";
import { QuoteCreationAttributes, Quote_Model } from "../sequelize";
import { IQuoteItemMapper, createQuoteItemMapper } from "./quoteItem.mapper";
export interface IQuoteMapper
extends ISequelizeMapper<Quote_Model, QuoteCreationAttributes, Quote> {}
export const createQuoteMapper = (context: ISalesContext): IQuoteMapper =>
new QuoteMapper({
context,
quoteItemMapper: createQuoteItemMapper(context),
});
class QuoteMapper
extends SequelizeMapper<Quote_Model, QuoteCreationAttributes, Quote>
implements IQuoteMapper
{
public constructor(props: { quoteItemMapper: IQuoteItemMapper; context: ISalesContext }) {
super(props);
}
protected toDomainMappingImpl(source: Quote_Model): Quote {
const id = this.mapsValue(source, "id", UniqueID.create);
const items = (this.props.quoteItemMapper as IQuoteItemMapper).mapArrayToDomain(source.items, {
sourceParent: source,
});
const props: IQuoteProps = {
status: this.mapsValue(source, "status", QuoteStatus.create),
date: this.mapsValue(source, "issue_date", UTCDateValue.create),
2024-07-02 20:15:59 +00:00
reference: this.mapsValue(source, "reference", QuoteReference.create),
2024-05-26 17:09:43 +00:00
currency: this.mapsValue(source, "quote_currency", Currency.createFromCode),
language: this.mapsValue(source, "quote_language", Language.createFromCode),
2024-07-02 20:15:59 +00:00
customer: this.mapsValue(source, "customer", QuoteCustomer.create),
validity: this.mapsValue(source, "validity", Note.create),
paymentMethod: this.mapsValue(source, "paymentMethod", Note.create),
notes: this.mapsValue(source, "notes", Note.create),
2024-05-26 17:09:43 +00:00
items,
2024-07-02 20:15:59 +00:00
dealerId: this.mapsValue(source, "dealer_id", UniqueID.create),
2024-05-26 17:09:43 +00:00
};
const quoteOrError = Quote.create(props, id);
if (quoteOrError.isFailure) {
throw quoteOrError.error;
}
return quoteOrError.object;
}
protected toPersistenceMappingImpl(source: Quote) {
const items = (this.props.quoteItemMapper as IQuoteItemMapper).mapCollectionToPersistence(
source.items,
{ sourceParent: source }
);
const quote: QuoteCreationAttributes = {
id: source.id.toPrimitive(),
status: source.status.toPrimitive(),
date: source.date.toPrimitive(),
2024-07-02 20:15:59 +00:00
reference: source.reference.toPrimitive(),
2024-05-26 17:09:43 +00:00
currency_code: source.currency.toPrimitive(),
2024-07-01 17:12:15 +00:00
lang_code: source.language.toPrimitive(),
2024-07-02 20:15:59 +00:00
customer_information: source.customer.toPrimitive(),
validity: source.validity.toPrimitive(),
payment_method: source.paymentMethod.toPrimitive(),
notes: source.notes.toPrimitive(),
discount: 0,
2024-05-26 17:09:43 +00:00
subtotal: 0,
total: 0,
2024-07-02 20:15:59 +00:00
2024-05-26 17:09:43 +00:00
items,
2024-07-02 20:15:59 +00:00
dealer_id: source.dealerId.toPrimitive(),
2024-05-26 17:09:43 +00:00
};
return quote;
}
}