Entidades e relacionamentos · Área de Trabalho
Diagrama
Carregando diagrama…
Ver código Mermaid
erDiagram
USERS ||--o{ WORK_ITEMS : "dono (ownerUserId)"
WORK_ITEMS ||--o{ WORK_ITEMS : "parentId (subtarefa)"
WORK_ITEMS ||--o{ WORK_ITEM_PEOPLE : "ligacoes"
WORK_ITEMS ||--o{ WORK_ITEM_COMMENTS : "comentarios"
STATUS_LABELS |o--o{ WORK_ITEMS : "situacao"
WORK_TEMPLATES |o--o{ WORK_ITEMS : "modelo de origem"
GUIDELINES |o--o{ WORK_ITEMS : "orientacao"
GUIDELINES |o--o{ WORK_TEMPLATES : "orientacao"
PEOPLE |o--o{ WORK_ITEMS : "personId"
CASES |o--o{ WORK_ITEMS : "caseId"
CONSULTATIONS |o--o{ WORK_ITEMS : "consultationId"
ASSOCIATIONS |o--o{ WORK_ITEMS : "associationId"
WORK_GROUPS ||--o{ WORK_GROUP_MEMBERS : "membros"
USERS ||--o{ WORK_GROUP_MEMBERS : "userId"
USERS ||--o{ SAVED_VIEWS : "titular"
USERS ||--o{ AGENDAS : "titular"
AGENDAS ||--o{ AGENDA_LISTS : "listas"
AGENDA_LISTS ||--o{ AGENDA_LIST_ITEMS : "itens (itemRef)"
USERS ||--o| LABEL_REGISTRIES : "vocabulario de etiquetas"
USERS ||--o{ USAGE_HABITS : "habitos"
USERS ||--o{ DEADLINE_CALENDAR_COVERAGE : "curador"
WORK_ITEMS |o--o{ SERVICE_RECORDS : "appointment_id"
WORK_ITEMS ||--o{ SERVICE_REQUEST_ACTIVITY_LINKS : "activity_id"
O diagrama mostra as chaves estrangeiras. As ligações de work_item_people com usuário, Pessoa, núcleo, subnúcleo e Grupo de Trabalho, os núcleos em nucleos, os Trabalhos citados em saved_views.itemIds e em agenda_list_items.itemRef são referências lógicas, sem chave estrangeira, descritas nas tabelas abaixo.
Modelo físico
O modelo é físico (TypeORM sobre PostgreSQL). O Trabalho concentra Atividade e Compromisso numa tabela só, separadas pelo campo kind: a Atividade preenche vencimento e regra de contagem, o Compromisso preenche hora marcada, duração, local e formato. Quem tem a ver com o Trabalho fica numa tabela de ligação polimórfica, e a conversa numa tabela de comentários; as duas caem por cascata com o Trabalho. Cada pessoa organiza a própria Área de Trabalho em agendas com listas, guarda visões salvas, um vocabulário de etiquetas e seus hábitos de uso. Os cadastros que definem a forma do Trabalho — Modelo, Situação, Orientação e Grupo de Trabalho — vivem em tabelas próprias, e o calendário de feriados decide quais dias são úteis. O adiamento não tem tabela: ele é registrado na trilha do histórico, que é imutável.
Trabalho (work_items)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
kind | enum activity ou appointment | Sim | Não muda depois de criado. |
category | enum, nove valores | Sim | Precisa pertencer ao kind (CHK_work_items_category_kind). |
title | varchar(255) | Sim | — |
body | text | Não | Descrição; no Compromisso, também a pauta. Até 100000 caracteres na entrada. |
tags | varchar(64)[], padrão {}, índice GIN | — | Até 20 etiquetas na entrada. |
priority | enum low, medium, high ou urgent | Não | — |
status | enum, seis valores, padrão pending | — | Precisa pertencer ao kind (CHK_work_items_status_kind): in_progress só na Atividade; postponed e no_show só no Compromisso. |
statusLabelId | UUID, FK → status_labels (SET NULL) | Não | Situação do quadro; o avanço a movimenta. |
dueAt | timestamptz(3) | Não | Vencimento da Atividade; cai no fim do dia civil. |
scheduledAt | timestamptz(3) | Não | Hora marcada do Compromisso. |
durationMin | integer | Não | 1 a 1440 na entrada; só Compromisso. |
location | varchar(255) | Não | Entra em searchText. |
meetingUrl | varchar(300) | Não | Só Compromisso. |
meetingFormat | enum in_person, remote ou hybrid | Não | Só Compromisso. |
preclusionRule | enum calendar_days, business_days ou calendar_days_business_end | Não | Gravada no cálculo; vem da categoria ou do Modelo, nunca do cliente. |
stateCode | char(2) | Não | Unidade federativa da competência do prazo. |
ibgeCode | varchar(7) | Não | Município da competência do prazo. |
templateId | UUID, FK → work_templates (SET NULL) | Não | Modelo de origem; lido apenas na criação. |
guidelineId | UUID, FK → guidelines (SET NULL) | Não | Exclusivo com guidanceText (CHK_work_items_guidance_exclusive). |
guidanceText | text | Não | Exclusivo com guidelineId. |
parentId | UUID, FK → work_items (SET NULL) | Não | Mesmo kind do pai; profundidade máxima 3; sem ciclo. |
originRule | varchar(16) | Não | Só o servidor escreve; hoje apenas RN1. O par (parentId, originRule) torna a regra idempotente. |
ownerUserId | UUID, FK → users (RESTRICT) | Sim | Sempre o ator da criação; não vem do corpo. |
nucleos | varchar(40)[], padrão {}, índice GIN | — | Siglas de núcleo e códigos de subnúcleo responsáveis, em caixa alta, ordenados e sem repetição; recalculados das designações org_unit de responsável e envolvido; nunca informados pelo cliente. |
confidential | boolean, padrão false | — | Restringe o Trabalho a quem tem ligação direta com ele. |
cancelReason | varchar(500) | Condicional | Obrigatório quando status é cancelled (CHK_work_items_cancel_reason). |
cancelledAt, cancelledBy | timestamptz(3), UUID | — | Selados no cancelamento; limpos na reabertura. |
completedAt, completedBy | timestamptz(3), UUID | — | Selados na conclusão; limpos na reabertura. |
personId | UUID, FK → people (SET NULL) | Não | Pessoa a quem o Trabalho se refere; conferida no cadastro antes de gravar. |
caseId | UUID, FK → cases (SET NULL) | Não | Processo ligado. |
consultationId | UUID, FK → consultations (SET NULL) | Não | Entrevista ligada. |
associationId | UUID, FK → associations (SET NULL) | Não | Associação alcançada. |
searchText | text, coluna GERADA STORED, índice GIN | — | Mantida pelo banco a partir de título, descrição, local e etiquetas; fora do contrato. |
deletedAt, deletedBy | timestamptz(3), UUID | — | Exclusão suave; deletedAt preenchido tira o Trabalho das listas. |
createdAt, updatedAt | timestamptz(3) | — | — |
Vocabulários: category aceita task, judicial_deadline e extrajudicial_deadline na Atividade, e service, meeting, hearing, expert_examination, oral_argument e orientation no Compromisso. status aceita pending, in_progress, completed e cancelled na Atividade, e pending, completed, cancelled, postponed e no_show no Compromisso — overdue não é valor de coluna, é calculado na leitura.
Cinco restrições CHECK sustentam as invariantes no próprio banco: coerência entre categoria e tipo; coerência entre estado e tipo; exclusividade entre orientação reutilizável e própria; cancelamento com motivo; e não comparecimento apenas em Compromisso de atendimento. Os índices atendem a paginação por keyset (createdAt, id), o recorte por tipo e categoria, e as buscas por etiqueta, núcleo e texto.
Campos da Ficha da Pessoa em implementação
Estado: em implementação na API.
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
subtype | enum work_item_subtype, anulável | Não | conciliation ou instruction na audiência (hearing); medical ou social na perícia (expert_examination). Outra combinação com a categoria é recusada. |
presidingName | varchar(255), anulável | Não | Nome exibido de quem preside o Compromisso. A operação dedicada deriva o nome de uma Pessoa vinculada ou grava um nome livre aparado, sem criar Pessoa. |
caseMovementId | UUID anulável, FK → case_movements (SET NULL), indexado | Não | Movimentação do mesmo processo vinculada ao Trabalho; exige caseId. |
Pessoas ligadas ao Trabalho (work_item_people)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
workItemId | UUID, FK → work_items (CASCADE) | Sim | — |
role | enum, sete papéis | Sim | Decide as naturezas de alvo admitidas. |
targetType | enum user, person, org_unit ou work_group | Sim | Precisa ser admitida pelo papel. org_unit designa um núcleo (nuclei) ou um subnúcleo (org_subnuclei), não matriz nem filial de org_units. |
targetId | UUID | Sim | Alvo polimórfico, sem chave estrangeira; a existência é conferida no serviço, no cadastro que targetType nomeia. |
position | smallint, padrão 0 | — | Ordem declarada dentro do papel; 0 a 999 na entrada. |
senderUserId | UUID, FK → users (RESTRICT) | Não | Quem criou a ligação. |
senderKind | enum user, machine ou system | Não | Natureza de quem criou a ligação; reservado à autoria institucional, nulo nas ligações criadas por identidade pessoal. |
senderTokenId | UUID, FK → api_tokens (SET NULL) | Não | Credencial de integração que criou a ligação. |
createdAt | timestamptz(3) | — | — |
O índice único (workItemId, role, targetType, targetId) impede ligações repetidas; o POST genérico responde conflito à repetição. Um índice único parcial admite no máximo uma ligação presiding por Trabalho. A substituição dedicada é idempotente e mantém a ligação e presidingName na mesma transação. O alvo é polimórfico por decisão registrada: nenhuma das quatro tabelas alvo é apagada fisicamente por rota desta API, então a chave estrangeira cobriria um risco que o sistema não produz.
Papéis e o que cada um dá: assignee responde pelo Trabalho (lê e altera); involved lê; observer lê e nunca altera; participant lê e mantém o alcance mesmo com sigilo; guest e witness apontam pessoas do cadastro e não concedem acesso nenhum. presiding também não concede acesso: quando quem preside é uma Pessoa resolvida, há uma única ligação presiding/person; na variante de nome livre, não há ligação. assignee e involved com alvo org_unit carimbam em nucleos a sigla do núcleo ou o código do subnúcleo designado.
Comentário do Trabalho (work_item_comments)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
workItemId | UUID, FK → work_items (CASCADE) | Sim | — |
authorUserId | UUID, FK → users (RESTRICT) | Não | Sempre a identidade autenticada; nunca vem do corpo. |
authorKind | enum user, machine ou system | Não | Natureza do autor. |
authorTokenId | UUID, FK → api_tokens (SET NULL) | Não | Credencial de integração autora. |
body | text | Sim | 1 a 10000 caracteres na entrada. |
editedAt | timestamptz(3) | Não | Preenchido na primeira edição. |
createdAt | timestamptz(3) | — | — |
Comentário é conteúdo que o autor edita e apaga, por isso tem tabela. O adiamento fez o caminho oposto: virou registro do histórico unificado, que já guarda data anterior, data nova, motivo e autor, e não admite alteração.
Modelo de Trabalho (work_templates)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
code | varchar(32), único | Não | Código curto para quem cita o Modelo de fora; até 32 caracteres; repetição responde 409. |
name | varchar(255) | Sim | Nome no seletor. |
kind | enum activity ou appointment | Sim | Tipo do Trabalho gerado. |
category | enum, nove valores | Sim | Precisa pertencer ao kind (CHK_work_templates_category_kind). |
titleTemplate | varchar(255) | Não | Título sugerido; quem cria pode substituir. |
bodyTemplate | text | Não | Descrição sugerida. |
guidelineId | UUID, FK → guidelines (SET NULL) | Não | Orientação herdada pelo Trabalho gerado. |
days | integer | Não | Exige countingRule (CHK_work_templates_counting_rule) e precisa ser maior que zero (CHK_work_templates_days_positive). |
countingRule | enum, três regras | Condicional | Substitui a regra derivada da categoria. |
priority | enum, quatro valores | Não | Prioridade sugerida. |
durationMin | integer | Não | Duração sugerida, para Modelo de Compromisso. |
pendingFields | text[], padrão {} | — | Campos que a interface deve solicitar; a ordem é o dado. |
defaultPeople | jsonb, padrão [] | — | Designações padrão sugeridas; cada item tem role, targetType e targetId. A compatibilidade entre papel e natureza é conferida ao gravar o Modelo. |
orgUnitId | UUID, FK → org_units (SET NULL) | Não | Setor a que o Modelo pertence. |
ownerUserId | UUID, FK → users (SET NULL) | Não | Quem cadastrou; fica nulo se o usuário sai, e o Modelo continua servindo. |
enabled | boolean, padrão true | — | false tira o Modelo do seletor sem apagá-lo. |
createdAt, updatedAt | timestamptz(3) | — | — |
days e countingRule são lidos no instante da criação do Trabalho, e apenas de Modelo habilitado: alterar o Modelo depois não retroage ao prazo já calculado. É esse par que tira a definição do prazo de uma constante no código e a põe no cadastro. Título, descrição, orientação, prioridade, duração e designações padrão são sugestões para a interface e não são copiados pelo servidor na criação.
Visão salva (saved_views)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
ownerUserId | UUID, FK → users (CASCADE) | Sim | Titular; sempre o ator, nunca o corpo. |
name | varchar(120) | Sim | Nome que a pessoa dá à visão. |
folder | varchar(120) | Não | Agrupamento livre entre as visões do titular. |
position | numeric(20,10), padrão 0 | — | Ordenação fracionária entre as visões do titular. |
kind | enum manual ou query | Sim | Não muda depois de criada. |
category | enum, nove valores | Não | Pré-filtro por categoria de Trabalho. |
queryJson | text | Condicional | Exigido na visão de consulta e proibido na manual (CHK_saved_views_query_json); até 4000 caracteres, JSON válido, guardado e devolvido sem interpretação. |
labels | varchar(64)[], padrão {} | — | Rótulos pessoais da visão. |
itemIds | UUID[], padrão {} | — | Trabalhos da lista manual, na ordem do array e sem repetição; referências opacas, sem chave estrangeira. |
createdAt, updatedAt | timestamptz(3) | — | — |
As referências de itemIds são opacas de propósito: a lista de alguém não quebra porque um Trabalho foi para a lixeira. O índice (ownerUserId, folder, position) atende à apresentação do painel pessoal.
Feriado (holidays)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
dateKey | char(10) | Sim | Data civil YYYY-MM-DD; é a chave usada pelo motor de prazo. |
title | varchar(200) | Sim | Descrição do feriado. |
holidayType | enum, padrão feriado | — | Distingue feriado de ponto facultativo e congêneres. |
jurisdiction | varchar(20) | Não | Abrangência declarada. |
city | varchar(60) | Não | Município, quando municipal. |
stateCode | char(2) | Não | Unidade federativa, quando estadual. |
year | integer | Sim | Ano derivado da data; sustenta a leitura por faixa de anos. |
source | varchar(120) | Não | Origem do dado na importação. |
enabled | boolean, padrão true | — | false retira o dia do cálculo sem apagar o registro. |
createdAt, updatedAt | timestamptz(3) | — | — |
O índice único (dateKey, jurisdiction, city) torna a importação idempotente: rodar o comando duas vezes não duplica feriado. O calendário entra hoje por comando de importação; não há rota de administração.
Cobertura do calendário (deadline_calendar_coverage)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
scope | enum national, state ou city | Sim | Território da cobertura declarada. |
stateCode | char(2) | Condicional | Nulo no nacional; preenchido no estadual e no municipal (CHK_coverage_state_code). |
ibgeCode | varchar(7) | Condicional | Preenchido apenas no municipal (CHK_coverage_ibge_code). |
effectiveFrom | date | Sim | Início do período conferido. |
effectiveTo | date | Não | Fim do período; nulo significa cobertura aberta. Não pode anteceder o início (CHK_coverage_period). |
curatedBy | UUID, FK → users (RESTRICT) | Sim | Quem conferiu o período. |
createdAt, updatedAt | timestamptz(3) | — | — |
A tabela existe porque a lista de feriados sozinha não distingue "este território não tem feriado neste período" de "ninguém cadastrou este período", e essa indistinção faz o motor devolver uma data com aparência de conferida. A recusa de prazo sobre período sem cobertura ainda não está implementada.
Situação do quadro (status_labels)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
nucleusSigla | varchar(16) | Sim | Núcleo dono da Situação. |
name | varchar(60) | Sim | Único por núcleo (nucleusSigla, name); repetição responde 409. |
canonicalStatus | enum de estado canônico | Sim | Diz a que estado do Trabalho a Situação corresponde. |
position | integer, padrão 0 | — | Define a ordem do avanço. |
enabled | boolean, padrão true | — | A sequência devolve apenas as habilitadas. |
createdAt, updatedAt | timestamptz(3) | — | — |
Orientação (guidelines)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
title | varchar(255) | Sim | — |
body | text | Não | Até 100000 caracteres na entrada. |
shortcut | varchar(40) | Não | Atalho de busca. |
kind | enum, padrão both | — | Diz a que tipo de trabalho a orientação serve. |
ownerUserId | UUID, FK → users | Não | Autor do cadastro. |
createdAt, updatedAt | timestamptz(3) | — | — |
Grupo de Trabalho (work_groups) e membro (work_group_members)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
name | varchar(120) | Sim | — |
description | varchar(500) | Não | — |
ownerUserId | UUID, FK → users (SET NULL) | Não | Dono do grupo; sempre a identidade que o criou e sempre membro. |
enabled | boolean, padrão true | — | Desligar corta o alcance coletivo sem apagar os membros. |
createdAt, updatedAt | timestamptz(3) | — | — |
O membro fica em work_group_members, com id, workGroupId e userId (ambos CASCADE). O par é único, então o mesmo vínculo não se repete. A alteração dos membros substitui a lista inteira, mantendo o dono.
Agenda (agendas)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
name | varchar(120) | Sim | Nome da agenda. |
ownerUserId | UUID, FK → users (CASCADE) | Sim | Titular; sempre a identidade autenticada. |
position | double precision, padrão 0 | — | Ordem entre as agendas do titular. |
createdAt, updatedAt | timestamptz(3) | — | — |
Lista da agenda (agenda_lists)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
agendaId | UUID, FK → agendas (CASCADE) | Sim | Agenda da lista; a lista só muda para outra agenda do mesmo titular. |
name | varchar(120) | Sim | Nome da lista. |
ownerUserId | UUID | Sim | Titular, igual ao da agenda. |
position | double precision, padrão 0 | — | Ordem dentro da agenda. |
listKind | enum manual ou query | Sim | Lista de Trabalhos escolhidos ou lista de consulta. |
activityType | enum task, judicial_deadline ou extrajudicial_deadline | Não | Pré-filtro por categoria de Atividade. |
queryJson | text | Não | Critérios da lista de consulta; até 4000 caracteres e JSON válido na entrada. |
labels | varchar(64)[], padrão {} | — | Até 32 rótulos na entrada. |
createdAt, updatedAt | timestamptz(3) | — | — |
Item da lista (agenda_list_items)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
listId | UUID, FK → agenda_lists (CASCADE) | Sim | Lista do item. |
itemRef | varchar(64) | Sim | Referência opaca work-items:<uuid>, sem chave estrangeira; única por lista (listId, itemRef). |
position | double precision, padrão 0 | — | Ordem na lista; renumerada em sequência quando duas posições ficam próximas demais. |
createdAt, updatedAt | timestamptz(3) | — | — |
Apagar a agenda apaga suas listas e itens; apagar a lista apaga seus itens. Os Trabalhos citados não são afetados, e a referência opaca mantém a lista válida quando um Trabalho vai para a lixeira.
Vocabulário de etiquetas (label_registries)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
ownerUserId | UUID, FK → users (CASCADE), único | Sim | Um vocabulário por pessoa. |
items | jsonb, padrão [] | — | Etiquetas com slug, name, symbol, color e lastUsedISO; até 200 itens, substituídos de uma vez. |
createdAt, updatedAt | timestamptz(3) | — | — |
Hábito de uso (usage_habits)
| Atributo | Tipo | Obrigatório | Regra |
|---|---|---|---|
id | UUID, chave primária | Gerado | — |
ownerUserId | UUID, FK → users (CASCADE) | Sim | Titular. |
kind | varchar(32) | Sim | Natureza do hábito; o prefixo lia. é reservado aos hábitos registrados pela Lia. |
ref | varchar(64) | Sim | Referência usada. |
count | integer, padrão 0 | — | Soma um a cada uso registrado. |
lastUsedAt | timestamptz(3) | Sim | Último uso. |
createdAt | timestamptz(3) | — | — |
O índice único (ownerUserId, kind, ref) mantém um registro por hábito; usos repetidos incrementam a contagem.
Relações e cardinalidades
| Relação | Cardinalidade | Obrigatória | Integridade |
|---|---|---|---|
| Trabalho → Pessoas ligadas, Comentários | 1:N | Não | CASCADE |
| Trabalho → Trabalho (subtarefa e continuidade) | 1:N | Não | SET NULL; mesmo kind; profundidade máxima 3; sem ciclo |
| Trabalho → Usuário dono | N:1 | Sim | RESTRICT |
| Trabalho → Situação | N:1 | Não | SET NULL |
| Trabalho → Modelo | N:1 | Não | SET NULL; lido apenas na criação |
| Trabalho → Orientação | N:1 | Não | SET NULL; exclusiva com a orientação própria |
| Trabalho → Pessoa, Processo, Entrevista, Associação | N:1 | Não | SET NULL |
| Trabalho → Núcleo ou Subnúcleo | N:N por sigla ou código (nucleos) | Não | Sem FK; projetado das designações org_unit |
| Ligação → alvo (Usuário, Pessoa, Núcleo ou Subnúcleo, Grupo) | N:1 polimórfica | Sim | Sem FK; existência conferida no serviço |
| Modelo → Orientação, Setor, Usuário | N:1 | Não | SET NULL |
| Visão salva → Usuário titular | N:1 | Sim | CASCADE |
Visão salva → Trabalho (itemIds) | N:N por array | Não | Sem FK; referência opaca |
| Grupo de Trabalho → Membro | 1:N | Não | CASCADE; par único |
| Grupo de Trabalho → Usuário dono | N:1 | Não | SET NULL |
| Agenda → Usuário titular | N:1 | Sim | CASCADE |
| Agenda → Lista | 1:N | Não | CASCADE |
| Lista → Item | 1:N | Não | CASCADE; (listId, itemRef) único |
Item da lista → Trabalho (itemRef) | N:1 | Sim | Sem FK; referência opaca |
| Vocabulário de etiquetas → Usuário | 1:1 | Sim | CASCADE; titular único |
| Hábito de uso → Usuário | N:1 | Sim | CASCADE; (ownerUserId, kind, ref) único |
| Cobertura do calendário → Usuário curador | N:1 | Sim | RESTRICT |
Atendimento → Trabalho (service_records.appointment_id) | N:1 | Não | SET NULL |
Solicitação → Trabalho (service_request_activity_links.activity_id) | N:1 | Não | RESTRICT |
Ciclo de vida
O Trabalho é criado, alterado e encerrado indefinidamente. A exclusão é suave: deletedAt tira o registro das listas e o mantém na lixeira, de onde ele volta pela restauração. Não há exclusão física por rota, e as duas chaves estrangeiras que vêm de fora — do Atendimento e da Solicitação — preservam o histórico dessas áreas.
Os cadastros de apoio seguem a mesma lógica de permanência: o Modelo e o Grupo de Trabalho são desabilitados, não apagados, porque Trabalhos já criados continuam citando seus identificadores. A Visão salva, a agenda e suas listas são exceções: são preferências de uso, e por isso são apagadas de verdade, sem lixeira. O Grupo de Trabalho desabilitado deixa de dar alcance aos Trabalhos em que está ligado.