🎓 Documentação do meuAgente
Visão geral
O meuAgente é o hub de trabalho pessoal do Flávio: um lugar só para organizar as várias organizações em que atua, acompanhar projetos, agenda, e-mails e finanças — com um assistente de IA que lê os dados, avisa o que importa e executa ações.
Fluxo pensado para o dia a dia: entrar → bater o olho no briefing e nos alertas → saber o norte → agir (pelas telas ou falando com o assistente).
Módulos
🏢 Organizações (ambientes)
Cada empresa/contexto é uma organização. Tudo no app é escopado por ela.
- O seletor no topo troca o ambiente atual (guardado na sessão). O padrão ao entrar é Grupo Orletti.
- Dentro de uma organização você só vê os dados dela (mais itens sem organização). A visão cruzada fica no Painel (ver todos).
- Cada org tem cor, logo, cargo e um tipo (Empresa ou Pessoal) que define o plano de categorias do financeiro.
- O módulo Financeiro é ligado/desligado por organização.
📁 Projetos → Etapas → Tarefas
A hierarquia de trabalho. Etapas medem o andamento; tarefas são as ações datadas.
- Projeto pertence a uma organização e pode ter um Tipo (Desenvolvimento, Implantação, Treinamento, Reimplantação) que já cria as etapas padrão.
- Etapa é a fase do projeto, exibida num quadro Kanban (A fazer / Em andamento / Bloqueada / Concluída) com arrastar e soltar.
- O % de andamento do projeto = etapas concluídas ÷ total de etapas.
- Tarefa é a ação a fazer: fica dentro de uma etapa ou é avulsa. Tem data, hora, prioridade e responsáveis.
- Tarefa com data aparece na Agenda e no Calendário; com data + hora, também pode virar evento na sua agenda do Google/Outlook.
📅 Agenda e Calendário
O que fazer hoje e nos próximos dias, com conflitos de horário.
- Ao entrar numa organização, o topo mostra a Agenda — próximos dias (atrasadas + agrupadas por dia).
- O Calendário mensal mostra as tarefas e, quando as agendas estão conectadas, também as reuniões reais do Google/Outlook (coloridas por organização).
- Ao agendar algo com hora, o assistente avisa conflitos considerando tarefas de todas as organizações e as reuniões reais.
✉️ E-mails (Gmail, Outlook e IMAP)
Lê as caixas, classifica por IA e transforma e-mail em tarefa ou lançamento financeiro.
- Cada organização pode ter várias contas: Gmail (OAuth, leitura), Outlook/Microsoft (OAuth via Graph, lê e envia) e IMAP/SMTP (qualquer provedor, lê e envia).
- A IA classifica cada e-mail (cobrança, família, compras, assinaturas, trabalho, newsletter…), gera um resumo curto e extrai o vencimento de boletos. Sem chave de IA, usa regras por palavra-chave.
- O leitor interno abre o corpo do e-mail dentro do app (Gmail, Outlook e IMAP).
- Botões: 📅 virar tarefa (vai para a agenda) e 💰 virar financeiro (cria o lançamento, com anexo).
💰 Financeiro
Contas a pagar/receber, cartões, contas bancárias, reembolsos e posição do mês.
- Habilitado por organização. As categorias mudam conforme o tipo: Empresa (Faturamento, Folha, Impostos, Ocupação…) ou Pessoal (Moradia, Mobilidade, Alimentação…), cada uma com subcategorias.
- Lançamento pode ser avulso, parcelado (gera uma linha por parcela) ou fixo/recorrente (gera mês a mês entre início e fim).
- Registra forma de pagamento, de onde saiu (conta bancária), cartão, fornecedor e anexo (nota/cupom/comprovante).
- Reembolsável: marca quem reembolsa; o valor entra em A receber e não conta como gasto seu. Ao dar baixa, lança automaticamente a receita correspondente.
- Cartões: limite, dia de fechamento e vencimento, com usado / disponível. Contas bancárias: saldo e saldo projetado (saldo − contas em aberto).
- IA no comprovante: envie a foto/PDF e ela extrai valor, data, fornecedor e categoria.
- A tela mostra a posição do mês: a pagar, pago, gasto líquido, a receber, receitas e vencidas, além do gasto por categoria.
🤖 Assistente (IA) e voz
Conversa que lê seus dados e executa ações — por texto ou por voz.
- Usa o Claude com ferramentas: ele consulta seus dados e age no banco.
- Pergunte: “quais minhas ações para hoje?”, “como estão os projetos e percentuais?”, “tenho contas vencendo?”.
- Mande fazer: “crie um projeto de Implantação na FLS com as etapas padrão”, “agende reunião amanhã às 15h” (avisa conflito e cria o evento na agenda).
- Voz: microfone (fala → texto → envia), leitura das respostas em voz alta e escuta contínua com a palavra de ativação “meuAgente”.
- Briefing do dia: ao entrar numa organização, a IA resume o seu “norte” — contas vencidas primeiro, depois tarefas, prazos e projetos travados. Fica em cache por dia.
🩺 Saúde
Acompanhamento de saúde da família: remédios, medições, exames e consultas.
- Habilitado por organização (mesmo padrão do Financeiro). Cada pessoa acompanhada é um perfil, então dá para cuidar da família toda.
- Medicamentos com horários e frequência, registro de doses tomadas/puladas, adesão dos últimos 30 dias e estoque que desconta a cada dose.
- Medições (pressão, glicemia, peso e outras) com faixas de referência: a glicemia é avaliada pelo contexto (jejum/pós-prandial) e a pressão pela pior entre sistólica e diastólica. Metas do médico substituem a faixa geral.
- Jornada de exames: envie as folhas de pedido, a IA separa exame por exame (preparo, motivo, urgência) e cada um segue a esteira pendente → agendado → realizado → resultado → analisado. Ao anexar um resultado, ele é casado automaticamente com o pedido.
- O plano mostra a sequência de idas agrupada por preparo (ex.: tudo que é em jejum no mesmo dia), o que já voltou, o que falta e o que conversar com o médico.
- Consultas viram tarefa na agenda. Há ainda registro de refeições e atividades.
- Regra de segurança: a IA explica e organiza, mas nunca diagnostica nem prescreve — essa instrução vai em todos os prompts.
💾 Backup
Cópia do banco e do código, local e no Google Drive.
- Gera dump do PostgreSQL + tar do código, com retenção e envio opcional ao Google Drive.
- Roda automaticamente no primeiro acesso do dia (desligável por
BACKUP_ON_ENTRY=0) e tem tela própria em /backup.
Stack e decisões técnicas
| Backend | Python 3.13 + Flask (app factory + blueprints) |
|---|---|
| Banco | PostgreSQL 17 via SQLAlchemy (psycopg3) |
| IA | Anthropic Claude — classificação de e-mail, briefing, assistente com ferramentas e leitura de comprovantes |
| Gmail API (OAuth), Microsoft Graph (OAuth) e IMAP/SMTP | |
| Agenda | Google Calendar API e Microsoft Graph (ler e criar eventos) |
| Front | Jinja2 + CSS próprio (visual estilo Google, degradê azul→preto), Web Speech API para voz |
| Porta | 5001 (a 5000 é usada pelo AirPlay no macOS) |
Rotas (125)
Todas as URLs do app, com método HTTP, parâmetros e o que fazem.
/backup — 5 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /backup/ |
— | — |
| POST | /backup/executar |
— | — |
| GET | /backup/google/callback |
— | — |
| GET | /backup/google/conectar |
— | — |
| POST | /backup/google/desconectar |
— | — |
/chat — 3 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /chat/ |
— | — |
| POST | /chat/clear |
— | — |
| POST | /chat/send |
— | — |
/docs — 1 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /docs/ |
— | — |
/documentos — 11 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /documentos/ |
— | — |
| GET | /documentos/<int:doc_id> |
doc_id |
— |
| POST | /documentos/<int:doc_id>/analisar |
doc_id |
— |
| GET | /documentos/<int:doc_id>/arquivo |
doc_id |
Serve o arquivo do disco (fora de static). |
| POST | /documentos/<int:doc_id>/delete |
doc_id |
— |
| POST | /documentos/<int:doc_id>/edit |
doc_id |
— |
| POST | /documentos/<int:doc_id>/mover |
doc_id |
Atalho para arrastar um documento para outra categoria (usado no painel). |
| POST | /documentos/categoria/<int:cat_id>/delete |
cat_id |
— |
| POST | /documentos/categoria/<int:cat_id>/edit |
cat_id |
— |
| POST | /documentos/categoria/new |
— | — |
| POST | /documentos/upload |
— | Recebe 1+ arquivos, salva na pasta 'A organizar' e (se pedido) manda a IA |
/emails — 12 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /emails/ |
— | — |
| POST | /emails/<int:account_id>/disconnect |
account_id |
— |
| POST | /emails/<int:msg_id>/to-tarefa |
msg_id |
— |
| GET | /emails/<int:msg_id>/view |
msg_id |
— |
| GET | /emails/callback |
— | — |
| GET | /emails/connect |
— | — |
| GETPOST | /emails/imap/new |
— | — |
| GET | /emails/outlook/callback |
— | — |
| GET | /emails/outlook/connect |
— | — |
| GET | /emails/reclassify |
— | — |
| POST | /emails/send |
— | — |
| GET | /emails/sync |
— | — |
/etapas — 5 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /etapas/<int:etapa_id> |
etapa_id |
— |
| POST | /etapas/<int:etapa_id>/delete |
etapa_id |
— |
| POST | /etapas/<int:etapa_id>/edit |
etapa_id |
— |
| POST | /etapas/<int:etapa_id>/status |
etapa_id |
— |
| POST | /etapas/new |
— | — |
/financeiro — 15 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /financeiro/ |
— | — |
| POST | /financeiro/<int:lanc_id>/delete |
lanc_id |
— |
| POST | /financeiro/<int:lanc_id>/edit |
lanc_id |
— |
| POST | /financeiro/<int:lanc_id>/pagar |
lanc_id |
— |
| POST | /financeiro/<int:lanc_id>/reembolsado |
lanc_id |
Dá baixa no reembolso: marca como recebido e lança a entrada (receita). |
| POST | /financeiro/cartao/<int:cartao_id>/delete |
cartao_id |
— |
| POST | /financeiro/cartao/<int:cartao_id>/edit |
cartao_id |
— |
| POST | /financeiro/cartao/new |
— | — |
| POST | /financeiro/conta/<int:conta_id>/delete |
conta_id |
— |
| POST | /financeiro/conta/<int:conta_id>/edit |
conta_id |
— |
| POST | /financeiro/conta/new |
— | — |
| POST | /financeiro/extrair |
— | Recebe um arquivo e devolve os dados extraídos (para pré-preencher). |
| GET | /financeiro/lancamento/<int:lanc_id> |
lanc_id |
— |
| POST | /financeiro/lancamento/<int:lanc_id>/anexo |
lanc_id |
Anexa (ou troca) o arquivo de um lançamento existente. |
| POST | /financeiro/novo |
— | — |
/main — 4 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | / |
— | Entrada do app: abre direto no ambiente atual — padrão Grupo Orletti. |
| GET | /calendario |
— | Calendário mensal — mostra TODAS as organizações para evitar conflitos. |
| GET | /env/<int:org_id> |
org_id |
— |
| GET | /painel |
— | — |
/orgs — 5 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /orgs/<int:org_id> |
org_id |
— |
| GET | /orgs/<int:org_id>/briefing |
org_id |
— |
| POST | /orgs/<int:org_id>/delete |
org_id |
— |
| POST | /orgs/<int:org_id>/edit |
org_id |
— |
| POST | /orgs/new |
— | — |
/people — 4 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /people/ |
— | — |
| POST | /people/<int:person_id>/delete |
person_id |
— |
| POST | /people/<int:person_id>/edit |
person_id |
— |
| POST | /people/new |
— | — |
/project_types — 4 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /tipos/ |
— | — |
| POST | /tipos/<int:type_id>/delete |
type_id |
— |
| POST | /tipos/<int:type_id>/edit |
type_id |
— |
| POST | /tipos/new |
— | — |
/projects — 4 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /projects/<int:project_id> |
project_id |
— |
| POST | /projects/<int:project_id>/delete |
project_id |
— |
| POST | /projects/<int:project_id>/edit |
project_id |
— |
| POST | /projects/new |
— | — |
/saude — 45 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /saude/ |
— | — |
| GET | /saude/alimentacao |
— | — |
| GET | /saude/analise |
— | Panorama da IA (cacheado por dia; ?refresh=1 regera). |
| POST | /saude/atividade/<int:ativ_id>/delete |
ativ_id |
— |
| POST | /saude/atividade/new |
— | — |
| POST | /saude/condicao/<int:cond_id>/delete |
cond_id |
— |
| POST | /saude/condicao/<int:cond_id>/edit |
cond_id |
— |
| POST | /saude/condicao/new |
— | — |
| POST | /saude/consulta/<int:consulta_id>/delete |
consulta_id |
— |
| POST | /saude/consulta/<int:consulta_id>/edit |
consulta_id |
— |
| POST | /saude/consulta/new |
— | — |
| GET | /saude/consultas |
— | — |
| POST | /saude/dose |
— | Marca/desmarca uma dose (tomada ou pulada). Chamado por fetch no painel. |
| GET | /saude/dossie |
— | O dossiê em texto puro — útil para levar impresso ao médico. |
| GET | /saude/exame/<int:exame_id> |
exame_id |
— |
| POST | /saude/exame/<int:exame_id>/analisar |
exame_id |
Manda o anexo para a IA ler: transcreve os itens, resume e alerta. |
| POST | /saude/exame/<int:exame_id>/delete |
exame_id |
— |
| POST | /saude/exame/<int:exame_id>/edit |
exame_id |
— |
| POST | /saude/exame/<int:exame_id>/item/<int:item_id>/monitorar |
exame_id item_id |
Joga um analito do exame para o monitoramento, virando ponto no gráfico. |
| POST | /saude/exame/new |
— | Aceita várias folhas de uma vez — cada arquivo vira um exame. |
| GET | /saude/exames |
— | — |
| POST | /saude/item/<int:item_id>/status |
item_id |
Anda (ou volta) a esteira de um exame pedido. |
| GET | /saude/jornada |
— | A esteira dos exames pedidos, agrupada por tipo de ida. |
| POST | /saude/jornada/casar |
— | Reprocessa o casamento entre resultados já anexados e exames pedidos. |
| GET | /saude/medicamento/<int:med_id> |
med_id |
— |
| POST | /saude/medicamento/<int:med_id>/delete |
med_id |
— |
| POST | /saude/medicamento/<int:med_id>/edit |
med_id |
— |
| POST | /saude/medicamento/<int:med_id>/estoque |
med_id |
Repor a caixa: soma (ou define) a quantidade em casa. |
| POST | /saude/medicamento/<int:med_id>/toggle |
med_id |
— |
| POST | /saude/medicamento/new |
— | — |
| POST | /saude/medicao/<int:med_id>/delete |
med_id |
— |
| POST | /saude/medicao/new |
— | — |
| GET | /saude/medicoes |
— | Histórico de um tipo, com gráfico e estatísticas. |
| POST | /saude/meta/<int:meta_id>/delete |
meta_id |
— |
| POST | /saude/meta/new |
— | — |
| POST | /saude/perfil/<int:perfil_id>/delete |
perfil_id |
— |
| POST | /saude/perfil/<int:perfil_id>/edit |
perfil_id |
— |
| GET | /saude/perfil/<int:perfil_id>/focar |
perfil_id |
— |
| POST | /saude/perfil/new |
— | — |
| POST | /saude/pergunta/<int:pergunta_id>/delete |
pergunta_id |
— |
| POST | /saude/pergunta/<int:pergunta_id>/responder |
pergunta_id |
— |
| POST | /saude/plano |
— | Gera (ou regera) o plano da jornada de exames. |
| POST | /saude/refeicao/<int:ref_id>/analisar |
ref_id |
— |
| POST | /saude/refeicao/<int:ref_id>/delete |
ref_id |
— |
| POST | /saude/refeicao/new |
— | — |
/tarefas — 7 rota(s)
| Método | URL | Parâmetros | O que faz |
|---|---|---|---|
| GET | /tarefas/ |
— | — |
| GET | /tarefas/<int:tarefa_id> |
tarefa_id |
— |
| POST | /tarefas/<int:tarefa_id>/delete |
tarefa_id |
— |
| POST | /tarefas/<int:tarefa_id>/edit |
tarefa_id |
— |
| POST | /tarefas/<int:tarefa_id>/schedule |
tarefa_id |
Agendar/reagendar rapidamente uma tarefa para uma data. |
| POST | /tarefas/<int:tarefa_id>/toggle |
tarefa_id |
— |
| POST | /tarefas/new |
— | — |
Modelos de dados (30)
Cada tabela, suas colunas, tipos, chaves, relações e campos calculados.
AnaliseSaude · tabela analises_saude
Panorama gerado pela IA (cacheado por dia, igual ao Briefing).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
dia |
DATE | obrigatório |
conteudo |
TEXT | |
created_at |
DATETIME |
perfil → PerfilSaude
dados
Atividade · tabela atividades_fisicas
Exercício físico — parte do tratamento de diabetes e hipertensão.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
tipo |
VARCHAR(20) | |
data |
DATE | obrigatório |
duracao_min |
INTEGER | |
intensidade |
VARCHAR(20) | |
calorias |
INTEGER | |
notas |
TEXT | |
created_at |
DATETIME |
perfil → PerfilSaude
intensidade_labeltipo_label
Briefing · tabela briefings
Resumo diário (IA) por organização — o 'norte do dia'.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
organization_id |
INTEGER | FK → organizations.id obrigatório |
day |
DATE | obrigatório |
content |
TEXT | |
created_at |
DATETIME |
organization → Organization
Cartao · tabela cartoes
Cartão de crédito — limite, fechamento e vencimento.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
organization_id |
INTEGER | FK → organizations.id obrigatório |
nome |
VARCHAR(120) | obrigatório |
limite |
NUMERIC(12, 2) | |
dia_fechamento |
INTEGER | |
dia_vencimento |
INTEGER | |
cor |
VARCHAR(7) | |
created_at |
DATETIME |
organization → Organization lancamentos → Lancamento
disponivel_flimite_fusado_f
CategoriaDocumento · tabela categorias_documento
Uma pasta de documentos. Vira uma pasta de verdade no disco.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
organization_id |
INTEGER | FK → organizations.id obrigatório |
nome |
VARCHAR(120) | obrigatório |
pasta |
VARCHAR(120) | obrigatório |
icone |
VARCHAR(8) | |
descricao |
VARCHAR(300) | |
criada_pela_ia |
BOOLEAN | |
created_at |
DATETIME |
organization → Organization documentos → Documento
total
ChatMessage · tabela chat_messages
Histórico de conversa com o assistente (agente IA).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
role |
VARCHAR(20) | obrigatório |
content |
TEXT | obrigatório |
actions |
TEXT | |
created_at |
DATETIME |
Condicao · tabela condicoes_saude
Condição de saúde acompanhada (ex.: Diabetes tipo 2, Hipertensão).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
nome |
VARCHAR(200) | obrigatório |
cid |
VARCHAR(20) | |
data_diagnostico |
DATE | |
medico |
VARCHAR(200) | |
status |
VARCHAR(20) | |
notas |
TEXT | |
created_at |
DATETIME |
perfil → PerfilSaude medicamentos → Medicamento
status_labeltone
Consulta · tabela consultas_saude
Consulta médica — o que foi orientado é o que vira plano de ação.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
condicao_id |
INTEGER | FK → condicoes_saude.id |
especialidade |
VARCHAR(120) | |
medico |
VARCHAR(200) | |
local |
VARCHAR(200) | |
data |
DATE | |
hora |
TIME | |
motivo |
VARCHAR(300) | |
status |
VARCHAR(20) | |
diagnostico |
TEXT | |
orientacoes |
TEXT | |
anexo_path |
VARCHAR(300) | |
notas |
TEXT | |
tarefa_id |
INTEGER | FK → tarefas.id |
created_at |
DATETIME |
perfil → PerfilSaude condicao → Condicao tarefa → Tarefa
anexo_urlis_futuraquando_labelstatus_label
ContaBancaria · tabela contas_bancarias
Conta bancária / carteira — de onde o dinheiro sai e entra.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
organization_id |
INTEGER | FK → organizations.id obrigatório |
nome |
VARCHAR(120) | obrigatório |
banco |
VARCHAR(120) | |
tipo |
VARCHAR(20) | |
saldo |
NUMERIC(12, 2) | |
cor |
VARCHAR(7) | |
ativa |
BOOLEAN | |
created_at |
DATETIME |
organization → Organization lancamentos → Lancamento
a_pagar_f— Contas em aberto que sairão desta conta.saldo_fsaldo_projetado_ftipo_label
Despesa · tabela despesas
Despesa fixa/recorrente (modelo que gera lançamentos por período).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
organization_id |
INTEGER | FK → organizations.id obrigatório |
descricao |
VARCHAR(300) | obrigatório |
categoria |
VARCHAR(30) | |
subcategoria |
VARCHAR(60) | |
valor |
NUMERIC(12, 2) | |
dia_vencimento |
INTEGER | |
data_inicio |
DATE | |
data_fim |
DATE | |
recorrente |
BOOLEAN | |
ativo |
BOOLEAN | |
created_at |
DATETIME |
organization → Organization lancamentos → Lancamento
Documento · tabela documentos
Um arquivo guardado no cofre, com o que a IA entendeu dele.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
organization_id |
INTEGER | FK → organizations.id obrigatório |
categoria_id |
INTEGER | FK → categorias_documento.id |
nome_original |
VARCHAR(400) | |
nome_arquivo |
VARCHAR(400) | |
caminho_rel |
VARCHAR(700) | |
mime |
VARCHAR(120) | |
tamanho |
INTEGER | |
titulo |
VARCHAR(400) | |
tipo_doc |
VARCHAR(40) | |
emissor |
VARCHAR(200) | |
titular |
VARCHAR(200) | |
numero |
VARCHAR(120) | |
data_documento |
DATE | |
data_tipo |
VARCHAR(30) | |
valor |
NUMERIC(12, 2) | |
resumo |
TEXT | |
tags |
TEXT | |
analisado |
BOOLEAN | |
ai_analisado_em |
DATETIME | |
tarefa_id |
INTEGER | FK → tarefas.id |
created_at |
DATETIME |
organization → Organization categoria → CategoriaDocumento tarefa → Tarefa
data_futura— A data principal ainda está por vir? (para lembrete de voo/vencimento)data_tipo_labelextis_imageis_pdftags_listtamanho_labeltipo_labelvalor_f
DoseRegistro · tabela doses_registro
Registro de uma dose: prevista para tal dia/hora, tomada ou pulada.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
medicamento_id |
INTEGER | FK → medicamentos.id obrigatório |
data |
DATE | obrigatório |
horario |
VARCHAR(5) | obrigatório |
tomado |
BOOLEAN | |
pulado |
BOOLEAN | |
hora_registro |
DATETIME | |
observacao |
VARCHAR(300) |
medicamento → Medicamento
EmailAccount · tabela email_accounts
Conta de e-mail conectada a uma organização (Gmail agora, Outlook depois).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
provider |
VARCHAR(20) | |
email |
VARCHAR(200) | |
token_json |
TEXT | |
connected_at |
DATETIME | |
last_sync |
DATETIME | |
organization_id |
INTEGER | FK → organizations.id obrigatório |
organization → Organization messages → EmailMessage
can_send— True se a conta pode enviar (Gmail não; Outlook sim; IMAP se tiver SMTP).label
EmailMessage · tabela email_messages
E-mail sincronizado (cache local) com categoria atribuída pela IA.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
provider_id |
VARCHAR(512) | |
sender |
VARCHAR(400) | |
sender_email |
VARCHAR(320) | |
subject |
VARCHAR(1000) | |
snippet |
TEXT | |
received_at |
DATETIME | |
is_unread |
BOOLEAN | |
category |
VARCHAR(30) | |
importance |
VARCHAR(10) | |
due_date |
DATE | |
ai_summary |
VARCHAR(400) | |
classified |
BOOLEAN | |
account_id |
INTEGER | FK → email_accounts.id obrigatório |
tarefa_id |
INTEGER | FK → tarefas.id |
account → EmailAccount tarefa → Tarefa
category_iconcategory_label
Etapa · tabela etapas
Fase de um projeto (cartão do quadro Kanban).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
title |
VARCHAR(300) | obrigatório |
description |
TEXT | |
status |
VARCHAR(30) | |
priority |
VARCHAR(20) | |
due_date |
DATE | |
position |
INTEGER | |
created_at |
DATETIME | |
project_id |
INTEGER | FK → projects.id obrigatório |
project → Project tarefas → Tarefa
is_overdueorganizationpriority_labelprogressstatus_label
Exame · tabela exames
Solicitação ou resultado de exame, com anexo e leitura pela IA.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
condicao_id |
INTEGER | FK → condicoes_saude.id |
tipo |
VARCHAR(20) | |
titulo |
VARCHAR(300) | obrigatório |
data |
DATE | |
medico |
VARCHAR(200) | |
laboratorio |
VARCHAR(200) | |
especialidade |
VARCHAR(120) | |
status |
VARCHAR(20) | |
arquivo_path |
VARCHAR(300) | |
notas |
TEXT | |
analisado |
BOOLEAN | |
ai_resumo |
TEXT | |
ai_alertas |
TEXT | |
ai_perguntas |
TEXT | |
ai_preparo |
TEXT | |
ai_analisado_em |
DATETIME | |
created_at |
DATETIME |
perfil → PerfilSaude condicao → Condicao itens → ExameItem medicoes → Medicao
alertas_listarquivo_is_imagearquivo_is_pdfarquivo_urlis_solicitacaoitens_alteradosperguntas_liststatus_labeltipo_label
ExameItem · tabela exame_itens
Um exame individual.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
exame_id |
INTEGER | FK → exames.id obrigatório |
nome |
VARCHAR(200) | obrigatório |
valor |
VARCHAR(120) | |
valor_num |
NUMERIC(12, 3) | |
unidade |
VARCHAR(40) | |
referencia |
VARCHAR(160) | |
flag |
VARCHAR(20) | |
explicacao |
TEXT | |
status |
VARCHAR(20) | |
data_agendada |
DATE | |
local |
VARCHAR(200) | |
preparo |
TEXT | |
motivo |
TEXT | |
urgencia |
VARCHAR(10) | |
grupo |
VARCHAR(120) | |
observacao |
TEXT | |
atendido_por_id |
INTEGER | FK → exame_itens.id |
atendido_por → ExameItem exame → Exame
atrasado— Agendado para uma data que já passou, e nada foi registrado depois.concluidocorflag_labelprogresso— 0-100 na esteira — quanto deste exame já andou.resultado_label— O valor que atendeu este pedido, se já chegou.status_iconstatus_label
Lancamento · tabela lancamentos
Conta a pagar / pagamento — a unidade do financeiro.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
organization_id |
INTEGER | FK → organizations.id obrigatório |
tipo |
VARCHAR(10) | |
descricao |
VARCHAR(300) | obrigatório |
categoria |
VARCHAR(30) | |
subcategoria |
VARCHAR(60) | |
fornecedor |
VARCHAR(200) | |
valor |
NUMERIC(12, 2) | |
vencimento |
DATE | |
pago |
BOOLEAN | |
data_pagamento |
DATE | |
forma_pagamento |
VARCHAR(30) | |
origem |
VARCHAR(120) | |
parcelas |
INTEGER | |
parcela_num |
INTEGER | |
grupo |
VARCHAR(40) | |
reembolsavel |
BOOLEAN | |
reembolso_origem |
VARCHAR(120) | |
reembolsado |
BOOLEAN | |
anexo_path |
VARCHAR(300) | |
notas |
TEXT | |
cartao_id |
INTEGER | FK → cartoes.id |
conta_id |
INTEGER | FK → contas_bancarias.id |
despesa_id |
INTEGER | FK → despesas.id |
email_message_id |
INTEGER | FK → email_messages.id |
created_at |
DATETIME |
cartao → Cartao conta → ContaBancaria despesa → Despesa email → EmailMessage organization → Organization
anexo_is_imageanexo_is_pdfanexo_urlcategory_iconcategory_labelforma_labelis_overdueis_receitaparcela_labelvalor_f
Medicamento · tabela medicamentos
Medicamento em uso, com frequência, horários e controle de estoque.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
condicao_id |
INTEGER | FK → condicoes_saude.id |
nome |
VARCHAR(200) | obrigatório |
principio_ativo |
VARCHAR(200) | |
dosagem |
VARCHAR(60) | |
forma |
VARCHAR(20) | |
via |
VARCHAR(20) | |
quantidade_dose |
NUMERIC(8, 2) | |
frequencia |
VARCHAR(20) | |
horarios |
TEXT | |
data_inicio |
DATE | |
data_fim |
DATE | |
continuo |
BOOLEAN | |
estoque_atual |
NUMERIC(8, 2) | |
estoque_alerta |
NUMERIC(8, 2) | |
prescrito_por |
VARCHAR(200) | |
instrucoes |
TEXT | |
ativo |
BOOLEAN | |
created_at |
DATETIME |
perfil → PerfilSaude condicao → Condicao doses → DoseRegistro
dias_de_estoque— Para quantos dias ainda dá o estoque, no ritmo atual.doses_por_diaem_uso_hojeestoque_baixoestoque_fforma_labelfrequencia_labelhorarios_listrotulo— 'Losartana 50 mg' — como o usuário chama o remédio.via_label
Medicao · tabela medicoes
Um monitoramento pontual: glicemia, pressão, peso, exame laboratorial…
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
tipo |
VARCHAR(30) | obrigatório |
valor |
NUMERIC(9, 2) | obrigatório |
valor2 |
NUMERIC(9, 2) | |
contexto |
VARCHAR(30) | |
data_hora |
DATETIME | obrigatório |
notas |
TEXT | |
exame_id |
INTEGER | FK → exames.id |
created_at |
DATETIME |
perfil → PerfilSaude exame → Exame
alertaclassificacao— normal | atencao | alto | baixo | critico | None (sem referência).classificacao_labelcontexto_labelcoriconmetatipo_labelunidadevalor2_fvalor_fvalor_label
MetaSaude · tabela metas_saude
Meta definida com o médico (ex.: glicemia de jejum entre 80 e 130).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
tipo |
VARCHAR(30) | obrigatório |
contexto |
VARCHAR(30) | |
alvo_min |
NUMERIC(9, 2) | |
alvo_max |
NUMERIC(9, 2) | |
descricao |
VARCHAR(300) | |
definida_por |
VARCHAR(200) | |
ativa |
BOOLEAN | |
created_at |
DATETIME |
perfil → PerfilSaude
faixa_labeltipo_labelunidade
Organization · tabela organizations
The base class of the :attr:`.SQLAlchemy.Model` declarative model class.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
name |
VARCHAR(120) | obrigatório |
role |
VARCHAR(120) | |
color |
VARCHAR(7) | |
logo_path |
VARCHAR(300) | |
tipo |
VARCHAR(20) | |
financeiro_enabled |
BOOLEAN | |
saude_enabled |
BOOLEAN | |
documentos_enabled |
BOOLEAN | |
created_at |
DATETIME |
projects → Project people → Person
active_projectslogo_urlpasta_documentos— Nome da subpasta desta organização dentro da raiz de Documentos.
PerfilSaude · tabela perfis_saude
Pessoa acompanhada (você, cônjuge, filho…). Raiz de tudo no módulo.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
organization_id |
INTEGER | FK → organizations.id obrigatório |
nome |
VARCHAR(160) | obrigatório |
data_nascimento |
DATE | |
sexo |
VARCHAR(20) | |
tipo_sanguineo |
VARCHAR(5) | |
altura_cm |
NUMERIC(5, 1) | |
plano_saude |
VARCHAR(120) | |
carteirinha |
VARCHAR(60) | |
alergias |
TEXT | |
contato_emergencia |
VARCHAR(200) | |
observacoes |
TEXT | |
principal |
BOOLEAN | |
created_at |
DATETIME |
organization → Organization condicoes → Condicao medicamentos → Medicamento medicoes → Medicao exames → Exame consultas → Consulta refeicoes → Refeicao atividades → Atividade metas → MetaSaude
altura_mcondicoes_ativasidadeimcimc_labelmedicamentos_ativospeso_atual— Último peso registrado (medição do tipo `peso`).
PerguntaSaude · tabela perguntas_saude
Pergunta que a IA faz ao paciente para fechar as lacunas do acompanhamento.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
pergunta |
TEXT | obrigatório |
por_que |
TEXT | |
resposta |
TEXT | |
respondida |
BOOLEAN | |
created_at |
DATETIME | |
respondida_em |
DATETIME |
perfil → PerfilSaude
Person · tabela people
Responsável — pessoa atribuída a tarefas (e futuramente notificada por e-mail).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
name |
VARCHAR(160) | obrigatório |
email |
VARCHAR(200) | |
role |
VARCHAR(160) | |
created_at |
DATETIME | |
organization_id |
INTEGER | FK → organizations.id |
organization → Organization tarefas → Tarefa
initialsopen_task_count
PlanoSaude · tabela planos_saude
Plano de acompanhamento gerado pela IA a partir das solicitações + resultados.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
conteudo |
TEXT | |
created_at |
DATETIME |
perfil → PerfilSaude
dados
Project · tabela projects
The base class of the :attr:`.SQLAlchemy.Model` declarative model class.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
name |
VARCHAR(200) | obrigatório |
description |
TEXT | |
status |
VARCHAR(30) | |
created_at |
DATETIME | |
organization_id |
INTEGER | FK → organizations.id obrigatório |
project_type_id |
INTEGER | FK → project_types.id |
organization → Organization project_type → ProjectType etapas → Etapa tarefas → Tarefa
progress— % de andamento do projeto = percentual de etapas concluídas.total_tarefas
ProjectType · tabela project_types
Tipo de projeto com etapas padrão (boas práticas, enxutas).
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
name |
VARCHAR(120) | obrigatório |
default_etapas |
TEXT | |
created_at |
DATETIME |
etapas_list
Refeicao · tabela refeicoes
Registro alimentar — com estimativa da IA de carboidratos, sódio etc.
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
perfil_id |
INTEGER | FK → perfis_saude.id obrigatório |
tipo |
VARCHAR(20) | |
data_hora |
DATETIME | obrigatório |
descricao |
TEXT | obrigatório |
foto_path |
VARCHAR(300) | |
calorias |
INTEGER | |
carboidratos_g |
NUMERIC(7, 1) | |
proteinas_g |
NUMERIC(7, 1) | |
gorduras_g |
NUMERIC(7, 1) | |
acucar_g |
NUMERIC(7, 1) | |
sodio_mg |
INTEGER | |
fibras_g |
NUMERIC(7, 1) | |
ai_analise |
TEXT | |
ai_risco |
VARCHAR(10) | |
notas |
TEXT | |
created_at |
DATETIME |
perfil → PerfilSaude
foto_urliconrisco_cortipo_label
Tarefa · tabela tarefas
Ação que o usuário precisa fazer, com data agendada. Pode pertencer a uma
| Coluna | Tipo | Detalhes |
|---|---|---|
id |
INTEGER | PK obrigatório |
title |
VARCHAR(300) | obrigatório |
description |
TEXT | |
done |
BOOLEAN | |
priority |
VARCHAR(20) | |
due_date |
DATE | |
due_time |
TIME | |
position |
INTEGER | |
created_at |
DATETIME | |
etapa_id |
INTEGER | FK → etapas.id |
project_id |
INTEGER | FK → projects.id |
organization_id |
INTEGER | FK → organizations.id |
etapa → Etapa project → Project organization → Organization assignees → Person
context_labelis_overdueis_scheduledis_standalone— Avulsa = fora de qualquer etapa/projeto.org_effective— Organização efetiva (própria, do projeto ou da etapa).priority_labeltime_label
Serviços (56 funções)
A camada que fala com o mundo externo (IA, Google, Microsoft, IMAP, backup) — com assinatura e parâmetros.
services/agent.py
Assistente (agente IA) do meuAgente.
-
generate_briefing(org) -
run_chat(history, user_message, current_org)history: lista de {role, content} (texto). Retorna (texto, acoes[]).
services/backup.py
Backup diário do meuAgente — banco de dados + código da aplicação.
-
archive_app(dest_dir: pathlib.Path) -> pathlib.PathCompacta o código da aplicação (inclui o `.env`, que guarda as chaves). -
dump_database(dest_dir: pathlib.Path) -> pathlib.PathGrava o dump do banco em `dest_dir` e devolve o caminho do arquivo. -
last_backup() -> dict | NoneMetadados do último backup concluído (ou None se nunca rodou). -
list_backups() -> list[dict]Backups locais existentes, do mais recente para o mais antigo. -
maybe_daily_backup(app)Se ainda não houve backup hoje, dispara um em segundo plano. -
prune_old(keep=14)Mantém apenas os `keep` backups locais mais recentes. -
ran_today() -> bool -
run_backup(upload=True) -> dictExecuta um backup completo. Devolve o manifest (também salvo em disco).
services/calendars.py
Camada unificada de calendários (Google Agenda + Outlook/Graph).
-
contas_com_agenda(org=None) -
criar_evento(org, titulo, inicio, fim=None, descricao=None)Cria o evento na primeira conta com agenda da organização. Devolve (ok, mensagem/link). -
eventos(inicio, fim, org=None)Eventos de todas as contas (ou de uma org), já normalizados. -
eventos_do_dia(dia, org=None) -
eventos_do_mes(ano, mes, org=None)
services/classify.py
Classificação de e-mails por IA (Claude) com fallback por regras.
-
classify_batch(items)Classifica uma lista de e-mails.
services/documentos_ai.py
IA do cofre de Documentos (Claude).
-
classificar(file_bytes: bytes, media_type: str, categorias_existentes=None, contexto: str = '')Lê o documento e devolve o dict conforme _SCHEMA, ou None se o formato do arquivo não for suportado (não é imagem nem PDF).
services/finance_ai.py
Extração de dados de nota fiscal / cupom / comprovante via IA (Claude vision).
-
extract_receipt(file_bytes: bytes, media_type: str)Devolve dict {valor, data, fornecedor, categoria, descricao} ou None.
services/gdrive.py
Envio dos backups para o Google Drive.
-
account_email() -> str | NoneE-mail da conta conectada (para mostrar na tela). -
authorization_url() -
build_flow(state=None) -
disconnect() -
exchange_code(code, state=None, code_verifier=None)Troca o `code` do callback pelas credenciais e salva o token em disco. -
is_connected() -> bool -
upload_folder(folder_name: str, files: list[pathlib.Path]) -> list[dict]Sobe `files` para `meuAgente Backups/<folder_name>/` no Drive.
services/gmail.py
Integração com o Gmail — OAuth 2.0 (somente leitura) e busca de e-mails.
-
authorization_url() -
build_flow(state=None) -
counts(account)Contadores rápidos: total estimado e não lidos na caixa de entrada. -
create_event(account, titulo, inicio, fim, descricao=None)Cria um evento na agenda principal. -
exchange_code(code, state=None, code_verifier=None)Troca o `code` do callback por credenciais e devolve (token_json, email). -
fetch_body(account, provider_id)Busca o corpo (texto) de um e-mail específico do Gmail. -
fetch_recent(account, max_results=25)Busca metadados dos e-mails recentes da caixa de entrada. -
list_events(account, inicio, fim)Eventos entre dois datetimes. Devolve lista normalizada. -
refreshed_token_json(account)Garante um access token válido; devolve token_json atualizado (ou o mesmo).
services/health_ai.py
IA do módulo de Saúde (Claude).
-
analisar_exame(file_bytes: bytes, media_type: str, contexto: str = '')Lê o anexo do exame. Devolve dict conforme _EXAME_SCHEMA, ou None se o formato do arquivo não for suportado. -
analisar_refeicao(descricao: str, contexto: str = '', file_bytes: bytes = None, media_type: str = None)Estima nutrientes e comenta a refeição. Devolve dict conforme _REFEICAO_SCHEMA. -
gerar_panorama(dossie: str)Recebe o dossiê em texto e devolve dict conforme _PANORAMA_SCHEMA. -
montar_plano(dossie: str, exames_texto: str)Devolve o plano da jornada de exames conforme _PLANO_SCHEMA.
services/imap_mail.py
Contas de e-mail genéricas via IMAP (receber) + SMTP (enviar).
-
can_send(account) -
config(account) -
fetch_body(account, provider_id)Busca o corpo (texto) de um e-mail específico via IMAP, pelo Message-ID. -
fetch_recent(account, max_results=50)Busca os e-mails recentes da INBOX (headers + flags). -
imap_cfg(account) -
make_token_json(imap, smtp=None) -
send_email(account, to_addr, subject, body)Envia um e-mail simples pela conta (SMTP). -
smtp_cfg(account) -
test_imap(cfg)Levanta exceção se não conseguir logar; devolve True se OK. -
test_smtp(cfg)
services/mailutil.py
Utilitários comuns de e-mail.
-
html_to_text(html: str) -> str
services/outlook.py
Integração Microsoft/Outlook via OAuth (Microsoft Graph).
-
build_auth_flow()Inicia o fluxo OAuth; devolve o dict do MSAL (guardar na sessão). -
create_event(account, titulo, inicio, fim, descricao=None) -
exchange_code(flow, args)Conclui o login. Devolve (token_json, email). -
fetch_body(account, provider_id) -
fetch_recent(account, max_results=50) -
list_events(account, inicio, fim)Eventos entre dois datetimes (calendarView). -
send_email(account, to_addr, subject, body)
Regras do projeto
- Testes nunca rodam no banco real: usam o PostgreSQL
meuagente_test. - As integrações degradam com elegância: sem credencial/permissão, a tela continua funcionando.
- Migrações leves rodam na subida do app (adicionam colunas sem apagar dados).
- O
.envguarda as credenciais e nunca é versionado.
Guias passo a passo em docs/EMAIL_SETUP.md, docs/OUTLOOK_SETUP.md,
docs/BACKUP.md e docs/ARQUITETURA.md.

