Pular para conteúdo

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.