# Plano — Nexus: de "cérebro do condomínio" para "cérebro de um apartamento"

_Fase 2 da transformação. A Fase 1 (renomeação **Asgard/sgci.io → Nexus**) já foi
executada. Este documento é o **plano de aprovação**: nada da Fase 2 é executado antes
do seu OK. Substitui o antigo `docs/PLANO-CEREBRO-CONDOMINIO.md` (agora obsoleto)._

> **O pivô, em uma frase:** o sistema deixa de gerenciar um **condomínio multi-unidade**
> (portaria, moradores, ALPR de veículos, assembleias, áreas comuns) e passa a ser o
> **sistema central de uma única residência** — foco em **automação, fechaduras
> (InControl), energia, clima, rede e um quadro de tarefas/listas do dia a dia**.

---

## 1. Decisões (as suas + as derivadas)

Legenda: **MANTER** · **REMOVER** · **SIMPLIFICAR** (manter o núcleo, cortar o que é de
condomínio) · **NOVO**.

| # | Área | Decisão | Origem |
|---|------|---------|--------|
| 1 | **ALPR / veículos / passagem** | **REMOVER** | você (é apto) |
| 2 | **Alarme (AMT 8000)** | **REMOVER** | você (não tem) |
| 3 | **InControl (fechaduras)** | **MANTER** (simplificar telas de escala condominial) | você |
| 4 | **Rede (Omada)** | **MANTER** | você |
| 5 | **Nível de água / cisterna** | **REMOVER** | você (não tem) |
| 6 | **Vídeo-porteiro / SIP (PVIP 2216)** | **REMOVER** | você |
| 7 | **Usina solar (SolarMan) + CELESC** | **MANTER** | você |
| 8 | **Clima** | **MANTER** | você |
| 9 | **Tarefas / obras / manutenção** | **SIMPLIFICAR** → "Trello turbinado" + listas | você |
| — | **Automação (luzes/tomadas/cenas/drivers)** | **MANTER** (núcleo) | derivada |
| — | **Motor de Regras (SE→ENTÃO)** | **MANTER** (tirar gatilhos mortos) | derivada |
| — | **Câmeras de vídeo (go2rtc) + dashboard** | **MANTER** | derivada |
| — | **Assembleias / Reservas de áreas comuns / Prestadores / Encomendas / Ocorrências (síndico)** | **REMOVER** (serviços de condomínio) | derivada |
| — | **Portaria, pré-cadastro, visitantes (fluxo ALPR)** | **REMOVER** | derivada da #1 |
| — | **Convite de visita (QR/link de porta) + Chaves compartilháveis** | **MANTER-simplificado** (deixar convidado entrar via fechadura) | derivada |
| — | **Papéis (morador/portaria/administração/…)** | **SIMPLIFICAR** para dono/morador/convidado | derivada |
| — | **Mural (video wall)** | **SIMPLIFICAR** (kiosk clima/energia/câmeras; tirar telas de portaria/PII) | derivada |
| — | **IA de operação / Assistente / Medidores** | **MANTER** (tirar fontes de água/ALPR) | derivada |
| — | **Infra (Diagnóstico, Docs, Backup, Módulos, Settings, Push, Auditoria, Workers)** | **MANTER** | derivada |

As linhas "derivada" são recomendações minhas para o escopo bater com "cérebro de um
apartamento". As que ainda merecem seu aval estão na **§9 (perguntas em aberto)**.

---

## 2. O que REMOVER (detalhe técnico)

Cada bloco lista as âncoras reais (controllers, views, rotas, tabelas, workers,
abilities) para a remoção ser mecânica e verificável pelo `static_check.php`.

### 2.1 ALPR / veículos / passagem (decisão 1) — o maior corte
- **Controllers:** `Vehicles`, `Plates`, `Visitors`, `PreRegistrations`, `PublicPreReg`,
  `AccessLogs`, `AccessRegistration`, `Monitor`, `Events`, `Cerberus`, `Cameras`
  (câmeras **ALPR** = `camera_config`, ≠ `VideoCameras` go2rtc), `Merge` (fusão de
  placas/pessoas), partes de `Search` (busca global de placas/veículos).
- **Serviços/infra:** `AlprService`, `AccessLogViewRepository::monitorFeed`,
  `camera_monitor.php` (worker), `import_events.php`, receptores ALPR em
  `public/` (`itsapi`, etc.), `Helpers::plate()`/`plateTag()`.
- **Tabelas:** `veiculo`, `placa` (ou equivalente), `historico_passagem`,
  `camera_config` (+ `mon_*`), `monitor_evento` (**parcial** — ver nota InControl),
  `pre_cadastro`/`visitante` e correlatas.
- **⚠ Nota InControl × passagem:** hoje `monitor_bridge` grava eventos das **fechaduras
  InControl** em `monitor_evento` e alimenta o motor de regras (gatilho `passagem`
  origem `incontrol`). Isso **fica** (é acesso de porta do apto). O que sai é a passagem
  de **veículo/ALPR** (origem `alpr`). Ou seja: **manter** `monitor_bridge` +
  `monitor_evento`; **remover** `AlprService` e o feed de placas.
- **Nav/abilities:** itens da seção **Portaria** e abilities `history.*`, `plate.*`,
  `vehicle.*`, `visitor.*`, `prereg.*`, `monitor.*` etc.

### 2.2 Alarme AMT 8000 (decisão 2)
- **Controller:** `Alarm`. **Serviços:** `AlarmService`, `App\Alarm\Amt8000Client`,
  `App\Support\AmtProtocol`. **Workers:** `alarme_bridge` (contínuo), `auto_alarme`.
- **Tabelas:** `alarme_central`, `alarme_zona`, `alarme_evento`.
- **Regras:** gatilho `alarme` e ação `alarme` no motor de regras (`RuleMatch::alarmeMatches`,
  `RuleActions::doAlarme`); tirar do editor e dos testes `tests_amt.php`/`tests_regras.php`.
- **Módulo/kill-switch:** `alarme` sai do `App\Support\Modules`. Abilities `alarm.*`.

### 2.3 Nível de água / cisterna (decisão 5)
- **Serviço/UI:** `WaterService`, `/automation/water` (tanque + gráfico), `auto_water`
  (worker), `waterHistoryRange`, tabela/stream `auto_water`.
- **Regras/alertas:** gatilho `nivel` (fonte água) e o alerta embutido de "caixa baixa".
- **Manter:** o resto da Automação. Só o subsistema hidráulico sai.

### 2.4 Vídeo-porteiro / SIP (decisão 6)
- **Serviço:** `IntercomService`. **Receptor:** `public/pvip.php` (+ rota `.htaccess`).
- **Config:** card "Vídeo-porteiro (PVIP 2216)" em `/settings` (KV `intercom_*`).
- **Tabela:** `intercom_event`. **Módulo:** `sip` sai do `Modules`.

### 2.5 Serviços de condomínio (derivada — sem uso num apto)
- **Assembleias + votação:** `Assemblies`; tabelas `assembleia*`. Abilities `assembly.*`.
- **Reserva de áreas comuns:** `Reservations`, `Areas`; tabelas `area_comum`,
  `area_reserva`. Abilities `reservation.*`.
- **Prestadores:** `Providers`; tabela `prestador_agenda`. Abilities `provider.*`.
- **Encomendas (portaria):** `Parcels`; tabela `encomenda`. Abilities `parcel.*`.
- **Ocorrências (morador↔síndico):** `Tickets`; tabelas `ocorrencia*`. → **absorvidas**
  pelo novo módulo de Tarefas (§4).

---

## 3. O que MANTER (com simplificações)

| Módulo | Mantém | Simplifica / corta |
|--------|--------|--------------------|
| **InControl** (fechaduras) | pessoas↔credenciais↔dispositivos (leitores/fechaduras), grupos de acesso, "Minha Foto", link público de atualização | **esconder** as telas de escala condominial: Departamentos, Zonas de tempo, Áreas (ocupação), Pontos de acesso — um apto não precisa. Ficam no código (inertes) ou saem do menu. |
| **Rede (Omada)** | `/rede`, `auto_omada`, driver `omada`, mural de rede | nada relevante |
| **Energia** (CELESC + SolarMan) | painéis, `/energia/*`, `energy_sync`, `celesc_sync` | CELESC multi-UC continua funcionando com 1 UC |
| **Clima** | `/clima`, `WeatherService`, `auto_weather` | nada |
| **Automação** | drivers (eWeLink/Tuya/Hue/MQTT/Modbus/Omada), cenas, cômodos, contas, painéis ao vivo, kill-switches | tirar o subsistema **água** (§2.3) |
| **Motor de Regras** | `/regras`, `auto_regras`, tempo real | **tirar gatilhos/ações mortos:** `alarme`, `nivel`(água), `passagem`(ALPR — manter só InControl). Rever `RuleEngine::$gatilhos`, catálogo de variáveis e modelos. |
| **Câmeras de vídeo** | `VideoCameras`, `/live`, câmeras no dashboard, go2rtc | nada (é vídeo do apto, não ALPR) |
| **Chaves / portas** | `Doors`, `DoorShares` (`/k/{token}`), abrir chave | casa bem com fechaduras InControl (compartilhar acesso com convidado) |
| **Convite de visita** | `VisitConvite` (QR/WhatsApp) | repropor como "liberar convidado" via porta/fechadura |
| **IA / Operação / Assistente** | `Operations`, `Assistant`, `auto_ai` | tirar fontes de **água** e **ALPR**; manter energia/medidores/clima/dispositivos |
| **Medidores** (submedição) | **MANTER** (opcional/ativável, ex.: energia) | — |
| **Mural** (kiosk) | **MANTER** — telas **clima / energia / câmeras / sistemas** | **remover** telas `monitor`(ALPR) e `rede`(PII de clientes) do rodízio |
| **Dashboard / Central / Hub** | `Dashboard`, `Central`, `ResidentHome` (`/inicio`) | reescrever os blocos: sem água/ALPR/pré-cadastro/portaria; focar automação, energia, tarefas, câmeras |
| **Pânico/SOS** | **MANTER** (alerta à família) | — |
| **Infra** | Auth, Users, Settings, Modules, Backup, Diagnostics, Docs, Logs, Audit, Notifications, Push, ApiClients, Retention, Cleanup, Encoding, TechnicalCrud | atualizar allowlists (ex.: `ConfigBackup`) ao remover tabelas |

---

## 4. NOVO módulo: "Tarefas & Listas" (o Trello turbinado) — decisão 9

Substitui o pacote pesado de OS/Obra/Manutenção por algo **enxuto e do dia a dia do
apto**. Reaproveita o que já existe (quadro Kanban, checklist, anexos/GED) e **corta**
o que é de obra/empreiteira.

### 4.1 O que ENTRA (reaproveitado, simplificado)
- **Quadro (Kanban)** de tarefas — herda a view `/os/kanban` (arrastar entre colunas).
  Colunas simples: **A fazer · Fazendo · Feito** (configurável).
- **Tarefa** enxuta: título, descrição, responsável (membro da casa), prazo, prioridade,
  etiquetas, checklist, anexos (manuais/fotos via GED existente), cômodo (`pat_local`),
  ativo vinculado (opcional). Herda `os_tarefa` **muito** podado.
- **Listas** (o pedido explícito): **compras**, **lembretes**, **"trazer de outro lugar"**,
  e listas livres. Modelo: uma `lista` + `lista_item` (texto, feito, quantidade opcional,
  ordem). A antiga `/compras` vira a lista de compras (sem estoque/nota/pedido).
- **Manutenção preventiva leve:** lembrete recorrente (ex.: "trocar filtro do ar a cada
  90 dias") — herda `os_plano` reduzido (sem SLA/equipe/supervisor), gera uma **tarefa**.
- **Ativos + Manuais:** `Ativos` (eletrodomésticos, ar-condicionado…) + `Documentos`
  (garantia, manual) — **mantidos leves**; `pat_local` vira os **cômodos** do apto.

### 4.2 O que SAI (do módulo pesado)
- `Equipes` (times), `ObraOcorrencias` (incidente de obra), `Imoveis` (multi-imóvel →
  existe **uma** residência implícita), `Materiais`/estoque/movimento/`Compras`(pedido),
  `Pendencias` como entidade separada (vira status/etiqueta da tarefa), ciclo de OS
  gerencial (entrega≠conclusão, validação, bloqueio), Calendário/Gantt (opcional manter
  só o **Kanban** + uma lista simples).
- Tabelas a dropar: `equipe`, `equipe_membro`, `obra_ocorrencia`, `os_pendencia*`,
  `material*`, `pat_imovel`; podar `os_tarefa` (tirar colunas de obra/SLA/equipe).

### 4.3 Esboço de dados (novo/enxuto)
```
tarefa        (id, titulo, descricao, status, prioridade, responsavel_pessoa_id,
               local_id?, ativo_id?, prazo, etiquetas, criado_em, concluido_em)
tarefa_item   (checklist) — reaproveita os_checklist
lista         (id, nome, tipo: compras|lembretes|trazer|livre, ordem)
lista_item    (id, lista_id FK, texto, feito, qtd?, ordem)
plano         (recorrência → gera tarefa) — os_plano podado
```
Reaproveita `pat_ativo` (ativos) e `pat_documento` (GED) — só cai `pat_imovel`.

---

## 5. Papéis & permissões (simplificação)

Hoje: `morador`, `portaria`, `administracao`, `funcionario_autorizado`, `admin_sistema`
(mapa em `app/Services/PermissionService.php`, ~86 abilities).

Proposta para um apto:

| Papel novo | Vem de | Pode |
|---|---|---|
| **dono** (admin) | `administracao` + `admin_sistema` | tudo: config, automação, energia, regras, usuários |
| **morador** (membro da casa) | `morador` | automação atribuída, tarefas/listas, câmeras?, clima, energia (ver) |
| **convidado** | novo, opcional | só o que for compartilhado (link de porta/chave); sem login pleno |

- **Sai:** `portaria` e `funcionario_autorizado` (não há guarita nem funcionário de
  condomínio). Remapear as ~43 abilities de `portaria` e ~19 de `funcionario_autorizado`
  para `dono` (ou remover junto com o módulo).
- **Impacto:** revisar TODAS as abilities de módulos removidos (somem) e reatribuir as de
  módulos mantidos. O `static_check.php` (check 3) valida ability↔rota↔menu.
- **Câmera para morador: SIM (confirmado).** Hoje o morador **não** vê câmera (regra
  §5.45). Num apto a família é a casa → moradores **passam a ver** as câmeras. Igualar a
  ability do card do dashboard, do `/live` e do endpoint `/video-cameras/{id}/snapshot`
  (as três TÊM que casar, senão adivinhar a URL do snapshot vaza o quadro).

---

## 6. Modelo de dados & migração

- **Regra de ouro preservada:** `schema.sql` continua **canônico, idempotente e
  não-destrutivo** (nunca `DROP`). Como a **instalação nova ainda não foi feita**, a
  limpeza é simples e segura:
  1. **Remover do `schema.sql`** os blocos (CREATE/ALTER/índice/seed) das tabelas mortas
     — isso **não** é `DROP`; só faz o banco novo **não criá-las**. Base nova nasce limpa.
  2. **Apagar os `migration_*.sql`** dos módulos removidos (viram história desnecessária).
  3. Para uma base que **por acaso** já exista, um único script **`limpeza_apto.sql`**
     (fora do `schema.sql`, explicitamente destrutivo e opcional) dropa as tabelas mortas.
- **Tabelas que saem** (≈): `veiculo`, `placa`, `historico_passagem`, `camera_config`,
  `pre_cadastro`/`visitante`, `alarme_central/zona/evento`, `auto_water`, `intercom_event`,
  `assembleia*`, `area_comum`, `area_reserva`, `prestador_agenda`, `encomenda`,
  `ocorrencia*`, `equipe*`, `obra_ocorrencia`, `os_pendencia*`, `material*`, `pat_imovel`.
- **Tabelas novas:** `tarefa`, `lista`, `lista_item` (§4.3).
- **`monitor_evento` FICA** (eventos de fechadura InControl), mas revisar colunas/uso ALPR.
- Atualizar allowlist do `ConfigBackup` e o `DiagnosticsService`/autoteste (esperam certas
  tabelas). O `static_check.php` **check 6** confere tabela referenciada em SQL × schema.

---

## 7. Menu / navegação (nova estrutura)

Menu hoje tem 9 seções (`nav_items.php`). Proposta enxuta para o apto:

- **Início** — Início (hub), Dashboard, Central, Assistente
- **Casa** (automação) — Painel, Minha Casa, Cenas, Regras, Câmeras, Chaves/Portas
- **Tarefas** — Quadro, Listas (compras/lembretes/trazer), Manutenção (preventivas), Ativos & manuais
- **Monitoramento** — Energia, Clima, Rede, Operação (IA)
- **Acesso** (InControl) — Fechaduras/Leitores, Credenciais, Pessoas da casa, Convites
- **Configurações** — Settings, Módulos, Usuários, Chaves e links
- **Sistema** — Diagnóstico, Documentação, Backup, Auditoria, Logs

Somem: **Portaria** inteira, **Condomínio** (serviços), itens de água/alarme/vídeo-porteiro.

---

## 8. Workers (Agendador de Tarefas do Windows)

| Fica | Sai |
|------|-----|
| `auto_poll`, `auto_schedule`, `auto_sun` (automação) | `auto_water` (água) |
| `auto_omada` (rede), `auto_weather` (clima) | `auto_alarme` + `alarme_bridge` (alarme) |
| `energy_sync`, `celesc_sync` (energia) | `camera_monitor` (ALPR), `import_events` (ALPR) |
| `auto_regras`, `auto_ai`, `auto_preventiva`(leve) | — |
| `mqtt_bridge`, `go2rtc`, `auto_watchdog` (contínuos) | — |
| `monitor_bridge` (contínuo — **fechaduras InControl**) | — (mantém; só perde o lado ALPR) |

Atualizar **os dois** `install_workers.bat` **e** `uninstall_workers.bat` (regra §6:
sempre completos e em **CRLF**) e o `WorkerHealthRepository`. O `static_check.php`
**check 7/8/9** valida cobertura e CRLF.

---

## 9. Decisões confirmadas (2026-07) ✅

Todas as perguntas em aberto foram respondidas pelo Gui:

1. **Câmeras para moradores:** **SIM** — a família (papel `morador`) passa a ver as
   câmeras no dashboard/`/live`. Rever a regra §5.45 (que hoje bloqueia `morador`) e
   igualar a ability do card, do `/live` e do endpoint `/video-cameras/{id}/snapshot`.
2. **Convite de visita + Chaves compartilháveis + Pânico/SOS:** **MANTER os dois** —
   liberar convidado via fechadura InControl **e** botão de pânico (alerta à família).
3. **Medidores (submedição):** **MANTER** (opcional/ativável).
4. **Mural (kiosk numa TV):** **MANTER** — telas clima/energia/câmeras/sistemas; **sem**
   as telas de portaria (`monitor`/ALPR) e sem a de `rede` (PII de clientes).
5. **Ocorrências/Pendências → Tarefas:** **SIM** — viram tarefas/etiquetas no quadro
   (sem módulo separado de ticket de síndico).
6. **Papéis:** **dono / morador / convidado**.

---

## 10. Ordem de execução proposta (com verificação a cada passo)

1. **Cortes isolados e de baixo risco primeiro** (não têm dependências entrando):
   Alarme (§2.2) → Vídeo-porteiro (§2.4) → Água (§2.3). Rodar `static_check.php`.
2. **Serviços de condomínio** (§2.5): Assembleias, Reservas/Áreas, Prestadores,
   Encomendas. `static_check.php`.
3. **ALPR/veículos/portaria** (§2.1) — o maior; fazer por último entre os cortes, com
   cuidado no `monitor_bridge`/`monitor_evento` (preservar o lado InControl).
4. **Papéis & permissões** (§5) — reescrever `PermissionService`, reatribuir abilities.
5. **Simplificar InControl / Mural / Dashboard / Regras** (§3).
6. **Novo módulo Tarefas & Listas** (§4) — construir sobre o que sobrou de OS.
7. **Menu, schema, workers, ConfigBackup, autoteste** (§6/§7/§8).
8. **Verificação final:** `static_check.php` limpo + autoteste `/diagnostics` + smoke test
   de login por papel. (Um subagente pode auditar o diff antes de concluir.)

Cada passo é **atômico e verificável** — o `static_check.php` (rotas↔métodos↔views↔
abilities, placeholders, CRLF, cobertura de worker) é a rede de segurança a cada corte.

---

## 11. Riscos & cuidados
- **Acoplamento do ALPR** é o maior risco: `Search` global, `Dashboard`, `Central`,
  `Mural`, `Rules` e `monitor_evento` tocam passagem. Remover por camadas e testar.
- **`monitor_bridge`/`monitor_evento` são compartilhados** ALPR × InControl — **não**
  remover junto; separar o lado de veículo do lado de fechadura.
- **Abilities órfãs** quebram menu/rota — o `static_check.php` acusa; reatribuir com calma.
- **`schema.sql` não-destrutivo** — limpeza por **remoção de blocos** (base nova) +
  script opcional `limpeza_apto.sql` (nunca `DROP` dentro do `schema.sql`).
- **Backups/segredos:** `api/.env` tem valores reais; o `.gitignore` já o protege.

---

_Próximo passo: você aprova o plano (e responde a §9); então executo na ordem da §10,
com `static_check.php` verde a cada etapa._
