Skip to content

Commit

Permalink
fix(medusa-payment-klarna, medusa-payment-stripe, medusa-payment-payp…
Browse files Browse the repository at this point in the history
…al): Totals calculation (#2381)
  • Loading branch information
srindom committed Oct 8, 2022
1 parent 5f2bc97 commit a908a77
Show file tree
Hide file tree
Showing 8 changed files with 156 additions and 197 deletions.
7 changes: 7 additions & 0 deletions .changeset/dull-sheep-raise.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"medusa-payment-klarna": patch
"medusa-payment-paypal": patch
"medusa-payment-stripe": patch
---

Rely on cart totals in payment providers
3 changes: 3 additions & 0 deletions packages/medusa-payment-klarna/src/__mocks__/cart.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export const carts = {
title: "merge line",
description: "This is a new line",
thumbnail: "test-img-yeah.com/thumb",
tax_lines: [],
content: [
{
unit_price: 8,
Expand Down Expand Up @@ -45,6 +46,7 @@ export const carts = {
title: "merge line",
description: "This is a new line",
thumbnail: "test-img-yeah.com/thumb",
tax_lines: [],
content: {
unit_price: 10,
variant: {
Expand All @@ -62,6 +64,7 @@ export const carts = {
{
id: IdMap.getId("freeShipping"),
name: "Free shipping",
tax_lines: [],
data: {
name: "test",
},
Expand Down
161 changes: 66 additions & 95 deletions packages/medusa-payment-klarna/src/api/routes/hooks/address.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,107 +2,78 @@ export default async (req, res) => {
// In Medusa, we store the cart id in merchant_data
const { shipping_address, merchant_data } = req.body

try {
const manager = req.scope.resolve("manager")
const cartService = req.scope.resolve("cartService")
const klarnaProviderService = req.scope.resolve("pp_klarna")
const shippingProfileService = req.scope.resolve("shippingProfileService")
const cartService = req.scope.resolve("cartService")
const klarnaProviderService = req.scope.resolve("pp_klarna")
const shippingProfileService = req.scope.resolve("shippingProfileService")

const result = await manager.transaction("SERIALIZABLE", async (m) => {
const cart = await cartService.retrieve(merchant_data, {
select: ["subtotal"],
relations: [
"shipping_address",
"billing_address",
"region",
"items",
"shipping_methods",
"shipping_methods.shipping_option",
"items.variant",
"items.variant.product",
],
})

if (shipping_address) {
const shippingAddress = {
first_name: shipping_address.given_name,
last_name: shipping_address.family_name,
address_1: shipping_address.street_address,
address_2: shipping_address.street_address2,
city: shipping_address.city,
country_code: shipping_address.country,
postal_code: shipping_address.postal_code,
phone: shipping_address.phone,
}

let billingAddress = {
first_name: shipping_address.given_name,
last_name: shipping_address.family_name,
address_1: shipping_address.street_address,
address_2: shipping_address.street_address2,
city: shipping_address.city,
country_code: shipping_address.country,
postal_code: shipping_address.postal_code,
phone: shipping_address.phone,
}

await cartService.update(cart.id, {
shipping_address: shippingAddress,
billing_address: billingAddress,
email: shipping_address.email,
})
if (shipping_address) {
const shippingAddress = {
first_name: shipping_address.given_name,
last_name: shipping_address.family_name,
address_1: shipping_address.street_address,
address_2: shipping_address.street_address2,
city: shipping_address.city,
country_code: shipping_address.country,
postal_code: shipping_address.postal_code,
phone: shipping_address.phone,
}

const shippingOptions = await shippingProfileService.fetchCartOptions(
cart
)
let billingAddress = {
first_name: shipping_address.given_name,
last_name: shipping_address.family_name,
address_1: shipping_address.street_address,
address_2: shipping_address.street_address2,
city: shipping_address.city,
country_code: shipping_address.country,
postal_code: shipping_address.postal_code,
phone: shipping_address.phone,
}

if (shippingOptions?.length) {
const option = shippingOptions.find(
(o) => o.data && !o.data.require_drop_point
)
await cartService
.withTransaction(m)
.addShippingMethod(cart.id, option.id, option.data)
}
await cartService.update(merchant_data, {
shipping_address: shippingAddress,
billing_address: billingAddress,
email: shipping_address.email,
})

// Fetch and return updated Klarna order
const updatedCart = await cartService
.withTransaction(m)
.retrieve(cart.id, {
select: [
"gift_card_total",
"subtotal",
"total",
"shipping_total",
"tax_total",
"discount_total",
"subtotal",
],
relations: [
"shipping_address",
"billing_address",
"region",
"shipping_methods",
"shipping_methods.shipping_option",
"items",
"items.variant",
"items.variant.product",
],
})
return klarnaProviderService.cartToKlarnaOrder(updatedCart)
} else {
return null
}
let cart = await cartService.retrieveWithTotals(merchant_data, {
relations: [
"shipping_address",
"billing_address",
"region",
"shipping_methods",
"shipping_methods.shipping_option",
"items",
"items.variant",
"items.variant.product",
],
})
const shippingOptions = await shippingProfileService.fetchCartOptions(cart)

if (result) {
res.json(result)
return
} else {
res.sendStatus(400)
return
if (shippingOptions?.length) {
const option = shippingOptions.find(
(o) => o.data && !o.data.require_drop_point
)
if (option) {
await cartService.addShippingMethod(cart.id, option.id, option.data)
cart = await cartService.retrieveWithTotals(cart.id, {
relations: [
"shipping_address",
"billing_address",
"region",
"shipping_methods",
"shipping_methods.shipping_option",
"items",
"items.variant",
"items.variant.product",
],
})
}
}
} catch (error) {
throw error

const order = await klarnaProviderService.cartToKlarnaOrder(cart)
res.json(order)
} else {
res.sendStatus(400)
return
}
}
70 changes: 34 additions & 36 deletions packages/medusa-payment-klarna/src/api/routes/hooks/shipping.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,23 @@ export default async (req, res) => {
const klarnaProviderService = req.scope.resolve("pp_klarna")
const shippingProfileService = req.scope.resolve("shippingProfileService")

const cart = await cartService.retrieve(merchant_data, {
select: ["subtotal"],
relations: [
"shipping_address",
"billing_address",
"region",
"shipping_methods",
"shipping_methods.shipping_option",
"items",
"items.adjustments",
"items.variant",
"items.variant.product",
],
})
const cart = await cartService.retrieveWithTotals(
merchant_data,
{
relations: [
"shipping_address",
"billing_address",
"region",
"shipping_methods",
"shipping_methods.shipping_option",
"items",
"items.adjustments",
"items.variant",
"items.variant.product",
],
},
{ force_taxes: true }
)
let shippingOptions = await shippingProfileService.fetchCartOptions(cart)

shippingOptions = shippingOptions.filter(
Expand All @@ -35,28 +38,23 @@ export default async (req, res) => {
}
}

const newCart = await cartService.retrieve(cart.id, {
select: [
"gift_card_total",
"subtotal",
"total",
"shipping_total",
"tax_total",
"discount_total",
"subtotal",
],
relations: [
"shipping_address",
"billing_address",
"shipping_methods",
"shipping_methods.shipping_option",
"region",
"items",
"items.adjustments",
"items.variant",
"items.variant.product",
],
})
const newCart = await cartService.retrieveWithTotals(
cart.id,
{
relations: [
"shipping_address",
"billing_address",
"shipping_methods",
"shipping_methods.shipping_option",
"region",
"items",
"items.adjustments",
"items.variant",
"items.variant.product",
],
},
{ force_taxes: true }
)

const order = await klarnaProviderService.cartToKlarnaOrder(newCart)

Expand Down

0 comments on commit a908a77

Please sign in to comment.