From b45fd00358f9bc1c32824c86311585d457f88999 Mon Sep 17 00:00:00 2001 From: David Arranz Date: Mon, 15 Jul 2024 18:53:33 +0200 Subject: [PATCH] . --- .../application/Quote/UpdateQuote.useCase.ts | 5 ++++- .../sales/domain/entities/Quotes/Quote.ts | 14 +++++++++----- .../presenter/UpdateQuote.presenter.ts | 2 +- .../sales/infrastructure/mappers/quote.mapper.ts | 8 ++++---- .../infrastructure/mappers/quoteItem.mapper.ts | 16 ++++++++-------- .../infrastructure/sequelize/quote.model.ts | 2 +- .../contexts/users/application/userServices.ts | 16 ++++++++++++++-- .../common/domain/entities/MoneyValue.ts | 2 +- .../contexts/common/domain/entities/Quantity.ts | 8 ++++++-- .../UpdateQuote.dto/IUpdateQuote_Response.dto.ts | 6 +++--- 10 files changed, 51 insertions(+), 28 deletions(-) diff --git a/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts b/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts index b18266d..271eeb1 100644 --- a/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts +++ b/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts @@ -189,7 +189,10 @@ export class UpdateQuoteUseCase QuoteItem.create({ articleId: item.article_id, description: Description.create(item.description).object, - quantity: Quantity.create(item.quantity).object, + quantity: Quantity.create({ + amount: item.quantity.amount, + scale: item.quantity.scale, + }).object, unitPrice: UnitPrice.create({ amount: item.unit_price?.amount, currencyCode: item.unit_price?.currency_code, diff --git a/server/src/contexts/sales/domain/entities/Quotes/Quote.ts b/server/src/contexts/sales/domain/entities/Quotes/Quote.ts index 1fdfbab..bad023b 100644 --- a/server/src/contexts/sales/domain/entities/Quotes/Quote.ts +++ b/server/src/contexts/sales/domain/entities/Quotes/Quote.ts @@ -71,13 +71,17 @@ export class Quote extends AggregateRoot implements IQuote { protected _items: ICollection; - protected _calculateTotalPriceItems = (): MoneyValue => - this.props.items + protected _calculateTotalPriceItems = (): MoneyValue => { + const result = this.props.items .toArray() .reduce( - (accumulator, currentItem) => accumulator.add(currentItem.subtotalPrice), - MoneyValue.create({ amount: 0, scale: 2, currencyCode: this.currency.code }).object - ); + (accumulator, currentItem) => accumulator.add(currentItem.totalPrice), + MoneyValue.create({ amount: 0, scale: 4, currencyCode: this.currency.code }).object + ) + .convertScale(2); + + return result; + }; protected constructor(props: IQuoteProps, id?: UniqueID) { super(props, id); diff --git a/server/src/contexts/sales/infrastructure/express/controllers/quotes/updateQuote/presenter/UpdateQuote.presenter.ts b/server/src/contexts/sales/infrastructure/express/controllers/quotes/updateQuote/presenter/UpdateQuote.presenter.ts index fc1d41d..a3e03a6 100644 --- a/server/src/contexts/sales/infrastructure/express/controllers/quotes/updateQuote/presenter/UpdateQuote.presenter.ts +++ b/server/src/contexts/sales/infrastructure/express/controllers/quotes/updateQuote/presenter/UpdateQuote.presenter.ts @@ -36,7 +36,7 @@ export const UpdateQuotePresenter: IUpdateQuotePresenter = { const quoteItemPresenter = (items: ICollection, context: ISalesContext) => items.totalCount > 0 ? items.items.map((item: QuoteItem) => ({ - article_id: item.articleId, + article_id: item.articleId ?? "", description: item.description.toString(), quantity: item.quantity.toObject(), unit_price: item.unitPrice.toObject(), diff --git a/server/src/contexts/sales/infrastructure/mappers/quote.mapper.ts b/server/src/contexts/sales/infrastructure/mappers/quote.mapper.ts index 6ac0be7..67910d0 100644 --- a/server/src/contexts/sales/infrastructure/mappers/quote.mapper.ts +++ b/server/src/contexts/sales/infrastructure/mappers/quote.mapper.ts @@ -64,7 +64,7 @@ class QuoteMapper discount: this.mapsValue(source, "discount", (discount) => Percentage.create({ amount: discount, - scale: Percentage.DEFAULT_SCALE, + scale: 2, }) ), @@ -106,9 +106,9 @@ class QuoteMapper payment_method: source.paymentMethod.toPrimitive(), notes: source.notes.toPrimitive(), - subtotal_price: source.subtotalPrice.toPrimitive(), - discount: source.discount.toPrimitive(), - total_price: source.totalPrice.toPrimitive(), + subtotal_price: source.subtotalPrice.convertScale(2).toPrimitive(), + discount: source.discount.convertScale(2).toPrimitive(), + total_price: source.totalPrice.convertScale(2).toPrimitive(), items, dealer_id: source.dealerId.toPrimitive(), diff --git a/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts b/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts index 51e1a2e..e5977ea 100644 --- a/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts +++ b/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts @@ -28,7 +28,7 @@ class QuoteItemMapper quantity: this.mapsValue(source, "quantity", (quantity) => Quantity.create({ amount: quantity, - scale: Quantity.DEFAULT_SCALE, + scale: 2, }) ), unitPrice: this.mapsValue(source, "unit_price", (unit_price) => @@ -51,7 +51,7 @@ class QuoteItemMapper discount: this.mapsValue(source, "discount", (discount) => Percentage.create({ amount: discount, - scale: Percentage.DEFAULT_SCALE, + scale: 2, }) ), @@ -59,7 +59,7 @@ class QuoteItemMapper MoneyValue.create({ amount: total_price, currencyCode: sourceParent.currency_code, - scale: 2, + scale: 4, }) ),*/ }; @@ -85,11 +85,11 @@ class QuoteItemMapper position: index, id_article: source.articleId, description: source.description.toPrimitive(), - quantity: source.quantity.toPrimitive(), - unit_price: source.unitPrice.toPrimitive(), - subtotal_price: source.subtotalPrice.toPrimitive(), - discount: source.discount.toPrimitive(), - total_price: source.totalPrice.toPrimitive(), + 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(), }; } } diff --git a/server/src/contexts/sales/infrastructure/sequelize/quote.model.ts b/server/src/contexts/sales/infrastructure/sequelize/quote.model.ts index 2cc9358..6bcae77 100644 --- a/server/src/contexts/sales/infrastructure/sequelize/quote.model.ts +++ b/server/src/contexts/sales/infrastructure/sequelize/quote.model.ts @@ -51,7 +51,7 @@ export class Quote_Model extends Model< declare validity: CreationOptional; declare subtotal_price: CreationOptional; - declare discount: CreationOptional; + declare discount: CreationOptional; declare total_price: CreationOptional; declare items: NonAttribute; diff --git a/server/src/contexts/users/application/userServices.ts b/server/src/contexts/users/application/userServices.ts index 8920e3c..7f7fb3f 100644 --- a/server/src/contexts/users/application/userServices.ts +++ b/server/src/contexts/users/application/userServices.ts @@ -1,7 +1,7 @@ import { config } from "@/config"; import { IAdapter, Password, RepositoryBuilder } from "@/contexts/common/domain"; -import { Dealer, IDealerRepository } from "@/contexts/sales/domain"; -import { Email, Language, Name, UniqueID } from "@shared/contexts"; +import { Dealer, DealerStatus, IDealerRepository } from "@/contexts/sales/domain"; +import { CurrencyData, Email, KeyValueMap, Language, Name, UniqueID } from "@shared/contexts"; import { IUserRepository, User, UserRole } from "../domain"; export const existsUserByID = async ( @@ -113,10 +113,22 @@ export const initializeSampleDealer = async ( const dealerExists = await repository({ transaction: t }).getByUserId(user.id); if (!dealerExists) { + const additionalInfoOrError = KeyValueMap.create([ + ["contact_information", ""], + ["default_payment_method", ""], + ["default_notes", ""], + ["default_legal_terms", ""], + ["default_quote_validity", ""], + ]); + const dealer = Dealer.create( { name: Name.create(config.sample_dealer.name).object, user_id: user.id, + language: Language.createDefaultCode().object, + status: DealerStatus.createActive(), + currency: CurrencyData.createDefaultCode().object, + additionalInfo: additionalInfoOrError.object, }, UniqueID.generateNewID().object ).object; diff --git a/shared/lib/contexts/common/domain/entities/MoneyValue.ts b/shared/lib/contexts/common/domain/entities/MoneyValue.ts index 6b2a4e6..4da095b 100644 --- a/shared/lib/contexts/common/domain/entities/MoneyValue.ts +++ b/shared/lib/contexts/common/domain/entities/MoneyValue.ts @@ -229,7 +229,7 @@ export class MoneyValue extends ValueObject implements IMoneyValue { return this.props.getPrecision(); } - public convertScale(newScale: number, roundingMode?: RoundingMode): MoneyValue { + public convertScale(newScale: number, roundingMode: RoundingMode = "HALF_UP"): MoneyValue { return MoneyValue.createFromDinero(this.props.convertPrecision(newScale, roundingMode)).object; } diff --git a/shared/lib/contexts/common/domain/entities/Quantity.ts b/shared/lib/contexts/common/domain/entities/Quantity.ts index 728917b..5183cf9 100644 --- a/shared/lib/contexts/common/domain/entities/Quantity.ts +++ b/shared/lib/contexts/common/domain/entities/Quantity.ts @@ -180,8 +180,12 @@ export class Quantity extends NullableValueObject { return this.isNull() ? "" : String(this.toNumber()); } - public toPrimitive(): number { - return this.toNumber(); + public toPrimitive(): NullOr { + if (this.scale !== Quantity.DEFAULT_SCALE) { + return this.convertScale(Quantity.DEFAULT_SCALE).toPrimitive(); + } else { + return this.amount; + } } public toPrimitives() { diff --git a/shared/lib/contexts/sales/application/dto/Quote/UpdateQuote.dto/IUpdateQuote_Response.dto.ts b/shared/lib/contexts/sales/application/dto/Quote/UpdateQuote.dto/IUpdateQuote_Response.dto.ts index 6a5431a..c12e0e7 100644 --- a/shared/lib/contexts/sales/application/dto/Quote/UpdateQuote.dto/IUpdateQuote_Response.dto.ts +++ b/shared/lib/contexts/sales/application/dto/Quote/UpdateQuote.dto/IUpdateQuote_Response.dto.ts @@ -16,9 +16,9 @@ export interface IUpdateQuote_Response_DTO { notes: string; validity: string; - subtotal: IMoney_Response_DTO; + subtotal_price: IMoney_Response_DTO; discount: IPercentage_Response_DTO; - total: IMoney_Response_DTO; + total_price: IMoney_Response_DTO; items: IUpdateQuote_QuoteItem_Response_DTO[]; @@ -30,7 +30,7 @@ export interface IUpdateQuote_QuoteItem_Response_DTO { quantity: IQuantity_Response_DTO; description: string; unit_price: IMoney_Response_DTO; - price: IMoney_Response_DTO; + subtotal_price: IMoney_Response_DTO; discount: IPercentage_Response_DTO; total_price: IMoney_Response_DTO; }