PATCH ÚNICO — PERMISSÕES DE REVENDEDOR + API (V52)
===================================================

Objetivo
--------
Corrigir os problemas encontrados na varredura profunda das permissões dos
revendedores e adicionar ao ADM a opção de permitir ou bloquear a API para
cada revendedor individualmente.

IMPORTANTE
----------
- Este patch NÃO contém max.db, database.db, clientes, créditos, chaves ou logs.
- As duas permissões novas começam DESATIVADAS para todos os revendedores.
- Nenhuma permissão atual de API/exclusão será concedida automaticamente.
- Faça backup dos arquivos e dos bancos antes de instalar em produção.

Como instalar
-------------
1. Abra a pasta principal "launcher", onde ficam mac.php e session_check.php.
2. Extraia o conteúdo deste ZIP DIRETAMENTE dentro dessa pasta.
3. Preserve as subpastas e confirme a substituição dos arquivos existentes.
4. Não crie uma pasta "PATCH..." dentro de launcher.
5. Entre novamente como ADM e abra Gestão de Revendas > Permissões.
6. Selecione o revendedor e libere somente o que desejar.

Novas opções no ADM
-------------------
1. Integração API
   - Libera o menu Integração API para o revendedor.
   - Permite gerar ou trocar a própria API Key.
   - Permite renovar somente clientes pertencentes à própria revenda.
   - Desconta 1 crédito por renovação de 30 dias.
   - É independente de "Renovação manual pelo painel".
   - Ao retirar a permissão, uma chave já emitida para de renovar imediatamente.

2. Excluir clientes
   - Libera o botão de exclusão nas telas permitidas.
   - O backend também exige essa permissão; esconder o botão não é a única defesa.
   - Só permite excluir clientes pertencentes à própria revenda.
   - Remove de forma consistente a ativação e os espelhos operacionais do cliente.
   - O histórico financeiro/auditoria não é apagado.

Correções incluídas
-------------------
- Login e acesso temporário do ADM agora abrem uma página que o revendedor
  realmente tem permissão para usar.
- O logo e os atalhos da barra lateral respeitam Meu Painel e Clientes.
- A API deixou de ser universal: página, geração de chave e endpoint têm a nova
  permissão, com nova checagem no momento da transação.
- request_id da API é idempotente também sob chamadas concorrentes.
- A data da renovação por API é relida dentro do lock, evitando cobrar duas vezes
  a partir do mesmo vencimento em requisições simultâneas diferentes.
- Exclusão recebeu permissão separada e proteção de propriedade nos dois backends.
- Setor de cobrança mostra somente os clientes da revenda logada; o ADM continua
  vendo o conjunto completo.
- Notificações agora são armazenadas separadamente por revendedor. A mensagem
  global do ADM continua sendo fallback para aparelhos sem mensagem própria.
- api/message.php aceita code/codigo/activation_code e device_id/id_dispositivo.
  Para clientes antigos sem identificador, o IP só é usado quando aponta para
  uma única revenda recente; IP compartilhado nunca decide o escopo.
- Os dois endpoints de presença agora gravam reseller_id quando recebem código
  ou dispositivo reconhecido.
- A tela Usuários Online filtra por revenda, tenta recuperar vínculos antigos,
  calcula Online por atividade nos últimos 5 minutos e protege a limpeza com CSRF.
- A fila Nexxa revalida a permissão antes de cada envio. Se o ADM revogar a
  permissão de uma campanha criada pelo revendedor, o item atual e os restantes
  são cancelados como falha antes de chamar o gateway.
- A permissão de cadastro automático agora descreve corretamente que a tela é de
  acompanhamento; as regras globais continuam controladas pelo ADM.
- Mercado Pago usa busy_timeout maior, BEGIN IMMEDIATE, releitura idempotente e
  repetição curta em lock temporário. Isso corrige o padrão "database is locked"
  e elimina a transação aninhada no webhook de créditos.
- Saídas novas de dispositivo/cobrança foram escapadas para evitar HTML/JS injetado.

Simulação e validação executadas
--------------------------------
- 32/32 cenários internos aprovados.
- Integridade inicial e final de max.db: OK.
- Integridade inicial e final de database.db: OK.
- Concessão e revogação da API: OK.
- Independência entre API e renovação manual: OK.
- Isolamento de cobrança entre duas revendas: OK.
- Bloqueio de exclusão cruzada: OK.
- Mensagens específicas + fallback global: OK.
- Usuários online por revenda e atividade recente: OK.
- Cancelamento da fila Nexxa após revogação: OK.
- Oito processamentos concorrentes do mesmo pagamento: 1 processado e 7
  reconhecidos como duplicados; nenhum crédito duplicado.
- JavaScript alterado e scripts incorporados: análise sintática OK.
- Estrutura de delimitadores dos 25 PHP alterados: OK.
- ZIP final: teste de integridade executado antes da entrega.

Limite da simulação
-------------------
Nenhuma chamada real foi enviada ao Mercado Pago ou à Nexxa, e nenhuma chave real
foi usada. A validação foi local, em cópias temporárias dos bancos, sem alterar os
clientes do pacote recebido. Depois da instalação, faça uma renovação de teste em
homologação antes de usar em produção.

Teste rápido depois de instalar
-------------------------------
1. Deixe Integração API desmarcada e confirme que o revendedor não vê o menu.
2. Marque Integração API, entre como o revendedor e gere a chave.
3. Faça uma renovação com request_id único e confirme desconto de 1 crédito.
4. Repita o mesmo request_id e confirme que não há novo desconto.
5. Retire Integração API e confirme que a mesma chave recebe acesso negado.
6. Repita o processo com Excluir clientes em um cliente de teste.
7. Confira Cobrança, Notificações e Usuários Online usando duas revendas diferentes.

Rollback
--------
Restaure do backup somente os arquivos substituídos por este patch. As estruturas
novas de banco são adicionais e podem permanecer sem afetar a versão anterior.
