@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,64 @@
1
+ import { checkSlabConstraint } from "../helpers/constraint-checks";
2
+ import { checkIfSecondaryCategoryFilterPassed } from "../helpers/qualifier-checks";
3
+ /**
4
+ * Finds the first matching slab from a list sorted desc by constraint.
5
+ * Applies:
6
+ * 1. Secondary category / qualifier filter
7
+ * 2. Payout-type-aware constraint check (with maxConstraint handling)
8
+ *
9
+ * Returns the matched slab or null if none matched.
10
+ */
11
+ export function findMatchingSlab(params) {
12
+ const { slabs, compareValue, applicableProducts, payoutType, discountOn } = params;
13
+ for (let i = 0; i < slabs.length; i++) {
14
+ const slab = slabs[i];
15
+ // Check secondary category / first qualifier / third qualifier
16
+ const qualifierParams = {
17
+ secondQualifier: slab.secondQualifier,
18
+ secondQualifierType: slab.secondQualifierType,
19
+ discountOn,
20
+ firstQualifier: slab.firstQualifier,
21
+ thirdQualifier: slab.thirdQualifier,
22
+ thirdQualifierType: slab.thirdQualifierType,
23
+ schemePayoutType: payoutType,
24
+ slabConstraint: slab.constraint,
25
+ };
26
+ if (!checkIfSecondaryCategoryFilterPassed(qualifierParams, applicableProducts)) {
27
+ continue;
28
+ }
29
+ if (checkSlabConstraint(compareValue, slab, payoutType)) {
30
+ return { slab, index: i };
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Finds two adjacent slabs for step/continuous interpolation.
37
+ * Returns the lower and upper slab. If compare value exceeds the highest slab,
38
+ * uses that slab for both lower and upper.
39
+ */
40
+ export function findInterpolationSlabs(params) {
41
+ const { slabs, compareValue, applicableProducts, payoutType, discountOn } = params;
42
+ for (let i = 0; i < slabs.length; i++) {
43
+ const lowerSlab = slabs[i];
44
+ const qualifierParams = {
45
+ secondQualifier: lowerSlab.secondQualifier,
46
+ secondQualifierType: lowerSlab.secondQualifierType,
47
+ discountOn,
48
+ firstQualifier: lowerSlab.firstQualifier,
49
+ thirdQualifier: lowerSlab.thirdQualifier,
50
+ thirdQualifierType: lowerSlab.thirdQualifierType,
51
+ schemePayoutType: payoutType,
52
+ slabConstraint: lowerSlab.constraint,
53
+ };
54
+ if (!checkIfSecondaryCategoryFilterPassed(qualifierParams, applicableProducts)) {
55
+ continue;
56
+ }
57
+ if (checkSlabConstraint(compareValue, lowerSlab, payoutType)) {
58
+ const upperSlab = i === slabs.length - 1 ? lowerSlab : slabs[i + 1];
59
+ return { lower: lowerSlab, upper: upperSlab, lowerIndex: i };
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ //# sourceMappingURL=slab-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slab-matcher.js","sourceRoot":"","sources":["../../../src/calculators/slab-matcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,oCAAoC,EAA6B,MAAM,6BAA6B,CAAC;AAsB9G;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAyB;IACxD,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAEnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,+DAA+D;QAC/D,MAAM,eAAe,GAAyB;YAC5C,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,UAAU;YACV,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,gBAAgB,EAAE,UAAU;YAC5B,cAAc,EAAE,IAAI,CAAC,UAAU;SAChC,CAAC;QAEF,IAAI,CAAC,oCAAoC,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAC/E,SAAS;QACX,CAAC;QAED,IAAI,mBAAmB,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;YACxD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAyB;IAEzB,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAEnF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,MAAM,eAAe,GAAyB;YAC5C,eAAe,EAAE,SAAS,CAAC,eAAe;YAC1C,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;YAClD,UAAU;YACV,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;YAChD,gBAAgB,EAAE,UAAU;YAC5B,cAAc,EAAE,SAAS,CAAC,UAAU;SACrC,CAAC;QAEF,IAAI,CAAC,oCAAoC,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAC/E,SAAS;QACX,CAAC;QAED,IAAI,mBAAmB,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { SchemePayoutCalculationType } from "../types/enums";
2
+ /**
3
+ * Checks if payout calculation type is 'step'.
4
+ * Normalizes to lowercase for comparison.
5
+ */
6
+ export function isPayoutCalcTypeStep(payoutCalcType) {
7
+ return payoutCalcType?.toLowerCase()?.trim() === SchemePayoutCalculationType.STEP;
8
+ }
9
+ /**
10
+ * Checks if payout calculation type is 'continuous'.
11
+ * Normalizes to lowercase for comparison.
12
+ */
13
+ export function isPayoutCalcTypeContinuous(payoutCalcType) {
14
+ return payoutCalcType?.toLowerCase()?.trim() === SchemePayoutCalculationType.CONTINUOUS;
15
+ }
16
+ /**
17
+ * Checks if payout calculation type is 'stepmultiplier'.
18
+ * Normalizes to lowercase for comparison.
19
+ */
20
+ export function isPayoutCalcTypeStepMultiplier(payoutCalcType) {
21
+ return payoutCalcType?.toLowerCase()?.trim() === SchemePayoutCalculationType.STEP_MULTIPLIER;
22
+ }
23
+ /**
24
+ * Checks if payout calculation type is 'prorata'.
25
+ * NEW: Not yet in either codebase — implements Bug 9 fix.
26
+ */
27
+ export function isPayoutCalcTypeProrata(payoutCalcType) {
28
+ return payoutCalcType?.toLowerCase()?.trim() === SchemePayoutCalculationType.PRORATA;
29
+ }
30
+ //# sourceMappingURL=calc-type-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calc-type-checks.js","sourceRoot":"","sources":["../../../src/helpers/calc-type-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,cAA6B;IAChE,OAAO,cAAc,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,2BAA2B,CAAC,IAAI,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAA6B;IACtE,OAAO,cAAc,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,2BAA2B,CAAC,UAAU,CAAC;AAC1F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,cAA6B;IAC1E,OAAO,cAAc,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,2BAA2B,CAAC,eAAe,CAAC;AAC/F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,cAA6B;IACnE,OAAO,cAAc,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,2BAA2B,CAAC,OAAO,CAAC;AACvF,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { SchemeConstraintType } from "../types/enums";
2
+ /**
3
+ * Get the base value of an item for scheme constraint comparison.
4
+ * Uses netValue + cashDiscountValue if available, else quantity * price.
5
+ */
6
+ export function itemBaseValueForConstraint(item, isMrpBilling = false) {
7
+ const price = isMrpBilling ? calculateMrpBillingPrice(item) : (item.price || 0);
8
+ const totalValueForSchemeApplication = getTotalValueForSchemeApplication(item);
9
+ if (totalValueForSchemeApplication) {
10
+ return totalValueForSchemeApplication;
11
+ }
12
+ else {
13
+ return (item.quantity || 0) * price;
14
+ }
15
+ }
16
+ function getTotalValueForSchemeApplication(item) {
17
+ return (item.netValue || 0) + (item.cashDiscountValue || 0);
18
+ }
19
+ /**
20
+ * Calculate MRP billing price (MRP / (1 + tax/100)).
21
+ */
22
+ export function calculateMrpBillingPrice(item, includeAllTaxes = false) {
23
+ let totalTaxPercent = 0;
24
+ const cessPercent = Number(item.cessPercent ?? 0);
25
+ const igstPercent = Number(item.igst ?? 0);
26
+ const vatPercent = Number(item.vatPercent ?? 0);
27
+ if (includeAllTaxes) {
28
+ if (igstPercent > 0) {
29
+ totalTaxPercent = igstPercent + cessPercent;
30
+ }
31
+ else if (vatPercent > 0) {
32
+ totalTaxPercent = vatPercent + cessPercent;
33
+ }
34
+ }
35
+ else {
36
+ totalTaxPercent = igstPercent;
37
+ }
38
+ const calculatedPrice = Number(item.mrp ?? 0) / (1 + totalTaxPercent / 100);
39
+ return Number(calculatedPrice.toFixed(2));
40
+ }
41
+ // ─── Aggregate Calculators ──────────────────────────────────────
42
+ /**
43
+ * Returns the aggregate quantity across all items.
44
+ */
45
+ export function calculateTotalQuantity(items) {
46
+ return items.reduce((prev, curr) => prev + (curr.quantity || 0), 0);
47
+ }
48
+ /**
49
+ * Returns the aggregate amount (base value for constraint) across all items.
50
+ */
51
+ export function calculateTotalAmount(items, isMrpBilling = false) {
52
+ return items.reduce((prev, curr) => prev + itemBaseValueForConstraint(curr, isMrpBilling), 0);
53
+ }
54
+ /**
55
+ * Returns the total quantity in standard units (cases).
56
+ */
57
+ export function calculateTotalStdUnits(items) {
58
+ const total = items.reduce((prev, curr) => prev + curr.quantity / (curr.standardUnitConversionFactor || 1), 0);
59
+ const roundedTotal = Math.round((total + Number.EPSILON) * 100) / 100;
60
+ if (Math.abs(total - roundedTotal) < Number.EPSILON) {
61
+ return roundedTotal;
62
+ }
63
+ return total;
64
+ }
65
+ /**
66
+ * Returns the total quantity in actual standard units.
67
+ */
68
+ export function calculateActualTotalStdUnits(items) {
69
+ return items.reduce((prev, curr) => prev + curr.quantity / (curr.actualStandardUnitConversionFactor || 1), 0);
70
+ }
71
+ /**
72
+ * Returns the total quantity in super units.
73
+ */
74
+ export function calculateTotalSuperUnits(items) {
75
+ return items.reduce((prev, curr) => prev + curr.quantity / (curr.superUnitConversionFactor || 1), 0);
76
+ }
77
+ /**
78
+ * Returns the total quantity in additional units.
79
+ */
80
+ export function calculateTotalAdditionalUnits(items) {
81
+ return items.reduce((prev, curr) => {
82
+ if (!curr.additionalUnitConversionFactor)
83
+ return prev;
84
+ return prev + curr.quantity / curr.additionalUnitConversionFactor;
85
+ }, 0);
86
+ }
87
+ /**
88
+ * Get the compare value for a scheme based on its constraint type.
89
+ * Uses FE superset with 6 constraint types.
90
+ */
91
+ export function getCategorySchemeCompareValue(constraintType, totalQuantity, totalAmount, totalStdUnits, actualStdUnits, totalSuperUnits, totalAdditionalUnits) {
92
+ switch (constraintType) {
93
+ case SchemeConstraintType.QUANTITY:
94
+ return totalQuantity;
95
+ case SchemeConstraintType.AMOUNT:
96
+ return totalAmount;
97
+ case SchemeConstraintType.STD_UNIT:
98
+ return totalStdUnits;
99
+ case SchemeConstraintType.ACTUAL_STD_UNIT:
100
+ return actualStdUnits;
101
+ case SchemeConstraintType.SUPER_UNIT:
102
+ return totalSuperUnits;
103
+ case SchemeConstraintType.ADDITIONAL_UNIT:
104
+ return totalAdditionalUnits;
105
+ default:
106
+ return 0;
107
+ }
108
+ }
109
+ //# sourceMappingURL=compare-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-value.js","sourceRoot":"","sources":["../../../src/helpers/compare-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAA0B,EAC1B,YAAY,GAAG,KAAK;IAEpB,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAEhF,MAAM,8BAA8B,GAAG,iCAAiC,CAAC,IAAI,CAAC,CAAC;IAE/E,IAAI,8BAA8B,EAAE,CAAC;QACnC,OAAO,8BAA8B,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,iCAAiC,CAAC,IAA0B;IACnE,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAA0B,EAC1B,eAAe,GAAG,KAAK;IAEvB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IAEhD,IAAI,eAAe,EAAE,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,eAAe,GAAG,WAAW,GAAG,WAAW,CAAC;QAC9C,CAAC;aAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAC1B,eAAe,GAAG,UAAU,GAAG,WAAW,CAAC;QAC7C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,eAAe,GAAG,WAAW,CAAC;IAChC,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC;IAC5E,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,mEAAmE;AAEnE;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA6B,EAAE,YAAY,GAAG,KAAK;IACtF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,0BAA0B,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;AAChG,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CACxB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,CAAC,EAC/E,CAAC,CACF,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACtE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAA6B;IACxE,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,kCAAkC,IAAI,CAAC,CAAC,EACrF,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAA6B;IACpE,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,CAAC,EAC5E,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,KAA6B;IACzE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACjC,IAAI,CAAC,IAAI,CAAC,8BAA8B;YAAE,OAAO,IAAI,CAAC;QACtD,OAAO,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,8BAA8B,CAAC;IACpE,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAC3C,cAAsB,EACtB,aAAqB,EACrB,WAAmB,EACnB,aAAqB,EACrB,cAAsB,EACtB,eAAuB,EACvB,oBAA4B;IAE5B,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,oBAAoB,CAAC,QAAQ;YAChC,OAAO,aAAa,CAAC;QACvB,KAAK,oBAAoB,CAAC,MAAM;YAC9B,OAAO,WAAW,CAAC;QACrB,KAAK,oBAAoB,CAAC,QAAQ;YAChC,OAAO,aAAa,CAAC;QACvB,KAAK,oBAAoB,CAAC,eAAe;YACvC,OAAO,cAAc,CAAC;QACxB,KAAK,oBAAoB,CAAC,UAAU;YAClC,OAAO,eAAe,CAAC;QACzB,KAAK,oBAAoB,CAAC,eAAe;YACvC,OAAO,oBAAoB,CAAC;QAC9B;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { SchemeConstraintType, SchemePayoutType } from "../types/enums";
2
+ /**
3
+ * Checks if a constraint type is valid (one of the 6 known types).
4
+ * Uses FE superset: includes SUPER_UNIT and ADDITIONAL_UNIT.
5
+ */
6
+ export function isValidConstraintType(constraintType) {
7
+ return (constraintType === SchemeConstraintType.QUANTITY ||
8
+ constraintType === SchemeConstraintType.AMOUNT ||
9
+ constraintType === SchemeConstraintType.STD_UNIT ||
10
+ constraintType === SchemeConstraintType.ACTUAL_STD_UNIT ||
11
+ constraintType === SchemeConstraintType.SUPER_UNIT ||
12
+ constraintType === SchemeConstraintType.ADDITIONAL_UNIT);
13
+ }
14
+ // Payout types that enforce maxConstraint on slab matching (Appendix C)
15
+ const MAX_CONSTRAINT_ENFORCED_TYPES = new Set([
16
+ SchemePayoutType.FOC,
17
+ SchemePayoutType.FOC_SLAB,
18
+ SchemePayoutType.PRODUCT,
19
+ SchemePayoutType.PRODUCT_SCHEME_NEW,
20
+ SchemePayoutType.TOPUP,
21
+ ]);
22
+ /**
23
+ * Checks if a compare value satisfies a slab's constraint.
24
+ *
25
+ * Bug 10 fix: maxConstraint enforcement is payout-type-aware.
26
+ * - For DISCOUNT, PERUNIT, MRP%, FIXED_DISCOUNT, BASKET, COUPON: ignore maxConstraint
27
+ * - For FOC, FOC_SLAB, PRODUCT, PRODUCT_SCHEME_NEW, TOPUP: enforce maxConstraint
28
+ *
29
+ * @param compareValue - The aggregated value to compare against the slab
30
+ * @param slab - The slab with constraint and optional maxConstraint
31
+ * @param payoutType - The scheme payout type (determines maxConstraint enforcement)
32
+ */
33
+ export function checkSlabConstraint(compareValue, slab, payoutType) {
34
+ if (compareValue < slab.constraint) {
35
+ return false;
36
+ }
37
+ // Only enforce maxConstraint for specific payout types
38
+ if (payoutType && MAX_CONSTRAINT_ENFORCED_TYPES.has(payoutType) && slab.maxConstraint) {
39
+ return compareValue <= slab.maxConstraint;
40
+ }
41
+ return true;
42
+ }
43
+ /**
44
+ * Validates that a FOC step multiplier scheme has valid configuration.
45
+ * Used as a guard before applying StepMultiplier calculation.
46
+ */
47
+ export function isValidFocStepMultiplierSchemeLogic(category, constraintType, payoutIn) {
48
+ const validCategories = ["Primary", "Secondary"];
49
+ const validConstraints = [
50
+ SchemeConstraintType.AMOUNT,
51
+ SchemeConstraintType.QUANTITY,
52
+ SchemeConstraintType.STD_UNIT,
53
+ SchemeConstraintType.SUPER_UNIT,
54
+ ];
55
+ const validPayoutIns = ["Quantity", "Standard_Unit"];
56
+ return (validCategories.includes(category) &&
57
+ validConstraints.includes(constraintType) &&
58
+ validPayoutIns.includes(payoutIn));
59
+ }
60
+ /**
61
+ * Validates that a continuous FOC scheme has valid configuration.
62
+ * Used as a guard before applying continuous FOC interpolation.
63
+ */
64
+ export function isValidContinuousSchemeLogic(category, constraintType, payoutIn) {
65
+ return isValidFocStepMultiplierSchemeLogic(category, constraintType, payoutIn);
66
+ }
67
+ //# sourceMappingURL=constraint-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraint-checks.js","sourceRoot":"","sources":["../../../src/helpers/constraint-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGxE;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,cAAsB;IAC1D,OAAO,CACL,cAAc,KAAK,oBAAoB,CAAC,QAAQ;QAChD,cAAc,KAAK,oBAAoB,CAAC,MAAM;QAC9C,cAAc,KAAK,oBAAoB,CAAC,QAAQ;QAChD,cAAc,KAAK,oBAAoB,CAAC,eAAe;QACvD,cAAc,KAAK,oBAAoB,CAAC,UAAU;QAClD,cAAc,KAAK,oBAAoB,CAAC,eAAe,CACxD,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,6BAA6B,GAAwB,IAAI,GAAG,CAAC;IACjE,gBAAgB,CAAC,GAAG;IACpB,gBAAgB,CAAC,QAAQ;IACzB,gBAAgB,CAAC,OAAO;IACxB,gBAAgB,CAAC,kBAAkB;IACnC,gBAAgB,CAAC,KAAK;CACvB,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,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,MAAM,UAAU,mCAAmC,CACjD,QAAgB,EAChB,cAAsB,EACtB,QAAgB;IAEhB,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG;QACvB,oBAAoB,CAAC,MAAM;QAC3B,oBAAoB,CAAC,QAAQ;QAC7B,oBAAoB,CAAC,QAAQ;QAC7B,oBAAoB,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,MAAM,UAAU,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.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","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,84 @@
1
+ /**
2
+ * Calculate discount value from a base value and percent.
3
+ * Pure equivalent of BaseOrderItem.calculateDiscount().
4
+ */
5
+ export function calculateDiscount(baseValue, discountPercent) {
6
+ return Number((((baseValue || 0) * (discountPercent || 0)) / 100).toFixed(2));
7
+ }
8
+ /**
9
+ * Calculate FOC discount value — same formula but without toFixed rounding.
10
+ * Pure equivalent of BaseOrderItem.calculateFocDiscount().
11
+ */
12
+ export function calculateFocDiscount(baseValue, discountPercent) {
13
+ return Number(((baseValue || 0) * (discountPercent ?? 0)) / 100);
14
+ }
15
+ /**
16
+ * Calculate discount percent from base value and discount value.
17
+ * Pure equivalent of BaseOrderItem.calculateDiscountPercent().
18
+ */
19
+ export function calculateDiscountPercent(baseValue, discountValue) {
20
+ return Number((((discountValue || 0) / (baseValue || 0)) * 100).toFixed(2));
21
+ }
22
+ /**
23
+ * Calculate after-markup discount value.
24
+ * Pure equivalent of BaseOrderItem.calculateAfterMarkupDiscountValue().
25
+ */
26
+ export function calculateAfterMarkupDiscountValue(baseValue, discountPercent) {
27
+ return Number(((baseValue || 0) / (1 + (discountPercent || 0) / 100)).toFixed(2));
28
+ }
29
+ /**
30
+ * Calculate markup discount.
31
+ * Pure equivalent of BaseOrderItem.calculateMarkupDiscount().
32
+ */
33
+ export function calculateMarkupDiscount(baseValue, discountPercent) {
34
+ const discountValue = discountPercent / 100;
35
+ const markUpValue = baseValue / (1 + discountValue);
36
+ return baseValue - markUpValue;
37
+ }
38
+ /**
39
+ * Calculate step multiplier discount for FOC schemes.
40
+ * Handles both multiplierStepSize and fallback ratio-based calculation.
41
+ */
42
+ export function calculateStepMultiplierDiscount(purchasedQty, slab) {
43
+ if (slab.multiplierStepSize && slab.multiplierStepSize > 0) {
44
+ const payoutPerAdditionalStep = (slab.payout * slab.multiplierStepSize) / slab.constraint;
45
+ const stepAboveBase = Math.floor((purchasedQty - slab.constraint) / slab.multiplierStepSize);
46
+ const payoutAboveBase = stepAboveBase * payoutPerAdditionalStep;
47
+ const totalPayout = slab.payout + payoutAboveBase;
48
+ return Math.floor(totalPayout);
49
+ }
50
+ else {
51
+ const ratio = slab.payout / slab.constraint;
52
+ const multiples = Math.floor(purchasedQty / slab.constraint);
53
+ const eligibleQty = multiples * slab.constraint;
54
+ return Math.floor(eligibleQty * ratio);
55
+ }
56
+ }
57
+ /**
58
+ * Calculate continuous FOC payout using linear interpolation.
59
+ * Formula: payout + floor((payout / constraint) * (compareValue - constraint))
60
+ */
61
+ export function calculatePayoutForFocContinuousScheme(constraint, payout, compareValue) {
62
+ const payoutValue = (payout / constraint) * (compareValue - constraint);
63
+ return payout + Math.floor(Number(payoutValue));
64
+ }
65
+ /**
66
+ * Format a price to 2 decimal places.
67
+ */
68
+ export function formatPrice(value) {
69
+ return value.toFixed(2);
70
+ }
71
+ /**
72
+ * Fixed decimal precision.
73
+ */
74
+ export function fixedDecimal(value, decimals) {
75
+ return Number(value.toFixed(decimals));
76
+ }
77
+ /**
78
+ * Clamp a value to be at least 0.
79
+ * Bug 7 fix: prevents negative discount values.
80
+ */
81
+ export function clampNonNegative(value) {
82
+ return Math.max(0, value);
83
+ }
84
+ //# 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,29 @@
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 function isFocTypePayoutScheme(payoutType) {
8
+ return (payoutType === SchemePayoutType.FOC ||
9
+ payoutType === SchemePayoutType.FOC_SLAB ||
10
+ payoutType === SchemePayoutType.PRODUCT ||
11
+ payoutType === SchemePayoutType.COUPON ||
12
+ payoutType === SchemePayoutType.PRODUCT_SCHEME_NEW);
13
+ }
14
+ /**
15
+ * Checks if scheme payout type is PercentageDiscountOnMRP.
16
+ */
17
+ export function isPercentDiscountOnMRPTypePayoutScheme(payoutType) {
18
+ return payoutType === SchemePayoutType.PERCENTAGE_DISCOUNT_ON_MRP;
19
+ }
20
+ /**
21
+ * Checks if scheme payout type is a product-based type
22
+ * (PRODUCT, PRODUCT_SCHEME_NEW, COUPON).
23
+ */
24
+ export function isProductSchemePayoutType(payoutType) {
25
+ return (payoutType === SchemePayoutType.PRODUCT ||
26
+ payoutType === SchemePayoutType.PRODUCT_SCHEME_NEW ||
27
+ payoutType === SchemePayoutType.COUPON);
28
+ }
29
+ //# 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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAqC;IACzE,OAAO,CACL,UAAU,KAAK,gBAAgB,CAAC,GAAG;QACnC,UAAU,KAAK,gBAAgB,CAAC,QAAQ;QACxC,UAAU,KAAK,gBAAgB,CAAC,OAAO;QACvC,UAAU,KAAK,gBAAgB,CAAC,MAAM;QACtC,UAAU,KAAK,gBAAgB,CAAC,kBAAkB,CACnD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sCAAsC,CACpD,UAAqC;IAErC,OAAO,UAAU,KAAK,gBAAgB,CAAC,0BAA0B,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAqC;IAC7E,OAAO,CACL,UAAU,KAAK,gBAAgB,CAAC,OAAO;QACvC,UAAU,KAAK,gBAAgB,CAAC,kBAAkB;QAClD,UAAU,KAAK,gBAAgB,CAAC,MAAM,CACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,188 @@
1
+ import { EntityType, SecondQualifierType, DiscountOnType, ThirdQualifierType, SchemePayoutType, } from "../types/enums";
2
+ // ─── First Qualifier Check (standard) ───────────────────────────
3
+ /**
4
+ * Checks if the first qualifier prerequisites are met.
5
+ * All qualifiers must match for the check to pass.
6
+ */
7
+ export function checkFirstQualifier(firstQualifier, applicableProducts) {
8
+ const qualifiers = firstQualifier || [];
9
+ if (qualifiers.length === 0)
10
+ return true;
11
+ let count = 0;
12
+ for (const fq of qualifiers) {
13
+ let matched = false;
14
+ for (const item of applicableProducts) {
15
+ if (fq.entityType === EntityType.product) {
16
+ if (item.productId == fq.entity &&
17
+ item.quantity >= fq.quantity &&
18
+ (!fq.batch || item.mrpBatch == fq.batch) &&
19
+ item.isSaleable === fq.isMustSell) {
20
+ matched = true;
21
+ break;
22
+ }
23
+ }
24
+ else if (fq.entityType === EntityType.primaryCategory) {
25
+ if (item.primaryCategoryId == fq.entity &&
26
+ item.quantity >= fq.quantity &&
27
+ item.isSaleable === fq.isMustSell) {
28
+ matched = true;
29
+ break;
30
+ }
31
+ }
32
+ else if (fq.entityType === EntityType.secondaryCategory) {
33
+ if (item.secondaryCategoryId == fq.entity &&
34
+ item.quantity >= fq.quantity &&
35
+ item.isSaleable === fq.isMustSell) {
36
+ matched = true;
37
+ break;
38
+ }
39
+ }
40
+ else if (fq.entityType === EntityType.alternateCategory) {
41
+ if (item.category1 == fq.entity &&
42
+ item.quantity >= fq.quantity &&
43
+ item.isSaleable === fq.isMustSell) {
44
+ matched = true;
45
+ break;
46
+ }
47
+ }
48
+ else if (fq.entityType === EntityType.attributeText1) {
49
+ if (item.productAttributeText1 == fq.entity &&
50
+ item.quantity >= fq.quantity &&
51
+ item.isSaleable === fq.isMustSell) {
52
+ matched = true;
53
+ break;
54
+ }
55
+ }
56
+ }
57
+ if (matched) {
58
+ count++;
59
+ }
60
+ else {
61
+ break;
62
+ }
63
+ }
64
+ return count === qualifiers.length;
65
+ }
66
+ // ─── First Qualifier Check for FOC ──────────────────────────────
67
+ /**
68
+ * Checks first qualifier for FOC schemes.
69
+ * Uses summed quantity across matching products.
70
+ */
71
+ export function checkFirstQualifierForFOC(firstQualifier, applicableProducts) {
72
+ const qualifiers = firstQualifier || [];
73
+ if (qualifiers.length === 0)
74
+ return true;
75
+ for (const fq of qualifiers) {
76
+ let totalMatchedQty = 0;
77
+ for (const item of applicableProducts) {
78
+ if (fq.entityType === EntityType.product && item.productId == fq.entity) {
79
+ totalMatchedQty += item.quantity;
80
+ }
81
+ else if (fq.entityType === EntityType.primaryCategory && item.primaryCategoryId == fq.entity) {
82
+ totalMatchedQty += item.quantity;
83
+ }
84
+ else if (fq.entityType === EntityType.secondaryCategory && item.secondaryCategoryId == fq.entity) {
85
+ totalMatchedQty += item.quantity;
86
+ }
87
+ else if (fq.entityType === EntityType.alternateCategory && item.category1 == fq.entity) {
88
+ totalMatchedQty += item.quantity;
89
+ }
90
+ else if (fq.entityType === EntityType.attributeText1 && item.productAttributeText1 == fq.entity) {
91
+ totalMatchedQty += item.quantity;
92
+ }
93
+ }
94
+ if (totalMatchedQty < fq.quantity) {
95
+ return false;
96
+ }
97
+ }
98
+ return true;
99
+ }
100
+ // ─── First Qualifier Check for Discount ─────────────────────────
101
+ /**
102
+ * Checks first qualifier for Discount schemes.
103
+ * Checks that constraint qty is met across matching products.
104
+ */
105
+ export function checkFirstQualifierForDiscount(firstQualifier, applicableProducts, slabConstraint) {
106
+ const qualifiers = firstQualifier || [];
107
+ if (qualifiers.length === 0)
108
+ return true;
109
+ for (const fq of qualifiers) {
110
+ let totalMatchedQty = 0;
111
+ for (const item of applicableProducts) {
112
+ if (fq.entityType === EntityType.product && item.productId == fq.entity) {
113
+ totalMatchedQty += item.quantity;
114
+ }
115
+ else if (fq.entityType === EntityType.primaryCategory && item.primaryCategoryId == fq.entity) {
116
+ totalMatchedQty += item.quantity;
117
+ }
118
+ else if (fq.entityType === EntityType.secondaryCategory && item.secondaryCategoryId == fq.entity) {
119
+ totalMatchedQty += item.quantity;
120
+ }
121
+ else if (fq.entityType === EntityType.alternateCategory && item.category1 == fq.entity) {
122
+ totalMatchedQty += item.quantity;
123
+ }
124
+ else if (fq.entityType === EntityType.attributeText1 && item.productAttributeText1 == fq.entity) {
125
+ totalMatchedQty += item.quantity;
126
+ }
127
+ }
128
+ if (totalMatchedQty < fq.quantity) {
129
+ return false;
130
+ }
131
+ }
132
+ return true;
133
+ }
134
+ /**
135
+ * Checks if secondary category filter, first qualifier, and third qualifier all pass.
136
+ *
137
+ * Bug 2 fix: Uses secondQualifierType (not secondQualifier) for the type check.
138
+ */
139
+ export function checkIfSecondaryCategoryFilterPassed(params, applicableProducts) {
140
+ const { secondQualifier, secondQualifierType, discountOn, firstQualifier, thirdQualifier, thirdQualifierType, schemePayoutType, slabConstraint, } = params;
141
+ let firstQualifierPassed = true;
142
+ let secondQualifierPassed = true;
143
+ let thirdQualifierPassed = true;
144
+ // First qualifier check (only for GroupScheme discount-on type)
145
+ if (discountOn === DiscountOnType.GroupScheme) {
146
+ if (schemePayoutType === SchemePayoutType.FOC) {
147
+ firstQualifierPassed = checkFirstQualifierForFOC(firstQualifier, applicableProducts);
148
+ }
149
+ else if (schemePayoutType === SchemePayoutType.DISCOUNT) {
150
+ firstQualifierPassed = checkFirstQualifierForDiscount(firstQualifier, applicableProducts, slabConstraint ?? 0);
151
+ }
152
+ else {
153
+ firstQualifierPassed = checkFirstQualifier(firstQualifier, applicableProducts);
154
+ }
155
+ }
156
+ // Second qualifier check
157
+ if (secondQualifierType === SecondQualifierType.LPC) {
158
+ if (applicableProducts.length < secondQualifier) {
159
+ secondQualifierPassed = false;
160
+ }
161
+ }
162
+ else if (secondQualifier) {
163
+ const uniqueAltCategoryIds = new Set(applicableProducts.map((v) => v.category1));
164
+ if (uniqueAltCategoryIds.size < secondQualifier) {
165
+ secondQualifierPassed = false;
166
+ }
167
+ }
168
+ // Third qualifier check
169
+ if (thirdQualifier && thirdQualifier.length === 2) {
170
+ if (thirdQualifierType === ThirdQualifierType.VALUE) {
171
+ const totalAmount = applicableProducts.reduce((prev, curr) => prev + curr.price * curr.quantity, 0);
172
+ if (totalAmount < thirdQualifier[0] || totalAmount > thirdQualifier[1]) {
173
+ thirdQualifierPassed = false;
174
+ }
175
+ }
176
+ else if (thirdQualifierType === ThirdQualifierType.QUANTITY) {
177
+ const totalQuantity = applicableProducts.reduce((prev, curr) => prev + curr.quantity, 0);
178
+ if (totalQuantity < thirdQualifier[0] || totalQuantity > thirdQualifier[1]) {
179
+ thirdQualifierPassed = false;
180
+ }
181
+ }
182
+ }
183
+ else if (thirdQualifier && thirdQualifier.length !== 0) {
184
+ throw new Error("Invalid third qualifier configuration");
185
+ }
186
+ return firstQualifierPassed && secondQualifierPassed && thirdQualifierPassed;
187
+ }
188
+ //# 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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"}