--- name: Bling ERP - Módulo Completo description: Bling ERP com abas por empresa, card pendentes, permissões, mapeamento situações API v3, sync corrigida type: project --- ## Bling ERP - Estado Atual (2026-03-31) ### Estrutura - **Abas por empresa**: cada empresa Bling tem sua própria aba com dashboard completo (stats, pedidos, config OAuth) - **Visão Geral**: cards clicáveis por empresa sem stats globais - **Card Pendentes Envio**: destaque laranja com pedidos em aberto por empresa - **Logos**: busca via API `/empresas/me/dados-basicos` - só aceita URLs válidas (http) - **Toasts**: substituiu todos alert() por toasts no canto superior direito ### Permissões - `bling_visualizar` - acesso completo ao módulo - `bling_pendentes_dia` - vê APENAS o card de pendentes (modo restrito, cards lado a lado col-lg-6) - Valeria (user 7): tem `bling_pendentes_dia` (removido visualizar/gerenciar/configurar/pedidos via usuario_permissoes tipo=remover) - Menu verifica `bling_pendentes_dia` para mostrar link ### Mapeamento Situações API v3 (CORRIGIDO) - `situacao.valor: 0` = **Em aberto** (id:6) - `situacao.valor: 1` = **Atendido** (id:9) - ANTES era mapeado errado como "Verificado" - `situacao.valor: 2` = **Cancelado** (id:12) - ANTES era mapeado errado como "Atendido" - Banco corrigido com UPDATE em massa ### Sync Melhorada - Após sync normal (10 páginas), re-verifica os 50 pedidos "abertos" mais recentes via API individual - Pedidos abertos com +90 dias marcados como Atendido automaticamente - Anti rate-limit: 150ms entre requests individuais ### G Closet - Status "erro" - refresh token expirado (invalid_grant) - precisa reconectar OAuth - Nome tem espaço no final "G Closet " - `iniciais()` corrigido com `trim().split(/\s+/)` ### Bug "GUNDEFINED" - Causa: nome com espaço no final + logo URL undefined - Fix: `iniciais()` usa `trim().split(/\s+/)`, logos validam `indexOf('http') === 0`