# Modelagem de Dados — Diário Oficial

## Diagrama de Entidades e Relacionamentos

```
┌───────────────────┐       ┌──────────────────────┐       ┌──────────────────┐
│     diarios       │       │  diario_has_areas    │       │   diario_areas   │
├───────────────────┤       ├──────────────────────┤       ├──────────────────┤
│ id (PK)           │──1:N──│ id (PK)              │──N:1──│ id (PK)          │
│ autor             │       │ id_diario (FK)       │       │ name             │
│ status            │       │ id_area (FK)         │       │ deleted_at       │
│ edicao            │       │ id_subarea (FK)      │       └──────────────────┘
│ email             │       │ titulo               │
│ data_publicacao   │       │ conteudo (text)      │       ┌──────────────────┐
│ id_certificado(FK)│       │ path (PDF upload)    │       │ diario_sub_areas │
│ id_complemento(FK)│       │ type (text|file)     │──N:1──├──────────────────┤
│ lei_validadora    │       │ file_in (bool)       │       │ id (PK)          │
│ permission_edit   │       │ columns_number       │       │ name             │
│ columns_number    │       │ position (ordering)  │       │ deleted_at       │
│ has_line (bool)   │       │ adendo_id            │       └──────────────────┘
│ line_style        │       │ deleted_at           │
│ line_color        │       └──────────────────────┘
│ cover_image_id(FK)│
│ deleted_at        │       ┌──────────────────────┐
└───────────────────┘       │  diario_certificados │
        │                    ├──────────────────────┤
        │ 1:1               │ id (PK)              │
        ▼                    │ path (cert file)     │
┌───────────────────┐       │ cert (certificate)   │
│   archives        │       │ pkey (private key)   │
├───────────────────┤       │ deleted_at           │
│ id (PK)           │       └──────────────────────┘
│ name              │
│ title             │       ┌──────────────────────┐
│ extension         │       │   diario_configs     │
│ type (mime)       │       ├──────────────────────┤
│ path              │       │ id (PK)              │
└───────────────────┘       │ lei_padrao           │
                            │ certificado_padrao(FK)│
                            │ ativos (bool)        │
                            │ logo_position        │
                            │ header_img (FK)      │
                            │ deleted_at           │
                            └──────────────────────┘
```

---

## Modelos

### 1. `Diario` (`app/Http/Model/Prefecture/Diario.php`)

```php
class Diario extends Model {
    use SoftDeletes, PresentableTrait;

    protected $table = 'diarios';
    protected $presenter = DiarioPresenter::class;

    // Relacionamentos
    public function certificado()     → hasOne(DiarioCertificado::class)
    public function complemento()     → hasOne(Diario::class) // auto-relacionamento
    public function diario_areas()    → hasMany(DiarioHasAreas::class)
    public function areas()           → hasManyThrough(DiarioArea::class, DiarioHasAreas::class)
    public function subAreas()        → hasManyThrough(DiarioSubArea::class, DiarioHasAreas::class)
    public function cover_image()     → hasOne(Archive::class)
}
```

**Campos:**
| Campo | Tipo | Descrição |
|-------|------|-----------|
| `autor` | string | Nome do responsável |
| `status` | boolean | Publicado ou rascunho |
| `edicao` | integer | Número da edição |
| `email` | string | Email do responsável |
| `data_publicacao` | date | Data de publicação |
| `id_certificado` | FK | Certificado digital usado |
| `id_complemento` | FK | Auto-relacionamento (complemento) |
| `lei_validadora` | text | Lei que valida o diário |
| `permission_edit` | ? | Controle de permissão de edição |
| `columns_number` | integer | 1, 2 ou 3 colunas |
| `has_line` | boolean | Linha separadora entre seções |
| `line_style` | string | solid, dashed, dotted |
| `line_color` | string | Código hexadecimal |
| `cover_image_id` | FK | Capa do diário |
| `generation_status` | string(20) | `pending\|processing\|completed\|failed` |
| `generation_error` | text | Mensagem de erro da última geração |
| `generation_progress` | text | JSON: `{step, current_page, total_pages, current_attachment, total_attachments}` |
| `generation_started_at` | timestamp | Início da última geração |
| `generation_completed_at` | timestamp | Fim da última geração |

---

### 2. `DiarioArea` (`app/Http/Model/Prefecture/DiarioArea.php`)

```php
class DiarioArea extends Model {
    use SoftDeletes;
    protected $table = 'diario_areas';
    // name → string (ex: "Atos do Executivo", "Licitações")
}
```

### 3. `DiarioSubArea` (`app/Http/Model/Prefecture/DiarioSubArea.php`)

```php
class DiarioSubArea extends Model {
    use SoftDeletes;
    protected $table = 'diario_sub_areas';
    // name → string (ex: "Portarias", "Decretos")
}
```

### 4. `DiarioHasAreas` (`app/Http/Model/Prefecture/DiarioHasAreas.php`)

```php
class DiarioHasAreas extends Model {
    use SoftDeletes;
    protected $table = 'diario_has_areas';

    // Relacionamentos
    public function area()     → hasOne(DiarioArea::class)
    public function subarea()  → hasOne(DiarioSubArea::class)

    // Mutator
    public function setFileInAttribute($value) → boolean
}
```

**Campos:**
| Campo | Tipo | Descrição |
|-------|------|-----------|
| `titulo` | string | Título da matéria |
| `id_diario` | FK | Diário ao qual pertence |
| `id_area` | FK | Área |
| `id_subarea` | FK | Subárea |
| `conteudo` | text | HTML do conteúdo (Summernote) |
| `path` | string | Caminho do PDF upload |
| `type` | enum('text','file') | Tipo de conteúdo |
| `file_in` | boolean | Se PDF é incorporado no fluxo |
| `columns_number` | integer | Colunas específicas |
| `position` | integer | Ordem de exibição |
| `adendo_id` | ? | ID do adendo relacionado |

### 5. `DiarioCertificado` (`app/Http/Model/Prefecture/DiarioCertificado.php`)

```php
class DiarioCertificado extends Model {
    use SoftDeletes;
    protected $table = 'diario_certificados';
    // path → caminho do arquivo .pfx/.p12
    // cert → certificado (string)
    // pkey → chave privada (string)
}
```

### 6. `DiarioConfig` (`app/Http/Model/Prefecture/DiarioConfig.php`)

```php
class DiarioConfig extends Model {
    use SoftDeletes;
    protected $table = 'diario_configs';

    public function archive() → belongsTo(Archive::class, 'header_img');
}
```

**Campos:**
| Campo | Tipo | Descrição |
|-------|------|-----------|
| `lei_padrao` | text | Lei padrão para novos diários |
| `certificado_padrao` | FK | Certificado padrão |
| `ativos` | boolean | Status padrão |
| `logo_position` | enum('center','left','right') | Posição do logo |
| `header_img` | FK | Imagem de cabeçalho personalizada |

---

## Views do Banco (Migrations)

O sistema utiliza **views do PostgreSQL** para alimentar as DataTables:

| View | Tabela Base | Finalidade |
|------|-------------|------------|
| `diario_oficial` | `diarios` | Listagem CMS DataTable |
| `diario_oficial_pdf` | `diarios` | Dados para PDF |
| `areas_do_diario` | `diario_has_areas` | Listagem de áreas |
| `sub_areas_do_diario` | `diario_sub_areas` | Listagem de subáreas |
| `areas_do_diario_two` | diario_has_areas | Versão alternativa |
| `sub_areas_do_diario_two` | diario_sub_areas | Versão alternativa |

---

## Relacionamentos Chave

```
Diario 1──N DiarioHasAreas N──1 DiarioArea
                         N──1 DiarioSubArea
Diario 1──1 DiarioCertificado
Diario 1──1 Archive (cover_image)
DiarioConfig 1──1 Archive (header_img)
Diario 1──1 Diario (complemento — auto-relacionamento)
```

## Soft Deletes

Todas as 6 models utilizam `SoftDeletes`, garantindo que nenhum dado seja perdido em exclusões. As migrations incluem a coluna `deleted_at` em todas as tabelas.
