@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.
Files changed (175) hide show
  1. package/dist/calculators/discount-application.d.ts +44 -0
  2. package/dist/calculators/discount-application.d.ts.map +1 -0
  3. package/dist/calculators/discount-application.js +174 -0
  4. package/dist/calculators/discount-application.js.map +1 -0
  5. package/dist/calculators/index.d.ts +65 -0
  6. package/dist/calculators/index.d.ts.map +1 -0
  7. package/dist/calculators/index.js +196 -0
  8. package/dist/calculators/index.js.map +1 -0
  9. package/dist/calculators/payout-types/article.d.ts +23 -0
  10. package/dist/calculators/payout-types/article.d.ts.map +1 -0
  11. package/dist/calculators/payout-types/article.js +73 -0
  12. package/dist/calculators/payout-types/article.js.map +1 -0
  13. package/dist/calculators/payout-types/basket.d.ts +49 -0
  14. package/dist/calculators/payout-types/basket.d.ts.map +1 -0
  15. package/dist/calculators/payout-types/basket.js +108 -0
  16. package/dist/calculators/payout-types/basket.js.map +1 -0
  17. package/dist/calculators/payout-types/coupon.d.ts +23 -0
  18. package/dist/calculators/payout-types/coupon.d.ts.map +1 -0
  19. package/dist/calculators/payout-types/coupon.js +74 -0
  20. package/dist/calculators/payout-types/coupon.js.map +1 -0
  21. package/dist/calculators/payout-types/discount.d.ts +21 -0
  22. package/dist/calculators/payout-types/discount.d.ts.map +1 -0
  23. package/dist/calculators/payout-types/discount.js +110 -0
  24. package/dist/calculators/payout-types/discount.js.map +1 -0
  25. package/dist/calculators/payout-types/fixed-discount.d.ts +31 -0
  26. package/dist/calculators/payout-types/fixed-discount.d.ts.map +1 -0
  27. package/dist/calculators/payout-types/fixed-discount.js +65 -0
  28. package/dist/calculators/payout-types/fixed-discount.js.map +1 -0
  29. package/dist/calculators/payout-types/foc.d.ts +30 -0
  30. package/dist/calculators/payout-types/foc.d.ts.map +1 -0
  31. package/dist/calculators/payout-types/foc.js +130 -0
  32. package/dist/calculators/payout-types/foc.js.map +1 -0
  33. package/dist/calculators/payout-types/mrp-percentage.d.ts +34 -0
  34. package/dist/calculators/payout-types/mrp-percentage.d.ts.map +1 -0
  35. package/dist/calculators/payout-types/mrp-percentage.js +77 -0
  36. package/dist/calculators/payout-types/mrp-percentage.js.map +1 -0
  37. package/dist/calculators/payout-types/nlp.d.ts +22 -0
  38. package/dist/calculators/payout-types/nlp.d.ts.map +1 -0
  39. package/dist/calculators/payout-types/nlp.js +59 -0
  40. package/dist/calculators/payout-types/nlp.js.map +1 -0
  41. package/dist/calculators/payout-types/per-unit.d.ts +32 -0
  42. package/dist/calculators/payout-types/per-unit.d.ts.map +1 -0
  43. package/dist/calculators/payout-types/per-unit.js +94 -0
  44. package/dist/calculators/payout-types/per-unit.js.map +1 -0
  45. package/dist/calculators/payout-types/product-new.d.ts +27 -0
  46. package/dist/calculators/payout-types/product-new.d.ts.map +1 -0
  47. package/dist/calculators/payout-types/product-new.js +85 -0
  48. package/dist/calculators/payout-types/product-new.js.map +1 -0
  49. package/dist/calculators/payout-types/product.d.ts +31 -0
  50. package/dist/calculators/payout-types/product.d.ts.map +1 -0
  51. package/dist/calculators/payout-types/product.js +73 -0
  52. package/dist/calculators/payout-types/product.js.map +1 -0
  53. package/dist/calculators/payout-types/topup.d.ts +19 -0
  54. package/dist/calculators/payout-types/topup.d.ts.map +1 -0
  55. package/dist/calculators/payout-types/topup.js +46 -0
  56. package/dist/calculators/payout-types/topup.js.map +1 -0
  57. package/dist/calculators/slab-matcher.d.ts +41 -0
  58. package/dist/calculators/slab-matcher.d.ts.map +1 -0
  59. package/dist/calculators/slab-matcher.js +68 -0
  60. package/dist/calculators/slab-matcher.js.map +1 -0
  61. package/dist/esm/calculators/discount-application.js +170 -0
  62. package/dist/esm/calculators/discount-application.js.map +1 -0
  63. package/dist/esm/calculators/index.js +176 -0
  64. package/dist/esm/calculators/index.js.map +1 -0
  65. package/dist/esm/calculators/payout-types/article.js +70 -0
  66. package/dist/esm/calculators/payout-types/article.js.map +1 -0
  67. package/dist/esm/calculators/payout-types/basket.js +105 -0
  68. package/dist/esm/calculators/payout-types/basket.js.map +1 -0
  69. package/dist/esm/calculators/payout-types/coupon.js +71 -0
  70. package/dist/esm/calculators/payout-types/coupon.js.map +1 -0
  71. package/dist/esm/calculators/payout-types/discount.js +107 -0
  72. package/dist/esm/calculators/payout-types/discount.js.map +1 -0
  73. package/dist/esm/calculators/payout-types/fixed-discount.js +62 -0
  74. package/dist/esm/calculators/payout-types/fixed-discount.js.map +1 -0
  75. package/dist/esm/calculators/payout-types/foc.js +127 -0
  76. package/dist/esm/calculators/payout-types/foc.js.map +1 -0
  77. package/dist/esm/calculators/payout-types/mrp-percentage.js +74 -0
  78. package/dist/esm/calculators/payout-types/mrp-percentage.js.map +1 -0
  79. package/dist/esm/calculators/payout-types/nlp.js +56 -0
  80. package/dist/esm/calculators/payout-types/nlp.js.map +1 -0
  81. package/dist/esm/calculators/payout-types/per-unit.js +91 -0
  82. package/dist/esm/calculators/payout-types/per-unit.js.map +1 -0
  83. package/dist/esm/calculators/payout-types/product-new.js +82 -0
  84. package/dist/esm/calculators/payout-types/product-new.js.map +1 -0
  85. package/dist/esm/calculators/payout-types/product.js +70 -0
  86. package/dist/esm/calculators/payout-types/product.js.map +1 -0
  87. package/dist/esm/calculators/payout-types/topup.js +43 -0
  88. package/dist/esm/calculators/payout-types/topup.js.map +1 -0
  89. package/dist/esm/calculators/slab-matcher.js +64 -0
  90. package/dist/esm/calculators/slab-matcher.js.map +1 -0
  91. package/dist/esm/helpers/calc-type-checks.js +30 -0
  92. package/dist/esm/helpers/calc-type-checks.js.map +1 -0
  93. package/dist/esm/helpers/compare-value.js +109 -0
  94. package/dist/esm/helpers/compare-value.js.map +1 -0
  95. package/dist/esm/helpers/constraint-checks.js +67 -0
  96. package/dist/esm/helpers/constraint-checks.js.map +1 -0
  97. package/dist/esm/helpers/index.js +8 -0
  98. package/dist/esm/helpers/index.js.map +1 -0
  99. package/dist/esm/helpers/math.js +84 -0
  100. package/dist/esm/helpers/math.js.map +1 -0
  101. package/dist/esm/helpers/payout-type-checks.js +29 -0
  102. package/dist/esm/helpers/payout-type-checks.js.map +1 -0
  103. package/dist/esm/helpers/qualifier-checks.js +188 -0
  104. package/dist/esm/helpers/qualifier-checks.js.map +1 -0
  105. package/dist/esm/helpers/scheme-applicability.js +93 -0
  106. package/dist/esm/helpers/scheme-applicability.js.map +1 -0
  107. package/dist/esm/index.js +10 -0
  108. package/dist/esm/index.js.map +1 -0
  109. package/dist/esm/types/applied-scheme.js +19 -0
  110. package/dist/esm/types/applied-scheme.js.map +1 -0
  111. package/dist/esm/types/enums.js +115 -0
  112. package/dist/esm/types/enums.js.map +1 -0
  113. package/dist/esm/types/index.js +5 -0
  114. package/dist/esm/types/index.js.map +1 -0
  115. package/dist/esm/types/item-props.js +2 -0
  116. package/dist/esm/types/item-props.js.map +1 -0
  117. package/dist/esm/types/scheme.js +2 -0
  118. package/dist/esm/types/scheme.js.map +1 -0
  119. package/dist/helpers/calc-type-checks.d.ts +21 -0
  120. package/dist/helpers/calc-type-checks.d.ts.map +1 -0
  121. package/dist/helpers/calc-type-checks.js +36 -0
  122. package/dist/helpers/calc-type-checks.js.map +1 -0
  123. package/dist/helpers/compare-value.d.ts +40 -0
  124. package/dist/helpers/compare-value.d.ts.map +1 -0
  125. package/dist/helpers/compare-value.js +120 -0
  126. package/dist/helpers/compare-value.js.map +1 -0
  127. package/dist/helpers/constraint-checks.d.ts +30 -0
  128. package/dist/helpers/constraint-checks.d.ts.map +1 -0
  129. package/dist/helpers/constraint-checks.js +73 -0
  130. package/dist/helpers/constraint-checks.js.map +1 -0
  131. package/dist/helpers/index.d.ts +8 -0
  132. package/dist/helpers/index.d.ts.map +1 -0
  133. package/dist/helpers/index.js +24 -0
  134. package/dist/helpers/index.js.map +1 -0
  135. package/dist/helpers/math.d.ts +50 -0
  136. package/dist/helpers/math.d.ts.map +1 -0
  137. package/dist/helpers/math.js +96 -0
  138. package/dist/helpers/math.js.map +1 -0
  139. package/dist/helpers/payout-type-checks.d.ts +17 -0
  140. package/dist/helpers/payout-type-checks.d.ts.map +1 -0
  141. package/dist/helpers/payout-type-checks.js +34 -0
  142. package/dist/helpers/payout-type-checks.js.map +1 -0
  143. package/dist/helpers/qualifier-checks.d.ts +62 -0
  144. package/dist/helpers/qualifier-checks.d.ts.map +1 -0
  145. package/dist/helpers/qualifier-checks.js +194 -0
  146. package/dist/helpers/qualifier-checks.js.map +1 -0
  147. package/dist/helpers/scheme-applicability.d.ts +40 -0
  148. package/dist/helpers/scheme-applicability.d.ts.map +1 -0
  149. package/dist/helpers/scheme-applicability.js +99 -0
  150. package/dist/helpers/scheme-applicability.js.map +1 -0
  151. package/dist/index.d.ts +4 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +26 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/types/applied-scheme.d.ts +157 -0
  156. package/dist/types/applied-scheme.d.ts.map +1 -0
  157. package/dist/types/applied-scheme.js +22 -0
  158. package/dist/types/applied-scheme.js.map +1 -0
  159. package/dist/types/enums.d.ts +91 -0
  160. package/dist/types/enums.d.ts.map +1 -0
  161. package/dist/types/enums.js +118 -0
  162. package/dist/types/enums.js.map +1 -0
  163. package/dist/types/index.d.ts +5 -0
  164. package/dist/types/index.d.ts.map +1 -0
  165. package/dist/types/index.js +21 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/dist/types/item-props.d.ts +103 -0
  168. package/dist/types/item-props.d.ts.map +1 -0
  169. package/dist/types/item-props.js +3 -0
  170. package/dist/types/item-props.js.map +1 -0
  171. package/dist/types/scheme.d.ts +172 -0
  172. package/dist/types/scheme.d.ts.map +1 -0
  173. package/dist/types/scheme.js +3 -0
  174. package/dist/types/scheme.js.map +1 -0
  175. package/package.json +29 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraint-checks.js","sourceRoot":"","sources":["../../src/helpers/constraint-checks.ts"],"names":[],"mappings":";;AAOA,sDASC;AAsBD,kDAeC;AAMD,kFAmBC;AAMD,oEAMC;AA1FD,0CAAwE;AAGxE;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,cAAsB;IAC1D,OAAO,CACL,cAAc,KAAK,4BAAoB,CAAC,QAAQ;QAChD,cAAc,KAAK,4BAAoB,CAAC,MAAM;QAC9C,cAAc,KAAK,4BAAoB,CAAC,QAAQ;QAChD,cAAc,KAAK,4BAAoB,CAAC,eAAe;QACvD,cAAc,KAAK,4BAAoB,CAAC,UAAU;QAClD,cAAc,KAAK,4BAAoB,CAAC,eAAe,CACxD,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,6BAA6B,GAAwB,IAAI,GAAG,CAAC;IACjE,wBAAgB,CAAC,GAAG;IACpB,wBAAgB,CAAC,QAAQ;IACzB,wBAAgB,CAAC,OAAO;IACxB,wBAAgB,CAAC,kBAAkB;IACnC,wBAAgB,CAAC,KAAK;CACvB,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,SAAgB,mBAAmB,CACjC,YAAoB,EACpB,IAAU,EACV,UAAsC;IAEtC,IAAI,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uDAAuD;IACvD,IAAI,UAAU,IAAI,6BAA6B,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACtF,OAAO,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAgB,mCAAmC,CACjD,QAAgB,EAChB,cAAsB,EACtB,QAAgB;IAEhB,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG;QACvB,4BAAoB,CAAC,MAAM;QAC3B,4BAAoB,CAAC,QAAQ;QAC7B,4BAAoB,CAAC,QAAQ;QAC7B,4BAAoB,CAAC,UAAU;KAChC,CAAC;IACF,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAErD,OAAO,CACL,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACjC,gBAA6B,CAAC,QAAQ,CAAC,cAAc,CAAC;QACvD,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAClC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,4BAA4B,CAC1C,QAAgB,EAChB,cAAsB,EACtB,QAAgB;IAEhB,OAAO,mCAAmC,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./calc-type-checks";
2
+ export * from "./payout-type-checks";
3
+ export * from "./constraint-checks";
4
+ export * from "./qualifier-checks";
5
+ export * from "./scheme-applicability";
6
+ export * from "./math";
7
+ export * from "./compare-value";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./calc-type-checks"), exports);
18
+ __exportStar(require("./payout-type-checks"), exports);
19
+ __exportStar(require("./constraint-checks"), exports);
20
+ __exportStar(require("./qualifier-checks"), exports);
21
+ __exportStar(require("./scheme-applicability"), exports);
22
+ __exportStar(require("./math"), exports);
23
+ __exportStar(require("./compare-value"), exports);
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,uDAAqC;AACrC,sDAAoC;AACpC,qDAAmC;AACnC,yDAAuC;AACvC,yCAAuB;AACvB,kDAAgC"}
@@ -0,0 +1,50 @@
1
+ import type { Slab } from "../types/scheme";
2
+ /**
3
+ * Calculate discount value from a base value and percent.
4
+ * Pure equivalent of BaseOrderItem.calculateDiscount().
5
+ */
6
+ export declare function calculateDiscount(baseValue: number, discountPercent: number | null): number;
7
+ /**
8
+ * Calculate FOC discount value — same formula but without toFixed rounding.
9
+ * Pure equivalent of BaseOrderItem.calculateFocDiscount().
10
+ */
11
+ export declare function calculateFocDiscount(baseValue: number, discountPercent: number | null): number;
12
+ /**
13
+ * Calculate discount percent from base value and discount value.
14
+ * Pure equivalent of BaseOrderItem.calculateDiscountPercent().
15
+ */
16
+ export declare function calculateDiscountPercent(baseValue: number, discountValue: number | null): number;
17
+ /**
18
+ * Calculate after-markup discount value.
19
+ * Pure equivalent of BaseOrderItem.calculateAfterMarkupDiscountValue().
20
+ */
21
+ export declare function calculateAfterMarkupDiscountValue(baseValue: number, discountPercent: number | null): number;
22
+ /**
23
+ * Calculate markup discount.
24
+ * Pure equivalent of BaseOrderItem.calculateMarkupDiscount().
25
+ */
26
+ export declare function calculateMarkupDiscount(baseValue: number, discountPercent: number): number;
27
+ /**
28
+ * Calculate step multiplier discount for FOC schemes.
29
+ * Handles both multiplierStepSize and fallback ratio-based calculation.
30
+ */
31
+ export declare function calculateStepMultiplierDiscount(purchasedQty: number, slab: Slab): number;
32
+ /**
33
+ * Calculate continuous FOC payout using linear interpolation.
34
+ * Formula: payout + floor((payout / constraint) * (compareValue - constraint))
35
+ */
36
+ export declare function calculatePayoutForFocContinuousScheme(constraint: number, payout: number, compareValue: number): number;
37
+ /**
38
+ * Format a price to 2 decimal places.
39
+ */
40
+ export declare function formatPrice(value: number): string;
41
+ /**
42
+ * Fixed decimal precision.
43
+ */
44
+ export declare function fixedDecimal(value: number, decimals: number): number;
45
+ /**
46
+ * Clamp a value to be at least 0.
47
+ * Bug 7 fix: prevents negative discount values.
48
+ */
49
+ export declare function clampNonNegative(value: number): number;
50
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE3F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE9F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEhG;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE3G;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAI1F;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAgBxF;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateDiscount = calculateDiscount;
4
+ exports.calculateFocDiscount = calculateFocDiscount;
5
+ exports.calculateDiscountPercent = calculateDiscountPercent;
6
+ exports.calculateAfterMarkupDiscountValue = calculateAfterMarkupDiscountValue;
7
+ exports.calculateMarkupDiscount = calculateMarkupDiscount;
8
+ exports.calculateStepMultiplierDiscount = calculateStepMultiplierDiscount;
9
+ exports.calculatePayoutForFocContinuousScheme = calculatePayoutForFocContinuousScheme;
10
+ exports.formatPrice = formatPrice;
11
+ exports.fixedDecimal = fixedDecimal;
12
+ exports.clampNonNegative = clampNonNegative;
13
+ /**
14
+ * Calculate discount value from a base value and percent.
15
+ * Pure equivalent of BaseOrderItem.calculateDiscount().
16
+ */
17
+ function calculateDiscount(baseValue, discountPercent) {
18
+ return Number((((baseValue || 0) * (discountPercent || 0)) / 100).toFixed(2));
19
+ }
20
+ /**
21
+ * Calculate FOC discount value — same formula but without toFixed rounding.
22
+ * Pure equivalent of BaseOrderItem.calculateFocDiscount().
23
+ */
24
+ function calculateFocDiscount(baseValue, discountPercent) {
25
+ return Number(((baseValue || 0) * (discountPercent ?? 0)) / 100);
26
+ }
27
+ /**
28
+ * Calculate discount percent from base value and discount value.
29
+ * Pure equivalent of BaseOrderItem.calculateDiscountPercent().
30
+ */
31
+ function calculateDiscountPercent(baseValue, discountValue) {
32
+ return Number((((discountValue || 0) / (baseValue || 0)) * 100).toFixed(2));
33
+ }
34
+ /**
35
+ * Calculate after-markup discount value.
36
+ * Pure equivalent of BaseOrderItem.calculateAfterMarkupDiscountValue().
37
+ */
38
+ function calculateAfterMarkupDiscountValue(baseValue, discountPercent) {
39
+ return Number(((baseValue || 0) / (1 + (discountPercent || 0) / 100)).toFixed(2));
40
+ }
41
+ /**
42
+ * Calculate markup discount.
43
+ * Pure equivalent of BaseOrderItem.calculateMarkupDiscount().
44
+ */
45
+ function calculateMarkupDiscount(baseValue, discountPercent) {
46
+ const discountValue = discountPercent / 100;
47
+ const markUpValue = baseValue / (1 + discountValue);
48
+ return baseValue - markUpValue;
49
+ }
50
+ /**
51
+ * Calculate step multiplier discount for FOC schemes.
52
+ * Handles both multiplierStepSize and fallback ratio-based calculation.
53
+ */
54
+ function calculateStepMultiplierDiscount(purchasedQty, slab) {
55
+ if (slab.multiplierStepSize && slab.multiplierStepSize > 0) {
56
+ const payoutPerAdditionalStep = (slab.payout * slab.multiplierStepSize) / slab.constraint;
57
+ const stepAboveBase = Math.floor((purchasedQty - slab.constraint) / slab.multiplierStepSize);
58
+ const payoutAboveBase = stepAboveBase * payoutPerAdditionalStep;
59
+ const totalPayout = slab.payout + payoutAboveBase;
60
+ return Math.floor(totalPayout);
61
+ }
62
+ else {
63
+ const ratio = slab.payout / slab.constraint;
64
+ const multiples = Math.floor(purchasedQty / slab.constraint);
65
+ const eligibleQty = multiples * slab.constraint;
66
+ return Math.floor(eligibleQty * ratio);
67
+ }
68
+ }
69
+ /**
70
+ * Calculate continuous FOC payout using linear interpolation.
71
+ * Formula: payout + floor((payout / constraint) * (compareValue - constraint))
72
+ */
73
+ function calculatePayoutForFocContinuousScheme(constraint, payout, compareValue) {
74
+ const payoutValue = (payout / constraint) * (compareValue - constraint);
75
+ return payout + Math.floor(Number(payoutValue));
76
+ }
77
+ /**
78
+ * Format a price to 2 decimal places.
79
+ */
80
+ function formatPrice(value) {
81
+ return value.toFixed(2);
82
+ }
83
+ /**
84
+ * Fixed decimal precision.
85
+ */
86
+ function fixedDecimal(value, decimals) {
87
+ return Number(value.toFixed(decimals));
88
+ }
89
+ /**
90
+ * Clamp a value to be at least 0.
91
+ * Bug 7 fix: prevents negative discount values.
92
+ */
93
+ function clampNonNegative(value) {
94
+ return Math.max(0, value);
95
+ }
96
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { SchemePayoutType } from "../types/enums";
2
+ /**
3
+ * Checks whether a scheme payout type involves free-of-cost product.
4
+ * Matches: FOC, FOCSlab, Product, CouponScheme, ProductSchemeNew
5
+ * Accepts string to be interoperable with both backend and frontend enum types.
6
+ */
7
+ export declare function isFocTypePayoutScheme(payoutType: SchemePayoutType | string): boolean;
8
+ /**
9
+ * Checks if scheme payout type is PercentageDiscountOnMRP.
10
+ */
11
+ export declare function isPercentDiscountOnMRPTypePayoutScheme(payoutType: SchemePayoutType | string): boolean;
12
+ /**
13
+ * Checks if scheme payout type is a product-based type
14
+ * (PRODUCT, PRODUCT_SCHEME_NEW, COUPON).
15
+ */
16
+ export declare function isProductSchemePayoutType(payoutType: SchemePayoutType | string): boolean;
17
+ //# sourceMappingURL=payout-type-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payout-type-checks.d.ts","sourceRoot":"","sources":["../../src/helpers/payout-type-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAQpF;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,gBAAgB,GAAG,MAAM,GACpC,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAMxF"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isFocTypePayoutScheme = isFocTypePayoutScheme;
4
+ exports.isPercentDiscountOnMRPTypePayoutScheme = isPercentDiscountOnMRPTypePayoutScheme;
5
+ exports.isProductSchemePayoutType = isProductSchemePayoutType;
6
+ const enums_1 = require("../types/enums");
7
+ /**
8
+ * Checks whether a scheme payout type involves free-of-cost product.
9
+ * Matches: FOC, FOCSlab, Product, CouponScheme, ProductSchemeNew
10
+ * Accepts string to be interoperable with both backend and frontend enum types.
11
+ */
12
+ function isFocTypePayoutScheme(payoutType) {
13
+ return (payoutType === enums_1.SchemePayoutType.FOC ||
14
+ payoutType === enums_1.SchemePayoutType.FOC_SLAB ||
15
+ payoutType === enums_1.SchemePayoutType.PRODUCT ||
16
+ payoutType === enums_1.SchemePayoutType.COUPON ||
17
+ payoutType === enums_1.SchemePayoutType.PRODUCT_SCHEME_NEW);
18
+ }
19
+ /**
20
+ * Checks if scheme payout type is PercentageDiscountOnMRP.
21
+ */
22
+ function isPercentDiscountOnMRPTypePayoutScheme(payoutType) {
23
+ return payoutType === enums_1.SchemePayoutType.PERCENTAGE_DISCOUNT_ON_MRP;
24
+ }
25
+ /**
26
+ * Checks if scheme payout type is a product-based type
27
+ * (PRODUCT, PRODUCT_SCHEME_NEW, COUPON).
28
+ */
29
+ function isProductSchemePayoutType(payoutType) {
30
+ return (payoutType === enums_1.SchemePayoutType.PRODUCT ||
31
+ payoutType === enums_1.SchemePayoutType.PRODUCT_SCHEME_NEW ||
32
+ payoutType === enums_1.SchemePayoutType.COUPON);
33
+ }
34
+ //# sourceMappingURL=payout-type-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payout-type-checks.js","sourceRoot":"","sources":["../../src/helpers/payout-type-checks.ts"],"names":[],"mappings":";;AAOA,sDAQC;AAKD,wFAIC;AAMD,8DAMC;AApCD,0CAAkD;AAElD;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,UAAqC;IACzE,OAAO,CACL,UAAU,KAAK,wBAAgB,CAAC,GAAG;QACnC,UAAU,KAAK,wBAAgB,CAAC,QAAQ;QACxC,UAAU,KAAK,wBAAgB,CAAC,OAAO;QACvC,UAAU,KAAK,wBAAgB,CAAC,MAAM;QACtC,UAAU,KAAK,wBAAgB,CAAC,kBAAkB,CACnD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,sCAAsC,CACpD,UAAqC;IAErC,OAAO,UAAU,KAAK,wBAAgB,CAAC,0BAA0B,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,UAAqC;IAC7E,OAAO,CACL,UAAU,KAAK,wBAAgB,CAAC,OAAO;QACvC,UAAU,KAAK,wBAAgB,CAAC,kBAAkB;QAClD,UAAU,KAAK,wBAAgB,CAAC,MAAM,CACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { ThirdQualifierType, SchemePayoutType } from "../types/enums";
2
+ import type { FirstQualifier } from "../types/scheme";
3
+ export interface QualifierItem {
4
+ /** SKU id used for product-level qualifiers. */
5
+ productId: number;
6
+ /** Primary category id used for category-level qualifiers. */
7
+ primaryCategoryId: number;
8
+ /** Secondary category id used for category-level qualifiers. */
9
+ secondaryCategoryId: number;
10
+ /** Alternate category/group string used by some legacy schemes. */
11
+ category1: string | null;
12
+ /** Attribute text 1 used for attribute-based qualifiers. */
13
+ productAttributeText1: string | null;
14
+ /** Quantity for the item within the qualifying set (units/cases depending on caller mapping). */
15
+ quantity: number;
16
+ /** Unit price used for amount-based constraints (PTR/ex-tax in most flows). */
17
+ price: number;
18
+ /** Whether this item is saleable/must-sell (qualifier can require must-sell). */
19
+ isSaleable: boolean;
20
+ /** Optional MRP batch identifier for batch-qualified schemes. */
21
+ mrpBatch?: string;
22
+ }
23
+ /**
24
+ * Checks if the first qualifier prerequisites are met.
25
+ * All qualifiers must match for the check to pass.
26
+ */
27
+ export declare function checkFirstQualifier(firstQualifier: FirstQualifier[] | null, applicableProducts: QualifierItem[]): boolean;
28
+ /**
29
+ * Checks first qualifier for FOC schemes.
30
+ * Uses summed quantity across matching products.
31
+ */
32
+ export declare function checkFirstQualifierForFOC(firstQualifier: FirstQualifier[] | null, applicableProducts: QualifierItem[]): boolean;
33
+ /**
34
+ * Checks first qualifier for Discount schemes.
35
+ * Checks that constraint qty is met across matching products.
36
+ */
37
+ export declare function checkFirstQualifierForDiscount(firstQualifier: FirstQualifier[] | null, applicableProducts: QualifierItem[], slabConstraint: number): boolean;
38
+ export interface QualifierCheckParams {
39
+ /** Secondary qualifier numeric value from slab (legacy). */
40
+ secondQualifier: number;
41
+ /** Type indicator for secondary qualifier (defines how secondQualifier is interpreted). */
42
+ secondQualifierType: number | null;
43
+ /** Discount-on mode (e.g. group scheme) affecting how qualifiers are evaluated. */
44
+ discountOn: number | null;
45
+ /** First qualifier rules that must pass (product/category/attribute + qty + must-sell). */
46
+ firstQualifier: FirstQualifier[] | null;
47
+ /** Third qualifier values (additional gating thresholds). */
48
+ thirdQualifier: number[] | null;
49
+ /** Third qualifier type (value vs quantity). */
50
+ thirdQualifierType: ThirdQualifierType | null;
51
+ /** Payout type of the scheme; influences which qualifier algorithm is used. */
52
+ schemePayoutType?: SchemePayoutType | string;
53
+ /** Slab constraint value, passed through for payout-type-specific qualifier checks. */
54
+ slabConstraint?: number;
55
+ }
56
+ /**
57
+ * Checks if secondary category filter, first qualifier, and third qualifier all pass.
58
+ *
59
+ * Bug 2 fix: Uses secondQualifierType (not secondQualifier) for the type check.
60
+ */
61
+ export declare function checkIfSecondaryCategoryFilterPassed(params: QualifierCheckParams, applicableProducts: QualifierItem[]): boolean;
62
+ //# sourceMappingURL=qualifier-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualifier-checks.d.ts","sourceRoot":"","sources":["../../src/helpers/qualifier-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4DAA4D;IAC5D,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,iGAAiG;IACjG,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,UAAU,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,EACvC,kBAAkB,EAAE,aAAa,EAAE,GAClC,OAAO,CAkET;AAID;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,EACvC,kBAAkB,EAAE,aAAa,EAAE,GAClC,OAAO,CA2BT;AAID;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,EACvC,kBAAkB,EAAE,aAAa,EAAE,EACnC,cAAc,EAAE,MAAM,GACrB,OAAO,CA2BT;AAID,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,eAAe,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,mFAAmF;IACnF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,2FAA2F;IAC3F,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IACxC,6DAA6D;IAC7D,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,gDAAgD;IAChD,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAC7C,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,oBAAoB,EAC5B,kBAAkB,EAAE,aAAa,EAAE,GAClC,OAAO,CAmET"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkFirstQualifier = checkFirstQualifier;
4
+ exports.checkFirstQualifierForFOC = checkFirstQualifierForFOC;
5
+ exports.checkFirstQualifierForDiscount = checkFirstQualifierForDiscount;
6
+ exports.checkIfSecondaryCategoryFilterPassed = checkIfSecondaryCategoryFilterPassed;
7
+ const enums_1 = require("../types/enums");
8
+ // ─── First Qualifier Check (standard) ───────────────────────────
9
+ /**
10
+ * Checks if the first qualifier prerequisites are met.
11
+ * All qualifiers must match for the check to pass.
12
+ */
13
+ function checkFirstQualifier(firstQualifier, applicableProducts) {
14
+ const qualifiers = firstQualifier || [];
15
+ if (qualifiers.length === 0)
16
+ return true;
17
+ let count = 0;
18
+ for (const fq of qualifiers) {
19
+ let matched = false;
20
+ for (const item of applicableProducts) {
21
+ if (fq.entityType === enums_1.EntityType.product) {
22
+ if (item.productId == fq.entity &&
23
+ item.quantity >= fq.quantity &&
24
+ (!fq.batch || item.mrpBatch == fq.batch) &&
25
+ item.isSaleable === fq.isMustSell) {
26
+ matched = true;
27
+ break;
28
+ }
29
+ }
30
+ else if (fq.entityType === enums_1.EntityType.primaryCategory) {
31
+ if (item.primaryCategoryId == fq.entity &&
32
+ item.quantity >= fq.quantity &&
33
+ item.isSaleable === fq.isMustSell) {
34
+ matched = true;
35
+ break;
36
+ }
37
+ }
38
+ else if (fq.entityType === enums_1.EntityType.secondaryCategory) {
39
+ if (item.secondaryCategoryId == fq.entity &&
40
+ item.quantity >= fq.quantity &&
41
+ item.isSaleable === fq.isMustSell) {
42
+ matched = true;
43
+ break;
44
+ }
45
+ }
46
+ else if (fq.entityType === enums_1.EntityType.alternateCategory) {
47
+ if (item.category1 == fq.entity &&
48
+ item.quantity >= fq.quantity &&
49
+ item.isSaleable === fq.isMustSell) {
50
+ matched = true;
51
+ break;
52
+ }
53
+ }
54
+ else if (fq.entityType === enums_1.EntityType.attributeText1) {
55
+ if (item.productAttributeText1 == fq.entity &&
56
+ item.quantity >= fq.quantity &&
57
+ item.isSaleable === fq.isMustSell) {
58
+ matched = true;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ if (matched) {
64
+ count++;
65
+ }
66
+ else {
67
+ break;
68
+ }
69
+ }
70
+ return count === qualifiers.length;
71
+ }
72
+ // ─── First Qualifier Check for FOC ──────────────────────────────
73
+ /**
74
+ * Checks first qualifier for FOC schemes.
75
+ * Uses summed quantity across matching products.
76
+ */
77
+ function checkFirstQualifierForFOC(firstQualifier, applicableProducts) {
78
+ const qualifiers = firstQualifier || [];
79
+ if (qualifiers.length === 0)
80
+ return true;
81
+ for (const fq of qualifiers) {
82
+ let totalMatchedQty = 0;
83
+ for (const item of applicableProducts) {
84
+ if (fq.entityType === enums_1.EntityType.product && item.productId == fq.entity) {
85
+ totalMatchedQty += item.quantity;
86
+ }
87
+ else if (fq.entityType === enums_1.EntityType.primaryCategory && item.primaryCategoryId == fq.entity) {
88
+ totalMatchedQty += item.quantity;
89
+ }
90
+ else if (fq.entityType === enums_1.EntityType.secondaryCategory && item.secondaryCategoryId == fq.entity) {
91
+ totalMatchedQty += item.quantity;
92
+ }
93
+ else if (fq.entityType === enums_1.EntityType.alternateCategory && item.category1 == fq.entity) {
94
+ totalMatchedQty += item.quantity;
95
+ }
96
+ else if (fq.entityType === enums_1.EntityType.attributeText1 && item.productAttributeText1 == fq.entity) {
97
+ totalMatchedQty += item.quantity;
98
+ }
99
+ }
100
+ if (totalMatchedQty < fq.quantity) {
101
+ return false;
102
+ }
103
+ }
104
+ return true;
105
+ }
106
+ // ─── First Qualifier Check for Discount ─────────────────────────
107
+ /**
108
+ * Checks first qualifier for Discount schemes.
109
+ * Checks that constraint qty is met across matching products.
110
+ */
111
+ function checkFirstQualifierForDiscount(firstQualifier, applicableProducts, slabConstraint) {
112
+ const qualifiers = firstQualifier || [];
113
+ if (qualifiers.length === 0)
114
+ return true;
115
+ for (const fq of qualifiers) {
116
+ let totalMatchedQty = 0;
117
+ for (const item of applicableProducts) {
118
+ if (fq.entityType === enums_1.EntityType.product && item.productId == fq.entity) {
119
+ totalMatchedQty += item.quantity;
120
+ }
121
+ else if (fq.entityType === enums_1.EntityType.primaryCategory && item.primaryCategoryId == fq.entity) {
122
+ totalMatchedQty += item.quantity;
123
+ }
124
+ else if (fq.entityType === enums_1.EntityType.secondaryCategory && item.secondaryCategoryId == fq.entity) {
125
+ totalMatchedQty += item.quantity;
126
+ }
127
+ else if (fq.entityType === enums_1.EntityType.alternateCategory && item.category1 == fq.entity) {
128
+ totalMatchedQty += item.quantity;
129
+ }
130
+ else if (fq.entityType === enums_1.EntityType.attributeText1 && item.productAttributeText1 == fq.entity) {
131
+ totalMatchedQty += item.quantity;
132
+ }
133
+ }
134
+ if (totalMatchedQty < fq.quantity) {
135
+ return false;
136
+ }
137
+ }
138
+ return true;
139
+ }
140
+ /**
141
+ * Checks if secondary category filter, first qualifier, and third qualifier all pass.
142
+ *
143
+ * Bug 2 fix: Uses secondQualifierType (not secondQualifier) for the type check.
144
+ */
145
+ function checkIfSecondaryCategoryFilterPassed(params, applicableProducts) {
146
+ const { secondQualifier, secondQualifierType, discountOn, firstQualifier, thirdQualifier, thirdQualifierType, schemePayoutType, slabConstraint, } = params;
147
+ let firstQualifierPassed = true;
148
+ let secondQualifierPassed = true;
149
+ let thirdQualifierPassed = true;
150
+ // First qualifier check (only for GroupScheme discount-on type)
151
+ if (discountOn === enums_1.DiscountOnType.GroupScheme) {
152
+ if (schemePayoutType === enums_1.SchemePayoutType.FOC) {
153
+ firstQualifierPassed = checkFirstQualifierForFOC(firstQualifier, applicableProducts);
154
+ }
155
+ else if (schemePayoutType === enums_1.SchemePayoutType.DISCOUNT) {
156
+ firstQualifierPassed = checkFirstQualifierForDiscount(firstQualifier, applicableProducts, slabConstraint ?? 0);
157
+ }
158
+ else {
159
+ firstQualifierPassed = checkFirstQualifier(firstQualifier, applicableProducts);
160
+ }
161
+ }
162
+ // Second qualifier check
163
+ if (secondQualifierType === enums_1.SecondQualifierType.LPC) {
164
+ if (applicableProducts.length < secondQualifier) {
165
+ secondQualifierPassed = false;
166
+ }
167
+ }
168
+ else if (secondQualifier) {
169
+ const uniqueAltCategoryIds = new Set(applicableProducts.map((v) => v.category1));
170
+ if (uniqueAltCategoryIds.size < secondQualifier) {
171
+ secondQualifierPassed = false;
172
+ }
173
+ }
174
+ // Third qualifier check
175
+ if (thirdQualifier && thirdQualifier.length === 2) {
176
+ if (thirdQualifierType === enums_1.ThirdQualifierType.VALUE) {
177
+ const totalAmount = applicableProducts.reduce((prev, curr) => prev + curr.price * curr.quantity, 0);
178
+ if (totalAmount < thirdQualifier[0] || totalAmount > thirdQualifier[1]) {
179
+ thirdQualifierPassed = false;
180
+ }
181
+ }
182
+ else if (thirdQualifierType === enums_1.ThirdQualifierType.QUANTITY) {
183
+ const totalQuantity = applicableProducts.reduce((prev, curr) => prev + curr.quantity, 0);
184
+ if (totalQuantity < thirdQualifier[0] || totalQuantity > thirdQualifier[1]) {
185
+ thirdQualifierPassed = false;
186
+ }
187
+ }
188
+ }
189
+ else if (thirdQualifier && thirdQualifier.length !== 0) {
190
+ throw new Error("Invalid third qualifier configuration");
191
+ }
192
+ return firstQualifierPassed && secondQualifierPassed && thirdQualifierPassed;
193
+ }
194
+ //# sourceMappingURL=qualifier-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualifier-checks.js","sourceRoot":"","sources":["../../src/helpers/qualifier-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Scheme, FilterConstraints } from "../types/scheme";
2
+ export interface ApplicabilityItem {
3
+ /** SKU id for product-level scheme applicability. */
4
+ productId: number;
5
+ /** Primary category id for category-level scheme applicability. */
6
+ primaryCategoryId: number;
7
+ /** Secondary category id for category-level scheme applicability. */
8
+ secondaryCategoryId: number;
9
+ /** Pricing master batch id for master-batch scheme applicability. */
10
+ masterBatchId?: string;
11
+ /** MRP used for MRP-based filter constraints. */
12
+ mrp?: number;
13
+ /** Attribute text 1 used for attribute-based filter constraints. */
14
+ productAttributeText1?: string | null;
15
+ /** Attribute text 2 used for attribute-based filter constraints. */
16
+ productAttributeText2?: string | null;
17
+ /** Alternate category string used for alt-category filter constraints. */
18
+ category1?: string | null;
19
+ /** Manufacturing batch number used for manufacturing-batch filter constraints. */
20
+ batchNo?: string;
21
+ }
22
+ /**
23
+ * Checks if a scheme is applicable to a specific item based on schemeOn type.
24
+ * Uses FE superset: includes GROUP, ALL, MASTER_BATCH.
25
+ */
26
+ export declare function isSchemeApplicable(scheme: Scheme, item: ApplicabilityItem, categories: string[]): boolean;
27
+ /**
28
+ * Checks if the schemeOn value is a category type (primary or secondary).
29
+ */
30
+ export declare function isPrimaryOrSecondaryCategorySchemeOn(schemeOn: string): boolean;
31
+ /**
32
+ * Checks if a scheme has any active filter constraints configured.
33
+ */
34
+ export declare function isSchemeHaveValidFilterConstraints(scheme: Scheme): boolean;
35
+ /**
36
+ * Checks if an item passes all active filter constraints of a scheme.
37
+ * All non-empty filter lists must match (AND logic).
38
+ */
39
+ export declare function isSchemeApplicableOnFilterConstraints(filterConstraints: FilterConstraints, item: ApplicabilityItem): boolean;
40
+ //# sourceMappingURL=scheme-applicability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheme-applicability.d.ts","sourceRoot":"","sources":["../../src/helpers/scheme-applicability.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGjE,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CA8BT;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK9E;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAW1E;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CA+BT"}