Modelo de dados do MVP de e-mails
Este documento descreve a fundação de banco de dados criada para o MVP de e-mails da Secretária Virtual.
O objetivo desta camada é sustentar o fluxo futuro:
Ler e-mails
↓
Classificar
↓
Resumir
↓
Sugerir ação
↓
Sugerir resposta
↓
Gestor aprova
↓
Somente depois envia
Princípios obrigatórios
- A IA nunca envia e-mail sozinha.
- O envio só poderá ocorrer em issue futura, depois de aprovação do gestor.
- Credenciais IMAP/SMTP não podem ser gravadas em texto puro.
- A coleta precisa evitar duplicidade de mensagens.
- Deve existir trilha mínima de auditoria.
- Esta etapa entrega somente banco, models, casts, índices, relacionamentos, documentação e testes mínimos.
Tabelas criadas
email_accounts
Armazena as contas de e-mail que futuramente serão monitoradas.
Campos principais:
id
name
email_address
provider
imap_host
imap_port
imap_encryption
imap_username
imap_password
smtp_host
smtp_port
smtp_encryption
smtp_username
smtp_password
from_name
active
last_sync_at
settings
created_at
updated_at
Regras técnicas:
email_addressindexado.activeindexado.imap_passwordesmtp_passwordusam castencryptedno model.imap_passwordesmtp_passwordficam emhidden, para não aparecerem em serialização do Eloquent.settingsusa castarray.
email_folders
Armazena as pastas de cada conta de e-mail.
Campos principais:
id
email_account_id
name
display_name
sync_enabled
last_uid
uid_validity
last_sync_at
created_at
updated_at
Regras técnicas:
email_account_idreferenciaemail_accountscomcascadeOnDelete.sync_enabledusa cast booleano.last_sync_atusa castdatetime.- Índice único:
unique(email_account_id, name).
email_messages
Armazena os e-mails coletados futuramente pela integração IMAP.
Campos principais:
id
email_account_id
email_folder_id
folder
message_uid
message_id_header
thread_id_header
in_reply_to
references_header
from_email
from_name
to
cc
bcc
subject
body_text
body_html
snippet
has_attachments
attachments_meta
received_at
raw_headers
status
created_at
updated_at
Status iniciais:
collected
classified
pending_review
no_action
archived
Regras técnicas:
email_account_idreferenciaemail_accountscomcascadeOnDelete.email_folder_idreferenciaemail_folderscomnullOnDelete, pois a mensagem pode ser preservada mesmo se a pasta local for removida.- Índice único:
unique(email_account_id, folder, message_uid). - Esse índice é a principal barreira contra duplicidade de e-mails coletados.
- Campos
to,cc,bcc,attachments_metaeraw_headersusam castarray. has_attachmentsusa cast booleano.received_atusa castdatetime.
email_classifications
Armazena a classificação gerada futuramente pela IA.
Campos principais:
id
email_message_id
priority
category
requires_action
requires_reply
suggested_owner
suggested_due_label
summary
risk
confidence
model
prompt_version
raw_response
classified_at
created_at
updated_at
Regras técnicas:
email_message_idreferenciaemail_messagescomcascadeOnDelete.- Para o MVP, foi adotado relacionamento
hasOneentre mensagem e classificação atual. - Por isso,
email_message_idpossui índice único ememail_classifications. requires_actionerequires_replyusam cast booleano.confidenceusa castdecimal:2.raw_responseusa castarray.classified_atusa castdatetime.
email_suggested_actions
Armazena ações sugeridas pela IA para revisão futura do gestor.
Campos principais:
id
email_message_id
email_classification_id
action_type
title
description
suggested_owner
due_at
status
created_at
updated_at
Status iniciais:
pending
approved
rejected
done
Regras técnicas:
email_message_idreferenciaemail_messagescomcascadeOnDelete.email_classification_idreferenciaemail_classificationscomnullOnDelete.due_atusa castdatetime.- Esta tabela não executa ação automaticamente; ela apenas registra sugestões.
email_suggested_replies
Armazena respostas sugeridas, editadas e aprovadas futuramente.
Campos principais:
id
email_message_id
email_classification_id
body
edited_body
status
approved_at
approved_by
sent_at
smtp_message_id
error_message
created_at
updated_at
Status iniciais:
draft
pending_review
approved
rejected
sent
send_failed
Regras técnicas:
email_message_idreferenciaemail_messagescomcascadeOnDelete.email_classification_idreferenciaemail_classificationscomnullOnDelete.approved_atesent_atusam castdatetime.sent_at,smtp_message_ideerror_messagesão somente preparação para a Issue #17.- Nenhuma migration ou model envia e-mail.
assistant_audit_logs
Armazena trilha mínima de auditoria para eventos importantes da Secretária Virtual.
Campos principais:
id
auditable_type
auditable_id
event
actor_type
actor_id
metadata
ip_address
user_agent
created_at
Regras técnicas:
auditable_typeeauditable_idusam relacionamento polimórfico opcional.actor_typeeactor_idusam relacionamento polimórfico opcional.metadatausa castarray.created_atusa castdatetime.- Não possui
updated_at, pois log de auditoria deve representar um evento ocorrido em determinado momento.
Relacionamentos dos models
EmailAccount
hasMany EmailFolder
hasMany EmailMessage
EmailFolder
belongsTo EmailAccount
hasMany EmailMessage
EmailMessage
belongsTo EmailAccount
belongsTo EmailFolder
hasOne EmailClassification
hasMany EmailSuggestedAction
hasMany EmailSuggestedReply
EmailClassification
belongsTo EmailMessage
hasMany EmailSuggestedAction
hasMany EmailSuggestedReply
EmailSuggestedAction
belongsTo EmailMessage
belongsTo EmailClassification
EmailSuggestedReply
belongsTo EmailMessage
belongsTo EmailClassification
AssistantAuditLog
morphTo auditable
morphTo actor
Fluxo futuro por issue
Issue #13 — fundação de banco/modelo
Entrega:
- Migrations.
- Models.
- Casts.
- Índices.
- Relacionamentos.
- Testes mínimos.
- Documentação técnica.
Fora do escopo:
- Conexão IMAP.
- Job de coleta.
- Chamada de IA.
- Telas.
- Envio SMTP.
Issue #14 — coleta IMAP
Deverá implementar a leitura dos e-mails, preencher email_messages e respeitar a barreira de duplicidade unique(email_account_id, folder, message_uid).
Detalhes operacionais da coleta IMAP e dos comandos da issue estão documentados em:
Issue #15 — classificação IA
Deverá usar email_classifications, email_suggested_actions e email_suggested_replies para registrar análise, resumo, risco, ação sugerida e resposta sugerida.
Issue #16 — telas
Deverá exibir mensagens, classificações, sugestões de ação e sugestões de resposta para revisão do gestor.
Issue #17 — envio SMTP
Deverá enviar somente respostas aprovadas pelo gestor.
Campos preparados para essa etapa:
email_suggested_replies.approved_at
email_suggested_replies.approved_by
email_suggested_replies.sent_at
email_suggested_replies.smtp_message_id
email_suggested_replies.error_message
Cuidados de segurança
- Não salvar credenciais em texto puro.
- Manter
APP_KEYseguro, pois o castencrypteddepende dele. - Não expor
imap_passwordesmtp_passwordem APIs, logs, dumps ou respostas JSON. - Não usar dados reais/sensíveis em testes.
- Registrar eventos relevantes em
assistant_audit_logsnas próximas issues. - Nunca permitir envio automático por IA sem aprovação humana explícita.
Testes mínimos esperados
A suíte adicionada para esta issue cobre:
- Execução das migrations.
- Existência das tabelas principais.
- Casts essenciais nos models.
- Senhas IMAP/SMTP criptografadas no banco.
- Senhas ocultas na serialização do model.
- Relacionamento básico
EmailAccount -> EmailFolder -> EmailMessage. - Bloqueio de duplicidade por
unique(email_account_id, folder, message_uid).