@credithub/harlan-components 1.109.0 → 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.
@@ -61,44 +61,6 @@ export var processData = function (data, quantidadeProcessosJuridicos, totalProt
61
61
  .map(function (info) { return (__assign(__assign({}, info), { data: formatDatePtBrToDate(info.data) // normaliza p/ ISO local
62
62
  })); }), function (info) { return info.data; });
63
63
  // ------------------------------------------------------------------
64
- // GARANTIR ÚLTIMO PONTO CORRETO PARA PROTESTOS
65
- // ------------------------------------------------------------------
66
- // Se temos valores corretos de totalProtestos e valorTotalProtestos,
67
- // garantimos que o último ponto do histórico tenha esses valores
68
- if (totalProtestos !== undefined &&
69
- valorTotalProtestos !== undefined &&
70
- data.protestos.length > 0) {
71
- var ultimoPonto = data.protestos[data.protestos.length - 1];
72
- var dataAtual = ultimaOcorrenciaProtestos
73
- ? formatDatePtBrToDate(ultimaOcorrenciaProtestos)
74
- : new Date();
75
- // Verifica se o último ponto precisa ser atualizado
76
- var precisaAtualizar = ultimoPonto.quantidade !== totalProtestos ||
77
- ultimoPonto.valorTotal !== valorTotalProtestos;
78
- if (precisaAtualizar) {
79
- // Atualiza o último ponto ou adiciona um novo se necessário
80
- var dataUltimoPonto = ultimoPonto.data instanceof Date
81
- ? ultimoPonto.data
82
- : new Date(ultimoPonto.data);
83
- var dataProtesto = dataAtual instanceof Date ? dataAtual : new Date(dataAtual);
84
- // Se a data atual é mais recente que o último ponto, adiciona novo ponto
85
- // Caso contrário, atualiza o último ponto existente
86
- if (dataProtesto.getTime() > dataUltimoPonto.getTime()) {
87
- data.protestos.push({
88
- data: dataProtesto,
89
- quantidade: totalProtestos,
90
- valorTotal: valorTotalProtestos
91
- });
92
- }
93
- else {
94
- // Atualiza o último ponto mantendo a data original
95
- data.protestos[data.protestos.length - 1] = __assign(__assign({}, ultimoPonto), { quantidade: totalProtestos, valorTotal: valorTotalProtestos });
96
- }
97
- // Reordena após adicionar/atualizar
98
- data.protestos = sortBy(data.protestos, function (info) { return info.data; });
99
- }
100
- }
101
- // ------------------------------------------------------------------
102
64
  // CCFs
103
65
  // ------------------------------------------------------------------
104
66
  data.ccfs = sortBy(unique(data.ccfs, function (x) { return x.data; })
@@ -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) {
@@ -32,8 +32,13 @@ var Wrapper = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateO
32
32
  var FinderDependency = function (_a) {
33
33
  var children = _a.children, documento = _a.documento;
34
34
  var ctxFinder = useContext(Queries.Finder);
35
+ var ProtestosWithCCFDependency = function (_a) {
36
+ var children = _a.children;
37
+ var ctxCCF = useContext(Queries.CCF);
38
+ return (React.createElement(Queries.Protestos.Request, { data: { documento: documento }, depends: [ctxFinder, ctxCCF] }, children));
39
+ };
35
40
  return (React.createElement(Queries.CCF.Request, { data: { documento: documento }, depends: [ctxFinder] },
36
- React.createElement(Queries.Protestos.Request, { data: { documento: documento }, depends: [ctxFinder] }, children)));
41
+ React.createElement(ProtestosWithCCFDependency, null, children)));
37
42
  };
38
43
  var GraficosAnaliticosDependency = function (_a) {
39
44
  var children = _a.children, documento = _a.documento;
@@ -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
+ };