<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Natan muniz</title>
    <description>The latest articles on DEV Community by Natan muniz (@natan_muniz_4f836c4e0e8bd).</description>
    <link>https://dev.to/natan_muniz_4f836c4e0e8bd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2335903%2Fd804f0b5-3981-4825-b791-593a1916b98b.png</url>
      <title>DEV Community: Natan muniz</title>
      <link>https://dev.to/natan_muniz_4f836c4e0e8bd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/natan_muniz_4f836c4e0e8bd"/>
    <language>en</language>
    <item>
      <title>De GED a SIGAD: decisões de arquitetura em Laravel, Vue e PostgreSQL</title>
      <dc:creator>Natan muniz</dc:creator>
      <pubDate>Thu, 05 Nov 2026 01:23:07 +0000</pubDate>
      <link>https://dev.to/natan_muniz_4f836c4e0e8bd/de-ged-a-sigad-decisoes-de-arquitetura-em-laravel-vue-e-postgresql-34kb</link>
      <guid>https://dev.to/natan_muniz_4f836c4e0e8bd/de-ged-a-sigad-decisoes-de-arquitetura-em-laravel-vue-e-postgresql-34kb</guid>
      <description>&lt;p&gt;Começamos com um conjunto de 23 requisitos de classificação e temporalidade arquivística. O sistema já era um GED capaz de receber e visualizar PDFs. O desafio era acrescentar planos de classificação, tabelas de temporalidade e processos arquivísticos sem perder o funcionamento existente.&lt;/p&gt;

&lt;p&gt;A implementação exigiu decisões de domínio antes das telas. A principal foi definir o processo como objeto classificado. Seus PDFs são componentes digitais, organizados em representações como volumes, partes ou anexos.&lt;/p&gt;

&lt;p&gt;Processo arquivístico&lt;br&gt;
├── Metadados, classe, tipologia, eventos e prazos&lt;br&gt;
├── Representação: Volume 1&lt;br&gt;
│   └── Componente: volume-1.pdf&lt;br&gt;
└── Representação: Volume 2&lt;br&gt;
    └── Componente: volume-2.pdf&lt;/p&gt;

&lt;p&gt;Essa separação determina onde cada informação é gravada, como o visualizador a apresenta e o que precisa ser preservado quando uma regra muda.&lt;br&gt;
A estrutura técnica&lt;br&gt;
O backend usa PHP 7.4, Laravel 8 e PostgreSQL. A interface usa Vue 3 e Inertia. Organizamos as regras principalmente em serviços, deixando os controllers responsáveis por receber, validar e autorizar as requisições.&lt;/p&gt;

&lt;p&gt;Há dois conjuntos de serviços:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classificação: cadastro de planos, classes, tipologias, códigos, importação institucional, movimentações e versões da TTD.&lt;/li&gt;
&lt;li&gt;Processos SIGAD: captura, representações digitais, eventos arquivísticos, projeção de prazos, reconciliação de novas regras e destinação.
Migrations criam os vínculos entre esses objetos. O application_id delimita os dados de cada aplicação, enquanto permissões específicas controlam ações como criar, classificar, publicar, consultar e baixar. Uma classe possui identificador interno estável; seu código arquivístico e sua posição na hierarquia podem mudar sem perder os vínculos históricos.
Importar um plano é interpretar uma fonte
Testamos o modelo com planos institucionais de estruturas diferentes. Uma fonte pode usar códigos de largura variável, reservar códigos ou trazer definições e observações junto ao nome da classe. Fixar uma única árvore e uma única fórmula de numeração não atenderia esses casos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Criamos um modelo XLSX para importar hierarquia, tipologias, prazos, eventos iniciais, destinação e observações. O processamento conserva a referência à linha original. Dados ambíguos geram apontamentos de conferência; a importação entra em rascunho antes da publicação.&lt;/p&gt;

&lt;p&gt;Essa decisão evita um erro perigoso: transformar texto incerto da fonte em uma regra estruturada aparentemente definitiva.&lt;br&gt;
Mudanças estruturais têm efeitos em cadeia&lt;br&gt;
Deslocar, desmembrar ou fundir classes pode alterar códigos de descendentes e afetar processos classificados. Por isso, a operação começa com uma prévia dos efeitos e exige justificativa. A solicitação de movimentação é aprovada por outro usuário.&lt;/p&gt;

&lt;p&gt;As alterações registram revisão, autor, instante, fuso, motivo e valores anteriores e posteriores. Também usamos revisão esperada nas atualizações: se outra pessoa alterou o plano enquanto a tela estava aberta, a gravação é recusada para evitar sobrescrever uma mudança recente.&lt;/p&gt;

&lt;p&gt;Inativação e exclusão lógica seguem regras próprias. Uma classe retirada do uso continua necessária para explicar classificações feitas no passado.&lt;br&gt;
A temporalidade depende de eventos&lt;br&gt;
A data de captura no sistema não é automaticamente a data de abertura do processo. Um processo histórico pode ser capturado hoje e ter sido aberto anos antes.&lt;/p&gt;

&lt;p&gt;A TTD publicada indica qual evento inicia cada prazo. A aplicação registra o evento com data efetiva e fonte, depois calcula a projeção da idade corrente ou intermediária. Desarquivamento e inclusão de conteúdo sigiloso só alteram um prazo quando a regra os menciona expressamente.&lt;/p&gt;

&lt;p&gt;Quando a classificação ou a TTD muda, o serviço recalcula as projeções aplicáveis. Se não há correspondência inequívoca entre a regra antiga e a nova, o processo fica pendente de conferência. Isso é particularmente relevante antes de uma decisão de destinação.&lt;br&gt;
A convivência com o GED existente&lt;br&gt;
O GED tinha duas APIs de upload: uma geral e outra usada pela tela de arquivos. Para aplicações com SIGAD habilitado, ambas passam por uma verificação no backend que bloqueia novos envios avulsos. A interface também direciona o usuário para a abertura de processos.&lt;/p&gt;

&lt;p&gt;O fluxo SIGAD usa outra rota: incluir um PDF como representação de um processo. Nela, o arquivo físico continua registrado, mas também são criados os vínculos arquivísticos e o hash SHA-256 do componente.&lt;/p&gt;

&lt;p&gt;Recentemente acrescentamos seleção múltipla na abertura. A interface cria o processo em rascunho e envia os PDFs em sequência pela rota de representações já existente. Cada envio cria uma representação e incrementa a revisão do processo. Se um arquivo falhar, os anteriores continuam vinculados ao rascunho, e a tela mantém os pendentes para nova tentativa. Classificação e captura são passos posteriores.&lt;br&gt;
Como verificamos o trabalho&lt;br&gt;
A implementação combina testes de serviços, APIs e fluxos completos com PostgreSQL. Os cenários cobrem, entre outros pontos, permissões, versões, movimentações, importação, eventos, prazos e processos com vários volumes. A compilação do Vue verifica a integração da interface.&lt;/p&gt;

&lt;p&gt;Ainda há uma etapa que testes automatizados não substituem: homologar a interpretação arquivística dos planos e tabelas reais. O roteiro de testes separa o comportamento técnico implementado do aceite das fontes, dos perfis de acesso e das decisões institucionais.&lt;/p&gt;

&lt;p&gt;A principal lição dessa worktree foi que classificação e temporalidade formam um conjunto de regras sobre objetos que continuam vivendo depois do cadastro. Modelar identidade, história, eventos e impacto das mudanças desde o início tornou essas regras verificáveis.&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
