fix(medusa): gift card values & taxes are calculated correctly (#2777)

* chore: tax_rate is added to giftcards

* chore: minor

* chore: update gift card tax calculations to look at giftCard.tax_rate

* chore: gift card transactions use tax rate from gift card for legacy

* fix: gift cart total check for transaction should check the length

* chore: use tax exclusive cost + use giftcard tax rate for gctransactions + refactor

* chore: fix integration test

* chore: address issues brought up in comments

* chore: move gift card creation as a part of order service on order placed

* chore: add type handling for gift card creation

* chore: fix specs

* chore: use taxLines to calculate tax of a gift card

* chore: specs for line items containing gift cards and without

* chore: add integration specs + fix tax rate bug

* chore: round totaling + add GC application specs

* chore: cleanup trialables

* chore: write migration script to backfill gift cards with null tax_rate

* chore: update legacy totals service for gift cards

* chore: add changeset

* chore: address PR review changes

* chore: fix tests based on new totals calc

* chore: address review comments

Co-authored-by: adrien2p <adrien.deperetti@gmail.com>
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
This commit is contained in:
Riqwan Thamir
2022-12-20 22:24:25 +01:00
committed by GitHub
co-authored by adrien2p Oliver Windall Juhl
parent 3113d8024f
commit 8a60a73389
26 changed files with 968 additions and 181 deletions
+2 -19
View File
@@ -30,27 +30,10 @@ class OrderSubscriber {
}
handleOrderPlaced = async (data) => {
const order = await this.orderService_.retrieve(data.id, {
select: ["subtotal"],
relations: ["discounts", "discounts.rule", "items", "gift_cards"],
const order = await this.orderService_.retrieveWithTotals(data.id, {
relations: ["discounts", "discounts.rule"],
})
await Promise.all(
order.items.map(async (i) => {
if (i.is_giftcard) {
for (let qty = 0; qty < i.quantity; qty++) {
await this.giftCardService_.create({
region_id: order.region_id,
order_id: order.id,
value: i.unit_price,
balance: i.unit_price,
metadata: i.metadata,
})
}
}
})
)
await Promise.all(
order.discounts.map(async (d) => {
const usageCount = d?.usage_count || 0