diff --git a/.changeset/spotty-dots-watch.md b/.changeset/spotty-dots-watch.md new file mode 100644 index 0000000000..829c207497 --- /dev/null +++ b/.changeset/spotty-dots-watch.md @@ -0,0 +1,7 @@ +--- +"medusa-payment-klarna": patch +"medusa-payment-paypal": patch +"@medusajs/medusa": patch +--- + +fix(medusa): Payment collection should provider the region_id, total and id in the partial cart data diff --git a/packages/medusa-payment-klarna/src/services/__tests__/klarna-provider.js b/packages/medusa-payment-klarna/src/services/__tests__/klarna-provider.js index f03ae306ea..fea1e688d7 100644 --- a/packages/medusa-payment-klarna/src/services/__tests__/klarna-provider.js +++ b/packages/medusa-payment-klarna/src/services/__tests__/klarna-provider.js @@ -41,6 +41,26 @@ describe("KlarnaProviderService", () => { order_amount: 100, }) }) + + it("creates Klarna order using new API", async () => { + const result = await klarnaProviderService.createPayment({ + email: "", + context: {}, + shipping_methods: [], + shipping_address: null, + id: "", + region_id: carts.frCart.region_id, + total: carts.frCart.total, + resource_id: "resource_id", + currency_code: carts.frCart.region.currency_code, + amount: carts.frCart.total + }) + + expect(result).toEqual({ + order_id: "123456789", + order_amount: 100, + }) + }) }) describe("retrievePayment", () => { @@ -152,6 +172,30 @@ describe("KlarnaProviderService", () => { order_id: "123456789", }) }) + + it("returns updated Klarna order using new API", async () => { + result = await klarnaProviderService.updatePayment( + { + order_id: "123456789", + }, + { + email: "", + context: {}, + shipping_methods: [], + shipping_address: null, + id: "", + region_id: carts.frCart.region_id, + total: carts.frCart.total, + resource_id: "resource_id", + currency_code: carts.frCart.region.currency_code, + amount: carts.frCart.total + } + ) + + expect(result).toEqual({ + order_id: "123456789", + }) + }) }) describe("cancelPayment", () => { diff --git a/packages/medusa-payment-klarna/src/services/klarna-provider.js b/packages/medusa-payment-klarna/src/services/klarna-provider.js index 0651111833..26c164d04c 100644 --- a/packages/medusa-payment-klarna/src/services/klarna-provider.js +++ b/packages/medusa-payment-klarna/src/services/klarna-provider.js @@ -5,7 +5,7 @@ import { PaymentService } from "medusa-interfaces" class KlarnaProviderService extends PaymentService { static identifier = "klarna" - constructor({ logger, shippingProfileService, totalsService }, options) { + constructor({ logger, shippingProfileService }, options) { super() /** @@ -42,15 +42,12 @@ class KlarnaProviderService extends PaymentService { /** @private @const {ShippingProfileService} */ this.shippingProfileService_ = shippingProfileService - - /** @private @const {TotalsService} */ - this.totalsService_ = totalsService } async lineItemsToOrderLines_(cart) { let order_lines = [] - for (const item of cart.items) { + for (const item of cart.items ?? []) { // Withdraw discount from the total item amount const quantity = item.quantity @@ -67,7 +64,7 @@ class KlarnaProviderService extends PaymentService { }) } - if (cart.shipping_methods.length) { + if (cart.shipping_methods?.length) { const name = [] let total = 0 let tax = 0 @@ -103,7 +100,7 @@ class KlarnaProviderService extends PaymentService { async cartToKlarnaOrder(cart) { let order = { // Cart id is stored, such that we can use it for hooks - merchant_data: cart.id, + merchant_data: cart.resource_id ?? cart.id, locale: "en-US", } @@ -147,8 +144,8 @@ class KlarnaProviderService extends PaymentService { } order.order_amount = total - order.order_tax_amount = tax_total - cart.gift_card_tax_total - order.purchase_currency = region.currency_code.toUpperCase() + order.order_tax_amount = tax_total - cart.gift_card_tax_total ?? 0 + order.purchase_currency = region?.currency_code?.toUpperCase() ?? "SE" order.merchant_urls = { terms: this.options_.merchant_urls.terms, diff --git a/packages/medusa-payment-paypal/package.json b/packages/medusa-payment-paypal/package.json index 911df82757..faa58e5523 100644 --- a/packages/medusa-payment-paypal/package.json +++ b/packages/medusa-payment-paypal/package.json @@ -30,9 +30,9 @@ }, "scripts": { "prepare": "cross-env NODE_ENV=production yarn run build", - "build": "babel src -d . --ignore **/__tests__", - "watch": "babel -w src --out-dir . --ignore **/__tests__", - "test": "jest --passWithNoTests" + "build": "babel src -d . --ignore **/(__tests__|__mocks__)", + "watch": "babel -w src --out-dir . --ignore **/(__tests__|__mocks__)", + "test": "jest --passWithNoTests src/**" }, "peerDependencies": { "medusa-interfaces": "1.3.3" diff --git a/packages/medusa-payment-paypal/src/services/__tests__/paypal-provider.js b/packages/medusa-payment-paypal/src/services/__tests__/paypal-provider.js index 9c0de9f29f..24d5d47fa4 100644 --- a/packages/medusa-payment-paypal/src/services/__tests__/paypal-provider.js +++ b/packages/medusa-payment-paypal/src/services/__tests__/paypal-provider.js @@ -1,8 +1,5 @@ import PayPalProviderService from "../paypal-provider" -import { - PayPalMock, - PayPalClientMock, -} from "../../__mocks__/@paypal/checkout-server-sdk" +import { PayPalClientMock, PayPalMock, } from "../../__mocks__/@paypal/checkout-server-sdk" const TotalsServiceMock = { getTotal: jest.fn().mockImplementation((c) => c.total), @@ -65,6 +62,40 @@ describe("PaypalProviderService", () => { expect(result.id).toEqual("test") }) + + it("creates paypal order using new API", async () => { + result = await paypalProviderService.createPayment({ + id: "", + region_id: "fr", + total: 1000, + resource_id: "resource_id" + }) + + expect(PayPalMock.orders.OrdersCreateRequest).toHaveBeenCalledTimes(1) + expect(PayPalClientMock.execute).toHaveBeenCalledTimes(1) + expect(PayPalClientMock.execute).toHaveBeenCalledWith( + expect.objectContaining({ + order: true, + body: { + intent: "AUTHORIZE", + application_context: { + shipping_preference: "NO_SHIPPING", + }, + purchase_units: [ + { + custom_id: "resource_id", + amount: { + currency_code: "EUR", + value: "10.00", + }, + }, + ], + }, + }) + ) + + expect(result.id).toEqual("test") + }) }) describe("retrievePayment", () => { @@ -140,6 +171,41 @@ describe("PaypalProviderService", () => { expect(result.id).toEqual("test") }) + + it("updates paypal order using new API", async () => { + result = await paypalProviderService.updatePayment( + { id: "test" }, + { + id: "", + region_id: "fr", + total: 1000, + resource_id: "resource_id" + } + ) + + expect(PayPalMock.orders.OrdersPatchRequest).toHaveBeenCalledTimes(1) + expect(PayPalMock.orders.OrdersPatchRequest).toHaveBeenCalledWith("test") + expect(PayPalClientMock.execute).toHaveBeenCalledTimes(1) + expect(PayPalClientMock.execute).toHaveBeenCalledWith( + expect.objectContaining({ + order: true, + body: [ + { + op: "replace", + path: "/purchase_units/@reference_id=='default'", + value: { + amount: { + currency_code: "EUR", + value: "10.00", + }, + }, + }, + ], + }) + ) + + expect(result.id).toEqual("test") + }) }) describe("capturePayment", () => { diff --git a/packages/medusa-payment-paypal/src/services/paypal-provider.js b/packages/medusa-payment-paypal/src/services/paypal-provider.js index be488f0ef7..68c41fd1a2 100644 --- a/packages/medusa-payment-paypal/src/services/paypal-provider.js +++ b/packages/medusa-payment-paypal/src/services/paypal-provider.js @@ -88,10 +88,10 @@ class PayPalProviderService extends PaymentService { * @returns {object} the data to be stored with the payment session. */ async createPayment(cart) { - const { region_id } = cart + const { region_id, id, resource_id, total } = cart const { currency_code } = await this.regionService_.retrieve(region_id) - const amount = cart.total + const amount = total const request = new PayPal.orders.OrdersCreateRequest() request.requestBody({ @@ -101,7 +101,7 @@ class PayPalProviderService extends PaymentService { }, purchase_units: [ { - custom_id: cart.id, + custom_id: resource_id ?? id, amount: { currency_code: currency_code.toUpperCase(), value: roundToTwo( @@ -216,7 +216,7 @@ class PayPalProviderService extends PaymentService { */ async updatePayment(sessionData, cart) { try { - const { region_id } = cart + const { region_id, total } = cart const { currency_code } = await this.regionService_.retrieve(region_id) const request = new PayPal.orders.OrdersPatchRequest(sessionData.id) @@ -228,7 +228,7 @@ class PayPalProviderService extends PaymentService { amount: { currency_code: currency_code.toUpperCase(), value: roundToTwo( - humanizeAmount(cart.total, currency_code), + humanizeAmount(total, currency_code), currency_code ), }, diff --git a/packages/medusa/src/services/payment-collection.ts b/packages/medusa/src/services/payment-collection.ts index 9b82f11420..d42d8b62d9 100644 --- a/packages/medusa/src/services/payment-collection.ts +++ b/packages/medusa/src/services/payment-collection.ts @@ -306,6 +306,8 @@ export default class PaymentCollectionService extends TransactionBaseService { shipping_methods: [], shipping_address: null, id: "", + region_id: payCol.region_id, + total: session.amount, }, resource_id: payCol.id, currency_code: payCol.currency_code, @@ -465,6 +467,8 @@ export default class PaymentCollectionService extends TransactionBaseService { shipping_methods: [], shipping_address: null, id: "", + region_id: payCol.region_id, + total: session.amount, }, resource_id: payCol.id, currency_code: payCol.currency_code, diff --git a/packages/medusa/src/services/payment-provider.ts b/packages/medusa/src/services/payment-provider.ts index 4f919d4e62..e3d68b15b4 100644 --- a/packages/medusa/src/services/payment-provider.ts +++ b/packages/medusa/src/services/payment-provider.ts @@ -665,6 +665,7 @@ export default class PaymentProviderService extends TransactionBaseService { context.cart = data.cart context.amount = data.amount context.currency_code = data.currency_code + context.resource_id = data.resource_id Object.assign(context, cart) }