av6-core 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -83
- package/dist/index.d.ts +1 -83
- package/dist/index.js +7 -160
- package/dist/index.mjs +7 -157
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -268,88 +268,6 @@ declare const getPattern: {
|
|
|
268
268
|
};
|
|
269
269
|
declare const interpolate: (template: string, vars: Record<string, unknown>) => string;
|
|
270
270
|
|
|
271
|
-
type DiscountMode = "PERCENTAGE" | "AMOUNT";
|
|
272
|
-
type AdditionalDiscountMode = "PERCENTAGE" | "AMOUNT";
|
|
273
|
-
type CoPayType = "PERCENTAGE" | "AMOUNT";
|
|
274
|
-
type TaxMethod = "NONE" | "INCLUSIVE" | "EXCLUSIVE";
|
|
275
|
-
type CoPayMode = "EXCLUSIVE-INCLUSIVE" | "PERCENTAGE-AMOUNT";
|
|
276
|
-
declare const RoundFormat: {
|
|
277
|
-
readonly ROUND: "ROUND";
|
|
278
|
-
readonly SPECIAL_ROUND: "SPECIAL_ROUND";
|
|
279
|
-
readonly TO_FIXED: "TO_FIXED";
|
|
280
|
-
readonly CEIL: "CEIL";
|
|
281
|
-
readonly FLOOR: "FLOOR";
|
|
282
|
-
readonly TRUNC: "TRUNC";
|
|
283
|
-
readonly NONE: "NONE";
|
|
284
|
-
};
|
|
285
|
-
type RoundFormat = (typeof RoundFormat)[keyof typeof RoundFormat];
|
|
286
|
-
interface ChildCalcInput {
|
|
287
|
-
qty: number;
|
|
288
|
-
rate: number;
|
|
289
|
-
otherCharge?: number;
|
|
290
|
-
addonPercentage?: number;
|
|
291
|
-
discountMode?: DiscountMode;
|
|
292
|
-
discountValue?: number;
|
|
293
|
-
taxMethod?: TaxMethod;
|
|
294
|
-
taxValue?: number;
|
|
295
|
-
/** Absolute insurer-covered at line level */
|
|
296
|
-
coPaymentType?: CoPayType;
|
|
297
|
-
coPayValue?: number;
|
|
298
|
-
coPayMethod?: "EXCLUSIVE" | "INCLUSIVE";
|
|
299
|
-
}
|
|
300
|
-
interface MasterAdditionalDiscount {
|
|
301
|
-
mode: AdditionalDiscountMode;
|
|
302
|
-
value: number;
|
|
303
|
-
coPayMode?: CoPayMode;
|
|
304
|
-
}
|
|
305
|
-
interface CalcOptions {
|
|
306
|
-
calculationMethod?: "STEP_WISE" | "FINAL_ONLY";
|
|
307
|
-
lineRound?: RoundFormat;
|
|
308
|
-
headerRound?: RoundFormat;
|
|
309
|
-
precision?: number;
|
|
310
|
-
}
|
|
311
|
-
interface ChildCalculated {
|
|
312
|
-
baseRate: number;
|
|
313
|
-
subtotalAmount: number;
|
|
314
|
-
otherChargeAmount: number;
|
|
315
|
-
discountMode: DiscountMode;
|
|
316
|
-
discountValue: number;
|
|
317
|
-
discountAmount: number;
|
|
318
|
-
taxMethod: TaxMethod;
|
|
319
|
-
taxValue: number;
|
|
320
|
-
taxAmount: number;
|
|
321
|
-
grossAmount: number;
|
|
322
|
-
netAmount: number;
|
|
323
|
-
roundOffAmount: number;
|
|
324
|
-
copayAmount: number;
|
|
325
|
-
}
|
|
326
|
-
interface MasterCalculated {
|
|
327
|
-
additionalDiscountMode: AdditionalDiscountMode;
|
|
328
|
-
additionalDiscountValue: number;
|
|
329
|
-
subtotalAmount: number;
|
|
330
|
-
otherChargeAmount: number;
|
|
331
|
-
discountTotalAmount: number;
|
|
332
|
-
taxAmount: number;
|
|
333
|
-
grossAmount: number;
|
|
334
|
-
netAmount: number;
|
|
335
|
-
roundOffAmount: number;
|
|
336
|
-
copayAmount: number;
|
|
337
|
-
}
|
|
338
|
-
interface BillingCalcResult {
|
|
339
|
-
master: MasterCalculated;
|
|
340
|
-
children: ChildCalculated[];
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* calculateBillingFromChildren (master-level additional discount applied AFTER child calculations)
|
|
345
|
-
* - Child: item discount -> tax (INCLUSIVE/EXCLUSIVE/NONE) -> coPay -> patient line net + line rounding
|
|
346
|
-
* - Master: sum children, compute patientRawTotal = gross - Σcopay
|
|
347
|
-
* apply master additional discount ON patientRawTotal (no propagation to children)
|
|
348
|
-
* then header rounding
|
|
349
|
-
*/
|
|
350
|
-
declare function calculateBillingFromChildren(inputs: ChildCalcInput[], masterExtra: MasterAdditionalDiscount, options?: CalcOptions): BillingCalcResult;
|
|
351
|
-
declare function calculateSingleChild(it: ChildCalcInput, coPayMode: CoPayMode, options?: CalcOptions): ChildCalculated;
|
|
352
|
-
|
|
353
271
|
interface CreateTransaction {
|
|
354
272
|
field: string;
|
|
355
273
|
changedFrom?: string | null;
|
|
@@ -469,4 +387,4 @@ declare class NotificationEmitter {
|
|
|
469
387
|
notifyNow(eventName: string, body: Omit<EmitPayload, "eventName">): Promise<void>;
|
|
470
388
|
}
|
|
471
389
|
|
|
472
|
-
export { type
|
|
390
|
+
export { type CacheAdapter, type CalculationRes, type ColValue, type CommonExcelRequest, type CommonFilterRequest, type CommonServiceResponse, type Config, type Context, type CreateUINConfigRequest, type DataType, type DeleteParams, type DeleteRequestRepository, type Deps, type DropdownRequest, type DropdownRequestService, type DynamicShortCode, type EmitPayload, type ExcelConfig, type ExportExcel, type ExportExcelRequestService, type FetchRequest, type FetchRequestRepository, type FixedSearchRequest, type FixedSearchRequestService, type Helpers, type ImportExcel, type ImportExcelRequestService, type Mapper, type NewFixedSearchRequest, type NewFixedSearchRequestService, type NewSearchRequest, NotificationEmitter, type PaginatedResponse, type Recipient, type SearchRequest, type SearchRequestService, type ServiceCacheAdapter, type Store, type ToggleActive, type UINConfigDTO, type UINPreviewRequest, type UINSegment, type UINSegmentType, type UIN_RESET_POLICY, type UinDeps, type UpdateStatusRequestRepository, type UpdateUINConfigRequest, type ValidationErrorItem, commonService, customOmit, findDifferences, getDynamicValue, getPattern, interpolate, objectTo2DArray, toNumberOrNull, toUINConfigDTO, uinConfigService, type updateStatusParams };
|
package/dist/index.d.ts
CHANGED
|
@@ -268,88 +268,6 @@ declare const getPattern: {
|
|
|
268
268
|
};
|
|
269
269
|
declare const interpolate: (template: string, vars: Record<string, unknown>) => string;
|
|
270
270
|
|
|
271
|
-
type DiscountMode = "PERCENTAGE" | "AMOUNT";
|
|
272
|
-
type AdditionalDiscountMode = "PERCENTAGE" | "AMOUNT";
|
|
273
|
-
type CoPayType = "PERCENTAGE" | "AMOUNT";
|
|
274
|
-
type TaxMethod = "NONE" | "INCLUSIVE" | "EXCLUSIVE";
|
|
275
|
-
type CoPayMode = "EXCLUSIVE-INCLUSIVE" | "PERCENTAGE-AMOUNT";
|
|
276
|
-
declare const RoundFormat: {
|
|
277
|
-
readonly ROUND: "ROUND";
|
|
278
|
-
readonly SPECIAL_ROUND: "SPECIAL_ROUND";
|
|
279
|
-
readonly TO_FIXED: "TO_FIXED";
|
|
280
|
-
readonly CEIL: "CEIL";
|
|
281
|
-
readonly FLOOR: "FLOOR";
|
|
282
|
-
readonly TRUNC: "TRUNC";
|
|
283
|
-
readonly NONE: "NONE";
|
|
284
|
-
};
|
|
285
|
-
type RoundFormat = (typeof RoundFormat)[keyof typeof RoundFormat];
|
|
286
|
-
interface ChildCalcInput {
|
|
287
|
-
qty: number;
|
|
288
|
-
rate: number;
|
|
289
|
-
otherCharge?: number;
|
|
290
|
-
addonPercentage?: number;
|
|
291
|
-
discountMode?: DiscountMode;
|
|
292
|
-
discountValue?: number;
|
|
293
|
-
taxMethod?: TaxMethod;
|
|
294
|
-
taxValue?: number;
|
|
295
|
-
/** Absolute insurer-covered at line level */
|
|
296
|
-
coPaymentType?: CoPayType;
|
|
297
|
-
coPayValue?: number;
|
|
298
|
-
coPayMethod?: "EXCLUSIVE" | "INCLUSIVE";
|
|
299
|
-
}
|
|
300
|
-
interface MasterAdditionalDiscount {
|
|
301
|
-
mode: AdditionalDiscountMode;
|
|
302
|
-
value: number;
|
|
303
|
-
coPayMode?: CoPayMode;
|
|
304
|
-
}
|
|
305
|
-
interface CalcOptions {
|
|
306
|
-
calculationMethod?: "STEP_WISE" | "FINAL_ONLY";
|
|
307
|
-
lineRound?: RoundFormat;
|
|
308
|
-
headerRound?: RoundFormat;
|
|
309
|
-
precision?: number;
|
|
310
|
-
}
|
|
311
|
-
interface ChildCalculated {
|
|
312
|
-
baseRate: number;
|
|
313
|
-
subtotalAmount: number;
|
|
314
|
-
otherChargeAmount: number;
|
|
315
|
-
discountMode: DiscountMode;
|
|
316
|
-
discountValue: number;
|
|
317
|
-
discountAmount: number;
|
|
318
|
-
taxMethod: TaxMethod;
|
|
319
|
-
taxValue: number;
|
|
320
|
-
taxAmount: number;
|
|
321
|
-
grossAmount: number;
|
|
322
|
-
netAmount: number;
|
|
323
|
-
roundOffAmount: number;
|
|
324
|
-
copayAmount: number;
|
|
325
|
-
}
|
|
326
|
-
interface MasterCalculated {
|
|
327
|
-
additionalDiscountMode: AdditionalDiscountMode;
|
|
328
|
-
additionalDiscountValue: number;
|
|
329
|
-
subtotalAmount: number;
|
|
330
|
-
otherChargeAmount: number;
|
|
331
|
-
discountTotalAmount: number;
|
|
332
|
-
taxAmount: number;
|
|
333
|
-
grossAmount: number;
|
|
334
|
-
netAmount: number;
|
|
335
|
-
roundOffAmount: number;
|
|
336
|
-
copayAmount: number;
|
|
337
|
-
}
|
|
338
|
-
interface BillingCalcResult {
|
|
339
|
-
master: MasterCalculated;
|
|
340
|
-
children: ChildCalculated[];
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* calculateBillingFromChildren (master-level additional discount applied AFTER child calculations)
|
|
345
|
-
* - Child: item discount -> tax (INCLUSIVE/EXCLUSIVE/NONE) -> coPay -> patient line net + line rounding
|
|
346
|
-
* - Master: sum children, compute patientRawTotal = gross - Σcopay
|
|
347
|
-
* apply master additional discount ON patientRawTotal (no propagation to children)
|
|
348
|
-
* then header rounding
|
|
349
|
-
*/
|
|
350
|
-
declare function calculateBillingFromChildren(inputs: ChildCalcInput[], masterExtra: MasterAdditionalDiscount, options?: CalcOptions): BillingCalcResult;
|
|
351
|
-
declare function calculateSingleChild(it: ChildCalcInput, coPayMode: CoPayMode, options?: CalcOptions): ChildCalculated;
|
|
352
|
-
|
|
353
271
|
interface CreateTransaction {
|
|
354
272
|
field: string;
|
|
355
273
|
changedFrom?: string | null;
|
|
@@ -469,4 +387,4 @@ declare class NotificationEmitter {
|
|
|
469
387
|
notifyNow(eventName: string, body: Omit<EmitPayload, "eventName">): Promise<void>;
|
|
470
388
|
}
|
|
471
389
|
|
|
472
|
-
export { type
|
|
390
|
+
export { type CacheAdapter, type CalculationRes, type ColValue, type CommonExcelRequest, type CommonFilterRequest, type CommonServiceResponse, type Config, type Context, type CreateUINConfigRequest, type DataType, type DeleteParams, type DeleteRequestRepository, type Deps, type DropdownRequest, type DropdownRequestService, type DynamicShortCode, type EmitPayload, type ExcelConfig, type ExportExcel, type ExportExcelRequestService, type FetchRequest, type FetchRequestRepository, type FixedSearchRequest, type FixedSearchRequestService, type Helpers, type ImportExcel, type ImportExcelRequestService, type Mapper, type NewFixedSearchRequest, type NewFixedSearchRequestService, type NewSearchRequest, NotificationEmitter, type PaginatedResponse, type Recipient, type SearchRequest, type SearchRequestService, type ServiceCacheAdapter, type Store, type ToggleActive, type UINConfigDTO, type UINPreviewRequest, type UINSegment, type UINSegmentType, type UIN_RESET_POLICY, type UinDeps, type UpdateStatusRequestRepository, type UpdateUINConfigRequest, type ValidationErrorItem, commonService, customOmit, findDifferences, getDynamicValue, getPattern, interpolate, objectTo2DArray, toNumberOrNull, toUINConfigDTO, uinConfigService, type updateStatusParams };
|
package/dist/index.js
CHANGED
|
@@ -31,9 +31,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
33
|
NotificationEmitter: () => NotificationEmitter,
|
|
34
|
-
RoundFormat: () => RoundFormat,
|
|
35
|
-
calculateBillingFromChildren: () => calculateBillingFromChildren,
|
|
36
|
-
calculateSingleChild: () => calculateSingleChild,
|
|
37
34
|
commonService: () => commonService,
|
|
38
35
|
customOmit: () => customOmit,
|
|
39
36
|
findDifferences: () => findDifferences,
|
|
@@ -1017,13 +1014,16 @@ var commonService = (serviceDeps) => {
|
|
|
1017
1014
|
throw new ErrorHandler(404, generateErrorMessage("NOT_FOUND", `${shortCodeData.tableName}`));
|
|
1018
1015
|
}
|
|
1019
1016
|
if (shortCodeData.isDTO && dtoMapping[shortCodeData.shortCode]) {
|
|
1020
|
-
let
|
|
1017
|
+
let dtoResult;
|
|
1021
1018
|
if (shortCodeData.isSingleDto === void 0 || shortCodeData.isSingleDto === true) {
|
|
1022
|
-
|
|
1019
|
+
dtoResult = await dtoMapping[shortCodeData.shortCode](commonData);
|
|
1023
1020
|
} else {
|
|
1024
|
-
|
|
1021
|
+
dtoResult = (await dtoMapping[shortCodeData.shortCode]([commonData]))?.[0];
|
|
1025
1022
|
}
|
|
1026
|
-
|
|
1023
|
+
if (!dtoResult) {
|
|
1024
|
+
throw new ErrorHandler(404, generateErrorMessage("NOT_FOUND", `${shortCodeData.tableName}`));
|
|
1025
|
+
}
|
|
1026
|
+
return dtoResult;
|
|
1027
1027
|
}
|
|
1028
1028
|
logger.info("exiting::fetch::service");
|
|
1029
1029
|
return commonData;
|
|
@@ -1118,156 +1118,6 @@ var commonService = (serviceDeps) => {
|
|
|
1118
1118
|
};
|
|
1119
1119
|
};
|
|
1120
1120
|
|
|
1121
|
-
// src/types/calculation.ts
|
|
1122
|
-
var RoundFormat = {
|
|
1123
|
-
ROUND: "ROUND",
|
|
1124
|
-
SPECIAL_ROUND: "SPECIAL_ROUND",
|
|
1125
|
-
TO_FIXED: "TO_FIXED",
|
|
1126
|
-
CEIL: "CEIL",
|
|
1127
|
-
FLOOR: "FLOOR",
|
|
1128
|
-
TRUNC: "TRUNC",
|
|
1129
|
-
NONE: "NONE"
|
|
1130
|
-
};
|
|
1131
|
-
|
|
1132
|
-
// src/utils/calculation.utils.ts
|
|
1133
|
-
function applyRound(value, format, precision = 2) {
|
|
1134
|
-
switch (format) {
|
|
1135
|
-
case RoundFormat.NONE:
|
|
1136
|
-
return value;
|
|
1137
|
-
case RoundFormat.ROUND:
|
|
1138
|
-
return Math.round(value);
|
|
1139
|
-
case RoundFormat.SPECIAL_ROUND:
|
|
1140
|
-
return value < 1 ? Math.ceil(value) : Math.round(value);
|
|
1141
|
-
case RoundFormat.CEIL:
|
|
1142
|
-
return Math.ceil(value);
|
|
1143
|
-
case RoundFormat.FLOOR:
|
|
1144
|
-
return Math.floor(value);
|
|
1145
|
-
case RoundFormat.TRUNC:
|
|
1146
|
-
return Math.trunc(value);
|
|
1147
|
-
case RoundFormat.TO_FIXED:
|
|
1148
|
-
default:
|
|
1149
|
-
return Number(value.toFixed(Math.max(0, precision | 0)));
|
|
1150
|
-
}
|
|
1151
|
-
}
|
|
1152
|
-
var maybeStep = (v, stepwise, fmt, p) => stepwise ? applyRound(v, fmt, p) : v;
|
|
1153
|
-
function clamp(n, min, max) {
|
|
1154
|
-
return Math.max(min, Math.min(max, n));
|
|
1155
|
-
}
|
|
1156
|
-
var percentage = (amount, percentage2) => {
|
|
1157
|
-
return amount * percentage2 / 100;
|
|
1158
|
-
};
|
|
1159
|
-
function calculateBillingFromChildren(inputs, masterExtra, options = {}) {
|
|
1160
|
-
const stepwise = options.calculationMethod === "STEP_WISE";
|
|
1161
|
-
const lineFmt = options.lineRound ?? RoundFormat.TO_FIXED;
|
|
1162
|
-
const headFmt = options.headerRound ?? lineFmt;
|
|
1163
|
-
const precision = options.precision ?? 2;
|
|
1164
|
-
const children = inputs.map((it) => {
|
|
1165
|
-
return calculateSingleChild(it, masterExtra.coPayMode ?? "PERCENTAGE-AMOUNT", options);
|
|
1166
|
-
});
|
|
1167
|
-
const subtotalAmount = children.reduce((a, c) => a + c.subtotalAmount, 0);
|
|
1168
|
-
const otherChargeAmount = children.reduce((a, c) => a + c.otherChargeAmount, 0);
|
|
1169
|
-
const itemDiscountSum = children.reduce((a, c) => a + c.discountAmount, 0);
|
|
1170
|
-
const taxAmount = children.reduce((a, c) => a + c.taxAmount, 0);
|
|
1171
|
-
const grossAmount = children.reduce((a, c) => a + c.grossAmount, 0);
|
|
1172
|
-
const copayAmount = children.reduce((a, c) => a + c.copayAmount, 0);
|
|
1173
|
-
const patientRawTotal = grossAmount - copayAmount;
|
|
1174
|
-
let masterExtraApplied = 0;
|
|
1175
|
-
if (masterExtra.mode === "PERCENTAGE") {
|
|
1176
|
-
masterExtraApplied = percentage(patientRawTotal, masterExtra.value);
|
|
1177
|
-
} else if (masterExtra.mode === "AMOUNT") {
|
|
1178
|
-
masterExtraApplied = Math.min(masterExtra.value, patientRawTotal);
|
|
1179
|
-
}
|
|
1180
|
-
masterExtraApplied = maybeStep(masterExtraApplied, stepwise, headFmt, precision);
|
|
1181
|
-
const discountTotalAmount = maybeStep(itemDiscountSum + masterExtraApplied, stepwise, headFmt, precision);
|
|
1182
|
-
const patientAfterExtra = applyRound(Math.max(0, patientRawTotal - masterExtraApplied), "TO_FIXED", 2);
|
|
1183
|
-
const netAmount = applyRound(patientAfterExtra, headFmt, precision);
|
|
1184
|
-
const roundOffAmount = netAmount - patientAfterExtra;
|
|
1185
|
-
const master = {
|
|
1186
|
-
additionalDiscountMode: masterExtra.mode,
|
|
1187
|
-
additionalDiscountValue: masterExtra.value,
|
|
1188
|
-
subtotalAmount: applyRound(subtotalAmount, headFmt, precision),
|
|
1189
|
-
otherChargeAmount: applyRound(otherChargeAmount, headFmt, precision),
|
|
1190
|
-
discountTotalAmount: applyRound(discountTotalAmount, headFmt, precision),
|
|
1191
|
-
// includes master extra
|
|
1192
|
-
taxAmount: applyRound(taxAmount, headFmt, precision),
|
|
1193
|
-
grossAmount: applyRound(grossAmount, headFmt, precision),
|
|
1194
|
-
netAmount,
|
|
1195
|
-
// patient payable after master extra + rounding
|
|
1196
|
-
roundOffAmount: applyRound(roundOffAmount, "TO_FIXED", 2),
|
|
1197
|
-
// rounded - raw
|
|
1198
|
-
copayAmount: applyRound(copayAmount, headFmt, precision)
|
|
1199
|
-
// Σ line copay (insurer covered)
|
|
1200
|
-
};
|
|
1201
|
-
return { master, children };
|
|
1202
|
-
}
|
|
1203
|
-
function calculateSingleChild(it, coPayMode, options = {}) {
|
|
1204
|
-
const stepwise = options.calculationMethod === "STEP_WISE";
|
|
1205
|
-
const lineFmt = options.lineRound ?? RoundFormat.TO_FIXED;
|
|
1206
|
-
const precision = options.precision ?? 2;
|
|
1207
|
-
let baseRate = it.rate;
|
|
1208
|
-
if (it.addonPercentage) {
|
|
1209
|
-
baseRate = baseRate + percentage(baseRate, it.addonPercentage);
|
|
1210
|
-
baseRate = applyRound(baseRate, lineFmt, precision);
|
|
1211
|
-
}
|
|
1212
|
-
const subtotal = applyRound(it.qty * baseRate, lineFmt, precision);
|
|
1213
|
-
const other = applyRound(it.otherCharge ?? 0, lineFmt, precision);
|
|
1214
|
-
const basePreTax = applyRound(subtotal + other, lineFmt, precision);
|
|
1215
|
-
let copayAmount = 0;
|
|
1216
|
-
if (coPayMode === "PERCENTAGE-AMOUNT") {
|
|
1217
|
-
const copayType = it.coPaymentType ?? "AMOUNT";
|
|
1218
|
-
const copayValue = it.coPayValue ?? 0;
|
|
1219
|
-
copayAmount = copayType === "PERCENTAGE" ? percentage(subtotal, copayValue) : Math.min(copayValue, subtotal);
|
|
1220
|
-
}
|
|
1221
|
-
const dMode = it.discountMode ?? "AMOUNT";
|
|
1222
|
-
const dVal = it.discountValue ?? 0;
|
|
1223
|
-
const tMethod = it.taxMethod ?? "NONE";
|
|
1224
|
-
const tVal = Math.max(0, it.taxValue ?? 0);
|
|
1225
|
-
let baseAfterTaxDisc = basePreTax;
|
|
1226
|
-
if (tMethod === "INCLUSIVE") {
|
|
1227
|
-
const inclusiveTaxMultiplier = (100 + tVal) / 100;
|
|
1228
|
-
baseAfterTaxDisc = basePreTax / inclusiveTaxMultiplier;
|
|
1229
|
-
}
|
|
1230
|
-
baseAfterTaxDisc = maybeStep(baseAfterTaxDisc, stepwise, lineFmt, precision);
|
|
1231
|
-
const inclDiff = applyRound(basePreTax - baseAfterTaxDisc, lineFmt, precision);
|
|
1232
|
-
let discountValue = 0;
|
|
1233
|
-
if (dMode === "AMOUNT") {
|
|
1234
|
-
discountValue = dVal;
|
|
1235
|
-
} else if (dMode === "PERCENTAGE") {
|
|
1236
|
-
discountValue = percentage(baseAfterTaxDisc, dVal);
|
|
1237
|
-
}
|
|
1238
|
-
discountValue = maybeStep(discountValue, stepwise, lineFmt, precision);
|
|
1239
|
-
let afterDisc = Math.max(0, baseAfterTaxDisc - discountValue);
|
|
1240
|
-
afterDisc = maybeStep(afterDisc, stepwise, lineFmt, precision);
|
|
1241
|
-
let calculatedTax = percentage(afterDisc, tVal);
|
|
1242
|
-
calculatedTax = maybeStep(calculatedTax, stepwise, lineFmt, precision);
|
|
1243
|
-
let grossAmount = afterDisc + calculatedTax;
|
|
1244
|
-
grossAmount = maybeStep(grossAmount, stepwise, lineFmt, precision);
|
|
1245
|
-
if (coPayMode === "EXCLUSIVE-INCLUSIVE" && it.coPayMethod === "INCLUSIVE") {
|
|
1246
|
-
copayAmount = grossAmount;
|
|
1247
|
-
}
|
|
1248
|
-
copayAmount = applyRound(copayAmount, lineFmt, precision);
|
|
1249
|
-
const copay = clamp(Math.max(0, copayAmount), 0, grossAmount);
|
|
1250
|
-
const patientRaw = applyRound(grossAmount - copay, RoundFormat.TO_FIXED, 2);
|
|
1251
|
-
const patientRounded = applyRound(patientRaw, lineFmt, precision);
|
|
1252
|
-
const lineRoundOff = applyRound(patientRounded - patientRaw, RoundFormat.TO_FIXED, 2);
|
|
1253
|
-
return {
|
|
1254
|
-
// include baseRate if your ChildCalculated type has it (as in your bulk function)
|
|
1255
|
-
baseRate: applyRound(baseRate, lineFmt, precision),
|
|
1256
|
-
subtotalAmount: applyRound(subtotal + other - inclDiff, lineFmt, precision),
|
|
1257
|
-
otherChargeAmount: other,
|
|
1258
|
-
discountMode: dMode,
|
|
1259
|
-
discountValue: dVal,
|
|
1260
|
-
discountAmount: applyRound(discountValue, lineFmt, precision),
|
|
1261
|
-
taxMethod: tMethod,
|
|
1262
|
-
taxValue: tVal,
|
|
1263
|
-
taxAmount: applyRound(calculatedTax, lineFmt, precision),
|
|
1264
|
-
grossAmount: applyRound(grossAmount, lineFmt, precision),
|
|
1265
|
-
netAmount: patientRounded,
|
|
1266
|
-
roundOffAmount: lineRoundOff,
|
|
1267
|
-
copayAmount: copay
|
|
1268
|
-
};
|
|
1269
|
-
}
|
|
1270
|
-
|
|
1271
1121
|
// src/utils/audit.utils.ts
|
|
1272
1122
|
function isValidDate(value) {
|
|
1273
1123
|
if (value instanceof Date) {
|
|
@@ -2131,9 +1981,6 @@ var NotificationEmitter = class {
|
|
|
2131
1981
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2132
1982
|
0 && (module.exports = {
|
|
2133
1983
|
NotificationEmitter,
|
|
2134
|
-
RoundFormat,
|
|
2135
|
-
calculateBillingFromChildren,
|
|
2136
|
-
calculateSingleChild,
|
|
2137
1984
|
commonService,
|
|
2138
1985
|
customOmit,
|
|
2139
1986
|
findDifferences,
|
package/dist/index.mjs
CHANGED
|
@@ -968,13 +968,16 @@ var commonService = (serviceDeps) => {
|
|
|
968
968
|
throw new ErrorHandler(404, generateErrorMessage("NOT_FOUND", `${shortCodeData.tableName}`));
|
|
969
969
|
}
|
|
970
970
|
if (shortCodeData.isDTO && dtoMapping[shortCodeData.shortCode]) {
|
|
971
|
-
let
|
|
971
|
+
let dtoResult;
|
|
972
972
|
if (shortCodeData.isSingleDto === void 0 || shortCodeData.isSingleDto === true) {
|
|
973
|
-
|
|
973
|
+
dtoResult = await dtoMapping[shortCodeData.shortCode](commonData);
|
|
974
974
|
} else {
|
|
975
|
-
|
|
975
|
+
dtoResult = (await dtoMapping[shortCodeData.shortCode]([commonData]))?.[0];
|
|
976
976
|
}
|
|
977
|
-
|
|
977
|
+
if (!dtoResult) {
|
|
978
|
+
throw new ErrorHandler(404, generateErrorMessage("NOT_FOUND", `${shortCodeData.tableName}`));
|
|
979
|
+
}
|
|
980
|
+
return dtoResult;
|
|
978
981
|
}
|
|
979
982
|
logger.info("exiting::fetch::service");
|
|
980
983
|
return commonData;
|
|
@@ -1069,156 +1072,6 @@ var commonService = (serviceDeps) => {
|
|
|
1069
1072
|
};
|
|
1070
1073
|
};
|
|
1071
1074
|
|
|
1072
|
-
// src/types/calculation.ts
|
|
1073
|
-
var RoundFormat = {
|
|
1074
|
-
ROUND: "ROUND",
|
|
1075
|
-
SPECIAL_ROUND: "SPECIAL_ROUND",
|
|
1076
|
-
TO_FIXED: "TO_FIXED",
|
|
1077
|
-
CEIL: "CEIL",
|
|
1078
|
-
FLOOR: "FLOOR",
|
|
1079
|
-
TRUNC: "TRUNC",
|
|
1080
|
-
NONE: "NONE"
|
|
1081
|
-
};
|
|
1082
|
-
|
|
1083
|
-
// src/utils/calculation.utils.ts
|
|
1084
|
-
function applyRound(value, format, precision = 2) {
|
|
1085
|
-
switch (format) {
|
|
1086
|
-
case RoundFormat.NONE:
|
|
1087
|
-
return value;
|
|
1088
|
-
case RoundFormat.ROUND:
|
|
1089
|
-
return Math.round(value);
|
|
1090
|
-
case RoundFormat.SPECIAL_ROUND:
|
|
1091
|
-
return value < 1 ? Math.ceil(value) : Math.round(value);
|
|
1092
|
-
case RoundFormat.CEIL:
|
|
1093
|
-
return Math.ceil(value);
|
|
1094
|
-
case RoundFormat.FLOOR:
|
|
1095
|
-
return Math.floor(value);
|
|
1096
|
-
case RoundFormat.TRUNC:
|
|
1097
|
-
return Math.trunc(value);
|
|
1098
|
-
case RoundFormat.TO_FIXED:
|
|
1099
|
-
default:
|
|
1100
|
-
return Number(value.toFixed(Math.max(0, precision | 0)));
|
|
1101
|
-
}
|
|
1102
|
-
}
|
|
1103
|
-
var maybeStep = (v, stepwise, fmt, p) => stepwise ? applyRound(v, fmt, p) : v;
|
|
1104
|
-
function clamp(n, min, max) {
|
|
1105
|
-
return Math.max(min, Math.min(max, n));
|
|
1106
|
-
}
|
|
1107
|
-
var percentage = (amount, percentage2) => {
|
|
1108
|
-
return amount * percentage2 / 100;
|
|
1109
|
-
};
|
|
1110
|
-
function calculateBillingFromChildren(inputs, masterExtra, options = {}) {
|
|
1111
|
-
const stepwise = options.calculationMethod === "STEP_WISE";
|
|
1112
|
-
const lineFmt = options.lineRound ?? RoundFormat.TO_FIXED;
|
|
1113
|
-
const headFmt = options.headerRound ?? lineFmt;
|
|
1114
|
-
const precision = options.precision ?? 2;
|
|
1115
|
-
const children = inputs.map((it) => {
|
|
1116
|
-
return calculateSingleChild(it, masterExtra.coPayMode ?? "PERCENTAGE-AMOUNT", options);
|
|
1117
|
-
});
|
|
1118
|
-
const subtotalAmount = children.reduce((a, c) => a + c.subtotalAmount, 0);
|
|
1119
|
-
const otherChargeAmount = children.reduce((a, c) => a + c.otherChargeAmount, 0);
|
|
1120
|
-
const itemDiscountSum = children.reduce((a, c) => a + c.discountAmount, 0);
|
|
1121
|
-
const taxAmount = children.reduce((a, c) => a + c.taxAmount, 0);
|
|
1122
|
-
const grossAmount = children.reduce((a, c) => a + c.grossAmount, 0);
|
|
1123
|
-
const copayAmount = children.reduce((a, c) => a + c.copayAmount, 0);
|
|
1124
|
-
const patientRawTotal = grossAmount - copayAmount;
|
|
1125
|
-
let masterExtraApplied = 0;
|
|
1126
|
-
if (masterExtra.mode === "PERCENTAGE") {
|
|
1127
|
-
masterExtraApplied = percentage(patientRawTotal, masterExtra.value);
|
|
1128
|
-
} else if (masterExtra.mode === "AMOUNT") {
|
|
1129
|
-
masterExtraApplied = Math.min(masterExtra.value, patientRawTotal);
|
|
1130
|
-
}
|
|
1131
|
-
masterExtraApplied = maybeStep(masterExtraApplied, stepwise, headFmt, precision);
|
|
1132
|
-
const discountTotalAmount = maybeStep(itemDiscountSum + masterExtraApplied, stepwise, headFmt, precision);
|
|
1133
|
-
const patientAfterExtra = applyRound(Math.max(0, patientRawTotal - masterExtraApplied), "TO_FIXED", 2);
|
|
1134
|
-
const netAmount = applyRound(patientAfterExtra, headFmt, precision);
|
|
1135
|
-
const roundOffAmount = netAmount - patientAfterExtra;
|
|
1136
|
-
const master = {
|
|
1137
|
-
additionalDiscountMode: masterExtra.mode,
|
|
1138
|
-
additionalDiscountValue: masterExtra.value,
|
|
1139
|
-
subtotalAmount: applyRound(subtotalAmount, headFmt, precision),
|
|
1140
|
-
otherChargeAmount: applyRound(otherChargeAmount, headFmt, precision),
|
|
1141
|
-
discountTotalAmount: applyRound(discountTotalAmount, headFmt, precision),
|
|
1142
|
-
// includes master extra
|
|
1143
|
-
taxAmount: applyRound(taxAmount, headFmt, precision),
|
|
1144
|
-
grossAmount: applyRound(grossAmount, headFmt, precision),
|
|
1145
|
-
netAmount,
|
|
1146
|
-
// patient payable after master extra + rounding
|
|
1147
|
-
roundOffAmount: applyRound(roundOffAmount, "TO_FIXED", 2),
|
|
1148
|
-
// rounded - raw
|
|
1149
|
-
copayAmount: applyRound(copayAmount, headFmt, precision)
|
|
1150
|
-
// Σ line copay (insurer covered)
|
|
1151
|
-
};
|
|
1152
|
-
return { master, children };
|
|
1153
|
-
}
|
|
1154
|
-
function calculateSingleChild(it, coPayMode, options = {}) {
|
|
1155
|
-
const stepwise = options.calculationMethod === "STEP_WISE";
|
|
1156
|
-
const lineFmt = options.lineRound ?? RoundFormat.TO_FIXED;
|
|
1157
|
-
const precision = options.precision ?? 2;
|
|
1158
|
-
let baseRate = it.rate;
|
|
1159
|
-
if (it.addonPercentage) {
|
|
1160
|
-
baseRate = baseRate + percentage(baseRate, it.addonPercentage);
|
|
1161
|
-
baseRate = applyRound(baseRate, lineFmt, precision);
|
|
1162
|
-
}
|
|
1163
|
-
const subtotal = applyRound(it.qty * baseRate, lineFmt, precision);
|
|
1164
|
-
const other = applyRound(it.otherCharge ?? 0, lineFmt, precision);
|
|
1165
|
-
const basePreTax = applyRound(subtotal + other, lineFmt, precision);
|
|
1166
|
-
let copayAmount = 0;
|
|
1167
|
-
if (coPayMode === "PERCENTAGE-AMOUNT") {
|
|
1168
|
-
const copayType = it.coPaymentType ?? "AMOUNT";
|
|
1169
|
-
const copayValue = it.coPayValue ?? 0;
|
|
1170
|
-
copayAmount = copayType === "PERCENTAGE" ? percentage(subtotal, copayValue) : Math.min(copayValue, subtotal);
|
|
1171
|
-
}
|
|
1172
|
-
const dMode = it.discountMode ?? "AMOUNT";
|
|
1173
|
-
const dVal = it.discountValue ?? 0;
|
|
1174
|
-
const tMethod = it.taxMethod ?? "NONE";
|
|
1175
|
-
const tVal = Math.max(0, it.taxValue ?? 0);
|
|
1176
|
-
let baseAfterTaxDisc = basePreTax;
|
|
1177
|
-
if (tMethod === "INCLUSIVE") {
|
|
1178
|
-
const inclusiveTaxMultiplier = (100 + tVal) / 100;
|
|
1179
|
-
baseAfterTaxDisc = basePreTax / inclusiveTaxMultiplier;
|
|
1180
|
-
}
|
|
1181
|
-
baseAfterTaxDisc = maybeStep(baseAfterTaxDisc, stepwise, lineFmt, precision);
|
|
1182
|
-
const inclDiff = applyRound(basePreTax - baseAfterTaxDisc, lineFmt, precision);
|
|
1183
|
-
let discountValue = 0;
|
|
1184
|
-
if (dMode === "AMOUNT") {
|
|
1185
|
-
discountValue = dVal;
|
|
1186
|
-
} else if (dMode === "PERCENTAGE") {
|
|
1187
|
-
discountValue = percentage(baseAfterTaxDisc, dVal);
|
|
1188
|
-
}
|
|
1189
|
-
discountValue = maybeStep(discountValue, stepwise, lineFmt, precision);
|
|
1190
|
-
let afterDisc = Math.max(0, baseAfterTaxDisc - discountValue);
|
|
1191
|
-
afterDisc = maybeStep(afterDisc, stepwise, lineFmt, precision);
|
|
1192
|
-
let calculatedTax = percentage(afterDisc, tVal);
|
|
1193
|
-
calculatedTax = maybeStep(calculatedTax, stepwise, lineFmt, precision);
|
|
1194
|
-
let grossAmount = afterDisc + calculatedTax;
|
|
1195
|
-
grossAmount = maybeStep(grossAmount, stepwise, lineFmt, precision);
|
|
1196
|
-
if (coPayMode === "EXCLUSIVE-INCLUSIVE" && it.coPayMethod === "INCLUSIVE") {
|
|
1197
|
-
copayAmount = grossAmount;
|
|
1198
|
-
}
|
|
1199
|
-
copayAmount = applyRound(copayAmount, lineFmt, precision);
|
|
1200
|
-
const copay = clamp(Math.max(0, copayAmount), 0, grossAmount);
|
|
1201
|
-
const patientRaw = applyRound(grossAmount - copay, RoundFormat.TO_FIXED, 2);
|
|
1202
|
-
const patientRounded = applyRound(patientRaw, lineFmt, precision);
|
|
1203
|
-
const lineRoundOff = applyRound(patientRounded - patientRaw, RoundFormat.TO_FIXED, 2);
|
|
1204
|
-
return {
|
|
1205
|
-
// include baseRate if your ChildCalculated type has it (as in your bulk function)
|
|
1206
|
-
baseRate: applyRound(baseRate, lineFmt, precision),
|
|
1207
|
-
subtotalAmount: applyRound(subtotal + other - inclDiff, lineFmt, precision),
|
|
1208
|
-
otherChargeAmount: other,
|
|
1209
|
-
discountMode: dMode,
|
|
1210
|
-
discountValue: dVal,
|
|
1211
|
-
discountAmount: applyRound(discountValue, lineFmt, precision),
|
|
1212
|
-
taxMethod: tMethod,
|
|
1213
|
-
taxValue: tVal,
|
|
1214
|
-
taxAmount: applyRound(calculatedTax, lineFmt, precision),
|
|
1215
|
-
grossAmount: applyRound(grossAmount, lineFmt, precision),
|
|
1216
|
-
netAmount: patientRounded,
|
|
1217
|
-
roundOffAmount: lineRoundOff,
|
|
1218
|
-
copayAmount: copay
|
|
1219
|
-
};
|
|
1220
|
-
}
|
|
1221
|
-
|
|
1222
1075
|
// src/utils/audit.utils.ts
|
|
1223
1076
|
function isValidDate(value) {
|
|
1224
1077
|
if (value instanceof Date) {
|
|
@@ -2081,9 +1934,6 @@ var NotificationEmitter = class {
|
|
|
2081
1934
|
};
|
|
2082
1935
|
export {
|
|
2083
1936
|
NotificationEmitter,
|
|
2084
|
-
RoundFormat,
|
|
2085
|
-
calculateBillingFromChildren,
|
|
2086
|
-
calculateSingleChild,
|
|
2087
1937
|
commonService,
|
|
2088
1938
|
customOmit,
|
|
2089
1939
|
findDifferences,
|