Skip to main content

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:

  1. Ministry
  2. OrganizationalUnit
  3. User
  4. Role
  5. ClassGroup
  6. EbdSession
  7. Lesson
  8. Attendance
  9. 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
  • email
  • 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)
  • email
  • 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

  1. Toda entidade conterá ministry_id.
  2. Entidades vinculadas a unidade conterão unit_id.
  3. Nenhuma entidade poderá existir fora de contexto organizacional.
  4. O backend será responsável por validação de consistência.
  5. 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.