Entidades e relacionamentos · Atendimento

Diagrama

Relacionamentos do Atendimento

Carregando diagrama…

Ver código Mermaid
erDiagram
  PEOPLE ||--o{ SERVICE_RECORDS : atende
  ORG_UNITS ||--o{ SERVICE_RECORDS : responsavel
  SERVICE_RECORDS ||--o| REMOTE_DETAILS : modalidade
  SERVICE_RECORDS ||--o| ONSITE_DETAILS : modalidade
  SERVICE_RECORDS ||--o{ SUBJECTS : contem
  SUBJECTS ||--o| CONCLUSIONS : conclui
  SERVICE_RECORDS ||--o{ PARTICIPANTS : possui
  USERS ||--o{ PARTICIPANTS : atende
  SERVICE_RECORDS ||--o{ REQUESTS : origina
  PEOPLE ||--o{ REQUESTS : possui
  SUBJECTS o|--o{ REQUESTS : contextualiza
  USERS o|--o{ REQUESTS : responsavel
  WORK_GROUPS o|--o{ REQUESTS : responsavel
  REQUESTS ||--o{ REQUEST_ITEMS : contem
  USERS o|--o{ REQUEST_ITEMS : valida
  REQUEST_ITEMS ||--o{ PRESENTATIONS : recebe
  SERVICE_RECORDS ||--o{ PRESENTATIONS : cumpre
  DOCUMENTS o|--o{ PRESENTATIONS : comprova
  USERS ||--o{ PRESENTATIONS : recebe
  REQUESTS ||--o{ ACTIVITY_LINKS : vincula
  WORK_ITEMS ||--o{ ACTIVITY_LINKS : atividade
  USERS ||--o{ ACTIVITY_LINKS : vincula
  REQUESTS ||--o{ REQUEST_COMMANDS : deduplica
  REQUEST_ITEMS o|--o{ REQUEST_COMMANDS : comanda
  ROUTES ||--o{ OCCURRENCES : agenda
  OCCURRENCES ||--o{ STOPS : organiza
  STOPS o|--o{ ONSITE_DETAILS : localiza
  SERVICE_RECORDS ||--o{ INTERACTIONS : comunica
  USERS o|--o{ INTERACTIONS : registra
  OUTBOX o|--o{ INTERACTIONS : envia
  SERVICE_RECORDS ||--o{ INTERACTION_COMMANDS : deduplica

Modelo físico

O Registro identifica a Pessoa atendida. Cada Registro usa o detalhe da sua modalidade; os dois detalhes não são simultaneamente obrigatórios. Solicitações preservam o cumprimento por itens e apresentações; Rotas organizam Ocorrências e Paradas; interações preservam comunicações. Os responsáveis da Rota são um array de UUIDs validado pelo serviço, não uma tabela de junção com FKs individuais.

Registro de Atendimento (service_records)

ColunaTipoSignificado
iduuidIdentificador.
person_iduuid, obrigatórioPessoa atendida; FK people, RESTRICT, imutável.
unit_iduuidUnidade responsável; FK org_units, RESTRICT; não é o local físico.
responsible_nucleus_siglavarchar(40)Núcleo do alcance de leitura e escrita.
modeservice_modeREMOTO ou PRESENCIAL; fixo.
directionservice_record_directionINBOUND ou OUTBOUND.
originservice_record_originESPONTANEO, ROTA, AUTOMACAO ou AGENDAMENTO.
is_appointmentbooleanVerdadeiro implica AGENDADO e AGENDAMENTO.
appointment_iduuid, nuloCompromisso de origem, SET NULL, único quando presente.
statusservice_record_statusSeis estados do ciclo.
started_at / closed_attimestamptz(3), nuloPrimeiro início; encerramento/cancelamento.
versionintegerControle otimista por expectedVersion.
idempotency_keyvarchar(100), nuloIdempotência da criação.

Detalhes e filhos

EntidadeCampos e função
service_record_remote_detailsPossui id, service_record_id único com CASCADE, channel (WHATSAPP, TELEFONE, VIDEOCONFERENCIA, EMAIL, REDE_SOCIAL), channel_account_id e external_conversation_id opcionais sem FK.
service_record_onsite_detailsPossui id, service_record_id único com CASCADE, location, location_unit_id (SET NULL), route_stop_id (SET NULL) e arrived_at.
service_record_subjectsPossui id, service_record_id, purpose (AVULSO, ENTREVISTA_INAUGURAL, ACOMPANHAMENTO, SOLICITACAO, ORIENTACAO, FINANCEIRO), referências opcionais a entrevista, processo e contrato de honorários, e timestamps.
service_record_conclusionsPossui id, subject_id único, type (PROVIDENCIAS ou SEM_INTERCORRENCIA), note de 1–20.000 caracteres, autor opcional e timestamps.
service_record_participantsÉ uma join table com chave composta (service_record_id, user_id); o usuário deve estar ativo e lotado no núcleo responsável.
service_record_conclusion_templatesPossui id, title até 255, content até 20.000, active e timestamps.

Solicitação (service_requests)

Preserva o pedido e seu responsável único.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
idempotency_keyvarchar(100)SimÚnico; repetição equivalente reapresenta a Solicitação.
service_record_iduuidSimRegistro de origem; FK RESTRICT.
person_iduuidDerivadoPessoa do Registro de origem; FK RESTRICT.
subject_iduuid; nullNãoAssunto opcional do Registro; FK RESTRICT.
responsible_user_iduuid; nullCondicionalFK users RESTRICT; exatamente um responsável entre usuário e grupo.
responsible_group_iduuid; nullCondicionalFK work_groups RESTRICT; exatamente um responsável entre usuário e grupo.
due_attimestamptz(3); nullNãoPrazo da Solicitação.
canceled_attimestamptz(3); nullDerivadoData do cancelamento.
cancellation_reasonvarchar(500); nullCondicionalMotivo do cancelamento.
versioninteger; padrão 1GeradoVersão da Solicitação, distinta da versão dos itens.
created_attimestamptz(3)GeradoData de criação.
updated_attimestamptz(3)GeradoData da última atualização.

Item da Solicitação (service_request_items)

Define um cumprimento esperado.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
request_iduuidSimSolicitação; FK RESTRICT.
titlevarchar(255)SimDescrição do item.
kindenumSimDOCUMENT, INFORMATION ou ATTENDANCE.
statusenum; padrão PENDINGGeradoPENDING, RECEIVED, VALIDATING, ACCEPTED, REJECTED ou WAIVED.
versioninteger; padrão 1GeradoConcorrência por item.
resolved_attimestamptz(3); nullDerivadoResolução por aceite ou dispensa.
validated_by_user_iduuid; nullDerivadoAutor da avaliação; FK users RESTRICT.
validation_notevarchar(1000); nullNãoObservação da avaliação.
created_attimestamptz(3)GeradoData de criação.
updated_attimestamptz(3)GeradoData da última atualização.

Apresentação (service_request_presentations)

Preserva cada recebimento, inclusive reapresentações.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
item_iduuidSimItem; FK RESTRICT.
sequenceintegerGeradoSequência única por item.
fulfillment_service_record_iduuidSimRegistro de cumprimento da mesma Pessoa; FK RESTRICT.
document_iduuid; nullCondicionalDocumento exigido para item DOCUMENT; FK RESTRICT.
received_by_user_iduuidDerivadoAutor do recebimento; FK users RESTRICT.
idempotency_keyvarchar(100)SimÚnico.
received_attimestamptz(3)GeradoData do recebimento.

Relaciona a Solicitação com uma atividade da mesma Pessoa.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
request_iduuidSimSolicitação; FK RESTRICT.
activity_iduuidSimAtividade; FK work_items RESTRICT; par com request_id único.
linked_by_user_iduuidDerivadoAutor do vínculo; FK users RESTRICT.
created_attimestamptz(3)GeradoData de criação.

Comando da Solicitação (service_request_commands)

Recibo interno de idempotência; não é um segundo cadastro de pedido.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
request_iduuidSimSolicitação; FK RESTRICT.
item_iduuid; nullCondicionalItem alvo, quando aplicável; FK RESTRICT.
actionvarchar(20)DerivadoOperação executada.
idempotency_keyvarchar(100)SimÚnico entre comandos.
fingerprintchar(64)DerivadoAssinatura do conteúdo para distinguir repetição de divergência.
created_attimestamptz(3)GeradoData de criação.

Rota (service_routes)

Configura recorrência e responsáveis.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
namevarchar(160)SimNome da Rota.
responsible_nucleus_siglavarchar(40)SimNúcleo responsável, validado pelo serviço.
responsible_user_idsuuid[]SimResponsáveis ativos e elegíveis; sem FK por elemento.
frequencyenumSimdaily, weekly ou monthly.
intervalinteger; padrão 1 no bancoSim na criaçãoIntervalo da recorrência, de 1 a 365.
weekdaysinteger[]; padrão vazioCondicionalDias de 0 a 6; exigidos em recorrência semanal e mensal.
week_of_monthinteger; nullCondicionalDe 1 a 5; exigido na recorrência mensal.
periodvarchar(80)SimPeríodo da visita.
transportvarchar(160)SimTransporte.
holiday_policyenumSimnext_business_day, previous_business_day ou skip.
created_attimestamptz(3)GeradoData de criação.
updated_attimestamptz(3)GeradoData da última atualização.

Ocorrência (service_route_occurrences)

Representa uma execução da Rota em uma data.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
route_iduuidSimRota; FK RESTRICT.
requested_datedateSimData solicitada; única por Rota.
effective_datedate; nullDerivadoData após calendário; única por Rota quando não nula.
statusenumGeradoplanned, in_progress, completed, cancelled ou skipped.
versioninteger; padrão 1GeradoConcorrência nas transições.
started_attimestamptz(3); nullDerivadoInício da execução.
ended_attimestamptz(3); nullDerivadoFim da execução.
created_attimestamptz(3)GeradoData de criação.
updated_attimestamptz(3)GeradoData da última atualização.

Parada (service_route_stops)

Define local e ordem da visita.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
occurrence_iduuidSimOcorrência; FK RESTRICT.
positionintegerSimPosição única na Ocorrência.
locationtextSimDescrição do local.
planned_arrival_attimestamptz(3); nullNãoChegada prevista.
arrived_attimestamptz(3); nullDerivadoPrimeira chegada.
left_attimestamptz(3); nullDerivadoPrimeira saída, após chegada.
created_attimestamptz(3)GeradoData de criação.
updated_attimestamptz(3)GeradoData da última atualização.

Interação (service_record_interactions)

Preserva comunicação manual, sincronizada ou enviada.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
service_record_iduuidSimRegistro; FK CASCADE.
channelenumSimWHATSAPP, PHONE, EMAIL, VIDEO, IN_PERSON ou NOTE.
directionenumSimINCOMING, OUTGOING ou INTERNAL.
deliveryenumDerivadoRECORDED, SYNCED, SIMULATED ou SENT.
idempotency_keyvarchar(200)SimÚnico dentro do Registro.
summaryvarchar(4096); nullCondicionalResumo da comunicação.
external_message_idvarchar(255); nullNãoIdentificador externo; único dentro do Registro quando presente.
outbox_entry_iduuid; nullDerivadoEntrada de saída; FK RESTRICT.
actor_user_iduuid; nullDerivadoAutor; FK users SET NULL.
occurred_attimestamptz(3)SimMomento da interação.
created_attimestamptz(3)GeradoData de criação.

Comando da interação (service_record_interaction_commands)

Recibo interno de envio ou sincronização.

AtributoTipoObrigatórioRegra
iduuidGeradoChave primária.
service_record_iduuidSimRegistro; FK CASCADE.
idempotency_keyvarchar(200)SimÚnico dentro do Registro.
actionvarchar(20)DerivadoOperação executada.
fingerprintchar(64)DerivadoAssinatura do conteúdo do comando.
created_attimestamptz(3)GeradoData de criação.

Relações e cardinalidades

RelaçãoCardinalidadeObrigatóriaIntegridade
Registro → detalhe remoto / presencial1 : 0..1 por modalidadeO detalhe correspondente à modalidadeFK única; CASCADE.
Registro / Pessoa → Solicitações1 : 0..NSim na SolicitaçãoRESTRICT em ambas as FKs.
Assunto → Solicitações1 : 0..NNão na SolicitaçãoRESTRICT.
Usuário / grupo → Solicitações1 : 0..NExatamente uma das duas FKsCHECK de um responsável; RESTRICT.
Solicitação → itens1 : 0..N no bancoSim no item; criação exige itensRESTRICT.
Usuário → itens avaliados1 : 0..NNão no itemRESTRICT.
Item → apresentações1 : 0..NSim na apresentaçãoRESTRICT; sequência única por item.
Registro de cumprimento / usuário recebedor → apresentações1 : 0..NSim na apresentaçãoRESTRICT.
Documento → apresentações1 : 0..NCondicional ao tipo DOCUMENTFK nullable; RESTRICT.
Solicitação / atividade / usuário autor → vínculos de atividade1 : 0..NSim no vínculoRESTRICT; par Solicitação–atividade único.
Solicitação → comandos1 : 0..NSim no comandoRESTRICT.
Item → comandos1 : 0..NNão no comandoRESTRICT.
Rota → Ocorrências1 : 0..NSim na OcorrênciaRESTRICT; data solicitada única por Rota; data efetiva única quando presente.
Ocorrência → Paradas1 : 0..NSim na ParadaRESTRICT; posição única por Ocorrência.
Parada → detalhes presenciais1 : 0..NNão no detalheSET NULL; vínculo não muda a modalidade.
Registro → interações / comandos de interação1 : 0..NSim no filhoCASCADE.
Outbox → interações1 : 0..NNão na interaçãoRESTRICT.
Usuário → interações1 : 0..NNão na interaçãoSET NULL.

Ciclo de vida

A Solicitação nasce com itens pendentes. Cada apresentação preserva o recebimento; recusar um item permite reapresentação sem apagar as anteriores. Aceite e dispensa resolvem o item. O estado agregado e o atraso são projeções, não colunas adicionais. Cancelar preserva o pedido e seu histórico e impede novos comandos. O encerramento do Registro de origem não encerra automaticamente a Solicitação.

A Rota preserva sua configuração recorrente. Cada Ocorrência evolui de planejada para em andamento e concluída, ou é cancelada; a política de calendário pode produzir uma Ocorrência ignorada. Paradas preservam chegada e saída. Interações e recibos mantêm idempotência sem incrementar a versão do ciclo do Registro. As políticas de FK descrevem exclusão física no banco e não oferecem, por si, operações de exclusão na API.

Camadas do domínio