b2m-utils 0.0.310 → 0.0.312

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/build/index.js CHANGED
@@ -191,6 +191,7 @@ exports.FeeEnum = void 0;
191
191
  FeeEnum[FeeEnum["TRT_PERCENTAGE_TOTAL"] = 169] = "TRT_PERCENTAGE_TOTAL";
192
192
  FeeEnum[FeeEnum["TDA_PERCENTAGE_TOTAL"] = 170] = "TDA_PERCENTAGE_TOTAL";
193
193
  FeeEnum[FeeEnum["TDE_PERCENTAGE_TOTAL"] = 171] = "TDE_PERCENTAGE_TOTAL";
194
+ FeeEnum[FeeEnum["APPOINTMENT_BY_INVOICE_QUANTITY"] = 172] = "APPOINTMENT_BY_INVOICE_QUANTITY";
194
195
  })(exports.FeeEnum || (exports.FeeEnum = {}));
195
196
 
196
197
  exports.FreightRegionEnum = void 0;
@@ -255,6 +256,8 @@ exports.RatecardFeeConfigKeyEnum = void 0;
255
256
  (function (RatecardFeeConfigKeyEnum) {
256
257
  // Configurações de fração de peso
257
258
  RatecardFeeConfigKeyEnum["MIN_WEIGHT_FOR_FRACTION"] = "min_weight_for_fraction";
259
+ // Configurações de exclusão de fees
260
+ RatecardFeeConfigKeyEnum["EXCLUDE_FROM_TOTAL_PERCENTAGE"] = "exclude_from_total_percentage";
258
261
  })(exports.RatecardFeeConfigKeyEnum || (exports.RatecardFeeConfigKeyEnum = {}));
259
262
 
260
263
  exports.RatecardFeeConfigTypeEnum = void 0;
@@ -417,6 +420,62 @@ var applyRedeliveryMultiplier = function (total, cte) {
417
420
  };
418
421
  };
419
422
 
423
+ /**
424
+ * Constrói um Map de exclusões de fees baseado nas configurações do tarifário
425
+ * @param ratecard - Tarifário contendo as configurações de fees
426
+ * @returns Map onde a chave é o feeId e o valor é um Set de feeIds excluídos da base de cálculo
427
+ */
428
+ var buildFeeExclusionsMap = function (ratecard) {
429
+ var _a;
430
+ var exclusionsMap = new Map();
431
+ console.log('[buildFeeExclusionsMap] Iniciando construção do mapa de exclusões', {
432
+ ratecardId: ratecard === null || ratecard === void 0 ? void 0 : ratecard.id,
433
+ hasConfigs: !!(ratecard === null || ratecard === void 0 ? void 0 : ratecard.RatecardFeeConfig),
434
+ configsCount: ((_a = ratecard === null || ratecard === void 0 ? void 0 : ratecard.RatecardFeeConfig) === null || _a === void 0 ? void 0 : _a.length) || 0
435
+ });
436
+ if (!(ratecard === null || ratecard === void 0 ? void 0 : ratecard.RatecardFeeConfig)) {
437
+ console.log('[buildFeeExclusionsMap] Nenhuma configuração encontrada, retornando mapa vazio');
438
+ return exclusionsMap;
439
+ }
440
+ // Iterar sobre todas as configurações de fees do ratecard
441
+ ratecard.RatecardFeeConfig.forEach(function (config) {
442
+ var _a, _b;
443
+ // Verificar se é uma configuração de exclusão
444
+ if (((_a = config.feeConfig) === null || _a === void 0 ? void 0 : _a.configKey) === exports.RatecardFeeConfigKeyEnum.EXCLUDE_FROM_TOTAL_PERCENTAGE &&
445
+ config.configValue &&
446
+ config.feeId) {
447
+ console.log('[buildFeeExclusionsMap] Configuração de exclusão encontrada', {
448
+ feeId: config.feeId,
449
+ feeName: (_b = config.fee) === null || _b === void 0 ? void 0 : _b.name,
450
+ configValue: config.configValue
451
+ });
452
+ // Parse dos IDs separados por vírgula
453
+ var excludedIds = config.configValue
454
+ .split(',')
455
+ .map(function (id) { return parseInt(id.trim(), 10); })
456
+ .filter(function (id) { return !isNaN(id); });
457
+ if (excludedIds.length > 0) {
458
+ exclusionsMap.set(config.feeId, new Set(excludedIds));
459
+ console.log('[buildFeeExclusionsMap] Exclusões adicionadas ao mapa', {
460
+ feeId: config.feeId,
461
+ excludedIds: Array.from(excludedIds)
462
+ });
463
+ }
464
+ }
465
+ });
466
+ console.log('[buildFeeExclusionsMap] Mapa de exclusões construído', {
467
+ totalExclusions: exclusionsMap.size,
468
+ exclusionsMap: Array.from(exclusionsMap.entries()).map(function (_a) {
469
+ var feeId = _a[0], excludedIds = _a[1];
470
+ return ({
471
+ feeId: feeId,
472
+ excludedIds: Array.from(excludedIds)
473
+ });
474
+ })
475
+ });
476
+ return exclusionsMap;
477
+ };
478
+
420
479
  /******************************************************************************
421
480
  Copyright (c) Microsoft Corporation.
422
481
 
@@ -993,8 +1052,9 @@ var calculateFee = function (ratecardLaneFee, cte, allFees, debug, allFeesForCal
993
1052
  * para resolver a interdependência entre elas (ex: TRT e GAC)
994
1053
  * @param currentValues - Opcional: Map de feeId -> valor atual (para usar valores já calculados/editados)
995
1054
  * @param manuallyEditedFeeIds - Opcional: Set de feeIds que foram editadas manualmente e não devem ser recalculadas
1055
+ * @param feeExclusions - Opcional: Map de feeId -> Set de feeIds excluídos da base de cálculo
996
1056
  */
997
- var calculateTotalPercentageFees = function (allFees, cte, allFeesForCalc, currentValues, manuallyEditedFeeIds) {
1057
+ var calculateTotalPercentageFees = function (allFees, cte, allFeesForCalc, currentValues, manuallyEditedFeeIds, feeExclusions) {
998
1058
  var results = new Map();
999
1059
  // Separar fees em dois grupos
1000
1060
  // IMPORTANTE: ICMS não deve ser calculado aqui, ele tem tratamento especial no calculateFee
@@ -1055,11 +1115,20 @@ var calculateTotalPercentageFees = function (allFees, cte, allFeesForCalc, curre
1055
1115
  results.set(pf.fee.id, __assign(__assign({}, pf), { totalFee: manualValue, totalToCalc: manualValue, resultFee: "".concat(convertNumberToCurrency(manualValue, 'pt-br'), " (editado manualmente)") }));
1056
1116
  return;
1057
1117
  }
1058
- // Calcular base: fees não-percentuais + outras fees percentuais (exceto ela mesma)
1118
+ // Calcular base: fees não-percentuais + outras fees percentuais (exceto ela mesma e excluídas)
1119
+ var excludedFeeIds = (feeExclusions === null || feeExclusions === void 0 ? void 0 : feeExclusions.get(pf.fee.id)) || new Set();
1120
+ console.log('[calculateTotalPercentageFees] Calculando fee TOTAL_PERCENTAGE', {
1121
+ feeId: pf.fee.id,
1122
+ feeName: pf.fee.name,
1123
+ percentValue: pf.value,
1124
+ hasExclusions: excludedFeeIds.size > 0,
1125
+ excludedFeeIds: Array.from(excludedFeeIds),
1126
+ iteration: iteration
1127
+ });
1059
1128
  var basePercentage = Array.from(previousValues.entries())
1060
1129
  .filter(function (_a) {
1061
1130
  var feeId = _a[0];
1062
- return feeId !== pf.fee.id;
1131
+ return feeId !== pf.fee.id && !excludedFeeIds.has(feeId);
1063
1132
  })
1064
1133
  .reduce(function (sum, _a) {
1065
1134
  var value = _a[1];
@@ -1068,6 +1137,23 @@ var calculateTotalPercentageFees = function (allFees, cte, allFeesForCalc, curre
1068
1137
  var baseValue = baseNonPercentage + basePercentage;
1069
1138
  var percentValue = (+pf.value / 100);
1070
1139
  var calculatedValue = baseValue * percentValue;
1140
+ console.log('[calculateTotalPercentageFees] Base calculada', {
1141
+ feeId: pf.fee.id,
1142
+ feeName: pf.fee.name,
1143
+ baseNonPercentage: baseNonPercentage,
1144
+ basePercentage: basePercentage,
1145
+ baseValue: baseValue,
1146
+ percentValue: "".concat(pf.value, "%"),
1147
+ calculatedValue: calculatedValue,
1148
+ allPreviousValues: Array.from(previousValues.entries()).map(function (_a) {
1149
+ var id = _a[0], val = _a[1];
1150
+ return ({
1151
+ feeId: id,
1152
+ value: val,
1153
+ excluded: excludedFeeIds.has(id)
1154
+ });
1155
+ })
1156
+ });
1071
1157
  previousValues.set(pf.fee.id, calculatedValue);
1072
1158
  // Armazenar resultado
1073
1159
  results.set(pf.fee.id, __assign(__assign({}, pf), { totalFee: calculatedValue, totalToCalc: calculatedValue, resultFee: "".concat(convertNumberToCurrency(baseValue, 'pt-br'), " x ").concat(+pf.value, "% = ").concat(convertNumberToCurrency(calculatedValue, 'pt-br')) }));
@@ -1136,17 +1222,116 @@ var calculateIcms = function (totalFromAllFees, icmsRate) {
1136
1222
  };
1137
1223
  };
1138
1224
 
1225
+ /**
1226
+ * Calcula todas as fees em 3 passadas (normais, TOTAL_PERCENTAGE, ICMS) e retorna um cache detalhado
1227
+ * com totalFee, totalToCalc e resultFee para cada fee.
1228
+ *
1229
+ * Esta função centraliza a lógica de cálculo que estava duplicada em vários lugares do ModalCte.
1230
+ */
1231
+ var calculateFeesCacheWithDetails = function (options) {
1232
+ var fees = options.fees, cte = options.cte, allFeesForCalc = options.allFeesForCalc, _a = options.excludedIndexes, excludedIndexes = _a === void 0 ? new Set() : _a, preCalculatedValues = options.preCalculatedValues, manuallyEditedFeeIds = options.manuallyEditedFeeIds, ratecard = options.ratecard;
1233
+ var cache = {};
1234
+ // Filtrar fees não excluídas
1235
+ var nonExcludedFees = fees.filter(function (_, idx) { return !excludedIndexes.has(idx); });
1236
+ // Obter ratecard se não foi fornecido
1237
+ var ratecardToUse = ratecard || getRatecardFromCte(cte) || undefined;
1238
+ // Construir mapa de exclusões a partir das configurações do ratecard
1239
+ var feeExclusions = buildFeeExclusionsMap(ratecardToUse);
1240
+ // PASSADA 1: Calcular fees normais (não TOTAL_PERCENTAGE, não ICMS)
1241
+ fees.forEach(function (fee, idx) {
1242
+ var _a, _b;
1243
+ if (excludedIndexes.has(idx))
1244
+ return;
1245
+ if (((_a = fee.fee) === null || _a === void 0 ? void 0 : _a.feeCalculationTypeId) !== exports.FeeCalculationTypeEnum.TOTAL_PERCENTAGE &&
1246
+ ((_b = fee.fee) === null || _b === void 0 ? void 0 : _b.id) !== exports.FeeEnum.ICMS) {
1247
+ var calculated = calculateFee(fee, cte, nonExcludedFees, true, allFeesForCalc);
1248
+ if (calculated) {
1249
+ cache[idx] = {
1250
+ totalFee: Number((calculated.totalFee || 0).toFixed(2)),
1251
+ totalToCalc: Number((calculated.totalToCalc || 0).toFixed(2)),
1252
+ resultFee: calculated.resultFee || '',
1253
+ };
1254
+ }
1255
+ }
1256
+ });
1257
+ // PASSADA 2: Calcular TOTAL_PERCENTAGE de forma iterativa com exclusões
1258
+ var percentageFeesCache = calculateTotalPercentageFees(nonExcludedFees, cte, allFeesForCalc, preCalculatedValues, manuallyEditedFeeIds, feeExclusions);
1259
+ fees.forEach(function (fee, idx) {
1260
+ var _a, _b;
1261
+ if (excludedIndexes.has(idx))
1262
+ return;
1263
+ if (((_a = fee.fee) === null || _a === void 0 ? void 0 : _a.feeCalculationTypeId) === exports.FeeCalculationTypeEnum.TOTAL_PERCENTAGE && ((_b = fee.fee) === null || _b === void 0 ? void 0 : _b.id)) {
1264
+ var cachedResult = percentageFeesCache.get(fee.fee.id);
1265
+ if (cachedResult) {
1266
+ cache[idx] = {
1267
+ totalFee: Number((cachedResult.totalFee || 0).toFixed(2)),
1268
+ totalToCalc: Number((cachedResult.totalToCalc || 0).toFixed(2)),
1269
+ resultFee: cachedResult.resultFee || '',
1270
+ };
1271
+ }
1272
+ }
1273
+ });
1274
+ // PASSADA 3: Calcular ICMS
1275
+ fees.forEach(function (fee, idx) {
1276
+ var _a;
1277
+ if (excludedIndexes.has(idx))
1278
+ return;
1279
+ if (((_a = fee.fee) === null || _a === void 0 ? void 0 : _a.id) === exports.FeeEnum.ICMS) {
1280
+ var icmsRate = ((cte === null || cte === void 0 ? void 0 : cte.icmsIncidence) !== undefined && (cte === null || cte === void 0 ? void 0 : cte.icmsIncidence) !== null && !isNaN(+cte.icmsIncidence))
1281
+ ? +(cte.icmsIncidence) / 100
1282
+ : fee.value || 0;
1283
+ var valuesWithoutIcms = Object.entries(cache)
1284
+ .filter(function (_a) {
1285
+ var _b;
1286
+ var key = _a[0];
1287
+ var feeIdx = Number(key);
1288
+ var f = fees[feeIdx];
1289
+ return ((_b = f.fee) === null || _b === void 0 ? void 0 : _b.id) !== exports.FeeEnum.ICMS;
1290
+ })
1291
+ .map(function (_a) {
1292
+ var calcFee = _a[1];
1293
+ return (calcFee === null || calcFee === void 0 ? void 0 : calcFee.totalToCalc) || 0;
1294
+ })
1295
+ .filter(function (val) { return val > 0; });
1296
+ var icmsCalculation = calculateIcms(valuesWithoutIcms, icmsRate);
1297
+ if (icmsCalculation.isValid) {
1298
+ var resultFee = icmsCalculation.totalValueFromAllFees && icmsCalculation.valueToDivide
1299
+ ? "(".concat(icmsCalculation.totalValueFromAllFees.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }), " / ").concat(icmsCalculation.valueToDivide, ") x ").concat(icmsRate, " = ").concat(icmsCalculation.total.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }))
1300
+ : '';
1301
+ cache[idx] = {
1302
+ totalFee: Number(icmsCalculation.total.toFixed(2)),
1303
+ totalToCalc: Number(icmsCalculation.total.toFixed(2)),
1304
+ resultFee: resultFee,
1305
+ };
1306
+ }
1307
+ }
1308
+ });
1309
+ return cache;
1310
+ };
1311
+ /**
1312
+ * Calcula o total de fees usando calculateFeesCacheWithDetails
1313
+ */
1314
+ var calculateFeesTotalFromCache = function (options) {
1315
+ var cache = calculateFeesCacheWithDetails(options);
1316
+ return Object.values(cache).reduce(function (sum, calcFee) { return sum + ((calcFee === null || calcFee === void 0 ? void 0 : calcFee.totalToCalc) || 0); }, 0);
1317
+ };
1318
+
1139
1319
  /**
1140
1320
  * Calcula o total de fees de forma consistente, usando cálculo iterativo para TOTAL_PERCENTAGE
1141
1321
  * @param fees - Array de fees a calcular
1142
1322
  * @param cte - CTE para cálculo
1143
1323
  * @param allFeesForCalc - Todas as fees disponíveis para cálculo
1324
+ * @param ratecard - Tarifário (opcional, será extraído do CTE se não fornecido)
1144
1325
  * @returns Total calculado
1145
1326
  */
1146
- var calculateFeesTotal = function (fees, cte, allFeesForCalc) {
1327
+ var calculateFeesTotal = function (fees, cte, allFeesForCalc, ratecard) {
1147
1328
  if (!fees || fees.length === 0)
1148
1329
  return 0;
1149
1330
  var cache = {};
1331
+ // Obter ratecard se não foi fornecido
1332
+ var ratecardToUse = ratecard || getRatecardFromCte(cte) || undefined;
1333
+ // Construir mapa de exclusões a partir das configurações do ratecard
1334
+ var feeExclusions = buildFeeExclusionsMap(ratecardToUse);
1150
1335
  // PASSADA 1: Calcular fees normais (não TOTAL_PERCENTAGE, não ICMS)
1151
1336
  fees.forEach(function (fee, idx) {
1152
1337
  var _a, _b;
@@ -1155,8 +1340,8 @@ var calculateFeesTotal = function (fees, cte, allFeesForCalc) {
1155
1340
  cache[idx] = calculateFee(fee, cte, fees, true, allFeesForCalc);
1156
1341
  }
1157
1342
  });
1158
- // PASSADA 2: Calcular TOTAL_PERCENTAGE de forma iterativa
1159
- var percentageFeesCache = calculateTotalPercentageFees(fees, cte, allFeesForCalc);
1343
+ // PASSADA 2: Calcular TOTAL_PERCENTAGE de forma iterativa com exclusões
1344
+ var percentageFeesCache = calculateTotalPercentageFees(fees, cte, allFeesForCalc, undefined, undefined, feeExclusions);
1160
1345
  fees.forEach(function (fee, idx) {
1161
1346
  var _a, _b;
1162
1347
  if (((_a = fee.fee) === null || _a === void 0 ? void 0 : _a.feeCalculationTypeId) === exports.FeeCalculationTypeEnum.TOTAL_PERCENTAGE &&
@@ -1273,6 +1458,7 @@ var getFilteredFeesToAudit = function (_a) {
1273
1458
  exports.FeeEnum.COLLECT_PERCENTAGE_TOTAL,
1274
1459
  exports.FeeEnum.COLLECT_REVERSE_PERCENTAGE_TOTAL,
1275
1460
  exports.FeeEnum.APPOINTMENT_MIN_VALUE,
1461
+ exports.FeeEnum.APPOINTMENT_BY_INVOICE_QUANTITY,
1276
1462
  ];
1277
1463
  if (collectAndAppointmentFees.includes((_a = i.fee) === null || _a === void 0 ? void 0 : _a.id)) {
1278
1464
  switch ((_b = i.fee) === null || _b === void 0 ? void 0 : _b.id) {
@@ -8287,8 +8473,11 @@ exports.TARIFF_MAPPING = TARIFF_MAPPING;
8287
8473
  exports.addTariffMapping = addTariffMapping;
8288
8474
  exports.applyRedeliveryMultiplier = applyRedeliveryMultiplier;
8289
8475
  exports.buildDynamicMapping = buildDynamicMapping;
8476
+ exports.buildFeeExclusionsMap = buildFeeExclusionsMap;
8290
8477
  exports.calculateFee = calculateFee;
8478
+ exports.calculateFeesCacheWithDetails = calculateFeesCacheWithDetails;
8291
8479
  exports.calculateFeesTotal = calculateFeesTotal;
8480
+ exports.calculateFeesTotalFromCache = calculateFeesTotalFromCache;
8292
8481
  exports.calculateIcms = calculateIcms;
8293
8482
  exports.calculateTotalPercentageFees = calculateTotalPercentageFees;
8294
8483
  exports.convertNumberToCurrency = convertNumberToCurrency;
package/build/index.js.gz CHANGED
Binary file