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¶
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). |