SGEProduto · Domínio · Desenvolvimento
Repositório

migration-reference · implemented

Migration 03 — campuses

Contrato da tabela de campi e dos dados do representante legal.

Contrato

CampoRegra
idbigint, chave primária.
namenome institucional completo, obrigatório.
cnpjchar(14), obrigatório, normalizado, sem formatação e sem unicidade.
phonevarchar padrão do Laravel, obrigatório e normalizado.
emailvarchar padrão do Laravel, obrigatório.
address_idFK obrigatória para endereço atual.
legal_representative_namevarchar(255), obrigatório no cadastro; nome exibido no documento.
legal_representative_positionvarchar(255), obrigatório no cadastro; cargo exibido no documento.
insurance_company_namevarchar(255), obrigatório no cadastro.
insurance_policy_numbervarchar padrão do Laravel, obrigatório no cadastro.
deactivated_attimestamp(0) nullable e indexado; desativa o campus e bloqueia alterações em seus recursos.
timestamps / deleted_attimestamp(0) para auditoria e exclusão lógica.

Não criar code. O campus é delimitado pelo vínculo ativo e o ciclo de ativação pertence ao Administrador do Sistema. Representante legal e cargo são dados cadastrais do campus, não referências a usuário ou affiliations. A geração congela nomes, cargos, seguro e endereço no snapshot documental; alterar o campus não reescreve documento anterior.

Implementação atual

Campus usa SoftDeletes, registra alterações cadastrais no Activity Log e expõe o escopo active() para registros sem deactivated_at. O Model oferece deactivate(), reactivate() e assertWritable(); campus desativado só pode ser reativado, sem outras mudanças cadastrais. O endereço atual é obrigatório (belongsTo/hasMany) e sua exclusão é RESTRICT, inclusive enquanto o campus estiver apenas excluído logicamente. O CNPJ é normalizado para 14 dígitos e validado com laravellegends/pt-br-validator; o telefone reutiliza PhoneCast, aceitando telefone fixo ou celular com DDD e persistindo somente os dígitos.

CampusController implementa as rotas web de criação, edição, desativação e reativação por Eloquent. Páginas Livewire com Flux oferecem listagem, cadastro, detalhes e edição exclusivamente ao Administrador do Sistema, enviando as gravações a esse controller. CampusPolicy mantém a consulta de backend para o Administrador do Campus do próprio registro; viewAdministration restringe a interface global ao vínculo ativo de Administrador do Sistema. O Administrador do Campus pode alterar apenas telefone, representante e seguro pelo backend; o Administrador do Sistema pode alterar todos os campos cadastrais. A desativação exige a senha atual em cada solicitação, preserva vínculos e estados dos processos, e registra os valores anteriores/novos com autoria do vínculo ativo. A senha não é gravada no log.

Campus inativo permanece consultável para leitura autorizada e sua tela global exibe somente os dados e a opção de reativar. A guarda de escrita está aplicada às operações de campus; sua integração aos demais recursos, futuros Jobs e schedules permanece obrigatória e pendente junto desses fluxos. A interface local do Administrador do Campus também permanece pendente. A reativação não altera vínculos nem dispara processamento atrasado.

Os campos cadastrais acima são obrigatórios no Model, nos Form Requests e na migration original. Somente o CEP do endereço é opcional. Atualizações parciais continuam permitidas, mas não podem limpar esses campos. CampusFactory já fornece representante e seguro completos; mantém os estados withInsurance() e deactivated().

Campus usa Scout com Meilisearch para busca tolerante a erros pelo nome. O índice contém apenas ID, nome e deactivated_at; a situação é filtrada no próprio mecanismo de busca. A sincronização usa fila após o commit, evitando publicar registros descartados. O índice é auxiliar: a persistência, a autorização e a auditoria continuam no PostgreSQL. Pode haver um intervalo entre a gravação e a atualização da busca.

CampusTest, CampusManagementTest, CampusInterfaceTest, CampusSearchTest e CnpjCastTest cobrem schema PostgreSQL, índices, FK RESTRICT, obrigatoriedade, casts, validações, relações, consulta por vínculo, permissões, endereço, desativação com senha, reativação, Activity Log, transações, preservação dos vínculos e integração real de busca.

O histórico de alterações do campus aparece na consulta de auditoria do Administrador do Sistema. O acesso exige seu vínculo ativo e selecionado e segue a Policy; a consulta não inclui atividades de estágios, documentos, concedentes ou vínculos sem perfil administrativo.

Checklist

  • Criar migration create_campuses_table sem FK circular prematura.
  • Criar Model Campus, factory e SoftDeletes.
  • Normalizar e validar CNPJ e telefone.
  • Manter nome e cargo do representante legal no próprio campus, sem vínculo institucional.
  • Exigir CNPJ, contatos, representante e seguro já no cadastro do campus.
  • Implementar escopo de campus ativo, desativação, reativação, bloqueio de edição enquanto inativo e autorização administrativa.
  • Exigir confirmação da senha atual em cada desativação.
  • Preservar vínculos e estados de processos ao desativar.
  • Criar as views Livewire da gestão administrativa para o Administrador do Sistema.
  • Criar a interface local do Administrador do Campus.
  • Integrar a guarda de campus ativo aos futuros fluxos de escrita, Jobs e schedules dos recursos vinculados.
  • Registrar alterações cadastrais no Activity Log.
  • Testar campus ativo, desativado, endereço, representante e seguro obrigatórios, CEP opcional e CNPJ repetido.
  • Testar migrate/rollback e reaplicação da migration.

Dependências