# Certificados e Configurações

## Certificados Digitais

### Model: `DiarioCertificado`

**Arquivo:** `app/Http/Model/Prefecture/DiarioCertificado.php`
**Tabela:** `diario_certificados`

```php
protected $fillable = ['path', 'cert', 'pkey'];
```

| Campo | Descrição |
|-------|-----------|
| `path` | Caminho do arquivo de certificado (.pfx, .p12, .crt) |
| `cert` | Conteúdo do certificado (string) |
| `pkey` | Chave privada (string) |

### Controller: `DiarioCertificadosController`

**Arquivo:** `app/Http/Controllers/Prefecture/DiarioCertificadosController.php`
**Rotas base:** `certificado.*`

CRUD completo: upload de certificados A1/A3 para assinatura digital dos PDFs.

### Uso na Geração de PDF

No `DiarioOficialRepository@generatePDF`:

```php
// Certificado padrão (da configuração)
$dataCertificado = DiarioCertificado::find($dataConfig->certificado_padrao);

// OU certificado específico do diário
$dataCertificadoDiario = DiarioCertificado::find($data->id_certificado);
if ($dataCertificadoDiario) {
    $dataCertificado = $dataCertificadoDiario;
}

// Extrai CNPJ/nome do certificado
$nome_cert = $this->certReturn($dataCertificado->path);

// Configura no FPdfService
$pdf->certificate = [
    "data" => $dataCertificado->cert,
    "key"  => $dataCertificado->pkey,
    "info" => ['Name', 'Location', 'Reason', 'ContactInfo']
];
```

---

## Configurações Globais

### Model: `DiarioConfig`

**Arquivo:** `app/Http/Model/Prefecture/DiarioConfig.php`
**Tabela:** `diario_configs`

```php
protected $fillable = [
    'lei_padrao',
    'certificado_padrao',
    'ativos',
    'logo_position',
    'header_img'
];

public function archive() {
    return $this->belongsTo(Archive::class, 'header_img', 'id');
}
```

### Campos

| Campo | Tipo | Padrão | Descrição |
|-------|------|--------|-----------|
| `lei_padrao` | text | null | Lei padrão sugerida em novos diários |
| `certificado_padrao` | FK | null | Certificado usado por padrão |
| `ativos` | boolean | false | Status padrão de novos diários |
| `logo_position` | enum | 'center' | Posição do logo: 'center', 'left', 'right' |
| `header_img` | FK (Archive) | null | Imagem personalizada de cabeçalho |

### Controller: `DiarioController`

| Ação | Rota | Descrição |
|------|------|-----------|
| View | `GET /cms/diario/configuracoes` | Formulário de configurações |
| Salvar | `PUT /cms/diario/configuracoes/update` | Atualiza + upload header img |
| Remover Imagem | `DELETE /cms/diario/configuracoes/header-img/{id}` | Deleta imagem de cabeçalho |

### Repository: `IDiarioConfigRepository`

**Arquivo:** `app/Repositories/Eloquent/Prefecture/DiarioConfig/DiarioConfigRepository.php`

```php
class DiarioConfigRepository extends Repository implements IDiarioConfigRepository {
    public function getModel() { return $this->model; }
}
```

### Views

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

### Upload de Header Image

No `update_configuration`:

```php
$file = $request->file('header_img');
if ($file) {
    // Gera nome único
    $name = time().'-'.rand(...).'.'.$extension;

    // Salva na tabela archives
    $insertArchive = Archive::updateOrCreate(['id' => $idHeaderImg], $archive);

    // Move arquivo para storage
    $file->storeAs("diario-oficial/headers/{$insertArchive->id}/", $name);

    // Comprime imagem (max 1024x500)
    $this->compress(storage_path(...), null, 1024, 500, null, true);

    // Atualiza referência na config
    $result->header_img = $insertArchive->id;
}
```
