Pular para conteúdo

Database

O produto usa PostgreSQL e Django ORM. accounts.User estende AbstractUser; os modelos de vagas usam chaves inteiras padrão e as entidades de DP têm relações protegidas ou em cascata conforme as regras abaixo. O catálogo foi levantado em apps/accounts/models.py, apps/jobs/models.py, apps/dp/models.py e apps/core/models.py do repositório coreflow-people. apps/ai e apps/scraper não declaram modelos próprios.

Diagrama entidade-relacionamento

erDiagram USER ||--o{ SEARCH_SESSION : inicia USER ||--o{ SEARCH_QUERY : consulta SEARCH_SESSION o|--o{ JOB_POSTING : coleta USER ||--o{ USER_JOB_INTERACTION : registra JOB_POSTING ||--o{ USER_JOB_INTERACTION : recebe USER o|--o{ LOG : ator CARGO ||--o{ FUNCIONARIO : classifica SETOR ||--o{ FUNCIONARIO : lota JORNADA o|--o{ FUNCIONARIO : define FUNCIONARIO ||--o{ MARCACAO : possui MARCACAO ||--o{ JUSTIFICATIVA : justifica FUNCIONARIO ||--o{ FERIAS_FUNCIONARIO : participa FERIAS ||--o{ FERIAS_FUNCIONARIO : inclui

As relações do diagrama refletem chaves estrangeiras. Não há entidade persistida para uma candidatura do domínio Carreira; esse escopo ainda está planejado.

Dicionário de dados

bigint é a chave padrão dos modelos sem chave declarada. Campos textuais com blank=True e sem null=True aceitam string vazia, mas continuam NOT NULL; ="" indica esse comportamento da camada Django, não um DEFAULT SQL explícito. auto indica valor mantido pelo Django (auto_now, auto_now_add ou gerador declarado no model). Campos herdados de AbstractUser são resumidos como campos Django de autenticação, incluindo as relações many-to-many de grupos e permissões.

Identidade e auditoria

Entidade / tabela Campos persistidos (tipo; nulo; default) FK, índices e restrições
User / accounts_user id: bigint; campos AbstractUser (username: varchar(150), password: varchar(128), last_login: timestamptz nulo, is_superuser/is_staff/is_active: boolean, first_name/last_name: varchar(150), email: varchar(254), date_joined: timestamptz, grupos/permissões M2M); phone: varchar(20)=""; avatar: varchar(100) (sim, caminho do arquivo); zip_code: varchar(9)=""; state: varchar(2)=""; city/neighborhood: varchar(100)=""; latitude/longitude: numeric(9,6) (sim); professional_headline: varchar(200)=""; desired_roles/skills: jsonb=[]; experience_level: varchar(20)=""; salários atual/mínimo/máximo numeric(10,2) (sim); resume_text: text=""; linkedin_url/github_url/portfolio_url: varchar(200)=""; contract_types/work_modes/preferred_locations: jsonb=[]; open_to_relocation=false; open_to_remote=true; theme: varchar(20)=dracula; profile_completed=false; profile_step: integer=1; notifications_email=true; timestamps automáticos Usuário customizado de autenticação; ordenação por date_joined decrescente. username e índices herdados de AbstractUser.
Log / core_log id: bigint; usuario: bigint (sim); acao: varchar(1); descricao: varchar(255); criado_em: timestamptz automático usuario → User SET_NULL; ordenação por criação decrescente.

Busca e interação com vagas

Entidade / tabela Campos persistidos (tipo; nulo; default) FK, índices e restrições
SearchSession / jobs_searchsession id: bigint; user: bigint; query: varchar(300); location: varchar(200)=""; state: varchar(2)=""; status: varchar(20)=pending; total_found/total_saved: integer=0; celery_task_id: varchar(100)=""; error_message: text=""; started_at: timestamptz automático; completed_at: timestamptz (sim) user → User CASCADE; ordenação por início decrescente.
JobPosting / jobs_jobposting id: bigint; source: varchar(20); external_id: varchar(200); session: bigint (sim); title: varchar(300); company: varchar(200)=""; description/requirements: text=""; url: varchar(500); state: varchar(2)=""; city/neighborhood: varchar(100)=""; work_mode: varchar(20)=unknown; contract_type: varchar(20)=unknown; salary_min/salary_max: numeric(10,2) (sim); location_priority: integer=4; ai_match_score: double precision (sim); ai_summary: text=""; ai_pros/ai_cons: jsonb=[]; ai_analyzed_at/published_at: timestamptz (sim); created_at/updated_at automáticos; is_active=true session → SearchSession SET_NULL; UNIQUE (source, external_id); índices por (source, state, city), score IA e prioridade geográfica; ordenação por prioridade, score e publicação.
UserJobInteraction / jobs_userjobinteraction id: bigint; user/job: bigint; action: varchar(20); notes: text=""; created_at: timestamptz automático user → User CASCADE; job → JobPosting CASCADE; UNIQUE (user, job, action); ordenação por criação decrescente.
SearchQuery / jobs_searchquery id: bigint; user: bigint; query: varchar(300); location: varchar(200)=""; results_count: integer=0; used_at: timestamptz automático user → User CASCADE; ordenação por uso decrescente.

Departamento Pessoal

Entidade / tabela Campos persistidos (tipo; nulo; default) FK, índices e restrições
Cargo / dp_cargo id: bigint; nome: varchar(100); ativo: boolean=true Ordenação por nome.
Setor / dp_setor id: bigint; nome: varchar(100); eh_pj: boolean=false; ativo: boolean=true Ordenação por nome.
Jornada / dp_jornada id: bigint; nome: varchar(100); dias_semana: integer[]; entrada/saida: time; saida_almoco/retorno_almoco: time (sim); carga_horaria_diaria: numeric(5,2) PostgreSQL ArrayField; ordenação por nome.
Feriado / dp_feriado id: bigint; data: date; descricao: varchar(150); abrangencia: varchar(20)=nacional Choices: nacional, estadual ou municipal; ordenação por data.
Funcionario / dp_funcionario id: bigint; matricula: varchar(20) UNIQUE; nome: varchar(150); cpf: varchar(11) UNIQUE; data_admissao: date; data_demissao: date (sim); localizacao: varchar(100)=""; ativo: boolean=true; cargo/setor: bigint; jornada: bigint (sim) cargo → Cargo PROTECT; setor → Setor PROTECT; jornada → Jornada PROTECT; ordenação por nome.
Marcacao / dp_marcacao id: bigint; funcionario: bigint; data: date; entrada/saida_almoco/retorno_almoco/saida: time (sim); conformidade: varchar(20)=""; dsr_calculado: boolean=false funcionario → Funcionario PROTECT; UNIQUE (funcionario, data); ordenação por data decrescente.
Justificativa / dp_justificativa id: bigint; marcacao: bigint; motivo: text; anexo: varchar(100) (sim, caminho do arquivo); aprovado: boolean (sim); criado_em: timestamptz automático marcacao → Marcacao CASCADE; ordenação por criação decrescente. aprovado=NULL representa pendente.
Ferias / dp_ferias id: bigint; nome: varchar(100); data_inicio/data_termino: date Período nomeado; ordenação por início decrescente.
FeriasFuncionario / dp_feriasfuncionario id: bigint; funcionario/ferias: bigint Ambas as FKs CASCADE; UNIQUE (funcionario, ferias).

Referências

  • Blueprint
  • APIs
  • Models: apps/accounts/models.py, apps/jobs/models.py, apps/dp/models.py, apps/core/models.py no repositório coreflow-people.