# Gestão de Áreas e Subáreas

## Conceito

O Diário Oficial organiza seu conteúdo em uma hierarquia de dois níveis:

```
Diário
  └── Área (ex: "Atos do Executivo", "Licitações")
       └── Subárea (ex: "Portarias", "Decretos", "Editais")
            └── Matérias (conteúdo textual ou PDF)
```

Cada **Matéria** (`diario_has_areas`) pertence a uma Área e opcionalmente a uma Subárea.

---

## Áreas (CRUD)

### CMS Views

- `resources/views/prefecture/contents/diario-oficial/diario-areas/index.blade.php`
- `resources/views/prefecture/contents/diario-oficial/diario-areas/create.blade.php`
- `resources/views/prefecture/contents/diario-oficial/diario-areas/form.blade.php`

### Controller: `DiarioAreaController`

| Ação | Rota | Descrição |
|------|------|-----------|
| Listar | `GET /cms/area` | DataTable com todas as áreas |
| Criar | `GET /cms/area/create` | Formulário |
| Salvar | `POST /cms/area` | Cria área (se `name`) ou matéria (se `conteudo`) |
| Editar | `GET /cms/area/{id}/edit` | Formulário de edição |
| Atualizar | `PUT /cms/area/{id}` | Atualiza área ou matéria |
| Excluir | `DELETE /cms/area/{id}` | Exclui área |
| Excluir Lote | `POST /cms/area/destroyAll` | Exclusão em lote |

### DataTable

Fonte: View PostgreSQL `areas_do_diario`
Rota: `GET /cms/datatable/areas_diario`

---

## Subáreas (CRUD)

### CMS Views

- `resources/views/prefecture/contents/diario-oficial/diario-subareas/index.blade.php`
- `resources/views/prefecture/contents/diario-oficial/diario-subareas/create.blade.php`
- `resources/views/prefecture/contents/diario-oficial/diario-subareas/form.blade.php`

### Controller: `DiarioSubAreaController`

| Ação | Rota | Descrição |
|------|------|-----------|
| Listar | `GET /cms/subarea` | DataTable |
| Criar | `GET /cms/subarea/create` | Formulário |
| Salvar | `POST /cms/subarea` | Cria subárea |
| Editar | `GET /cms/subarea/{id}/edit` | Formulário |
| Atualizar | `PUT /cms/subarea/{id}` | Atualiza |
| Excluir | `DELETE /cms/subarea/{id}` | Exclui |
| Excluir Lote | `POST /cms/subarea/destroyAll` | Em lote |

### DataTable

Fonte: View PostgreSQL `sub_areas_do_diario`
Rota: `GET /cms/datatable/sub_areas_diario`

---

## Matérias (Conteúdo do Diário)

As matérias são gerenciadas dentro do formulário de edição do diário, através de um modal.

### Modal de Matérias

**Arquivos:**
- `resources/views/prefecture/contents/diario-oficial/modal/areas/modal.blade.php`
- `resources/views/prefecture/contents/diario-oficial/modal/areas/index.blade.php`

### Tipos de Matéria

| Tipo | Descrição | Armazenamento |
|------|-----------|---------------|
| `text` | Conteúdo HTML (Summernote) | Campo `conteudo` |
| `file` | PDF inserido | Campo `path` + arquivo em `storage/diario-oficial/adendos/` |

### Comportamento `file_in`

| `file_in` | Comportamento no PDF |
|:---------:|----------------------|
| `true` | PDF é convertido para imagens e inserido no fluxo de colunas |
| `false` | PDF é mesclado página por página (FPDI importPage) em página cheia |

### Reordenação

As matérias podem ser reordenadas por drag & drop no modal. A posição é salva no campo `position` da tabela `diario_has_areas`.

**Rota:** `PUT /cms/ajax/diario-oficial/{id}/sort`

```php
public function sort($id, SortRequest $request) {
    foreach ($request->areas as $area) {
        DiarioHasAreas::where('id', $area['id'])
            ->update(['position' => $area['position']]);
    }
}
```

### Estrutura de Dados (JSON da Matéria)

```json
{
    "id": 1,
    "titulo": "Portaria nº 123",
    "id_area": 1,
    "id_subarea": 2,
    "conteudo": "<h4>...</h4><p>...</p>",
    "type": "text",
    "path": "/storage/diario-oficial/adendos/...",
    "file_in": false,
    "position": 0,
    "area": { "id": 1, "name": "Atos do Executivo" },
    "subarea": { "id": 2, "name": "Portarias" }
}
```
