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
|
-
|
|
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
|
-
|
|
365
|
-
return basePrice + taxAmount; // Return the total including tax
|
|
379
|
+
return taxableAmount * Number(item.taxRate);
|
|
366
380
|
}
|
|
367
|
-
return
|
|
381
|
+
return 0; // No tax for non-taxable items
|
|
368
382
|
})
|
|
369
|
-
.reduce((a, b) => a + b, 0);
|
|
370
|
-
|
|
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
|