chore(pricing): big number support (#8113)

This commit is contained in:
Carlos R. L. Rodrigues
2024-07-12 16:27:28 -03:00
committed by GitHub
parent 4321241553
commit 3d7d629e75
5 changed files with 309 additions and 6 deletions

View File

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

View File

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

View File

@@ -57,6 +57,7 @@ moduleIntegrationTestRunner<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
])
})
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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<IPricingModuleService>({
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",
}),
])

View File

@@ -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",

View File

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