# Sistema de módulos e add-ons

Cada capacidade comercial tem um código estável, por exemplo:

- `core`
- `workflow`
- `education`
- `import_export`
- `pdf_forms`
- `customization`

As tabelas `modules`, `plans`, `module_plan` e `tenant_modules` definem o catálogo e a licença de cada organização.

## Proteger uma rota

```php
Route::middleware(['auth', 'tenant', 'subscription', 'module:education'])
    ->prefix('education')
    ->group(function () {
        // Rotas do add-on.
    });
```

## Verificar no código

```php
$enabled = app(ModuleManager::class)->enabled($tenant, 'education');
```

## Formato recomendado para add-ons

Cada add-on deve ser um package Composer privado com:

- Service Provider;
- rotas próprias;
- migrations próprias;
- views e traduções próprias;
- policies e testes;
- código único do módulo;
- dependência de versão mínima do core.

O exemplo `packages/digital-dossier/example-addon` pode ser copiado para iniciar um módulo real.

## Venda avulsa de add-ons

Para vender módulos fora do plano, criar uma compra/subscrição adicional e gravar `tenant_modules.source = manual` ou `addon`. O sincronizador de planos preserva estes módulos ao trocar de plano.
