@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 @@
1
+ {"version":3,"file":"payout-type-checks.d.ts","sourceRoot":"","sources":["../../src/helpers/payout-type-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAQpF;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,gBAAgB,GAAG,MAAM,GACpC,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAMxF"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isFocTypePayoutScheme = isFocTypePayoutScheme;
4
+ exports.isPercentDiscountOnMRPTypePayoutScheme = isPercentDiscountOnMRPTypePayoutScheme;
5
+ exports.isProductSchemePayoutType = isProductSchemePayoutType;
6
+ const enums_1 = require("../types/enums");
7
+ /**
8
+ * Checks whether a scheme payout type involves free-of-cost product.
9
+ * Matches: FOC, FOCSlab, Product, CouponScheme, ProductSchemeNew
10
+ * Accepts string to be interoperable with both backend and frontend enum types.
11
+ */
12
+ function isFocTypePayoutScheme(payoutType) {
13
+ return (payoutType === enums_1.SchemePayoutType.FOC ||
14
+ payoutType === enums_1.SchemePayoutType.FOC_SLAB ||
15
+ payoutType === enums_1.SchemePayoutType.PRODUCT ||
16
+ payoutType === enums_1.SchemePayoutType.COUPON ||
17
+ payoutType === enums_1.SchemePayoutType.PRODUCT_SCHEME_NEW);
18
+ }
19
+ /**
20
+ * Checks if scheme payout type is PercentageDiscountOnMRP.
21
+ */
22
+ function isPercentDiscountOnMRPTypePayoutScheme(payoutType) {
23
+ return payoutType === enums_1.SchemePayoutType.PERCENTAGE_DISCOUNT_ON_MRP;
24
+ }
25
+ /**
26
+ * Checks if scheme payout type is a product-based type
27
+ * (PRODUCT, PRODUCT_SCHEME_NEW, COUPON).
28
+ */
29
+ function isProductSchemePayoutType(payoutType) {
30
+ return (payoutType === enums_1.SchemePayoutType.PRODUCT ||
31
+ payoutType === enums_1.SchemePayoutType.PRODUCT_SCHEME_NEW ||
32
+ payoutType === enums_1.SchemePayoutType.COUPON);
33
+ }
34
+ //# sourceMappingURL=payout-type-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payout-type-checks.js","sourceRoot":"","sources":["../../src/helpers/payout-type-checks.ts"],"names":[],"mappings":";;AAOA,sDAQC;AAKD,wFAIC;AAMD,8DAMC;AApCD,0CAAkD;AAElD;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,UAAqC;IACzE,OAAO,CACL,UAAU,KAAK,wBAAgB,CAAC,GAAG;QACnC,UAAU,KAAK,wBAAgB,CAAC,QAAQ;QACxC,UAAU,KAAK,wBAAgB,CAAC,OAAO;QACvC,UAAU,KAAK,wBAAgB,CAAC,MAAM;QACtC,UAAU,KAAK,wBAAgB,CAAC,kBAAkB,CACnD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,sCAAsC,CACpD,UAAqC;IAErC,OAAO,UAAU,KAAK,wBAAgB,CAAC,0BAA0B,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,UAAqC;IAC7E,OAAO,CACL,UAAU,KAAK,wBAAgB,CAAC,OAAO;QACvC,UAAU,KAAK,wBAAgB,CAAC,kBAAkB;QAClD,UAAU,KAAK,wBAAgB,CAAC,MAAM,CACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { ThirdQualifierType, SchemePayoutType } from "../types/enums";
2
+ import type { FirstQualifier } from "../types/scheme";
3
+ export interface QualifierItem {
4
+ /** SKU id used for product-level qualifiers. */
5
+ productId: number;
6
+ /** Primary category id used for category-level qualifiers. */
7
+ primaryCategoryId: number;
8
+ /** Secondary category id used for category-level qualifiers. */
9
+ secondaryCategoryId: number;
10
+ /** Alternate category/group string used by some legacy schemes. */
11
+ category1: string | null;
12
+ /** Attribute text 1 used for attribute-based qualifiers. */
13
+ productAttributeText1: string | null;
14
+ /** Quantity for the item within the qualifying set (units/cases depending on caller mapping). */
15
+ quantity: number;
16
+ /** Unit price used for amount-based constraints (PTR/ex-tax in most flows). */
17
+ price: number;
18
+ /** Whether this item is saleable/must-sell (qualifier can require must-sell). */
19
+ isSaleable: boolean;
20
+ /** Optional MRP batch identifier for batch-qualified schemes. */
21
+ mrpBatch?: string;
22
+ }
23
+ /**
24
+ * Checks if the first qualifier prerequisites are met.
25
+ * All qualifiers must match for the check to pass.
26
+ */
27
+ export declare function checkFirstQualifier(firstQualifier: FirstQualifier[] | null, applicableProducts: QualifierItem[]): boolean;
28
+ /**
29
+ * Checks first qualifier for FOC schemes.
30
+ * Uses summed quantity across matching products.
31
+ */
32
+ export declare function checkFirstQualifierForFOC(firstQualifier: FirstQualifier[] | null, applicableProducts: QualifierItem[]): boolean;
33
+ /**
34
+ * Checks first qualifier for Discount schemes.
35
+ * Checks that constraint qty is met across matching products.
36
+ */
37
+ export declare function checkFirstQualifierForDiscount(firstQualifier: FirstQualifier[] | null, applicableProducts: QualifierItem[], slabConstraint: number): boolean;
38
+ export interface QualifierCheckParams {
39
+ /** Secondary qualifier numeric value from slab (legacy). */
40
+ secondQualifier: number;
41
+ /** Type indicator for secondary qualifier (defines how secondQualifier is interpreted). */
42
+ secondQualifierType: number | null;
43
+ /** Discount-on mode (e.g. group scheme) affecting how qualifiers are evaluated. */
44
+ discountOn: number | null;
45
+ /** First qualifier rules that must pass (product/category/attribute + qty + must-sell). */
46
+ firstQualifier: FirstQualifier[] | null;
47
+ /** Third qualifier values (additional gating thresholds). */
48
+ thirdQualifier: number[] | null;
49
+ /** Third qualifier type (value vs quantity). */
50
+ thirdQualifierType: ThirdQualifierType | null;
51
+ /** Payout type of the scheme; influences which qualifier algorithm is used. */
52
+ schemePayoutType?: SchemePayoutType | string;
53
+ /** Slab constraint value, passed through for payout-type-specific qualifier checks. */
54
+ slabConstraint?: number;
55
+ }
56
+ /**
57
+ * Checks if secondary category filter, first qualifier, and third qualifier all pass.
58
+ *
59
+ * Bug 2 fix: Uses secondQualifierType (not secondQualifier) for the type check.
60
+ */
61
+ export declare function checkIfSecondaryCategoryFilterPassed(params: QualifierCheckParams, applicableProducts: QualifierItem[]): boolean;
62
+ //# sourceMappingURL=qualifier-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualifier-checks.d.ts","sourceRoot":"","sources":["../../src/helpers/qualifier-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4DAA4D;IAC5D,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,iGAAiG;IACjG,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,UAAU,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,EACvC,kBAAkB,EAAE,aAAa,EAAE,GAClC,OAAO,CAkET;AAID;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,EACvC,kBAAkB,EAAE,aAAa,EAAE,GAClC,OAAO,CA2BT;AAID;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,EACvC,kBAAkB,EAAE,aAAa,EAAE,EACnC,cAAc,EAAE,MAAM,GACrB,OAAO,CA2BT;AAID,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,eAAe,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,mFAAmF;IACnF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,2FAA2F;IAC3F,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IACxC,6DAA6D;IAC7D,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,gDAAgD;IAChD,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAC7C,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,oBAAoB,EAC5B,kBAAkB,EAAE,aAAa,EAAE,GAClC,OAAO,CAmET"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkFirstQualifier = checkFirstQualifier;
4
+ exports.checkFirstQualifierForFOC = checkFirstQualifierForFOC;
5
+ exports.checkFirstQualifierForDiscount = checkFirstQualifierForDiscount;
6
+ exports.checkIfSecondaryCategoryFilterPassed = checkIfSecondaryCategoryFilterPassed;
7
+ const enums_1 = require("../types/enums");
8
+ // ─── First Qualifier Check (standard) ───────────────────────────
9
+ /**
10
+ * Checks if the first qualifier prerequisites are met.
11
+ * All qualifiers must match for the check to pass.
12
+ */
13
+ function checkFirstQualifier(firstQualifier, applicableProducts) {
14
+ const qualifiers = firstQualifier || [];
15
+ if (qualifiers.length === 0)
16
+ return true;
17
+ let count = 0;
18
+ for (const fq of qualifiers) {
19
+ let matched = false;
20
+ for (const item of applicableProducts) {
21
+ if (fq.entityType === enums_1.EntityType.product) {
22
+ if (item.productId == fq.entity &&
23
+ item.quantity >= fq.quantity &&
24
+ (!fq.batch || item.mrpBatch == fq.batch) &&
25
+ item.isSaleable === fq.isMustSell) {
26
+ matched = true;
27
+ break;
28
+ }
29
+ }
30
+ else if (fq.entityType === enums_1.EntityType.primaryCategory) {
31
+ if (item.primaryCategoryId == fq.entity &&
32
+ item.quantity >= fq.quantity &&
33
+ item.isSaleable === fq.isMustSell) {
34
+ matched = true;
35
+ break;
36
+ }
37
+ }
38
+ else if (fq.entityType === enums_1.EntityType.secondaryCategory) {
39
+ if (item.secondaryCategoryId == fq.entity &&
40
+ item.quantity >= fq.quantity &&
41
+ item.isSaleable === fq.isMustSell) {
42
+ matched = true;
43
+ break;
44
+ }
45
+ }
46
+ else if (fq.entityType === enums_1.EntityType.alternateCategory) {
47
+ if (item.category1 == fq.entity &&
48
+ item.quantity >= fq.quantity &&
49
+ item.isSaleable === fq.isMustSell) {
50
+ matched = true;
51
+ break;
52
+ }
53
+ }
54
+ else if (fq.entityType === enums_1.EntityType.attributeText1) {
55
+ if (item.productAttributeText1 == fq.entity &&
56
+ item.quantity >= fq.quantity &&
57
+ item.isSaleable === fq.isMustSell) {
58
+ matched = true;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ if (matched) {
64
+ count++;
65
+ }
66
+ else {
67
+ break;
68
+ }
69
+ }
70
+ return count === qualifiers.length;
71
+ }
72
+ // ─── First Qualifier Check for FOC ──────────────────────────────
73
+ /**
74
+ * Checks first qualifier for FOC schemes.
75
+ * Uses summed quantity across matching products.
76
+ */
77
+ function checkFirstQualifierForFOC(firstQualifier, applicableProducts) {
78
+ const qualifiers = firstQualifier || [];
79
+ if (qualifiers.length === 0)
80
+ return true;
81
+ for (const fq of qualifiers) {
82
+ let totalMatchedQty = 0;
83
+ for (const item of applicableProducts) {
84
+ if (fq.entityType === enums_1.EntityType.product && item.productId == fq.entity) {
85
+ totalMatchedQty += item.quantity;
86
+ }
87
+ else if (fq.entityType === enums_1.EntityType.primaryCategory && item.primaryCategoryId == fq.entity) {
88
+ totalMatchedQty += item.quantity;
89
+ }
90
+ else if (fq.entityType === enums_1.EntityType.secondaryCategory && item.secondaryCategoryId == fq.entity) {
91
+ totalMatchedQty += item.quantity;
92
+ }
93
+ else if (fq.entityType === enums_1.EntityType.alternateCategory && item.category1 == fq.entity) {
94
+ totalMatchedQty += item.quantity;
95
+ }
96
+ else if (fq.entityType === enums_1.EntityType.attributeText1 && item.productAttributeText1 == fq.entity) {
97
+ totalMatchedQty += item.quantity;
98
+ }
99
+ }
100
+ if (totalMatchedQty < fq.quantity) {
101
+ return false;
102
+ }
103
+ }
104
+ return true;
105
+ }
106
+ // ─── First Qualifier Check for Discount ─────────────────────────
107
+ /**
108
+ * Checks first qualifier for Discount schemes.
109
+ * Checks that constraint qty is met across matching products.
110
+ */
111
+ function checkFirstQualifierForDiscount(firstQualifier, applicableProducts, slabConstraint) {
112
+ const qualifiers = firstQualifier || [];
113
+ if (qualifiers.length === 0)
114
+ return true;
115
+ for (const fq of qualifiers) {
116
+ let totalMatchedQty = 0;
117
+ for (const item of applicableProducts) {
118
+ if (fq.entityType === enums_1.EntityType.product && item.productId == fq.entity) {
119
+ totalMatchedQty += item.quantity;
120
+ }
121
+ else if (fq.entityType === enums_1.EntityType.primaryCategory && item.primaryCategoryId == fq.entity) {
122
+ totalMatchedQty += item.quantity;
123
+ }
124
+ else if (fq.entityType === enums_1.EntityType.secondaryCategory && item.secondaryCategoryId == fq.entity) {
125
+ totalMatchedQty += item.quantity;
126
+ }
127
+ else if (fq.entityType === enums_1.EntityType.alternateCategory && item.category1 == fq.entity) {
128
+ totalMatchedQty += item.quantity;
129
+ }
130
+ else if (fq.entityType === enums_1.EntityType.attributeText1 && item.productAttributeText1 == fq.entity) {
131
+ totalMatchedQty += item.quantity;
132
+ }
133
+ }
134
+ if (totalMatchedQty < fq.quantity) {
135
+ return false;
136
+ }
137
+ }
138
+ return true;
139
+ }
140
+ /**
141
+ * Checks if secondary category filter, first qualifier, and third qualifier all pass.
142
+ *
143
+ * Bug 2 fix: Uses secondQualifierType (not secondQualifier) for the type check.
144
+ */
145
+ function checkIfSecondaryCategoryFilterPassed(params, applicableProducts) {
146
+ const { secondQualifier, secondQualifierType, discountOn, firstQualifier, thirdQualifier, thirdQualifierType, schemePayoutType, slabConstraint, } = params;
147
+ let firstQualifierPassed = true;
148
+ let secondQualifierPassed = true;
149
+ let thirdQualifierPassed = true;
150
+ // First qualifier check (only for GroupScheme discount-on type)
151
+ if (discountOn === enums_1.DiscountOnType.GroupScheme) {
152
+ if (schemePayoutType === enums_1.SchemePayoutType.FOC) {
153
+ firstQualifierPassed = checkFirstQualifierForFOC(firstQualifier, applicableProducts);
154
+ }
155
+ else if (schemePayoutType === enums_1.SchemePayoutType.DISCOUNT) {
156
+ firstQualifierPassed = checkFirstQualifierForDiscount(firstQualifier, applicableProducts, slabConstraint ?? 0);
157
+ }
158
+ else {
159
+ firstQualifierPassed = checkFirstQualifier(firstQualifier, applicableProducts);
160
+ }
161
+ }
162
+ // Second qualifier check
163
+ if (secondQualifierType === enums_1.SecondQualifierType.LPC) {
164
+ if (applicableProducts.length < secondQualifier) {
165
+ secondQualifierPassed = false;
166
+ }
167
+ }
168
+ else if (secondQualifier) {
169
+ const uniqueAltCategoryIds = new Set(applicableProducts.map((v) => v.category1));
170
+ if (uniqueAltCategoryIds.size < secondQualifier) {
171
+ secondQualifierPassed = false;
172
+ }
173
+ }
174
+ // Third qualifier check
175
+ if (thirdQualifier && thirdQualifier.length === 2) {
176
+ if (thirdQualifierType === enums_1.ThirdQualifierType.VALUE) {
177
+ const totalAmount = applicableProducts.reduce((prev, curr) => prev + curr.price * curr.quantity, 0);
178
+ if (totalAmount < thirdQualifier[0] || totalAmount > thirdQualifier[1]) {
179
+ thirdQualifierPassed = false;
180
+ }
181
+ }
182
+ else if (thirdQualifierType === enums_1.ThirdQualifierType.QUANTITY) {
183
+ const totalQuantity = applicableProducts.reduce((prev, curr) => prev + curr.quantity, 0);
184
+ if (totalQuantity < thirdQualifier[0] || totalQuantity > thirdQualifier[1]) {
185
+ thirdQualifierPassed = false;
186
+ }
187
+ }
188
+ }
189
+ else if (thirdQualifier && thirdQualifier.length !== 0) {
190
+ throw new Error("Invalid third qualifier configuration");
191
+ }
192
+ return firstQualifierPassed && secondQualifierPassed && thirdQualifierPassed;
193
+ }
194
+ //# sourceMappingURL=qualifier-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualifier-checks.js","sourceRoot":"","sources":["../../src/helpers/qualifier-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Scheme, FilterConstraints } from "../types/scheme";
2
+ export interface ApplicabilityItem {
3
+ /** SKU id for product-level scheme applicability. */
4
+ productId: number;
5
+ /** Primary category id for category-level scheme applicability. */
6
+ primaryCategoryId: number;
7
+ /** Secondary category id for category-level scheme applicability. */
8
+ secondaryCategoryId: number;
9
+ /** Pricing master batch id for master-batch scheme applicability. */
10
+ masterBatchId?: string;
11
+ /** MRP used for MRP-based filter constraints. */
12
+ mrp?: number;
13
+ /** Attribute text 1 used for attribute-based filter constraints. */
14
+ productAttributeText1?: string | null;
15
+ /** Attribute text 2 used for attribute-based filter constraints. */
16
+ productAttributeText2?: string | null;
17
+ /** Alternate category string used for alt-category filter constraints. */
18
+ category1?: string | null;
19
+ /** Manufacturing batch number used for manufacturing-batch filter constraints. */
20
+ batchNo?: string;
21
+ }
22
+ /**
23
+ * Checks if a scheme is applicable to a specific item based on schemeOn type.
24
+ * Uses FE superset: includes GROUP, ALL, MASTER_BATCH.
25
+ */
26
+ export declare function isSchemeApplicable(scheme: Scheme, item: ApplicabilityItem, categories: string[]): boolean;
27
+ /**
28
+ * Checks if the schemeOn value is a category type (primary or secondary).
29
+ */
30
+ export declare function isPrimaryOrSecondaryCategorySchemeOn(schemeOn: string): boolean;
31
+ /**
32
+ * Checks if a scheme has any active filter constraints configured.
33
+ */
34
+ export declare function isSchemeHaveValidFilterConstraints(scheme: Scheme): boolean;
35
+ /**
36
+ * Checks if an item passes all active filter constraints of a scheme.
37
+ * All non-empty filter lists must match (AND logic).
38
+ */
39
+ export declare function isSchemeApplicableOnFilterConstraints(filterConstraints: FilterConstraints, item: ApplicabilityItem): boolean;
40
+ //# sourceMappingURL=scheme-applicability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheme-applicability.d.ts","sourceRoot":"","sources":["../../src/helpers/scheme-applicability.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGjE,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CA8BT;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK9E;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAW1E;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CA+BT"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSchemeApplicable = isSchemeApplicable;
4
+ exports.isPrimaryOrSecondaryCategorySchemeOn = isPrimaryOrSecondaryCategorySchemeOn;
5
+ exports.isSchemeHaveValidFilterConstraints = isSchemeHaveValidFilterConstraints;
6
+ exports.isSchemeApplicableOnFilterConstraints = isSchemeApplicableOnFilterConstraints;
7
+ const enums_1 = require("../types/enums");
8
+ /**
9
+ * Checks if a scheme is applicable to a specific item based on schemeOn type.
10
+ * Uses FE superset: includes GROUP, ALL, MASTER_BATCH.
11
+ */
12
+ function isSchemeApplicable(scheme, item, categories) {
13
+ const schemeOn = scheme.schemeOn;
14
+ if (schemeOn === enums_1.SchemeSchemeOn.GROUP) {
15
+ return ((!!item.primaryCategoryId && categories.includes(item.primaryCategoryId.toString())) ||
16
+ (!!item.secondaryCategoryId && categories.includes(item.secondaryCategoryId.toString())) ||
17
+ (!!item.masterBatchId &&
18
+ categories.includes(item.masterBatchId.toString()) &&
19
+ scheme.alternateSchemeId == null) ||
20
+ (!!item.productId && categories.includes(item.productId.toString())));
21
+ }
22
+ else if (schemeOn === enums_1.SchemeSchemeOn.PRIMARY_CATEGORY) {
23
+ return !!item.primaryCategoryId && categories.includes(item.primaryCategoryId.toString());
24
+ }
25
+ else if (schemeOn === enums_1.SchemeSchemeOn.SECONDARY_CATEGORY) {
26
+ return !!item.secondaryCategoryId && categories.includes(item.secondaryCategoryId.toString());
27
+ }
28
+ else if (schemeOn === enums_1.SchemeSchemeOn.ALL) {
29
+ return true;
30
+ }
31
+ else if (schemeOn === enums_1.SchemeSchemeOn.MASTER_BATCH) {
32
+ return (!!item.masterBatchId &&
33
+ categories.includes(item.masterBatchId.toString()) &&
34
+ scheme.alternateSchemeId == null);
35
+ }
36
+ else if (schemeOn === enums_1.SchemeSchemeOn.PRODUCT) {
37
+ // Product-level scheme
38
+ return !!item.productId && categories.includes(item.productId.toString());
39
+ }
40
+ else {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * Checks if the schemeOn value is a category type (primary or secondary).
46
+ */
47
+ function isPrimaryOrSecondaryCategorySchemeOn(schemeOn) {
48
+ return (schemeOn === enums_1.SchemeSchemeOn.PRIMARY_CATEGORY ||
49
+ schemeOn === enums_1.SchemeSchemeOn.SECONDARY_CATEGORY);
50
+ }
51
+ /**
52
+ * Checks if a scheme has any active filter constraints configured.
53
+ */
54
+ function isSchemeHaveValidFilterConstraints(scheme) {
55
+ const fc = scheme.filterConstraints;
56
+ if (!fc)
57
+ return false;
58
+ return ((!!fc.mrp && fc.mrp.length > 0) ||
59
+ (!!fc.attribute1 && fc.attribute1.length > 0) ||
60
+ (!!fc.attribute2 && fc.attribute2.length > 0) ||
61
+ (!!fc.altCategory && fc.altCategory.length > 0) ||
62
+ (!!fc.manufacturingBatchNumbers && fc.manufacturingBatchNumbers.length > 0));
63
+ }
64
+ /**
65
+ * Checks if an item passes all active filter constraints of a scheme.
66
+ * All non-empty filter lists must match (AND logic).
67
+ */
68
+ function isSchemeApplicableOnFilterConstraints(filterConstraints, item) {
69
+ const results = [];
70
+ if (filterConstraints.mrp && filterConstraints.mrp.length > 0) {
71
+ if (!item.mrp)
72
+ return false;
73
+ results.push(filterConstraints.mrp.includes(item.mrp));
74
+ }
75
+ if (filterConstraints.attribute1 && filterConstraints.attribute1.length > 0) {
76
+ if (!item.productAttributeText1)
77
+ return false;
78
+ results.push(filterConstraints.attribute1.includes(item.productAttributeText1));
79
+ }
80
+ if (filterConstraints.attribute2 && filterConstraints.attribute2.length > 0) {
81
+ if (!item.productAttributeText2)
82
+ return false;
83
+ results.push(filterConstraints.attribute2.includes(item.productAttributeText2));
84
+ }
85
+ if (filterConstraints.altCategory && filterConstraints.altCategory.length > 0) {
86
+ if (!item.category1)
87
+ return false;
88
+ results.push(filterConstraints.altCategory.includes(item.category1));
89
+ }
90
+ if (filterConstraints.manufacturingBatchNumbers && filterConstraints.manufacturingBatchNumbers.length > 0) {
91
+ if (!item.batchNo)
92
+ return false;
93
+ results.push(filterConstraints.manufacturingBatchNumbers.includes(item.batchNo));
94
+ }
95
+ if (results.length === 0)
96
+ return false;
97
+ return results.every((v) => v);
98
+ }
99
+ //# 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,4 @@
1
+ export * from "./types";
2
+ export * from "./helpers";
3
+ export * from "./calculators";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,SAAS,CAAC;AAGxB,cAAc,WAAW,CAAC;AAG1B,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // ─── @fa/scheme-engine ──────────────────────────────────────────
3
+ // Pure-function scheme calculation engine for FieldAssist DMS.
4
+ // Zero dependencies on NestJS, Nuxt, or BaseOrderItem.
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ // ─── Types ──────────────────────────────────────────────────────
21
+ __exportStar(require("./types"), exports);
22
+ // ─── Helpers ────────────────────────────────────────────────────
23
+ __exportStar(require("./helpers"), exports);
24
+ // ─── Calculators ────────────────────────────────────────────────
25
+ __exportStar(require("./calculators"), exports);
26
+ //# 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,0CAAwB;AAExB,mEAAmE;AACnE,4CAA0B;AAE1B,mEAAmE;AACnE,gDAA8B"}