@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,93 @@
1
+ import { SchemeSchemeOn } from "../types/enums";
2
+ /**
3
+ * Checks if a scheme is applicable to a specific item based on schemeOn type.
4
+ * Uses FE superset: includes GROUP, ALL, MASTER_BATCH.
5
+ */
6
+ export function isSchemeApplicable(scheme, item, categories) {
7
+ const schemeOn = scheme.schemeOn;
8
+ if (schemeOn === SchemeSchemeOn.GROUP) {
9
+ return ((!!item.primaryCategoryId && categories.includes(item.primaryCategoryId.toString())) ||
10
+ (!!item.secondaryCategoryId && categories.includes(item.secondaryCategoryId.toString())) ||
11
+ (!!item.masterBatchId &&
12
+ categories.includes(item.masterBatchId.toString()) &&
13
+ scheme.alternateSchemeId == null) ||
14
+ (!!item.productId && categories.includes(item.productId.toString())));
15
+ }
16
+ else if (schemeOn === SchemeSchemeOn.PRIMARY_CATEGORY) {
17
+ return !!item.primaryCategoryId && categories.includes(item.primaryCategoryId.toString());
18
+ }
19
+ else if (schemeOn === SchemeSchemeOn.SECONDARY_CATEGORY) {
20
+ return !!item.secondaryCategoryId && categories.includes(item.secondaryCategoryId.toString());
21
+ }
22
+ else if (schemeOn === SchemeSchemeOn.ALL) {
23
+ return true;
24
+ }
25
+ else if (schemeOn === SchemeSchemeOn.MASTER_BATCH) {
26
+ return (!!item.masterBatchId &&
27
+ categories.includes(item.masterBatchId.toString()) &&
28
+ scheme.alternateSchemeId == null);
29
+ }
30
+ else if (schemeOn === SchemeSchemeOn.PRODUCT) {
31
+ // Product-level scheme
32
+ return !!item.productId && categories.includes(item.productId.toString());
33
+ }
34
+ else {
35
+ return false;
36
+ }
37
+ }
38
+ /**
39
+ * Checks if the schemeOn value is a category type (primary or secondary).
40
+ */
41
+ export function isPrimaryOrSecondaryCategorySchemeOn(schemeOn) {
42
+ return (schemeOn === SchemeSchemeOn.PRIMARY_CATEGORY ||
43
+ schemeOn === SchemeSchemeOn.SECONDARY_CATEGORY);
44
+ }
45
+ /**
46
+ * Checks if a scheme has any active filter constraints configured.
47
+ */
48
+ export function isSchemeHaveValidFilterConstraints(scheme) {
49
+ const fc = scheme.filterConstraints;
50
+ if (!fc)
51
+ return false;
52
+ return ((!!fc.mrp && fc.mrp.length > 0) ||
53
+ (!!fc.attribute1 && fc.attribute1.length > 0) ||
54
+ (!!fc.attribute2 && fc.attribute2.length > 0) ||
55
+ (!!fc.altCategory && fc.altCategory.length > 0) ||
56
+ (!!fc.manufacturingBatchNumbers && fc.manufacturingBatchNumbers.length > 0));
57
+ }
58
+ /**
59
+ * Checks if an item passes all active filter constraints of a scheme.
60
+ * All non-empty filter lists must match (AND logic).
61
+ */
62
+ export function isSchemeApplicableOnFilterConstraints(filterConstraints, item) {
63
+ const results = [];
64
+ if (filterConstraints.mrp && filterConstraints.mrp.length > 0) {
65
+ if (!item.mrp)
66
+ return false;
67
+ results.push(filterConstraints.mrp.includes(item.mrp));
68
+ }
69
+ if (filterConstraints.attribute1 && filterConstraints.attribute1.length > 0) {
70
+ if (!item.productAttributeText1)
71
+ return false;
72
+ results.push(filterConstraints.attribute1.includes(item.productAttributeText1));
73
+ }
74
+ if (filterConstraints.attribute2 && filterConstraints.attribute2.length > 0) {
75
+ if (!item.productAttributeText2)
76
+ return false;
77
+ results.push(filterConstraints.attribute2.includes(item.productAttributeText2));
78
+ }
79
+ if (filterConstraints.altCategory && filterConstraints.altCategory.length > 0) {
80
+ if (!item.category1)
81
+ return false;
82
+ results.push(filterConstraints.altCategory.includes(item.category1));
83
+ }
84
+ if (filterConstraints.manufacturingBatchNumbers && filterConstraints.manufacturingBatchNumbers.length > 0) {
85
+ if (!item.batchNo)
86
+ return false;
87
+ results.push(filterConstraints.manufacturingBatchNumbers.includes(item.batchNo));
88
+ }
89
+ if (results.length === 0)
90
+ return false;
91
+ return results.every((v) => v);
92
+ }
93
+ //# sourceMappingURL=scheme-applicability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheme-applicability.js","sourceRoot":"","sources":["../../../src/helpers/scheme-applicability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ // ─── @fa/scheme-engine ──────────────────────────────────────────
2
+ // Pure-function scheme calculation engine for FieldAssist DMS.
3
+ // Zero dependencies on NestJS, Nuxt, or BaseOrderItem.
4
+ // ─── Types ──────────────────────────────────────────────────────
5
+ export * from "./types";
6
+ // ─── Helpers ────────────────────────────────────────────────────
7
+ export * from "./helpers";
8
+ // ─── Calculators ────────────────────────────────────────────────
9
+ export * from "./calculators";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,+DAA+D;AAC/D,uDAAuD;AAEvD,mEAAmE;AACnE,cAAc,SAAS,CAAC;AAExB,mEAAmE;AACnE,cAAc,WAAW,CAAC;AAE1B,mEAAmE;AACnE,cAAc,eAAe,CAAC"}
@@ -0,0 +1,19 @@
1
+ // ─── Default / empty SchemeSlabResult ───────────────────────────
2
+ export function createEmptySlabResult(payoutType) {
3
+ return {
4
+ matched: false,
5
+ matchedSlabId: null,
6
+ payoutType,
7
+ discountPercent: 0,
8
+ discountValue: 0,
9
+ freeQty: 0,
10
+ focPercent: 0,
11
+ isGstReform: false,
12
+ additionalDiscountPercent_1: 0,
13
+ budgetConsumed: 0,
14
+ recalculateSchemeData: null,
15
+ targetMethod: "setDiscountScheme",
16
+ warnings: [],
17
+ };
18
+ }
19
+ //# sourceMappingURL=applied-scheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applied-scheme.js","sourceRoot":"","sources":["../../../src/types/applied-scheme.ts"],"names":[],"mappings":"AAqMA,mEAAmE;AACnE,MAAM,UAAU,qBAAqB,CAAC,UAAqC;IACzE,OAAO;QACL,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,IAAI;QACnB,UAAU;QACV,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,KAAK;QAClB,2BAA2B,EAAE,CAAC;QAC9B,cAAc,EAAE,CAAC;QACjB,qBAAqB,EAAE,IAAI;QAC3B,YAAY,EAAE,mBAAmB;QACjC,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,115 @@
1
+ // ─── Scheme Category ────────────────────────────────────────────
2
+ // DB values: "Primary", "Secondary"
3
+ export var SchemeCategory;
4
+ (function (SchemeCategory) {
5
+ SchemeCategory["PRIMARY"] = "Primary";
6
+ SchemeCategory["SECONDARY"] = "Secondary";
7
+ })(SchemeCategory || (SchemeCategory = {}));
8
+ // ─── Scheme Payout Type ─────────────────────────────────────────
9
+ // DB values must never change (see Appendix A)
10
+ export var SchemePayoutType;
11
+ (function (SchemePayoutType) {
12
+ SchemePayoutType["PRODUCT"] = "Product";
13
+ SchemePayoutType["FOC"] = "FOC";
14
+ SchemePayoutType["ARTICLE"] = "Article";
15
+ SchemePayoutType["DISCOUNT"] = "Discount";
16
+ SchemePayoutType["TOPUP"] = "TopUpDiscount";
17
+ SchemePayoutType["PERUNIT"] = "PerUnitDiscount";
18
+ SchemePayoutType["BASKET"] = "Basket";
19
+ SchemePayoutType["FIXED_DISCOUNT"] = "FixedValueDiscount";
20
+ SchemePayoutType["COUPON"] = "CouponScheme";
21
+ SchemePayoutType["PERCENTAGE_DISCOUNT_ON_MRP"] = "PercentageDiscountOnMRP";
22
+ SchemePayoutType["FOC_SLAB"] = "FOCSlab";
23
+ SchemePayoutType["PRODUCT_SCHEME_NEW"] = "ProductSchemeNew";
24
+ SchemePayoutType["NLP"] = "NLP";
25
+ })(SchemePayoutType || (SchemePayoutType = {}));
26
+ // ─── Payout Calculation Type ────────────────────────────────────
27
+ // Normalized to lowercase. Code always compares via .toLowerCase()
28
+ export const SchemePayoutCalculationType = {
29
+ NONE: "none",
30
+ STEP: "step",
31
+ CONTINUOUS: "continuous",
32
+ STEP_MULTIPLIER: "stepmultiplier",
33
+ PRORATA: "prorata",
34
+ };
35
+ // ─── Constraint Type ────────────────────────────────────────────
36
+ // DB values: "Amount", "Quantity", "Standard_Unit", etc.
37
+ export const SchemeConstraintType = {
38
+ AMOUNT: "Amount",
39
+ QUANTITY: "Quantity",
40
+ STD_UNIT: "Standard_Unit",
41
+ ACTUAL_STD_UNIT: "Actual_Standard_Unit",
42
+ SUPER_UNIT: "Super_Unit",
43
+ ADDITIONAL_UNIT: "Additional_Unit",
44
+ };
45
+ // ─── Scheme On (applicability target) ───────────────────────────
46
+ export const SchemeSchemeOn = {
47
+ PRODUCT: "Product",
48
+ PRIMARY_CATEGORY: "Primary_Category",
49
+ SECONDARY_CATEGORY: "Secondary_Category",
50
+ GROUP: "Group",
51
+ ALL: "All",
52
+ MASTER_BATCH: "Master_Batch",
53
+ };
54
+ // ─── Additional Calculation Logic ───────────────────────────────
55
+ export var AdditionalCalculationLogic;
56
+ (function (AdditionalCalculationLogic) {
57
+ AdditionalCalculationLogic[AdditionalCalculationLogic["DISCOUNT_VALUE_SUBTRACTED_FROM_MRP"] = 1] = "DISCOUNT_VALUE_SUBTRACTED_FROM_MRP";
58
+ AdditionalCalculationLogic[AdditionalCalculationLogic["DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE"] = 2] = "DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE";
59
+ })(AdditionalCalculationLogic || (AdditionalCalculationLogic = {}));
60
+ // ─── Scheme Budget Type ─────────────────────────────────────────
61
+ export var SchemeBudgetType;
62
+ (function (SchemeBudgetType) {
63
+ SchemeBudgetType[SchemeBudgetType["VALUE"] = 1] = "VALUE";
64
+ SchemeBudgetType[SchemeBudgetType["QUANTITY"] = 2] = "QUANTITY";
65
+ })(SchemeBudgetType || (SchemeBudgetType = {}));
66
+ // ─── Scheme Sub Type ────────────────────────────────────────────
67
+ export const SchemeSubType = {
68
+ EXTENDABLE: "Extendable",
69
+ NON_EXTENDABLE: "Non_Extendable",
70
+ };
71
+ export const SchemeSubType2 = {
72
+ CLAIMABLE: "Claimable",
73
+ NON_CLAIMABLE: "Non_Claimable",
74
+ };
75
+ // ─── Scheme Payout In ───────────────────────────────────────────
76
+ export const SchemePayoutIn = {
77
+ QUANTITY: "Quantity",
78
+ STANDARD_UNIT: "Standard_Unit",
79
+ };
80
+ // ─── Entity Type (for first qualifier) ──────────────────────────
81
+ export var EntityType;
82
+ (function (EntityType) {
83
+ EntityType[EntityType["product"] = 1] = "product";
84
+ EntityType[EntityType["primaryCategory"] = 2] = "primaryCategory";
85
+ EntityType[EntityType["secondaryCategory"] = 3] = "secondaryCategory";
86
+ EntityType[EntityType["alternateCategory"] = 4] = "alternateCategory";
87
+ EntityType[EntityType["attributeText1"] = 5] = "attributeText1";
88
+ })(EntityType || (EntityType = {}));
89
+ // ─── Second Qualifier Type ──────────────────────────────────────
90
+ export var SecondQualifierType;
91
+ (function (SecondQualifierType) {
92
+ SecondQualifierType[SecondQualifierType["LPC"] = 1] = "LPC";
93
+ })(SecondQualifierType || (SecondQualifierType = {}));
94
+ // ─── Third Qualifier Type ───────────────────────────────────────
95
+ export var ThirdQualifierType;
96
+ (function (ThirdQualifierType) {
97
+ ThirdQualifierType[ThirdQualifierType["VALUE"] = 1] = "VALUE";
98
+ ThirdQualifierType[ThirdQualifierType["QUANTITY"] = 2] = "QUANTITY";
99
+ })(ThirdQualifierType || (ThirdQualifierType = {}));
100
+ // ─── Discount On Type ───────────────────────────────────────────
101
+ export var DiscountOnType;
102
+ (function (DiscountOnType) {
103
+ DiscountOnType[DiscountOnType["GroupScheme"] = 1] = "GroupScheme";
104
+ })(DiscountOnType || (DiscountOnType = {}));
105
+ // ─── Scheme Variant Type ────────────────────────────────────────
106
+ export const SchemeVariantType = {
107
+ NORMAL: "Normal",
108
+ MASTER_BATCH: "MasterBatch",
109
+ };
110
+ // ─── Multiple Schemes With Same SKU ─────────────────────────────
111
+ export var MultipleSchemesWithSameSku;
112
+ (function (MultipleSchemesWithSameSku) {
113
+ MultipleSchemesWithSameSku[MultipleSchemesWithSameSku["APPLY_LOWEST_GEO_HIERARCHY_SCHEME"] = 1] = "APPLY_LOWEST_GEO_HIERARCHY_SCHEME";
114
+ })(MultipleSchemesWithSameSku || (MultipleSchemesWithSameSku = {}));
115
+ //# sourceMappingURL=enums.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.js","sourceRoot":"","sources":["../../../src/types/enums.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./enums";
2
+ export * from "./scheme";
3
+ export * from "./applied-scheme";
4
+ export * from "./item-props";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=item-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-props.js","sourceRoot":"","sources":["../../../src/types/item-props.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheme.js","sourceRoot":"","sources":["../../../src/types/scheme.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Checks if payout calculation type is 'step'.
3
+ * Normalizes to lowercase for comparison.
4
+ */
5
+ export declare function isPayoutCalcTypeStep(payoutCalcType: string | null): boolean;
6
+ /**
7
+ * Checks if payout calculation type is 'continuous'.
8
+ * Normalizes to lowercase for comparison.
9
+ */
10
+ export declare function isPayoutCalcTypeContinuous(payoutCalcType: string | null): boolean;
11
+ /**
12
+ * Checks if payout calculation type is 'stepmultiplier'.
13
+ * Normalizes to lowercase for comparison.
14
+ */
15
+ export declare function isPayoutCalcTypeStepMultiplier(payoutCalcType: string | null): boolean;
16
+ /**
17
+ * Checks if payout calculation type is 'prorata'.
18
+ * NEW: Not yet in either codebase — implements Bug 9 fix.
19
+ */
20
+ export declare function isPayoutCalcTypeProrata(payoutCalcType: string | null): boolean;
21
+ //# sourceMappingURL=calc-type-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calc-type-checks.d.ts","sourceRoot":"","sources":["../../src/helpers/calc-type-checks.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE3E;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAEjF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE9E"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPayoutCalcTypeStep = isPayoutCalcTypeStep;
4
+ exports.isPayoutCalcTypeContinuous = isPayoutCalcTypeContinuous;
5
+ exports.isPayoutCalcTypeStepMultiplier = isPayoutCalcTypeStepMultiplier;
6
+ exports.isPayoutCalcTypeProrata = isPayoutCalcTypeProrata;
7
+ const enums_1 = require("../types/enums");
8
+ /**
9
+ * Checks if payout calculation type is 'step'.
10
+ * Normalizes to lowercase for comparison.
11
+ */
12
+ function isPayoutCalcTypeStep(payoutCalcType) {
13
+ return payoutCalcType?.toLowerCase()?.trim() === enums_1.SchemePayoutCalculationType.STEP;
14
+ }
15
+ /**
16
+ * Checks if payout calculation type is 'continuous'.
17
+ * Normalizes to lowercase for comparison.
18
+ */
19
+ function isPayoutCalcTypeContinuous(payoutCalcType) {
20
+ return payoutCalcType?.toLowerCase()?.trim() === enums_1.SchemePayoutCalculationType.CONTINUOUS;
21
+ }
22
+ /**
23
+ * Checks if payout calculation type is 'stepmultiplier'.
24
+ * Normalizes to lowercase for comparison.
25
+ */
26
+ function isPayoutCalcTypeStepMultiplier(payoutCalcType) {
27
+ return payoutCalcType?.toLowerCase()?.trim() === enums_1.SchemePayoutCalculationType.STEP_MULTIPLIER;
28
+ }
29
+ /**
30
+ * Checks if payout calculation type is 'prorata'.
31
+ * NEW: Not yet in either codebase — implements Bug 9 fix.
32
+ */
33
+ function isPayoutCalcTypeProrata(payoutCalcType) {
34
+ return payoutCalcType?.toLowerCase()?.trim() === enums_1.SchemePayoutCalculationType.PRORATA;
35
+ }
36
+ //# 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":";;AAMA,oDAEC;AAMD,gEAEC;AAMD,wEAEC;AAMD,0DAEC;AAhCD,0CAA6D;AAE7D;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,cAA6B;IAChE,OAAO,cAAc,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,mCAA2B,CAAC,IAAI,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,SAAgB,0BAA0B,CAAC,cAA6B;IACtE,OAAO,cAAc,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,mCAA2B,CAAC,UAAU,CAAC;AAC1F,CAAC;AAED;;;GAGG;AACH,SAAgB,8BAA8B,CAAC,cAA6B;IAC1E,OAAO,cAAc,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,mCAA2B,CAAC,eAAe,CAAC;AAC/F,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,cAA6B;IACnE,OAAO,cAAc,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,mCAA2B,CAAC,OAAO,CAAC;AACvF,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { ItemCalculationProps } from "../types/item-props";
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 declare function itemBaseValueForConstraint(item: ItemCalculationProps, isMrpBilling?: boolean): number;
7
+ /**
8
+ * Calculate MRP billing price (MRP / (1 + tax/100)).
9
+ */
10
+ export declare function calculateMrpBillingPrice(item: ItemCalculationProps, includeAllTaxes?: boolean): number;
11
+ /**
12
+ * Returns the aggregate quantity across all items.
13
+ */
14
+ export declare function calculateTotalQuantity(items: ItemCalculationProps[]): number;
15
+ /**
16
+ * Returns the aggregate amount (base value for constraint) across all items.
17
+ */
18
+ export declare function calculateTotalAmount(items: ItemCalculationProps[], isMrpBilling?: boolean): number;
19
+ /**
20
+ * Returns the total quantity in standard units (cases).
21
+ */
22
+ export declare function calculateTotalStdUnits(items: ItemCalculationProps[]): number;
23
+ /**
24
+ * Returns the total quantity in actual standard units.
25
+ */
26
+ export declare function calculateActualTotalStdUnits(items: ItemCalculationProps[]): number;
27
+ /**
28
+ * Returns the total quantity in super units.
29
+ */
30
+ export declare function calculateTotalSuperUnits(items: ItemCalculationProps[]): number;
31
+ /**
32
+ * Returns the total quantity in additional units.
33
+ */
34
+ export declare function calculateTotalAdditionalUnits(items: ItemCalculationProps[]): number;
35
+ /**
36
+ * Get the compare value for a scheme based on its constraint type.
37
+ * Uses FE superset with 6 constraint types.
38
+ */
39
+ export declare function getCategorySchemeCompareValue(constraintType: string, totalQuantity: number, totalAmount: number, totalStdUnits: number, actualStdUnits: number, totalSuperUnits: number, totalAdditionalUnits: number): number;
40
+ //# sourceMappingURL=compare-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-value.d.ts","sourceRoot":"","sources":["../../src/helpers/compare-value.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,oBAAoB,EAC1B,YAAY,UAAQ,GACnB,MAAM,CAUR;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,oBAAoB,EAC1B,eAAe,UAAQ,GACtB,MAAM,CAkBR;AAID;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,EAAE,EAAE,YAAY,UAAQ,GAAG,MAAM,CAEhG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAU5E;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAKlF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAK9E;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAKnF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,MAAM,GAC3B,MAAM,CAiBR"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.itemBaseValueForConstraint = itemBaseValueForConstraint;
4
+ exports.calculateMrpBillingPrice = calculateMrpBillingPrice;
5
+ exports.calculateTotalQuantity = calculateTotalQuantity;
6
+ exports.calculateTotalAmount = calculateTotalAmount;
7
+ exports.calculateTotalStdUnits = calculateTotalStdUnits;
8
+ exports.calculateActualTotalStdUnits = calculateActualTotalStdUnits;
9
+ exports.calculateTotalSuperUnits = calculateTotalSuperUnits;
10
+ exports.calculateTotalAdditionalUnits = calculateTotalAdditionalUnits;
11
+ exports.getCategorySchemeCompareValue = getCategorySchemeCompareValue;
12
+ const enums_1 = require("../types/enums");
13
+ /**
14
+ * Get the base value of an item for scheme constraint comparison.
15
+ * Uses netValue + cashDiscountValue if available, else quantity * price.
16
+ */
17
+ function itemBaseValueForConstraint(item, isMrpBilling = false) {
18
+ const price = isMrpBilling ? calculateMrpBillingPrice(item) : (item.price || 0);
19
+ const totalValueForSchemeApplication = getTotalValueForSchemeApplication(item);
20
+ if (totalValueForSchemeApplication) {
21
+ return totalValueForSchemeApplication;
22
+ }
23
+ else {
24
+ return (item.quantity || 0) * price;
25
+ }
26
+ }
27
+ function getTotalValueForSchemeApplication(item) {
28
+ return (item.netValue || 0) + (item.cashDiscountValue || 0);
29
+ }
30
+ /**
31
+ * Calculate MRP billing price (MRP / (1 + tax/100)).
32
+ */
33
+ function calculateMrpBillingPrice(item, includeAllTaxes = false) {
34
+ let totalTaxPercent = 0;
35
+ const cessPercent = Number(item.cessPercent ?? 0);
36
+ const igstPercent = Number(item.igst ?? 0);
37
+ const vatPercent = Number(item.vatPercent ?? 0);
38
+ if (includeAllTaxes) {
39
+ if (igstPercent > 0) {
40
+ totalTaxPercent = igstPercent + cessPercent;
41
+ }
42
+ else if (vatPercent > 0) {
43
+ totalTaxPercent = vatPercent + cessPercent;
44
+ }
45
+ }
46
+ else {
47
+ totalTaxPercent = igstPercent;
48
+ }
49
+ const calculatedPrice = Number(item.mrp ?? 0) / (1 + totalTaxPercent / 100);
50
+ return Number(calculatedPrice.toFixed(2));
51
+ }
52
+ // ─── Aggregate Calculators ──────────────────────────────────────
53
+ /**
54
+ * Returns the aggregate quantity across all items.
55
+ */
56
+ function calculateTotalQuantity(items) {
57
+ return items.reduce((prev, curr) => prev + (curr.quantity || 0), 0);
58
+ }
59
+ /**
60
+ * Returns the aggregate amount (base value for constraint) across all items.
61
+ */
62
+ function calculateTotalAmount(items, isMrpBilling = false) {
63
+ return items.reduce((prev, curr) => prev + itemBaseValueForConstraint(curr, isMrpBilling), 0);
64
+ }
65
+ /**
66
+ * Returns the total quantity in standard units (cases).
67
+ */
68
+ function calculateTotalStdUnits(items) {
69
+ const total = items.reduce((prev, curr) => prev + curr.quantity / (curr.standardUnitConversionFactor || 1), 0);
70
+ const roundedTotal = Math.round((total + Number.EPSILON) * 100) / 100;
71
+ if (Math.abs(total - roundedTotal) < Number.EPSILON) {
72
+ return roundedTotal;
73
+ }
74
+ return total;
75
+ }
76
+ /**
77
+ * Returns the total quantity in actual standard units.
78
+ */
79
+ function calculateActualTotalStdUnits(items) {
80
+ return items.reduce((prev, curr) => prev + curr.quantity / (curr.actualStandardUnitConversionFactor || 1), 0);
81
+ }
82
+ /**
83
+ * Returns the total quantity in super units.
84
+ */
85
+ function calculateTotalSuperUnits(items) {
86
+ return items.reduce((prev, curr) => prev + curr.quantity / (curr.superUnitConversionFactor || 1), 0);
87
+ }
88
+ /**
89
+ * Returns the total quantity in additional units.
90
+ */
91
+ function calculateTotalAdditionalUnits(items) {
92
+ return items.reduce((prev, curr) => {
93
+ if (!curr.additionalUnitConversionFactor)
94
+ return prev;
95
+ return prev + curr.quantity / curr.additionalUnitConversionFactor;
96
+ }, 0);
97
+ }
98
+ /**
99
+ * Get the compare value for a scheme based on its constraint type.
100
+ * Uses FE superset with 6 constraint types.
101
+ */
102
+ function getCategorySchemeCompareValue(constraintType, totalQuantity, totalAmount, totalStdUnits, actualStdUnits, totalSuperUnits, totalAdditionalUnits) {
103
+ switch (constraintType) {
104
+ case enums_1.SchemeConstraintType.QUANTITY:
105
+ return totalQuantity;
106
+ case enums_1.SchemeConstraintType.AMOUNT:
107
+ return totalAmount;
108
+ case enums_1.SchemeConstraintType.STD_UNIT:
109
+ return totalStdUnits;
110
+ case enums_1.SchemeConstraintType.ACTUAL_STD_UNIT:
111
+ return actualStdUnits;
112
+ case enums_1.SchemeConstraintType.SUPER_UNIT:
113
+ return totalSuperUnits;
114
+ case enums_1.SchemeConstraintType.ADDITIONAL_UNIT:
115
+ return totalAdditionalUnits;
116
+ default:
117
+ return 0;
118
+ }
119
+ }
120
+ //# sourceMappingURL=compare-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-value.js","sourceRoot":"","sources":["../../src/helpers/compare-value.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { SchemePayoutType } from "../types/enums";
2
+ import type { Slab } from "../types/scheme";
3
+ /**
4
+ * Checks if a constraint type is valid (one of the 6 known types).
5
+ * Uses FE superset: includes SUPER_UNIT and ADDITIONAL_UNIT.
6
+ */
7
+ export declare function isValidConstraintType(constraintType: string): boolean;
8
+ /**
9
+ * Checks if a compare value satisfies a slab's constraint.
10
+ *
11
+ * Bug 10 fix: maxConstraint enforcement is payout-type-aware.
12
+ * - For DISCOUNT, PERUNIT, MRP%, FIXED_DISCOUNT, BASKET, COUPON: ignore maxConstraint
13
+ * - For FOC, FOC_SLAB, PRODUCT, PRODUCT_SCHEME_NEW, TOPUP: enforce maxConstraint
14
+ *
15
+ * @param compareValue - The aggregated value to compare against the slab
16
+ * @param slab - The slab with constraint and optional maxConstraint
17
+ * @param payoutType - The scheme payout type (determines maxConstraint enforcement)
18
+ */
19
+ export declare function checkSlabConstraint(compareValue: number, slab: Slab, payoutType?: SchemePayoutType | string): boolean;
20
+ /**
21
+ * Validates that a FOC step multiplier scheme has valid configuration.
22
+ * Used as a guard before applying StepMultiplier calculation.
23
+ */
24
+ export declare function isValidFocStepMultiplierSchemeLogic(category: string, constraintType: string, payoutIn: string): boolean;
25
+ /**
26
+ * Validates that a continuous FOC scheme has valid configuration.
27
+ * Used as a guard before applying continuous FOC interpolation.
28
+ */
29
+ export declare function isValidContinuousSchemeLogic(category: string, constraintType: string, payoutIn: string): boolean;
30
+ //# sourceMappingURL=constraint-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraint-checks.d.ts","sourceRoot":"","sources":["../../src/helpers/constraint-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CASrE;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,IAAI,EACV,UAAU,CAAC,EAAE,gBAAgB,GAAG,MAAM,GACrC,OAAO,CAWT;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAeT;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAET"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isValidConstraintType = isValidConstraintType;
4
+ exports.checkSlabConstraint = checkSlabConstraint;
5
+ exports.isValidFocStepMultiplierSchemeLogic = isValidFocStepMultiplierSchemeLogic;
6
+ exports.isValidContinuousSchemeLogic = isValidContinuousSchemeLogic;
7
+ const enums_1 = require("../types/enums");
8
+ /**
9
+ * Checks if a constraint type is valid (one of the 6 known types).
10
+ * Uses FE superset: includes SUPER_UNIT and ADDITIONAL_UNIT.
11
+ */
12
+ function isValidConstraintType(constraintType) {
13
+ return (constraintType === enums_1.SchemeConstraintType.QUANTITY ||
14
+ constraintType === enums_1.SchemeConstraintType.AMOUNT ||
15
+ constraintType === enums_1.SchemeConstraintType.STD_UNIT ||
16
+ constraintType === enums_1.SchemeConstraintType.ACTUAL_STD_UNIT ||
17
+ constraintType === enums_1.SchemeConstraintType.SUPER_UNIT ||
18
+ constraintType === enums_1.SchemeConstraintType.ADDITIONAL_UNIT);
19
+ }
20
+ // Payout types that enforce maxConstraint on slab matching (Appendix C)
21
+ const MAX_CONSTRAINT_ENFORCED_TYPES = new Set([
22
+ enums_1.SchemePayoutType.FOC,
23
+ enums_1.SchemePayoutType.FOC_SLAB,
24
+ enums_1.SchemePayoutType.PRODUCT,
25
+ enums_1.SchemePayoutType.PRODUCT_SCHEME_NEW,
26
+ enums_1.SchemePayoutType.TOPUP,
27
+ ]);
28
+ /**
29
+ * Checks if a compare value satisfies a slab's constraint.
30
+ *
31
+ * Bug 10 fix: maxConstraint enforcement is payout-type-aware.
32
+ * - For DISCOUNT, PERUNIT, MRP%, FIXED_DISCOUNT, BASKET, COUPON: ignore maxConstraint
33
+ * - For FOC, FOC_SLAB, PRODUCT, PRODUCT_SCHEME_NEW, TOPUP: enforce maxConstraint
34
+ *
35
+ * @param compareValue - The aggregated value to compare against the slab
36
+ * @param slab - The slab with constraint and optional maxConstraint
37
+ * @param payoutType - The scheme payout type (determines maxConstraint enforcement)
38
+ */
39
+ function checkSlabConstraint(compareValue, slab, payoutType) {
40
+ if (compareValue < slab.constraint) {
41
+ return false;
42
+ }
43
+ // Only enforce maxConstraint for specific payout types
44
+ if (payoutType && MAX_CONSTRAINT_ENFORCED_TYPES.has(payoutType) && slab.maxConstraint) {
45
+ return compareValue <= slab.maxConstraint;
46
+ }
47
+ return true;
48
+ }
49
+ /**
50
+ * Validates that a FOC step multiplier scheme has valid configuration.
51
+ * Used as a guard before applying StepMultiplier calculation.
52
+ */
53
+ function isValidFocStepMultiplierSchemeLogic(category, constraintType, payoutIn) {
54
+ const validCategories = ["Primary", "Secondary"];
55
+ const validConstraints = [
56
+ enums_1.SchemeConstraintType.AMOUNT,
57
+ enums_1.SchemeConstraintType.QUANTITY,
58
+ enums_1.SchemeConstraintType.STD_UNIT,
59
+ enums_1.SchemeConstraintType.SUPER_UNIT,
60
+ ];
61
+ const validPayoutIns = ["Quantity", "Standard_Unit"];
62
+ return (validCategories.includes(category) &&
63
+ validConstraints.includes(constraintType) &&
64
+ validPayoutIns.includes(payoutIn));
65
+ }
66
+ /**
67
+ * Validates that a continuous FOC scheme has valid configuration.
68
+ * Used as a guard before applying continuous FOC interpolation.
69
+ */
70
+ function isValidContinuousSchemeLogic(category, constraintType, payoutIn) {
71
+ return isValidFocStepMultiplierSchemeLogic(category, constraintType, payoutIn);
72
+ }
73
+ //# sourceMappingURL=constraint-checks.js.map