From b4ddb02efb18b14b854df28693f5f806632a2f1e Mon Sep 17 00:00:00 2001 From: Adrian Pilarczyk Date: Fri, 12 May 2023 14:49:27 +0200 Subject: [PATCH] fix: quantity not respected (#460) * fix: :white_check_mark: fix failing map tests * fix: :bug: use totalPrice instead of unitPrice to fix quantity * build: :construction_worker: add changeset --- .changeset/afraid-ladybugs-carry.md | 5 +++ .../subscriptions/OrderCreated.graphql | 3 ++ .../subscriptions/OrderFulfilled.graphql | 3 ++ .../maps/avatax-calculate-taxes-map.test.ts | 33 +++++++++++++++---- .../avatax/maps/avatax-calculate-taxes-map.ts | 3 +- .../maps/avatax-order-created-map.test.ts | 14 ++++++-- .../avatax/maps/avatax-order-created-map.ts | 2 +- .../maps/avatax-order-fulfilled-map.test.ts | 6 ++++ .../maps/taxjar-order-created-map.test.ts | 23 ++++--------- .../taxjar/maps/taxjar-order-created-map.ts | 2 +- 10 files changed, 64 insertions(+), 30 deletions(-) create mode 100644 .changeset/afraid-ladybugs-carry.md diff --git a/.changeset/afraid-ladybugs-carry.md b/.changeset/afraid-ladybugs-carry.md new file mode 100644 index 0000000..7d0838b --- /dev/null +++ b/.changeset/afraid-ladybugs-carry.md @@ -0,0 +1,5 @@ +--- +"saleor-app-taxes": patch +--- + +Fix quantity not respected when calculating taxes. diff --git a/apps/taxes/graphql/subscriptions/OrderCreated.graphql b/apps/taxes/graphql/subscriptions/OrderCreated.graphql index 1cb51ab..c6e9dd2 100644 --- a/apps/taxes/graphql/subscriptions/OrderCreated.graphql +++ b/apps/taxes/graphql/subscriptions/OrderCreated.graphql @@ -8,6 +8,9 @@ fragment OrderLine on OrderLine { } } totalPrice { + net { + amount + } tax { amount } diff --git a/apps/taxes/graphql/subscriptions/OrderFulfilled.graphql b/apps/taxes/graphql/subscriptions/OrderFulfilled.graphql index 3d8148d..aeed5e2 100644 --- a/apps/taxes/graphql/subscriptions/OrderFulfilled.graphql +++ b/apps/taxes/graphql/subscriptions/OrderFulfilled.graphql @@ -8,6 +8,9 @@ fragment OrderLine on OrderLine { } } totalPrice { + net { + amount + } tax { amount } diff --git a/apps/taxes/src/modules/avatax/maps/avatax-calculate-taxes-map.test.ts b/apps/taxes/src/modules/avatax/maps/avatax-calculate-taxes-map.test.ts index b681da0..30a4941 100644 --- a/apps/taxes/src/modules/avatax/maps/avatax-calculate-taxes-map.test.ts +++ b/apps/taxes/src/modules/avatax/maps/avatax-calculate-taxes-map.test.ts @@ -34,12 +34,12 @@ const MOCKED_CALCULATE_TAXES_ARGS: AvataxCalculateTaxesMapPayloadArgs = { lines: [ { chargeTaxes: true, - quantity: 1, + quantity: 3, unitPrice: { amount: 84, }, totalPrice: { - amount: 84, + amount: 252, }, sourceLine: { __typename: "OrderLine", @@ -114,17 +114,36 @@ describe("avataxCalculateTaxesMaps", () => { it.todo("rounding of numbers"); }); describe("mapLines", () => { - it("includes shipping as a line", () => { - const lines = avataxCalculateTaxesMaps.mapLines( - MOCKED_CALCULATE_TAXES_ARGS.taxBase, - MOCKED_CALCULATE_TAXES_ARGS.config - ); + const lines = avataxCalculateTaxesMaps.mapLines( + MOCKED_CALCULATE_TAXES_ARGS.taxBase, + MOCKED_CALCULATE_TAXES_ARGS.config + ); + it("includes shipping as a line", () => { expect(lines).toContainEqual({ itemCode: avataxCalculateTaxesMaps.shippingItemCode, quantity: 1, amount: 48.33, taxCode: MOCKED_CALCULATE_TAXES_ARGS.config.shippingTaxCode, + taxIncluded: true, + }); + }); + + it("returns the correct quantity of individual lines", () => { + expect(lines).toContainEqual({ + quantity: 3, + amount: 252, + taxCode: "", + taxIncluded: true, + }); + }); + + it("returns the correct quantity of individual lines", () => { + expect(lines).toContainEqual({ + quantity: 3, + amount: 252, + taxCode: "", + taxIncluded: true, }); }); }); diff --git a/apps/taxes/src/modules/avatax/maps/avatax-calculate-taxes-map.ts b/apps/taxes/src/modules/avatax/maps/avatax-calculate-taxes-map.ts index 904615a..423d1cf 100644 --- a/apps/taxes/src/modules/avatax/maps/avatax-calculate-taxes-map.ts +++ b/apps/taxes/src/modules/avatax/maps/avatax-calculate-taxes-map.ts @@ -18,7 +18,7 @@ const SHIPPING_ITEM_CODE = "Shipping"; function mapLines(taxBase: TaxBaseFragment, config: AvataxConfig): LineItemModel[] { const productLines = taxBase.lines.map((line) => ({ - amount: line.unitPrice.amount, + amount: line.totalPrice.amount, taxIncluded: line.chargeTaxes, // todo: get from tax code matcher taxCode: "", @@ -32,6 +32,7 @@ function mapLines(taxBase: TaxBaseFragment, config: AvataxConfig): LineItemModel itemCode: SHIPPING_ITEM_CODE, taxCode: config.shippingTaxCode, quantity: 1, + taxIncluded: true, }; return [...productLines, shippingLine]; diff --git a/apps/taxes/src/modules/avatax/maps/avatax-order-created-map.test.ts b/apps/taxes/src/modules/avatax/maps/avatax-order-created-map.test.ts index f43e1d7..47bcb55 100644 --- a/apps/taxes/src/modules/avatax/maps/avatax-order-created-map.test.ts +++ b/apps/taxes/src/modules/avatax/maps/avatax-order-created-map.test.ts @@ -59,13 +59,16 @@ const MOCKED_ARGS: CreateTransactionMapPayloadArgs = { { productSku: "328223581", productName: "Monospace Tee", - quantity: 1, + quantity: 3, unitPrice: { net: { amount: 90, }, }, totalPrice: { + net: { + amount: 270, + }, tax: { amount: 8.55, }, @@ -80,7 +83,11 @@ const MOCKED_ARGS: CreateTransactionMapPayloadArgs = { amount: 45, }, }, + totalPrice: { + net: { + amount: 45, + }, tax: { amount: 4.28, }, @@ -156,6 +163,7 @@ describe("avataxOrderCreatedMaps", () => { taxCode: MOCKED_ARGS.config.shippingTaxCode, quantity: 1, amount: 48.33, + taxIncluded: true, }); }); @@ -165,8 +173,8 @@ describe("avataxOrderCreatedMaps", () => { expect(first).toContain({ itemCode: "328223581", description: "Monospace Tee", - quantity: 1, - amount: 90, + quantity: 3, + amount: 270, }); expect(second).toContain({ itemCode: "328223580", diff --git a/apps/taxes/src/modules/avatax/maps/avatax-order-created-map.ts b/apps/taxes/src/modules/avatax/maps/avatax-order-created-map.ts index c6ae38a..f7155ac 100644 --- a/apps/taxes/src/modules/avatax/maps/avatax-order-created-map.ts +++ b/apps/taxes/src/modules/avatax/maps/avatax-order-created-map.ts @@ -16,7 +16,7 @@ const SHIPPING_ITEM_CODE = "Shipping"; function mapLines(order: OrderCreatedSubscriptionFragment, config: AvataxConfig): LineItemModel[] { const productLines: LineItemModel[] = order.lines.map((line) => ({ - amount: line.unitPrice.net.amount, + amount: line.totalPrice.net.amount, // todo: get from tax code matcher taxCode: "", quantity: line.quantity, diff --git a/apps/taxes/src/modules/avatax/maps/avatax-order-fulfilled-map.test.ts b/apps/taxes/src/modules/avatax/maps/avatax-order-fulfilled-map.test.ts index b611094..c2df46d 100644 --- a/apps/taxes/src/modules/avatax/maps/avatax-order-fulfilled-map.test.ts +++ b/apps/taxes/src/modules/avatax/maps/avatax-order-fulfilled-map.test.ts @@ -66,6 +66,9 @@ const MOCKED_MAP_PAYLOAD_ARGS: CommitTransactionMapPayloadArgs = { }, }, totalPrice: { + net: { + amount: 90, + }, tax: { amount: 8.55, }, @@ -81,6 +84,9 @@ const MOCKED_MAP_PAYLOAD_ARGS: CommitTransactionMapPayloadArgs = { }, }, totalPrice: { + net: { + amount: 45, + }, tax: { amount: 4.28, }, diff --git a/apps/taxes/src/modules/taxjar/maps/taxjar-order-created-map.test.ts b/apps/taxes/src/modules/taxjar/maps/taxjar-order-created-map.test.ts index 6bdd600..8be2845 100644 --- a/apps/taxes/src/modules/taxjar/maps/taxjar-order-created-map.test.ts +++ b/apps/taxes/src/modules/taxjar/maps/taxjar-order-created-map.test.ts @@ -66,6 +66,9 @@ const MOCKED_ORDER: TaxJarOrderCreatedMapPayloadArgs = { }, }, totalPrice: { + net: { + amount: 90, + }, tax: { amount: 8.55, }, @@ -81,6 +84,9 @@ const MOCKED_ORDER: TaxJarOrderCreatedMapPayloadArgs = { }, }, totalPrice: { + net: { + amount: 45, + }, tax: { amount: 4.28, }, @@ -165,22 +171,5 @@ describe("taxJarOrderCreatedMaps", () => { expect(result).toBe(412.1); }); - - it("returns the rounded sum of all line items when line items n of decimals > 2", () => { - const result = taxJarOrderCreatedMaps.sumLines([ - { - quantity: 3, - unit_price: 10.256, - product_identifier: "328223581", - }, - { - quantity: 2, - unit_price: 50.512, - product_identifier: "328223580", - }, - ]); - - expect(result).toBe(131.79); - }); }); }); diff --git a/apps/taxes/src/modules/taxjar/maps/taxjar-order-created-map.ts b/apps/taxes/src/modules/taxjar/maps/taxjar-order-created-map.ts index 4693c70..5983c65 100644 --- a/apps/taxes/src/modules/taxjar/maps/taxjar-order-created-map.ts +++ b/apps/taxes/src/modules/taxjar/maps/taxjar-order-created-map.ts @@ -32,7 +32,7 @@ export type TaxJarOrderCreatedMapPayloadArgs = { const mapPayload = ({ order, channel }: TaxJarOrderCreatedMapPayloadArgs): CreateOrderArgs => { const lineItems = mapLines(order.lines); const lineSum = sumLines(lineItems); - const shippingAmount = order.shippingPrice.net.amount; + const shippingAmount = order.shippingPrice.gross.amount; /** * "The TaxJar API performs arbitrary-precision decimal arithmetic for accurately calculating sales tax." * but we want to round to 2 decimals for consistency