File size: 15,885 Bytes
2e02568 51c41ab 8c25490 bf5a0d9 c06f103 bf5a0d9 c06f103 bf5a0d9 434bab0 bf5a0d9 9e04dca bf5a0d9 9e04dca bf5a0d9 9e04dca 477e0b8 bf5a0d9 9e04dca bf5a0d9 fce2dd3 bf5a0d9 fce2dd3 bf5a0d9 9e04dca bf5a0d9 fce2dd3 bf5a0d9 fce2dd3 bf5a0d9 477e0b8 ba42573 477e0b8 ba42573 fce2dd3 477e0b8 ba42573 fce2dd3 ba42573 bf5a0d9 51c41ab bf5a0d9 fce2dd3 ba42573 bf5a0d9 fce2dd3 bf5a0d9 ba42573 477e0b8 ba42573 bf5a0d9 127a182 9e04dca 477e0b8 ca4078f 9e04dca 127a182 51c41ab bf5a0d9 ba42573 bf5a0d9 477e0b8 ba42573 bf5a0d9 ba42573 c0ae6cd bf5a0d9 51c41ab bf5a0d9 51c41ab 477e0b8 bf5a0d9 ba42573 51c41ab 9e04dca 127a182 9829926 127a182 c0ae6cd 127a182 c0ae6cd 127a182 9829926 51c41ab ba42573 51c41ab 477e0b8 ba42573 477e0b8 ba42573 fce2dd3 477e0b8 ba42573 477e0b8 ba42573 fce2dd3 ba42573 fce2dd3 ba42573 127a182 bf5a0d9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 |
import gradio as gr
import re
def obter_documentos_padrao_2010_mais():
return [
"Certidão de Nascimento (Não pode ser só o RG)",
"Documento com Foto (RG/CNH/OUTROS - se houver)",
"CPF (se não tiver em outro documento)",
"Foto Corporal Completa para Verificação de Saúde",
"Email e celular do responsável"
]
def obter_documentos_padrao_2009_menos():
return [
"Documento com Foto (RG/CNH/OUTROS)",
"CPF (se não tiver no documento com foto)",
"Foto com Documento ao lado do rosto",
"Email e celular"
]
def obter_documentos_carencia():
return [
"3 últimos boletos pagos e seus comprovantes",
"Carteirinha",
"Carta de permanência"
]
def obter_documentos_titular(categoria, modalidade, documentos_padrao):
documentos = documentos_padrao.copy()
documentos.append("Comprovante de Residência: (no nome do titular ou dos pais; Se for no nome de outros, me fale)")
if categoria == "CNPJ":
documentos.append("DA EMPRESA:")
if modalidade == "MEI":
documentos.extend(["CNPJ", "CCMEI"])
elif modalidade == "OUTROS":
documentos.extend(["CNPJ", "Contrato Social e suas alterações"])
elif categoria == "ADESAO":
documentos_map = {
"ENTIDADE ABERTA": None,
"ESTUDANTE": "Declaração Escolar",
"TRABALHADOR": "Contracheque",
"PROFISSIONAL LIBERAL": "Documento de Registro no Conselho na validade + Diploma",
"APOSENTADO": "Comprovante de Pensão"
}
doc_extra = documentos_map.get(modalidade)
if doc_extra:
documentos.append(doc_extra)
return documentos
def simplificar_dependente(nome):
simplificacoes = {
"Cônjuge ou companheiro(a)": "Cônjuge",
"Filhos(as) solteiros naturais, tutelados, enteados e adotivos": "Filhos",
"Filhos(as) inválidos declarados no imposto de renda do titular": "Filho inválido",
"Pai e mãe": "Pais",
"Padrasto e madrasta": "Padrastos",
"Irmãos(ãs) consanguíneos ou adotivos": "Irmãos",
"Netos": "Netos",
"Sobrinhos": "Sobrinhos",
"Primos": "Primos",
"Tios": "Tios",
"Cunhados(as)": "Cunhados",
"Sogro(a)": "Sogro(a)",
"Genros e noras": "Genros/Noras",
"Avô e avó": "Avós"
}
return simplificacoes.get(nome, nome)
def formatar_documentos_para_whatsapp(nome, documentos):
resultado = f"Documentos necessários para {nome}:\n"
for doc in documentos:
if doc == "DA EMPRESA:":
resultado += f"\nDA EMPRESA:\n"
else:
resultado += f"- {doc}\n"
resultado += "\n"
return resultado
def obter_documentos_dependente(dependente, nascido_2010):
documentos = obter_documentos_padrao_2010_mais() if nascido_2010 else obter_documentos_padrao_2009_menos()
if dependente == "Cônjuge ou companheiro(a)":
documentos.append("Certidão de casamento ou declaração de união estável (lavrada em cartório).")
elif "inválido" in dependente:
documentos.append("Declaração de imposto de renda do titular comprovando a condição.")
elif dependente in ["Netos", "Sobrinhos", "Primos", "Tios"]:
documentos.append("Documento com foto (RG/CNH/outros) do pai/mãe.")
elif dependente in ["Cunhados(as)", "Genros e noras"]:
documentos.append("Certidão de casamento.")
elif dependente == "Sogro(a)":
documentos.append("Certidão de casamento do titular")
return documentos
def processar_documentos_para_whatsapp(titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info):
texto_final = ""
lista_completa = []
docs_carencia = obter_documentos_carencia()
documentos_padrao_titular = obter_documentos_padrao_2010_mais() if titular_nascido_2010 else obter_documentos_padrao_2009_menos()
documentos_titular = obter_documentos_titular(categoria, modalidade, documentos_padrao_titular)
# --- CORREÇÃO AQUI: Adicionar documentos de carência APENAS se não for categoria CNPJ ---
if titular_carencia and categoria != "CNPJ":
documentos_titular.extend(docs_carencia)
lista_completa.append(("TITULAR", documentos_titular))
if dependentes_info:
for dep_info in dependentes_info:
dep_nascido_2010, dep_tipo, dep_carencia = dep_info
nome_simples = simplificar_dependente(dep_tipo)
docs_dep = obter_documentos_dependente(dep_tipo, dep_nascido_2010)
# Documentos de carência para dependentes sempre são adicionados
if dep_carencia:
docs_dep.extend(docs_carencia)
lista_completa.append((f"Dependente: {nome_simples}", docs_dep))
for nome, documentos in lista_completa:
texto_final += formatar_documentos_para_whatsapp(nome, documentos)
return texto_final.strip(), gr.update(visible=True), gr.update(visible=True)
def atualizar_lista_inclusos(titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info):
lista_inclusos = []
tipo_titular = "Titular (2010+)" if titular_nascido_2010 else "Titular (2009-)"
# --- CORREÇÃO AQUI: A frase " + carência" na lista de inclusos só aparece se não for CNPJ ---
if titular_carencia and categoria != "CNPJ":
tipo_titular += " + carência"
lista_inclusos.append([tipo_titular, categoria, modalidade if modalidade else "PF"])
if dependentes_info:
for dep_info in dependentes_info:
dep_nascido_2010, dep_tipo, dep_carencia = dep_info
tipo_dep = f"Dep. {simplificar_dependente(dep_tipo)} (2010+)" if dep_nascido_2010 else f"Dep. {simplificar_dependente(dep_tipo)} (2009-)"
if dep_carencia:
tipo_dep += " + carência"
lista_inclusos.append([tipo_dep, "Dependente", dep_tipo])
return lista_inclusos
def limpar_tudo():
return (
gr.update(value="PF", interactive=True), # categoria
gr.update(choices=[], interactive=False, value=None), # modalidade (reinicia para vazio e desativado)
gr.update(value=False, interactive=True), # titular_nascido_2010
gr.update(value=False, interactive=True), # titular_carencia
gr.Accordion(open=True), # accordion_titular (volta a ser visível e aberto)
gr.update(visible=True), # btn_confirmar_titular (torna o botão de confirmar visível)
gr.update(value=None), # dep_tipo
gr.update(value=False), # dep_nascido_2010
gr.update(value=False), # dep_carencia
gr.update(value=[["Titular (2009-)", "PF", ""]]), # lista_inclusos (volta ao estado inicial)
[], # dependentes_info (limpa a lista de dependentes do estado)
"", # output_textbox (limpa o texto de saída)
gr.update(visible=False), # btn_copiar (oculta o botão de cópia)
gr.update(visible=False, value="") # status_copia (oculta e limpa o status da cópia)
)
def confirmar_titular():
# Isso torna os componentes do titular não interativos e esconde o botão de confirmar.
# O accordion "Adicionar Dependentes" pode ser aberto automaticamente aqui.
return (
gr.update(interactive=False), # categoria
gr.update(interactive=False), # modalidade
gr.update(interactive=False), # titular_nascido_2010
gr.update(interactive=False), # titular_carencia
gr.update(visible=False), # btn_confirmar_titular (esconde o próprio botão)
gr.Accordion(open=True) # Abre o accordion de dependentes
)
def criar_interface():
with gr.Blocks(title="Documentos para Plano de Saúde", theme=gr.themes.Soft()) as app:
gr.Markdown("# 📋 Documentos Necessários para Plano de Saúde")
gr.Markdown("Preencha os dados abaixo para obter a lista de documentos necessários.")
with gr.Row():
with gr.Column():
with gr.Accordion("Dados do Titular", open=True) as accordion_titular:
with gr.Group():
categoria = gr.Radio(
choices=["PF", "CNPJ", "ADESAO"],
label="Categoria do Titular",
value="PF"
)
modalidade = gr.Dropdown(
choices=[],
label="Modalidade (se aplicável)",
interactive=False
)
with gr.Row():
titular_nascido_2010 = gr.Checkbox(label="Nasceu em 2010 ou depois?")
titular_carencia = gr.Checkbox(label="Fará compra de carência?")
btn_confirmar_titular = gr.Button("✅ Confirmar Dados do Titular", variant="primary")
with gr.Accordion("Adicionar Dependentes", open=False) as accordion_deps:
with gr.Group():
gr.Markdown("### Novo Dependente")
dep_tipo = gr.Dropdown(
choices=[
"Cônjuge ou companheiro(a)",
"Filhos(as) solteiros naturais, tutelados, enteados e adotivos",
"Filhos(as) inválidos declarados no imposto de renda do titular",
"Pai e mãe",
"Padrasto e madrasta",
"Irmãos(ãs) consanguíneos ou adotivos",
"Netos",
"Sobrinhos",
"Primos",
"Tios",
"Cunhados(as)",
"Sogro(a)",
"Genros e noras",
"Avô e avó"
],
label="Tipo de Dependente"
)
with gr.Row():
dep_nascido_2010 = gr.Checkbox(label="Nasceu em 2010 ou depois?")
dep_carencia = gr.Checkbox(label="Fará compra de carência?")
btn_adicionar_dep = gr.Button("➕ Adicionar Dependente", variant="primary")
lista_inclusos = gr.Dataframe(
headers=["Inclusos nessa cotação", "Tipo", "Detalhes"],
datatype=["str", "str", "str"],
interactive=False,
label="Inclusos nessa cotação",
value=[["Titular (2009-)", "PF", ""]]
)
dependentes_info = gr.State([])
with gr.Row():
btn_submit = gr.Button("🔍 Gerar Lista de Documentos", variant="primary")
btn_limpar = gr.Button("🧹 Limpar Tudo", variant="secondary")
with gr.Column():
output_textbox = gr.Textbox(
label="Documentos Necessários (Pronto para copiar e colar no WhatsApp!)",
interactive=False,
lines=20,
elem_id="documentos-output-textbox"
)
btn_copiar = gr.Button("📋 Copiar Lista", visible=False)
status_copia = gr.Textbox(label="Status da Cópia", interactive=False, visible=False)
def atualizar_modalidades(categoria):
if categoria == "CNPJ":
return gr.Dropdown(choices=["MEI", "OUTROS"], label="Modalidade CNPJ", interactive=True, value=None)
elif categoria == "ADESAO":
return gr.Dropdown(
choices=["ENTIDADE ABERTA", "ESTUDANTE", "TRABALHADOR", "PROFISSIONAL LIBERAL", "APOSENTADO"],
label="Modalidade Adesão",
interactive=True, value=None
)
else:
return gr.Dropdown(choices=[], label="Modalidade (não aplicável)", interactive=False, value=None)
categoria.change(
atualizar_modalidades,
inputs=categoria,
outputs=modalidade
)
inputs_lista = [titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info]
for input_component in inputs_lista:
input_component.change(
atualizar_lista_inclusos,
inputs=inputs_lista,
outputs=lista_inclusos
)
btn_adicionar_dep.click(
lambda dep_info, dep_nasc, dep_tipo, dep_carencia: (dep_info + [(dep_nasc, dep_tipo, dep_carencia)]),
inputs=[dependentes_info, dep_nascido_2010, dep_tipo, dep_carencia],
outputs=dependentes_info
).then(
atualizar_lista_inclusos,
inputs=inputs_lista,
outputs=lista_inclusos
)
btn_submit.click(
processar_documentos_para_whatsapp,
inputs=[
titular_nascido_2010,
categoria,
modalidade,
titular_carencia,
dependentes_info
],
outputs=[output_textbox, btn_copiar, status_copia]
)
btn_copiar.click(
None,
None,
status_copia,
js="""
async () => {
const texto = document.getElementById("documentos-output-textbox").querySelector("textarea").value;
try {
await navigator.clipboard.writeText(texto);
return "✅ Copiado para área de transferência!";
} catch (err) {
const textarea = document.createElement('textarea');
textarea.value = texto;
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
return "✅ Copiado (use Ctrl+C se não colar automaticamente)";
}
}
"""
).then(
lambda: gr.update(visible=True),
None,
status_copia
)
btn_limpar.click(
limpar_tudo,
inputs=None,
outputs=[
categoria,
modalidade,
titular_nascido_2010,
titular_carencia,
accordion_titular, # Resetar o accordion do titular (visibilidade)
btn_confirmar_titular, # Torna o botão de confirmar visível novamente
dep_tipo,
dep_nascido_2010,
dep_carencia,
lista_inclusos,
dependentes_info,
output_textbox,
btn_copiar,
status_copia
]
)
btn_confirmar_titular.click(
confirmar_titular,
inputs=None,
outputs=[
categoria,
modalidade,
titular_nascido_2010,
titular_carencia,
btn_confirmar_titular,
accordion_deps
]
)
return app
# Criação e lançamento da interface
app = criar_interface()
app.launch() |