formula-parser-payroll 2.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.
Files changed (58) hide show
  1. package/README.md +202 -0
  2. package/dist/database/database-connector.d.ts +60 -0
  3. package/dist/database/database-connector.d.ts.map +1 -0
  4. package/dist/database/database-connector.js +9 -0
  5. package/dist/database/database-connector.js.map +1 -0
  6. package/dist/database/helpers.d.ts +44 -0
  7. package/dist/database/helpers.d.ts.map +1 -0
  8. package/dist/database/helpers.js +120 -0
  9. package/dist/database/helpers.js.map +1 -0
  10. package/dist/database/index.d.ts +11 -0
  11. package/dist/database/index.d.ts.map +1 -0
  12. package/dist/database/index.js +29 -0
  13. package/dist/database/index.js.map +1 -0
  14. package/dist/database/payroll-formula.service.d.ts +118 -0
  15. package/dist/database/payroll-formula.service.d.ts.map +1 -0
  16. package/dist/database/payroll-formula.service.js +794 -0
  17. package/dist/database/payroll-formula.service.js.map +1 -0
  18. package/dist/database/types.d.ts +117 -0
  19. package/dist/database/types.d.ts.map +1 -0
  20. package/dist/database/types.js +9 -0
  21. package/dist/database/types.js.map +1 -0
  22. package/dist/formula-engine.d.ts +18 -0
  23. package/dist/formula-engine.d.ts.map +1 -0
  24. package/dist/formula-engine.js +356 -0
  25. package/dist/formula-engine.js.map +1 -0
  26. package/dist/formula-parser.d.ts +60 -0
  27. package/dist/formula-parser.d.ts.map +1 -0
  28. package/dist/formula-parser.js +366 -0
  29. package/dist/formula-parser.js.map +1 -0
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +44 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/nestjs/database-connector.d.ts +60 -0
  35. package/dist/nestjs/database-connector.d.ts.map +1 -0
  36. package/dist/nestjs/database-connector.js +9 -0
  37. package/dist/nestjs/database-connector.js.map +1 -0
  38. package/dist/nestjs/helpers.d.ts +44 -0
  39. package/dist/nestjs/helpers.d.ts.map +1 -0
  40. package/dist/nestjs/helpers.js +120 -0
  41. package/dist/nestjs/helpers.js.map +1 -0
  42. package/dist/nestjs/index.d.ts +11 -0
  43. package/dist/nestjs/index.d.ts.map +1 -0
  44. package/dist/nestjs/index.js +29 -0
  45. package/dist/nestjs/index.js.map +1 -0
  46. package/dist/nestjs/payroll-formula.service.d.ts +91 -0
  47. package/dist/nestjs/payroll-formula.service.d.ts.map +1 -0
  48. package/dist/nestjs/payroll-formula.service.js +640 -0
  49. package/dist/nestjs/payroll-formula.service.js.map +1 -0
  50. package/dist/nestjs/types.d.ts +117 -0
  51. package/dist/nestjs/types.d.ts.map +1 -0
  52. package/dist/nestjs/types.js +9 -0
  53. package/dist/nestjs/types.js.map +1 -0
  54. package/dist/types.d.ts +168 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +9 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +39 -0
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * NestJS Module Helpers for Payroll Formula Parser
4
+ *
5
+ * Helper functions for database operations and data processing.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.getCurrencyCode = getCurrencyCode;
9
+ exports.decryptValue = decryptValue;
10
+ exports.needsPositionData = needsPositionData;
11
+ exports.needsCostCenterData = needsCostCenterData;
12
+ exports.needsGradeData = needsGradeData;
13
+ exports.needsWorkLocationData = needsWorkLocationData;
14
+ exports.needsCustomFieldData = needsCustomFieldData;
15
+ exports.formatNameForFormula = formatNameForFormula;
16
+ exports.convertAuthToFormulaContext = convertAuthToFormulaContext;
17
+ /**
18
+ * Get currency code based on tax country
19
+ */
20
+ function getCurrencyCode(taxCountry) {
21
+ switch (taxCountry) {
22
+ case 'TH': return 'THB';
23
+ case 'PH': return 'PHP';
24
+ case 'MY': return 'MYR';
25
+ default: return 'IDR';
26
+ }
27
+ }
28
+ /**
29
+ * Decrypt a value using database function
30
+ */
31
+ async function decryptValue(value, auth, empId) {
32
+ try {
33
+ const q = `SELECT SF2356896('${value}',
34
+ '${auth.accessToken.confParse.PNUMBER}',
35
+ '${auth.accessToken.confParse.LNUMBER}',
36
+ '${empId}') AS result`;
37
+ const result = await auth.connFin.query(q);
38
+ if (result.length > 0) {
39
+ return result[0].result;
40
+ }
41
+ return 0;
42
+ }
43
+ catch (error) {
44
+ return 0;
45
+ }
46
+ }
47
+ /**
48
+ * Check if position-related data is needed
49
+ */
50
+ function needsPositionData(words) {
51
+ return words.has('DEPTNAME') ||
52
+ words.has('POSITIONNAME') ||
53
+ words.has('POSITIONCODE') ||
54
+ words.has('DEPTCODE');
55
+ }
56
+ /**
57
+ * Check if cost center data is needed
58
+ */
59
+ function needsCostCenterData(words) {
60
+ return words.has('COSTCENTER') || words.has('COSTCENTERCODE');
61
+ }
62
+ /**
63
+ * Check if grade data is needed
64
+ */
65
+ function needsGradeData(words) {
66
+ return words.has('GRADE') || words.has('GRDCODE');
67
+ }
68
+ /**
69
+ * Check if work location data is needed
70
+ */
71
+ function needsWorkLocationData(words) {
72
+ return words.has('WORKLOCATION') || words.has('WORKLOCATIONCODE');
73
+ }
74
+ /**
75
+ * Check if custom field data is needed
76
+ */
77
+ function needsCustomFieldData(words) {
78
+ for (let i = 1; i <= 10; i++) {
79
+ if (words.has(`CUSTOMFIELD${i}`))
80
+ return true;
81
+ }
82
+ return false;
83
+ }
84
+ /**
85
+ * Format name for formula with proper case handling
86
+ */
87
+ function formatNameForFormula(name, formula) {
88
+ if (!name)
89
+ return '""';
90
+ const upperName = name.replace(/ /g, '').toUpperCase();
91
+ const normalName = name;
92
+ const hasUpperInFormula = formula.includes(`"${upperName}"`) ||
93
+ formula.includes(`'${upperName}'`);
94
+ if (hasUpperInFormula) {
95
+ return `"${upperName}"`;
96
+ }
97
+ return `"${normalName}"`;
98
+ }
99
+ /**
100
+ * Convert legacy AuthContext to new FormulaContext
101
+ * This helps with backward compatibility
102
+ */
103
+ function convertAuthToFormulaContext(auth) {
104
+ return {
105
+ database: {
106
+ mainConnection: auth.conn,
107
+ financeConnection: auth.connFin,
108
+ },
109
+ company: {
110
+ companyId: auth.userData.companyId,
111
+ companyCode: auth.userData.companyCode || auth.userData.currentCompanyCode || '',
112
+ taxCountry: (auth.userData.taxCountry || 'ID'),
113
+ },
114
+ encryption: auth.accessToken?.confParse ? {
115
+ pNumber: auth.accessToken.confParse.PNUMBER,
116
+ lNumber: auth.accessToken.confParse.LNUMBER,
117
+ } : undefined,
118
+ };
119
+ }
120
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/nestjs/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * NestJS Module for Payroll Formula Parser
3
+ *
4
+ * This module provides database-integrated formula parsing.
5
+ * Works with any database client that implements the IDatabaseConnection interface.
6
+ */
7
+ export * from './database-connector';
8
+ export * from './types';
9
+ export * from './helpers';
10
+ export { PayrollFormulaService } from './payroll-formula.service';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nestjs/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * NestJS Module for Payroll Formula Parser
4
+ *
5
+ * This module provides database-integrated formula parsing.
6
+ * Works with any database client that implements the IDatabaseConnection interface.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.PayrollFormulaService = void 0;
24
+ __exportStar(require("./database-connector"), exports);
25
+ __exportStar(require("./types"), exports);
26
+ __exportStar(require("./helpers"), exports);
27
+ var payroll_formula_service_1 = require("./payroll-formula.service");
28
+ Object.defineProperty(exports, "PayrollFormulaService", { enumerable: true, get: function () { return payroll_formula_service_1.PayrollFormulaService; } });
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nestjs/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAEH,uDAAqC;AACrC,0CAAwB;AACxB,4CAA0B;AAC1B,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * NestJS Payroll Formula Parser Service
3
+ *
4
+ * This service provides database-integrated formula parsing.
5
+ * It fetches employee data and component values from the database
6
+ * and then uses the core formula parser.
7
+ */
8
+ import { AuthContext, ParseByEmpIdInput, FormulaParseResultLegacy } from './types';
9
+ /**
10
+ * Payroll Formula Parser Service
11
+ *
12
+ * Use this service when you need to parse formulas with just formula and empId.
13
+ * This service handles fetching employee data and component values from the database.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const service = new PayrollFormulaService();
18
+ * const result = await service.parseByEmpId({
19
+ * formula: 'SALARY * 0.1 + AL_001',
20
+ * empId: 'EMP001',
21
+ * auth: authContext,
22
+ * });
23
+ * console.log(result.result);
24
+ * ```
25
+ */
26
+ export declare class PayrollFormulaService {
27
+ /**
28
+ * Parse formula by employee ID(s)
29
+ * This method fetches all required data from database and evaluates the formula
30
+ *
31
+ * When listEmpId is provided: returns Record<empId, hasil>
32
+ * When empId is provided: returns FormulaParseResultLegacy
33
+ */
34
+ parseByEmpId(input: ParseByEmpIdInput): Promise<FormulaParseResultLegacy | Record<string, number | string | boolean>>;
35
+ /**
36
+ * Check if a formula is valid
37
+ * This ports the logic from payroll-server's formulaValidtyCheck
38
+ */
39
+ formulaValidityCheck(input: {
40
+ formula: string;
41
+ auth: AuthContext;
42
+ }): Promise<{
43
+ result: string;
44
+ }>;
45
+ /**
46
+ * Parse formula for a single employee
47
+ * Internal method used by parseByEmpId
48
+ */
49
+ private parseForSingleEmployee;
50
+ /**
51
+ * Parse formula for multiple employees
52
+ */
53
+ parseForMultipleEmployees(formula: string, empIds: string[], auth: AuthContext): Promise<Record<string, FormulaParseResultLegacy>>;
54
+ /**
55
+ * Get list of component codes
56
+ */
57
+ private getComponentList;
58
+ /**
59
+ * Get all components for company
60
+ */
61
+ private getAllComponents;
62
+ /**
63
+ * Get employee component values
64
+ */
65
+ private getEmployeeComponents;
66
+ /**
67
+ * Get employee data with relations
68
+ */
69
+ private getEmployeeData;
70
+ /**
71
+ * Get reserved words list for formula processing
72
+ */
73
+ private getReservedWords;
74
+ /**
75
+ * Extract required words from formula
76
+ */
77
+ private extractRequiredWordsFromFormula;
78
+ /**
79
+ * Batch load all required data for formula parsing
80
+ */
81
+ private batchLoadFormulaData;
82
+ /**
83
+ * Convert raw employee data to EmployeeData interface
84
+ */
85
+ private convertToEmployeeData;
86
+ /**
87
+ * Convert cache to OrganizationalData interface
88
+ */
89
+ private convertToOrganizationalData;
90
+ }
91
+ //# sourceMappingURL=payroll-formula.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payroll-formula.service.d.ts","sourceRoot":"","sources":["../../src/nestjs/payroll-formula.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EACL,WAAW,EACX,iBAAiB,EAGjB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAYjB;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,qBAAqB;IAEhC;;;;;;OAMG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IA0B3H;;;OAGG;IACG,oBAAoB,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA0KtG;;;OAGG;YACW,sBAAsB;IAgKpC;;OAEG;IACG,yBAAyB,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAYpD;;OAEG;YACW,gBAAgB;IAoB9B;;OAEG;YACW,gBAAgB;IAmB9B;;OAEG;YACW,qBAAqB;IAqBnC;;OAEG;YACW,eAAe;IAkC7B;;OAEG;YACW,gBAAgB;IA0B9B;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAavC;;OAEG;YACW,oBAAoB;IAyHlC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8B7B;;OAEG;IACH,OAAO,CAAC,2BAA2B;CAepC"}