File size: 10,653 Bytes
1a1e3df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr

# ---- Funções de Cálculo ----

# Função para escala SPICT
def analisar_spict(respostas_spict):
    spict_perguntas = [
        "Internações hospitalares não programadas.",
        "Capacidade funcional ruim ou em declínio (a pessoa passa na cama ou cadeira mais de 50% do dia).",
        "Dependente de outros para cuidados pessoais devido a problemas físicos e/ou mentais (necessita maior suporte do cuidador).",
        "Perda de peso significativa nos últimos 3-6 meses e/ou baixo índice de massa corporal.",
        "Sintomas persistentes apesar do tratamento otimizado das condições de base.",
        "A pessoa ou sua família solicita cuidados paliativos, interrupção ou limitação do tratamento ou um foco na qualidade de vida."
    ]
    
    afirmativas = [p for p, r in zip(spict_perguntas, respostas_spict) if r == 1]
    negativas = [p for p, r in zip(spict_perguntas, respostas_spict) if r == 0]

    texto_afirmativas = "**Itens marcados como 'Sim':**<br>" + ("<br>".join(afirmativas) if afirmativas else "Nenhum")
    texto_negativas = "<br><br>**Itens marcados como 'Não':**<br>" + ("<br>".join(negativas) if negativas else "Nenhum")

    texto_final = (
        f"{texto_afirmativas}{texto_negativas}<br><br>"
        "**Recomendações SPICT:**<br>"
        "Revisar o cuidado atual e planejar o cuidado para o futuro.<br>"
        "- Reavaliar o tratamento atual e medicação para que o paciente receba o cuidado otimizado.<br>"
        "- Considerar o encaminhamento para avaliação de um especialista se os sintomas ou necessidades forem complexos.<br>"
        "- Acordar sobre objetivos do cuidado atual e futuro e planejar o cuidado com a pessoa e sua família.<br>"
        "- Planejar com antecedência caso a pessoa esteja em risco de perda cognitiva.<br>"
        "- Registrar em prontuário, comunicar e coordenar o plano geral de cuidados."
    )

    return texto_final

# Função para escala Zarit
def analisar_zarit(respostas_zarit):
    zarit_score = sum(respostas_zarit)

    if zarit_score <= 14:
        classificacao = "Leve"
    elif zarit_score <= 21:
        classificacao = "Moderada"
    else:
        classificacao = "Grave"

    texto_final = (
        f"**Pontuação total:** {zarit_score}<br>"
        f"**Classificação da sobrecarga:** {classificacao}<br><br>"
        "**Sobre a Escala Zarit:**<br>"
        "Tem por objetivo avaliar a sobrecarga dos cuidadores de idosos. Esta escala **não** deve ser realizada na presença do idoso.<br>"
        "A cada afirmativa o cuidador indica a frequência (nunca, quase nunca, às vezes, frequentemente ou quase sempre).<br>"
        "Não existem respostas certas ou erradas. O estresse dos cuidadores será indicado por altos escores."
    )

    return texto_final

# Função para escala NECPAL
def analisar_necpal(respostas_necpal):
    # perguntas NECPAL para referência
    # Índices para referência interna (0-based):
    # 0 - Pergunta Surpresa
    # 1 - Demanda / necessidade
    # 2,3,4 - Indicadores clínicos gerais (declínio nutricional, funcional, cognitivo)
    # 5 - Dependência grave
    # 6 - Síndromes geriátricas (≥2 recorrentes ou persistentes)
    # 7 - Sintomas persistentes (≥2 sintomas recorrentes ou persistentes)
    # 8 - Sofrimento emocional ou transtorno adaptativo grave (DME≥9)
    # 9 - Vulnerabilidade social grave
    # 10 - Multi-morbilidade (≥2 doenças crônicas avançadas)
    # 11 - Uso de recursos (mais que duas admissões urgentes em 6 meses)
    # 12 - Indicadores específicos (câncer, DPOC, ICC, etc.)

    sum_necpal = sum(respostas_necpal)
    # Pergunta surpresa: se resposta = 1 => PS+ (não me surpreenderia)
    ps = respostas_necpal[0]
    ps_str = "PS+ (Não me surpreenderia se o paciente morresse no próximo ano)" if ps == 1 else "PS- (Me surpreenderia)"
    necpal_str = "NECPAL+" if sum_necpal > 0 else "NECPAL-"

    texto_final = (
        f"**Classificação NECPAL:**<br>"
        f"Pergunta Surpresa: {ps_str}<br>"
        f"Parâmetros NECPAL: {necpal_str}<br><br>"
        "Se PS+ e NECPAL+ => Propor codificação como Paciente com Cronicidade Avançada (PCA)."
    )

    return texto_final


def interface_geral(

    # SPICT (6 questões, Sim/Não)

    # Respostas: 0=Não, 1=Sim

    s1, s2, s3, s4, s5, s6,



    # Zarit (7 questões, escala 0-4, vamos somar +1 depois)

    z1, z2, z3, z4, z5, z6, z7,



    # NECPAL (13 questões, Sim/Não)

    n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13

):

    todos = [s1, s2, s3, s4, s5, s6,
             z1, z2, z3, z4, z5, z6, z7,
             n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13]

    if any(v is None for v in todos):
        return "Erro: Todas as questões devem ser preenchidas."

    for v in todos:
        if not isinstance(v, int):
            return "Erro: Respostas inválidas. Verifique se todos os campos foram preenchidos corretamente."

    # Análise SPICT (questões 1-6)
    spict_respostas = [s1, s2, s3, s4, s5, s6]
    resultado_spict = analisar_spict(spict_respostas)

    # Análise Zarit (questões 7-13)
    zarit_respostas = [z1+1, z2+1, z3+1, z4+1, z5+1, z6+1, z7+1]
    resultado_zarit = analisar_zarit(zarit_respostas)

    # Análise NECPAL (questões 14-26)
    necpal_respostas = [n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13]
    resultado_necpal = analisar_necpal(necpal_respostas)

    resultado_final = (
        "<h3>Resultado da Escala SPICT</h3>"
        f"{resultado_spict}<br><br>"
        "<h3>Resultado da Escala Zarit</h3>"
        f"{resultado_zarit}<br><br>"
        "<h3>Resultado da Escala NECPAL</h3>"
        f"{resultado_necpal}"
    )

    return resultado_final


with gr.Blocks() as demo:
    gr.Markdown("# Ferramenta para Avaliação Completa (SPICT, Zarit, NECPAL)")

    gr.Markdown("Responda as questões a seguir. Ao final, será apresentada uma análise abrangente considerando SPICT, Zarit e NECPAL. Todas as perguntas estão numeradas continuamente para parecer um único questionário.")

    # Lista de perguntas
    # 1-6 SPICT
    perguntas_spict = [
        "Internações hospitalares não programadas?",
        "Capacidade funcional ruim ou em declínio (a pessoa passa na cama ou cadeira mais de 50% do dia)?",
        "Dependência de outros para cuidados pessoais devido a problemas físicos/mentais (necessita maior suporte do cuidador)?",
        "Perda de peso significativa nos últimos 3-6 meses e/ou baixo IMC?",
        "Sintomas persistentes apesar do tratamento otimizado das condições de base?",
        "A pessoa ou família solicita cuidados paliativos, interrupção/limitação do tratamento ou foco na qualidade de vida?"
    ]

    # 7-13 Zarit
    perguntas_zarit = [
        "Sente que, por causa do tempo que utiliza com o seu familiar/doente, já não tem tempo suficiente para você mesmo?",
        "Sente-se estressado/angustiado por ter que cuidar do seu familiar/doente e ao mesmo tempo ser responsável por outras tarefas?",
        "Acha que a situação atual afeta a sua relação com amigos ou outros membros da família de forma negativa?",
        "Sente-se exausto quando tem de estar junto do seu familiar/doente?",
        "Sente que sua saúde tem sido afetada por ter que cuidar do seu familiar/doente?",
        "Sente que tem perdido o controle da sua vida desde que a doença do seu familiar/doente se manifestou?",
        "No geral, sente-se muito sobrecarregado por ter que cuidar do seu familiar/doente?"
    ]

    # 14-26 NECPAL
    perguntas_necpal = [
        "Pergunta Surpresa: Você ficaria surpreso se este paciente morresse ao longo do próximo ano? (Se 'Não ficaria surpreso' => Sim, caso contrário => Não)",
        "Demanda ou necessidade: Houve manifestação explícita ou implícita de limitação de esforço terapêutico ou pedido de atenção paliativa pelo paciente, família ou equipe?",
        "Declínio nutricional: Perda de peso >10% nos últimos 6 meses.",
        "Declínio funcional: Piora do Karnofsky ou Barthel >30%, ou perda de mais que duas Atividades Básicas da Vida Diária (ABVDs).",
        "Declínio cognitivo: Perda ≥5 no Minimental ou ≥3 no Pfeiffer indicando deterioração cognitiva.",
        "Dependência grave: Karnofsky <50 ou Barthel <20.",
        "Síndromes geriátricas: Lesão por pressão, infecções de repetição, delirium, disfagia, quedas. ≥2 sintomas recorrentes/persistentes.",
        "Sintomas persistentes: Dor, cansaço, náusea, depressão, ansiedade, sonolência, inapetência, mal-estar, dispneia, insônia. ≥2 sintomas (ESAS) recorrentes ou persistentes.",
        "Sofrimento emocional ou transtorno adaptativo grave: Detecção de mal-estar emocional (DME ≥9).",
        "Vulnerabilidade social grave: Avaliação social e familiar indicando fragilidade social significativa.",
        "Multi-morbilidade: ≥2 doenças ou condições crônicas avançadas (Ex: Câncer, DPOC, ICC, insuficiência hepática, renal, AVC, demência, neurodegenerativas, SIDA).",
        "Uso de recursos: Mais que duas admissões urgentes (não programadas) em 6 meses, aumento da demanda de intervenções.",
        "Indicadores específicos: Presença de condições avançadas que reforçam a complexidade do caso (Câncer, DPOC, ICC, etc.)."
    ]

    perguntas = perguntas_spict + perguntas_zarit + perguntas_necpal

    inputs = []
    numero = 1
    # 1-6: SPICT (0=Não, 1=Sim)
    for p in perguntas_spict:
        gr.Markdown(f"**{numero}. {p}**")
        inputs.append(gr.Radio(choices=[0,1], label="Selecione: 0=Não, 1=Sim"))
        numero += 1

    # 7-13: Zarit (0-4, representando Nunca(0), Quase nunca(1), Às vezes(2), Frequentemente(3), Quase sempre(4))
    for p in perguntas_zarit:
        gr.Markdown(f"**{numero}. {p}**<br>(0 - Nunca, 1 - Quase nunca, 2 - Às vezes, 3 - Frequentemente, 4 - Quase sempre)")
        inputs.append(gr.Slider(minimum=0, maximum=4, step=1))
        numero += 1


    # 14-26: NECPAL (0=Não, 1=Sim)
    for p in perguntas_necpal:
        gr.Markdown(f"**{numero}. {p}**")
        inputs.append(gr.Radio(choices=[0,1], label="Selecione: 0=Não, 1=Sim"))
        numero += 1

    calcular_btn = gr.Button("Calcular Avaliação Completa")
    resultado_output = gr.HTML()

    calcular_btn.click(
        interface_geral, 
        inputs, 
        resultado_output
    )

demo.launch(share=True)