mirror of
https://github.com/rodtanci/Disparador-de-Campanha-Chatwoot-Evolution.git
synced 2025-07-14 01:41:25 -06:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d9044bdc37 | ||
![]() |
717ce79419 | ||
![]() |
14f8521c6c | ||
![]() |
adcf030101 | ||
![]() |
c0025d3ded |
File diff suppressed because it is too large
Load Diff
123
README.md
123
README.md
@ -132,14 +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,
|
|
||||||
ADD COLUMN labels_id bigint;
|
|
||||||
```
|
|
||||||
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
|
||||||
@ -154,120 +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 public.replicate_label_to_tags()
|
|
||||||
RETURNS trigger
|
|
||||||
LANGUAGE 'plpgsql'
|
|
||||||
COST 100
|
|
||||||
VOLATILE NOT LEAKPROOF
|
|
||||||
AS $BODY$
|
|
||||||
BEGIN
|
|
||||||
-- Verifica se já existe um registro em tags para este label_id
|
|
||||||
IF NOT EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM public.tags
|
|
||||||
WHERE labels_id = NEW.id
|
|
||||||
) THEN
|
|
||||||
INSERT INTO public.tags (labels_id, name, account_id)
|
|
||||||
VALUES (NEW.id, NEW.title, NEW.account_id);
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
ALTER FUNCTION public.replicate_label_to_tags()
|
|
||||||
OWNER TO postgres;
|
|
||||||
```
|
|
||||||
|
|
||||||
**Função para replicar exclusões:**
|
|
||||||
|
|
||||||
```sql
|
|
||||||
CREATE OR REPLACE FUNCTION public.delete_label_from_tags()
|
|
||||||
RETURNS trigger
|
|
||||||
LANGUAGE 'plpgsql'
|
|
||||||
COST 100
|
|
||||||
VOLATILE NOT LEAKPROOF
|
|
||||||
AS $BODY$
|
|
||||||
BEGIN
|
|
||||||
DELETE FROM public.tags
|
|
||||||
WHERE labels_id = OLD.id;
|
|
||||||
|
|
||||||
RETURN OLD;
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
ALTER FUNCTION public.delete_label_from_tags()
|
|
||||||
OWNER TO postgres;
|
|
||||||
```
|
|
||||||
|
|
||||||
**Função para replicar atualizações:**
|
|
||||||
|
|
||||||
```sql
|
|
||||||
CREATE OR REPLACE FUNCTION public.update_label_to_tag()
|
|
||||||
RETURNS trigger
|
|
||||||
LANGUAGE 'plpgsql'
|
|
||||||
COST 100
|
|
||||||
VOLATILE NOT LEAKPROOF
|
|
||||||
AS $BODY$
|
|
||||||
BEGIN
|
|
||||||
UPDATE public.tags
|
|
||||||
SET name = NEW.title,
|
|
||||||
account_id = NEW.account_id -- opcional, se quiser atualizar também a conta
|
|
||||||
WHERE labels_id = NEW.id;
|
|
||||||
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$BODY$;
|
|
||||||
|
|
||||||
ALTER FUNCTION public.update_label_to_tag()
|
|
||||||
OWNER TO postgres;
|
|
||||||
```
|
|
||||||
|
|
||||||
6. **Criação dos Indices e Triger**
|
|
||||||
|
|
||||||
|
|
||||||
**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 index_tags_on_name_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, deletada ou removida 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 trg_delete_label_from_tags
|
|
||||||
AFTER DELETE
|
|
||||||
ON public.labels
|
|
||||||
FOR EACH ROW
|
|
||||||
EXECUTE FUNCTION public.delete_label_from_tags();
|
|
||||||
|
|
||||||
CREATE OR REPLACE TRIGGER trigger_replicate_label_to_tags
|
|
||||||
AFTER INSERT
|
|
||||||
ON public.labels
|
|
||||||
FOR EACH ROW
|
|
||||||
EXECUTE FUNCTION public.replicate_label_to_tags();
|
|
||||||
|
|
||||||
CREATE OR REPLACE TRIGGER trigger_update_label_to_tag
|
|
||||||
AFTER UPDATE
|
|
||||||
ON public.labels
|
|
||||||
FOR EACH ROW
|
|
||||||
EXECUTE FUNCTION public.update_label_to_tag();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Passo 3: Importar Workflows no n8n
|
### Passo 3: Importar Workflows no n8n
|
||||||
|
1
typebot-modelo.json
Normal file
1
typebot-modelo.json
Normal 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}
|
Loading…
Reference in New Issue
Block a user