rerobe-js-orm 3.9.7 → 3.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,7 +26,7 @@ export default class OrderHelpers {
26
26
  currency: string;
27
27
  }): string;
28
28
  getSubtotalWithoutSalePrice(productsFullInfoWithQuantity?: ProductsFullInfoWithQuantity): number;
29
- getSubtotalWithSalePriceIncluded(productsFullInfoWithQuantity?: ProductsFullInfoWithQuantity): number;
29
+ getSubtotalWithSalePriceIncluded(productsFullInfoWithQuantity?: ProductsFullInfoWithQuantity, orderDiscount?: number): number;
30
30
  getSaleDiscountAmount(productsFullInfoWithQuantity: ProductsFullInfoWithQuantity): number;
31
31
  preparePresentmentData({ merchantName, merchantCurrency, presentmentCurrencyCode, productsFullInfoWithQuantity, currencyConverter, saleDiscountAmount, creditDiscountAmount, additionalDiscount, shippingPrice, itemsTax, shippingFeeTax, subTotalWithSalePriceIncluded, totalIncludingShipping, totalIncludingShippingAndTaxes, }: {
32
32
  merchantName: string;
@@ -351,23 +351,39 @@ class OrderHelpers {
351
351
  .reduce((a, b) => a + b, 0);
352
352
  return Number(this.toFixedPointPrice(cumsum));
353
353
  }
354
- getSubtotalWithSalePriceIncluded(productsFullInfoWithQuantity) {
354
+ getSubtotalWithSalePriceIncluded(productsFullInfoWithQuantity, orderDiscount = 0) {
355
355
  if (!productsFullInfoWithQuantity || productsFullInfoWithQuantity.length === 0) {
356
356
  return 0;
357
357
  }
358
- const cumsum = productsFullInfoWithQuantity
358
+ // Step 1: Calculate the pre-tax subtotal (no taxes yet)
359
+ const preTaxSubtotal = productsFullInfoWithQuantity
359
360
  .map((item) => {
360
361
  // Determine if the product is on sale and set the price accordingly
361
362
  const price = item.product.isOnSale && item.product.clearanceTimestamp ? item.product.salePrice : item.product.price;
363
+ // Base price for this item before tax
364
+ return Number(price || 0) * Number(item.quantity);
365
+ })
366
+ .reduce((a, b) => a + b, 0); // Sum up the pre-tax prices of all items
367
+ // Step 2: Apply the order-wide discount to the pre-tax subtotal, ensuring it doesn't exceed the pre-tax subtotal
368
+ const discountedSubtotal = Math.max(preTaxSubtotal - orderDiscount, 0);
369
+ // Step 3: Calculate the total tax based on the discounted subtotal
370
+ const totalTax = productsFullInfoWithQuantity
371
+ .map((item) => {
372
+ const price = item.product.isOnSale && item.product.clearanceTimestamp ? item.product.salePrice : item.product.price;
362
373
  const basePrice = Number(price || 0) * Number(item.quantity);
374
+ const discountFactor = basePrice / preTaxSubtotal; // Determine how much of the discount applies to this item
375
+ const discountedPriceForItem = basePrice - orderDiscount * discountFactor; // Apply discount proportionally to this item
376
+ const taxableAmount = Math.max(discountedPriceForItem, 0); // Cap the discounted price at 0
377
+ // Calculate tax only for taxable items, based on the discounted price
363
378
  if (item.isTaxable && item.taxRate) {
364
- const taxAmount = basePrice * Number(item.taxRate); // Calculate the tax based on the base price
365
- return basePrice + taxAmount; // Return the total including tax
379
+ return taxableAmount * Number(item.taxRate);
366
380
  }
367
- return basePrice; // Return the price without tax for non-taxable items
381
+ return 0; // No tax for non-taxable items
368
382
  })
369
- .reduce((a, b) => a + b, 0);
370
- return Number(this.toFixedPointPrice(cumsum));
383
+ .reduce((a, b) => a + b, 0); // Sum up the taxes for all items
384
+ // Step 4: Return the final total (discounted subtotal + total tax)
385
+ const totalAfterDiscountAndTax = discountedSubtotal + totalTax;
386
+ return Number(this.toFixedPointPrice(totalAfterDiscountAndTax));
371
387
  }
372
388
  getSaleDiscountAmount(productsFullInfoWithQuantity) {
373
389
  return productsFullInfoWithQuantity
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rerobe-js-orm",
3
- "version": "3.9.7",
3
+ "version": "3.9.9",
4
4
  "description": "ReRobe's Javascript ORM Framework",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",