MLMPBR commited on
Commit
ddda10a
·
verified ·
1 Parent(s): 27dd89d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -18
app.py CHANGED
@@ -11,6 +11,7 @@ import numpy as np
11
  import os
12
  import urllib3
13
  import re
 
14
  from dash.dash_table.Format import Format, Symbol
15
 
16
  # --- CONFIGURAÇÃO DE CACHE ---
@@ -74,13 +75,34 @@ def corrigir_texto_licitacao(texto):
74
  # 2. MOTORES DE CARGA
75
  # ==============================================================================
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  def carregar_rh_completo():
78
  arquivo_nome = "Relatorio.csv"
79
 
80
- # Procura o arquivo na raiz ou na pasta de cache
81
- caminho_raiz = arquivo_nome
82
- caminho_cache = os.path.join(PASTA_CACHE, arquivo_nome)
83
- caminho_final = caminho_raiz if os.path.exists(caminho_raiz) else caminho_cache
84
 
85
  if not os.path.exists(caminho_final):
86
  print(f" ⚠️ RH: Arquivo '{arquivo_nome}' não encontrado.")
@@ -93,37 +115,41 @@ def carregar_rh_completo():
93
 
94
  if df.empty: return pd.DataFrame()
95
 
96
- # Limpeza segura dos nomes das colunas
97
- df.columns = [re.sub(r'[^\w\s]', '', c).strip().lower().replace(' ', '') for c in df.columns]
98
 
99
- # Colunas financeiras limpas (sem acento ou caracteres especiais)
100
- cols_fin_esperadas = ['salariobruto', 'ferias', '13salario', 'rescisao']
101
- colunas_encontradas = [c for c in cols_fin_esperadas if c in df.columns]
102
 
103
- # Aqui usamos a SUA função (converter_para_float) que é segura!
104
- for col in colunas_encontradas:
105
- df[col] = df[col].apply(converter_para_float)
106
-
107
- # Soma todos os proventos da linha e cria a coluna 'salarioBase' para o painel ler
108
- if colunas_encontradas:
109
- df['salarioBase'] = df[colunas_encontradas].sum(axis=1)
110
  else:
111
  df['salarioBase'] = 0.0
112
 
113
- # Mapeia colunas de texto para os gráficos não quebrarem
114
  col_cargo = next((c for c in df.columns if 'cargo' in c), None)
115
  df['cargo'] = df[col_cargo] if col_cargo else 'Não Informado'
116
 
117
  col_cc = next((c for c in df.columns if 'centrocusto' in c or 'centro' in c), None)
118
  df['regime'] = df[col_cc] if col_cc else 'Geral'
119
 
120
- print(f"✅ RH Carregado! (Total Bruto real: R$ {df['salarioBase'].sum():,.2f})")
 
 
 
121
 
122
  return df
123
  except Exception as e:
124
  print(f"Erro ao carregar RH: {e}")
125
  return pd.DataFrame()
126
 
 
127
  # --- MOTOR FINANCEIRO ---
128
  def obter_dados_financeiros(endpoint, ano, tipo):
129
  arquivo = f"{PASTA_CACHE}/{tipo}_{ano}.csv"
 
11
  import os
12
  import urllib3
13
  import re
14
+ import unicodedata
15
  from dash.dash_table.Format import Format, Symbol
16
 
17
  # --- CONFIGURAÇÃO DE CACHE ---
 
75
  # 2. MOTORES DE CARGA
76
  # ==============================================================================
77
 
78
+ def to_float_universal(val):
79
+ if pd.isna(val): return 0.0
80
+ v = str(val).upper().replace('R$', '').strip()
81
+ if ',' in v and '.' in v:
82
+ # Se tem vírgula e ponto (ex: 1.234,56 ou 1,234.56)
83
+ if v.rfind(',') > v.rfind('.'):
84
+ v = v.replace('.', '').replace(',', '.') # Padrão BR
85
+ else:
86
+ v = v.replace(',', '') # Padrão US
87
+ elif ',' in v:
88
+ v = v.replace(',', '.') # Apenas vírgula vira ponto
89
+
90
+ # Se só tem ponto (ex: 4102.35 do seu CSV), o float nativo resolve direto
91
+ try: return float(v)
92
+ except: return 0.0
93
+
94
+ def limpar_nome_coluna(nome):
95
+ texto = str(nome).lower()
96
+ # Remove acentos
97
+ texto = ''.join(c for c in unicodedata.normalize('NFD', texto) if unicodedata.category(c) != 'Mn')
98
+ # Remove tudo que não for letra ou número (arranca espaços, barras, hifens)
99
+ return re.sub(r'[^a-z0-9]', '', texto)
100
+
101
  def carregar_rh_completo():
102
  arquivo_nome = "Relatorio.csv"
103
 
104
+ # Procura na raiz ou na pasta de cache
105
+ caminho_final = arquivo_nome if os.path.exists(arquivo_nome) else os.path.join(PASTA_CACHE, arquivo_nome)
 
 
106
 
107
  if not os.path.exists(caminho_final):
108
  print(f" ⚠️ RH: Arquivo '{arquivo_nome}' não encontrado.")
 
115
 
116
  if df.empty: return pd.DataFrame()
117
 
118
+ # Limpa os nomes das colunas de forma bruta (saláriobruto -> salariobruto)
119
+ df.columns = [limpar_nome_coluna(c) for c in df.columns]
120
 
121
+ # Colunas que queremos somar
122
+ cols_alvo = ['salariobruto', 'ferias', '13salario', 'rescisao']
123
+ col_presentes = [c for c in cols_alvo if c in df.columns]
124
 
125
+ # Converte as colunas encontradas usando o motor universal
126
+ for col in col_presentes:
127
+ df[col] = df[col].apply(to_float_universal)
128
+
129
+ # Soma tudo na coluna 'salarioBase' para os gráficos não quebrarem
130
+ if col_presentes:
131
+ df['salarioBase'] = df[col_presentes].sum(axis=1)
132
  else:
133
  df['salarioBase'] = 0.0
134
 
135
+ # Mapeia colunas de texto
136
  col_cargo = next((c for c in df.columns if 'cargo' in c), None)
137
  df['cargo'] = df[col_cargo] if col_cargo else 'Não Informado'
138
 
139
  col_cc = next((c for c in df.columns if 'centrocusto' in c or 'centro' in c), None)
140
  df['regime'] = df[col_cc] if col_cc else 'Geral'
141
 
142
+ df['situacao'] = 'Trabalhando' # Fixa a situação para os KPIs não zerarem
143
+
144
+ total_real = df['salarioBase'].sum()
145
+ print(f"✅ RH Carregado! (Total Calculado: R$ {total_real:,.2f})")
146
 
147
  return df
148
  except Exception as e:
149
  print(f"Erro ao carregar RH: {e}")
150
  return pd.DataFrame()
151
 
152
+
153
  # --- MOTOR FINANCEIRO ---
154
  def obter_dados_financeiros(endpoint, ano, tipo):
155
  arquivo = f"{PASTA_CACHE}/{tipo}_{ano}.csv"