From 3d7d629e7593be90eb7f8cd5906ed565e58e85a1 Mon Sep 17 00:00:00 2001 From: "Carlos R. L. Rodrigues" <37986729+carlos-r-l-rodrigues@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:27:28 -0300 Subject: [PATCH] chore(pricing): big number support (#8113) --- .../__tests__/product/store/product.spec.ts | 16 + .../types/src/pricing/common/price-set.ts | 7 +- .../pricing-module/calculate-price.spec.ts | 278 ++++++++++++++++++ .../pricing/src/repositories/pricing.ts | 2 + .../pricing/src/services/pricing-module.ts | 12 +- 5 files changed, 309 insertions(+), 6 deletions(-) diff --git a/integration-tests/http/__tests__/product/store/product.spec.ts b/integration-tests/http/__tests__/product/store/product.spec.ts index 0b09b5357f..e667ee605a 100644 --- a/integration-tests/http/__tests__/product/store/product.spec.ts +++ b/integration-tests/http/__tests__/product/store/product.spec.ts @@ -921,9 +921,17 @@ medusaIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 3000, + raw_calculated_amount: { + value: "3000", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 3000, + raw_original_amount: { + value: "3000", + precision: 20, + }, currency_code: "usd", calculated_price: { id: expect.any(String), @@ -1227,9 +1235,17 @@ medusaIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 3000, + raw_calculated_amount: { + value: "3000", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 3000, + raw_original_amount: { + value: "3000", + precision: 20, + }, currency_code: "usd", calculated_price: { id: expect.any(String), diff --git a/packages/core/types/src/pricing/common/price-set.ts b/packages/core/types/src/pricing/common/price-set.ts index 69e8e6cead..486533e8ad 100644 --- a/packages/core/types/src/pricing/common/price-set.ts +++ b/packages/core/types/src/pricing/common/price-set.ts @@ -1,6 +1,6 @@ import { BaseFilterable } from "../../dal" import { Context } from "../../shared-context" -import { BigNumberInput, BigNumberValue } from "../../totals" +import { BigNumberInput, BigNumberRawValue, BigNumberValue } from "../../totals" import { CreateMoneyAmountDTO, FilterableMoneyAmountProps, @@ -83,7 +83,8 @@ export interface CalculatedPriceSetDTO { /** * The calculated amount. It can possibly be `null` if there's no price set up for the provided context. */ - amount: string | null + amount: BigNumberValue | null + raw_amount: BigNumberRawValue | null /** * The currency code of the calculated price. It can possibly be `null`. */ @@ -129,6 +130,7 @@ export interface CalculatedPriceSet { * The amount of the calculated price, or `null` if there isn't a calculated price. */ calculated_amount: BigNumberValue | null + raw_calculated_amount: BigNumberRawValue | null /** * Whether the original price is associated with a price list. During the calculation process, if the price list of the calculated price is of type override, @@ -143,6 +145,7 @@ export interface CalculatedPriceSet { * The amount of the original price, or `null` if there isn't a calculated price. */ original_amount: BigNumberValue | null + raw_original_amount: BigNumberRawValue | null /** * The currency code of the calculated price, or null if there isn't a calculated price. diff --git a/packages/modules/pricing/integration-tests/__tests__/services/pricing-module/calculate-price.spec.ts b/packages/modules/pricing/integration-tests/__tests__/services/pricing-module/calculate-price.spec.ts index 8c5e3116d1..915c0d9107 100644 --- a/packages/modules/pricing/integration-tests/__tests__/services/pricing-module/calculate-price.spec.ts +++ b/packages/modules/pricing/integration-tests/__tests__/services/pricing-module/calculate-price.spec.ts @@ -57,6 +57,7 @@ moduleIntegrationTestRunner({ const priceSetsData = [ { id: "price-set-EUR" }, { id: "price-set-PLN" }, + { id: "price-set-ETH" }, ] as unknown as CreatePriceSetDTO[] const pricesData = [ @@ -70,6 +71,18 @@ moduleIntegrationTestRunner({ max_quantity: 10, rules_count: 0, }, + { + id: "price-ETH", + title: "price ETH", + price_set_id: "price-set-ETH", + currency_code: "ETH", + amount: { + value: "12345678988754.00000010000000085", + }, + min_quantity: 1, + max_quantity: 10, + rules_count: 0, + }, { id: "price-company_id-EUR", title: "price EUR - company_id", @@ -321,9 +334,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 1000, + raw_calculated_amount: { + value: "1000", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 1000, + raw_original_amount: { + value: "1000", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-PLN", @@ -343,6 +364,50 @@ moduleIntegrationTestRunner({ ]) }) + it("should return filled prices when 1 context is present and price is setup for ETH", async () => { + const priceSetsResult = await service.calculatePrices( + { id: ["price-set-ETH"] }, + { + context: { currency_code: "ETH" }, + } + ) + + expect(priceSetsResult).toEqual([ + { + id: "price-set-ETH", + is_calculated_price_price_list: false, + is_calculated_price_tax_inclusive: false, + calculated_amount: 12345678988754.000000100000001, + raw_calculated_amount: { + value: "12345678988754.00000010000000085", + precision: 20, + }, + is_original_price_price_list: false, + is_original_price_tax_inclusive: false, + original_amount: 12345678988754.000000100000001, + raw_original_amount: { + value: "12345678988754.00000010000000085", + precision: 20, + }, + currency_code: "ETH", + calculated_price: { + id: "price-ETH", + price_list_id: null, + price_list_type: null, + min_quantity: 1, + max_quantity: 10, + }, + original_price: { + id: "price-ETH", + price_list_id: null, + price_list_type: null, + min_quantity: 1, + max_quantity: 10, + }, + }, + ]) + }) + it("should return filled prices when 1 context is present and price is setup for PLN region_id", async () => { const priceSetsResult = await service.calculatePrices( { id: ["price-set-EUR", "price-set-PLN"] }, @@ -357,9 +422,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-region_id-PLN", @@ -393,9 +466,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 1000, + raw_calculated_amount: { + value: "1000", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 1000, + raw_original_amount: { + value: "1000", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-PLN", @@ -440,9 +521,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-region_id-PLN", @@ -476,9 +565,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 1000, + raw_calculated_amount: { + value: "1000", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 1000, + raw_original_amount: { + value: "1000", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-PLN", @@ -512,9 +609,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 250, + raw_calculated_amount: { + value: "250", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 250, + raw_original_amount: { + value: "250", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-region_id-PLN-5-qty", @@ -553,9 +658,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-region_id-PLN", @@ -595,9 +708,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 100, + raw_calculated_amount: { + value: "100", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 100, + raw_original_amount: { + value: "100", + precision: 20, + }, currency_code: "EUR", calculated_price: { id: "price-region_id_company_id-PL-EUR-customer-group", @@ -637,9 +758,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-region_id-PLN", @@ -679,9 +808,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 1000, + raw_calculated_amount: { + value: "1000", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 1000, + raw_original_amount: { + value: "1000", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-PLN", @@ -730,9 +867,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-region_id-PLN", @@ -774,9 +919,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 232, + raw_calculated_amount: { + value: "232", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 400, + raw_original_amount: { + value: "400", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -825,9 +978,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 232, + raw_calculated_amount: { + value: "232", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 400, + raw_original_amount: { + value: "400", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -868,9 +1029,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 232, + raw_calculated_amount: { + value: "232", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 400, + raw_original_amount: { + value: "400", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -908,9 +1077,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 232, + raw_calculated_amount: { + value: "232", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 1000, + raw_original_amount: { + value: "1000", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -951,9 +1128,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 232, + raw_calculated_amount: { + value: "232", + precision: 20, + }, is_original_price_price_list: true, is_original_price_tax_inclusive: false, original_amount: 232, + raw_original_amount: { + value: "232", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -993,9 +1178,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-region_id-PLN", @@ -1035,9 +1228,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -1090,9 +1291,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 232, + raw_calculated_amount: { + value: "232", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 400, + raw_original_amount: { + value: "400", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -1146,9 +1355,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 400, + raw_calculated_amount: { + value: "400", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 400, + raw_original_amount: { + value: "400", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-company_id-PLN", @@ -1201,9 +1418,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: false, is_calculated_price_tax_inclusive: false, calculated_amount: 400, + raw_calculated_amount: { + value: "400", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 400, + raw_original_amount: { + value: "400", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: "price-company_id-PLN", @@ -1258,9 +1483,14 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 200, + raw_calculated_amount: { + value: "200", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: null, + raw_original_amount: null, currency_code: "EUR", calculated_price: { id: expect.any(String), @@ -1311,9 +1541,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 111, + raw_calculated_amount: { + value: "111", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 400, + raw_original_amount: { + value: "400", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -1364,9 +1602,17 @@ moduleIntegrationTestRunner({ is_calculated_price_price_list: true, is_calculated_price_tax_inclusive: false, calculated_amount: 232, + raw_calculated_amount: { + value: "232", + precision: 20, + }, is_original_price_price_list: false, is_original_price_tax_inclusive: false, original_amount: 400, + raw_original_amount: { + value: "400", + precision: 20, + }, currency_code: "PLN", calculated_price: { id: expect.any(String), @@ -1409,8 +1655,16 @@ moduleIntegrationTestRunner({ id: "price-set-PLN", is_calculated_price_tax_inclusive: true, calculated_amount: 1000, + raw_calculated_amount: { + value: "1000", + precision: 20, + }, is_original_price_tax_inclusive: true, original_amount: 1000, + raw_original_amount: { + value: "1000", + precision: 20, + }, currency_code: "PLN", }), ]) @@ -1442,8 +1696,16 @@ moduleIntegrationTestRunner({ id: "price-set-PLN", is_calculated_price_tax_inclusive: true, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_tax_inclusive: true, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", }), ]) @@ -1475,8 +1737,16 @@ moduleIntegrationTestRunner({ id: "price-set-PLN", is_calculated_price_tax_inclusive: true, calculated_amount: 300, + raw_calculated_amount: { + value: "300", + precision: 20, + }, is_original_price_tax_inclusive: true, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", }), ]) @@ -1512,8 +1782,16 @@ moduleIntegrationTestRunner({ id: "price-set-PLN", is_calculated_price_tax_inclusive: false, calculated_amount: 232, + raw_calculated_amount: { + value: "232", + precision: 20, + }, is_original_price_tax_inclusive: true, original_amount: 300, + raw_original_amount: { + value: "300", + precision: 20, + }, currency_code: "PLN", }), ]) diff --git a/packages/modules/pricing/src/repositories/pricing.ts b/packages/modules/pricing/src/repositories/pricing.ts index 95208123ab..55865d308a 100644 --- a/packages/modules/pricing/src/repositories/pricing.ts +++ b/packages/modules/pricing/src/repositories/pricing.ts @@ -63,6 +63,7 @@ export class PricingRepository .select({ id: "price.id", amount: "price.amount", + raw_amount: "price.raw_amount", min_quantity: "price.min_quantity", max_quantity: "price.max_quantity", currency_code: "price.currency_code", @@ -152,6 +153,7 @@ export class PricingRepository id: "price.id", price_set_id: "ps.id", amount: "price.amount", + raw_amount: "price.raw_amount", min_quantity: "price.min_quantity", max_quantity: "price.max_quantity", currency_code: "price.currency_code", diff --git a/packages/modules/pricing/src/services/pricing-module.ts b/packages/modules/pricing/src/services/pricing-module.ts index 0101d2497b..71fcd1d5a6 100644 --- a/packages/modules/pricing/src/services/pricing-module.ts +++ b/packages/modules/pricing/src/services/pricing-module.ts @@ -42,15 +42,15 @@ import { Price, PriceList, PriceListRule, + PricePreference, PriceRule, PriceSet, - PricePreference, } from "@models" import { ServiceTypes } from "@types" import { eventBuilders, validatePriceListDates } from "@utils" -import { joinerConfig } from "../joiner-config" import { CreatePriceListDTO, UpsertPriceDTO } from "src/types/services" +import { joinerConfig } from "../joiner-config" type InjectedDependencies = { baseRepository: DAL.RepositoryService @@ -338,7 +338,9 @@ export default class PricingModuleService calculatedPrice.currency_code!, pricingContext.context?.region_id as string ), - calculated_amount: parseInt(calculatedPrice?.amount || "") || null, + calculated_amount: + parseFloat((calculatedPrice?.amount as string) || "") || null, + raw_calculated_amount: calculatedPrice?.raw_amount || null, is_original_price_price_list: !!originalPrice?.price_list_id, is_original_price_tax_inclusive: originalPrice?.id @@ -349,7 +351,9 @@ export default class PricingModuleService pricingContext.context?.region_id as string ) : false, - original_amount: parseInt(originalPrice?.amount || "") || null, + original_amount: + parseFloat((originalPrice?.amount as string) || "") || null, + raw_original_amount: originalPrice?.raw_amount || null, currency_code: calculatedPrice?.currency_code || null,