Compare commits

...

11 Commits
v2.0 ... main

Author SHA1 Message Date
Tanci
d9044bdc37
Update README.md 2025-06-04 16:40:08 -03:00
Tanci
717ce79419
Update README.md 2025-06-04 16:39:27 -03:00
Tanci
14f8521c6c
Update Disparador EVO V2.json 2025-06-04 16:38:51 -03:00
Tanci
adcf030101
Update README.md 2025-05-06 21:15:56 -03:00
Tanci
c0025d3ded
Add files via upload 2025-05-06 20:19:32 -03:00
Tanci
b4b671064f
Update README.md 2025-05-06 20:12:10 -03:00
Tanci
4a4b358e29
Update README.md 2025-05-06 20:11:45 -03:00
Tanci
76e1069526
Update README.md 2025-05-06 20:09:31 -03:00
Tanci
e73e06f7e6
Update Disparador EVO V2.json 2025-05-06 20:02:29 -03:00
Tanci
53538fa5ce
Update reset-limite-campanhas.json 2025-05-06 20:01:10 -03:00
Tanci
b79a277c39
Update README.md 2025-05-06 20:00:29 -03:00
4 changed files with 883 additions and 631 deletions

File diff suppressed because it is too large Load Diff

112
README.md
View File

@ -118,7 +118,7 @@ Antes de iniciar, certifique-se de que você já tem instalado:
- Execute o seguinte comando SQL para adicionar a coluna `limite_disparo`: - Execute o seguinte comando SQL para adicionar a coluna `limite_disparo`:
```sql ```sql
ALTER TABLE accounts ALTER TABLE accounts
ADD COLUMN limite_disparo INTEGER NOT NULL DEFAULT 100; ADD COLUMN limite_disparo INTEGER NOT NULL DEFAULT 500;
``` ```
3. **Adicionar Colunas na Tabela campaigns**: 3. **Adicionar Colunas na Tabela campaigns**:
- Execute os seguintes comandos SQL para adicionar as colunas status_envia, enviou e falhou na tabela campaigns: - Execute os seguintes comandos SQL para adicionar as colunas status_envia, enviou e falhou na tabela campaigns:
@ -132,13 +132,7 @@ Antes de iniciar, certifique-se de que você já tem instalado:
ALTER TABLE campaigns ALTER TABLE campaigns
ADD COLUMN falhou INTEGER NOT NULL DEFAULT 0; ADD COLUMN falhou INTEGER NOT NULL DEFAULT 0;
``` ```
4. **Adicionar Coluna na Tabela tags**: 4. **Adicionar nova Tabela para guardar os envios que falharem**:
- Execute o seguinte comandos SQL para adicionar as coluna account_id na tabela tags:
```sql
ALTER TABLE IF EXISTS public.tags
ADD COLUMN account_id integer;
```
5. **Adicionar nova Tabela para guardar os envios que falharem**:
- Execute o seguinte comando SQL para adicionar a tabela campaigns_failled: - Execute o seguinte comando SQL para adicionar a tabela campaigns_failled:
```sql ```sql
-- Cria a sequência -- Cria a sequência
@ -153,86 +147,6 @@ Antes de iniciar, certifique-se de que você já tem instalado:
); );
``` ```
## 🛠️ OBRIGATORIO ❗ - 🚨 CORREÇÃO NO BANCO DE DADOS DO CHATWOOT ⚠️
### Após aplicar esta correção é recomendavel recriar as etiquetas (marcadores).
- Foi notado que os ID da tabela "labels" não condizia com os id ta tabela "tags" sendo assim criei algumas funções e triggers que corrigem esse problema.
6. **Criação das Funções de Replicação, Exclusão e Atualização**
***Cria na raiz do banco de dados***
**Função para replicar inserções:**
```sql
CREATE OR REPLACE FUNCTION replicate_label_to_tags()
RETURNS TRIGGER AS $$
BEGIN
-- Verifica se a etiqueta já existe para a mesma conta antes de inserir
IF NOT EXISTS (
SELECT 1 FROM public.tags
WHERE name = NEW.title AND account_id = NEW.account_id
) THEN
INSERT INTO public.tags (name, account_id)
VALUES (NEW.title, NEW.account_id);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
```
**Função para replicar exclusões:**
```sql
CREATE OR REPLACE FUNCTION delete_labels_from_tags_and_taggings()
RETURNS TRIGGER AS $$
BEGIN
-- Exclui da tabela tags
DELETE FROM tags WHERE id = OLD.id;
-- Exclui da tabela taggings
DELETE FROM taggings WHERE tag_id = OLD.id;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
```
**Função para replicar atualizações:**
```sql
CREATE OR REPLACE FUNCTION update_labels_to_tags()
RETURNS TRIGGER AS $$
BEGIN
UPDATE tags
SET name = NEW.title
WHERE id = NEW.id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
```
6. **Criação dos Indices**
**Esse índice garante que não possa haver duas tags com o mesmo nome (name) dentro da mesma conta (account_id). Ou seja, é uma restrição de unicidade por conta, impedindo duplicações acidentais.**
```sql
CREATE UNIQUE INDEX IF NOT EXISTS tags_unique_name_per_account
ON public.tags USING btree
(name COLLATE pg_catalog."default" ASC NULLS LAST, account_id ASC NULLS LAST)
TABLESPACE pg_default;
```
**Sempre que uma nova etiqueta (label) for criada no Chatwoot, esse gatilho automaticamente chama uma função que copia ou sincroniza essa etiqueta com a tabela de tags, que provavelmente é usada de forma mais genérica no sistema (como busca, filtros, etc.).**
```sql
CREATE OR REPLACE TRIGGER trigger_replicate_label_to_tags
AFTER INSERT
ON public.labels
FOR EACH ROW
EXECUTE FUNCTION public.replicate_label_to_tags();
```
--- ---
### Passo 3: Importar Workflows no n8n ### Passo 3: Importar Workflows no n8n
@ -251,14 +165,18 @@ Antes de iniciar, certifique-se de que você já tem instalado:
### Passo 4: Editar o Workflow Disparador no n8n ### Passo 4: Editar o Workflow Disparador no n8n
1. **Acesse o Workflow Disparador**: No n8n, abra o workflow Disparador que você importou. 1. **Acesse o Workflow Disparador**: No n8n, abra o workflow Disparador que você importou.
2. **Editar Nó Info_Base**: 2. **Editar o primeiro nó do postgres Buscar campanhas**
- Alterar na linha "select * from campaigns c where campaign_type = 1 and status_envia = 0 and account_id = 1"
- altere o valor e account_id para o ID da conta do chatwoot.
4. **Editar Nó Info_Base**:
- Preencha os seguintes campos com suas informações: - Preencha os seguintes campos com suas informações:
- **URL do ChatWoot** - **URL do ChatWoot**
- **URL da Evolution API** - **URL da Evolution API**
- **URL do view Typebot**
- **Token de acesso da conta do ChatWoot** - **Token de acesso da conta do ChatWoot**
- **Global API KEY da Evolution API** - **Global API KEY da Evolution API**
- **Email que vai enviar o relatório** - **Email que vai enviar o relatório**
3. **Conectar Nós do Postgres ao Banco de Dados do ChatWoot**: 5. **Conectar Nós do Postgres ao Banco de Dados do ChatWoot**:
- Conecte todos os nós do Postgres ao banco de dados do ChatWoot, garantindo que as informações fluam corretamente entre os sistemas. - Conecte todos os nós do Postgres ao banco de dados do ChatWoot, garantindo que as informações fluam corretamente entre os sistemas.
### Passo 5: Editar o Workflow reset-limite-campanha no n8n ### Passo 5: Editar o Workflow reset-limite-campanha no n8n
@ -266,6 +184,8 @@ Antes de iniciar, certifique-se de que você já tem instalado:
1. **Acesse o Workflow reset-limite-campanha**: No n8n, abra o workflow reset-limite-campanha que você importou. 1. **Acesse o Workflow reset-limite-campanha**: No n8n, abra o workflow reset-limite-campanha que você importou.
2. **Conectar Nós do Postgres ao Banco de Dados do ChatWoot**: 2. **Conectar Nós do Postgres ao Banco de Dados do ChatWoot**:
- Conecte todos os nós do Postgres ao banco de dados do ChatWoot, garantindo que as informações sejam atualizadas corretamente para resetar o limite de disparo diário. - Conecte todos os nós do Postgres ao banco de dados do ChatWoot, garantindo que as informações sejam atualizadas corretamente para resetar o limite de disparo diário.
- Se desejar altere o limite de envio diario dentro do nó do postgres.
- Recomendação para não sobrecarregar o worflow 500 disparos seguidos.
--- ---
@ -307,6 +227,13 @@ Você já viu esse vídeo??_
_&vid=https://evolution-api.com/files/video.mp4_" _&vid=https://evolution-api.com/files/video.mp4_"
### Exemplo de uso typebot:
"&typebot=id_da_url_do_fluxo_do_typebot"
Exemplo url: https://chatbotapi.cubochat.com.br/fluxotypebot
Usar: fluxotypebot
4. **Selecionar Caixa de Entrada**: No campo "Selecionar caixa de entrada", selecione a caixa de SMS que você criou no início do tutorial. 4. **Selecionar Caixa de Entrada**: No campo "Selecionar caixa de entrada", selecione a caixa de SMS que você criou no início do tutorial.
5. **Público**: Selecione a etiqueta que está atribuída aos contatos que quer disparar a campanha. 5. **Público**: Selecione a etiqueta que está atribuída aos contatos que quer disparar a campanha.
6. **Horário Agendado**: Selecione o dia e a hora que quer disparar a campanha. Caso queira disparar a campanha na mesma hora, selecione a data e a hora atual. 6. **Horário Agendado**: Selecione o dia e a hora que quer disparar a campanha. Caso queira disparar a campanha na mesma hora, selecione a data e a hora atual.
@ -380,6 +307,11 @@ Agora tudo está pronto para enviar a sua campanha!
- Dessa forma, o envio de mensagens é direcionado automaticamente para o número vinculado à caixa de entrada correspondente, garantindo escalabilidade, agilidade e padronização no processo de campanhas. - Dessa forma, o envio de mensagens é direcionado automaticamente para o número vinculado à caixa de entrada correspondente, garantindo escalabilidade, agilidade e padronização no processo de campanhas.
### Versão 2.1 🤖 (Já disponível)
**Envia fluxo de mensagem do typebot**
- Agora você pode enviar fluxo de typebot ao invés de mensagem única.
### Considerações Finais 🛠️ ### Considerações Finais 🛠️
- Este roadmap pode ser ajustado conforme novas ideias surjam ou prioridades se alterem durante o desenvolvimento. Cada etapa visa melhorar a funcionalidade e a eficiência do disparador de campanhas, proporcionando uma experiência mais completa e eficaz aos usuários. - Este roadmap pode ser ajustado conforme novas ideias surjam ou prioridades se alterem durante o desenvolvimento. Cada etapa visa melhorar a funcionalidade e a eficiência do disparador de campanhas, proporcionando uma experiência mais completa e eficaz aos usuários.

View File

@ -24,7 +24,7 @@
{ {
"parameters": { "parameters": {
"operation": "executeQuery", "operation": "executeQuery",
"query": "UPDATE accounts\nSET limite_disparo = 100", "query": "UPDATE accounts\nSET limite_disparo = 500",
"options": {} "options": {}
}, },
"id": "b9b20a59-d5ad-4983-8f97-80174ad3d0c9", "id": "b9b20a59-d5ad-4983-8f97-80174ad3d0c9",

1
typebot-modelo.json Normal file
View File

@ -0,0 +1 @@
{"version":"6.1","id":"uq9fgipz32gnc7jbu3dc38zc","name":"CAMPANHA (1)","events":[{"id":"jpua3e54x51tlqobmyiudqg1","outgoingEdgeId":"u5e2q4d5dxnqbfsgkytfgtz7","graphCoordinates":{"x":-333.99,"y":-214.66},"type":"start"}],"groups":[{"id":"co2rqdvhmrwz7k0bd7x7m7fd","title":"Group #6","graphCoordinates":{"x":-18.69,"y":-216.84},"blocks":[{"id":"o5m1aabszu0vepempv6zvqcr","type":"Set variable","options":{"variableId":"axbvrx2i2td8tajcgi4cd2rw","type":"Custom","expressionToEvaluate":"{{pushName}}","isCode":true}},{"id":"zd8k7hj6iplvwtjwj46issel","outgoingEdgeId":"husvshc9g61a6hnwf9se3my3","type":"text","content":{"richText":[{"type":"p","children":[{"text":"Olá {{pushName}}, tudo bem??"}]},{"type":"p","children":[{"text":""}]}]}}]},{"id":"vze99luuygwt52d7ijyzh75a","graphCoordinates":{"x":-29.13,"y":37.13},"title":"Group #2","blocks":[{"id":"mvwtd1epmy2o7qn4c4zzu19t","type":"text","content":{"richText":[{"type":"p","children":[{"text":"mensagem 2"}]}]},"outgoingEdgeId":"ye6qtu6vgc9aax7xj0r6q8md"}]},{"id":"z235phvb4gjyh4l8l1oave3k","graphCoordinates":{"x":-25.549523809524675,"y":229.99476190476238},"title":"Group #3","blocks":[{"id":"o5hso6hvmasscdeaqqur8752","type":"text","content":{"richText":[{"type":"p","children":[{"text":"mensagem 3"}]}]}}]}],"edges":[{"id":"u5e2q4d5dxnqbfsgkytfgtz7","from":{"eventId":"jpua3e54x51tlqobmyiudqg1"},"to":{"groupId":"co2rqdvhmrwz7k0bd7x7m7fd"}},{"from":{"blockId":"zd8k7hj6iplvwtjwj46issel"},"to":{"groupId":"vze99luuygwt52d7ijyzh75a"},"id":"husvshc9g61a6hnwf9se3my3"},{"from":{"blockId":"mvwtd1epmy2o7qn4c4zzu19t"},"to":{"groupId":"z235phvb4gjyh4l8l1oave3k"},"id":"ye6qtu6vgc9aax7xj0r6q8md"}],"variables":[{"id":"axbvrx2i2td8tajcgi4cd2rw","name":"pushName","isSessionVariable":true},{"id":"vsg4gfav575x3lzwe3xxjh0s","name":"horaHoje","isSessionVariable":false},{"id":"ricgkhg1lxza1b4arz56xoq1","name":"horaAmanha","isSessionVariable":false}],"theme":{},"selectedThemeTemplateId":null,"settings":{},"createdAt":"2025-05-06T23:17:24.574Z","updatedAt":"2025-05-06T23:17:24.574Z","icon":null,"folderId":"cm8yz6gjs000o13ppx6ffdfql","publicId":null,"customDomain":null,"workspaceId":"cm8yz16sq000k13ppd8dqvxcc","resultsTablePreferences":null,"isArchived":false,"isClosed":false,"whatsAppCredentialsId":null,"riskLevel":null}