This commit is contained in:
David Arranz 2024-07-15 18:53:33 +02:00
parent b9efe95289
commit b45fd00358
10 changed files with 51 additions and 28 deletions

View File

@ -189,7 +189,10 @@ export class UpdateQuoteUseCase
QuoteItem.create({ QuoteItem.create({
articleId: item.article_id, articleId: item.article_id,
description: Description.create(item.description).object, 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({ unitPrice: UnitPrice.create({
amount: item.unit_price?.amount, amount: item.unit_price?.amount,
currencyCode: item.unit_price?.currency_code, currencyCode: item.unit_price?.currency_code,

View File

@ -71,13 +71,17 @@ export class Quote extends AggregateRoot<IQuoteProps> implements IQuote {
protected _items: ICollection<QuoteItem>; protected _items: ICollection<QuoteItem>;
protected _calculateTotalPriceItems = (): MoneyValue => protected _calculateTotalPriceItems = (): MoneyValue => {
this.props.items const result = this.props.items
.toArray() .toArray()
.reduce<MoneyValue>( .reduce<MoneyValue>(
(accumulator, currentItem) => accumulator.add(currentItem.subtotalPrice), (accumulator, currentItem) => accumulator.add(currentItem.totalPrice),
MoneyValue.create({ amount: 0, scale: 2, currencyCode: this.currency.code }).object MoneyValue.create({ amount: 0, scale: 4, currencyCode: this.currency.code }).object
); )
.convertScale(2);
return result;
};
protected constructor(props: IQuoteProps, id?: UniqueID) { protected constructor(props: IQuoteProps, id?: UniqueID) {
super(props, id); super(props, id);

View File

@ -36,7 +36,7 @@ export const UpdateQuotePresenter: IUpdateQuotePresenter = {
const quoteItemPresenter = (items: ICollection<QuoteItem>, context: ISalesContext) => const quoteItemPresenter = (items: ICollection<QuoteItem>, context: ISalesContext) =>
items.totalCount > 0 items.totalCount > 0
? items.items.map((item: QuoteItem) => ({ ? items.items.map((item: QuoteItem) => ({
article_id: item.articleId, article_id: item.articleId ?? "",
description: item.description.toString(), description: item.description.toString(),
quantity: item.quantity.toObject(), quantity: item.quantity.toObject(),
unit_price: item.unitPrice.toObject(), unit_price: item.unitPrice.toObject(),

View File

@ -64,7 +64,7 @@ class QuoteMapper
discount: this.mapsValue(source, "discount", (discount) => discount: this.mapsValue(source, "discount", (discount) =>
Percentage.create({ Percentage.create({
amount: discount, amount: discount,
scale: Percentage.DEFAULT_SCALE, scale: 2,
}) })
), ),
@ -106,9 +106,9 @@ class QuoteMapper
payment_method: source.paymentMethod.toPrimitive(), payment_method: source.paymentMethod.toPrimitive(),
notes: source.notes.toPrimitive(), notes: source.notes.toPrimitive(),
subtotal_price: source.subtotalPrice.toPrimitive(), subtotal_price: source.subtotalPrice.convertScale(2).toPrimitive(),
discount: source.discount.toPrimitive(), discount: source.discount.convertScale(2).toPrimitive(),
total_price: source.totalPrice.toPrimitive(), total_price: source.totalPrice.convertScale(2).toPrimitive(),
items, items,
dealer_id: source.dealerId.toPrimitive(), dealer_id: source.dealerId.toPrimitive(),

View File

@ -28,7 +28,7 @@ class QuoteItemMapper
quantity: this.mapsValue(source, "quantity", (quantity) => quantity: this.mapsValue(source, "quantity", (quantity) =>
Quantity.create({ Quantity.create({
amount: quantity, amount: quantity,
scale: Quantity.DEFAULT_SCALE, scale: 2,
}) })
), ),
unitPrice: this.mapsValue(source, "unit_price", (unit_price) => unitPrice: this.mapsValue(source, "unit_price", (unit_price) =>
@ -51,7 +51,7 @@ class QuoteItemMapper
discount: this.mapsValue(source, "discount", (discount) => discount: this.mapsValue(source, "discount", (discount) =>
Percentage.create({ Percentage.create({
amount: discount, amount: discount,
scale: Percentage.DEFAULT_SCALE, scale: 2,
}) })
), ),
@ -59,7 +59,7 @@ class QuoteItemMapper
MoneyValue.create({ MoneyValue.create({
amount: total_price, amount: total_price,
currencyCode: sourceParent.currency_code, currencyCode: sourceParent.currency_code,
scale: 2, scale: 4,
}) })
),*/ ),*/
}; };
@ -85,11 +85,11 @@ class QuoteItemMapper
position: index, position: index,
id_article: source.articleId, id_article: source.articleId,
description: source.description.toPrimitive(), description: source.description.toPrimitive(),
quantity: source.quantity.toPrimitive(), quantity: source.quantity.convertScale(2).toPrimitive(),
unit_price: source.unitPrice.toPrimitive(), unit_price: source.unitPrice.convertScale(4).toPrimitive(),
subtotal_price: source.subtotalPrice.toPrimitive(), subtotal_price: source.subtotalPrice.convertScale(4).toPrimitive(),
discount: source.discount.toPrimitive(), discount: source.discount.convertScale(2).toPrimitive(),
total_price: source.totalPrice.toPrimitive(), total_price: source.totalPrice.convertScale(4).toPrimitive(),
}; };
} }
} }

View File

@ -51,7 +51,7 @@ export class Quote_Model extends Model<
declare validity: CreationOptional<string>; declare validity: CreationOptional<string>;
declare subtotal_price: CreationOptional<number>; declare subtotal_price: CreationOptional<number>;
declare discount: CreationOptional<number>; declare discount: CreationOptional<number | null>;
declare total_price: CreationOptional<number>; declare total_price: CreationOptional<number>;
declare items: NonAttribute<QuoteItem_Model[]>; declare items: NonAttribute<QuoteItem_Model[]>;

View File

@ -1,7 +1,7 @@
import { config } from "@/config"; import { config } from "@/config";
import { IAdapter, Password, RepositoryBuilder } from "@/contexts/common/domain"; import { IAdapter, Password, RepositoryBuilder } from "@/contexts/common/domain";
import { Dealer, IDealerRepository } from "@/contexts/sales/domain"; import { Dealer, DealerStatus, IDealerRepository } from "@/contexts/sales/domain";
import { Email, Language, Name, UniqueID } from "@shared/contexts"; import { CurrencyData, Email, KeyValueMap, Language, Name, UniqueID } from "@shared/contexts";
import { IUserRepository, User, UserRole } from "../domain"; import { IUserRepository, User, UserRole } from "../domain";
export const existsUserByID = async ( export const existsUserByID = async (
@ -113,10 +113,22 @@ export const initializeSampleDealer = async (
const dealerExists = await repository({ transaction: t }).getByUserId(user.id); const dealerExists = await repository({ transaction: t }).getByUserId(user.id);
if (!dealerExists) { if (!dealerExists) {
const additionalInfoOrError = KeyValueMap.create([
["contact_information", ""],
["default_payment_method", ""],
["default_notes", ""],
["default_legal_terms", ""],
["default_quote_validity", ""],
]);
const dealer = Dealer.create( const dealer = Dealer.create(
{ {
name: Name.create(config.sample_dealer.name).object, name: Name.create(config.sample_dealer.name).object,
user_id: user.id, user_id: user.id,
language: Language.createDefaultCode().object,
status: DealerStatus.createActive(),
currency: CurrencyData.createDefaultCode().object,
additionalInfo: additionalInfoOrError.object,
}, },
UniqueID.generateNewID().object UniqueID.generateNewID().object
).object; ).object;

View File

@ -229,7 +229,7 @@ export class MoneyValue extends ValueObject<Dinero> implements IMoneyValue {
return this.props.getPrecision(); 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; return MoneyValue.createFromDinero(this.props.convertPrecision(newScale, roundingMode)).object;
} }

View File

@ -180,8 +180,12 @@ export class Quantity extends NullableValueObject<IQuantity> {
return this.isNull() ? "" : String(this.toNumber()); return this.isNull() ? "" : String(this.toNumber());
} }
public toPrimitive(): number { public toPrimitive(): NullOr<number> {
return this.toNumber(); if (this.scale !== Quantity.DEFAULT_SCALE) {
return this.convertScale(Quantity.DEFAULT_SCALE).toPrimitive();
} else {
return this.amount;
}
} }
public toPrimitives() { public toPrimitives() {

View File

@ -16,9 +16,9 @@ export interface IUpdateQuote_Response_DTO {
notes: string; notes: string;
validity: string; validity: string;
subtotal: IMoney_Response_DTO; subtotal_price: IMoney_Response_DTO;
discount: IPercentage_Response_DTO; discount: IPercentage_Response_DTO;
total: IMoney_Response_DTO; total_price: IMoney_Response_DTO;
items: IUpdateQuote_QuoteItem_Response_DTO[]; items: IUpdateQuote_QuoteItem_Response_DTO[];
@ -30,7 +30,7 @@ export interface IUpdateQuote_QuoteItem_Response_DTO {
quantity: IQuantity_Response_DTO; quantity: IQuantity_Response_DTO;
description: string; description: string;
unit_price: IMoney_Response_DTO; unit_price: IMoney_Response_DTO;
price: IMoney_Response_DTO; subtotal_price: IMoney_Response_DTO;
discount: IPercentage_Response_DTO; discount: IPercentage_Response_DTO;
total_price: IMoney_Response_DTO; total_price: IMoney_Response_DTO;
} }