@credithub/harlan-components 1.109.1 → 1.109.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.
@@ -28,7 +28,7 @@ import ProtestosGeraisIcon from '../../assets/icones/protestosGerais';
28
28
  import ProtestosImpostosIcon from '../../assets/icones/protestosImpostos';
29
29
  import { useGlobalData } from '../../contexts/globalDataContext';
30
30
  import { classifyProtestos, useProtestosClassification } from '../../hooks/useProtestosClassification';
31
- import { clearMoneyString } from '../../utils/number';
31
+ import { parseMoneyValue } from '../../utils/number';
32
32
  import { parseProtesto } from '../../utils/parseProtesto';
33
33
  import XPathUtils from '../../utils/xpath';
34
34
  import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react';
@@ -87,8 +87,7 @@ var Protestos = function () {
87
87
  // Calcula valorTotalProtestos uma única vez somando todos os valores
88
88
  var todosProtestos = __spreadArray(__spreadArray(__spreadArray([], protestosDeCredito, true), protestosDeImposto, true), protestosGerais, true);
89
89
  var valorTotalProtestos = todosProtestos.reduce(function (total, protesto) {
90
- var valorStr = (protesto === null || protesto === void 0 ? void 0 : protesto.valor) || '0';
91
- var valorNumero = Number(clearMoneyString(valorStr)) || 0;
90
+ var valorNumero = parseMoneyValue(protesto === null || protesto === void 0 ? void 0 : protesto.valor);
92
91
  return total + valorNumero;
93
92
  }, 0);
94
93
  setData(function (prevState) {
@@ -4,3 +4,16 @@ export declare function formatValue(valor?: number): string | undefined;
4
4
  export declare function sum(valores: number[]): number;
5
5
  export declare const extractIntegerFromText: (text: string | null) => number;
6
6
  export declare const clearMoneyString: (value: string) => string;
7
+ /**
8
+ * Converte uma string de valor monetário para número, tratando múltiplos formatos.
9
+ *
10
+ * Suporta os seguintes formatos:
11
+ * - "1.695,80" (formato brasileiro com separador de milhar)
12
+ * - "1695,80" (formato brasileiro sem separador de milhar)
13
+ * - "1695.80" (formato internacional)
14
+ * - "169580" (número puro - será interpretado como centavos se muito grande)
15
+ *
16
+ * @param value - String ou número representando o valor monetário
17
+ * @returns Número em formato decimal (ex: 1695.80)
18
+ */
19
+ export declare const parseMoneyValue: (value: string | number | null | undefined) => number;
@@ -27,3 +27,71 @@ export var extractIntegerFromText = function (text) {
27
27
  export var clearMoneyString = function (value) {
28
28
  return value.replace(/\./g, '').replace(/,/g, '.');
29
29
  };
30
+ /**
31
+ * Converte uma string de valor monetário para número, tratando múltiplos formatos.
32
+ *
33
+ * Suporta os seguintes formatos:
34
+ * - "1.695,80" (formato brasileiro com separador de milhar)
35
+ * - "1695,80" (formato brasileiro sem separador de milhar)
36
+ * - "1695.80" (formato internacional)
37
+ * - "169580" (número puro - será interpretado como centavos se muito grande)
38
+ *
39
+ * @param value - String ou número representando o valor monetário
40
+ * @returns Número em formato decimal (ex: 1695.80)
41
+ */
42
+ export var parseMoneyValue = function (value) {
43
+ if (value === null || value === undefined)
44
+ return 0;
45
+ // Se já for número, retorna direto
46
+ if (typeof value === 'number') {
47
+ return isNaN(value) ? 0 : value;
48
+ }
49
+ // Se for string vazia, retorna 0
50
+ var str = String(value).trim();
51
+ if (!str || str === '0')
52
+ return 0;
53
+ // Remove espaços e caracteres não numéricos exceto ponto e vírgula
54
+ var cleaned = str.replace(/[^\d.,]/g, '');
55
+ // Se não tem ponto nem vírgula, é número puro
56
+ if (!cleaned.includes('.') && !cleaned.includes(',')) {
57
+ var num_1 = Number(cleaned);
58
+ // Se for número puro sem separador decimal, verifica se pode ser centavos
59
+ // Valores monetários típicos de protestos raramente ultrapassam R$ 50.000
60
+ // Se o número tem 5+ dígitos, verifica se faz mais sentido como centavos
61
+ if (cleaned.length >= 5) {
62
+ var asCentavos = num_1 / 100;
63
+ // Se interpretado como centavos resulta em valor razoável (< 50000),
64
+ // assume que é centavos (ex: 169580 -> 1695.80, 271353 -> 2713.53)
65
+ if (asCentavos < 50000 && asCentavos > 0) {
66
+ return asCentavos;
67
+ }
68
+ }
69
+ return num_1;
70
+ }
71
+ // Detecta formato: se tem vírgula, assume formato brasileiro (1.695,80 ou 1695,80)
72
+ if (cleaned.includes(',')) {
73
+ // Remove pontos (separadores de milhar) e substitui vírgula por ponto
74
+ cleaned = cleaned.replace(/\./g, '').replace(',', '.');
75
+ var num_2 = Number(cleaned);
76
+ return isNaN(num_2) ? 0 : num_2;
77
+ }
78
+ // Se só tem ponto, pode ser formato internacional ou separador de milhar
79
+ // Se tem mais de um ponto, assume que são separadores de milhar
80
+ var dots = (cleaned.match(/\./g) || []).length;
81
+ if (dots > 1) {
82
+ // Múltiplos pontos = separadores de milhar (formato internacional: 1.695.80)
83
+ cleaned = cleaned.replace(/\./g, '');
84
+ var num_3 = Number(cleaned);
85
+ // Se o número resultante for muito grande, assume que o último ponto era decimal
86
+ if (num_3 > 1000000) {
87
+ // Pega os últimos 2 dígitos como centavos
88
+ var integerPart = Math.floor(num_3 / 100);
89
+ var decimalPart = num_3 % 100;
90
+ return integerPart + decimalPart / 100;
91
+ }
92
+ return isNaN(num_3) ? 0 : num_3;
93
+ }
94
+ // Um único ponto = separador decimal (formato internacional: 1695.80)
95
+ var num = Number(cleaned);
96
+ return isNaN(num) ? 0 : num;
97
+ };