# HarmoScale CRM CRM/dashboard comercial em HTML, CSS e JavaScript com Supabase. ## Stack escolhida Para este projeto, a base recomendada e: - frontend em `HTML/CSS/JavaScript` - backend serverless em `TypeScript` - banco em `SQL/Postgres` com Supabase `PHP` nao foi incluido porque, neste caso, ele adicionaria uma segunda camada de backend sem necessidade real. A arquitetura de alta escala para este CRM fica melhor com Supabase + Edge Functions em TypeScript. ## O que este projeto cobre - dashboard de leads e produtividade - CRM separado por paginas - funil de vendas com kanban - leads ativos com cadastro e edicao - dashboard central com origem, atendimento e resposta - integracao com webhooks do Tintim e Evo API - ingestao automatica de metricas de trafego e campanhas - sincronizacao de multiplas BMs da Meta via Business Manager ID + access token - criacao de eventos no Google Agenda via Edge Function ## Estrutura principal - `index.html`: dashboard - `crm.html`: hub do CRM - `funil-vendas.html`: pipeline comercial - `leads-ativos.html`: lista, cadastro e edicao de leads - `calendario.html`: follow-ups e agenda - `configuracoes.html`: integracoes - `app.js`: logica compartilhada - `styles.css`: visual compartilhado - `.env`: variaveis locais do projeto - `.env.example`: modelo da env - `scripts/sync-env.mjs`: gera o `config.js` para o navegador - `ARCHITECTURE.md`: explicacao da stack recomendada - `supabase/schema.sql`: schema do banco - `supabase/functions/_shared`: helpers compartilhados em TypeScript - `supabase/functions/tintim-webhook/index.ts`: webhook de entrada de leads - `supabase/functions/tintim-webhook/README.md`: payload pronto e exemplo de chamada do webhook de leads - `supabase/functions/evo-response-webhook/index.ts`: webhook de tempo de resposta - `supabase/functions/google-calendar/index.ts`: criacao de eventos no Google Agenda - `supabase/functions/traffic-metrics-webhook/index.ts`: ingestao automatica de CPC, CPM, gasto e conversas iniciadas - `supabase/functions/meta-ads-sync/index.ts`: sincronizacao direta da Meta Ads para varias BMs - `supabase/functions/admin-users/index.ts`: bootstrap e gestao administrativa de usuarios - `supabase/functions/admin-settings/index.ts`: configuracoes administrativas seguras e BMs da Meta ## 1. Configurar o banco no Supabase Execute [supabase/schema.sql](/c:/Users/gusta/OneDrive/Área%20de%20Trabalho/CRM%20HARMOSCALE/supabase/schema.sql) no SQL Editor do Supabase. ## 2. Preencher a env do projeto Edite o arquivo `.env`: ```env CRM_SUPABASE_URL=https://SEU-PROJETO.supabase.co CRM_SUPABASE_ANON_KEY=SUA_SUPABASE_ANON_KEY CRM_FUNCTIONS_BASE_URL=https://SEU-PROJETO.supabase.co/functions/v1 ``` Se quiser, pode copiar o modelo de `.env.example`. ## 3. Gerar o config.js do frontend O navegador nao le `.env` diretamente. Para isso, o projeto agora tem um gerador: ```bash node scripts/sync-env.mjs ``` Ele cria ou atualiza o arquivo `config.js` com: - `supabaseUrl` - `supabaseAnonKey` - `functionsBaseUrl` Se `CRM_FUNCTIONS_BASE_URL` nao for preenchido, ele tenta montar automaticamente com base na URL do Supabase. ## 4. Publicar as Edge Functions ```bash supabase functions deploy tintim-webhook supabase functions deploy evo-response-webhook supabase functions deploy google-calendar supabase functions deploy traffic-metrics-webhook supabase functions deploy meta-ads-sync supabase functions deploy admin-users supabase functions deploy admin-settings ``` ## 5. Configurar secrets das Edge Functions As funcoes usam secrets do proprio Supabase, nao do `config.js`. Defina: - `SUPABASE_URL` - `SUPABASE_ANON_KEY` - `SUPABASE_SERVICE_ROLE_KEY` - `GOOGLE_CLIENT_ID` - `GOOGLE_CLIENT_SECRET` - `GOOGLE_REFRESH_TOKEN` - `GOOGLE_CALENDAR_ID` - `CRM_ALLOWED_ORIGINS` - `TINTIM_WEBHOOK_SECRET` - `EVO_WEBHOOK_SECRET` - `TRAFFIC_WEBHOOK_SECRET` Exemplo: ```bash supabase secrets set SUPABASE_URL=https://SEU-PROJETO.supabase.co supabase secrets set SUPABASE_ANON_KEY=SUA_SUPABASE_ANON_KEY supabase secrets set SUPABASE_SERVICE_ROLE_KEY=SUA_SUPABASE_SERVICE_ROLE_KEY supabase secrets set GOOGLE_CLIENT_ID=SEU_GOOGLE_CLIENT_ID supabase secrets set GOOGLE_CLIENT_SECRET=SEU_GOOGLE_CLIENT_SECRET supabase secrets set GOOGLE_REFRESH_TOKEN=SEU_GOOGLE_REFRESH_TOKEN supabase secrets set GOOGLE_CALENDAR_ID=primary supabase secrets set CRM_ALLOWED_ORIGINS=https://SEU-DOMINIO.com.br,http://127.0.0.1:5500,http://localhost:5500 supabase secrets set TINTIM_WEBHOOK_SECRET=SEU_SEGREDO_TINTIM supabase secrets set EVO_WEBHOOK_SECRET=SEU_SEGREDO_EVO supabase secrets set TRAFFIC_WEBHOOK_SECRET=SEU_SEGREDO_TRAFEGO ``` ## 6. URLs dos webhooks - Tintim: `https://SEU-PROJETO.supabase.co/functions/v1/tintim-webhook` - Evo API: `https://SEU-PROJETO.supabase.co/functions/v1/evo-response-webhook` - Ads e Trafego: `https://SEU-PROJETO.supabase.co/functions/v1/traffic-metrics-webhook` - Sync Meta Ads: `https://SEU-PROJETO.supabase.co/functions/v1/meta-ads-sync` Exemplo de payload do webhook de leads: - veja `supabase/functions/tintim-webhook/README.md` - payload base em `supabase/functions/tintim-webhook/example-payload.json` ## 7. Fluxo para deixar funcional 1. Preencha `.env`. 2. Rode `node scripts/sync-env.mjs`. 3. Execute o schema no Supabase. 4. Faça deploy das Edge Functions. 5. Configure os secrets no Supabase. 6. Aponte Tintim e Evo API para os webhooks. 7. Abra `index.html`, `crm.html` ou outra pagina do sistema. ## Observacoes - O `supabaseAnonKey` pode ficar no frontend; ele e publico por natureza. - O `SUPABASE_SERVICE_ROLE_KEY` nunca deve ficar no frontend. - O signup publico do Supabase deve ficar desativado depois do bootstrap inicial do primeiro `ADMIN MASTER`. - Os webhooks externos agora exigem um segredo proprio via header `x-webhook-secret`. - As functions internas usam JWT da sessao autenticada; sem isso, retornam `401/403`.