52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import { MoneyValue, Percentage, Quantity } from "@shared/contexts";
|
|
import { IMoney, IPercentage, IQuantity } from "./types";
|
|
|
|
export const calculateItemTotals = (item: {
|
|
quantity?: IQuantity;
|
|
unit_price?: IMoney;
|
|
discount?: IPercentage;
|
|
}): {
|
|
quantity: Quantity;
|
|
unitPrice: MoneyValue;
|
|
subtotalPrice: MoneyValue;
|
|
discount: Percentage;
|
|
totalPrice: MoneyValue;
|
|
} | null => {
|
|
console.log(item);
|
|
|
|
const { quantity: quantity_dto, unit_price: unit_price_dto, discount: discount_dto } = item;
|
|
|
|
if (quantity_dto === "" || unit_price_dto === "") {
|
|
return null;
|
|
}
|
|
|
|
const quantityOrError = Quantity.create(quantity_dto);
|
|
if (quantityOrError.isFailure) {
|
|
throw quantityOrError.error;
|
|
}
|
|
const quantity = quantityOrError.object;
|
|
|
|
const unitPriceOrError = MoneyValue.create(unit_price_dto);
|
|
if (unitPriceOrError.isFailure) {
|
|
throw unitPriceOrError.error;
|
|
}
|
|
const unitPrice = unitPriceOrError.object;
|
|
|
|
const discountOrError = Percentage.create(discount_dto);
|
|
if (discountOrError.isFailure) {
|
|
throw discountOrError.error;
|
|
}
|
|
const discount = discountOrError.object;
|
|
|
|
const subtotalPrice = unitPrice.multiply(quantity.toNumber());
|
|
const totalPrice = subtotalPrice.subtract(subtotalPrice.percentage(discount.toNumber()));
|
|
|
|
return {
|
|
quantity,
|
|
unitPrice,
|
|
subtotalPrice,
|
|
discount,
|
|
totalPrice,
|
|
};
|
|
};
|