gbope commited on
Commit
51c41ab
·
verified ·
1 Parent(s): 789fef9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +193 -90
app.py CHANGED
@@ -1,4 +1,6 @@
1
  import gradio as gr
 
 
2
 
3
  def obter_documentos_padrao_2010_mais():
4
  return [
@@ -21,10 +23,10 @@ def obter_documentos_carencia():
21
  return [
22
  "3 últimos boletos pagos e seus comprovantes",
23
  "Carteirinha",
24
- "Carta de permanência (solicitar à administradora do seu plano)"
25
  ]
26
 
27
- def obter_documentos_titular(categoria, modalidade, documentos_padrao, incluir_carencia):
28
  documentos = documentos_padrao.copy()
29
  documentos.append("Comprovante de Residência (no nome do titular ou dos pais)")
30
 
@@ -36,18 +38,16 @@ def obter_documentos_titular(categoria, modalidade, documentos_padrao, incluir_c
36
  documentos.extend(["CNPJ", "Contrato Social e suas alterações"])
37
 
38
  elif categoria == "ADESAO":
39
- if modalidade != "ENTIDADE ABERTA":
40
- documentos_map = {
41
- "ESTUDANTE": "Declaração Escolar",
42
- "TRABALHADOR": "Contracheque",
43
- "PROFISSIONAL LIBERAL": "Documento de Registro no Conselho na validade + Diploma",
44
- "APOSENTADO": "Comprovante de Pensão"
45
- }
46
- documentos.append(documentos_map.get(modalidade, "Modalidade inválida!"))
47
-
48
- if incluir_carencia:
49
- documentos.append("\nDocumentação para Compra de Carência:")
50
- documentos.extend(obter_documentos_carencia())
51
 
52
  return documentos
53
 
@@ -70,7 +70,17 @@ def simplificar_dependente(nome):
70
  }
71
  return simplificacoes.get(nome, nome)
72
 
73
- def obter_documentos_dependente(dependente, nascido_2010, incluir_carencia):
 
 
 
 
 
 
 
 
 
 
74
  documentos = obter_documentos_padrao_2010_mais() if nascido_2010 else obter_documentos_padrao_2009_menos()
75
 
76
  if dependente == "Cônjuge ou companheiro(a)":
@@ -84,86 +94,179 @@ def obter_documentos_dependente(dependente, nascido_2010, incluir_carencia):
84
  elif dependente == "Sogro(a)":
85
  documentos.append("Certidão de casamento do titular")
86
 
87
- if incluir_carencia:
88
- documentos.append("\nDocumentação para Compra de Carência:")
89
- documentos.extend(obter_documentos_carencia())
90
-
91
  return documentos
92
 
93
- def imprimir_documentos(nome, documentos):
94
- resultado = f"\nDocumentos necessários para {nome}:\n"
95
- for doc in documentos:
96
- if doc == "DA EMPRESA:" or "Documentação para Compra de Carência" in doc:
97
- resultado += f"\n{doc}\n"
98
- else:
99
- resultado += f"- {doc}\n"
100
- return resultado
101
-
102
- def gerar_documentos(titular_nascido_2010_mais, categoria, modalidade, compra_carencia_titular,
103
- nomes_dependentes, nascido_2010_dependentes, compra_carencia_dependentes):
104
 
105
- documentos_padrao_titular = obter_documentos_padrao_2010_mais() if titular_nascido_2010_mais else obter_documentos_padrao_2009_menos()
106
- incluir_carencia_titular = compra_carencia_titular
107
-
108
- resultado = ""
109
- documentos_titular = obter_documentos_titular(categoria, modalidade, documentos_padrao_titular, incluir_carencia_titular)
110
- resultado += imprimir_documentos("TITULAR", documentos_titular)
111
-
112
- # Prepara lista de dependentes válidos
113
- dependentes = []
114
- for i in range(len(nomes_dependentes)):
115
- nome = nomes_dependentes[i].strip()
116
- if nome == "":
117
- continue
118
- dependentes.append((nome, nascido_2010_dependentes[i], compra_carencia_dependentes[i]))
119
-
120
- if dependentes:
121
- carencia_flags = [d[2] for d in dependentes]
122
- if all(carencia_flags):
123
- # Todos compram carência
124
- documentos_todos = []
125
- for dep, nascido_2010, _ in dependentes:
126
- documentos_todos.extend(obter_documentos_dependente(dep, nascido_2010, incluir_carencia=True))
127
- resultado += imprimir_documentos("Dependentes: TODOS", documentos_todos)
128
- else:
129
- # Individual
130
- for dep, nascido_2010, carencia in dependentes:
131
- if carencia:
132
- documentos_dep = obter_documentos_dependente(dep, nascido_2010, incluir_carencia=True)
133
- nome_simplificado = simplificar_dependente(dep)
134
- resultado += imprimir_documentos(f"Dependente: {nome_simplificado}", documentos_dep)
135
-
136
- return resultado
137
-
138
-
139
- with gr.Blocks() as demo:
140
- gr.Markdown("### Gerador de Documentos Saúde")
141
-
142
- titular_nascido_2010_mais = gr.Checkbox(label="Titular nasceu em 2010 ou depois?")
143
- categoria = gr.Dropdown(label="Categoria", choices=["CPF", "CNPJ", "ADESAO"], value="CPF")
144
- modalidade = gr.Dropdown(label="Modalidade", choices=["MEI", "OUTROS", "ESTUDANTE", "TRABALHADOR", "PROFISSIONAL LIBERAL", "APOSENTADO", "ENTIDADE ABERTA"], value="MEI")
145
- compra_carencia_titular = gr.Checkbox(label="Compra carência - Titular?")
146
-
147
- gr.Markdown("### Dependentes (até 5)")
148
 
149
- nomes_dependentes = []
150
- nascido_2010_dependentes = []
151
- compra_carencia_dependentes = []
 
 
 
152
 
153
- for i in range(5):
154
- nomes_dependentes.append(gr.Textbox(label=f"Nome dependente {i+1}"))
155
- nascido_2010_dependentes.append(gr.Checkbox(label=f"Dependente {i+1} nasceu em 2010 ou depois?"))
156
- compra_carencia_dependentes.append(gr.Checkbox(label=f"Dependente {i+1} compra carência?"))
 
 
 
 
 
 
157
 
158
- btn_gerar = gr.Button("Gerar documentos")
159
- output = gr.Textbox(label="Resultado", lines=30)
 
 
 
 
 
 
 
 
 
160
 
161
- btn_gerar.click(
162
- gerar_documentos,
163
- inputs=[titular_nascido_2010_mais, categoria, modalidade, compra_carencia_titular,
164
- nomes_dependentes, nascido_2010_dependentes, compra_carencia_dependentes],
165
- outputs=output
166
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
 
168
- if __name__ == "__main__":
169
- demo.launch()
 
 
1
  import gradio as gr
2
+ import pyperclip
3
+ import re
4
 
5
  def obter_documentos_padrao_2010_mais():
6
  return [
 
23
  return [
24
  "3 últimos boletos pagos e seus comprovantes",
25
  "Carteirinha",
26
+ "Carta de permanência (solicitar à administradora do plano, geralmente por ligação)"
27
  ]
28
 
29
+ def obter_documentos_titular(categoria, modalidade, documentos_padrao):
30
  documentos = documentos_padrao.copy()
31
  documentos.append("Comprovante de Residência (no nome do titular ou dos pais)")
32
 
 
38
  documentos.extend(["CNPJ", "Contrato Social e suas alterações"])
39
 
40
  elif categoria == "ADESAO":
41
+ documentos_map = {
42
+ "ENTIDADE ABERTA": None,
43
+ "ESTUDANTE": "Declaração Escolar",
44
+ "TRABALHADOR": "Contracheque",
45
+ "PROFISSIONAL LIBERAL": "Documento de Registro no Conselho na validade + Diploma",
46
+ "APOSENTADO": "Comprovante de Pensão"
47
+ }
48
+ doc_extra = documentos_map.get(modalidade)
49
+ if doc_extra:
50
+ documentos.append(doc_extra)
 
 
51
 
52
  return documentos
53
 
 
70
  }
71
  return simplificacoes.get(nome, nome)
72
 
73
+ def formatar_documentos(nome, documentos):
74
+ resultado = f"<h3>Documentos necessários para {nome}:</h3><ul>"
75
+ for doc in documentos:
76
+ if doc == "DA EMPRESA:":
77
+ resultado += f"</ul><h4>{doc}</h4><ul>"
78
+ else:
79
+ resultado += f"<li>{doc}</li>"
80
+ resultado += "</ul>"
81
+ return resultado
82
+
83
+ def obter_documentos_dependente(dependente, nascido_2010):
84
  documentos = obter_documentos_padrao_2010_mais() if nascido_2010 else obter_documentos_padrao_2009_menos()
85
 
86
  if dependente == "Cônjuge ou companheiro(a)":
 
94
  elif dependente == "Sogro(a)":
95
  documentos.append("Certidão de casamento do titular")
96
 
 
 
 
 
97
  return documentos
98
 
99
+ def atualizar_lista_inclusos(titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info):
100
+ lista_inclusos = []
 
 
 
 
 
 
 
 
 
101
 
102
+ # Adiciona titular
103
+ tipo_titular = "Titular (2010+)" if titular_nascido_2010 else "Titular (2009-)"
104
+ if titular_carencia:
105
+ tipo_titular += " + carência"
106
+ lista_inclusos.append([tipo_titular, categoria, modalidade if modalidade else "PF"])
107
+
108
+ # Adiciona dependentes
109
+ if dependentes_info:
110
+ for dep_info in dependentes_info:
111
+ dep_nascido_2010, dep_tipo, dep_carencia = dep_info
112
+ tipo_dep = f"Dep. {simplificar_dependente(dep_tipo)} (2010+)" if dep_nascido_2010 else f"Dep. {simplificar_dependente(dep_tipo)} (2009-)"
113
+ if dep_carencia:
114
+ tipo_dep += " + carência"
115
+ lista_inclusos.append([tipo_dep, "Dependente", dep_tipo])
116
+
117
+ return lista_inclusos
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
 
119
+ def limpar_texto_para_copiar(texto):
120
+ # Remove tags HTML para ter um texto limpo
121
+ texto_limpo = re.sub('<[^<]+?>', '', texto)
122
+ texto_limpo = texto_limpo.replace('</ul>', '\n').replace('</li>', '\n')
123
+ texto_limpo = re.sub('\n+', '\n', texto_limpo).strip()
124
+ return texto_limpo
125
 
126
+ def copiar_para_area_transferencia(texto):
127
+ try:
128
+ if not texto:
129
+ return " Nada para copiar - gere a lista primeiro"
130
+
131
+ texto_limpo = limpar_texto_para_copiar(texto)
132
+ pyperclip.copy(texto_limpo)
133
+ return "✅ Copiado para área de transferência!"
134
+ except Exception as e:
135
+ return f"❌ Erro ao copiar: {str(e)}"
136
 
137
+ def atualizar_modalidades(categoria):
138
+ if categoria == "CNPJ":
139
+ return gr.Dropdown(choices=["MEI", "OUTROS"], label="Modalidade CNPJ", interactive=True)
140
+ elif categoria == "ADESAO":
141
+ return gr.Dropdown(
142
+ choices=["ENTIDADE ABERTA", "ESTUDANTE", "TRABALHADOR", "PROFISSIONAL LIBERAL", "APOSENTADO"],
143
+ label="Modalidade Adesão",
144
+ interactive=True
145
+ )
146
+ else:
147
+ return gr.Dropdown(choices=[], label="Modalidade (não aplicável)", interactive=False)
148
 
149
+ def criar_interface():
150
+ with gr.Blocks(title="Documentos para Plano de Saúde", theme=gr.themes.Soft()) as app:
151
+ gr.Markdown("# 📋 Documentos Necessários para Plano de Saúde")
152
+ gr.Markdown("Preencha os dados abaixo para obter a lista de documentos necessários.")
153
+
154
+ with gr.Row():
155
+ with gr.Column():
156
+ # Seção do Titular
157
+ with gr.Group():
158
+ gr.Markdown("### Titular")
159
+ categoria = gr.Radio(
160
+ choices=["PF", "CNPJ", "ADESAO"],
161
+ label="Categoria do Titular",
162
+ value="PF"
163
+ )
164
+ modalidade = gr.Dropdown(
165
+ choices=[],
166
+ label="Modalidade (se aplicável)",
167
+ interactive=False
168
+ )
169
+ with gr.Row():
170
+ titular_nascido_2010 = gr.Checkbox(label="Nasceu em 2010 ou depois?")
171
+ titular_carencia = gr.Checkbox(label="Fará compra de carência?")
172
+
173
+ # Seção de Dependentes
174
+ with gr.Accordion("Adicionar Dependentes", open=True) as accordion_deps:
175
+ with gr.Group():
176
+ gr.Markdown("### Novo Dependente")
177
+ dep_tipo = gr.Dropdown(
178
+ choices=[
179
+ "Cônjuge ou companheiro(a)",
180
+ "Filhos(as) solteiros naturais, tutelados, enteados e adotivos",
181
+ "Filhos(as) inválidos declarados no imposto de renda do titular",
182
+ "Pai e mãe",
183
+ "Padrasto e madrasta",
184
+ "Irmãos(ãs) consanguíneos ou adotivos",
185
+ "Netos",
186
+ "Sobrinhos",
187
+ "Primos",
188
+ "Tios",
189
+ "Cunhados(as)",
190
+ "Sogro(a)",
191
+ "Genros e noras",
192
+ "Avô e avó"
193
+ ],
194
+ label="Tipo de Dependente"
195
+ )
196
+ with gr.Row():
197
+ dep_nascido_2010 = gr.Checkbox(label="Nasceu em 2010 ou depois?")
198
+ dep_carencia = gr.Checkbox(label="Fará compra de carência?")
199
+ btn_adicionar_dep = gr.Button("➕ Adicionar Dependente", variant="primary")
200
+
201
+ lista_inclusos = gr.Dataframe(
202
+ headers=["Inclusos nessa cotação", "Tipo", "Detalhes"],
203
+ datatype=["str", "str", "str"],
204
+ interactive=False,
205
+ label="Inclusos nessa cotação",
206
+ value=[["Titular (2009-)", "PF", ""]]
207
+ )
208
+ dependentes_info = gr.State([])
209
+
210
+ btn_submit = gr.Button("🔍 Gerar Lista de Documentos", variant="primary")
211
+
212
+ with gr.Column():
213
+ output = gr.HTML(label="Documentos Necessários")
214
+ btn_copiar = gr.Button("📋 Copiar Lista")
215
+ status_copia = gr.Textbox(label="Status", interactive=False, visible=False)
216
+
217
+ # Atualiza modalidades quando categoria muda
218
+ categoria.change(
219
+ atualizar_modalidades,
220
+ inputs=categoria,
221
+ outputs=modalidade
222
+ )
223
+
224
+ # Atualiza lista de inclusos em tempo real
225
+ inputs_lista = [titular_nascido_2010, categoria, modalidade, titular_carencia, dependentes_info]
226
+ for input_component in inputs_lista:
227
+ input_component.change(
228
+ atualizar_lista_inclusos,
229
+ inputs=inputs_lista,
230
+ outputs=lista_inclusos
231
+ )
232
+
233
+ # Adiciona dependentes à lista
234
+ btn_adicionar_dep.click(
235
+ lambda dep_info, dep_nasc, dep_tipo, dep_carencia: (dep_info + [(dep_nasc, dep_tipo, dep_carencia)]),
236
+ inputs=[dependentes_info, dep_nascido_2010, dep_tipo, dep_carencia],
237
+ outputs=dependentes_info
238
+ ).then(
239
+ atualizar_lista_inclusos,
240
+ inputs=inputs_lista,
241
+ outputs=lista_inclusos
242
+ )
243
+
244
+ # Processa o formulário
245
+ btn_submit.click(
246
+ processar_documentos,
247
+ inputs=[
248
+ titular_nascido_2010,
249
+ categoria,
250
+ modalidade,
251
+ titular_carencia,
252
+ dependentes_info
253
+ ],
254
+ outputs=output
255
+ )
256
+
257
+ # Copia para área de transferência
258
+ btn_copiar.click(
259
+ copiar_para_area_transferencia,
260
+ inputs=output,
261
+ outputs=status_copia
262
+ ).then(
263
+ lambda: gr.update(visible=True),
264
+ None,
265
+ status_copia
266
+ )
267
+
268
+ return app
269
 
270
+ # Criar e lançar a interface
271
+ interface = criar_interface()
272
+ interface.launch()