# Certificado Digital

## O que é o módulo

Gestão de certificados digitais A1 (PKCS#12) para assinatura digital de documentos PDF. Permite importar certificados PFX/P12 com criptografia da chave privada, listar certificados do usuário, visualizar detalhes e histórico de assinaturas, e assinar documentos PDF manualmente com opções de carimbo visual (tema lotep-government, professional ou minimal). Toda operação crítica é registrada via ActivityLogger.

## Estrutura de dados

### DigitalCertificate (`v2_digital_certificates`)
| Campo | Tipo | Descrição |
|-------|------|-----------|
| `id` | UUID (PK) | |
| `user_id` | integer | FK para users (Sentinel) |
| `name` | string | Nome amigável |
| `certificate_pem` | text | Certificado em formato PEM |
| `private_key_encrypted` | text | Chave privada criptografada |
| `private_key_iv` | string | IV da criptografia |
| `serial_number` | string | Número de série |
| `issuer` | string | Emissor |
| `subject` | string | Subject |
| `common_name` | string | CN |
| `organization` | string | Organização |
| `document_number` | string | CPF/CNPJ |
| `email` | string | Email do titular |
| `valid_from` | datetime | Início da validade |
| `valid_until` | datetime | Fim da validade |
| `thumbprint_sha256` | string | SHA-256 thumbprint |
| `signature_algorithm` | string | Algoritmo de assinatura |
| `is_active` | boolean | Se está ativo |
| `last_used_at` | datetime nullable | Último uso |
| `created_at` / `updated_at` / `deleted_at` | timestamp | |

## Dependências

- **DigitalSignatureService** (`V2\Services\DigitalSignature`) — core de criptografia, extração PFX, validação e assinatura PDF
- **CertificateManager** (`V2\Services\DigitalSignature\CertificateManager`) — validação de vigência
- **ActivityLoggerService** (`V2\Services\ActivityLogger`) — auditoria de upload, delete e assinatura
- **Sentinel** — usuário logado e vinculação dos certificados

## Tabelas

- `v2_digital_certificates` (criada pelo serviço DigitalSignature, não pelo módulo)

## Arquivos existentes

### Controllers
- `Controllers/CertificadoDigitalCmsController.php` — index (listagem), create (form upload), store (import PFX), signForm, signDocument, show (detalhes + histórico), destroy (soft delete)

### Models
- `Models/DigitalCertificate.php` — modelo Eloquent para compatibilidade com ActivityLogger (a lógica CRUD real fica no DigitalSignatureService)

### Routes
- `Routes/cms.php` — 7 rotas CMS (index, create, store, sign form, sign execute, show, destroy)

### Views CMS
- `Views/cms/index.blade.php` — listagem de certificados
- `Views/cms/create.blade.php` — formulário de upload
- `Views/cms/show.blade.php` — detalhes do certificado + histórico
- `Views/cms/sign.blade.php` — formulário de assinatura
- `Views/cms/sign/partials/scripts.blade.php`
- `Views/cms/sign/partials/preview.blade.php`
- `Views/cms/sign/partials/no-certs.blade.php`
- `Views/cms/sign/partials/form-fields.blade.php`
- `Views/cms/sign/partials/errors.blade.php`
- `Views/cms/sign/partials/confirm-modal.blade.php`

### ModuleProvider
- `ModuleProvider.php` — configuração com 2 submódulos (Meus Certificados, Assinar Documento)

## Observações

- **Model decorativo:** `DigitalCertificate` é usado APENAS para o ActivityLogger do Spatie (que exige Eloquent Model). Toda a lógica de CRUD, criptografia e validação fica no `DigitalSignatureService`, que acessa a tabela via `DB::table()` diretamente.
- **Vinculação estrita:** cada certificado é vinculado ao usuário que o importou. Apenas o suporte (`config('v2.support.email')`) pode visualizar certificados de outros usuários.
- **Segurança:** a chave privada é criptografada antes de ser persistida (campo `private_key_encrypted` + `private_key_iv`). A senha do PFX é necessária no momento da importação mas não é armazenada.
- **Assinatura:** o signature request aceita configuração de posição do carimbo visual (x, y, página), tema (lotep-government, professional, minimal), e metadados (local, motivo, contato).
- **Sem migrations próprias:** a tabela `v2_digital_certificates` é criada pelo serviço `DigitalSignature`, não pelo módulo. O módulo apenas consome.
- **Sem views de portal:** não há rotas públicas; tudo é administrativo no CMS.
- **Permissão:** ações de escrita (import, sign, delete) exigem permissão `v2_can('CertificadoDigital', 'write')`.
- **Download do PDF assinado:** o controller retorna o PDF como response direta com headers de download e metadados (document hash, signer name, signed at).
