# Diário Oficial — Visão Geral

> _Atualizado para o **v6** (`update_diario_v5_to_v6`) em 2026-09-11. Alterações desta versão: `DIARIO_OFICIAL_ALTERACOES.md` e `plan/2026-09-11-diario-upgrade-backlog.md`._

## Propósito

Módulo de **Diário Oficial Eletrônico** para Prefeituras. Permite a criação, geração automática de PDF com certificação digital, e publicação de diários oficiais municipais.

O sistema possui duas faces:
- **CMS (admin):** Gerenciamento de diários, áreas, subáreas, certificados, configurações.
- **Portal (público):** Visualização, busca e download de diários publicados.

---

## Arquitetura (MVC Clássico)

```
Request → Route → Controller → Repository/Service → Model → DB
                                    ↓
                              View (Blade) + JS
```

### Pilha Tecnológica
- **Laravel 5.5.50** — Framework base
- **PHP 7.2.34** — Runtime
- **Bootstrap 3** — CMS (AdminLTE)
- **Bootstrap 4** — Portal público
- **Font Awesome 4/5/6** — Iconografia
- **TCPDF + FPDI** — Geração de PDF
- **Imagick + Ghostscript** — Conversão/rasterização de PDF para imagens
- **Summernote** — Editor WYSIWYG para conteúdo textual
- **Yajra DataTables** — Listagens dinâmicas
- **Sentinel** — Autenticação e autorização

---

## Estrutura de Diretórios

```
app/
├── Http/
│   ├── Model/Prefecture/
│   │   ├── Diario.php                    # Model principal
│   │   ├── DiarioArea.php                # Áreas do diário
│   │   ├── DiarioSubArea.php             # Subáreas do diário
│   │   ├── DiarioHasAreas.php            # Pivot: diário ↔ conteúdo (matérias)
│   │   ├── DiarioCerticado.php           # Certificados digitais (A1/A3) — arquivo com typo; classe é DiarioCertificado
│   │   └── DiarioConfig.php              # Configurações globais
│   ├── Controllers/
│   │   ├── Prefecture/
│   │   │   ├── DiarioController.php      # CRUD + PDF + configurações
│   │   │   ├── DiarioAreaController.php   # CRUD áreas + matérias
│   │   │   ├── DiarioSubAreaController.php# CRUD subáreas
│   │   │   ├── DiarioCertificadosController.php
│   │   │   └── DatatableController.php    # DataTables (get_diario_oficial, etc.)
│   │   └── Portal/
│   │       └── DiarioController.php      # Portal: listagem, viewer, busca
│   ├── Resources/
│   │   └── DiarioOficial/
│   │       ├── GetDiarioResource.php
│   │       ├── ListAreasAndSubareasResource.php
│   │       └── ListAreaContentResource.php
│   ├── Presenters/
│   │   └── DiarioPresenter.php
│   ├── Requests/
│   │   ├── DiarioOficialRequest.php
│   │   ├── DiarioAreasRequest.php
│   │   ├── CertificadoRequest.php
│   │   └── DiarioOficial/
│   │       ├── SortRequest.php
│   │       ├── SaveConfigRequest.php
│   │       └── SaveAreaRequest.php
│   └── Components/Prefecture/Contents/Preview/
│       └── DiarioOficialComponent.php
├── Repositories/
│   ├── Contracts/
│   │   ├── IDiarioAreaRepository.php
│   │   ├── IDiarioSubAreaRepository.php
│   │   └── IDiarioConfigRepository.php
│   └── Eloquent/Prefecture/
│       ├── DiarioOficial/
│       │   ├── DiarioOficialRepository.php # Repository principal (CRUD + PDF)
│       │   ├── Area/AreaRepository.php     # Matérias (DiarioHasAreas)
│       │   ├── DiarioArea/DiarioAreaRepository.php
│       │   └── DiarioSubArea/DiarioSubAreaRepository.php
│       └── DiarioConfig/
│           └── DiarioConfigRepository.php
├── Services/
│   ├── FPdfService.php                    # Serviço de PDF monolítico (herda Fpdi/TCPDF)
│   └── Pdf/
│       ├── PdfConverter.php               # PDF externo → JPEG via Imagick + Ghostscript
│       └── ImageProcessor.php             # Dimensionamento de imagens do HTML (em mm)

resources/views/
├── prefecture/contents/diario-oficial/
│   ├── index.blade.php                    # CMS Lista
│   ├── create.blade.php                   # CMS Criar/Editar wrapper + polling do PDF
│   ├── form.blade.php                     # CMS Formulário
│   ├── loading.blade.php                  # Loading screen (usado no iframe de preview)
│   ├── diario-areas/                      # Gestão de Áreas (CRUD)
│   │   ├── index.blade.php
│   │   ├── create.blade.php
│   │   └── form.blade.php
│   ├── diario-subareas/                   # Gestão de Subáreas (CRUD)
│   │   ├── index.blade.php
│   │   ├── create.blade.php
│   │   └── form.blade.php
│   ├── configuracoes/                     # Configurações do Diário
│   │   ├── create.blade.php
│   │   └── form.blade.php
│   ├── pdf/                               # Templates HTML/PDF (legado)
│   │   ├── index.blade.php
│   │   ├── summernote.blade.php           # NÃO é Summernote: bundle CSS Bootstrap 3 + normalize
│   │   └── style.blade.php
│   ├── modal/areas/                       # Modal de gerenciamento de matérias no form
│   │   ├── modal.blade.php
│   │   └── index.blade.php
│   └── components/
│       ├── pdf-file-upload.blade.php
│       ├── image.blade.php
│       └── cover-image.blade.php          # Upload/preview/remoção da capa
├── prefecture/contents/certificado/       # CRUD de Certificados Digitais
│   ├── index.blade.php
│   ├── create.blade.php
│   └── form.blade.php
├── prefecture/contents/components/preview/diario-oficial/
│   ├── index.blade.php                    # Preview PDF modal (shell do iframe)
│   ├── summernote.blade.php               # Duplicata órfã do bundle CSS de pdf/
│   └── style.blade.php                    # Duplicata órfã do style de pdf/
└── portal/layouts/diario-oficial/
    ├── index.blade.php                    # Portal listagem pública
    ├── show-pdf.blade.php                 # Portal visualizador PDF
    └── auditoria.blade.php                # Auditoria pública (LGPD)

public/assets/
├── js/custom/contents/diario-oficial/
│   ├── index.js                           # Toggle status
│   ├── datatable.js                       # Config DataTables (com badge generation)
│   ├── generation-status.js               # Polling dos badges de geração
│   ├── config.js                          # Configurações JS (header_img)
│   ├── areas.js                           # Modal de matérias (CRUD + sort)
│   ├── cover-image.js                     # Upload/preview/remoção da capa
│   ├── diario_portal.js                   # Portal filtros
│   └── areas-diario/index.js              # Habilita "Salvar" no form de Área
├── js/custom/contents/areas-do-diario/
│   └── datatable.js                       # DataTable de Áreas
├── js/custom/contents/sub-areas-diario/
│   └── datatable.js                       # DataTable de Subáreas
├── js/custom/portal/diario-oficial/
│   └── viewer.js                          # Visualizador PDF portal
├── js/custom/utilities/helpers/
│   └── preview-diario.js                  # Helper órfão — removido do create.blade.php
└── css/portal/
    └── diario-oficial-viewer.css          # Estilos do viewer

routes/
├── web.php                                # Rotas do portal + refresh
├── basepro.php                            # Rotas do CMS
└── breadcrumbs.php                        # Breadcrumbs

database/
├── migrations/                            # 353 migrations no projeto (28 relacionadas ao Diário)
└── seeds/                                 # 6 seeders dedicados ao Diário
```

---

## Fluxo Principal (Criação de um Diário)

```
1. Usuário acessa CMS → /cms/diario-oficial/create
2. Preenche formulário (edição, autor, certificado, colunas, etc.)
3. Submete → DiarioOficialRequest valida → DiarioController@store
4. DiarioOficialRepository@upInsert salva dados (SEM gerar PDF)
5. Se há imagem de capa → upload + compressão + Archive
6. Redireciona para edit com flash success
7. No edit, gestão de áreas/matérias (Summernote + upload PDF) e o botão
   "Processar PDF" → refresh_PDF_preview (síncrono, com polling de progresso)
8. O PDF só é gerado sob demanda (nunca no store/update) — ver 23-GUIA_EXECUCAO.md
```

---

## Permissões (Sentinel)

| Recurso / verificação | Permissão |
|------|-----------|
| Menu e listagem (`diario-oficial.index`) | `diario-oficial.index` |
| Criar/editar diário | `diario-oficial.create` / `diario-oficial.edit` |
| Excluir diário | `diario-oficial.delete` (super-admin/administrador) |
| Ativar/Inativar | `diario-oficial.inactivate` / `diario-oficial.restore` |
| Áreas | `diario-area.index` / `.create` / `.edit` / `.delete` / `.restore` / `.inactivate` |
| Subáreas | `diario-subarea.*` (a listagem usa `diario-area` por engano — ver 22) |
| Certificados | `certificado.index` / `.create` / `.delete` |

> Detalhes e códigos em `21-ROTAS_E_PERMISSOES.md` e `22-ANOMALIAS_E_RISCOS.md`.

---

## Totais do Módulo

| Categoria | Quantidade |
|-----------|:----------:|
| Models | 6 |
| Controllers | 6 (CMS: 5 + Portal: 1) |
| Views (Blade) | 29 (inclui 3 de certificado, `auditoria` do portal e `cover-image`) |
| Repositories | 5 |
| Contracts | 3 |
| Requests | 6 (inclui `CertificadoRequest`) |
| Resources (API) | 3 |
| Services | 3 (`FPdfService` + `PdfConverter` + `ImageProcessor`) |
| Components | 1 |
| Presenters | 1 |
| JS | 12 (inclui `cover-image.js`; `preview-diario.js` é órfão) |
| CSS | 1 |
| Jobs | 0 (não existem) |
| Commands | 0 (o `DiarioGeneratePdf` citado em docs antigos **não existe**) |
| Migrations | 28 relacionadas ao Diário (de 353 no projeto) |
| Seeds | 6 dedicados + relacionados |
| **Total** | **~125 arquivos** |

> Inventário arquivo a arquivo em `19-INVENTARIO_COMPLETO.md`.
