b2m-utils 0.0.287 → 0.0.288

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.
@@ -578,10 +578,56 @@ var calculateFee = function (ratecardLaneFee, cte, allFees, debug, allFeesForCal
578
578
  switch (fee_1.feeCalculationTypeId) {
579
579
  case FeeCalculationTypeEnum.TOTAL_PERCENTAGE:
580
580
  if (allFees && Array.isArray(allFees) && (allFees === null || allFees === void 0 ? void 0 : allFees.length) > 0) {
581
- var filteredFees_1 = allFees.filter(function (i) { var _a, _b, _c; return ((_a = i.fee) === null || _a === void 0 ? void 0 : _a.id) !== fee_1.id && ((_b = i.fee) === null || _b === void 0 ? void 0 : _b.id) !== FeeEnum.ICMS && ((_c = i.fee) === null || _c === void 0 ? void 0 : _c.parentId) !== fee_1.parentId; });
582
- var filteredFeesResults = filterSiblingFees(filteredFees_1.map(function (it) {
583
- return calculateFee(it, cte, filteredFees_1, debug, allFeesForCalc);
581
+ var filteredFees = allFees.filter(function (i) { var _a, _b, _c; return ((_a = i.fee) === null || _a === void 0 ? void 0 : _a.id) !== fee_1.id && ((_b = i.fee) === null || _b === void 0 ? void 0 : _b.id) !== FeeEnum.ICMS && ((_c = i.fee) === null || _c === void 0 ? void 0 : _c.parentId) !== fee_1.parentId; });
582
+ // Separar fees em dois grupos
583
+ var nonPercentageFees = filteredFees.filter(function (i) { var _a; return ((_a = i.fee) === null || _a === void 0 ? void 0 : _a.feeCalculationTypeId) !== FeeCalculationTypeEnum.TOTAL_PERCENTAGE; });
584
+ var percentageFees_1 = filteredFees.filter(function (i) { var _a; return ((_a = i.fee) === null || _a === void 0 ? void 0 : _a.feeCalculationTypeId) === FeeCalculationTypeEnum.TOTAL_PERCENTAGE; });
585
+ // Calcular fees não-percentuais (base fixa)
586
+ var nonPercentageResults_1 = filterSiblingFees(nonPercentageFees.map(function (it) {
587
+ return calculateFee(it, cte, allFees, debug, allFeesForCalc);
584
588
  }));
589
+ // Calcular fees percentuais iterativamente até convergir
590
+ var percentageResults = [];
591
+ var maxIterations = 10;
592
+ var tolerance_1 = 0.01; // Tolerância de 1 centavo
593
+ // Inicializar com valores zerados
594
+ var previousValues_1 = new Map();
595
+ percentageFees_1.forEach(function (pf) { return previousValues_1.set(pf.fee.id, 0); });
596
+ var _loop_1 = function (iteration) {
597
+ // Calcular cada fee percentual com base nos valores atuais das outras
598
+ var currentResults = percentageFees_1.map(function (pf) {
599
+ // Criar uma lista temporária com os valores já calculados das outras fees percentuais
600
+ var tempFees = percentageFees_1
601
+ .filter(function (f) { return f.fee.id !== pf.fee.id; })
602
+ .map(function (f) { return (__assign(__assign({}, f), { totalFee: previousValues_1.get(f.fee.id) || 0, totalToCalc: previousValues_1.get(f.fee.id) || 0 })); });
603
+ // Calcular base: fees não-percentuais + outras fees percentuais
604
+ var baseValue = nonPercentageResults_1.reduce(function (sum, r) { return sum + (r.totalToCalc || 0); }, 0) +
605
+ tempFees.reduce(function (sum, f) { return sum + (f.totalFee || 0); }, 0);
606
+ var percentValue = (+pf.value / 100);
607
+ var calculatedValue = baseValue * percentValue;
608
+ return __assign(__assign({}, pf), { totalFee: calculatedValue, totalToCalc: calculatedValue, fee: pf.fee, feeValue: pf.value, resultFee: "".concat(convertNumberToCurrency(baseValue, 'pt-br'), " x ").concat(+pf.value, "% = ").concat(convertNumberToCurrency(calculatedValue, 'pt-br')) });
609
+ });
610
+ // Verificar convergência
611
+ var hasConverged = true;
612
+ currentResults.forEach(function (result) {
613
+ var prevValue = previousValues_1.get(result.feeId) || 0;
614
+ if (Math.abs(result.totalFee - prevValue) > tolerance_1) {
615
+ hasConverged = false;
616
+ }
617
+ previousValues_1.set(result.feeId, result.totalFee);
618
+ });
619
+ percentageResults = currentResults;
620
+ if (hasConverged) {
621
+ return "break";
622
+ }
623
+ };
624
+ for (var iteration = 0; iteration < maxIterations; iteration++) {
625
+ var state_1 = _loop_1(iteration);
626
+ if (state_1 === "break")
627
+ break;
628
+ }
629
+ // Combinar resultados
630
+ var filteredFeesResults = __spreadArray(__spreadArray([], nonPercentageResults_1, true), percentageResults, true);
585
631
  var totalFromAllFees = filteredFeesResults.map(function (result) {
586
632
  if (result === null || result === void 0 ? void 0 : result.totalToCalc) {
587
633
  return result.totalToCalc;
Binary file