# Fluxos: Painel Master (Admin)

---

## 19.1 Criar Empresa (Tenant)

```
Usuario Master
  ↓
Master → Empresas → Nova Empresa
  ↓
GET /master/company/add
  ↓
MasterController@company_create
  ↓
User::all (lista usuarios)
  ↓
View: pages/system/master/company/company_create
  ↓
Preenche: nome, logos, usuarios, credenciais de integracao, SMTP
  ↓
POST /master/company/store
  ↓
MasterController@company_store
  ↓
Validacao extensiva:
  Nome, usuarios (min 1), logos (PNG, dimensoes exatas)
  Credenciais por provider: Google Cloud, Monday, OpenAI, Gemini, Ntfy, N8N, Slack, Iugu, Spedy, Asaas
  SMTP configs por modulo (finance, core): host, port, username, encryption, from
  ↓
Tenant::create (id slug, name, logos)
Tenant.users::sync
Cria diretorios de storage do tenant
  ↓
Para CADA provider de integracao:
  IntegrationProvider::firstOrCreate
  IntegrationToken::create (payload encriptado)
  CompanyToken::create (vincula tenant ↔ token)
  ↓
EmailConfig::updateOrCreate (por modulo: finance, core)
  ↓
JSON {success, redirect}
```

**Tela inicial:** Formulario de criacao de empresa
**Acao do usuario:** Configura empresa com credenciais e SMTP
**Requisicao:** `POST /master/company/store`
**Controller:** `MasterController@company_store`
**Tabelas alteradas (Landlord):**
- `tenants` (INSERT)
- `tenant_user` (INSERT, N registros)
- `integration_providers` (INSERT/firstOrCreate)
- `integration_tokens` (INSERT, 1 por provider)
- `company_token` (INSERT, 1 por token)
- `email_configs` (INSERT, 1 por modulo)
**Tabelas tenant criadas:** Todas as 51 tabelas via migrate
**APIs chamadas:** Nenhuma
**Resultado esperado:** Tenant criado com banco proprio, credenciais e SMTP
**Possiveis erros:**
- Logos com dimensoes erradas → 422
- Slug duplicado → erro DB
- Parcialmente criado → mensagens de erro parcial (nao faz rollback total)

---

## 19.2 Editar Empresa

```
Usuario Master
  ↓
Master → Empresas → Editar
  ↓
GET /master/company/{tenant}/edit
  ↓
MasterController@company_edit
  ↓
Tenant (com users, companyTokens.token.provider, emailConfigs)
Payloads mascarados para exibicao
  ↓
View: pages/system/master/company/company_edit
  ↓
Altera dados → Salvar
  ↓
POST /master/company/{tenant}/update
  ↓
MasterController@company_update
  ↓
Tenant::update (name, logos)
Tenant.users::sync
CompanyToken: deleta e recria para providers modificados
IntegrationToken::create (novos tokens)
EmailConfig::updateOrCreate
  ↓
Preserva secrets mascarados (nao sobrescreve)
  ↓
JSON {success}
```

**Tela inicial:** Formulario de edicao de empresa
**Acao do usuario:** Altera configuracoes da empresa
**Tabelas alteradas:** `tenants`, `tenant_user`, `company_token`, `integration_tokens`, `email_configs`
**Seguranca:** Secrets mascarados detectados e preservados (nao sobrescritos)

---

## 19.3 Gerenciar Credenciais de Integracao

```
GET /master/credentials → Lista
GET /master/credentials/add → Formulario
POST /master/credentials/store
  ↓
MasterController@credentials_store
  ↓
Validacao: label, provider_slug, payload
  ↓
IntegrationProvider::firstOrCreate
IntegrationToken::create (provider_id, label, payload, is_shared)
  ↓
JSON {success, token id}

GET /master/credentials/{id}/edit → Formulario
POST /master/credentials/{id}/update
  ↓
IntegrationToken::update (label, payload, is_shared)
  Preserva secrets mascarados
```

**Tabelas alteradas:** `integration_providers`, `integration_tokens`

---

## 19.4 Preview de Assinatura de Email

```
POST /master/company/signature/preview
  ↓
MasterController@company_signature_preview
  ↓
Recebe HTML da assinatura
GuzzleService (busca imagens externas → converte para base64 data URIs)
  ↓
JSON {html processado}
```

**APIs chamadas:** HTTP (busca imagens externas para inline)
