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({
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,

View File

@ -71,13 +71,17 @@ export class Quote extends AggregateRoot<IQuoteProps> implements IQuote {
protected _items: ICollection<QuoteItem>;
protected _calculateTotalPriceItems = (): MoneyValue =>
this.props.items
protected _calculateTotalPriceItems = (): MoneyValue => {
const result = this.props.items
.toArray()
.reduce<MoneyValue>(
(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);

View File

@ -36,7 +36,7 @@ export const UpdateQuotePresenter: IUpdateQuotePresenter = {
const quoteItemPresenter = (items: ICollection<QuoteItem>, 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(),

View File

@ -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(),

View File

@ -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(),
};
}
}

View File

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

View File

@ -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;

View File

@ -229,7 +229,7 @@ export class MoneyValue extends ValueObject<Dinero> 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;
}

View File

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

View File

@ -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;
}