--- name: Sessão completa 10/04/2026 description: Formatação telefone, catálogo produtos marketplace, boas-vindas VoIP, Bling OAuth, app Windows, integração IA+Bling type: project originSessionId: 31a944a6-f0ff-4c37-959a-4837ab85729d --- ## Correções Telefone WhatsApp (GLOBAL) - **DDD >= 31** remove o 9 (antes era só 31-38 MG). Corrigido em 7 arquivos - Formatação centralizada: `WhatsApp::formatarTelefoneDDD()` é a ÚNICA função - `enviarMensagemTexto()` e `enviarArquivo()` já chamam internamente — NÃO pré-formatar - CronBoletos e CronNfseAutomatica tinham código inline duplicado — removido - Horário comercial (08-18h seg-sex) adicionado para confirmação pagamento e NFSe - Boleto em fim de semana/feriado: `ajustarParaDiaUtil()` move para próximo dia útil ## Boas-Vindas VoIP (Magnus Billing) - **Token corrigido**: Cliente.php tinha token antigo `85f112c1...`, correto é `58253c6b...` (do .env) - **Gravação**: dialplan agora salva como `${AUDIO_FILE}.wav` (nome da API) em vez de `${UNIQUEID}.wav` - **Cliente.php**: agora salva `gravacao_uid` retornado pela API no `cobranca_ligacao_log` - **AMD removido**: detecção de caixa postal causava Congestion em todas as chamadas (operadoras BR tocam mensagem antes) - **Retries**: MaxRetries=10, RetryTime=180 (tenta 10x a cada 3 min) - **cobranca_api.py** no Magnus (porta 8880): token `58253c6ba4027c651b51eb7c47ea5a6ce9eae2efa0a9fc46a3ec58794a3fb2b3` ## Cobrança WhatsApp - WhatsApp bloqueava envio quando PDF não existia — corrigido para enviar mensagem mesmo sem PDF - Log marcava `tipo_envio: ambos` antes de realmente enviar WhatsApp — causava dedup falso ## Bling OAuth - Rota `/bling/callback` estava DENTRO do `authMiddleware` — Bling redirecionava e middleware bloqueava - Movida para FORA do grupo auth - State salvo no banco como fallback (sessão se perde no redirect externo) - Erro 403 `insufficient_scope`: app Bling só tinha permissão de pedidos, precisa de produtos também ## Catálogo de Produtos (NOVO MÓDULO) - **Tabelas**: `catalogo_tokens`, `catalogo_produtos`, `catalogo_produto_variacoes`, `catalogo_produto_imagens` - **Token curto**: 4 chars (ABCDEFGHJKLMNPQRSTUVWXYZ23456789, sem 0/O/1/I) - **Subdomínio**: `produtos.gotechbr.com.br` criado no cPanel, SSL Let's Encrypt instalado - **Link público**: `https://produtos.gotechbr.com.br/YQMH` — formulário para cliente enviar produtos - **Formulário mobile-first**: foto principal + variações com foto individual + preço marketplace + estoque - **Botão "Enviar para Equipe"** fixo no rodapé mobile - **Área do cliente**: menu "Meus Produtos" só aparece para clientes com serviço "Gestão de Marketplace" - **temMarketplace**: query `LIKE '%Marketplace%' AND NOT LIKE '%Marketing%'` — precisa estar em TODOS os controllers que renderizam views da área do cliente (AreaCliente, AreaClienteSocial, AreaClienteCatalogo) - **Views padrão**: `ob_start()` → conteúdo → `ob_get_clean()` → `view('area_cliente/layout', ...)` com `$conteudo` - **Listagem admin**: `/catalogo/produtos/{id}` com expand/collapse variações, busca, paginação, modal imagem grande - **Menu no sistema**: dentro de OPERACIONAL & SUPORTE (não separado) - **Permissões**: `catalogo_gerenciar`, `catalogo_visualizar` (grupo "Catálogo") - **Rotas públicas**: `catalogo/(:alpha)` + subdomínio `(:segment)` com detecção `$_SERVER['HTTP_HOST']` - **URLs relativas** no JS do formulário público (evita CORS entre domínios) - **Imagens públicas**: `/catalogo/img/{filename}` (sem auth) ## Integração Catálogo → IA → Bling (EM ANDAMENTO) - **CatalogoIA.php**: Groq API (LLaMA 3.3-70b) gera título melhorado + descrição - **SKU automático**: `CALSA01020` (nome abreviado + valor sem vírgula), variação `CALSA-VERDE1020` (+ cor) - **CatalogoBlingSync.php**: sincroniza com Bling via CNPJ do cliente - **Verificação duplicidade**: busca por SKU exato + nome similar (>= 80%) antes de cadastrar - **Status**: `pendente` → `processando` → `enviado`/`erro`/`duplicado` - **Cron**: `GET /cron/catalogo-bling?token=CRON_TOKEN_SECRETO` (a cada 5 min) - **GROQ_API_KEY** adicionada no .env do servidor intranet - **PENDENTE**: reconectar conta Bling com permissão de produtos (403 insufficient_scope) ## Serviços Contratados (Gestão) - Tabela `servicos_disponiveis` criada com 11 serviços - `ClienteServicoModel::servicosDisponiveis()` agora lê do banco (não hardcoded) - Página de gestão: `/empresas/servicos` — adicionar, editar, ativar/desativar, reordenar (drag-and-drop) - Views de clientes (create, edit, index) atualizadas para usar lista dinâmica ## App Windows Notifier v1.7.5 - **CREATE_NO_WINDOW** adicionado em TODOS os subprocess (mesh_agent.py, watchdog.py) - **Polling**: mudado de 30s para 60s - **Demandas**: popup máximo a cada 60s (não instantâneo) - **Chat/WhatsApp**: continua instantâneo - **Bug auto-update**: ZIP tinha subpasta `GoTechBR Notifier/` que causava xcopy para caminho errado. Fix: detectar subpasta OU criar ZIP sem subpasta (flat) - **ZIP flat**: arquivos na raiz do ZIP para compatibilidade com v1.7.4 ## Link Área do Cliente - SocialMedia.php: `base_url('area-cliente/login')` → `https://cliente.gotechbr.com.br/login` ## Site GotechBR - Integração Bling - Página `integracao-bling` atualizada com permissões de Produtos (escrita) - Escopos: Pedidos de Venda (6 permissões) + Produtos (5 permissões)