|
|
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) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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-)" |
|
|
|
|
|
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), |
|
|
gr.update(choices=[], interactive=False, value=None), |
|
|
gr.update(value=False, interactive=True), |
|
|
gr.update(value=False, interactive=True), |
|
|
gr.Accordion(open=True), |
|
|
gr.update(visible=True), |
|
|
gr.update(value=None), |
|
|
gr.update(value=False), |
|
|
gr.update(value=False), |
|
|
gr.update(value=[["Titular (2009-)", "PF", ""]]), |
|
|
[], |
|
|
"", |
|
|
gr.update(visible=False), |
|
|
gr.update(visible=False, value="") |
|
|
) |
|
|
|
|
|
def confirmar_titular(): |
|
|
|
|
|
|
|
|
return ( |
|
|
gr.update(interactive=False), |
|
|
gr.update(interactive=False), |
|
|
gr.update(interactive=False), |
|
|
gr.update(interactive=False), |
|
|
gr.update(visible=False), |
|
|
gr.Accordion(open=True) |
|
|
) |
|
|
|
|
|
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, |
|
|
btn_confirmar_titular, |
|
|
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 |
|
|
|
|
|
|
|
|
app = criar_interface() |
|
|
app.launch() |