From dd82a56ec52facdee6b1318e94ed68d34c306e40 Mon Sep 17 00:00:00 2001 From: "Carlos R. L. Rodrigues" <37986729+carlos-r-l-rodrigues@users.noreply.github.com> Date: Mon, 19 Aug 2024 14:19:49 -0300 Subject: [PATCH] fix(payment-stripe): fix smallest unit calculation (#8663) --- .../payment-stripe/src/core/stripe-base.ts | 5 +++-- .../src/utils/__tests__/get-smallest-unit.ts | 18 ++++++++++++++++++ .../src/utils/get-smallest-unit.ts | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 packages/modules/providers/payment-stripe/src/utils/__tests__/get-smallest-unit.ts diff --git a/packages/modules/providers/payment-stripe/src/core/stripe-base.ts b/packages/modules/providers/payment-stripe/src/core/stripe-base.ts index a8d0dc5576..e0ee2e3f76 100644 --- a/packages/modules/providers/payment-stripe/src/core/stripe-base.ts +++ b/packages/modules/providers/payment-stripe/src/core/stripe-base.ts @@ -18,6 +18,7 @@ import { PaymentSessionStatus, isDefined, isPaymentProviderError, + isPresent, } from "@medusajs/utils" import { ErrorCodes, @@ -281,7 +282,7 @@ abstract class StripeBase extends AbstractPaymentProvider { return result } else { - if (amount && data.amount === amountNumeric) { + if (isPresent(amount) && data.amount === amountNumeric) { return { data } } @@ -302,7 +303,7 @@ abstract class StripeBase extends AbstractPaymentProvider { try { // Prevent from updating the amount from here as it should go through // the updatePayment method to perform the correct logic - if (data.amount) { + if (isPresent(data.amount)) { throw new MedusaError( MedusaError.Types.INVALID_DATA, "Cannot update amount, use updatePayment instead" diff --git a/packages/modules/providers/payment-stripe/src/utils/__tests__/get-smallest-unit.ts b/packages/modules/providers/payment-stripe/src/utils/__tests__/get-smallest-unit.ts new file mode 100644 index 0000000000..824755e003 --- /dev/null +++ b/packages/modules/providers/payment-stripe/src/utils/__tests__/get-smallest-unit.ts @@ -0,0 +1,18 @@ +import { getSmallestUnit } from "../get-smallest-unit" + +describe("getSmallestUnit", () => { + it("should convert an amount to the format required by Stripe based on currency", () => { + // 0 decimals + expect(getSmallestUnit(50098, "JPY")).toBe(50098) + + // 3 decimals + expect(getSmallestUnit(5.124, "KWD")).toBe(5130) + + // 2 decimals + expect(getSmallestUnit(100.54, "USD")).toBe(10054) + expect(getSmallestUnit(5.126, "KWD")).toBe(5130) + expect(getSmallestUnit(0.54, "USD")).toBe(54) + expect(getSmallestUnit(0.054, "USD")).toBe(5) + expect(getSmallestUnit(0.005104, "USD")).toBe(0) + }) +}) diff --git a/packages/modules/providers/payment-stripe/src/utils/get-smallest-unit.ts b/packages/modules/providers/payment-stripe/src/utils/get-smallest-unit.ts index de4e36788a..89de8068b4 100644 --- a/packages/modules/providers/payment-stripe/src/utils/get-smallest-unit.ts +++ b/packages/modules/providers/payment-stripe/src/utils/get-smallest-unit.ts @@ -56,7 +56,7 @@ export function getSmallestUnit( numeric = Math.ceil(numeric / 10) * 10 } - return numeric + return parseInt(numeric.toString().split(".").shift()!, 10) } /**