Update app.py
Browse files
app.py
CHANGED
|
@@ -69,7 +69,6 @@ def simplificar_dependente(nome):
|
|
| 69 |
}
|
| 70 |
return simplificacoes.get(nome, nome)
|
| 71 |
|
| 72 |
-
# --- NOVA FUNÇÃO PARA FORMATAR APENAS PARA TEXTO PURO ---
|
| 73 |
def formatar_documentos_para_whatsapp(nome, documentos):
|
| 74 |
resultado = f"Documentos necessários para {nome}:\n"
|
| 75 |
for doc in documentos:
|
|
@@ -77,7 +76,7 @@ def formatar_documentos_para_whatsapp(nome, documentos):
|
|
| 77 |
resultado += f"\nDA EMPRESA:\n"
|
| 78 |
else:
|
| 79 |
resultado += f"- {doc}\n"
|
| 80 |
-
resultado += "\n"
|
| 81 |
return resultado
|
| 82 |
|
| 83 |
def obter_documentos_dependente(dependente, nascido_2010):
|
|
@@ -96,7 +95,6 @@ def obter_documentos_dependente(dependente, nascido_2010):
|
|
| 96 |
|
| 97 |
return documentos
|
| 98 |
|
| 99 |
-
# --- NOVA FUNÇÃO PRINCIPAL QUE GERA APENAS TEXTO PURO ---
|
| 100 |
def processar_documentos_para_whatsapp(titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info):
|
| 101 |
texto_final = ""
|
| 102 |
lista_completa = []
|
|
@@ -124,8 +122,7 @@ def processar_documentos_para_whatsapp(titular_nascido_2010, categoria, modalida
|
|
| 124 |
for nome, documentos in lista_completa:
|
| 125 |
texto_final += formatar_documentos_para_whatsapp(nome, documentos)
|
| 126 |
|
| 127 |
-
|
| 128 |
-
return texto_final.strip(), gr.update(visible=True)
|
| 129 |
|
| 130 |
def atualizar_lista_inclusos(titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info):
|
| 131 |
lista_inclusos = []
|
|
@@ -145,6 +142,23 @@ def atualizar_lista_inclusos(titular_nascido_2010, categoria, modalidade, titula
|
|
| 145 |
|
| 146 |
return lista_inclusos
|
| 147 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
def criar_interface():
|
| 149 |
with gr.Blocks(title="Documentos para Plano de Saúde", theme=gr.themes.Soft()) as app:
|
| 150 |
gr.Markdown("# 📋 Documentos Necessários para Plano de Saúde")
|
|
@@ -204,30 +218,31 @@ def criar_interface():
|
|
| 204 |
)
|
| 205 |
dependentes_info = gr.State([])
|
| 206 |
|
| 207 |
-
|
|
|
|
|
|
|
| 208 |
|
| 209 |
with gr.Column():
|
| 210 |
-
# A única caixa de texto para saída e cópia
|
| 211 |
output_textbox = gr.Textbox(
|
| 212 |
label="Documentos Necessários (Pronto para copiar e colar no WhatsApp!)",
|
| 213 |
-
interactive=False,
|
| 214 |
-
lines=20,
|
| 215 |
-
elem_id="documentos-output-textbox"
|
| 216 |
)
|
| 217 |
btn_copiar = gr.Button("📋 Copiar Lista", visible=False)
|
| 218 |
status_copia = gr.Textbox(label="Status da Cópia", interactive=False, visible=False)
|
| 219 |
|
| 220 |
def atualizar_modalidades(categoria):
|
| 221 |
if categoria == "CNPJ":
|
| 222 |
-
return gr.Dropdown(choices=["MEI", "OUTROS"], label="Modalidade CNPJ", interactive=True)
|
| 223 |
elif categoria == "ADESAO":
|
| 224 |
return gr.Dropdown(
|
| 225 |
choices=["ENTIDADE ABERTA", "ESTUDANTE", "TRABALHADOR", "PROFISSIONAL LIBERAL", "APOSENTADO"],
|
| 226 |
label="Modalidade Adesão",
|
| 227 |
-
interactive=True
|
| 228 |
-
)
|
| 229 |
else:
|
| 230 |
-
return gr.Dropdown(choices=[], label="Modalidade (não aplicável)", interactive=False)
|
| 231 |
|
| 232 |
categoria.change(
|
| 233 |
atualizar_modalidades,
|
|
@@ -253,9 +268,8 @@ def criar_interface():
|
|
| 253 |
outputs=lista_inclusos
|
| 254 |
)
|
| 255 |
|
| 256 |
-
# O botão de submissão agora atualiza o único textbox e torna o botão de cópia visível
|
| 257 |
btn_submit.click(
|
| 258 |
-
processar_documentos_para_whatsapp,
|
| 259 |
inputs=[
|
| 260 |
titular_nascido_2010,
|
| 261 |
categoria,
|
|
@@ -263,7 +277,7 @@ def criar_interface():
|
|
| 263 |
titular_carencia,
|
| 264 |
dependentes_info
|
| 265 |
],
|
| 266 |
-
outputs=[output_textbox, btn_copiar]
|
| 267 |
)
|
| 268 |
|
| 269 |
btn_copiar.click(
|
|
@@ -272,13 +286,11 @@ def criar_interface():
|
|
| 272 |
status_copia,
|
| 273 |
js="""
|
| 274 |
async () => {
|
| 275 |
-
// Pega o valor do textarea dentro do gr.Textbox usando o elem_id
|
| 276 |
const texto = document.getElementById("documentos-output-textbox").querySelector("textarea").value;
|
| 277 |
try {
|
| 278 |
await navigator.clipboard.writeText(texto);
|
| 279 |
return "✅ Copiado para área de transferência!";
|
| 280 |
} catch (err) {
|
| 281 |
-
// Fallback para navegadores mais antigos ou erros
|
| 282 |
const textarea = document.createElement('textarea');
|
| 283 |
textarea.value = texto;
|
| 284 |
document.body.appendChild(textarea);
|
|
@@ -290,10 +302,30 @@ def criar_interface():
|
|
| 290 |
}
|
| 291 |
"""
|
| 292 |
).then(
|
| 293 |
-
lambda: gr.update(visible=True),
|
| 294 |
None,
|
| 295 |
status_copia
|
| 296 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 297 |
|
| 298 |
return app
|
| 299 |
|
|
|
|
| 69 |
}
|
| 70 |
return simplificacoes.get(nome, nome)
|
| 71 |
|
|
|
|
| 72 |
def formatar_documentos_para_whatsapp(nome, documentos):
|
| 73 |
resultado = f"Documentos necessários para {nome}:\n"
|
| 74 |
for doc in documentos:
|
|
|
|
| 76 |
resultado += f"\nDA EMPRESA:\n"
|
| 77 |
else:
|
| 78 |
resultado += f"- {doc}\n"
|
| 79 |
+
resultado += "\n"
|
| 80 |
return resultado
|
| 81 |
|
| 82 |
def obter_documentos_dependente(dependente, nascido_2010):
|
|
|
|
| 95 |
|
| 96 |
return documentos
|
| 97 |
|
|
|
|
| 98 |
def processar_documentos_para_whatsapp(titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info):
|
| 99 |
texto_final = ""
|
| 100 |
lista_completa = []
|
|
|
|
| 122 |
for nome, documentos in lista_completa:
|
| 123 |
texto_final += formatar_documentos_para_whatsapp(nome, documentos)
|
| 124 |
|
| 125 |
+
return texto_final.strip(), gr.update(visible=True), gr.update(visible=True) # Retorna texto, e torna visíveis o btn_copiar e status_copia
|
|
|
|
| 126 |
|
| 127 |
def atualizar_lista_inclusos(titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info):
|
| 128 |
lista_inclusos = []
|
|
|
|
| 142 |
|
| 143 |
return lista_inclusos
|
| 144 |
|
| 145 |
+
# --- NOVA FUNÇÃO PARA RESETAR TODOS OS CAMPOS ---
|
| 146 |
+
def limpar_tudo():
|
| 147 |
+
return (
|
| 148 |
+
gr.update(value="PF"), # categoria
|
| 149 |
+
gr.update(choices=[], interactive=False, value=None), # modalidade (reinicia para vazio e desativado)
|
| 150 |
+
gr.update(value=False), # titular_nascido_2010
|
| 151 |
+
gr.update(value=False), # titular_carencia
|
| 152 |
+
gr.update(value=None), # dep_tipo
|
| 153 |
+
gr.update(value=False), # dep_nascido_2010
|
| 154 |
+
gr.update(value=False), # dep_carencia
|
| 155 |
+
gr.update(value=[["Titular (2009-)", "PF", ""]]), # lista_inclusos (volta ao estado inicial)
|
| 156 |
+
[], # dependentes_info (limpa a lista de dependentes do estado)
|
| 157 |
+
"", # output_textbox (limpa o texto de saída)
|
| 158 |
+
gr.update(visible=False), # btn_copiar (oculta o botão de cópia)
|
| 159 |
+
gr.update(visible=False, value="") # status_copia (oculta e limpa o status da cópia)
|
| 160 |
+
)
|
| 161 |
+
|
| 162 |
def criar_interface():
|
| 163 |
with gr.Blocks(title="Documentos para Plano de Saúde", theme=gr.themes.Soft()) as app:
|
| 164 |
gr.Markdown("# 📋 Documentos Necessários para Plano de Saúde")
|
|
|
|
| 218 |
)
|
| 219 |
dependentes_info = gr.State([])
|
| 220 |
|
| 221 |
+
with gr.Row(): # Agrupando botões de ação
|
| 222 |
+
btn_submit = gr.Button("🔍 Gerar Lista de Documentos", variant="primary")
|
| 223 |
+
btn_limpar = gr.Button("🧹 Limpar Tudo", variant="secondary") # Novo botão Limpar
|
| 224 |
|
| 225 |
with gr.Column():
|
|
|
|
| 226 |
output_textbox = gr.Textbox(
|
| 227 |
label="Documentos Necessários (Pronto para copiar e colar no WhatsApp!)",
|
| 228 |
+
interactive=False,
|
| 229 |
+
lines=20,
|
| 230 |
+
elem_id="documentos-output-textbox"
|
| 231 |
)
|
| 232 |
btn_copiar = gr.Button("📋 Copiar Lista", visible=False)
|
| 233 |
status_copia = gr.Textbox(label="Status da Cópia", interactive=False, visible=False)
|
| 234 |
|
| 235 |
def atualizar_modalidades(categoria):
|
| 236 |
if categoria == "CNPJ":
|
| 237 |
+
return gr.Dropdown(choices=["MEI", "OUTROS"], label="Modalidade CNPJ", interactive=True, value=None) # Resetar valor
|
| 238 |
elif categoria == "ADESAO":
|
| 239 |
return gr.Dropdown(
|
| 240 |
choices=["ENTIDADE ABERTA", "ESTUDANTE", "TRABALHADOR", "PROFISSIONAL LIBERAL", "APOSENTADO"],
|
| 241 |
label="Modalidade Adesão",
|
| 242 |
+
interactive=True, value=None
|
| 243 |
+
) # Resetar valor
|
| 244 |
else:
|
| 245 |
+
return gr.Dropdown(choices=[], label="Modalidade (não aplicável)", interactive=False, value=None) # Resetar valor
|
| 246 |
|
| 247 |
categoria.change(
|
| 248 |
atualizar_modalidades,
|
|
|
|
| 268 |
outputs=lista_inclusos
|
| 269 |
)
|
| 270 |
|
|
|
|
| 271 |
btn_submit.click(
|
| 272 |
+
processar_documentos_para_whatsapp,
|
| 273 |
inputs=[
|
| 274 |
titular_nascido_2010,
|
| 275 |
categoria,
|
|
|
|
| 277 |
titular_carencia,
|
| 278 |
dependentes_info
|
| 279 |
],
|
| 280 |
+
outputs=[output_textbox, btn_copiar, status_copia] # Passamos status_copia também para que ele seja visível
|
| 281 |
)
|
| 282 |
|
| 283 |
btn_copiar.click(
|
|
|
|
| 286 |
status_copia,
|
| 287 |
js="""
|
| 288 |
async () => {
|
|
|
|
| 289 |
const texto = document.getElementById("documentos-output-textbox").querySelector("textarea").value;
|
| 290 |
try {
|
| 291 |
await navigator.clipboard.writeText(texto);
|
| 292 |
return "✅ Copiado para área de transferência!";
|
| 293 |
} catch (err) {
|
|
|
|
| 294 |
const textarea = document.createElement('textarea');
|
| 295 |
textarea.value = texto;
|
| 296 |
document.body.appendChild(textarea);
|
|
|
|
| 302 |
}
|
| 303 |
"""
|
| 304 |
).then(
|
| 305 |
+
lambda: gr.update(visible=True), # Aqui o status_copia já foi tornado visível acima. Isso só garante que se por algum motivo ele sumisse, voltaria.
|
| 306 |
None,
|
| 307 |
status_copia
|
| 308 |
)
|
| 309 |
+
|
| 310 |
+
# --- CONEXÃO DO BOTÃO LIMPAR TUDO ---
|
| 311 |
+
btn_limpar.click(
|
| 312 |
+
limpar_tudo,
|
| 313 |
+
inputs=None, # Não precisa de inputs para limpar
|
| 314 |
+
outputs=[
|
| 315 |
+
categoria,
|
| 316 |
+
modalidade,
|
| 317 |
+
titular_nascido_2010,
|
| 318 |
+
titular_carencia,
|
| 319 |
+
dep_tipo,
|
| 320 |
+
dep_nascido_2010,
|
| 321 |
+
dep_carencia,
|
| 322 |
+
lista_inclusos,
|
| 323 |
+
dependentes_info, # O State precisa ser resetado!
|
| 324 |
+
output_textbox,
|
| 325 |
+
btn_copiar,
|
| 326 |
+
status_copia
|
| 327 |
+
]
|
| 328 |
+
)
|
| 329 |
|
| 330 |
return app
|
| 331 |
|