@parv0888/scheme-engine 0.1.0
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.
- package/dist/calculators/discount-application.d.ts +44 -0
- package/dist/calculators/discount-application.d.ts.map +1 -0
- package/dist/calculators/discount-application.js +174 -0
- package/dist/calculators/discount-application.js.map +1 -0
- package/dist/calculators/index.d.ts +65 -0
- package/dist/calculators/index.d.ts.map +1 -0
- package/dist/calculators/index.js +196 -0
- package/dist/calculators/index.js.map +1 -0
- package/dist/calculators/payout-types/article.d.ts +23 -0
- package/dist/calculators/payout-types/article.d.ts.map +1 -0
- package/dist/calculators/payout-types/article.js +73 -0
- package/dist/calculators/payout-types/article.js.map +1 -0
- package/dist/calculators/payout-types/basket.d.ts +49 -0
- package/dist/calculators/payout-types/basket.d.ts.map +1 -0
- package/dist/calculators/payout-types/basket.js +108 -0
- package/dist/calculators/payout-types/basket.js.map +1 -0
- package/dist/calculators/payout-types/coupon.d.ts +23 -0
- package/dist/calculators/payout-types/coupon.d.ts.map +1 -0
- package/dist/calculators/payout-types/coupon.js +74 -0
- package/dist/calculators/payout-types/coupon.js.map +1 -0
- package/dist/calculators/payout-types/discount.d.ts +21 -0
- package/dist/calculators/payout-types/discount.d.ts.map +1 -0
- package/dist/calculators/payout-types/discount.js +110 -0
- package/dist/calculators/payout-types/discount.js.map +1 -0
- package/dist/calculators/payout-types/fixed-discount.d.ts +31 -0
- package/dist/calculators/payout-types/fixed-discount.d.ts.map +1 -0
- package/dist/calculators/payout-types/fixed-discount.js +65 -0
- package/dist/calculators/payout-types/fixed-discount.js.map +1 -0
- package/dist/calculators/payout-types/foc.d.ts +30 -0
- package/dist/calculators/payout-types/foc.d.ts.map +1 -0
- package/dist/calculators/payout-types/foc.js +130 -0
- package/dist/calculators/payout-types/foc.js.map +1 -0
- package/dist/calculators/payout-types/mrp-percentage.d.ts +34 -0
- package/dist/calculators/payout-types/mrp-percentage.d.ts.map +1 -0
- package/dist/calculators/payout-types/mrp-percentage.js +77 -0
- package/dist/calculators/payout-types/mrp-percentage.js.map +1 -0
- package/dist/calculators/payout-types/nlp.d.ts +22 -0
- package/dist/calculators/payout-types/nlp.d.ts.map +1 -0
- package/dist/calculators/payout-types/nlp.js +59 -0
- package/dist/calculators/payout-types/nlp.js.map +1 -0
- package/dist/calculators/payout-types/per-unit.d.ts +32 -0
- package/dist/calculators/payout-types/per-unit.d.ts.map +1 -0
- package/dist/calculators/payout-types/per-unit.js +94 -0
- package/dist/calculators/payout-types/per-unit.js.map +1 -0
- package/dist/calculators/payout-types/product-new.d.ts +27 -0
- package/dist/calculators/payout-types/product-new.d.ts.map +1 -0
- package/dist/calculators/payout-types/product-new.js +85 -0
- package/dist/calculators/payout-types/product-new.js.map +1 -0
- package/dist/calculators/payout-types/product.d.ts +31 -0
- package/dist/calculators/payout-types/product.d.ts.map +1 -0
- package/dist/calculators/payout-types/product.js +73 -0
- package/dist/calculators/payout-types/product.js.map +1 -0
- package/dist/calculators/payout-types/topup.d.ts +19 -0
- package/dist/calculators/payout-types/topup.d.ts.map +1 -0
- package/dist/calculators/payout-types/topup.js +46 -0
- package/dist/calculators/payout-types/topup.js.map +1 -0
- package/dist/calculators/slab-matcher.d.ts +41 -0
- package/dist/calculators/slab-matcher.d.ts.map +1 -0
- package/dist/calculators/slab-matcher.js +68 -0
- package/dist/calculators/slab-matcher.js.map +1 -0
- package/dist/esm/calculators/discount-application.js +170 -0
- package/dist/esm/calculators/discount-application.js.map +1 -0
- package/dist/esm/calculators/index.js +176 -0
- package/dist/esm/calculators/index.js.map +1 -0
- package/dist/esm/calculators/payout-types/article.js +70 -0
- package/dist/esm/calculators/payout-types/article.js.map +1 -0
- package/dist/esm/calculators/payout-types/basket.js +105 -0
- package/dist/esm/calculators/payout-types/basket.js.map +1 -0
- package/dist/esm/calculators/payout-types/coupon.js +71 -0
- package/dist/esm/calculators/payout-types/coupon.js.map +1 -0
- package/dist/esm/calculators/payout-types/discount.js +107 -0
- package/dist/esm/calculators/payout-types/discount.js.map +1 -0
- package/dist/esm/calculators/payout-types/fixed-discount.js +62 -0
- package/dist/esm/calculators/payout-types/fixed-discount.js.map +1 -0
- package/dist/esm/calculators/payout-types/foc.js +127 -0
- package/dist/esm/calculators/payout-types/foc.js.map +1 -0
- package/dist/esm/calculators/payout-types/mrp-percentage.js +74 -0
- package/dist/esm/calculators/payout-types/mrp-percentage.js.map +1 -0
- package/dist/esm/calculators/payout-types/nlp.js +56 -0
- package/dist/esm/calculators/payout-types/nlp.js.map +1 -0
- package/dist/esm/calculators/payout-types/per-unit.js +91 -0
- package/dist/esm/calculators/payout-types/per-unit.js.map +1 -0
- package/dist/esm/calculators/payout-types/product-new.js +82 -0
- package/dist/esm/calculators/payout-types/product-new.js.map +1 -0
- package/dist/esm/calculators/payout-types/product.js +70 -0
- package/dist/esm/calculators/payout-types/product.js.map +1 -0
- package/dist/esm/calculators/payout-types/topup.js +43 -0
- package/dist/esm/calculators/payout-types/topup.js.map +1 -0
- package/dist/esm/calculators/slab-matcher.js +64 -0
- package/dist/esm/calculators/slab-matcher.js.map +1 -0
- package/dist/esm/helpers/calc-type-checks.js +30 -0
- package/dist/esm/helpers/calc-type-checks.js.map +1 -0
- package/dist/esm/helpers/compare-value.js +109 -0
- package/dist/esm/helpers/compare-value.js.map +1 -0
- package/dist/esm/helpers/constraint-checks.js +67 -0
- package/dist/esm/helpers/constraint-checks.js.map +1 -0
- package/dist/esm/helpers/index.js +8 -0
- package/dist/esm/helpers/index.js.map +1 -0
- package/dist/esm/helpers/math.js +84 -0
- package/dist/esm/helpers/math.js.map +1 -0
- package/dist/esm/helpers/payout-type-checks.js +29 -0
- package/dist/esm/helpers/payout-type-checks.js.map +1 -0
- package/dist/esm/helpers/qualifier-checks.js +188 -0
- package/dist/esm/helpers/qualifier-checks.js.map +1 -0
- package/dist/esm/helpers/scheme-applicability.js +93 -0
- package/dist/esm/helpers/scheme-applicability.js.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/applied-scheme.js +19 -0
- package/dist/esm/types/applied-scheme.js.map +1 -0
- package/dist/esm/types/enums.js +115 -0
- package/dist/esm/types/enums.js.map +1 -0
- package/dist/esm/types/index.js +5 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/item-props.js +2 -0
- package/dist/esm/types/item-props.js.map +1 -0
- package/dist/esm/types/scheme.js +2 -0
- package/dist/esm/types/scheme.js.map +1 -0
- package/dist/helpers/calc-type-checks.d.ts +21 -0
- package/dist/helpers/calc-type-checks.d.ts.map +1 -0
- package/dist/helpers/calc-type-checks.js +36 -0
- package/dist/helpers/calc-type-checks.js.map +1 -0
- package/dist/helpers/compare-value.d.ts +40 -0
- package/dist/helpers/compare-value.d.ts.map +1 -0
- package/dist/helpers/compare-value.js +120 -0
- package/dist/helpers/compare-value.js.map +1 -0
- package/dist/helpers/constraint-checks.d.ts +30 -0
- package/dist/helpers/constraint-checks.d.ts.map +1 -0
- package/dist/helpers/constraint-checks.js +73 -0
- package/dist/helpers/constraint-checks.js.map +1 -0
- package/dist/helpers/index.d.ts +8 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +24 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/math.d.ts +50 -0
- package/dist/helpers/math.d.ts.map +1 -0
- package/dist/helpers/math.js +96 -0
- package/dist/helpers/math.js.map +1 -0
- package/dist/helpers/payout-type-checks.d.ts +17 -0
- package/dist/helpers/payout-type-checks.d.ts.map +1 -0
- package/dist/helpers/payout-type-checks.js +34 -0
- package/dist/helpers/payout-type-checks.js.map +1 -0
- package/dist/helpers/qualifier-checks.d.ts +62 -0
- package/dist/helpers/qualifier-checks.d.ts.map +1 -0
- package/dist/helpers/qualifier-checks.js +194 -0
- package/dist/helpers/qualifier-checks.js.map +1 -0
- package/dist/helpers/scheme-applicability.d.ts +40 -0
- package/dist/helpers/scheme-applicability.d.ts.map +1 -0
- package/dist/helpers/scheme-applicability.js +99 -0
- package/dist/helpers/scheme-applicability.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/types/applied-scheme.d.ts +157 -0
- package/dist/types/applied-scheme.d.ts.map +1 -0
- package/dist/types/applied-scheme.js +22 -0
- package/dist/types/applied-scheme.js.map +1 -0
- package/dist/types/enums.d.ts +91 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +118 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/item-props.d.ts +103 -0
- package/dist/types/item-props.d.ts.map +1 -0
- package/dist/types/item-props.js +3 -0
- package/dist/types/item-props.js.map +1 -0
- package/dist/types/scheme.d.ts +172 -0
- package/dist/types/scheme.d.ts.map +1 -0
- package/dist/types/scheme.js +3 -0
- package/dist/types/scheme.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SchemeCategory } from "../types/enums";
|
|
2
|
+
import type { AppliedSchemeEntry, AppliedDiscountResult } from "../types/applied-scheme";
|
|
3
|
+
export interface DiscountApplicationInput {
|
|
4
|
+
/** Schemes already applied/matched for this line item (typically one entry per scheme, or per batch for batch-priced companies). */
|
|
5
|
+
appliedSchemes: AppliedSchemeEntry[];
|
|
6
|
+
/** Base monetary value used as the starting point for % discount calculations (usually `unit price × billed quantity`, excluding free qty). */
|
|
7
|
+
baseValue: number;
|
|
8
|
+
/** Billed quantity for the line (saleable quantity that contributes to value/discount), excluding free qty. */
|
|
9
|
+
quantity: number;
|
|
10
|
+
/** Free quantity given via FOC/product schemes (used for some effective discount computations). */
|
|
11
|
+
freeQty: number;
|
|
12
|
+
/** Product MRP (Maximum Retail Price) used for MRP-based discount schemes. */
|
|
13
|
+
mrp: number;
|
|
14
|
+
/** Selling price used for discount calculations (typically PTR/ex-tax unit price for this line). */
|
|
15
|
+
price: number;
|
|
16
|
+
/** Whether we’re computing primary or secondary scheme discount totals. */
|
|
17
|
+
schemeCategory: SchemeCategory;
|
|
18
|
+
/** If true, successive discounts are applied on the reduced base (gross-total chaining) rather than original base value. */
|
|
19
|
+
useGrossTotalForSuccessiveDiscounts: boolean;
|
|
20
|
+
/** Company-level behavior: Product payout schemes can be treated as unitary (discount distribution instead of adding free item value). */
|
|
21
|
+
companyUsesUnitaryProductScheme?: boolean;
|
|
22
|
+
/** Company-level behavior: same SKU can be split into multiple pricing batches; discount must be computed per-batch to avoid double counting. */
|
|
23
|
+
companyUsesPricingBatchNumberInDms?: boolean;
|
|
24
|
+
/** Company-level behavior: toggles alternate bottler flows where some payout rules differ. */
|
|
25
|
+
enableBottlerCompanyFlows?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Calculate the total primary or secondary discount value from applied schemes.
|
|
29
|
+
* Pure function — returns results without mutating the input.
|
|
30
|
+
*
|
|
31
|
+
* Bug 7 fix: Clamps negative discount values to 0.
|
|
32
|
+
* Bug 5 fix: Returns warning when MRP < price causes zero-out.
|
|
33
|
+
*/
|
|
34
|
+
export declare function calculateAppliedDiscountValues(input: DiscountApplicationInput): AppliedDiscountResult;
|
|
35
|
+
interface RecalcResult {
|
|
36
|
+
discountPercent: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Recalculates perUnit discount percentage based on updated net prices.
|
|
40
|
+
* Pure function – returns new percent, caller decides where to assign.
|
|
41
|
+
*/
|
|
42
|
+
export declare function recalculateSchemePercentage(scheme: AppliedSchemeEntry, tempBaseValue?: number): RecalcResult;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=discount-application.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discount-application.d.ts","sourceRoot":"","sources":["../../src/calculators/discount-application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgD,MAAM,gBAAgB,CAAC;AAC9F,OAAO,KAAK,EAAE,kBAAkB,EAAyB,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKhH,MAAM,WAAW,wBAAwB;IACvC,oIAAoI;IACpI,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAErC,+IAA+I;IAC/I,SAAS,EAAE,MAAM,CAAC;IAElB,+GAA+G;IAC/G,QAAQ,EAAE,MAAM,CAAC;IAEjB,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAEhB,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAC;IAEZ,oGAAoG;IACpG,KAAK,EAAE,MAAM,CAAC;IAEd,2EAA2E;IAC3E,cAAc,EAAE,cAAc,CAAC;IAE/B,4HAA4H;IAC5H,mCAAmC,EAAE,OAAO,CAAC;IAE7C,0IAA0I;IAC1I,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAE1C,iJAAiJ;IACjJ,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAE7C,8FAA8F;IAC9F,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,wBAAwB,GAC9B,qBAAqB,CAkJvB;AAID,UAAU,YAAY;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,kBAAkB,EAC1B,aAAa,CAAC,EAAE,MAAM,GACrB,YAAY,CAmDd"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateAppliedDiscountValues = calculateAppliedDiscountValues;
|
|
4
|
+
exports.recalculateSchemePercentage = recalculateSchemePercentage;
|
|
5
|
+
const enums_1 = require("../types/enums");
|
|
6
|
+
const math_1 = require("../helpers/math");
|
|
7
|
+
const payout_type_checks_1 = require("../helpers/payout-type-checks");
|
|
8
|
+
/**
|
|
9
|
+
* Calculate the total primary or secondary discount value from applied schemes.
|
|
10
|
+
* Pure function — returns results without mutating the input.
|
|
11
|
+
*
|
|
12
|
+
* Bug 7 fix: Clamps negative discount values to 0.
|
|
13
|
+
* Bug 5 fix: Returns warning when MRP < price causes zero-out.
|
|
14
|
+
*/
|
|
15
|
+
function calculateAppliedDiscountValues(input) {
|
|
16
|
+
const { appliedSchemes, baseValue, quantity, freeQty, mrp, price, schemeCategory, useGrossTotalForSuccessiveDiscounts, companyUsesUnitaryProductScheme = false, companyUsesPricingBatchNumberInDms = false, enableBottlerCompanyFlows = false, } = input;
|
|
17
|
+
const isPrimary = schemeCategory === enums_1.SchemeCategory.PRIMARY;
|
|
18
|
+
const discountKey = isPrimary ? "primaryDiscountValue" : "secondaryDiscountValue";
|
|
19
|
+
const percentKey = isPrimary ? "primaryDiscountPercent" : "secondaryDiscountPercent";
|
|
20
|
+
let tempBaseValue = baseValue;
|
|
21
|
+
let totalDiscount = 0;
|
|
22
|
+
const warnings = [];
|
|
23
|
+
const filtered = appliedSchemes.filter((s) => s.schemeType === schemeCategory);
|
|
24
|
+
for (const scheme of filtered) {
|
|
25
|
+
// Pricing-batch companies may split the same SKU into multiple batches,
|
|
26
|
+
// each with its own discount percent. In those cases we must compute
|
|
27
|
+
// discount values on the batch quantity instead of applying each entry
|
|
28
|
+
// on the full item quantity/baseValue (which would double-count).
|
|
29
|
+
const batchQtyRaw = companyUsesPricingBatchNumberInDms
|
|
30
|
+
? (typeof scheme.remainingQuantity === "number" ? scheme.remainingQuantity : scheme.cases)
|
|
31
|
+
: undefined;
|
|
32
|
+
const batchQty = typeof batchQtyRaw === "number" && batchQtyRaw > 0 ? batchQtyRaw : null;
|
|
33
|
+
const effectiveQty = batchQty ?? quantity;
|
|
34
|
+
const effectivePrice = typeof scheme.price === "number" && scheme.price > 0 ? scheme.price : price;
|
|
35
|
+
const effectiveBaseValue = batchQty ? effectivePrice * effectiveQty : baseValue;
|
|
36
|
+
// Recalculate PerUnit percentages if recalculation data present
|
|
37
|
+
if (scheme.recalculateSchemeData) {
|
|
38
|
+
const recalced = recalculateSchemePercentage(scheme, tempBaseValue);
|
|
39
|
+
if (isPrimary) {
|
|
40
|
+
scheme.primaryDiscountPercent = recalced.discountPercent;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
scheme.secondaryDiscountPercent = recalced.discountPercent;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const currentPercent = scheme[percentKey] || 0;
|
|
47
|
+
let currentValue = 0;
|
|
48
|
+
// Skip: FIXED_DISCOUNT already has value set
|
|
49
|
+
if (scheme.schemePayoutType === enums_1.SchemePayoutType.FIXED_DISCOUNT) {
|
|
50
|
+
currentValue = scheme[discountKey] || 0;
|
|
51
|
+
}
|
|
52
|
+
// Skip: PRODUCT + unitary scheme
|
|
53
|
+
else if (scheme.schemePayoutType === enums_1.SchemePayoutType.PRODUCT &&
|
|
54
|
+
companyUsesUnitaryProductScheme) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// FOC-type schemes
|
|
58
|
+
else if ((0, payout_type_checks_1.isFocTypePayoutScheme)(scheme.schemePayoutType)) {
|
|
59
|
+
const totalQty = quantity + freeQty;
|
|
60
|
+
if (totalQty > 0) {
|
|
61
|
+
currentValue = (scheme.freeQty * tempBaseValue) / totalQty;
|
|
62
|
+
}
|
|
63
|
+
// Zero out for pricing batch companies
|
|
64
|
+
if ((scheme.schemePayoutType === enums_1.SchemePayoutType.PRODUCT ||
|
|
65
|
+
scheme.schemePayoutType === enums_1.SchemePayoutType.FOC ||
|
|
66
|
+
scheme.schemePayoutType === enums_1.SchemePayoutType.FOC_SLAB) &&
|
|
67
|
+
companyUsesPricingBatchNumberInDms) {
|
|
68
|
+
currentValue = 0;
|
|
69
|
+
if (isPrimary) {
|
|
70
|
+
scheme.primaryDiscountPercent = 0;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
scheme.secondaryDiscountPercent = 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// MRP percentage discount
|
|
78
|
+
else if ((0, payout_type_checks_1.isPercentDiscountOnMRPTypePayoutScheme)(scheme.schemePayoutType) &&
|
|
79
|
+
!enableBottlerCompanyFlows) {
|
|
80
|
+
const discountedPrice = mrp - (mrp * currentPercent) / 100;
|
|
81
|
+
if (discountedPrice < effectivePrice) {
|
|
82
|
+
const rawValue = effectiveBaseValue - discountedPrice * effectiveQty;
|
|
83
|
+
currentValue = (0, math_1.clampNonNegative)(Number((0, math_1.formatPrice)(rawValue)));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Bug 5: MRP discount silently zeroes out when MRP < price
|
|
87
|
+
if (isPrimary) {
|
|
88
|
+
scheme.primaryDiscountPercent = 0;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
scheme.secondaryDiscountPercent = 0;
|
|
92
|
+
}
|
|
93
|
+
warnings.push(`MRP discount zeroed out: discountedPrice (${discountedPrice}) >= price (${effectivePrice}) for scheme ${scheme.schemeId}`);
|
|
94
|
+
currentValue = 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Markup discount
|
|
98
|
+
else if (scheme.isMarkup) {
|
|
99
|
+
currentValue = (0, math_1.calculateMarkupDiscount)(tempBaseValue, currentPercent);
|
|
100
|
+
}
|
|
101
|
+
// Default: percentage-based discount
|
|
102
|
+
else {
|
|
103
|
+
currentValue = (0, math_1.calculateDiscount)(tempBaseValue, currentPercent);
|
|
104
|
+
}
|
|
105
|
+
// Bug 7 fix: Clamp to non-negative
|
|
106
|
+
currentValue = (0, math_1.clampNonNegative)(currentValue);
|
|
107
|
+
if (isPrimary) {
|
|
108
|
+
scheme.primaryDiscountValue = currentValue;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
scheme.secondaryDiscountValue = currentValue;
|
|
112
|
+
}
|
|
113
|
+
totalDiscount += currentValue;
|
|
114
|
+
if (useGrossTotalForSuccessiveDiscounts) {
|
|
115
|
+
tempBaseValue -= currentValue;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Calculate effective percent
|
|
119
|
+
const effectivePercent = filtered.length === 1
|
|
120
|
+
? filtered[0][percentKey]
|
|
121
|
+
: baseValue > 0
|
|
122
|
+
? (totalDiscount / baseValue) * 100
|
|
123
|
+
: 0;
|
|
124
|
+
return {
|
|
125
|
+
discountValue: totalDiscount,
|
|
126
|
+
discountPercent: effectivePercent || 0,
|
|
127
|
+
clampedToZero: false,
|
|
128
|
+
warnings,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Recalculates perUnit discount percentage based on updated net prices.
|
|
133
|
+
* Pure function – returns new percent, caller decides where to assign.
|
|
134
|
+
*/
|
|
135
|
+
function recalculateSchemePercentage(scheme, tempBaseValue) {
|
|
136
|
+
if (scheme.schemePayoutType !== enums_1.SchemePayoutType.PERUNIT || !scheme.recalculateSchemeData) {
|
|
137
|
+
const isPrimary = scheme.schemeType === enums_1.SchemeCategory.PRIMARY;
|
|
138
|
+
return {
|
|
139
|
+
discountPercent: isPrimary
|
|
140
|
+
? scheme.primaryDiscountPercent
|
|
141
|
+
: scheme.secondaryDiscountPercent,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const data = scheme.recalculateSchemeData;
|
|
145
|
+
const { discountAmountOfPerUnit, totalTaxPercentage, usesStdUnit, usesSuperUnit, usesAdditionalUnit, compareValue, calculationOnCompleteNumber, additionalCalculationLogic, } = data;
|
|
146
|
+
// Approximate net prices proportional to tempBaseValue
|
|
147
|
+
// The caller should provide more precise values via the recalculateSchemeData
|
|
148
|
+
// For now, derive from the available data
|
|
149
|
+
const quantity = scheme.productId ? 1 : 1; // quantity is per-item
|
|
150
|
+
const netPrice = tempBaseValue ? tempBaseValue / (quantity || 1) : 0;
|
|
151
|
+
// These are rough approximations — the real recalculation happens
|
|
152
|
+
// when the caller sets up properly via RecalculateSchemeData
|
|
153
|
+
let finalNetPrice = netPrice;
|
|
154
|
+
if (usesStdUnit) {
|
|
155
|
+
// The calling code should compute actual stdUnitNetPrice * factor
|
|
156
|
+
finalNetPrice = netPrice;
|
|
157
|
+
}
|
|
158
|
+
else if (usesSuperUnit) {
|
|
159
|
+
finalNetPrice = netPrice;
|
|
160
|
+
}
|
|
161
|
+
else if (usesAdditionalUnit) {
|
|
162
|
+
finalNetPrice = netPrice;
|
|
163
|
+
}
|
|
164
|
+
const discountAmountPreTax = discountAmountOfPerUnit / (1 + totalTaxPercentage / 100);
|
|
165
|
+
let itemDiscountPercent;
|
|
166
|
+
if (additionalCalculationLogic === enums_1.AdditionalCalculationLogic.DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE) {
|
|
167
|
+
itemDiscountPercent = ((discountAmountPreTax || 0) * 100) / (finalNetPrice || 1);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
itemDiscountPercent = ((discountAmountOfPerUnit ?? 0) / (finalNetPrice || 1)) * 100;
|
|
171
|
+
}
|
|
172
|
+
return { discountPercent: itemDiscountPercent };
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=discount-application.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discount-application.js","sourceRoot":"","sources":["../../src/calculators/discount-application.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Scheme } from "../types/scheme";
|
|
2
|
+
import type { SchemeSlabResult } from "../types/applied-scheme";
|
|
3
|
+
import type { QualifierItem } from "../helpers/qualifier-checks";
|
|
4
|
+
import type { PerUnitPriceProps } from "../types/item-props";
|
|
5
|
+
import type { BasketItem } from "./payout-types/basket";
|
|
6
|
+
import type { Basket } from "../types/scheme";
|
|
7
|
+
export interface CalculateSchemeSlabInput {
|
|
8
|
+
/** Full scheme configuration as received from DB/API. */
|
|
9
|
+
scheme: Scheme;
|
|
10
|
+
/** Precomputed metric used to match slabs (qty/amount/units depending on scheme.constraintType). */
|
|
11
|
+
compareValue: number;
|
|
12
|
+
/** Precomputed total amount for the qualifying set (usually sum of price×qty). */
|
|
13
|
+
totalAmount: number;
|
|
14
|
+
/** Items that are considered applicable for this scheme (after applicability filtering). */
|
|
15
|
+
applicableProducts: QualifierItem[];
|
|
16
|
+
/** Whether calculation should use MRP billing payouts (use slab.mrpPayout instead of slab.payout). */
|
|
17
|
+
isMrpBilling: boolean;
|
|
18
|
+
/** Product MRP used by PercentageDiscountOnMRP schemes. */
|
|
19
|
+
productMrp: number;
|
|
20
|
+
/** Product PTR/ex-tax unit price used by PercentageDiscountOnMRP schemes. */
|
|
21
|
+
productPtr: number;
|
|
22
|
+
/** Total tax % used to convert MRP-inclusive prices to ex-tax values when needed. */
|
|
23
|
+
totalTaxPercentage: number;
|
|
24
|
+
/** Net price inputs used by PerUnitDiscount schemes (supports std/super/additional unit calculations). */
|
|
25
|
+
perUnitPrices: PerUnitPriceProps;
|
|
26
|
+
/** Price of the free/payout product when the company distributes unitary product scheme value as discount. */
|
|
27
|
+
focProductPrice?: number;
|
|
28
|
+
/** Basket definitions (groups of product IDs) referenced by basket slabs. */
|
|
29
|
+
baskets?: Basket[];
|
|
30
|
+
/** Actual basket-selected items for this order/cart (used to qualify and apply basket schemes). */
|
|
31
|
+
selectedItems?: BasketItem[];
|
|
32
|
+
/** Company rule: treat PRODUCT payout schemes as unitary discount distribution. */
|
|
33
|
+
companyUsesUnitaryProductScheme?: boolean;
|
|
34
|
+
/** Company rule: interpret step FOC logic in DMS-specific way. */
|
|
35
|
+
companyUsesStepfocSchemeInDms?: boolean;
|
|
36
|
+
/** Feature toggle: enable alternate continuous scheme logic for some FOC flows. */
|
|
37
|
+
applyContinuousSchemeLogic?: boolean;
|
|
38
|
+
/** Feature toggle: enable step-multiplier scheme logic for some FOC flows. */
|
|
39
|
+
applyStepMultiplierSchemeLogic?: boolean;
|
|
40
|
+
/** Buyer type flag used by some company flows (retailer vs other). */
|
|
41
|
+
isBuyerRetailer?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Master dispatcher: routes to the correct payout-type calculator.
|
|
45
|
+
*
|
|
46
|
+
* This is the primary public API for scheme calculation. Given a scheme
|
|
47
|
+
* and pre-computed aggregates, it returns a pure SchemeSlabResult that
|
|
48
|
+
* the caller can use to update item state.
|
|
49
|
+
*/
|
|
50
|
+
export declare function calculateSchemeSlabResult(input: CalculateSchemeSlabInput): SchemeSlabResult;
|
|
51
|
+
export { calculateDiscountPayout } from "./payout-types/discount";
|
|
52
|
+
export { calculateMrpPercentageDiscountPayout } from "./payout-types/mrp-percentage";
|
|
53
|
+
export { calculatePerUnitPayout } from "./payout-types/per-unit";
|
|
54
|
+
export { calculateFixedDiscountPayout } from "./payout-types/fixed-discount";
|
|
55
|
+
export { calculateFocPayout } from "./payout-types/foc";
|
|
56
|
+
export { calculateProductPayout } from "./payout-types/product";
|
|
57
|
+
export { calculateProductSchemeNewPayout } from "./payout-types/product-new";
|
|
58
|
+
export { calculateBasketPayout } from "./payout-types/basket";
|
|
59
|
+
export { calculateCouponPayout } from "./payout-types/coupon";
|
|
60
|
+
export { calculateTopupPayout } from "./payout-types/topup";
|
|
61
|
+
export { calculateArticlePayout } from "./payout-types/article";
|
|
62
|
+
export { calculateNlpPayout } from "./payout-types/nlp";
|
|
63
|
+
export { findMatchingSlab, findInterpolationSlabs } from "./slab-matcher";
|
|
64
|
+
export { calculateAppliedDiscountValues, recalculateSchemePercentage } from "./discount-application";
|
|
65
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/calculators/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAgB9C,MAAM,WAAW,wBAAwB;IACvC,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,oGAAoG;IACpG,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,sGAAsG;IACtG,YAAY,EAAE,OAAO,CAAC;IAGtB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,kBAAkB,EAAE,MAAM,CAAC;IAG3B,0GAA0G;IAC1G,aAAa,EAAE,iBAAiB,CAAC;IAGjC,8GAA8G;IAC9G,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mGAAmG;IACnG,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC;IAG7B,mFAAmF;IACnF,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,kEAAkE;IAClE,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,mFAAmF;IACnF,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,8EAA8E;IAC9E,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA8BD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,wBAAwB,GAAG,gBAAgB,CAmI3F;AAGD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,oCAAoC,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.recalculateSchemePercentage = exports.calculateAppliedDiscountValues = exports.findInterpolationSlabs = exports.findMatchingSlab = exports.calculateNlpPayout = exports.calculateArticlePayout = exports.calculateTopupPayout = exports.calculateCouponPayout = exports.calculateBasketPayout = exports.calculateProductSchemeNewPayout = exports.calculateProductPayout = exports.calculateFocPayout = exports.calculateFixedDiscountPayout = exports.calculatePerUnitPayout = exports.calculateMrpPercentageDiscountPayout = exports.calculateDiscountPayout = void 0;
|
|
4
|
+
exports.calculateSchemeSlabResult = calculateSchemeSlabResult;
|
|
5
|
+
const enums_1 = require("../types/enums");
|
|
6
|
+
const applied_scheme_1 = require("../types/applied-scheme");
|
|
7
|
+
const discount_1 = require("./payout-types/discount");
|
|
8
|
+
const mrp_percentage_1 = require("./payout-types/mrp-percentage");
|
|
9
|
+
const per_unit_1 = require("./payout-types/per-unit");
|
|
10
|
+
const fixed_discount_1 = require("./payout-types/fixed-discount");
|
|
11
|
+
const foc_1 = require("./payout-types/foc");
|
|
12
|
+
const product_1 = require("./payout-types/product");
|
|
13
|
+
const product_new_1 = require("./payout-types/product-new");
|
|
14
|
+
const basket_1 = require("./payout-types/basket");
|
|
15
|
+
const coupon_1 = require("./payout-types/coupon");
|
|
16
|
+
const topup_1 = require("./payout-types/topup");
|
|
17
|
+
const article_1 = require("./payout-types/article");
|
|
18
|
+
const nlp_1 = require("./payout-types/nlp");
|
|
19
|
+
/**
|
|
20
|
+
* Detects if a scheme is a GST Claim scheme based on naming conventions.
|
|
21
|
+
*/
|
|
22
|
+
function isGstClaimScheme(scheme) {
|
|
23
|
+
const GSTSchemeName = "GST Claim";
|
|
24
|
+
const hasGstBase = scheme.name.toLowerCase().trim() === GSTSchemeName.toLowerCase().trim() &&
|
|
25
|
+
(scheme.schemeSubType2 || "").toLowerCase().trim() ===
|
|
26
|
+
enums_1.SchemeSubType2.NON_CLAIMABLE.toLowerCase().trim() &&
|
|
27
|
+
scheme.payoutCalculationType.toLowerCase().trim() ===
|
|
28
|
+
enums_1.SchemePayoutCalculationType.CONTINUOUS &&
|
|
29
|
+
scheme.payoutType.toLowerCase().trim() ===
|
|
30
|
+
enums_1.SchemePayoutType.DISCOUNT.toLowerCase().trim();
|
|
31
|
+
const isPrimaryGstScheme = scheme.category === "Primary" &&
|
|
32
|
+
scheme.schemeSubType.toLowerCase().trim() ===
|
|
33
|
+
enums_1.SchemeSubType.NON_EXTENDABLE.toLowerCase().trim();
|
|
34
|
+
const isSecondaryGstScheme = scheme.category === "Secondary" &&
|
|
35
|
+
scheme.schemeSubType.toLowerCase().trim() ===
|
|
36
|
+
enums_1.SchemeSubType.EXTENDABLE.toLowerCase().trim();
|
|
37
|
+
return hasGstBase && (isPrimaryGstScheme || isSecondaryGstScheme);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Master dispatcher: routes to the correct payout-type calculator.
|
|
41
|
+
*
|
|
42
|
+
* This is the primary public API for scheme calculation. Given a scheme
|
|
43
|
+
* and pre-computed aggregates, it returns a pure SchemeSlabResult that
|
|
44
|
+
* the caller can use to update item state.
|
|
45
|
+
*/
|
|
46
|
+
function calculateSchemeSlabResult(input) {
|
|
47
|
+
const { scheme } = input;
|
|
48
|
+
const payoutType = scheme.payoutType;
|
|
49
|
+
switch (payoutType) {
|
|
50
|
+
case enums_1.SchemePayoutType.DISCOUNT:
|
|
51
|
+
return (0, discount_1.calculateDiscountPayout)({
|
|
52
|
+
scheme,
|
|
53
|
+
compareValue: input.compareValue,
|
|
54
|
+
applicableProducts: input.applicableProducts,
|
|
55
|
+
isMrpBilling: input.isMrpBilling,
|
|
56
|
+
isGstClaimScheme: isGstClaimScheme(scheme),
|
|
57
|
+
});
|
|
58
|
+
case enums_1.SchemePayoutType.PERCENTAGE_DISCOUNT_ON_MRP:
|
|
59
|
+
return (0, mrp_percentage_1.calculateMrpPercentageDiscountPayout)({
|
|
60
|
+
scheme,
|
|
61
|
+
compareValue: input.compareValue,
|
|
62
|
+
applicableProducts: input.applicableProducts,
|
|
63
|
+
isMrpBilling: input.isMrpBilling,
|
|
64
|
+
productMrp: input.productMrp,
|
|
65
|
+
productPtr: input.productPtr,
|
|
66
|
+
totalTaxPercentage: input.totalTaxPercentage,
|
|
67
|
+
});
|
|
68
|
+
case enums_1.SchemePayoutType.PERUNIT:
|
|
69
|
+
return (0, per_unit_1.calculatePerUnitPayout)({
|
|
70
|
+
scheme,
|
|
71
|
+
compareValue: input.compareValue,
|
|
72
|
+
applicableProducts: input.applicableProducts,
|
|
73
|
+
isMrpBilling: input.isMrpBilling,
|
|
74
|
+
totalTaxPercentage: input.totalTaxPercentage,
|
|
75
|
+
perUnitPrices: input.perUnitPrices,
|
|
76
|
+
});
|
|
77
|
+
case enums_1.SchemePayoutType.FIXED_DISCOUNT:
|
|
78
|
+
return (0, fixed_discount_1.calculateFixedDiscountPayout)({
|
|
79
|
+
scheme,
|
|
80
|
+
compareValue: input.compareValue,
|
|
81
|
+
totalAmount: input.totalAmount,
|
|
82
|
+
applicableProducts: input.applicableProducts,
|
|
83
|
+
isMrpBilling: input.isMrpBilling,
|
|
84
|
+
itemBaseValues: [],
|
|
85
|
+
});
|
|
86
|
+
case enums_1.SchemePayoutType.FOC:
|
|
87
|
+
case enums_1.SchemePayoutType.FOC_SLAB:
|
|
88
|
+
return (0, foc_1.calculateFocPayout)({
|
|
89
|
+
scheme,
|
|
90
|
+
compareValue: input.compareValue,
|
|
91
|
+
applicableProducts: input.applicableProducts,
|
|
92
|
+
isMrpBilling: input.isMrpBilling,
|
|
93
|
+
companyUsesStepfocSchemeInDms: input.companyUsesStepfocSchemeInDms,
|
|
94
|
+
applyContinuousSchemeLogic: input.applyContinuousSchemeLogic,
|
|
95
|
+
applyStepMultiplierSchemeLogic: input.applyStepMultiplierSchemeLogic,
|
|
96
|
+
});
|
|
97
|
+
case enums_1.SchemePayoutType.PRODUCT:
|
|
98
|
+
return (0, product_1.calculateProductPayout)({
|
|
99
|
+
scheme,
|
|
100
|
+
compareValue: input.compareValue,
|
|
101
|
+
totalAmount: input.totalAmount,
|
|
102
|
+
applicableProducts: input.applicableProducts,
|
|
103
|
+
isMrpBilling: input.isMrpBilling,
|
|
104
|
+
focProductPrice: input.focProductPrice,
|
|
105
|
+
companyUsesUnitaryProductScheme: input.companyUsesUnitaryProductScheme,
|
|
106
|
+
});
|
|
107
|
+
case enums_1.SchemePayoutType.PRODUCT_SCHEME_NEW:
|
|
108
|
+
return (0, product_new_1.calculateProductSchemeNewPayout)({
|
|
109
|
+
scheme,
|
|
110
|
+
compareValue: input.compareValue,
|
|
111
|
+
totalAmount: input.totalAmount,
|
|
112
|
+
applicableProducts: input.applicableProducts,
|
|
113
|
+
isMrpBilling: input.isMrpBilling,
|
|
114
|
+
focProductPrice: input.focProductPrice,
|
|
115
|
+
companyUsesUnitaryProductScheme: input.companyUsesUnitaryProductScheme,
|
|
116
|
+
});
|
|
117
|
+
case enums_1.SchemePayoutType.BASKET:
|
|
118
|
+
return (0, basket_1.calculateBasketPayout)({
|
|
119
|
+
scheme,
|
|
120
|
+
compareValue: input.compareValue,
|
|
121
|
+
applicableProducts: input.applicableProducts,
|
|
122
|
+
baskets: input.baskets || [],
|
|
123
|
+
selectedItems: input.selectedItems || [],
|
|
124
|
+
isMrpBilling: input.isMrpBilling,
|
|
125
|
+
});
|
|
126
|
+
case enums_1.SchemePayoutType.COUPON:
|
|
127
|
+
return (0, coupon_1.calculateCouponPayout)({
|
|
128
|
+
scheme,
|
|
129
|
+
compareValue: input.compareValue,
|
|
130
|
+
totalAmount: input.totalAmount,
|
|
131
|
+
applicableProducts: input.applicableProducts,
|
|
132
|
+
isMrpBilling: input.isMrpBilling,
|
|
133
|
+
});
|
|
134
|
+
case enums_1.SchemePayoutType.TOPUP:
|
|
135
|
+
return (0, topup_1.calculateTopupPayout)({
|
|
136
|
+
scheme,
|
|
137
|
+
compareValue: input.compareValue,
|
|
138
|
+
applicableProducts: input.applicableProducts,
|
|
139
|
+
isMrpBilling: input.isMrpBilling,
|
|
140
|
+
});
|
|
141
|
+
case enums_1.SchemePayoutType.ARTICLE:
|
|
142
|
+
return (0, article_1.calculateArticlePayout)({
|
|
143
|
+
scheme,
|
|
144
|
+
compareValue: input.compareValue,
|
|
145
|
+
totalAmount: input.totalAmount,
|
|
146
|
+
applicableProducts: input.applicableProducts,
|
|
147
|
+
isMrpBilling: input.isMrpBilling,
|
|
148
|
+
});
|
|
149
|
+
case enums_1.SchemePayoutType.NLP:
|
|
150
|
+
return (0, nlp_1.calculateNlpPayout)({
|
|
151
|
+
scheme,
|
|
152
|
+
compareValue: input.compareValue,
|
|
153
|
+
totalAmount: input.totalAmount,
|
|
154
|
+
applicableProducts: input.applicableProducts,
|
|
155
|
+
isMrpBilling: input.isMrpBilling,
|
|
156
|
+
productPtr: input.productPtr,
|
|
157
|
+
});
|
|
158
|
+
default: {
|
|
159
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(payoutType);
|
|
160
|
+
result.warnings.push(`Payout type not matching: ${payoutType}`);
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ─── Re-exports ─────────────────────────────────────────────────
|
|
166
|
+
var discount_2 = require("./payout-types/discount");
|
|
167
|
+
Object.defineProperty(exports, "calculateDiscountPayout", { enumerable: true, get: function () { return discount_2.calculateDiscountPayout; } });
|
|
168
|
+
var mrp_percentage_2 = require("./payout-types/mrp-percentage");
|
|
169
|
+
Object.defineProperty(exports, "calculateMrpPercentageDiscountPayout", { enumerable: true, get: function () { return mrp_percentage_2.calculateMrpPercentageDiscountPayout; } });
|
|
170
|
+
var per_unit_2 = require("./payout-types/per-unit");
|
|
171
|
+
Object.defineProperty(exports, "calculatePerUnitPayout", { enumerable: true, get: function () { return per_unit_2.calculatePerUnitPayout; } });
|
|
172
|
+
var fixed_discount_2 = require("./payout-types/fixed-discount");
|
|
173
|
+
Object.defineProperty(exports, "calculateFixedDiscountPayout", { enumerable: true, get: function () { return fixed_discount_2.calculateFixedDiscountPayout; } });
|
|
174
|
+
var foc_2 = require("./payout-types/foc");
|
|
175
|
+
Object.defineProperty(exports, "calculateFocPayout", { enumerable: true, get: function () { return foc_2.calculateFocPayout; } });
|
|
176
|
+
var product_2 = require("./payout-types/product");
|
|
177
|
+
Object.defineProperty(exports, "calculateProductPayout", { enumerable: true, get: function () { return product_2.calculateProductPayout; } });
|
|
178
|
+
var product_new_2 = require("./payout-types/product-new");
|
|
179
|
+
Object.defineProperty(exports, "calculateProductSchemeNewPayout", { enumerable: true, get: function () { return product_new_2.calculateProductSchemeNewPayout; } });
|
|
180
|
+
var basket_2 = require("./payout-types/basket");
|
|
181
|
+
Object.defineProperty(exports, "calculateBasketPayout", { enumerable: true, get: function () { return basket_2.calculateBasketPayout; } });
|
|
182
|
+
var coupon_2 = require("./payout-types/coupon");
|
|
183
|
+
Object.defineProperty(exports, "calculateCouponPayout", { enumerable: true, get: function () { return coupon_2.calculateCouponPayout; } });
|
|
184
|
+
var topup_2 = require("./payout-types/topup");
|
|
185
|
+
Object.defineProperty(exports, "calculateTopupPayout", { enumerable: true, get: function () { return topup_2.calculateTopupPayout; } });
|
|
186
|
+
var article_2 = require("./payout-types/article");
|
|
187
|
+
Object.defineProperty(exports, "calculateArticlePayout", { enumerable: true, get: function () { return article_2.calculateArticlePayout; } });
|
|
188
|
+
var nlp_2 = require("./payout-types/nlp");
|
|
189
|
+
Object.defineProperty(exports, "calculateNlpPayout", { enumerable: true, get: function () { return nlp_2.calculateNlpPayout; } });
|
|
190
|
+
var slab_matcher_1 = require("./slab-matcher");
|
|
191
|
+
Object.defineProperty(exports, "findMatchingSlab", { enumerable: true, get: function () { return slab_matcher_1.findMatchingSlab; } });
|
|
192
|
+
Object.defineProperty(exports, "findInterpolationSlabs", { enumerable: true, get: function () { return slab_matcher_1.findInterpolationSlabs; } });
|
|
193
|
+
var discount_application_1 = require("./discount-application");
|
|
194
|
+
Object.defineProperty(exports, "calculateAppliedDiscountValues", { enumerable: true, get: function () { return discount_application_1.calculateAppliedDiscountValues; } });
|
|
195
|
+
Object.defineProperty(exports, "recalculateSchemePercentage", { enumerable: true, get: function () { return discount_application_1.recalculateSchemePercentage; } });
|
|
196
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/calculators/index.ts"],"names":[],"mappings":";;;AAyGA,8DAmIC;AA5OD,0CAA8G;AAG9G,4DAAgE;AAMhE,sDAAkE;AAClE,kEAAqF;AACrF,sDAAiE;AACjE,kEAA6E;AAC7E,4CAAwD;AACxD,oDAAgE;AAChE,4DAA6E;AAC7E,kDAA8D;AAC9D,kDAA8D;AAC9D,gDAA4D;AAC5D,oDAAgE;AAChE,4CAAwD;AAkDxD;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,aAAa,GAAG,WAAW,CAAC;IAElC,MAAM,UAAU,GACd,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QACvE,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;YAChD,sBAAc,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QACnD,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;YAC/C,mCAA2B,CAAC,UAAU;QACxC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;YACpC,wBAAgB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAEnD,MAAM,kBAAkB,GACtB,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC7B,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;YACvC,qBAAa,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAEtD,MAAM,oBAAoB,GACxB,MAAM,CAAC,QAAQ,KAAK,WAAW;QAC/B,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;YACvC,qBAAa,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAElD,OAAO,UAAU,IAAI,CAAC,kBAAkB,IAAI,oBAAoB,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,yBAAyB,CAAC,KAA+B;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAErC,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,wBAAgB,CAAC,QAAQ;YAC5B,OAAO,IAAA,kCAAuB,EAAC;gBAC7B,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,gBAAgB,EAAE,gBAAgB,CAAC,MAAM,CAAC;aAC3C,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,0BAA0B;YAC9C,OAAO,IAAA,qDAAoC,EAAC;gBAC1C,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;aAC7C,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,OAAO;YAC3B,OAAO,IAAA,iCAAsB,EAAC;gBAC5B,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,aAAa,EAAE,KAAK,CAAC,aAAa;aACnC,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,cAAc;YAClC,OAAO,IAAA,6CAA4B,EAAC;gBAClC,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,GAAG,CAAC;QAC1B,KAAK,wBAAgB,CAAC,QAAQ;YAC5B,OAAO,IAAA,wBAAkB,EAAC;gBACxB,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,6BAA6B,EAAE,KAAK,CAAC,6BAA6B;gBAClE,0BAA0B,EAAE,KAAK,CAAC,0BAA0B;gBAC5D,8BAA8B,EAAE,KAAK,CAAC,8BAA8B;aACrE,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,OAAO;YAC3B,OAAO,IAAA,gCAAsB,EAAC;gBAC5B,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,+BAA+B,EAAE,KAAK,CAAC,+BAA+B;aACvE,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,kBAAkB;YACtC,OAAO,IAAA,6CAA+B,EAAC;gBACrC,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,+BAA+B,EAAE,KAAK,CAAC,+BAA+B;aACvE,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,MAAM;YAC1B,OAAO,IAAA,8BAAqB,EAAC;gBAC3B,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;gBAC5B,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE;gBACxC,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,MAAM;YAC1B,OAAO,IAAA,8BAAqB,EAAC;gBAC3B,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,KAAK;YACzB,OAAO,IAAA,4BAAoB,EAAC;gBAC1B,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,OAAO;YAC3B,OAAO,IAAA,gCAAsB,EAAC;gBAC5B,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CAAC;QAEL,KAAK,wBAAgB,CAAC,GAAG;YACvB,OAAO,IAAA,wBAAkB,EAAC;gBACxB,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;QAEL,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,MAAM,GAAG,IAAA,sCAAqB,EAAC,UAAU,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;YAChE,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,oDAAkE;AAAzD,mHAAA,uBAAuB,OAAA;AAChC,gEAAqF;AAA5E,sIAAA,oCAAoC,OAAA;AAC7C,oDAAiE;AAAxD,kHAAA,sBAAsB,OAAA;AAC/B,gEAA6E;AAApE,8HAAA,4BAA4B,OAAA;AACrC,0CAAwD;AAA/C,yGAAA,kBAAkB,OAAA;AAC3B,kDAAgE;AAAvD,iHAAA,sBAAsB,OAAA;AAC/B,0DAA6E;AAApE,8HAAA,+BAA+B,OAAA;AACxC,gDAA8D;AAArD,+GAAA,qBAAqB,OAAA;AAC9B,gDAA8D;AAArD,+GAAA,qBAAqB,OAAA;AAC9B,8CAA4D;AAAnD,6GAAA,oBAAoB,OAAA;AAC7B,kDAAgE;AAAvD,iHAAA,sBAAsB,OAAA;AAC/B,0CAAwD;AAA/C,yGAAA,kBAAkB,OAAA;AAC3B,+CAA0E;AAAjE,gHAAA,gBAAgB,OAAA;AAAE,sHAAA,sBAAsB,OAAA;AACjD,+DAAqG;AAA5F,sIAAA,8BAA8B,OAAA;AAAE,mIAAA,2BAA2B,OAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Scheme } from "../../types/scheme";
|
|
2
|
+
import type { SchemeSlabResult } from "../../types/applied-scheme";
|
|
3
|
+
import type { QualifierItem } from "../../helpers/qualifier-checks";
|
|
4
|
+
export interface ArticleCalculatorInput {
|
|
5
|
+
scheme: Scheme;
|
|
6
|
+
compareValue: number;
|
|
7
|
+
totalAmount: number;
|
|
8
|
+
applicableProducts: QualifierItem[];
|
|
9
|
+
isMrpBilling: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Article payout type.
|
|
13
|
+
*
|
|
14
|
+
* Semantics (from golden fixtures): payout is a per-unit value.
|
|
15
|
+
* - STEP: discountValue = payout × slab.constraint × floor(compareValue / slab.constraint)
|
|
16
|
+
* - CONTINUOUS: discountValue = payout × compareValue
|
|
17
|
+
*
|
|
18
|
+
* Returns discountPercent as an effective % on totalAmount so downstream logic can
|
|
19
|
+
* derive an amount consistently.
|
|
20
|
+
*/
|
|
21
|
+
export declare function calculateArticlePayout(): SchemeSlabResult;
|
|
22
|
+
export declare function calculateArticlePayout(input: ArticleCalculatorInput): SchemeSlabResult;
|
|
23
|
+
//# sourceMappingURL=article.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/article.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAAC;AAC3D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateArticlePayout = calculateArticlePayout;
|
|
4
|
+
const enums_1 = require("../../types/enums");
|
|
5
|
+
const applied_scheme_1 = require("../../types/applied-scheme");
|
|
6
|
+
const calc_type_checks_1 = require("../../helpers/calc-type-checks");
|
|
7
|
+
const constraint_checks_1 = require("../../helpers/constraint-checks");
|
|
8
|
+
const slab_matcher_1 = require("../slab-matcher");
|
|
9
|
+
function calculateArticlePayout(input) {
|
|
10
|
+
if (!input) {
|
|
11
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.ARTICLE);
|
|
12
|
+
result.warnings.push("Article payout type is not yet implemented");
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
const { scheme, compareValue, totalAmount, applicableProducts } = input;
|
|
16
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.ARTICLE);
|
|
17
|
+
if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
|
|
18
|
+
result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
const slabs = [...scheme.slabs].sort((a, b) => b.constraint - a.constraint);
|
|
22
|
+
if (slabs.length === 0) {
|
|
23
|
+
result.warnings.push("Slab list is empty");
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
const matcherParams = {
|
|
27
|
+
slabs,
|
|
28
|
+
compareValue,
|
|
29
|
+
applicableProducts,
|
|
30
|
+
payoutType: enums_1.SchemePayoutType.ARTICLE,
|
|
31
|
+
discountOn: scheme.discountOn ?? null,
|
|
32
|
+
};
|
|
33
|
+
const payoutCalcType = scheme.payoutCalculationType;
|
|
34
|
+
if ((0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
|
|
35
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
36
|
+
if (!match)
|
|
37
|
+
return result;
|
|
38
|
+
const { slab } = match;
|
|
39
|
+
let stepMultiplier = 0;
|
|
40
|
+
if (slab.constraint > 0) {
|
|
41
|
+
stepMultiplier = Math.floor(compareValue / slab.constraint);
|
|
42
|
+
}
|
|
43
|
+
const discountValue = slab.payout * slab.constraint * stepMultiplier;
|
|
44
|
+
let effectivePercent = 0;
|
|
45
|
+
if (totalAmount > 0) {
|
|
46
|
+
effectivePercent = (discountValue / totalAmount) * 100;
|
|
47
|
+
}
|
|
48
|
+
result.matched = true;
|
|
49
|
+
result.matchedSlabId = slab.id;
|
|
50
|
+
result.discountPercent = effectivePercent;
|
|
51
|
+
result.targetMethod = "setDiscountScheme";
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType)) {
|
|
55
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
56
|
+
if (!match)
|
|
57
|
+
return result;
|
|
58
|
+
const { slab } = match;
|
|
59
|
+
const discountValue = slab.payout * compareValue;
|
|
60
|
+
let effectivePercent = 0;
|
|
61
|
+
if (totalAmount > 0) {
|
|
62
|
+
effectivePercent = (discountValue / totalAmount) * 100;
|
|
63
|
+
}
|
|
64
|
+
result.matched = true;
|
|
65
|
+
result.matchedSlabId = slab.id;
|
|
66
|
+
result.discountPercent = effectivePercent;
|
|
67
|
+
result.targetMethod = "setDiscountScheme";
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=article.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/article.ts"],"names":[],"mappings":"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"}
|