Database¶
O CoreFlow Time usa PostgreSQL e models Django com chave inteira padrão. Não há BaseModel compartilhado: os models usam criado_em/atualizado_em quando aplicável. O inventário foi conferido no repositório coreflow-time.
Diagrama entidade-relacionamento¶
erDiagram
USER ||--o{ PROJETO : responsavel
PROJETO ||--o{ SPRINT : contem
SPRINT ||--o{ ENTREGA_SPRINT : detalha
PROJETO o|--o{ QUADRO : organiza
USER o|--o{ QUADRO : cria
QUADRO ||--o{ COLUNA : contem
COLUNA ||--o{ CARD : contem
USER o|--o{ CARD : responsavel
ENTREGA_SPRINT o|--o{ CARD : vincula
USER o|--o{ OCORRENCIA : emite
USER o|--o{ PROBLEMA : cria
PROBLEMA ||--o{ INTEGRANTE : envolve
PROBLEMA ||--o{ REUNIAO : agenda
PROBLEMA ||--o{ CAUSA : analisa
CAUSA ||--o| PLANO_ACAO : possui
USER o|--o{ PLANO_ACAO : responsavel
PLANO_ACAO ||--o| VERIFICACAO : verifica
PROBLEMA ||--o| RESULTADO : consolida
USER o|--o{ LOG : registra
Ocorrencia não possui FK para o conjunto Ishikawa. Card pode ser vinculado a uma EntregaSprint, que pertence a uma Sprint e a um Projeto.
Dicionário de dados¶
| Modelo / tabela | Campos persistidos (tipo; nulo; default) | FK, índices e restrições |
|---|---|---|
User / accounts_user |
id: bigint; campos AbstractUser; avatar: image (sim); created_at/updated_at: timestamptz |
PK e índices padrão de autenticação |
Log / core_log |
id: bigint; usuario: bigint (sim); acao: smallint; descricao: text; data_hora: timestamptz=now |
usuário SET_NULL; data_hora indexado |
Projeto / projetos_projeto |
id: bigint; nome: varchar(150); descricao: text; status: varchar=planejamento; data_inicio: date; data_fim: date (sim); responsavel: bigint (sim); timestamps |
responsável → User SET_NULL; ordenação por criação |
Sprint / projetos_sprint |
id: bigint; projeto: bigint; nome: varchar(100); backlog_inicial: integer; data_inicio/data_fim: date; status=planejamento; timestamps |
projeto → Projeto CASCADE; índice projeto/data |
EntregaSprint / projetos_entregasprint |
id: bigint; sprint: bigint; periodo: smallint; rotulo: varchar; planejado/realizado: integer (realizado=0) |
sprint → Sprint CASCADE; UNIQUE (sprint, periodo) |
Quadro / kanban_quadro |
id: bigint; nome: varchar(150); descricao: text; projeto/criado_por: bigint (sim); timestamps |
projeto/User SET_NULL |
Coluna / kanban_coluna |
id: bigint; quadro: bigint; nome: varchar(100); codigo=aguardando; ordem: smallint=0; cor=var(--accent-cyan) |
quadro → Quadro CASCADE; UNIQUE (quadro, codigo) |
Card / kanban_card |
id: bigint; coluna: bigint; titulo: varchar(200); descricao: text; tipo=atividade; prioridade=media; responsáveis, entrega e criador (nulos); data_limite: date (sim); ordem=0; timestamps |
coluna CASCADE; demais FKs SET_NULL; ordenação coluna/ordem |
Ocorrencia / qualidade_ocorrencia |
id: bigint; data: date; emitente: bigint (sim); origem/origem_fornecedor/centro_custo/tipo: varchar; descricao: text; quantidade: integer=1; reincidencia=false; criticidade/disposição/status (status=em_andamento); timestamps |
emitente → User SET_NULL; índices data/status/origem |
Problema / ishikawa_problema |
id: bigint; nome: varchar(200); problema: text; tipo_indicador; data: date; criado_por: bigint (sim); timestamps |
criado_por → User SET_NULL |
Integrante / ishikawa_integrante |
id: bigint; problema: bigint; nome: varchar(150); area: varchar(100); telefone: varchar(30); email |
problema → Problema CASCADE |
Reuniao / ishikawa_reuniao |
id: bigint; problema: bigint; data: date; hora: time (sim); local: varchar(200); tema: text; status=nao_realizada |
problema → Problema CASCADE; índice data |
Causa / ishikawa_causa |
id: bigint; problema: bigint; categoria; descricao: varchar(300); peso: smallint=5; meta_gasto: numeric (sim) |
problema → Problema CASCADE; ordenação peso/categoria |
PlanoAcao / ishikawa_planoacao |
id: bigint; causa: bigint; acao: text; responsavel: bigint (sim); data_inicio: date; prazo_dias: integer=30; criado_em: timestamptz |
OneToOne causa CASCADE; responsável SET_NULL |
Verificacao / ishikawa_verificacao |
id: bigint; plano: bigint; ocorreu_como_planejado: boolean (sim); data_real_termino: date (sim); status=nao_iniciada; observacao: text |
OneToOne plano CASCADE |
Resultado / ishikawa_resultado |
id: bigint; problema: bigint; meta_gasto/gasto_real: numeric; observacao: text |
OneToOne problema CASCADE |
Convenções¶
Campos blank=True de texto permanecem NOT NULL no PostgreSQL e recebem string vazia no formulário; somente os campos marcados como nulos aceitam NULL. Os códigos de Log.acao seguem o serviço de auditoria: 3 alteração, 4 inclusão, 5 exclusão, 6 importação e 7 exportação.