@parv0888/scheme-engine 0.1.1 → 0.1.2

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 (114) hide show
  1. package/dist/calculators/discount-application.d.ts +44 -0
  2. package/dist/calculators/index.d.ts +65 -0
  3. package/dist/calculators/index.d.ts.map +1 -0
  4. package/dist/calculators/index.js +196 -0
  5. package/dist/calculators/index.js.map +1 -0
  6. package/dist/calculators/payout-types/article.d.ts +23 -0
  7. package/dist/calculators/payout-types/article.d.ts.map +1 -0
  8. package/dist/calculators/payout-types/article.js +73 -0
  9. package/dist/calculators/payout-types/article.js.map +1 -0
  10. package/dist/calculators/payout-types/basket.d.ts +49 -0
  11. package/dist/calculators/payout-types/basket.d.ts.map +1 -0
  12. package/dist/calculators/payout-types/basket.js +108 -0
  13. package/dist/calculators/payout-types/basket.js.map +1 -0
  14. package/dist/calculators/payout-types/coupon.d.ts +23 -0
  15. package/dist/calculators/payout-types/coupon.d.ts.map +1 -0
  16. package/dist/calculators/payout-types/coupon.js +74 -0
  17. package/dist/calculators/payout-types/coupon.js.map +1 -0
  18. package/dist/calculators/payout-types/discount.d.ts +21 -0
  19. package/dist/calculators/payout-types/discount.d.ts.map +1 -0
  20. package/dist/calculators/payout-types/discount.js +110 -0
  21. package/dist/calculators/payout-types/discount.js.map +1 -0
  22. package/dist/calculators/payout-types/fixed-discount.d.ts +31 -0
  23. package/dist/calculators/payout-types/fixed-discount.d.ts.map +1 -0
  24. package/dist/calculators/payout-types/fixed-discount.js +65 -0
  25. package/dist/calculators/payout-types/fixed-discount.js.map +1 -0
  26. package/dist/calculators/payout-types/foc.d.ts +30 -0
  27. package/dist/calculators/payout-types/foc.d.ts.map +1 -0
  28. package/dist/calculators/payout-types/foc.js +130 -0
  29. package/dist/calculators/payout-types/foc.js.map +1 -0
  30. package/dist/calculators/payout-types/mrp-percentage.d.ts +34 -0
  31. package/dist/calculators/payout-types/mrp-percentage.d.ts.map +1 -0
  32. package/dist/calculators/payout-types/mrp-percentage.js +77 -0
  33. package/dist/calculators/payout-types/mrp-percentage.js.map +1 -0
  34. package/dist/calculators/payout-types/nlp.d.ts +22 -0
  35. package/dist/calculators/payout-types/nlp.d.ts.map +1 -0
  36. package/dist/calculators/payout-types/nlp.js +59 -0
  37. package/dist/calculators/payout-types/nlp.js.map +1 -0
  38. package/dist/calculators/payout-types/per-unit.d.ts +32 -0
  39. package/dist/calculators/payout-types/per-unit.d.ts.map +1 -0
  40. package/dist/calculators/payout-types/per-unit.js +94 -0
  41. package/dist/calculators/payout-types/per-unit.js.map +1 -0
  42. package/dist/calculators/payout-types/product-new.d.ts +27 -0
  43. package/dist/calculators/payout-types/product-new.d.ts.map +1 -0
  44. package/dist/calculators/payout-types/product-new.js +85 -0
  45. package/dist/calculators/payout-types/product-new.js.map +1 -0
  46. package/dist/calculators/payout-types/product.d.ts +31 -0
  47. package/dist/calculators/payout-types/product.d.ts.map +1 -0
  48. package/dist/calculators/payout-types/product.js +73 -0
  49. package/dist/calculators/payout-types/product.js.map +1 -0
  50. package/dist/calculators/payout-types/topup.d.ts +19 -0
  51. package/dist/calculators/payout-types/topup.d.ts.map +1 -0
  52. package/dist/calculators/payout-types/topup.js +46 -0
  53. package/dist/calculators/payout-types/topup.js.map +1 -0
  54. package/dist/calculators/slab-matcher.d.ts +41 -0
  55. package/dist/calculators/slab-matcher.d.ts.map +1 -0
  56. package/dist/calculators/slab-matcher.js +68 -0
  57. package/dist/calculators/slab-matcher.js.map +1 -0
  58. package/dist/helpers/calc-type-checks.d.ts +21 -0
  59. package/dist/helpers/calc-type-checks.d.ts.map +1 -0
  60. package/dist/helpers/calc-type-checks.js +36 -0
  61. package/dist/helpers/calc-type-checks.js.map +1 -0
  62. package/dist/helpers/compare-value.d.ts +40 -0
  63. package/dist/helpers/compare-value.d.ts.map +1 -0
  64. package/dist/helpers/compare-value.js +120 -0
  65. package/dist/helpers/compare-value.js.map +1 -0
  66. package/dist/helpers/constraint-checks.d.ts +30 -0
  67. package/dist/helpers/constraint-checks.d.ts.map +1 -0
  68. package/dist/helpers/constraint-checks.js +73 -0
  69. package/dist/helpers/constraint-checks.js.map +1 -0
  70. package/dist/helpers/index.d.ts +8 -0
  71. package/dist/helpers/index.d.ts.map +1 -0
  72. package/dist/helpers/index.js +24 -0
  73. package/dist/helpers/index.js.map +1 -0
  74. package/dist/helpers/math.d.ts +50 -0
  75. package/dist/helpers/math.d.ts.map +1 -0
  76. package/dist/helpers/math.js +96 -0
  77. package/dist/helpers/math.js.map +1 -0
  78. package/dist/helpers/payout-type-checks.d.ts +17 -0
  79. package/dist/helpers/payout-type-checks.d.ts.map +1 -0
  80. package/dist/helpers/payout-type-checks.js +34 -0
  81. package/dist/helpers/payout-type-checks.js.map +1 -0
  82. package/dist/helpers/qualifier-checks.d.ts +62 -0
  83. package/dist/helpers/qualifier-checks.d.ts.map +1 -0
  84. package/dist/helpers/qualifier-checks.js +194 -0
  85. package/dist/helpers/qualifier-checks.js.map +1 -0
  86. package/dist/helpers/scheme-applicability.d.ts +40 -0
  87. package/dist/helpers/scheme-applicability.d.ts.map +1 -0
  88. package/dist/helpers/scheme-applicability.js +99 -0
  89. package/dist/helpers/scheme-applicability.js.map +1 -0
  90. package/dist/index.d.ts +4 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +26 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/types/applied-scheme.d.ts +157 -0
  95. package/dist/types/applied-scheme.d.ts.map +1 -0
  96. package/dist/types/applied-scheme.js +22 -0
  97. package/dist/types/applied-scheme.js.map +1 -0
  98. package/dist/types/enums.d.ts +91 -0
  99. package/dist/types/enums.d.ts.map +1 -0
  100. package/dist/types/enums.js +118 -0
  101. package/dist/types/enums.js.map +1 -0
  102. package/dist/types/index.d.ts +5 -0
  103. package/dist/types/index.d.ts.map +1 -0
  104. package/dist/types/index.js +21 -0
  105. package/dist/types/index.js.map +1 -0
  106. package/dist/types/item-props.d.ts +103 -0
  107. package/dist/types/item-props.d.ts.map +1 -0
  108. package/dist/types/item-props.js +3 -0
  109. package/dist/types/item-props.js.map +1 -0
  110. package/dist/types/scheme.d.ts +172 -0
  111. package/dist/types/scheme.d.ts.map +1 -0
  112. package/dist/types/scheme.js +3 -0
  113. package/dist/types/scheme.js.map +1 -0
  114. package/package.json +3 -2
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateCouponPayout = calculateCouponPayout;
4
+ const enums_1 = require("../../types/enums");
5
+ const applied_scheme_1 = require("../../types/applied-scheme");
6
+ const calc_type_checks_1 = require("../../helpers/calc-type-checks");
7
+ const constraint_checks_1 = require("../../helpers/constraint-checks");
8
+ const slab_matcher_1 = require("../slab-matcher");
9
+ /**
10
+ * Calculate payout for COUPON payout type.
11
+ *
12
+ * Continuous: placeholder discount (totalCouponValue = 0) + addProduct
13
+ * Step: addProduct with slab.payout qty
14
+ */
15
+ function calculateCouponPayout(input) {
16
+ const { scheme, compareValue, totalAmount, applicableProducts, isMrpBilling } = input;
17
+ const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.COUPON);
18
+ if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
19
+ result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
20
+ return result;
21
+ }
22
+ const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
23
+ if (slabs.length === 0) {
24
+ result.warnings.push("Slab list is empty");
25
+ return result;
26
+ }
27
+ const payoutCalcType = scheme.payoutCalculationType;
28
+ const matcherParams = {
29
+ slabs,
30
+ compareValue,
31
+ applicableProducts,
32
+ payoutType: enums_1.SchemePayoutType.COUPON,
33
+ discountOn: scheme.discountOn ?? null,
34
+ };
35
+ // ─── Continuous ────────────────────────────────────────────────
36
+ if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType)) {
37
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
38
+ if (!match)
39
+ return result;
40
+ const { slab } = match;
41
+ // Placeholder: coupon value not yet implemented
42
+ const totalCouponValue = 0;
43
+ const itemDiscountPercent = totalAmount > 0 ? totalCouponValue / totalAmount : 0;
44
+ const payoutProductId = slab.productId;
45
+ const factor = Math.floor(compareValue / slab.constraint);
46
+ const payoutQty = (isMrpBilling ? slab.mrpPayout : slab.payout) * factor;
47
+ result.matched = true;
48
+ result.matchedSlabId = slab.id;
49
+ result.discountPercent = itemDiscountPercent;
50
+ result.freeQty = payoutQty;
51
+ result.productToAdd = { productId: payoutProductId, quantity: payoutQty };
52
+ // Multiple target methods: setDiscountScheme for discount + addProduct for free item
53
+ result.targetMethod = "addProduct";
54
+ return result;
55
+ }
56
+ // ─── Step ──────────────────────────────────────────────────────
57
+ if ((0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
58
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
59
+ if (!match)
60
+ return result;
61
+ const { slab } = match;
62
+ const payoutProductId = slab.productId;
63
+ const payoutQty = isMrpBilling ? slab.mrpPayout : slab.payout;
64
+ result.matched = true;
65
+ result.matchedSlabId = slab.id;
66
+ result.freeQty = payoutQty;
67
+ result.productToAdd = { productId: payoutProductId, quantity: payoutQty };
68
+ result.targetMethod = "addProduct";
69
+ return result;
70
+ }
71
+ result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
72
+ return result;
73
+ }
74
+ //# sourceMappingURL=coupon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coupon.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/coupon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Scheme } from "../../types/scheme";
2
+ import type { SchemeSlabResult } from "../../types/applied-scheme";
3
+ import type { QualifierItem } from "../../helpers/qualifier-checks";
4
+ export interface DiscountCalculatorInput {
5
+ /** Full scheme configuration. */
6
+ scheme: Scheme;
7
+ /** Precomputed compare value used for slab matching. */
8
+ compareValue: number;
9
+ /** Items contributing to qualification for this scheme. */
10
+ applicableProducts: QualifierItem[];
11
+ /** Whether to use MRP billing payouts (slab.mrpPayout). */
12
+ isMrpBilling: boolean;
13
+ /** Marks the special GST Claim scheme flow (affects targetMethod and discount fields). */
14
+ isGstClaimScheme: boolean;
15
+ }
16
+ /**
17
+ * Calculate discount payout for DISCOUNT payout type.
18
+ * Supports: Step, Continuous, Prorata (Bug 9 fix).
19
+ */
20
+ export declare function calculateDiscountPayout(input: DiscountCalculatorInput): SchemeSlabResult;
21
+ //# sourceMappingURL=discount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discount.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/discount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAQ,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAGpE,MAAM,WAAW,uBAAuB;IACtC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,2DAA2D;IAC3D,YAAY,EAAE,OAAO,CAAC;IACtB,0FAA0F;IAC1F,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,uBAAuB,GAAG,gBAAgB,CAiHxF"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateDiscountPayout = calculateDiscountPayout;
4
+ const enums_1 = require("../../types/enums");
5
+ const applied_scheme_1 = require("../../types/applied-scheme");
6
+ const calc_type_checks_1 = require("../../helpers/calc-type-checks");
7
+ const constraint_checks_1 = require("../../helpers/constraint-checks");
8
+ const slab_matcher_1 = require("../slab-matcher");
9
+ const enums_2 = require("../../types/enums");
10
+ /**
11
+ * Calculate discount payout for DISCOUNT payout type.
12
+ * Supports: Step, Continuous, Prorata (Bug 9 fix).
13
+ */
14
+ function calculateDiscountPayout(input) {
15
+ const { scheme, compareValue, applicableProducts, isMrpBilling, isGstClaimScheme } = input;
16
+ const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.DISCOUNT);
17
+ if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
18
+ result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
19
+ return result;
20
+ }
21
+ const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
22
+ if (slabs.length === 0) {
23
+ result.warnings.push("Slab list is empty");
24
+ return result;
25
+ }
26
+ const matcherParams = {
27
+ slabs,
28
+ compareValue,
29
+ applicableProducts,
30
+ payoutType: enums_1.SchemePayoutType.DISCOUNT,
31
+ discountOn: scheme.discountOn ?? null,
32
+ };
33
+ const payoutCalcType = scheme.payoutCalculationType;
34
+ // ─── Step ──────────────────────────────────────────────────────
35
+ if ((0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
36
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
37
+ if (match) {
38
+ const { slab } = match;
39
+ const stepDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
40
+ // Client-validated semantics: STEP applies once on the matched slab constraint,
41
+ // not multiplied by floor(compareValue / slab.constraint).
42
+ const discountAmountTotal = (stepDiscountPercent * slab.constraint) / 100;
43
+ const itemDiscountPercent = ((discountAmountTotal || 0) * 100) / (compareValue || 1);
44
+ result.matched = true;
45
+ result.matchedSlabId = slab.id;
46
+ result.discountPercent = itemDiscountPercent;
47
+ result.targetMethod = isGstClaimScheme ? "setGstDiscountScheme" : "setDiscountScheme";
48
+ result.isGstReform = isGstClaimScheme;
49
+ if (isGstClaimScheme) {
50
+ result.additionalDiscountPercent_1 = itemDiscountPercent;
51
+ result.discountPercent = 0;
52
+ }
53
+ }
54
+ return result;
55
+ }
56
+ // ─── Continuous ────────────────────────────────────────────────
57
+ if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType)) {
58
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
59
+ if (match) {
60
+ const { slab } = match;
61
+ const itemDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
62
+ result.matched = true;
63
+ result.matchedSlabId = slab.id;
64
+ result.discountPercent = itemDiscountPercent;
65
+ result.targetMethod = isGstClaimScheme ? "setGstDiscountScheme" : "setDiscountScheme";
66
+ result.isGstReform = isGstClaimScheme;
67
+ if (isGstClaimScheme) {
68
+ result.additionalDiscountPercent_1 = itemDiscountPercent;
69
+ result.discountPercent = 0;
70
+ }
71
+ }
72
+ return result;
73
+ }
74
+ // ─── Prorata (Bug 9 fix — new calculation type) ────────────────
75
+ if ((0, calc_type_checks_1.isPayoutCalcTypeProrata)(payoutCalcType)) {
76
+ const ascSlabs = [...scheme.slabs].sort((a, b) => a.constraint - b.constraint);
77
+ // FieldAssist Prorata (doc): slabs act like stepped bands where each slab's payout applies
78
+ // from its own constraint up to (nextConstraint - 1). The final reached slab applies from
79
+ // its constraint up to compareValue (inclusive), which is why e.g. qty=50 gives "5% of 1".
80
+ if (compareValue < ascSlabs[0].constraint)
81
+ return result;
82
+ let totalDiscount = 0;
83
+ for (let i = 0; i < ascSlabs.length; i++) {
84
+ const slab = ascSlabs[i];
85
+ const next = ascSlabs[i + 1] ?? null;
86
+ const payout = isMrpBilling ? slab.mrpPayout : slab.payout;
87
+ const bandQty = next && compareValue >= next.constraint
88
+ ? Math.max(0, scheme.constraintType === enums_2.SchemeConstraintType.AMOUNT
89
+ ? next.constraint - slab.constraint - 1
90
+ : next.constraint - slab.constraint)
91
+ : Math.max(0, compareValue - slab.constraint + 1);
92
+ if (bandQty > 0) {
93
+ totalDiscount += (bandQty * payout) / 100;
94
+ }
95
+ // If we haven't reached the next slab threshold, this is the final band.
96
+ if (!next || compareValue < next.constraint)
97
+ break;
98
+ }
99
+ const effectivePercent = compareValue > 0 ? (totalDiscount / compareValue) * 100 : 0;
100
+ result.matched = true;
101
+ result.matchedSlabId = ascSlabs[ascSlabs.length - 1]?.id ?? null;
102
+ result.discountPercent = effectivePercent;
103
+ result.targetMethod = isGstClaimScheme ? "setGstDiscountScheme" : "setDiscountScheme";
104
+ result.isGstReform = isGstClaimScheme;
105
+ return result;
106
+ }
107
+ result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
108
+ return result;
109
+ }
110
+ //# sourceMappingURL=discount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discount.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/discount.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Scheme } from "../../types/scheme";
2
+ import type { SchemeSlabResult } from "../../types/applied-scheme";
3
+ import type { QualifierItem } from "../../helpers/qualifier-checks";
4
+ export interface FixedDiscountCalculatorInput {
5
+ /** Full scheme configuration. */
6
+ scheme: Scheme;
7
+ /** Precomputed compare value used for slab matching. */
8
+ compareValue: number;
9
+ /** Total amount of the qualifying set (used to convert fixed value into an effective %). */
10
+ totalAmount: number;
11
+ /** Items contributing to qualification for this scheme. */
12
+ applicableProducts: QualifierItem[];
13
+ /** Whether to use MRP billing payout (slab.mrpPayout) for the fixed value. */
14
+ isMrpBilling: boolean;
15
+ /** Per-item base values for distributing fixed discount across items */
16
+ itemBaseValues: {
17
+ productId: number;
18
+ baseValue: number;
19
+ }[];
20
+ }
21
+ /**
22
+ * Calculate payout for FixedValueDiscount payout type.
23
+ *
24
+ * discountAmountTotal = slab.payout (flat value, not percentage)
25
+ * itemDiscountPercent = discountAmountTotal × 100 / totalAmount
26
+ * itemDiscountValue = itemDiscountPercent × itemBaseValue / 100
27
+ *
28
+ * Budget capping: if remainingBudget < discountValue, adjusts both.
29
+ */
30
+ export declare function calculateFixedDiscountPayout(input: FixedDiscountCalculatorInput): SchemeSlabResult;
31
+ //# sourceMappingURL=fixed-discount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed-discount.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/fixed-discount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,4BAA4B;IAC3C,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,8EAA8E;IAC9E,YAAY,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,4BAA4B,GAClC,gBAAgB,CA4DlB"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateFixedDiscountPayout = calculateFixedDiscountPayout;
4
+ const enums_1 = require("../../types/enums");
5
+ const applied_scheme_1 = require("../../types/applied-scheme");
6
+ const enums_2 = require("../../types/enums");
7
+ const constraint_checks_1 = require("../../helpers/constraint-checks");
8
+ const slab_matcher_1 = require("../slab-matcher");
9
+ /**
10
+ * Calculate payout for FixedValueDiscount payout type.
11
+ *
12
+ * discountAmountTotal = slab.payout (flat value, not percentage)
13
+ * itemDiscountPercent = discountAmountTotal × 100 / totalAmount
14
+ * itemDiscountValue = itemDiscountPercent × itemBaseValue / 100
15
+ *
16
+ * Budget capping: if remainingBudget < discountValue, adjusts both.
17
+ */
18
+ function calculateFixedDiscountPayout(input) {
19
+ const { scheme, compareValue, totalAmount, applicableProducts, isMrpBilling } = input;
20
+ const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.FIXED_DISCOUNT);
21
+ if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
22
+ result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
23
+ return result;
24
+ }
25
+ if (!scheme.payoutCalculationType) {
26
+ result.warnings.push(`No matching calculation type found: ${scheme.payoutCalculationType}`);
27
+ return result;
28
+ }
29
+ const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
30
+ if (slabs.length === 0) {
31
+ result.warnings.push("Slab list is empty");
32
+ return result;
33
+ }
34
+ const matcherParams = {
35
+ slabs,
36
+ compareValue,
37
+ applicableProducts,
38
+ payoutType: enums_1.SchemePayoutType.FIXED_DISCOUNT,
39
+ discountOn: scheme.discountOn ?? null,
40
+ };
41
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
42
+ if (!match)
43
+ return result;
44
+ const { slab } = match;
45
+ const payoutBase = isMrpBilling ? slab.mrpPayout : slab.payout;
46
+ const payoutCalcType = scheme.payoutCalculationType?.toLowerCase()?.trim() ?? "";
47
+ const isStepLike = payoutCalcType === enums_2.SchemePayoutCalculationType.STEP ||
48
+ payoutCalcType === enums_2.SchemePayoutCalculationType.STEP_MULTIPLIER;
49
+ const factor = isStepLike && slab.constraint > 0 ? Math.floor(compareValue / slab.constraint) : 1;
50
+ let discountAmountTotal = payoutBase * Math.max(0, factor || 0);
51
+ // Use remaining budget as a generic max-capping value for fixed payouts
52
+ // (matches how many client validations are modeled: cap total fixed discount).
53
+ const maxCapping = scheme.employeeWiseRemainingBudget;
54
+ if (typeof maxCapping === "number" && maxCapping >= 0) {
55
+ discountAmountTotal = Math.min(discountAmountTotal, maxCapping);
56
+ }
57
+ const itemDiscountPercent = ((discountAmountTotal || 0) * 100) / (totalAmount || 1);
58
+ result.matched = true;
59
+ result.matchedSlabId = slab.id;
60
+ result.discountPercent = itemDiscountPercent;
61
+ result.discountValue = discountAmountTotal;
62
+ result.targetMethod = "setDiscountAndValueScheme";
63
+ return result;
64
+ }
65
+ //# sourceMappingURL=fixed-discount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed-discount.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/fixed-discount.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Scheme } from "../../types/scheme";
2
+ import type { SchemeSlabResult } from "../../types/applied-scheme";
3
+ import type { QualifierItem } from "../../helpers/qualifier-checks";
4
+ export interface FocCalculatorInput {
5
+ /** Full scheme configuration. */
6
+ scheme: Scheme;
7
+ /** Precomputed compare value used for slab matching (usually quantity/units). */
8
+ compareValue: number;
9
+ /** Items contributing to qualification for this scheme. */
10
+ applicableProducts: QualifierItem[];
11
+ /** Whether to use MRP billing payout (slab.mrpPayout) where applicable. */
12
+ isMrpBilling: boolean;
13
+ /** Company rule: step FOC schemes behave differently in DMS (uses slab payout directly). */
14
+ companyUsesStepfocSchemeInDms?: boolean;
15
+ /** Feature toggle: enable continuous FOC interpolation logic. */
16
+ applyContinuousSchemeLogic?: boolean;
17
+ /** Feature toggle: enable step-multiplier FOC logic. */
18
+ applyStepMultiplierSchemeLogic?: boolean;
19
+ }
20
+ /**
21
+ * Calculate payout for FOC and FOC_SLAB payout types.
22
+ * Supports: Step, Continuous, StepMultiplier.
23
+ *
24
+ * FOC: focPercent = itemDiscountPercent (the free qty percentage)
25
+ * FOC_SLAB continuous: focPercent = Math.floor(payout × compareValue)
26
+ * FOC continuous: focPercent = slab.payout (or interpolated)
27
+ * FOC StepMultiplier: focPercent = calculateStepMultiplierDiscount(compareValue, slab)
28
+ */
29
+ export declare function calculateFocPayout(input: FocCalculatorInput): SchemeSlabResult;
30
+ //# sourceMappingURL=foc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foc.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/foc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAOnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,2EAA2E;IAC3E,YAAY,EAAE,OAAO,CAAC;IAEtB,4FAA4F;IAC5F,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,iEAAiE;IACjE,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,wDAAwD;IACxD,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,gBAAgB,CAgJ9E"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateFocPayout = calculateFocPayout;
4
+ const enums_1 = require("../../types/enums");
5
+ const applied_scheme_1 = require("../../types/applied-scheme");
6
+ const calc_type_checks_1 = require("../../helpers/calc-type-checks");
7
+ const constraint_checks_1 = require("../../helpers/constraint-checks");
8
+ const math_1 = require("../../helpers/math");
9
+ const slab_matcher_1 = require("../slab-matcher");
10
+ /**
11
+ * Calculate payout for FOC and FOC_SLAB payout types.
12
+ * Supports: Step, Continuous, StepMultiplier.
13
+ *
14
+ * FOC: focPercent = itemDiscountPercent (the free qty percentage)
15
+ * FOC_SLAB continuous: focPercent = Math.floor(payout × compareValue)
16
+ * FOC continuous: focPercent = slab.payout (or interpolated)
17
+ * FOC StepMultiplier: focPercent = calculateStepMultiplierDiscount(compareValue, slab)
18
+ */
19
+ function calculateFocPayout(input) {
20
+ const { scheme, compareValue, applicableProducts, isMrpBilling, companyUsesStepfocSchemeInDms = false, applyContinuousSchemeLogic = false, applyStepMultiplierSchemeLogic = false, } = input;
21
+ const isFocSlab = scheme.payoutType === enums_1.SchemePayoutType.FOC_SLAB;
22
+ const result = (0, applied_scheme_1.createEmptySlabResult)(scheme.payoutType);
23
+ result.targetMethod = "setFocScheme";
24
+ if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
25
+ result.warnings.push(`Constraint type not matching: ${scheme.constraintType}`);
26
+ return result;
27
+ }
28
+ const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
29
+ if (slabs.length === 0) {
30
+ result.warnings.push("Slab list is empty");
31
+ return result;
32
+ }
33
+ const payoutCalcType = scheme.payoutCalculationType;
34
+ const matcherParams = {
35
+ slabs,
36
+ compareValue,
37
+ applicableProducts,
38
+ payoutType: scheme.payoutType,
39
+ discountOn: scheme.discountOn ?? null,
40
+ };
41
+ // ─── Step ──────────────────────────────────────────────────────
42
+ if ((0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
43
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
44
+ if (!match)
45
+ return result;
46
+ const { slab } = match;
47
+ const stepDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
48
+ const discountAmountTotal = (stepDiscountPercent * slab.constraint) / 100;
49
+ let itemDiscountPercent;
50
+ if (companyUsesStepfocSchemeInDms) {
51
+ itemDiscountPercent = stepDiscountPercent;
52
+ }
53
+ else {
54
+ const employeeWiseRemainingBudget = scheme.employeeWiseRemainingBudget;
55
+ if ((employeeWiseRemainingBudget || employeeWiseRemainingBudget === 0) &&
56
+ compareValue > employeeWiseRemainingBudget) {
57
+ itemDiscountPercent = ((employeeWiseRemainingBudget || 0) * 100) / (compareValue || 1);
58
+ }
59
+ else {
60
+ itemDiscountPercent = ((discountAmountTotal || 0) * 100) / (compareValue || 1);
61
+ }
62
+ }
63
+ result.matched = true;
64
+ result.matchedSlabId = slab.id;
65
+ result.focPercent = itemDiscountPercent;
66
+ result.discountPercent = itemDiscountPercent;
67
+ return result;
68
+ }
69
+ // ─── Continuous FOC_SLAB ───────────────────────────────────────
70
+ if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType) && isFocSlab) {
71
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
72
+ if (!match)
73
+ return result;
74
+ const { slab } = match;
75
+ const stepDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
76
+ const itemDiscountPercent = Math.floor(stepDiscountPercent * compareValue);
77
+ result.matched = true;
78
+ result.matchedSlabId = slab.id;
79
+ result.focPercent = itemDiscountPercent;
80
+ result.discountPercent = itemDiscountPercent;
81
+ return result;
82
+ }
83
+ // ─── Continuous FOC ────────────────────────────────────────────
84
+ if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType)) {
85
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
86
+ if (!match)
87
+ return result;
88
+ const { slab } = match;
89
+ let itemDiscountPercent;
90
+ // Check if continuous FOC interpolation should be applied
91
+ const canInterpolate = applyContinuousSchemeLogic &&
92
+ (0, constraint_checks_1.isValidFocStepMultiplierSchemeLogic)(scheme.category, scheme.constraintType, scheme.payoutIn) &&
93
+ compareValue !== slab.constraint;
94
+ if (canInterpolate) {
95
+ itemDiscountPercent = isMrpBilling
96
+ ? slab.mrpPayout
97
+ : (0, math_1.calculatePayoutForFocContinuousScheme)(slab.constraint, slab.payout, compareValue);
98
+ }
99
+ else {
100
+ itemDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
101
+ }
102
+ result.matched = true;
103
+ result.matchedSlabId = slab.id;
104
+ result.focPercent = itemDiscountPercent;
105
+ result.discountPercent = itemDiscountPercent;
106
+ return result;
107
+ }
108
+ // ─── Step Multiplier ───────────────────────────────────────────
109
+ if ((0, calc_type_checks_1.isPayoutCalcTypeStepMultiplier)(payoutCalcType)) {
110
+ if (!applyStepMultiplierSchemeLogic || !(0, constraint_checks_1.isValidFocStepMultiplierSchemeLogic)(scheme.category, scheme.constraintType, scheme.payoutIn)) {
111
+ result.warnings.push("Step multiplier logic not applicable for this scheme configuration");
112
+ return result;
113
+ }
114
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
115
+ if (!match)
116
+ return result;
117
+ const { slab } = match;
118
+ const itemDiscountPercent = isMrpBilling
119
+ ? slab.mrpPayout
120
+ : (0, math_1.calculateStepMultiplierDiscount)(compareValue, slab);
121
+ result.matched = true;
122
+ result.matchedSlabId = slab.id;
123
+ result.focPercent = itemDiscountPercent;
124
+ result.discountPercent = itemDiscountPercent;
125
+ return result;
126
+ }
127
+ result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
128
+ return result;
129
+ }
130
+ //# sourceMappingURL=foc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foc.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/foc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Scheme } from "../../types/scheme";
2
+ import type { SchemeSlabResult } from "../../types/applied-scheme";
3
+ import type { QualifierItem } from "../../helpers/qualifier-checks";
4
+ export interface MrpPercentageCalculatorInput {
5
+ /** Full scheme configuration. */
6
+ scheme: Scheme;
7
+ /** Precomputed compare value used for slab matching (usually quantity/units). */
8
+ compareValue: number;
9
+ /** Items contributing to qualification for this scheme. */
10
+ applicableProducts: QualifierItem[];
11
+ /** Whether to use MRP billing payout (slab.mrpPayout) instead of PTR payout. */
12
+ isMrpBilling: boolean;
13
+ /** MRP of the SKU used as the base for MRP % discount logic. */
14
+ productMrp: number;
15
+ /** PTR/ex-tax selling unit price used to convert MRP-discounted price into an effective % on PTR. */
16
+ productPtr: number;
17
+ /** Total tax % used to compute ex-tax price when discount is modeled as “subtracted from price”. */
18
+ totalTaxPercentage: number;
19
+ }
20
+ /**
21
+ * Calculate discount payout for PercentageDiscountOnMRP payout type.
22
+ *
23
+ * Bug 1 fix: Accepts both continuous AND step (previously step was dead code).
24
+ *
25
+ * With ACL=DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE:
26
+ * 1. discountOnMRP = MRP × payout / 100
27
+ * 2. discountedPrice = MRP − discountOnMRP
28
+ * 3. discountedPriceExcTax = discountedPrice / (1 + tax/100)
29
+ * 4. Continuous: finalDiscountValue = (PTR − discountedPriceExcTax) × compareValue
30
+ * 5. Step: finalDiscountValue = (PTR − discountedPriceExcTax) × slab.constraint
31
+ * 6. finalDiscountPercent = finalDiscountValue / (PTR × compareValue) × 100
32
+ */
33
+ export declare function calculateMrpPercentageDiscountPayout(input: MrpPercentageCalculatorInput): SchemeSlabResult;
34
+ //# sourceMappingURL=mrp-percentage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mrp-percentage.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/mrp-percentage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,4BAA4B;IAC3C,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,gFAAgF;IAChF,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,qGAAqG;IACrG,UAAU,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,4BAA4B,GAClC,gBAAgB,CAiElB"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateMrpPercentageDiscountPayout = calculateMrpPercentageDiscountPayout;
4
+ const enums_1 = require("../../types/enums");
5
+ const applied_scheme_1 = require("../../types/applied-scheme");
6
+ const calc_type_checks_1 = require("../../helpers/calc-type-checks");
7
+ const constraint_checks_1 = require("../../helpers/constraint-checks");
8
+ const slab_matcher_1 = require("../slab-matcher");
9
+ /**
10
+ * Calculate discount payout for PercentageDiscountOnMRP payout type.
11
+ *
12
+ * Bug 1 fix: Accepts both continuous AND step (previously step was dead code).
13
+ *
14
+ * With ACL=DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE:
15
+ * 1. discountOnMRP = MRP × payout / 100
16
+ * 2. discountedPrice = MRP − discountOnMRP
17
+ * 3. discountedPriceExcTax = discountedPrice / (1 + tax/100)
18
+ * 4. Continuous: finalDiscountValue = (PTR − discountedPriceExcTax) × compareValue
19
+ * 5. Step: finalDiscountValue = (PTR − discountedPriceExcTax) × slab.constraint
20
+ * 6. finalDiscountPercent = finalDiscountValue / (PTR × compareValue) × 100
21
+ */
22
+ function calculateMrpPercentageDiscountPayout(input) {
23
+ const { scheme, compareValue, applicableProducts, isMrpBilling, productMrp, productPtr, totalTaxPercentage } = input;
24
+ const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.PERCENTAGE_DISCOUNT_ON_MRP);
25
+ if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
26
+ result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
27
+ return result;
28
+ }
29
+ const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
30
+ if (slabs.length === 0) {
31
+ result.warnings.push("Slab list is empty");
32
+ return result;
33
+ }
34
+ const payoutCalcType = scheme.payoutCalculationType;
35
+ // Bug 1 fix: accept both continuous AND step
36
+ if (!(0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType) && !(0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
37
+ result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
38
+ return result;
39
+ }
40
+ const matcherParams = {
41
+ slabs,
42
+ compareValue,
43
+ applicableProducts,
44
+ payoutType: enums_1.SchemePayoutType.PERCENTAGE_DISCOUNT_ON_MRP,
45
+ discountOn: scheme.discountOn ?? null,
46
+ };
47
+ const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
48
+ if (!match)
49
+ return result;
50
+ const { slab } = match;
51
+ const itemDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
52
+ let finalDiscountPercent = itemDiscountPercent;
53
+ if (scheme.additionalCalculationLogic === enums_1.AdditionalCalculationLogic.DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE) {
54
+ const discountOnMRP = (productMrp * itemDiscountPercent) / 100;
55
+ const discountedPrice = productMrp - discountOnMRP;
56
+ const discountedPriceExcTax = Number((discountedPrice / (1 + (totalTaxPercentage ?? 0) / 100)).toFixed(2));
57
+ if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType)) {
58
+ const finalDiscountValue = (productPtr - discountedPriceExcTax) * compareValue;
59
+ const totalPtr = productPtr * compareValue;
60
+ finalDiscountPercent = totalPtr > 0 ? (finalDiscountValue / totalPtr) * 100 : 0;
61
+ }
62
+ else if ((0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
63
+ const finalDiscountValue = (productPtr - discountedPriceExcTax) * slab.constraint;
64
+ const totalPtr = productPtr * compareValue;
65
+ finalDiscountPercent = totalPtr > 0 ? (finalDiscountValue / totalPtr) * 100 : 0;
66
+ if (finalDiscountPercent < 0) {
67
+ finalDiscountPercent = 0;
68
+ }
69
+ }
70
+ }
71
+ result.matched = true;
72
+ result.matchedSlabId = slab.id;
73
+ result.discountPercent = finalDiscountPercent;
74
+ result.targetMethod = "setDiscountScheme";
75
+ return result;
76
+ }
77
+ //# sourceMappingURL=mrp-percentage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mrp-percentage.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/mrp-percentage.ts"],"names":[],"mappings":"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"}