| 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() |