@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,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateFocPayout = calculateFocPayout;
|
|
4
|
+
const enums_1 = require("../../types/enums");
|
|
5
|
+
const applied_scheme_1 = require("../../types/applied-scheme");
|
|
6
|
+
const calc_type_checks_1 = require("../../helpers/calc-type-checks");
|
|
7
|
+
const constraint_checks_1 = require("../../helpers/constraint-checks");
|
|
8
|
+
const math_1 = require("../../helpers/math");
|
|
9
|
+
const slab_matcher_1 = require("../slab-matcher");
|
|
10
|
+
/**
|
|
11
|
+
* Calculate payout for FOC and FOC_SLAB payout types.
|
|
12
|
+
* Supports: Step, Continuous, StepMultiplier.
|
|
13
|
+
*
|
|
14
|
+
* FOC: focPercent = itemDiscountPercent (the free qty percentage)
|
|
15
|
+
* FOC_SLAB continuous: focPercent = Math.floor(payout × compareValue)
|
|
16
|
+
* FOC continuous: focPercent = slab.payout (or interpolated)
|
|
17
|
+
* FOC StepMultiplier: focPercent = calculateStepMultiplierDiscount(compareValue, slab)
|
|
18
|
+
*/
|
|
19
|
+
function calculateFocPayout(input) {
|
|
20
|
+
const { scheme, compareValue, applicableProducts, isMrpBilling, companyUsesStepfocSchemeInDms = false, applyContinuousSchemeLogic = false, applyStepMultiplierSchemeLogic = false, } = input;
|
|
21
|
+
const isFocSlab = scheme.payoutType === enums_1.SchemePayoutType.FOC_SLAB;
|
|
22
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(scheme.payoutType);
|
|
23
|
+
result.targetMethod = "setFocScheme";
|
|
24
|
+
if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
|
|
25
|
+
result.warnings.push(`Constraint type not matching: ${scheme.constraintType}`);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
|
|
29
|
+
if (slabs.length === 0) {
|
|
30
|
+
result.warnings.push("Slab list is empty");
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
const payoutCalcType = scheme.payoutCalculationType;
|
|
34
|
+
const matcherParams = {
|
|
35
|
+
slabs,
|
|
36
|
+
compareValue,
|
|
37
|
+
applicableProducts,
|
|
38
|
+
payoutType: scheme.payoutType,
|
|
39
|
+
discountOn: scheme.discountOn ?? null,
|
|
40
|
+
};
|
|
41
|
+
// ─── Step ──────────────────────────────────────────────────────
|
|
42
|
+
if ((0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
|
|
43
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
44
|
+
if (!match)
|
|
45
|
+
return result;
|
|
46
|
+
const { slab } = match;
|
|
47
|
+
const stepDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
|
|
48
|
+
const discountAmountTotal = (stepDiscountPercent * slab.constraint) / 100;
|
|
49
|
+
let itemDiscountPercent;
|
|
50
|
+
if (companyUsesStepfocSchemeInDms) {
|
|
51
|
+
itemDiscountPercent = stepDiscountPercent;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const employeeWiseRemainingBudget = scheme.employeeWiseRemainingBudget;
|
|
55
|
+
if ((employeeWiseRemainingBudget || employeeWiseRemainingBudget === 0) &&
|
|
56
|
+
compareValue > employeeWiseRemainingBudget) {
|
|
57
|
+
itemDiscountPercent = ((employeeWiseRemainingBudget || 0) * 100) / (compareValue || 1);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
itemDiscountPercent = ((discountAmountTotal || 0) * 100) / (compareValue || 1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
result.matched = true;
|
|
64
|
+
result.matchedSlabId = slab.id;
|
|
65
|
+
result.focPercent = itemDiscountPercent;
|
|
66
|
+
result.discountPercent = itemDiscountPercent;
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
// ─── Continuous FOC_SLAB ───────────────────────────────────────
|
|
70
|
+
if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType) && isFocSlab) {
|
|
71
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
72
|
+
if (!match)
|
|
73
|
+
return result;
|
|
74
|
+
const { slab } = match;
|
|
75
|
+
const stepDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
|
|
76
|
+
const itemDiscountPercent = Math.floor(stepDiscountPercent * compareValue);
|
|
77
|
+
result.matched = true;
|
|
78
|
+
result.matchedSlabId = slab.id;
|
|
79
|
+
result.focPercent = itemDiscountPercent;
|
|
80
|
+
result.discountPercent = itemDiscountPercent;
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
// ─── Continuous FOC ────────────────────────────────────────────
|
|
84
|
+
if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType)) {
|
|
85
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
86
|
+
if (!match)
|
|
87
|
+
return result;
|
|
88
|
+
const { slab } = match;
|
|
89
|
+
let itemDiscountPercent;
|
|
90
|
+
// Check if continuous FOC interpolation should be applied
|
|
91
|
+
const canInterpolate = applyContinuousSchemeLogic &&
|
|
92
|
+
(0, constraint_checks_1.isValidFocStepMultiplierSchemeLogic)(scheme.category, scheme.constraintType, scheme.payoutIn) &&
|
|
93
|
+
compareValue !== slab.constraint;
|
|
94
|
+
if (canInterpolate) {
|
|
95
|
+
itemDiscountPercent = isMrpBilling
|
|
96
|
+
? slab.mrpPayout
|
|
97
|
+
: (0, math_1.calculatePayoutForFocContinuousScheme)(slab.constraint, slab.payout, compareValue);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
itemDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
|
|
101
|
+
}
|
|
102
|
+
result.matched = true;
|
|
103
|
+
result.matchedSlabId = slab.id;
|
|
104
|
+
result.focPercent = itemDiscountPercent;
|
|
105
|
+
result.discountPercent = itemDiscountPercent;
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
// ─── Step Multiplier ───────────────────────────────────────────
|
|
109
|
+
if ((0, calc_type_checks_1.isPayoutCalcTypeStepMultiplier)(payoutCalcType)) {
|
|
110
|
+
if (!applyStepMultiplierSchemeLogic || !(0, constraint_checks_1.isValidFocStepMultiplierSchemeLogic)(scheme.category, scheme.constraintType, scheme.payoutIn)) {
|
|
111
|
+
result.warnings.push("Step multiplier logic not applicable for this scheme configuration");
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
115
|
+
if (!match)
|
|
116
|
+
return result;
|
|
117
|
+
const { slab } = match;
|
|
118
|
+
const itemDiscountPercent = isMrpBilling
|
|
119
|
+
? slab.mrpPayout
|
|
120
|
+
: (0, math_1.calculateStepMultiplierDiscount)(compareValue, slab);
|
|
121
|
+
result.matched = true;
|
|
122
|
+
result.matchedSlabId = slab.id;
|
|
123
|
+
result.focPercent = itemDiscountPercent;
|
|
124
|
+
result.discountPercent = itemDiscountPercent;
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=foc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foc.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/foc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Scheme } from "../../types/scheme";
|
|
2
|
+
import type { SchemeSlabResult } from "../../types/applied-scheme";
|
|
3
|
+
import type { QualifierItem } from "../../helpers/qualifier-checks";
|
|
4
|
+
export interface MrpPercentageCalculatorInput {
|
|
5
|
+
/** Full scheme configuration. */
|
|
6
|
+
scheme: Scheme;
|
|
7
|
+
/** Precomputed compare value used for slab matching (usually quantity/units). */
|
|
8
|
+
compareValue: number;
|
|
9
|
+
/** Items contributing to qualification for this scheme. */
|
|
10
|
+
applicableProducts: QualifierItem[];
|
|
11
|
+
/** Whether to use MRP billing payout (slab.mrpPayout) instead of PTR payout. */
|
|
12
|
+
isMrpBilling: boolean;
|
|
13
|
+
/** MRP of the SKU used as the base for MRP % discount logic. */
|
|
14
|
+
productMrp: number;
|
|
15
|
+
/** PTR/ex-tax selling unit price used to convert MRP-discounted price into an effective % on PTR. */
|
|
16
|
+
productPtr: number;
|
|
17
|
+
/** Total tax % used to compute ex-tax price when discount is modeled as “subtracted from price”. */
|
|
18
|
+
totalTaxPercentage: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Calculate discount payout for PercentageDiscountOnMRP payout type.
|
|
22
|
+
*
|
|
23
|
+
* Bug 1 fix: Accepts both continuous AND step (previously step was dead code).
|
|
24
|
+
*
|
|
25
|
+
* With ACL=DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE:
|
|
26
|
+
* 1. discountOnMRP = MRP × payout / 100
|
|
27
|
+
* 2. discountedPrice = MRP − discountOnMRP
|
|
28
|
+
* 3. discountedPriceExcTax = discountedPrice / (1 + tax/100)
|
|
29
|
+
* 4. Continuous: finalDiscountValue = (PTR − discountedPriceExcTax) × compareValue
|
|
30
|
+
* 5. Step: finalDiscountValue = (PTR − discountedPriceExcTax) × slab.constraint
|
|
31
|
+
* 6. finalDiscountPercent = finalDiscountValue / (PTR × compareValue) × 100
|
|
32
|
+
*/
|
|
33
|
+
export declare function calculateMrpPercentageDiscountPayout(input: MrpPercentageCalculatorInput): SchemeSlabResult;
|
|
34
|
+
//# sourceMappingURL=mrp-percentage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mrp-percentage.d.ts","sourceRoot":"","sources":["../../../src/calculators/payout-types/mrp-percentage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,4BAA4B;IAC3C,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,gFAAgF;IAChF,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,qGAAqG;IACrG,UAAU,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,4BAA4B,GAClC,gBAAgB,CAiElB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateMrpPercentageDiscountPayout = calculateMrpPercentageDiscountPayout;
|
|
4
|
+
const enums_1 = require("../../types/enums");
|
|
5
|
+
const applied_scheme_1 = require("../../types/applied-scheme");
|
|
6
|
+
const calc_type_checks_1 = require("../../helpers/calc-type-checks");
|
|
7
|
+
const constraint_checks_1 = require("../../helpers/constraint-checks");
|
|
8
|
+
const slab_matcher_1 = require("../slab-matcher");
|
|
9
|
+
/**
|
|
10
|
+
* Calculate discount payout for PercentageDiscountOnMRP payout type.
|
|
11
|
+
*
|
|
12
|
+
* Bug 1 fix: Accepts both continuous AND step (previously step was dead code).
|
|
13
|
+
*
|
|
14
|
+
* With ACL=DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE:
|
|
15
|
+
* 1. discountOnMRP = MRP × payout / 100
|
|
16
|
+
* 2. discountedPrice = MRP − discountOnMRP
|
|
17
|
+
* 3. discountedPriceExcTax = discountedPrice / (1 + tax/100)
|
|
18
|
+
* 4. Continuous: finalDiscountValue = (PTR − discountedPriceExcTax) × compareValue
|
|
19
|
+
* 5. Step: finalDiscountValue = (PTR − discountedPriceExcTax) × slab.constraint
|
|
20
|
+
* 6. finalDiscountPercent = finalDiscountValue / (PTR × compareValue) × 100
|
|
21
|
+
*/
|
|
22
|
+
function calculateMrpPercentageDiscountPayout(input) {
|
|
23
|
+
const { scheme, compareValue, applicableProducts, isMrpBilling, productMrp, productPtr, totalTaxPercentage } = input;
|
|
24
|
+
const result = (0, applied_scheme_1.createEmptySlabResult)(enums_1.SchemePayoutType.PERCENTAGE_DISCOUNT_ON_MRP);
|
|
25
|
+
if (!(0, constraint_checks_1.isValidConstraintType)(scheme.constraintType)) {
|
|
26
|
+
result.warnings.push(`Invalid constraint type: ${scheme.constraintType}`);
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
const slabs = [...scheme.slabs].sort((a, b) => (a.constraint < b.constraint ? 1 : -1));
|
|
30
|
+
if (slabs.length === 0) {
|
|
31
|
+
result.warnings.push("Slab list is empty");
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
const payoutCalcType = scheme.payoutCalculationType;
|
|
35
|
+
// Bug 1 fix: accept both continuous AND step
|
|
36
|
+
if (!(0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType) && !(0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
|
|
37
|
+
result.warnings.push(`No matching calculation type found: ${payoutCalcType}`);
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
const matcherParams = {
|
|
41
|
+
slabs,
|
|
42
|
+
compareValue,
|
|
43
|
+
applicableProducts,
|
|
44
|
+
payoutType: enums_1.SchemePayoutType.PERCENTAGE_DISCOUNT_ON_MRP,
|
|
45
|
+
discountOn: scheme.discountOn ?? null,
|
|
46
|
+
};
|
|
47
|
+
const match = (0, slab_matcher_1.findMatchingSlab)(matcherParams);
|
|
48
|
+
if (!match)
|
|
49
|
+
return result;
|
|
50
|
+
const { slab } = match;
|
|
51
|
+
const itemDiscountPercent = isMrpBilling ? slab.mrpPayout : slab.payout;
|
|
52
|
+
let finalDiscountPercent = itemDiscountPercent;
|
|
53
|
+
if (scheme.additionalCalculationLogic === enums_1.AdditionalCalculationLogic.DISCOUNT_VALUE_SUBTRACTED_FROM_PRICE) {
|
|
54
|
+
const discountOnMRP = (productMrp * itemDiscountPercent) / 100;
|
|
55
|
+
const discountedPrice = productMrp - discountOnMRP;
|
|
56
|
+
const discountedPriceExcTax = Number((discountedPrice / (1 + (totalTaxPercentage ?? 0) / 100)).toFixed(2));
|
|
57
|
+
if ((0, calc_type_checks_1.isPayoutCalcTypeContinuous)(payoutCalcType)) {
|
|
58
|
+
const finalDiscountValue = (productPtr - discountedPriceExcTax) * compareValue;
|
|
59
|
+
const totalPtr = productPtr * compareValue;
|
|
60
|
+
finalDiscountPercent = totalPtr > 0 ? (finalDiscountValue / totalPtr) * 100 : 0;
|
|
61
|
+
}
|
|
62
|
+
else if ((0, calc_type_checks_1.isPayoutCalcTypeStep)(payoutCalcType)) {
|
|
63
|
+
const finalDiscountValue = (productPtr - discountedPriceExcTax) * slab.constraint;
|
|
64
|
+
const totalPtr = productPtr * compareValue;
|
|
65
|
+
finalDiscountPercent = totalPtr > 0 ? (finalDiscountValue / totalPtr) * 100 : 0;
|
|
66
|
+
if (finalDiscountPercent < 0) {
|
|
67
|
+
finalDiscountPercent = 0;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
result.matched = true;
|
|
72
|
+
result.matchedSlabId = slab.id;
|
|
73
|
+
result.discountPercent = finalDiscountPercent;
|
|
74
|
+
result.targetMethod = "setDiscountScheme";
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=mrp-percentage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mrp-percentage.js","sourceRoot":"","sources":["../../../src/calculators/payout-types/mrp-percentage.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":";;AAgCA,0EA8FC;AA5HD,6CAAqD;AACrD,+DAAmE;AACnE,qEAA4E;AAC5E,uEAAwE;AACxE,kDAA2E;AAoB3E;;;;;GAKG;AACH,SAAgB,+BAA+B,CAC7C,KAAgC;IAEhC,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,eAAe,GAAG,CAAC,EACnB,+BAA+B,GAAG,KAAK,GACxC,GAAG,KAAK,CAAC;IACV,MAAM,MAAM,GAAG,IAAA,sCAAqB,EAAC,wBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC1E,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;IAEnC,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,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC;IACpD,MAAM,aAAa,GAAsB;QACvC,KAAK;QACL,YAAY;QACZ,kBAAkB;QAClB,UAAU,EAAE,wBAAgB,CAAC,kBAAkB;QAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;KACtC,CAAC;IAEF,kEAAkE;IAClE,IAAI,IAAA,6CAA0B,EAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,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;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,CAC7D,CAAC;QAEF,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,YAAY,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kEAAkE;IAClE,IAAI,cAAc,EAAE,CAAC;QACnB,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;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;QACvC,MAAM,0BAA0B,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAEnE,MAAM,2BAA2B,GAAG,MAAM,CAAC,2BAA2B,CAAC;QACvE,IAAI,MAAc,CAAC;QACnB,IACE,CAAC,2BAA2B,IAAI,2BAA2B,KAAK,CAAC,CAAC;YAClE,YAAY,GAAG,2BAA2B,EAC1C,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QAEzE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,YAAY,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,0BAA0B,EAAE,CAAC;QAErH,sCAAsC;QACtC,IAAI,+BAA+B,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YAC3D,MAAM,mBAAmB,GAAG,eAAe,GAAG,SAAS,CAAC;YACxD,MAAM,mBAAmB,GAAG,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;YACpF,MAAM,CAAC,eAAe,GAAG,mBAAmB,CAAC;YAC7C,MAAM,CAAC,aAAa,GAAG,mBAAmB,CAAC;YAC3C,MAAM,CAAC,YAAY,GAAG,2BAA2B,CAAC;QACpD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,uCAAuC,cAAc,EAAE,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC;AAChB,CAAC"}
|