ADR-0005 — Modelo de Domínio Conceitual
Status
Aprovado
Contexto
Após definição da arquitetura geral, modelo organizacional hierárquico e controle de acesso, faz-se necessário estabelecer o modelo conceitual de domínio do sistema EBDbe.
Este modelo define:
- Entidades principais
- Relações entre elas
- Responsabilidades estruturais
- Base para organização no Firestore
O objetivo é garantir coerência estrutural antes do início da implementação.
Decisão
O domínio do sistema será composto pelas seguintes entidades principais:
- Ministry
- OrganizationalUnit
- User
- Role
- ClassGroup
- EbdSession
- Lesson
- Attendance
- Material
Campos e enums adicionados com base no projeto legado para compatibilidade e refinamento.
1. Ministry
Representa o ministério ao qual as unidades estão vinculadas.
Campos principais:
- id
- name
- created_at
- status (ACTIVE | INACTIVE)
Relacionamentos:
- Possui múltiplas OrganizationalUnits
- Possui usuários vinculados
2. OrganizationalUnit
Representa uma unidade organizacional de igreja em estrutura autorrelacionada.
Campos principais:
- id
- ministry_id
- name
- code — identificador curto (ex.: 3 caracteres)
- parent_unit_id (opcional)
- status (ACTIVE | INACTIVE | PENDING)
- phone_primary — telefone principal
- phone_secondary — telefone alternativo
- address
- group — grupo/região ministerial (opcional)
- pastor_id — referência a User (opcional)
- secretary_id — referência a User (opcional)
- foundation_date — data de fundação (opcional)
Relacionamentos:
- Pertence a um Ministry
- Pode possuir unidade pai (OrganizationalUnit)
- Pode possuir múltiplas ClassGroups
- pastor_id e secretary_id referenciam User
3. User
Representa um participante do sistema.
Campos principais:
- id
- ministry_id
- unit_id — OrganizationalUnit de vínculo
- name
- alias_name — nome social/apelido (opcional)
- status (ACTIVE | INACTIVE | BLOCKED | SUSPENDED | PENDING | BANNED | DELETION_REQUESTED | DELETED)
- status_date — data da última alteração de status (opcional)
- avatar_url (opcional)
- avatar_source (OAUTH | CUSTOM | DEFAULT)
- created_at
- updated_at
Relacionamentos:
- Vinculado a uma OrganizationalUnit
- Possui uma ou mais RoleAssignments
- Pode participar de uma ou mais ClassGroups como professor, monitor ou aluno
RoleAssignment (estrutura de vínculo User-Role):
- role_id
- role_status (APPROVED | REJECTED | DECLARED | PENDING)
- last_action_date
Nota: regras completas de ciclo de vida, transições de status e preferências segmentadas de perfil estão formalizadas no ADR-0013.
4. Role
Define papel funcional do usuário.
Papéis (com nível de operação, menor = mais poder):
- MINISTRY_ADMIN (nível 0)
- MINISTERIAL_EBD_SUPERVISOR, PRESIDENT_PASTOR, ASSISTANT_MINISTERIAL_PASTOR (nível 1)
- LOCAL_SECRETARY, EBD_SUPERINTENDENT, ASSISTANT_LOCAL_PASTOR, LOCAL_PASTOR (níveis 2-3)
- EBD_SECRETARY (nível 4)
- EBD_TEACHER (nível 5)
- EBD_ASSISTENT, CHURCH_LEADER (nível 6 — MONITOR)
- EBD_STUDENT, MEMBER, CHURCH_WORKER (nível 7 — STUDENT)
- NONE
O papel influencia permissões, mas não substitui escopo organizacional. Detalhes em ADR-0003.
5. ClassGroup
Representa uma classe da EBD (definição/template).
Campos principais:
- id
- ministry_id
- unit_id
- name
- age_group — faixa etária/tipo da classe (enum abaixo)
- display_order — ordem de exibição
- status (ACTIVE | INACTIVE)
Enum ClassAgeGroup (faixas etárias/tipos de classe):
- NURSERY — berçário
- KINDERGARTEN — maternal
- GARDEN — jardim
- JUNIORS — juniores
- TEENAGERS — adolescentes
- YOUNG_ADULTS — jovens
- LEVITES — levitas
- BAPTISM — batismo
- EVANGELISM — evangelismo
- INTEGRATION — integração
- WORKERS — obreiros
- COUPLES — casais
- ADULTS — adultos
- MASTERS — mestres
- NONE
Relacionamentos:
- Pertence a uma OrganizationalUnit
- Possui múltiplas Lessons (ocorrências de aula)
- teacher_id e monitor_id podem ser definidos por Lesson (ocorrência)
6. EbdSession
Representa uma ocorrência de EBD em uma unidade em uma data específica (ex.: EBD do domingo).
Campos principais:
- id
- ministry_id
- unit_id
- date — data da ocorrência
- status (CREATED | IN_PROGRESS | CONCLUDED | CLOSED)
- type — tipo de ocorrência (enum abaixo)
- replace_cause — causa da intercorrência (se type anormal)
- replace_cause_observation — observação complementar
- weather_type — situação do tempo (SUNNY | PARTLY_CLOUDY | CLOUDY | LIGHT_RAIN | HEAVY_RAIN | THUNDERSTORM | FOG)
- temperature — temperatura ambiente (VERY_COLD | COLD | MILD | WARM | VERY_WARM)
- total_students, total_visitors, total_leaders, total_workers, total_pastors — totais agregados
- observation — observações gerais
- principals[] — user_ids dos responsáveis pela EBD naquele dia
Enum EbdSessionType:
- FULL_CLASS — todas as classes conforme planejado
- REGULAR_CLASS — classes regulares
- UNIQUE_CLASS — classe única
- ONLINE_CLASS — online
- CANCELED — cancelada
- REPLACED_BY_EVENT — substituída por evento
- REPLACED_BY_CULT — substituída por culto
Enum EbdReplaceCause (quando type ≠ FULL/REGULAR):
- LOCAL_EVENT, MINISTERIAL_EVENT, BAPTISM, WEATHER_CONDITION
- INFRA_FAULT, ELECTRIC_FAULT, SUPERIOR_DECISION, OTHER
Relacionamentos:
- Pertence a uma OrganizationalUnit em uma data
- Contém múltiplas Lessons (uma por ClassGroup)
7. Lesson
Representa uma aula ministrada em uma EbdSession (uma classe em uma data).
Campos principais:
- id
- ministry_id
- unit_id
- ebd_session_id — referência à EbdSession
- class_group_id — referência à ClassGroup
- date — data (geralmente igual à EbdSession)
- theme — nome/número da lição ministrada
- material_id (opcional)
- teacher_id — professor
- monitor_id — assistente de classe
- status (CREATED | IN_PROGRESS | CONCLUDED | CLOSED | NOT_HELD_TODAY | NOT_EXISTS)
- total_students, total_visitors, total_leaders, total_workers, total_pastors — contagem da classe
- observation — observações da classe
- display_order — ordem de exibição (herdada de ClassGroup)
Relacionamentos:
- Vinculada a uma EbdSession
- Vinculada a uma ClassGroup
- Pode possuir múltiplos registros de Attendance
- material_id referência Material
8. Attendance
Representa o registro de presença de um participante em uma Lesson.
Campos principais:
- id
- ministry_id
- unit_id
- lesson_id
- user_id
- category (STUDENT | VISITOR | LEADER | WORKER | PASTOR) — tipo de participação
- timestamp
- method (QR | WIFI | GEO)
- validated_by_backend (boolean)
Relacionamentos:
- Vinculado a um User
- Vinculado a uma Lesson
9. Material
Representa material utilizado na aula (revista, lição).
Campos principais:
- id
- ministry_id
- name
- publisher — editora (enum: CPAD | EBENEZER | OTHERS | DO_NOT_USE)
- edition
- reference_period — período de referência (ex.: trimestre)
Relacionamentos:
- Pode ser vinculado a múltiplas Lessons
9. Princípios Estruturais
- Toda entidade conterá ministry_id.
- Entidades vinculadas a unidade conterão unit_id.
- Nenhuma entidade poderá existir fora de contexto organizacional.
- O backend será responsável por validação de consistência.
- O modelo é orientado a eventos de aula e presença.
10. Modelo Conceitual Simplificado
Ministry
└── OrganizationalUnit
└── ClassGroup
└── EbdSession (ocorrência de EBD em uma data)
└── Lesson (uma classe em uma data)
└── Attendance
User
└── RoleAssignment[] (roles com status de aprovação)
Material
└── Lesson
11. Histórico de Alterações (baseado no legado)
- Adição de EbdSession como agregadora de Lessons por data/unidade
- Campos de OrganizationalUnit: code, phone, email, address, pastor_id, secretary_id, foundation_date
- User: alias_name, status_date, RoleAssignment com role_status
- User: ciclo de vida completo e perfil de aplicação (ADR-0013)
- ClassGroup: ClassAgeGroup enum, display_order
- Lesson: ebd_session_id, monitor_id, status, contagens, observation
- Attendance: category (STUDENT | VISITOR | LEADER | WORKER | PASTOR)
- Material: publisher enum (CPAD | EBENEZER | OTHERS | DO_NOT_USE)
- Enums de clima e temperatura em EbdSession
- Enums EbdSessionType, EbdReplaceCause
Consequências
- Firestore será estruturado com coleções correspondentes.
- Regras de acesso serão baseadas nas relações definidas.
- Alterações estruturais exigirão novo ADR.
- Este modelo serve como base para organização das camadas domain e application.