@parv0888/scheme-engine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/calculators/discount-application.d.ts +44 -0
- package/dist/calculators/discount-application.d.ts.map +1 -0
- package/dist/calculators/discount-application.js +174 -0
- package/dist/calculators/discount-application.js.map +1 -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/esm/calculators/discount-application.js +170 -0
- package/dist/esm/calculators/discount-application.js.map +1 -0
- package/dist/esm/calculators/index.js +176 -0
- package/dist/esm/calculators/index.js.map +1 -0
- package/dist/esm/calculators/payout-types/article.js +70 -0
- package/dist/esm/calculators/payout-types/article.js.map +1 -0
- package/dist/esm/calculators/payout-types/basket.js +105 -0
- package/dist/esm/calculators/payout-types/basket.js.map +1 -0
- package/dist/esm/calculators/payout-types/coupon.js +71 -0
- package/dist/esm/calculators/payout-types/coupon.js.map +1 -0
- package/dist/esm/calculators/payout-types/discount.js +107 -0
- package/dist/esm/calculators/payout-types/discount.js.map +1 -0
- package/dist/esm/calculators/payout-types/fixed-discount.js +62 -0
- package/dist/esm/calculators/payout-types/fixed-discount.js.map +1 -0
- package/dist/esm/calculators/payout-types/foc.js +127 -0
- package/dist/esm/calculators/payout-types/foc.js.map +1 -0
- package/dist/esm/calculators/payout-types/mrp-percentage.js +74 -0
- package/dist/esm/calculators/payout-types/mrp-percentage.js.map +1 -0
- package/dist/esm/calculators/payout-types/nlp.js +56 -0
- package/dist/esm/calculators/payout-types/nlp.js.map +1 -0
- package/dist/esm/calculators/payout-types/per-unit.js +91 -0
- package/dist/esm/calculators/payout-types/per-unit.js.map +1 -0
- package/dist/esm/calculators/payout-types/product-new.js +82 -0
- package/dist/esm/calculators/payout-types/product-new.js.map +1 -0
- package/dist/esm/calculators/payout-types/product.js +70 -0
- package/dist/esm/calculators/payout-types/product.js.map +1 -0
- package/dist/esm/calculators/payout-types/topup.js +43 -0
- package/dist/esm/calculators/payout-types/topup.js.map +1 -0
- package/dist/esm/calculators/slab-matcher.js +64 -0
- package/dist/esm/calculators/slab-matcher.js.map +1 -0
- package/dist/esm/helpers/calc-type-checks.js +30 -0
- package/dist/esm/helpers/calc-type-checks.js.map +1 -0
- package/dist/esm/helpers/compare-value.js +109 -0
- package/dist/esm/helpers/compare-value.js.map +1 -0
- package/dist/esm/helpers/constraint-checks.js +67 -0
- package/dist/esm/helpers/constraint-checks.js.map +1 -0
- package/dist/esm/helpers/index.js +8 -0
- package/dist/esm/helpers/index.js.map +1 -0
- package/dist/esm/helpers/math.js +84 -0
- package/dist/esm/helpers/math.js.map +1 -0
- package/dist/esm/helpers/payout-type-checks.js +29 -0
- package/dist/esm/helpers/payout-type-checks.js.map +1 -0
- package/dist/esm/helpers/qualifier-checks.js +188 -0
- package/dist/esm/helpers/qualifier-checks.js.map +1 -0
- package/dist/esm/helpers/scheme-applicability.js +93 -0
- package/dist/esm/helpers/scheme-applicability.js.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types/applied-scheme.js +19 -0
- package/dist/esm/types/applied-scheme.js.map +1 -0
- package/dist/esm/types/enums.js +115 -0
- package/dist/esm/types/enums.js.map +1 -0
- package/dist/esm/types/index.js +5 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/item-props.js +2 -0
- package/dist/esm/types/item-props.js.map +1 -0
- package/dist/esm/types/scheme.js +2 -0
- package/dist/esm/types/scheme.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 +29 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Scheme, Basket } from "../../types/scheme";
|
|
2
|
+
import type { SchemeSlabResult } from "../../types/applied-scheme";
|
|
3
|
+
import { type QualifierItem } from "../../helpers/qualifier-checks";
|
|
4
|
+
export interface BasketItem {
|
|
5
|
+
/** SKU id. */
|
|
6
|
+
productId: number;
|
|
7
|
+
/** Billed quantity for the SKU within basket selection. */
|
|
8
|
+
quantity: number;
|
|
9
|
+
/** Unit price used for basket amount calculation (PTR/ex-tax in most flows). */
|
|
10
|
+
price: number;
|
|
11
|
+
/** Alternate category/group string for qualifier filtering. */
|
|
12
|
+
category1: string | null;
|
|
13
|
+
/** Primary category id for qualifier filtering. */
|
|
14
|
+
primaryCategoryId: number;
|
|
15
|
+
/** Secondary category id for qualifier filtering. */
|
|
16
|
+
secondaryCategoryId: number;
|
|
17
|
+
/** Attribute text 1 for qualifier filtering. */
|
|
18
|
+
productAttributeText1: string | null;
|
|
19
|
+
/** Whether the item is saleable/must-sell eligible. */
|
|
20
|
+
isSaleable: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface BasketCalculatorInput {
|
|
23
|
+
/** Full scheme configuration. */
|
|
24
|
+
scheme: Scheme;
|
|
25
|
+
/** Precomputed compare value used for slab matching (not always used directly in basket logic). */
|
|
26
|
+
compareValue: number;
|
|
27
|
+
/** Items contributing to qualification for this scheme (qualifier checks run on this). */
|
|
28
|
+
applicableProducts: QualifierItem[];
|
|
29
|
+
/** Basket definitions referenced by slab qualifierSchemeSlabs. */
|
|
30
|
+
baskets: Basket[];
|
|
31
|
+
/** Items selected in the basket context (used to compute basket totals and mandatory basket qualification). */
|
|
32
|
+
selectedItems: BasketItem[];
|
|
33
|
+
/** Whether to use MRP billing payout (slab.mrpPayout) where applicable. */
|
|
34
|
+
isMrpBilling: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface BasketResult extends SchemeSlabResult {
|
|
37
|
+
/** Product IDs the discount should be applied to */
|
|
38
|
+
applicableProductIds: number[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Calculate payout for BASKET payout type.
|
|
42
|
+
*
|
|
43
|
+
* Slabs sorted by id desc.
|
|
44
|
+
* Validates mandatory baskets pass constraint (qty or amount).
|
|
45
|
+
* itemDiscountPercent = slab.basketInvoicePayout
|
|
46
|
+
* Only applies to basket product items.
|
|
47
|
+
*/
|
|
48
|
+
export declare function calculateBasketPayout(input: BasketCalculatorInput): BasketResult;
|
|
49
|
+
//# sourceMappingURL=basket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basket.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/basket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAoB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,OAAO,EAAmE,KAAK,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAGrI,MAAM,WAAW,UAAU;IACzB,cAAc;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,uDAAuD;IACvD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,YAAY,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+GAA+G;IAC/G,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,2EAA2E;IAC3E,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,oDAAoD;IACpD,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,CA8GhF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateBasketPayout = calculateBasketPayout;
|
|
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 qualifier_checks_1 = require("../../helpers/qualifier-checks");
|
|
9
|
+
/**
|
|
10
|
+
* Calculate payout for BASKET payout type.
|
|
11
|
+
*
|
|
12
|
+
* Slabs sorted by id desc.
|
|
13
|
+
* Validates mandatory baskets pass constraint (qty or amount).
|
|
14
|
+
* itemDiscountPercent = slab.basketInvoicePayout
|
|
15
|
+
* Only applies to basket product items.
|
|
16
|
+
*/
|
|
17
|
+
function calculateBasketPayout(input) {
|
|
18
|
+
const { scheme, compareValue, applicableProducts, baskets, selectedItems, isMrpBilling } = input;
|
|
19
|
+
const result = {
|
|
20
|
+
...(0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.BASKET),
|
|
21
|
+
applicableProductIds: [],
|
|
22
|
+
};
|
|
23
|
+
if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
|
|
24
|
+
result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
if (!(0, calc_type_checks_1.isPayoutCalcTypeContinuous)(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) => b.id - a.id);
|
|
32
|
+
if (slabs.length === 0) {
|
|
33
|
+
result.warnings.push("Slab list is empty");
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
for (const slab of slabs) {
|
|
37
|
+
// Check qualifiers
|
|
38
|
+
const qualifierParams = {
|
|
39
|
+
secondQualifier: slab.secondQualifier,
|
|
40
|
+
secondQualifierType: slab.secondQualifierType,
|
|
41
|
+
discountOn: scheme.discountOn ?? null,
|
|
42
|
+
firstQualifier: slab.firstQualifier,
|
|
43
|
+
thirdQualifier: slab.thirdQualifier,
|
|
44
|
+
thirdQualifierType: slab.thirdQualifierType,
|
|
45
|
+
slabConstraint: slab.constraint,
|
|
46
|
+
};
|
|
47
|
+
if (!(0, qualifier_checks_1.checkIfSecondaryCategoryFilterPassed)(qualifierParams, applicableProducts)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Get all basket product IDs for this slab
|
|
51
|
+
const slabBasketIds = slab.qualifierSchemeSlabs.map((v) => v.basketId);
|
|
52
|
+
const slabBaskets = baskets.filter((v) => slabBasketIds.includes(+v.id));
|
|
53
|
+
const allBasketProductIds = slabBaskets.map((v) => v.productIds).flat();
|
|
54
|
+
const allBasketSelectedItems = selectedItems.filter((v) => allBasketProductIds.includes(v.productId));
|
|
55
|
+
// Check slab constraint against basket items total
|
|
56
|
+
const basketTotalAmount = allBasketSelectedItems.reduce((acc, v) => acc + v.quantity * v.price, 0);
|
|
57
|
+
if (basketTotalAmount < slab.constraint) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Check mandatory baskets
|
|
61
|
+
const mandatoryBasketSlabs = slab.qualifierSchemeSlabs.filter((v) => v.isBasketMandatory);
|
|
62
|
+
let basketsConstraintPassed = mandatoryBasketSlabs.length === 0 ? false : true;
|
|
63
|
+
for (const basketSlab of mandatoryBasketSlabs) {
|
|
64
|
+
const basket = baskets.find((v) => v.id == basketSlab.basketId);
|
|
65
|
+
if (!basket) {
|
|
66
|
+
result.warnings.push(`Basket not found: ${basketSlab.basketId}`);
|
|
67
|
+
basketsConstraintPassed = false;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
const basketProductIds = basket.productIds;
|
|
71
|
+
const basketSelectedItems = selectedItems.filter((v) => basketProductIds?.includes(v.productId));
|
|
72
|
+
const constraint = basketSlab.quantity;
|
|
73
|
+
let basketCompareValue;
|
|
74
|
+
if (scheme.constraintType === enums_1.SchemeConstraintType.QUANTITY) {
|
|
75
|
+
basketCompareValue = basketSelectedItems.reduce((acc, v) => acc + v.quantity, 0);
|
|
76
|
+
}
|
|
77
|
+
else if (scheme.constraintType === enums_1.SchemeConstraintType.AMOUNT) {
|
|
78
|
+
basketCompareValue = basketSelectedItems.reduce((acc, v) => acc + v.quantity * v.price, 0);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
result.warnings.push(`Basket scheme: Invalid constraint type: ${scheme.constraintType}`);
|
|
82
|
+
basketCompareValue = -1;
|
|
83
|
+
}
|
|
84
|
+
if (basketCompareValue >= constraint) {
|
|
85
|
+
basketsConstraintPassed = true;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
basketsConstraintPassed = false;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (basketsConstraintPassed) {
|
|
93
|
+
// Get applicable basket product IDs
|
|
94
|
+
const basketIds = slab.qualifierSchemeSlabs.map((v) => v.basketId.toString());
|
|
95
|
+
const applicableBasketProductIds = baskets
|
|
96
|
+
.filter((v) => basketIds.includes(v.id.toString()))
|
|
97
|
+
.reduce((acc, v) => acc.concat(v.productIds), []);
|
|
98
|
+
result.matched = true;
|
|
99
|
+
result.matchedSlabId = slab.id;
|
|
100
|
+
result.discountPercent = slab.basketInvoicePayout;
|
|
101
|
+
result.applicableProductIds = applicableBasketProductIds;
|
|
102
|
+
result.targetMethod = "setDiscountScheme";
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=basket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basket.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/basket.ts"],"names":[],"mappings":";;AAwDA,sDA8GC;AApKD,6CAA2E;AAC3E,+DAAmE;AACnE,qEAA4E;AAC5E,uEAAwE;AACxE,qEAAqI;AA0CrI;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,KAA4B;IAChE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IACjG,MAAM,MAAM,GAAiB;QAC3B,GAAG,IAAA,sCAAqB,EAAC,wBAAgB,CAAC,MAAM,CAAC;QACjD,oBAAoB,EAAE,EAAE;KACzB,CAAC;IAEF,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,IAAA,6CAA0B,EAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC9D,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,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5D,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,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,mBAAmB;QACnB,MAAM,eAAe,GAAyB;YAC5C,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;YACrC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,cAAc,EAAE,IAAI,CAAC,UAAU;SAChC,CAAC;QAEF,IAAI,CAAC,IAAA,uDAAoC,EAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAC/E,SAAS;QACX,CAAC;QAED,2CAA2C;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QACxE,MAAM,sBAAsB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACxD,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAC1C,CAAC;QAEF,mDAAmD;QACnD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,MAAM,CACrD,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,EACtC,CAAC,CACF,CAAC;QACF,IAAI,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC1F,IAAI,uBAAuB,GAAG,oBAAoB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/E,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACjE,uBAAuB,GAAG,KAAK,CAAC;gBAChC,MAAM;YACR,CAAC;YAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC;YAC3C,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACrD,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CACxC,CAAC;YAEF,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC;YACvC,IAAI,kBAA0B,CAAC;YAE/B,IAAI,MAAM,CAAC,cAAc,KAAK,4BAAoB,CAAC,QAAQ,EAAE,CAAC;gBAC5D,kBAAkB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnF,CAAC;iBAAM,IAAI,MAAM,CAAC,cAAc,KAAK,4BAAoB,CAAC,MAAM,EAAE,CAAC;gBACjE,kBAAkB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7F,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,2CAA2C,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;gBACzF,kBAAkB,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC;YAED,IAAI,kBAAkB,IAAI,UAAU,EAAE,CAAC;gBACrC,uBAAuB,GAAG,IAAI,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,uBAAuB,GAAG,KAAK,CAAC;gBAChC,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,uBAAuB,EAAE,CAAC;YAC5B,oCAAoC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9E,MAAM,0BAA0B,GAAG,OAAO;iBACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;iBAClD,MAAM,CAAW,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAE9D,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC;YAClD,MAAM,CAAC,oBAAoB,GAAG,0BAA0B,CAAC;YACzD,MAAM,CAAC,YAAY,GAAG,mBAAmB,CAAC;YAC1C,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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 CouponCalculatorInput {
|
|
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 when converting coupon value to %). */
|
|
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
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Calculate payout for COUPON payout type.
|
|
18
|
+
*
|
|
19
|
+
* Continuous: placeholder discount (totalCouponValue = 0) + addProduct
|
|
20
|
+
* Step: addProduct with slab.payout qty
|
|
21
|
+
*/
|
|
22
|
+
export declare function calculateCouponPayout(input: CouponCalculatorInput): SchemeSlabResult;
|
|
23
|
+
//# sourceMappingURL=coupon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupon.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/coupon.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,qBAAqB;IACpC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,gFAAgF;IAChF,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,gBAAgB,CAoEpF"}
|
|
@@ -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":";;AA2BA,0DAiHC;AA1ID,6CAAqD;AACrD,+DAAmE;AACnE,qEAA2H;AAC3H,uEAAwE;AACxE,kDAAmG;AAEnG,6CAAyD;AAezD;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,KAA8B;IACpE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAC3F,MAAM,MAAM,GAAG,IAAA,sCAAqB,EAAC,wBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEhE,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,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,QAAQ;QACrC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;KACtC,CAAC;IAEF,MAAM,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC;IAEpD,kEAAkE;IAClE,IAAI,IAAA,uCAAoB,EAAC,cAAc,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAA,+BAAgB,EAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;YACvB,MAAM,mBAAmB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACxE,gFAAgF;YAChF,2DAA2D;YAC3D,MAAM,mBAAmB,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC;YAC1E,MAAM,mBAAmB,GAAG,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;YAErF,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,eAAe,GAAG,mBAAmB,CAAC;YAC7C,MAAM,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,CAAC;YACtF,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC;YACtC,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,CAAC,2BAA2B,GAAG,mBAAmB,CAAC;gBACzD,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kEAAkE;IAClE,IAAI,IAAA,6CAA0B,EAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAA,+BAAgB,EAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;YACvB,MAAM,mBAAmB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAExE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,eAAe,GAAG,mBAAmB,CAAC;YAC7C,MAAM,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,CAAC;YACtF,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC;YACtC,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,CAAC,2BAA2B,GAAG,mBAAmB,CAAC;gBACzD,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kEAAkE;IAClE,IAAI,IAAA,0CAAuB,EAAC,cAAc,CAAC,EAAE,CAAC;QAC5C,MAAM,QAAQ,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;QAE/E,2FAA2F;QAC3F,0FAA0F;QAC1F,2FAA2F;QAC3F,IAAI,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU;YAAE,OAAO,MAAM,CAAC;QAEzD,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YAErC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU;gBACrD,CAAC,CAAC,IAAI,CAAC,GAAG,CACN,CAAC,EACD,MAAM,CAAC,cAAc,KAAK,4BAAoB,CAAC,MAAM;oBACnD,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC;oBACvC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CACtC;gBACH,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAEpD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,aAAa,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;YAC5C,CAAC;YAED,yEAAyE;YACzE,IAAI,CAAC,IAAI,IAAI,YAAY,GAAG,IAAI,CAAC,UAAU;gBAAE,MAAM;QACrD,CAAC;QAED,MAAM,gBAAgB,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAErF,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;QACjE,MAAM,CAAC,eAAe,GAAG,gBAAgB,CAAC;QAC1C,MAAM,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACtF,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC;QACtC,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,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":";;AAiCA,oEA8DC;AA7FD,6CAAqD;AACrD,+DAAmE;AACnE,6CAAgE;AAChE,uEAAwE;AACxE,kDAA2E;AAkB3E;;;;;;;;GAQG;AACH,SAAgB,4BAA4B,CAC1C,KAAmC;IAEnC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IACtF,MAAM,MAAM,GAAG,IAAA,sCAAqB,EAAC,wBAAgB,CAAC,cAAc,CAAC,CAAC;IAEtE,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,cAAc;QAC3C,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,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAE/D,MAAM,cAAc,GAAG,MAAM,CAAC,qBAAqB,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjF,MAAM,UAAU,GACd,cAAc,KAAK,mCAA2B,CAAC,IAAI;QACnD,cAAc,KAAK,mCAA2B,CAAC,eAAe,CAAC;IAEjE,MAAM,MAAM,GACV,UAAU,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErF,IAAI,mBAAmB,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;IAEhE,wEAAwE;IACxE,+EAA+E;IAC/E,MAAM,UAAU,GAAG,MAAM,CAAC,2BAA2B,CAAC;IACtD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACtD,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAEpF,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,aAAa,GAAG,mBAAmB,CAAC;IAC3C,MAAM,CAAC,YAAY,GAAG,2BAA2B,CAAC;IAElD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -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"}
|