@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.
- package/dist/calculators/discount-application.d.ts +44 -0
- package/dist/calculators/index.d.ts +65 -0
- package/dist/calculators/index.d.ts.map +1 -0
- package/dist/calculators/index.js +196 -0
- package/dist/calculators/index.js.map +1 -0
- package/dist/calculators/payout-types/article.d.ts +23 -0
- package/dist/calculators/payout-types/article.d.ts.map +1 -0
- package/dist/calculators/payout-types/article.js +73 -0
- package/dist/calculators/payout-types/article.js.map +1 -0
- package/dist/calculators/payout-types/basket.d.ts +49 -0
- package/dist/calculators/payout-types/basket.d.ts.map +1 -0
- package/dist/calculators/payout-types/basket.js +108 -0
- package/dist/calculators/payout-types/basket.js.map +1 -0
- package/dist/calculators/payout-types/coupon.d.ts +23 -0
- package/dist/calculators/payout-types/coupon.d.ts.map +1 -0
- package/dist/calculators/payout-types/coupon.js +74 -0
- package/dist/calculators/payout-types/coupon.js.map +1 -0
- package/dist/calculators/payout-types/discount.d.ts +21 -0
- package/dist/calculators/payout-types/discount.d.ts.map +1 -0
- package/dist/calculators/payout-types/discount.js +110 -0
- package/dist/calculators/payout-types/discount.js.map +1 -0
- package/dist/calculators/payout-types/fixed-discount.d.ts +31 -0
- package/dist/calculators/payout-types/fixed-discount.d.ts.map +1 -0
- package/dist/calculators/payout-types/fixed-discount.js +65 -0
- package/dist/calculators/payout-types/fixed-discount.js.map +1 -0
- package/dist/calculators/payout-types/foc.d.ts +30 -0
- package/dist/calculators/payout-types/foc.d.ts.map +1 -0
- package/dist/calculators/payout-types/foc.js +130 -0
- package/dist/calculators/payout-types/foc.js.map +1 -0
- package/dist/calculators/payout-types/mrp-percentage.d.ts +34 -0
- package/dist/calculators/payout-types/mrp-percentage.d.ts.map +1 -0
- package/dist/calculators/payout-types/mrp-percentage.js +77 -0
- package/dist/calculators/payout-types/mrp-percentage.js.map +1 -0
- package/dist/calculators/payout-types/nlp.d.ts +22 -0
- package/dist/calculators/payout-types/nlp.d.ts.map +1 -0
- package/dist/calculators/payout-types/nlp.js +59 -0
- package/dist/calculators/payout-types/nlp.js.map +1 -0
- package/dist/calculators/payout-types/per-unit.d.ts +32 -0
- package/dist/calculators/payout-types/per-unit.d.ts.map +1 -0
- package/dist/calculators/payout-types/per-unit.js +94 -0
- package/dist/calculators/payout-types/per-unit.js.map +1 -0
- package/dist/calculators/payout-types/product-new.d.ts +27 -0
- package/dist/calculators/payout-types/product-new.d.ts.map +1 -0
- package/dist/calculators/payout-types/product-new.js +85 -0
- package/dist/calculators/payout-types/product-new.js.map +1 -0
- package/dist/calculators/payout-types/product.d.ts +31 -0
- package/dist/calculators/payout-types/product.d.ts.map +1 -0
- package/dist/calculators/payout-types/product.js +73 -0
- package/dist/calculators/payout-types/product.js.map +1 -0
- package/dist/calculators/payout-types/topup.d.ts +19 -0
- package/dist/calculators/payout-types/topup.d.ts.map +1 -0
- package/dist/calculators/payout-types/topup.js +46 -0
- package/dist/calculators/payout-types/topup.js.map +1 -0
- package/dist/calculators/slab-matcher.d.ts +41 -0
- package/dist/calculators/slab-matcher.d.ts.map +1 -0
- package/dist/calculators/slab-matcher.js +68 -0
- package/dist/calculators/slab-matcher.js.map +1 -0
- package/dist/helpers/calc-type-checks.d.ts +21 -0
- package/dist/helpers/calc-type-checks.d.ts.map +1 -0
- package/dist/helpers/calc-type-checks.js +36 -0
- package/dist/helpers/calc-type-checks.js.map +1 -0
- package/dist/helpers/compare-value.d.ts +40 -0
- package/dist/helpers/compare-value.d.ts.map +1 -0
- package/dist/helpers/compare-value.js +120 -0
- package/dist/helpers/compare-value.js.map +1 -0
- package/dist/helpers/constraint-checks.d.ts +30 -0
- package/dist/helpers/constraint-checks.d.ts.map +1 -0
- package/dist/helpers/constraint-checks.js +73 -0
- package/dist/helpers/constraint-checks.js.map +1 -0
- package/dist/helpers/index.d.ts +8 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +24 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/math.d.ts +50 -0
- package/dist/helpers/math.d.ts.map +1 -0
- package/dist/helpers/math.js +96 -0
- package/dist/helpers/math.js.map +1 -0
- package/dist/helpers/payout-type-checks.d.ts +17 -0
- package/dist/helpers/payout-type-checks.d.ts.map +1 -0
- package/dist/helpers/payout-type-checks.js +34 -0
- package/dist/helpers/payout-type-checks.js.map +1 -0
- package/dist/helpers/qualifier-checks.d.ts +62 -0
- package/dist/helpers/qualifier-checks.d.ts.map +1 -0
- package/dist/helpers/qualifier-checks.js +194 -0
- package/dist/helpers/qualifier-checks.js.map +1 -0
- package/dist/helpers/scheme-applicability.d.ts +40 -0
- package/dist/helpers/scheme-applicability.d.ts.map +1 -0
- package/dist/helpers/scheme-applicability.js +99 -0
- package/dist/helpers/scheme-applicability.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/types/applied-scheme.d.ts +157 -0
- package/dist/types/applied-scheme.d.ts.map +1 -0
- package/dist/types/applied-scheme.js +22 -0
- package/dist/types/applied-scheme.js.map +1 -0
- package/dist/types/enums.d.ts +91 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +118 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/item-props.d.ts +103 -0
- package/dist/types/item-props.d.ts.map +1 -0
- package/dist/types/item-props.js +3 -0
- package/dist/types/item-props.js.map +1 -0
- package/dist/types/scheme.d.ts +172 -0
- package/dist/types/scheme.d.ts.map +1 -0
- package/dist/types/scheme.js +3 -0
- package/dist/types/scheme.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,22 @@
|
|
|
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 NlpCalculatorInput {
|
|
5
|
+
scheme: Scheme;
|
|
6
|
+
compareValue: number;
|
|
7
|
+
totalAmount: number;
|
|
8
|
+
applicableProducts: QualifierItem[];
|
|
9
|
+
isMrpBilling: boolean;
|
|
10
|
+
productPtr: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* NLP (Net Landing Price) payout type.
|
|
14
|
+
*
|
|
15
|
+
* Semantics (from golden fixtures): slab.payout is the target per-unit landing price.
|
|
16
|
+
* The discount is the per-unit price reduction applied to the qualified quantity.
|
|
17
|
+
*
|
|
18
|
+
* Returns discountPercent as an effective % on totalAmount.
|
|
19
|
+
*/
|
|
20
|
+
export declare function calculateNlpPayout(): SchemeSlabResult;
|
|
21
|
+
export declare function calculateNlpPayout(input: NlpCalculatorInput): SchemeSlabResult;
|
|
22
|
+
//# sourceMappingURL=nlp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nlp.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/nlp.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,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,CAAC;AACvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateNlpPayout = calculateNlpPayout;
|
|
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
|
+
function calculateNlpPayout(input) {
|
|
10
|
+
if (!input) {
|
|
11
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.NLP);
|
|
12
|
+
result.warnings.push("NLP payout type is not yet implemented");
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
const { scheme, compareValue, totalAmount, applicableProducts, productPtr } = input;
|
|
16
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.NLP);
|
|
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) => b.constraint - a.constraint);
|
|
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.NLP,
|
|
31
|
+
discountOn: scheme.discountOn ?? null,
|
|
32
|
+
};
|
|
33
|
+
const payoutCalcType = scheme.payoutCalculationType;
|
|
34
|
+
const isContinuous = (0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType);
|
|
35
|
+
const isStep = (0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType);
|
|
36
|
+
if (isContinuous || isStep) {
|
|
37
|
+
// Fixtures only require continuous; keep step supported by using the same matched slab.
|
|
38
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
39
|
+
if (!match)
|
|
40
|
+
return result;
|
|
41
|
+
const { slab } = match;
|
|
42
|
+
const nlpPrice = slab.payout;
|
|
43
|
+
const unitPrice = productPtr;
|
|
44
|
+
const perUnitDiscount = Math.max(0, unitPrice - nlpPrice);
|
|
45
|
+
const discountValue = perUnitDiscount * compareValue;
|
|
46
|
+
let effectivePercent = 0;
|
|
47
|
+
if (totalAmount > 0) {
|
|
48
|
+
effectivePercent = (discountValue / totalAmount) * 100;
|
|
49
|
+
}
|
|
50
|
+
result.matched = true;
|
|
51
|
+
result.matchedSlabId = slab.id;
|
|
52
|
+
result.discountPercent = effectivePercent;
|
|
53
|
+
result.targetMethod = "setDiscountScheme";
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=nlp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nlp.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/nlp.ts"],"names":[],"mappings":";;AA4BA,gDA4DC;AAtFD,6CAAqD;AACrD,+DAAmE;AACnE,qEAAkG;AAClG,uEAAwE;AACxE,kDAA2E;AAsB3E,SAAgB,kBAAkB,CAAC,KAA0B;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,IAAA,sCAAqB,EAAC,wBAAgB,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IACpF,MAAM,MAAM,GAAG,IAAA,sCAAqB,EAAC,wBAAgB,CAAC,GAAG,CAAC,CAAC;IAE3D,IAAI,CAAC,IAAA,yCAAqB,EAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,aAAa,GAAsB;QACvC,KAAK;QACL,YAAY;QACZ,kBAAkB;QAClB,UAAU,EAAE,wBAAgB,CAAC,GAAG;QAChC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;KACtC,CAAC;IAEF,MAAM,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC;IAEpD,MAAM,YAAY,GAAG,IAAA,6CAA0B,EAAC,cAAc,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,IAAA,uCAAoB,EAAC,cAAc,CAAC,CAAC;IAEpD,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;QAC3B,wFAAwF;QACxF,MAAM,KAAK,GAAG,IAAA,+BAAgB,EAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,MAAM,SAAS,GAAG,UAAU,CAAC;QAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;QAE1D,MAAM,aAAa,GAAG,eAAe,GAAG,YAAY,CAAC;QACrD,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,gBAAgB,GAAG,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC;QACzD,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,eAAe,GAAG,gBAAgB,CAAC;QAC1C,MAAM,CAAC,YAAY,GAAG,mBAAmB,CAAC;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,uCAAuC,cAAc,EAAE,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Scheme } from "../../types/scheme";
|
|
2
|
+
import type { SchemeSlabResult } from "../../types/applied-scheme";
|
|
3
|
+
import type { QualifierItem } from "../../helpers/qualifier-checks";
|
|
4
|
+
import type { PerUnitPriceProps } from "../../types/item-props";
|
|
5
|
+
export interface PerUnitCalculatorInput {
|
|
6
|
+
/** Full scheme configuration. */
|
|
7
|
+
scheme: Scheme;
|
|
8
|
+
/** Precomputed compare value used for slab matching (qty/units/amount depending on constraintType). */
|
|
9
|
+
compareValue: number;
|
|
10
|
+
/** Items contributing to qualification for this scheme. */
|
|
11
|
+
applicableProducts: QualifierItem[];
|
|
12
|
+
/** Whether to use MRP billing payout (slab.mrpPayout) for the per-unit payout value. */
|
|
13
|
+
isMrpBilling: boolean;
|
|
14
|
+
/** Total tax % used to derive percent from a per-unit value in tax-aware flows. */
|
|
15
|
+
totalTaxPercentage: number;
|
|
16
|
+
/** Net unit price inputs at various unit levels (base/std/super/additional). */
|
|
17
|
+
perUnitPrices: PerUnitPriceProps;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Calculate discount payout for PerUnitDiscount payout type.
|
|
21
|
+
*
|
|
22
|
+
* Picks finalNetPrice based on constraintType, then:
|
|
23
|
+
* - With ACL=DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE:
|
|
24
|
+
* discountAmountPreTax = perUnit / (1 + tax/100)
|
|
25
|
+
* percent = (discountAmountPreTax × 100) / finalNetPrice
|
|
26
|
+
* - Without:
|
|
27
|
+
* percent = (perUnit / finalNetPrice) × 100
|
|
28
|
+
*
|
|
29
|
+
* Stores recalculateSchemeData for later recalculation during price updates.
|
|
30
|
+
*/
|
|
31
|
+
export declare function calculatePerUnitPayout(input: PerUnitCalculatorInput): SchemeSlabResult;
|
|
32
|
+
//# sourceMappingURL=per-unit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-unit.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/per-unit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,4BAA4B,CAAC;AAK1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,uGAAuG;IACvG,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,wFAAwF;IACxF,YAAY,EAAE,OAAO,CAAC;IACtB,mFAAmF;IACnF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,aAAa,EAAE,iBAAiB,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,gBAAgB,CA2FtF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculatePerUnitPayout = calculatePerUnitPayout;
|
|
4
|
+
const enums_1 = require("../../types/enums");
|
|
5
|
+
const applied_scheme_1 = require("../../types/applied-scheme");
|
|
6
|
+
const constraint_checks_1 = require("../../helpers/constraint-checks");
|
|
7
|
+
const slab_matcher_1 = require("../slab-matcher");
|
|
8
|
+
/**
|
|
9
|
+
* Calculate discount payout for PerUnitDiscount payout type.
|
|
10
|
+
*
|
|
11
|
+
* Picks finalNetPrice based on constraintType, then:
|
|
12
|
+
* - With ACL=DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE:
|
|
13
|
+
* discountAmountPreTax = perUnit / (1 + tax/100)
|
|
14
|
+
* percent = (discountAmountPreTax × 100) / finalNetPrice
|
|
15
|
+
* - Without:
|
|
16
|
+
* percent = (perUnit / finalNetPrice) × 100
|
|
17
|
+
*
|
|
18
|
+
* Stores recalculateSchemeData for later recalculation during price updates.
|
|
19
|
+
*/
|
|
20
|
+
function calculatePerUnitPayout(input) {
|
|
21
|
+
const { scheme, compareValue, applicableProducts, isMrpBilling, totalTaxPercentage, perUnitPrices } = input;
|
|
22
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.PERUNIT);
|
|
23
|
+
if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
|
|
24
|
+
result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
if (!scheme.payoutCalculationType) {
|
|
28
|
+
result.warnings.push(`No matching calculation type found: ${scheme.payoutCalculationType}`);
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
|
|
32
|
+
if (slabs.length === 0) {
|
|
33
|
+
result.warnings.push("Slab list is empty");
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
const matcherParams = {
|
|
37
|
+
slabs,
|
|
38
|
+
compareValue,
|
|
39
|
+
applicableProducts,
|
|
40
|
+
payoutType: enums_1.SchemePayoutType.PERUNIT,
|
|
41
|
+
discountOn: scheme.discountOn ?? null,
|
|
42
|
+
};
|
|
43
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
44
|
+
if (!match)
|
|
45
|
+
return result;
|
|
46
|
+
const { slab } = match;
|
|
47
|
+
const discountAmountOfPerUnit = isMrpBilling ? slab.mrpPayout : slab.payout;
|
|
48
|
+
const usesStdUnit = scheme.constraintType === enums_1.SchemeConstraintType.STD_UNIT;
|
|
49
|
+
const usesSuperUnit = scheme.constraintType === enums_1.SchemeConstraintType.SUPER_UNIT;
|
|
50
|
+
const usesAdditionalUnit = scheme.constraintType === enums_1.SchemeConstraintType.ADDITIONAL_UNIT;
|
|
51
|
+
// Select the correct net price based on unit type
|
|
52
|
+
const { netPrice, stdUnitNetPrice, superUnitNetPrice, additionalUnitNetPrice, standardUnitConversionFactor, superUnitConversionFactor, additionalUnitConversionFactor, } = perUnitPrices;
|
|
53
|
+
const stdUnitFinalPrice = stdUnitNetPrice * standardUnitConversionFactor;
|
|
54
|
+
const superUnitFinalPrice = superUnitNetPrice * superUnitConversionFactor;
|
|
55
|
+
const additionalUnitFinalPrice = additionalUnitNetPrice * additionalUnitConversionFactor;
|
|
56
|
+
let finalNetPrice;
|
|
57
|
+
if (usesStdUnit) {
|
|
58
|
+
finalNetPrice = stdUnitFinalPrice;
|
|
59
|
+
}
|
|
60
|
+
else if (usesSuperUnit) {
|
|
61
|
+
finalNetPrice = superUnitFinalPrice;
|
|
62
|
+
}
|
|
63
|
+
else if (usesAdditionalUnit) {
|
|
64
|
+
finalNetPrice = additionalUnitFinalPrice;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
finalNetPrice = netPrice;
|
|
68
|
+
}
|
|
69
|
+
const discountAmountPreTax = discountAmountOfPerUnit / (1 + totalTaxPercentage / 100);
|
|
70
|
+
let itemDiscountPercent;
|
|
71
|
+
if (scheme.additionalCalculationLogic === enums_1.AdditionalCalculationLogic.DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE) {
|
|
72
|
+
itemDiscountPercent = ((discountAmountPreTax || 0) * 100) / (finalNetPrice || 1);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
itemDiscountPercent = ((discountAmountOfPerUnit ?? 0) / (finalNetPrice || 1)) * 100;
|
|
76
|
+
}
|
|
77
|
+
result.matched = true;
|
|
78
|
+
result.matchedSlabId = slab.id;
|
|
79
|
+
result.discountPercent = itemDiscountPercent;
|
|
80
|
+
result.targetMethod = "setDiscountScheme";
|
|
81
|
+
// Store recalculation data for later price recalculation
|
|
82
|
+
result.recalculateSchemeData = {
|
|
83
|
+
discountAmountOfPerUnit,
|
|
84
|
+
totalTaxPercentage,
|
|
85
|
+
usesStdUnit,
|
|
86
|
+
usesSuperUnit,
|
|
87
|
+
usesAdditionalUnit,
|
|
88
|
+
compareValue,
|
|
89
|
+
calculationOnCompleteNumber: scheme.calculationOnCompleteNumber,
|
|
90
|
+
additionalCalculationLogic: scheme.additionalCalculationLogic,
|
|
91
|
+
};
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=per-unit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-unit.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/per-unit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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 ProductNewCalculatorInput {
|
|
5
|
+
/** Full scheme configuration. */
|
|
6
|
+
scheme: Scheme;
|
|
7
|
+
/** Precomputed compare value used for slab matching (usually quantity/units). */
|
|
8
|
+
compareValue: number;
|
|
9
|
+
/** Total amount of the qualifying set (used when distributing unitary scheme value as discount). */
|
|
10
|
+
totalAmount: number;
|
|
11
|
+
/** Items contributing to qualification for this scheme. */
|
|
12
|
+
applicableProducts: QualifierItem[];
|
|
13
|
+
/** Whether to use MRP billing payout (slab.mrpPayout) for payout quantities. */
|
|
14
|
+
isMrpBilling: boolean;
|
|
15
|
+
/** Price of the payout/free product when distributing unitary product scheme as discount. */
|
|
16
|
+
focProductPrice?: number;
|
|
17
|
+
/** Company rule: treat PRODUCT_SCHEME_NEW payout as unitary discount distribution when enabled. */
|
|
18
|
+
companyUsesUnitaryProductScheme?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Calculate payout for PRODUCT_SCHEME_NEW payout type.
|
|
22
|
+
*
|
|
23
|
+
* Continuous: payoutQty = Math.floor(payout × compareValue)
|
|
24
|
+
* Factor-based: same as PRODUCT with factor = floor(compareValue / constraint)
|
|
25
|
+
*/
|
|
26
|
+
export declare function calculateProductSchemeNewPayout(input: ProductNewCalculatorInput): SchemeSlabResult;
|
|
27
|
+
//# sourceMappingURL=product-new.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-new.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/product-new.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,yBAAyB;IACxC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,gFAAgF;IAChF,YAAY,EAAE,OAAO,CAAC;IACtB,6FAA6F;IAC7F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mGAAmG;IACnG,+BAA+B,CAAC,EAAE,OAAO,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,yBAAyB,GAC/B,gBAAgB,CA4FlB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateProductSchemeNewPayout = calculateProductSchemeNewPayout;
|
|
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 PRODUCT_SCHEME_NEW payout type.
|
|
11
|
+
*
|
|
12
|
+
* Continuous: payoutQty = Math.floor(payout × compareValue)
|
|
13
|
+
* Factor-based: same as PRODUCT with factor = floor(compareValue / constraint)
|
|
14
|
+
*/
|
|
15
|
+
function calculateProductSchemeNewPayout(input) {
|
|
16
|
+
const { scheme, compareValue, totalAmount, applicableProducts, isMrpBilling, focProductPrice = 0, companyUsesUnitaryProductScheme = false, } = input;
|
|
17
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.PRODUCT_SCHEME_NEW);
|
|
18
|
+
result.targetMethod = "addProduct";
|
|
19
|
+
if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
|
|
20
|
+
result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
|
|
24
|
+
if (slabs.length === 0) {
|
|
25
|
+
result.warnings.push("Slab list is empty");
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
const payoutCalcType = scheme.payoutCalculationType;
|
|
29
|
+
const matcherParams = {
|
|
30
|
+
slabs,
|
|
31
|
+
compareValue,
|
|
32
|
+
applicableProducts,
|
|
33
|
+
payoutType: enums_1.SchemePayoutType.PRODUCT_SCHEME_NEW,
|
|
34
|
+
discountOn: scheme.discountOn ?? null,
|
|
35
|
+
};
|
|
36
|
+
// ─── Continuous ────────────────────────────────────────────────
|
|
37
|
+
if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType)) {
|
|
38
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
39
|
+
if (!match)
|
|
40
|
+
return result;
|
|
41
|
+
const { slab } = match;
|
|
42
|
+
const payoutProductId = slab.productId;
|
|
43
|
+
const payoutQty = Math.floor((isMrpBilling ? slab.mrpPayout : slab.payout) * compareValue);
|
|
44
|
+
result.matched = true;
|
|
45
|
+
result.matchedSlabId = slab.id;
|
|
46
|
+
result.freeQty = payoutQty;
|
|
47
|
+
result.productToAdd = { productId: payoutProductId, quantity: payoutQty };
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
// ─── Factor-based (any other truthy payoutCalculationType) ─────
|
|
51
|
+
if (payoutCalcType) {
|
|
52
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
53
|
+
if (!match)
|
|
54
|
+
return result;
|
|
55
|
+
const { slab } = match;
|
|
56
|
+
const payoutProductId = slab.productId;
|
|
57
|
+
const payoutProductMasterBatchId = slab.masterBatchId?.[0] || null;
|
|
58
|
+
const employeeWiseRemainingBudget = scheme.employeeWiseRemainingBudget;
|
|
59
|
+
let factor;
|
|
60
|
+
if ((employeeWiseRemainingBudget || employeeWiseRemainingBudget === 0) &&
|
|
61
|
+
compareValue > employeeWiseRemainingBudget) {
|
|
62
|
+
factor = Math.floor(employeeWiseRemainingBudget / slab.constraint);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
factor = Math.floor(compareValue / slab.constraint);
|
|
66
|
+
}
|
|
67
|
+
const payoutQty = (isMrpBilling ? slab.mrpPayout : slab.payout) * factor;
|
|
68
|
+
result.matched = true;
|
|
69
|
+
result.matchedSlabId = slab.id;
|
|
70
|
+
result.freeQty = payoutQty;
|
|
71
|
+
result.productToAdd = { productId: payoutProductId, quantity: payoutQty, masterBatchId: payoutProductMasterBatchId };
|
|
72
|
+
// Unitary product scheme distribution
|
|
73
|
+
if (companyUsesUnitaryProductScheme && focProductPrice > 0) {
|
|
74
|
+
const discountAmountTotal = focProductPrice * payoutQty;
|
|
75
|
+
const itemDiscountPercent = ((discountAmountTotal || 0) * 100) / (totalAmount || 1);
|
|
76
|
+
result.discountPercent = itemDiscountPercent;
|
|
77
|
+
result.discountValue = discountAmountTotal;
|
|
78
|
+
result.targetMethod = "setDiscountAndValueScheme";
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=product-new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-new.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/product-new.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 ProductCalculatorInput {
|
|
5
|
+
/** Full scheme configuration. */
|
|
6
|
+
scheme: Scheme;
|
|
7
|
+
/** Precomputed compare value used for slab matching (usually quantity/units). */
|
|
8
|
+
compareValue: number;
|
|
9
|
+
/** Total amount of the qualifying set (used when distributing unitary scheme value as discount). */
|
|
10
|
+
totalAmount: number;
|
|
11
|
+
/** Items contributing to qualification for this scheme. */
|
|
12
|
+
applicableProducts: QualifierItem[];
|
|
13
|
+
/** Whether to use MRP billing payout (slab.mrpPayout) where applicable. */
|
|
14
|
+
isMrpBilling: boolean;
|
|
15
|
+
/** Price of the payout FOC product (for unitary scheme) */
|
|
16
|
+
focProductPrice?: number;
|
|
17
|
+
/** Company rule: treat PRODUCT payout as unitary (distribute free product value as discount). */
|
|
18
|
+
companyUsesUnitaryProductScheme?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Calculate payout for PRODUCT payout type.
|
|
22
|
+
*
|
|
23
|
+
* factor = Math.floor(compareValue / slab.constraint)
|
|
24
|
+
* payoutQty = payout × factor
|
|
25
|
+
* Calls addProduct to add free product.
|
|
26
|
+
*
|
|
27
|
+
* If companyUsesUnitaryProductScheme, also distributes focProduct price
|
|
28
|
+
* as a discount across applicable products.
|
|
29
|
+
*/
|
|
30
|
+
export declare function calculateProductPayout(input: ProductCalculatorInput): SchemeSlabResult;
|
|
31
|
+
//# sourceMappingURL=product.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/product.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,2EAA2E;IAC3E,YAAY,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,+BAA+B,CAAC,EAAE,OAAO,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,gBAAgB,CAyEtF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateProductPayout = calculateProductPayout;
|
|
4
|
+
const enums_1 = require("../../types/enums");
|
|
5
|
+
const applied_scheme_1 = require("../../types/applied-scheme");
|
|
6
|
+
const constraint_checks_1 = require("../../helpers/constraint-checks");
|
|
7
|
+
const slab_matcher_1 = require("../slab-matcher");
|
|
8
|
+
/**
|
|
9
|
+
* Calculate payout for PRODUCT payout type.
|
|
10
|
+
*
|
|
11
|
+
* factor = Math.floor(compareValue / slab.constraint)
|
|
12
|
+
* payoutQty = payout × factor
|
|
13
|
+
* Calls addProduct to add free product.
|
|
14
|
+
*
|
|
15
|
+
* If companyUsesUnitaryProductScheme, also distributes focProduct price
|
|
16
|
+
* as a discount across applicable products.
|
|
17
|
+
*/
|
|
18
|
+
function calculateProductPayout(input) {
|
|
19
|
+
const { scheme, compareValue, totalAmount, applicableProducts, isMrpBilling, focProductPrice = 0, companyUsesUnitaryProductScheme = false, } = input;
|
|
20
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.PRODUCT);
|
|
21
|
+
result.targetMethod = "addProduct";
|
|
22
|
+
if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
|
|
23
|
+
result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
if (!scheme.payoutCalculationType) {
|
|
27
|
+
result.warnings.push(`No matching calculation type found: ${scheme.payoutCalculationType}`);
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
|
|
31
|
+
if (slabs.length === 0) {
|
|
32
|
+
result.warnings.push("Slab list is empty");
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
const matcherParams = {
|
|
36
|
+
slabs,
|
|
37
|
+
compareValue,
|
|
38
|
+
applicableProducts,
|
|
39
|
+
payoutType: enums_1.SchemePayoutType.PRODUCT,
|
|
40
|
+
discountOn: scheme.discountOn ?? null,
|
|
41
|
+
};
|
|
42
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
43
|
+
if (!match)
|
|
44
|
+
return result;
|
|
45
|
+
const { slab } = match;
|
|
46
|
+
const payoutProductId = slab.productId;
|
|
47
|
+
const payoutProductMasterBatchId = slab.masterBatchId?.[0] || null;
|
|
48
|
+
// Budget-cap the factor
|
|
49
|
+
const employeeWiseRemainingBudget = scheme.employeeWiseRemainingBudget;
|
|
50
|
+
let factor;
|
|
51
|
+
if ((employeeWiseRemainingBudget || employeeWiseRemainingBudget === 0) &&
|
|
52
|
+
compareValue > employeeWiseRemainingBudget) {
|
|
53
|
+
factor = Math.floor(employeeWiseRemainingBudget / slab.constraint);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
factor = Math.floor(compareValue / slab.constraint);
|
|
57
|
+
}
|
|
58
|
+
const payoutQty = (isMrpBilling ? slab.mrpPayout : slab.payout) * factor;
|
|
59
|
+
result.matched = true;
|
|
60
|
+
result.matchedSlabId = slab.id;
|
|
61
|
+
result.freeQty = payoutQty;
|
|
62
|
+
result.productToAdd = { productId: payoutProductId, quantity: payoutQty, masterBatchId: payoutProductMasterBatchId };
|
|
63
|
+
// If unitary product scheme, also calculate distributed discount
|
|
64
|
+
if (companyUsesUnitaryProductScheme && focProductPrice > 0) {
|
|
65
|
+
const discountAmountTotal = focProductPrice * payoutQty;
|
|
66
|
+
const itemDiscountPercent = ((discountAmountTotal || 0) * 100) / (totalAmount || 1);
|
|
67
|
+
result.discountPercent = itemDiscountPercent;
|
|
68
|
+
result.discountValue = discountAmountTotal;
|
|
69
|
+
result.targetMethod = "setDiscountAndValueScheme";
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=product.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/product.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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 TopupCalculatorInput {
|
|
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 payout (slab.mrpPayout). */
|
|
12
|
+
isMrpBilling: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Calculate payout for TOPUP (TopUpDiscount) payout type.
|
|
16
|
+
* Simple: itemDiscountPercent = slab.payout directly.
|
|
17
|
+
*/
|
|
18
|
+
export declare function calculateTopupPayout(input: TopupCalculatorInput): SchemeSlabResult;
|
|
19
|
+
//# sourceMappingURL=topup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topup.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/topup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,0DAA0D;IAC1D,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,gBAAgB,CAwClF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateTopupPayout = calculateTopupPayout;
|
|
4
|
+
const enums_1 = require("../../types/enums");
|
|
5
|
+
const applied_scheme_1 = require("../../types/applied-scheme");
|
|
6
|
+
const constraint_checks_1 = require("../../helpers/constraint-checks");
|
|
7
|
+
const slab_matcher_1 = require("../slab-matcher");
|
|
8
|
+
/**
|
|
9
|
+
* Calculate payout for TOPUP (TopUpDiscount) payout type.
|
|
10
|
+
* Simple: itemDiscountPercent = slab.payout directly.
|
|
11
|
+
*/
|
|
12
|
+
function calculateTopupPayout(input) {
|
|
13
|
+
const { scheme, compareValue, applicableProducts, isMrpBilling } = input;
|
|
14
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.TOPUP);
|
|
15
|
+
if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
|
|
16
|
+
result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
if (!scheme.payoutCalculationType) {
|
|
20
|
+
result.warnings.push(`No matching calculation type found: ${scheme.payoutCalculationType}`);
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
|
|
24
|
+
if (slabs.length === 0) {
|
|
25
|
+
result.warnings.push("Slab list is empty");
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
const matcherParams = {
|
|
29
|
+
slabs,
|
|
30
|
+
compareValue,
|
|
31
|
+
applicableProducts,
|
|
32
|
+
payoutType: enums_1.SchemePayoutType.TOPUP,
|
|
33
|
+
discountOn: scheme.discountOn ?? null,
|
|
34
|
+
};
|
|
35
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
36
|
+
if (!match)
|
|
37
|
+
return result;
|
|
38
|
+
const { slab } = match;
|
|
39
|
+
const itemDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
|
|
40
|
+
result.matched = true;
|
|
41
|
+
result.matchedSlabId = slab.id;
|
|
42
|
+
result.discountPercent = itemDiscountPercent;
|
|
43
|
+
result.targetMethod = "setDiscountScheme";
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=topup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topup.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/topup.ts"],"names":[],"mappings":";;AAuBA,oDAwCC;AA7DD,6CAAqD;AACrD,+DAAmE;AACnE,uEAAwE;AACxE,kDAA2E;AAc3E;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,KAA2B;IAC9D,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IACzE,MAAM,MAAM,GAAG,IAAA,sCAAqB,EAAC,wBAAgB,CAAC,KAAK,CAAC,CAAC;IAE7D,IAAI,CAAC,IAAA,yCAAqB,EAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,uCAAuC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAC5F,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,aAAa,GAAsB;QACvC,KAAK;QACL,YAAY;QACZ,kBAAkB;QAClB,UAAU,EAAE,wBAAgB,CAAC,KAAK;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;KACtC,CAAC;IAEF,MAAM,KAAK,GAAG,IAAA,+BAAgB,EAAC,aAAa,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,mBAAmB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAExE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;IAC/B,MAAM,CAAC,eAAe,GAAG,mBAAmB,CAAC;IAC7C,MAAM,CAAC,YAAY,GAAG,mBAAmB,CAAC;IAE1C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Slab } from "../types/scheme";
|
|
2
|
+
import type { QualifierItem } from "../helpers/qualifier-checks";
|
|
3
|
+
import { SchemePayoutType } from "../types/enums";
|
|
4
|
+
export interface SlabMatcherParams {
|
|
5
|
+
/** Slab list for the scheme (typically pre-sorted by caller). */
|
|
6
|
+
slabs: Slab[];
|
|
7
|
+
/** The metric used to evaluate slab constraints (qty/amount/units depending on scheme.constraintType). */
|
|
8
|
+
compareValue: number;
|
|
9
|
+
/** Items contributing to qualification (used for qualifier checks). */
|
|
10
|
+
applicableProducts: QualifierItem[];
|
|
11
|
+
/** Payout type context (qualifier logic can vary by payout type). */
|
|
12
|
+
payoutType: SchemePayoutType | string;
|
|
13
|
+
/** Discount-on mode (e.g. group scheme) that alters qualifier checks. */
|
|
14
|
+
discountOn: number | null;
|
|
15
|
+
}
|
|
16
|
+
export interface MatchedSlab {
|
|
17
|
+
/** The slab that qualified and matched. */
|
|
18
|
+
slab: Slab;
|
|
19
|
+
/** Index of the matched slab in the `slabs` array. */
|
|
20
|
+
index: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Finds the first matching slab from a list sorted desc by constraint.
|
|
24
|
+
* Applies:
|
|
25
|
+
* 1. Secondary category / qualifier filter
|
|
26
|
+
* 2. Payout-type-aware constraint check (with maxConstraint handling)
|
|
27
|
+
*
|
|
28
|
+
* Returns the matched slab or null if none matched.
|
|
29
|
+
*/
|
|
30
|
+
export declare function findMatchingSlab(params: SlabMatcherParams): MatchedSlab | null;
|
|
31
|
+
/**
|
|
32
|
+
* Finds two adjacent slabs for step/continuous interpolation.
|
|
33
|
+
* Returns the lower and upper slab. If compare value exceeds the highest slab,
|
|
34
|
+
* uses that slab for both lower and upper.
|
|
35
|
+
*/
|
|
36
|
+
export declare function findInterpolationSlabs(params: SlabMatcherParams): {
|
|
37
|
+
lower: Slab;
|
|
38
|
+
upper: Slab;
|
|
39
|
+
lowerIndex: number;
|
|
40
|
+
} | null;
|
|
41
|
+
//# sourceMappingURL=slab-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slab-matcher.d.ts","sourceRoot":"","sources":["../../src/calculators/slab-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIlD,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,0GAA0G;IAC1G,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,qEAAqE;IACrE,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACtC,yEAAyE;IACzE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,IAAI,EAAE,IAAI,CAAC;IACX,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,GAAG,IAAI,CA4B9E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,GACxB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4BzD"}
|