@lionchat/mcp-server 1.31.0 → 1.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/instructions.md +26 -4
- package/dist/docs/resources/agenda-multiplas-unidades.md +56 -0
- package/dist/docs/resources/api-conventions.md +27 -0
- package/dist/docs/resources/assinatura-eletronica.md +79 -9
- package/dist/docs/resources/best-practices.md +23 -5
- package/dist/docs/resources/data-model.md +25 -2
- package/dist/docs/resources/filtros-e-relatorios.md +19 -4
- package/dist/docs/resources/flowbuilder-design-guide.md +80 -9
- package/dist/docs/resources/flowbuilder-patterns.md +33 -0
- package/dist/docs/resources/formularios-publicos.md +21 -2
- package/dist/docs/resources/kanban-deep-dive.md +187 -9
- package/dist/docs/resources/reports-guide.md +37 -7
- package/dist/docs/resources/troubleshooting.md +22 -4
- package/dist/tools.js +57 -13
- package/dist/tools.js.map +1 -1
- package/endpoints.json +908 -114
- package/package.json +1 -1
|
@@ -92,6 +92,16 @@ Account (conta/empresa)
|
|
|
92
92
|
- Adiar: `lionchat_kanban_items_snooze`. Abrir antes da data: `lionchat_kanban_items_unsnooze`. Regras em
|
|
93
93
|
`lionchat://docs/kanban-deep-dive`, seção "Card adiado".
|
|
94
94
|
|
|
95
|
+
### Analisar com IA (desde 28/10/2026)
|
|
96
|
+
- A IA lê os cards abertos e adiados das etapas escolhidas de um funil e sugere mudar de etapa ou de funil, pôr/tirar
|
|
97
|
+
etiqueta e marcar ganho/perdido. Ferramentas `lionchat_kanban_ai_analyses_*`: `setup` -> `create` -> `show` até
|
|
98
|
+
`ready` -> `items` -> `apply` (com `confirm: true`) -> `show` até `finished`.
|
|
99
|
+
- Quantos cards: `filters.limit` (1 a 1.000, padrão 200). A análise PULA os cards que a IA leu nos últimos 7 dias sem
|
|
100
|
+
fala nova do cliente; `filters.include_read: true` lê de novo (e gasta crédito de novo). "Por que não mudou nada?":
|
|
101
|
+
`items` com `no_change: true`.
|
|
102
|
+
- **Aplicar NÃO tem como desfazer**: confirme com o usuário quais cards e ações antes. Regras em
|
|
103
|
+
`lionchat://docs/kanban-deep-dive`, seção "Analisar com IA".
|
|
104
|
+
|
|
95
105
|
### AccountUser.role (string)
|
|
96
106
|
- `agent` (atendente comum)
|
|
97
107
|
- `administrator` (admin/dono)
|
|
@@ -187,6 +197,9 @@ Detalhes completos em `lionchat://docs/api-conventions` → "Wrapper de body".
|
|
|
187
197
|
- **funnel.stages** keys: snake_case slug; cada etapa é OBJETO com `name` texto
|
|
188
198
|
- **Lista de objetos é lista de objetos**: onde o formato pede `[{id: 5}]`, número solto (`[5]`) ou objeto
|
|
189
199
|
único no lugar da lista quebra a leitura — às vezes a tela da conta inteira (incidente 18/09, funil).
|
|
200
|
+
- **Chave que volta escondida** (`••••••••` ou `[REDACTED]`): é o valor de leitura, não a chave. Desde 27/10 mandar
|
|
201
|
+
esse valor de volta MANTÉM a chave gravada (chave da TopSend da conta, Hotmart, Kiwify, Ticto, Eduzz, Monetizze e
|
|
202
|
+
Greenn). Só mande o campo quando for trocar por uma chave nova de verdade.
|
|
190
203
|
|
|
191
204
|
### Gravação: TROCA inteira × SOMA (conferido no código em 18/09/2026)
|
|
192
205
|
|
|
@@ -291,7 +304,7 @@ POST /api/v1/accounts/{account_id}/kanban_items
|
|
|
291
304
|
```
|
|
292
305
|
|
|
293
306
|
- `conversation_display_id` é **opcional** (card sem conversa vinculada é válido).
|
|
294
|
-
- As ferramentas `lionchat_kanban_v2_*` cobrem anexos de card/nota e automações do Kanban (controllers criados em 07/2026 — a orientação antiga de ignorá-las está obsoleta).
|
|
307
|
+
- As ferramentas `lionchat_kanban_v2_*` cobrem anexos de card/nota e automações do Kanban (controllers criados em 07/2026 — a orientação antiga de ignorá-las está obsoleta). Arquivo do computador não sobe pelo MCP (não há envio direto de arquivo); arquivo **por link** sobe com `lionchat_upload_create` (`external_url`).
|
|
295
308
|
|
|
296
309
|
### Relatório de produtividade
|
|
297
310
|
```
|
|
@@ -317,6 +330,11 @@ teams, conversations_summary) exigem as DUAS pontas; nos demais, `since` ou `unt
|
|
|
317
330
|
5. Acompanhar com lionchat_campaigns_statistics (sent/delivered/read/failed)
|
|
318
331
|
```
|
|
319
332
|
Estrutura do audience: `[{type:'Label', id}, {type:'Funnel', id, stages:[], include_won, include_lost}, {type:'ConversationAttribute', key, value}]`.
|
|
333
|
+
Segmento de contatos como público (22/10/2026): `{type:'Segment', id}` no audience e na exclusão
|
|
334
|
+
(`trigger_rules.exclusion`). O id vem de `lionchat_custom_filters_list` com `filter_type: contact` (o segmento é da
|
|
335
|
+
CONTA). Vale para WhatsApp oficial, QR Code e Campanha de Fluxo; SMS e TopSend recusam (422). A regra do segmento é
|
|
336
|
+
lida na HORA do disparo: segmento apagado ou com regra quebrada = a campanha NÃO envia nada e o motivo fica em
|
|
337
|
+
`trigger_rules.audience_error`; na estimativa vem `estimated_count: null` com `segment_unavailable`.
|
|
320
338
|
QR Code aceita `template_params` com `delay_min/delay_max/variations` (anti-bloqueio) e `bulk_actions`.
|
|
321
339
|
|
|
322
340
|
### Criar campanha de FLUXO (dispara um flow, não uma mensagem) — novo 28/07/2026
|
|
@@ -392,7 +410,7 @@ Antes de QUALQUER ação que escreve, modifica, apaga ou envia, pare e avalie se
|
|
|
392
410
|
|
|
393
411
|
**Como confirmar:** descreva o efeito em linguagem do usuário e aguarde o "sim". Ex.: *"Vou apagar o contato #312 — isso remove as 4 conversas dele também. Confirma?"*. Se faltar dado, peça só o que falta (1-2 perguntas), nunca um questionário.
|
|
394
412
|
|
|
395
|
-
**Ferramentas com trava dura de confirmação.** Algumas ferramentas **recusam a chamada** sem `confirm: true` — a recusa vem do conector, antes de tocar no sistema. Não é erro: é o pedido de OK. O caminho é sempre o mesmo — descreva ao usuário exatamente o que será criado/alterado/apagado, aguarde o "sim", e só então reenvie a MESMA chamada com `confirm: true`. Nunca mande `confirm: true` na primeira tentativa "pra economizar uma volta": a trava existe justamente porque a descrição sozinha não segurava. Hoje: `lionchat_custom_dashboards_create`, `_update` e `_destroy` (relatório personalizado aparece na tela do cliente; alterar substitui a lista de blocos e apagar não tem desfazer).
|
|
413
|
+
**Ferramentas com trava dura de confirmação.** Algumas ferramentas **recusam a chamada** sem `confirm: true` — a recusa vem do conector, antes de tocar no sistema. Não é erro: é o pedido de OK. O caminho é sempre o mesmo — descreva ao usuário exatamente o que será criado/alterado/apagado, aguarde o "sim", e só então reenvie a MESMA chamada com `confirm: true`. Nunca mande `confirm: true` na primeira tentativa "pra economizar uma volta": a trava existe justamente porque a descrição sozinha não segurava. Hoje: `lionchat_custom_dashboards_create`, `_update` e `_destroy` (relatório personalizado aparece na tela do cliente; alterar substitui a lista de blocos e apagar não tem desfazer) e `lionchat_conversations_bulk_destroy` (27/10: apaga de vez até 300 conversas com mensagens e anexos — liste ao usuário quais saem antes do OK).
|
|
396
414
|
|
|
397
415
|
**Aja sem perguntar apenas em operações idempotentes:** leitura, busca, resumo, classificação.
|
|
398
416
|
|
|
@@ -429,9 +447,11 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
|
|
|
429
447
|
|
|
430
448
|
| Intenção do usuário | Tool certa | Cuidado |
|
|
431
449
|
|---|---|---|
|
|
450
|
+
| Criar **pasta de conversas para a conta toda** ("Urgentes do time", "Minhas abertas" para cada um) | `lionchat_custom_filters_create` com `filter_type: conversation` + `shared: true` | Só administrador (401). Pelo menos uma condição. Para cada pessoa ver as conversas DELA use `assignee_id` com `values: ["current_user"]`. `shared: false` depois devolve a pasta a quem mandou. Detalhe no resource api-conventions |
|
|
432
451
|
| Listar / ver não lidas | `lionchat_conversations_list` (`conversation_type: 'unread'`) ou `lionchat_conversations_meta` | NÃO use `lionchat_conversations_unread` — é AÇÃO DE ESCRITA (marca como não-lida) |
|
|
433
452
|
| Ver **uma empresa** (quem trabalha la, anotacoes, conversas) e ligar/tirar contatos | `lionchat_companies_show` + `lionchat_companies_contacts_list` / `_create` / `_destroy`, `lionchat_companies_notes_list`, `lionchat_companies_conversations_list` | Ligar pela ficha: `lionchat_contacts_update` com `company_id` (null tira). Cargo da pessoa = `additional_attributes.job_title`. Escolher a empresa troca o texto `company_name` pelo nome dela |
|
|
434
453
|
| Criar / preencher **campo personalizado da empresa** ("Segmento", "Data de fundacao") | `lionchat_custom_attributes_create` com `attribute_model: company_attribute` + `lionchat_companies_update` com `company.custom_attributes {chave: valor}` | So com o modulo Empresas ligado; tipo segredo recusado. Chave que nao existe como atributo de empresa = 422 e nada do pedido grava: crie a definicao ANTES. MESCLA; `null` limpa. Desde 2026-10-16 vira variavel `{{contact.company.custom_attribute.CHAVE}}`, condicao do fluxo (`attrSource: company`), condicao de automacao e filtro de contatos (`custom_attribute_type: company_attribute`) e a IA le — detalhe no resource data-model |
|
|
454
|
+
| **Importar muitas empresas** de uma vez (planilha, lista de clientes, cadastro de outro sistema) | `lionchat_companies_bulk_create` (ate 1000 por chamada; `check_only: true` CONFERE sem gravar) e depois `lionchat_companies_import_status` com o `import_id` | Mesma importacao do botao "Importar empresas" da tela. Mesma empresa = CNPJ; sem CNPJ, o site; sem os dois, o NOME — mais de uma empresa com aquele nome = a linha NAO entra (mande CNPJ ou site). Empresa existente e ATUALIZADA; campo vazio nunca apaga. Valor invalido fica em branco com aviso e o resto entra. Campos PLANOS (`address_city`, `social_instagram`), nunca objeto; `custom_attributes` so com chave que ja existe como atributo de EMPRESA. Exige modulo Empresas + administrador ou cargo "Exportar e importar contatos". So no conector remoto (Claude.ai/ChatGPT); no conector local (NPM) importe com `lionchat_companies_create` uma a uma |
|
|
435
455
|
| Organizar atributos em **categorias** (pastas que abrem e fecham: "Sobre a casa", "Financeiro") | `lionchat_custom_attribute_categories_create` (`name` + `attribute_model`) e depois `lionchat_custom_attribute_categories_assign` (`attribute_key` + `category_id`; `null` tira) | Categoria e OPCIONAL e de UMA aba so (`conversation_attribute`, `contact_attribute`, `company_attribute` ou `kanban_item_attribute` = Card). Criar categoria NAO aceita atributos junto. Card: `attribute_key` = NOME do campo exatamente como gravado. Excluir categoria nunca apaga atributo (voltam para "Sem categoria"). Ver resource data-model |
|
|
436
456
|
| Achar a conversa **de uma pessoa/empresa** (nome, telefone, e-mail, CPF/CNPJ, nº da conversa) | `lionchat_search_list` (`/search/conversations`) ou `lionchat_contacts_search` | RÁPIDO. **NÃO use `lionchat_conversations_search`**: apesar do nome, ele é o legado que procura dentro das mensagens e leva **15 a 22 s** (medido em produção 11/08). O sufixo `_list` aqui é histórico — `lionchat_search_list*` **são buscas**, não listagens; a regra "não baixe tudo com `*_list`" vale para `lionchat_<recurso>_list` |
|
|
437
457
|
| Achar **onde foi dito** algo (palavra dentro da conversa) | `lionchat_search_list_2` (`/search/messages`) | RÁPIDO: índice trigram próprio e teto de tempo em duas fases (2 s / 2 s desde 04/09 — antes a 2ª fase herdava 14 s e o pior caso da seção era 16 s). Estourou as duas, o payload volta com `message_search_interrupted: true` e a lista VAZIA — isso NÃO quer dizer que não existe, quer dizer que não deu tempo: tente de novo. É a substituta certa do `lionchat_conversations_search` |
|
|
@@ -441,11 +461,12 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
|
|
|
441
461
|
| Criar contato | `lionchat_contacts_create` base (path `/contacts`) | NÃO use as variantes `_1` … `_9` |
|
|
442
462
|
| Pausar a IA agora (botão de pânico) | `lionchat_captain_assistants_update` (`paused: true`, top-level) | — |
|
|
443
463
|
| Criar/editar **formulário público de captação** (página de captura própria) | `lionchat_lead_forms_create` / `_update` | Leia `lionchat://docs/formularios-publicos` ANTES — o desenho vai em `form_data` e só entra no ar depois do `publish` (que valida o desenho e pode voltar 422 com a lista de pendências). Caixa de WhatsApp vinculada (`inbox_id`) é obrigatória pra publicar. Escrita é só de administrador |
|
|
444
|
-
| **Mandar um contrato pra assinar** / ver quem assinou / reenviar / cancelar / criar ou editar o modelo escrito | `lionchat_signature_envelopes_create` / `_list` / `_show` / `_resend` / `_cancel`; `lionchat_signature_documents_list` / `_create` / `_update`; `lionchat_signature_envelopes_sign_as_sender` (o remetente assina pelo painel) | Leia `lionchat://docs/assinatura-eletronica` ANTES. Modelo `text` a API cria e edita (texto com `{{contact.*}}`); PDF/Word só pela tela. Campo do modelo sem valor na ficha bloqueia o envio (422 `variaveis_sem_valor` com a lista); `422 escolher_caixa` = repita com `inbox_id`. Cada contrato consome 1 vaga do limite mensal. Modelo Word: `422 fila_cheia` = muita gente convertendo agora, repita em instantes; `422 conversor_indisponivel` = o serviço de conversão está fora (não é o arquivo) — avise o operador. Remetente assina pelo painel com `_sign_as_sender` (PNG em base64). Importar Word, pré-visualizar e baixar PDF: só pela tela (o conector não
|
|
464
|
+
| **Mandar um contrato pra assinar** / ver quem assinou / reenviar / cancelar / criar ou editar o modelo escrito | `lionchat_signature_envelopes_create` / `_list` / `_show` / `_resend` / `_cancel`; `lionchat_signature_documents_list` / `_create` / `_update`; `lionchat_signature_envelopes_sign_as_sender` (o remetente assina pelo painel) | Leia `lionchat://docs/assinatura-eletronica` ANTES. Modelo `text` a API cria e edita (texto com `{{contact.*}}`); PDF/Word só pela tela. Campo do modelo sem valor na ficha bloqueia o envio (422 `variaveis_sem_valor` com a lista); `422 escolher_caixa` = repita com `inbox_id`. Cada contrato consome 1 vaga do limite mensal. Modelo Word: `422 fila_cheia` = muita gente convertendo agora, repita em instantes; `422 conversor_indisponivel` = o serviço de conversão está fora (não é o arquivo) — avise o operador. Remetente assina pelo painel com `_sign_as_sender` (PNG em base64; `signature_method` drawn/typed + `typed_name`). Dois jeitos de mandar (27/10): `collection: 'ready'` (completa o que falta com `contact_data`; veja antes `lionchat_signature_documents_fill_fields`) ou `collection: 'form'` (a pessoa preenche pelo link); `message` vai junto. Documentos pedidos (28/10, `roles_layout.required_proofs`): contrato fica `awaiting_approval` até a equipe aprovar — `lionchat_signature_envelopes_proofs` / `_approve_proofs` / `_reject_proofs` (as duas últimas mandam mensagem ao cliente: confirme antes; os arquivos só pela tela). Link do contrato para divulgar: `roles_layout.public_link`. Importar Word, pré-visualizar e baixar PDF: só pela tela (nesta área o conector não sobe o Word do modelo nem baixa o PDF) |
|
|
445
465
|
| **Testar um formulário** antes de publicar | `lionchat_lead_forms_test_run` | Roda o RASCUNHO no motor real e desfaz tudo no fim — zero rastro. Mande `answers: [{node_id, value}]` (até 60) pra reproduzir um caminho; a resposta traz o bloco atual + o log do percurso |
|
|
446
466
|
| Conferir se um site **aceita ser exibido dentro do formulário** (bloco Página externa) | `lionchat_lead_forms_check_embed` | Body `{url}`; devolve `{status: allowed\|blocked\|unknown, reason}`. Grave o veredito em `embed_allowed` do bloco. Admin-only |
|
|
447
467
|
| Ver **tudo que uma pessoa preencheu** (nosso formulário, anúncio do Meta, Webhook Universal, fluxo) | `lionchat_contacts_form_entries_list` / `_show` | Por CONTATO, sem paginação (teto 250 por origem, `meta.truncated`). O detalhe de Meta/webhook mostra SÓ os campos vinculados e gravados — nunca o payload cru. `show` exige `source` + `id` da mesma linha |
|
|
448
|
-
| Anexar arquivo a uma mensagem | `lionchat_upload_create`
|
|
468
|
+
| Anexar **arquivo** a uma mensagem — foto, vídeo, áudio, PDF, Word, Excel, CSV, ZIP (inclusive na conversa de um **grupo** do WhatsApp) | `lionchat_upload_create` com `external_url` (link PÚBLICO de download do arquivo) → o `blob_id` devolvido vai no array `attachments` de `lionchat_conversations_messages_create` | Pelo conector o arquivo SEMPRE vai por link (não há envio direto do computador). Link que abre uma PÁGINA (ex.: Drive `.../view`) é recusado — use o download direto (Drive: `https://drive.google.com/uc?export=download&id=<ID>`); confira antes com `lionchat_upload_validate`. Teto por tipo em `lionchat_upload_limits_show`. Até 23/10/2026 o link só aceitava foto e vídeo |
|
|
469
|
+
| Mandar um **relatório todo dia num grupo** do WhatsApp | Em texto: `lionchat_report_alerts_create` (resumo diário de um relatório personalizado, enviado pelo próprio servidor). Em PDF: gere o PDF, publique num link de download e siga a linha acima | O conector não agenda nada: "todo dia" em PDF depende de uma tarefa agendada do lado de quem usa o conector. Grupo só existe em caixa WhatsApp QR Code — ache a conversa do grupo com `lionchat_conversations_list`/busca. Receita em `lionchat://docs/best-practices` |
|
|
449
470
|
| Marcar conversa como **lida** | `lionchat_conversations_update_last_seen` | NÃO use `unread` (esse marca como NÃO-lida) |
|
|
450
471
|
| Criar/gerenciar **campanha** (disparo WhatsApp/SMS) | `lionchat_campaigns_*` (criar, estatísticas) | SEMPRE rode `campaigns_estimate_audience` antes de criar e mostre a contagem. Disparo em massa = confirmação obrigatória (seção 7b) |
|
|
451
472
|
| Criar **flow normal** (responde mensagens na caixa) | `lionchat_flows_create` | Ler design-guide antes (seção 11). Escolha `conversation_mode`: `individual` (1-a-1, default) ou `group` (grupo WhatsApp — só aqui existe o node `update_group`; sem LionTrack). Imutável após criar |
|
|
@@ -477,6 +498,7 @@ Antes de escolher a ferramenta, cheque se a intenção bate com a coluna da dire
|
|
|
477
498
|
| **Migrar conversas** de uma caixa WhatsApp pra outra (ex.: QR Code → Oficial) | `lionchat_inboxes_inbox_migration_list` (prévia) → `_execute` → acompanhar status | Admin-only e IRREVERSÍVEL: sempre mostre os números da prévia e confirme (seção 7a). Grupos não vão pro canal oficial — ficam na caixa de origem |
|
|
478
499
|
| Qualquer coisa de Ligação WP (Wavoip) | **INTEGRAÇÃO REMOVIDA em 12/08/2026** — não há tool nem tela | A Wavoip saiu do produto: a aba "Ligação WP" **não existe mais**. NUNCA orientar o usuário a "Configurações da caixa → Ligação WP". Para voz em caixa QR Code, o caminho hoje é o **LionCalls**. As ligações antigas seguem no histórico (`provider: "wavoip"`); as gravações delas ficavam no servidor da Wavoip e vão sumir — ao tentar ouvir, o painel mostra "Esta gravação não está mais disponível", e isso é esperado, não é defeito. |
|
|
479
500
|
| Restringir agendas que a IA oferece | `lionchat_captain_assistants_update` (`config.booking_event_type_ids: [Int]`) | binding de agenda por cenário NÃO é settable via API |
|
|
501
|
+
| **Tarefas atrasadas / o que falta fazer** (da equipe ou de uma pessoa) | `lionchat_tasks_task_list` (`assignee_id`, `q`, `priority`, `group` + `page`) | Só tarefas ABERTAS, em grupos `overdue`/`today`/`tomorrow`/`next_7_days`/`later` no dia da conta; 50 por grupo — conte por `totals`. Mesma regra de quem vê o quê do calendário. Ver `lionchat://docs/agenda-multiplas-unidades` §7.2 |
|
|
480
502
|
| **Programa de sessões** de um contato ("em que sessão ele está", ajustar total, encerrar/reabrir) | `lionchat_agenda_treatments_list` (por `contact_id`) / `_show` / `_update` | NÃO existe create: o programa nasce junto do agendamento (na TELA chama-se "programa"; na API segue `treatment`). Marcar TODAS de uma vez: `plano_sugerido` + `marcar_todas` de um tipo com `sessions_enabled` (`tasks_create` modo booking, `treatment: {...}` por pessoa; "marcar próxima" = `agenda_treatment_id` + `treatment_session_number`). Faltar CONSOME a sessão. Ver `lionchat://docs/agenda-multiplas-unidades` §7 |
|
|
481
503
|
| Configurar o Copiloto (modelo/temperatura/prompt base) | `lionchat_copilot_settings_update` | admin-only; copiloto tem motor próprio (padrão temp 0.3) |
|
|
482
504
|
| **Resetar/testar do zero a IA** numa conversa | `lionchat_conversations_captain_history_reset` (POST, sem body) | Cria pílula de marco na conversa; a partir dali TODA leitura autônoma da IA (respostas, resumo, follow-up) considera só mensagens pós-marco. Não apaga nada; o atendente segue vendo tudo. Enterprise-only |
|
|
@@ -276,8 +276,64 @@ e se está atrasada.
|
|
|
276
276
|
um. Compromisso de agenda que o usuário não enxerga aparece na sessão como `oculta: true`.
|
|
277
277
|
- O relatório de Agendamentos tem o bloco `treatments` (vale o período escolhido: programas, sessões do período e quem parou no meio — ver `reports-guide`).
|
|
278
278
|
|
|
279
|
+
## 7.1. Tarefa automática do card — de que agenda ela é (20/10/2026)
|
|
280
|
+
|
|
281
|
+
A regra "Criar tarefa" do funil (`create_task`) e o item "Criar tarefa" do bloco Ações do fluxo (`create_account_task`)
|
|
282
|
+
criam uma tarefa COMUM da Agenda, presa ao card (`kanban_item_id`). Para a agenda:
|
|
283
|
+
|
|
284
|
+
- `agenda_id` da regra **nulo = a agenda padrão da conta**. A tarefa na agenda padrão é gravada com `agenda_id`
|
|
285
|
+
nulo (a mesma regra do resto deste guia: nulo = principal; ao filtrar a principal, inclua os nulos).
|
|
286
|
+
- O **fuso do prazo é o da agenda da tarefa** (o fuso resolvido da agenda; sem agenda padrão, o da conta).
|
|
287
|
+
- **Dia útil** (`due.business_days: true`, só com `unit: 'days'`) = segunda a sexta **sem feriado de DIA INTEIRO que
|
|
288
|
+
vale para aquela agenda**. Feriado de meio período não conta (o dia ainda tem expediente). Feriado "para todas as
|
|
289
|
+
agendas" (`all_agendas`) vale para qualquer agenda; o regional vale só para as agendas marcadas nele. Cadastre
|
|
290
|
+
com `lionchat_agenda_holidays_*`. **Só o prazo da tarefa automática lê feriado**: os horários livres do Booking
|
|
291
|
+
continuam sem saber de feriado, e feriado nunca impede alguém de marcar.
|
|
292
|
+
- A Agenda unificada (`unified_agenda`) precisa estar ligada na conta; desligada, a regra do funil registra "não
|
|
293
|
+
criou" no histórico do card e o item do fluxo fica com erro visível no passo.
|
|
294
|
+
- `occupies_agenda: false` (padrão da regra) cria a tarefa como lembrete que **não bloqueia o horário**; `true`
|
|
295
|
+
bloqueia como um compromisso, do prazo até o fim da duração. `duration_minutes` (22/10/2026, 1 a 1440) escolhe a
|
|
296
|
+
duração; ausente = o tempo do tipo (Tarefa 15, Ligação 30, Reunião 60, tipo da conta 30).
|
|
297
|
+
|
|
279
298
|
---
|
|
280
299
|
|
|
300
|
+
## 7.2. Lista de tarefas abertas — aba "Tarefas" da Agenda (22/10/2026)
|
|
301
|
+
|
|
302
|
+
A Agenda ganhou a aba **Tarefas**, entre Calendário e Disparos: as tarefas abertas em lista, separadas por
|
|
303
|
+
período. A ferramenta é `lionchat_tasks_task_list` (`GET account_tasks/task_list`). Use-a para "o que está
|
|
304
|
+
atrasado?", "quantas tarefas a fulana tem em aberto?" e "o que falta fazer esta semana?".
|
|
305
|
+
|
|
306
|
+
- **Aberta** = pendente ou adiada E sem "Compareceu"/"Faltou". Concluídas e canceladas não entram.
|
|
307
|
+
- **Grupos**, no dia da conta: `overdue` (antes de hoje, da mais recente para a mais antiga), `today`,
|
|
308
|
+
`tomorrow`, `next_7_days` e `later`.
|
|
309
|
+
- **Quem vê o quê e filtros**: os MESMOS do calendário (`lionchat_tasks_list`): `assignee_id`, `task_type`,
|
|
310
|
+
`status` (0 pendente, 3 adiada), `priority`, `agenda_id`, `q`. Quem não gerencia a agenda da equipe vê só as
|
|
311
|
+
próprias, com ou sem `assignee_id`.
|
|
312
|
+
- **50 por grupo**. Para quantidade, leia `totals` (a contagem real), nunca o tamanho da lista. Para ir além das
|
|
313
|
+
50: `group=overdue&page=2` devolve só aquele grupo naquela página.
|
|
314
|
+
- **Busca `q`** (vale também no calendário): título, descrição, responsável e, com 3 letras ou mais, o CLIENTE
|
|
315
|
+
(nome, telefone, e-mail). Termo que casa mais de 1.000 clientes procura só nos campos da tarefa.
|
|
316
|
+
- O "Meu Dia" (`lionchat_tasks_list_1`) continua existindo como estava: sem filtros, sem páginas e sem `later`.
|
|
317
|
+
- Cargo com a Agenda escondida recebe 401 aqui.
|
|
318
|
+
- **Prioridade**: o filtro `priority` passou a funcionar em 22/10 (antes o servidor o ignorava, inclusive no
|
|
319
|
+
calendário).
|
|
320
|
+
|
|
321
|
+
### 7.3. Subaba "Concluídas" e datas de desfecho (23/10/2026)
|
|
322
|
+
|
|
323
|
+
- **`group=completed`** em `lionchat_tasks_task_list` = a subaba "Concluídas": tarefa concluída OU marcada
|
|
324
|
+
"Compareceu"/"Faltou". Cancelada fica de fora (só no calendário). Não vem junto dos cinco grupos: só quando
|
|
325
|
+
pedida. Ordem: a mais recentemente concluída primeiro; as concluídas antes de 23/10 (sem data de conclusão) vão
|
|
326
|
+
para o fim, pela data da tarefa. 50 por página, `totals.completed` = a contagem real.
|
|
327
|
+
- **Datas de desfecho** em toda tarefa (calendário, `show` e lista): `completed_at` (quando foi concluída),
|
|
328
|
+
`cancelled_at` (quando foi cancelada) e `attendance_marked_at` (quando marcaram Compareceu/Faltou). Gravadas pelo
|
|
329
|
+
servidor no momento da mudança, nunca aceitas do cliente. Reabrir, adiar ou limpar a presença APAGA a data
|
|
330
|
+
(é a data do desfecho atual, não um histórico). Nada antes de 23/10 foi preenchido: tarefa antiga vem com nulo.
|
|
331
|
+
- **`concluida_no_prazo`** (true/false/nulo): só no tipo Tarefa. `true` = concluída até o horário marcado
|
|
332
|
+
(`scheduled_at`; adiar vale a data nova). Nulo = não se aplica (outro tipo, não concluída, ou concluída antes de
|
|
333
|
+
existir a data). Consulta e reunião não têm prazo: só se dão como feitas depois que acontecem.
|
|
334
|
+
- **Busca `q`** (vale na lista e no calendário) passou a achar também pelo NOME DO CARD da tarefa e, com 3 letras
|
|
335
|
+
ou mais, por QUEM FEZ: quem criou, o dono antigo da tarefa e o "Agendado por".
|
|
336
|
+
|
|
281
337
|
## 8. Erros comuns
|
|
282
338
|
|
|
283
339
|
| Sintoma | Causa |
|
|
@@ -484,6 +484,33 @@ GET /search/conversations?q=pix&conversation_filters=[{"attribute_key":"status",
|
|
|
484
484
|
- `kanban_card` — por card vinculado (funil/etapa/prioridade/status)
|
|
485
485
|
Combináveis com E/OU e salváveis como segmento (custom_filters).
|
|
486
486
|
|
|
487
|
+
### Segmento de contatos é da CONTA (2026-10-22)
|
|
488
|
+
|
|
489
|
+
`custom_filters` com `filter_type: contact` (segmento) passou a ser da conta inteira: todos veem e usam (quem tem o
|
|
490
|
+
menu Contatos no cargo). Criar, editar e apagar segmento = administrador ou cargo com `contact_manage`,
|
|
491
|
+
`campaign_manage` ou `automation_manage` — sem isso, 401. Quem criou não ganha direito extra; a resposta traz
|
|
492
|
+
`user_id`/`user_name` ("criado por", pode vir nulo) e `can_manage`. Relatórios (`report`) continuam pessoais; pastas de
|
|
493
|
+
conversa (`conversation`) são pessoais até um administrador compartilhar (seção seguinte). `filter_type` é IGNORADO no update (não dá para trocar o tipo). Regra vazia ou
|
|
494
|
+
incompleta = 422. Segmento usado por campanha programada não pode ser apagado (422 citando a campanha). Segmento serve
|
|
495
|
+
de público de campanha (`{type: 'Segment', id}`) — ver a receita de campanha nas instruções.
|
|
496
|
+
|
|
497
|
+
### Pasta de conversa compartilhada (2026-10-27)
|
|
498
|
+
|
|
499
|
+
Pasta de conversa (`filter_type: conversation`) com `shared: true` aparece para TODA a conta, com o ícone de
|
|
500
|
+
compartilhar. Só administrador cria, edita, compartilha, descompartilha ou apaga (sem isso, 401); o atendente vê e
|
|
501
|
+
usa, mas não edita. Cada pessoa vê dentro dela SÓ as conversas que já pode ver — a pasta não abre acesso. Regras:
|
|
502
|
+
|
|
503
|
+
- Só mande `shared` para MUDAR o compartilhamento. `shared: false` numa compartilhada a transforma em pasta pessoal de
|
|
504
|
+
quem mandou (some para os outros). `shared` nulo = 422. Segmento e relatório não podem ser compartilhados (422).
|
|
505
|
+
- Compartilhada precisa de pelo menos uma condição (422 sem nenhuma).
|
|
506
|
+
- `query.sort_by` de uma compartilhada é a ordem PADRÃO de todos. A troca de ordem feita dentro da pasta pela tela vale
|
|
507
|
+
só para quem trocou e não é gravada.
|
|
508
|
+
- Em compartilhada criada por outra pessoa, `user_id`/`user_name` vêm nulos.
|
|
509
|
+
- "Quem está vendo": condição `{"attribute_key": "assignee_id", "filter_operator": "equal_to", "values": ["current_user"]}`
|
|
510
|
+
mostra a cada pessoa as conversas DELA. Vale também em `lionchat_conversations_filter` e nos `conversation_filters` das
|
|
511
|
+
buscas. Texto em `assignee_id` que não seja número nem `current_user` = 422. Automação NÃO aceita `current_user` (422).
|
|
512
|
+
- Apagar uma compartilhada tira a pasta de todos. Pessoa removida da conta não leva a compartilhada que criou.
|
|
513
|
+
|
|
487
514
|
### Exportação de contatos (2026-06-10)
|
|
488
515
|
|
|
489
516
|
`POST /contacts/export` (chega por e-mail) agora sai COMPLETO: cadastral achatado (16 colunas),
|
|
@@ -10,14 +10,14 @@ Feature `document_signing` (ligada por conta; 403 `feature_disabled` quando desl
|
|
|
10
10
|
| Camada | O que é | Ferramentas |
|
|
11
11
|
|---|---|---|
|
|
12
12
|
| **Modelo** (`signature_documents`) | O contrato padrão, escrito uma vez com `{{variáveis}}` da ficha. `kind`: `text` (escrito no editor — o único que a API cria), `file` (PDF pronto, igual pra todos) ou `word` (.docx que sai idêntico com os campos mapeados) — os dois últimos só pela tela (upload). | `lionchat_signature_documents_list/show/create/update/destroy/field_catalog` |
|
|
13
|
-
| **Contrato** (`signature_envelopes`) | Cada ENVIO a uma pessoa: PDF próprio com os dados dela, prazo, linha do tempo. | `lionchat_signature_envelopes_list/show/create/resend/cancel/limits` |
|
|
13
|
+
| **Contrato** (`signature_envelopes`) | Cada ENVIO a uma pessoa: PDF próprio com os dados dela, prazo, linha do tempo. | `lionchat_signature_envelopes_list/show/create/resend/cancel/limits`; documentos de quem assina: `_proofs` / `_approve_proofs` / `_reject_proofs` |
|
|
14
14
|
| **Participante** | Quem assina dentro de um contrato: `signer` (titular, pode ser mais de um), `witness` (testemunha, opcional), `sender` (o remetente, quando o modelo tem "eu também assino" — assina NO PAINEL, sem link). Cada um tem link e código próprios. | dentro do contrato (`participants[]`) |
|
|
15
15
|
|
|
16
16
|
## Estados do contrato (`status`) e os baldes de filtro
|
|
17
17
|
|
|
18
18
|
| Balde (`status` na listagem) | Estados | Significado |
|
|
19
19
|
|---|---|---|
|
|
20
|
-
| `aguardando` | `draft`, `sent` | criado sem entrega (draft)
|
|
20
|
+
| `aguardando` | `draft`, `sent`, `awaiting_data`, `awaiting_approval` | criado sem entrega (draft), enviado e ainda não aberto, "aguardando formulário" (a pessoa ainda não preencheu os dados — o contrato ainda não existe) ou (28/10) "aguardando aprovação dos documentos" (todos assinaram, falta a equipe aprovar os documentos pedidos) |
|
|
21
21
|
| `visualizado` | `viewed`, `partially_signed` | abriu o link / parte das pessoas já assinou |
|
|
22
22
|
| `assinado` | `signed_pending_seal`, `signed` | todos assinaram; selando / documento final pronto |
|
|
23
23
|
| `encerrado` | `refused`, `cancelled`, `expired` | recusado / cancelado pela equipe / prazo venceu |
|
|
@@ -27,10 +27,15 @@ Participante: `pending` → `viewed` → `verified` (confirmou o código) → `s
|
|
|
27
27
|
|
|
28
28
|
## Linha do tempo (`events[].kind`)
|
|
29
29
|
`created` · `delivered` (link entregue a uma pessoa) · `sent` · `opened` (cada abertura) · `code_requested` ·
|
|
30
|
-
`code_verified` · `signed` (com `ip`, `device`, `location`; `panel: true` = assinou no painel
|
|
30
|
+
`code_verified` · `signed` (com `ip`, `device`, `location`; `panel: true` = assinou no painel; desde 28/10
|
|
31
|
+
`signature_method` `drawn` = desenhada ou `typed` = o nome digitado numa letra de assinatura, com `typed_name`) · `all_signed` ·
|
|
31
32
|
`sealed` (documento final gerado, `sealed_sha256`) · `refused` · `cancelled` · `expired` · `delivery_failed`
|
|
32
33
|
(motivo em `delivery.failed[]`) · `reminded` · `resent` · `copy_sent` / `copy_failed` (a via assinada de cada pessoa,
|
|
33
|
-
estado em `delivery.copies[]`)
|
|
34
|
+
estado em `delivery.copies[]`) · `data_filled` (27/10: a pessoa preencheu o formulário e o contrato foi gerado com os
|
|
35
|
+
dados dela) · (28/10) `proof_sent` (a pessoa mandou um documento pedido: `kind`, `document_type`) ·
|
|
36
|
+
`awaiting_approval` (o contrato passou a esperar a equipe, ou a pessoa reenviou depois de reprovada) · `proofs_approved`
|
|
37
|
+
/ `proofs_rejected` (com `reason` e quem decidiu). `code_requested`/`code_verified` com `method: "whatsapp"` = a pessoa
|
|
38
|
+
confirmou mandando a frase pelo WhatsApp, não pelo código. Tudo append-only — é o relatório de evidências. `delivery.failed[]` também mostra a
|
|
34
39
|
recusa que a Meta manda depois (caixa oficial fora da janela de 24 h, motivo `window_expired`) e some sozinha se a
|
|
35
40
|
mensagem acabar entregue.
|
|
36
41
|
|
|
@@ -46,6 +51,66 @@ pelo mesmo canal do link: anexada numa mensagem na conversa dela (WhatsApp) ou n
|
|
|
46
51
|
pedindo que peça a via a quem enviou). Quem assinou no painel não recebe. Não há ferramenta para mandar de novo: oriente
|
|
47
52
|
baixar na tela do documento. O código de 6 dígitos de quem assina por e-mail chega no próprio e-mail.
|
|
48
53
|
|
|
54
|
+
## Os dois jeitos de mandar (27/10)
|
|
55
|
+
- **Contrato pronto** (padrão, `collection: 'ready'`): o contrato sai agora com a ficha. Se faltar dado, mande junto
|
|
56
|
+
`contact_data: { 'contact.marital_status': 'casado' }` — vai para a ficha e para o contrato (erro de um campo volta
|
|
57
|
+
`422 dados_invalidos` com `field_errors`). Para saber o que falta antes: `GET .../signature_documents/:id/fill_fields?contact_id=`.
|
|
58
|
+
- **Formulário para a pessoa preencher** (`collection: 'form'`, exige `contact_id`): o link vai SÓ para o titular, ele
|
|
59
|
+
preenche os dados dele (em branco) e o contrato nasce com o que ele digitou; o que ele digita atualiza a ficha. O
|
|
60
|
+
contrato fica `awaiting_data` até lá. O link de quem preenche é o `participants[].public_url` do titular na resposta.
|
|
61
|
+
- Nos dois: `message` (até 1.000 caracteres) vai junto do link.
|
|
62
|
+
- `fill_fields` devolve cada campo que se preenche pela ficha (`value` e `missing`) e `blocked` = o que falta e NÃO se
|
|
63
|
+
preenche por ali (telefone, dados da conta) — com algo em `blocked` o contrato pronto volta `variaveis_sem_valor`;
|
|
64
|
+
`blocked_in_form` é o mesmo para o jeito formulário (lá o nome também é perguntado).
|
|
65
|
+
- **Como o formulário pergunta** (`roles_layout.field_prompts` no modelo): `{"contact.cpf": {"label": "Qual é o seu
|
|
66
|
+
CPF?", "description": "Igual ao documento", "placeholder": "000.000.000-00"}}` — texto até 200 caracteres; sem
|
|
67
|
+
pergunta, o formulário mostra o nome do campo; pergunta de variável que o modelo não usa é descartada ao salvar.
|
|
68
|
+
- Modelo de **Word** com campo sem escolha no mapeamento: o envio volta `422 campos_sem_escolha` (`missing` = os
|
|
69
|
+
rótulos do Word) antes de gastar a vaga do mês — ajuste o mapeamento pela tela.
|
|
70
|
+
|
|
71
|
+
## Como a pessoa assina (28/10)
|
|
72
|
+
Na página do link (e no "Assinar agora" do painel) há duas abas: **Desenhar** (com o dedo ou o mouse) e **Digitar**
|
|
73
|
+
(o nome já vem escrito, pode ser corrigido, e aparece em três letras de assinatura). Os dois valem igual — quem prova
|
|
74
|
+
a autoria é o código de uso único. A folha de assinaturas e o relatório de evidências dizem "Assinatura desenhada à
|
|
75
|
+
mão" ou "Assinatura digitada: <nome>"; contratos assinados antes de 28/10 não dizem nada.
|
|
76
|
+
|
|
77
|
+
## Documentos de quem assina (28/10)
|
|
78
|
+
- No modelo, `roles_layout.required_proofs`: lista com `id_document` (documento com foto — a pessoa escolhe RG, CNH ou
|
|
79
|
+
CPF), `selfie_with_document` e `address_proof` (comprovante, foto ou PDF). `[]` = nenhum. Outro valor = 422. O
|
|
80
|
+
contrato guarda uma cópia ao nascer: mudar o modelo depois não muda contrato já enviado (`required_proofs` vem no
|
|
81
|
+
`list` e no `show` do contrato).
|
|
82
|
+
- A pessoa manda os documentos na página, antes de assinar. Com algum documento pedido, o contrato NÃO fecha quando
|
|
83
|
+
todos assinam: fica `awaiting_approval` e quem enviou recebe aviso no sininho.
|
|
84
|
+
- `lionchat_signature_envelopes_proofs` mostra, por pessoa, os documentos mandados (tipo, formato, quando — nunca o
|
|
85
|
+
arquivo) e a revisão (`pending`/`approved`/`rejected`, motivo, quem, quando) e o `last_proof_event_id`.
|
|
86
|
+
- **Os arquivos NÃO saem por ferramenta** (documento de identidade e selfie são dado sensível): para olhar, oriente a
|
|
87
|
+
tela — botão amarelo "Ver documentos" no contrato ou na aba Contratos da ficha. Aprovar sem alguém ter olhado o
|
|
88
|
+
arquivo na tela não faz sentido: pergunte ao usuário se ele já conferiu.
|
|
89
|
+
- `lionchat_signature_envelopes_approve_proofs` (`participant_id`, `seen_event_id` = o `last_proof_event_id` que a pessoa
|
|
90
|
+
viu): com todos aprovados o contrato fecha e cada um recebe a via. `lionchat_signature_envelopes_reject_proofs`
|
|
91
|
+
(`participant_id`, `reason` obrigatório, `seen_event_id`): a pessoa recebe no canal dela o pedido de documento novo com
|
|
92
|
+
o motivo. As duas MANDAM mensagem ao cliente — confirme com o usuário antes. 422: `fora_do_momento` (contrato não está
|
|
93
|
+
esperando aprovação), `sem_documentos`, `motivo_obrigatorio`, `documentos_mudaram` (a pessoa mandou outro depois do
|
|
94
|
+
que foi visto — leia `_proofs` de novo). Quem pode: administrador ou `signature_manage`.
|
|
95
|
+
|
|
96
|
+
## Confirmar pelo WhatsApp (28/10)
|
|
97
|
+
Quem recebe o link pelo WhatsApp pode confirmar que é ela mandando uma frase pronta (com um código `CT-XXXXXX`) para o
|
|
98
|
+
WhatsApp do contrato, em vez de digitar o código de 6 dígitos — resolve a caixa oficial com a janela de 24 h fechada.
|
|
99
|
+
Só vale do telefone da pessoa e na caixa do contrato. A mensagem aparece na conversa, mas a IA, os fluxos e as
|
|
100
|
+
automações não respondem a ela. Não há ferramenta: é só a página da pessoa.
|
|
101
|
+
|
|
102
|
+
## Link do contrato para divulgar (28/10)
|
|
103
|
+
- No modelo, `roles_layout.public_link: {enabled: true, inbox_id: <caixa de WhatsApp da conta>}`. A leitura devolve
|
|
104
|
+
`{enabled, inbox_id, path}` — o endereço é o domínio da instalação + `path` (`/contrato/<código>`). Mande
|
|
105
|
+
`regenerate: true` para trocar o código (o endereço antigo para de funcionar). Salvar sem `regenerate` mantém o
|
|
106
|
+
mesmo endereço; desligar e religar também.
|
|
107
|
+
- Só para modelo com UM assinante principal e sem `sender_signs` (422 com `public_link` no texto do erro), e só caixa de
|
|
108
|
+
WhatsApp (oficial ou QR Code).
|
|
109
|
+
- Quem abre o endereço manda a mensagem pronta pelo WhatsApp; o contrato dela nasce sozinho no jeito Formulário, na
|
|
110
|
+
conversa dela (`additional_attributes.link_padrao: true`). Se o modelo tem testemunha, o formulário pergunta nome e
|
|
111
|
+
WhatsApp de cada uma. A mesma pessoa pedindo de novo em 24 h recebe o mesmo contrato.
|
|
112
|
+
- **Limite do mês:** o contrato do link só conta depois que a pessoa confirma que é ela. Quem abre e some não gasta vaga.
|
|
113
|
+
|
|
49
114
|
## Como mandar um contrato (receita)
|
|
50
115
|
1. `lionchat_signature_documents_list` → escolha o modelo (ou crie um `text` com `signature_documents_create`;
|
|
51
116
|
variáveis em `signature_documents_field_catalog`).
|
|
@@ -73,19 +138,24 @@ baixar na tela do documento. O código de 6 dígitos de quem assina por e-mail c
|
|
|
73
138
|
- **Fila única de conversão do Word**: uma conversão por vez em toda a instalação (todas as contas); pela tela espera-se até 10 s, automação/macro/fluxo/formulário até 2 s.
|
|
74
139
|
Passou disso o envio/prévia volta `422 fila_cheia` — é só repetir em instantes (o modelo está bom).
|
|
75
140
|
- **Limite mensal** (`signature_envelopes_limits`): cada contrato criado consome 1 vaga; cancelar não devolve.
|
|
141
|
+
Exceção (28/10): o contrato que nasce do link do modelo só conta depois que a pessoa confirma. O teto por conta é
|
|
142
|
+
ajustado pelo operador da plataforma (fora do MCP).
|
|
76
143
|
- **PDFs** (original, assinado, evidências) e o **QR de conferência** só existem pela tela/download autenticado —
|
|
77
144
|
não há ferramenta que devolva os bytes. O `sealed_sha256` é o hash do documento final. Exceção desde 15/10: a via
|
|
78
145
|
assinada vira anexo da mensagem na conversa de quem assinou por WhatsApp, então aparece nas ferramentas de mensagens
|
|
79
146
|
da conversa (`conversations_messages_*`).
|
|
80
147
|
- **Só pela tela, de propósito** (existem na API, mas NÃO como ferramenta): importar um Word (`import_docx`),
|
|
81
|
-
pré-visualizar modelo ou rascunho (`preview`, `preview_draft`) e baixar PDF (`download`).
|
|
82
|
-
|
|
148
|
+
pré-visualizar modelo ou rascunho (`preview`, `preview_draft`) e baixar PDF (`download`). Nesta área o conector
|
|
149
|
+
não sobe o Word do modelo nem baixa o PDF — não prometa "vou gerar a prévia" ou "vou baixar o assinado"; oriente a tela.
|
|
83
150
|
- **Assinar no painel** ("eu também assino", 08/09): `lionchat_signature_envelopes_sign_as_sender` assina como o
|
|
84
151
|
REMETENTE (a pessoa do token) — nunca no lugar do cliente. Manda `signature_image` (PNG em base64 com prefixo
|
|
85
|
-
`data:image/png;base64,...`), opcional `location {latitude, longitude, accuracy}` (vai pra prova)
|
|
86
|
-
`remember_drawing
|
|
152
|
+
`data:image/png;base64,...`), opcional `location {latitude, longitude, accuracy}` (vai pra prova),
|
|
153
|
+
`remember_drawing` e (28/10) `signature_method` (`drawn` ou `typed`) + `typed_name` — a folha de assinaturas diz
|
|
154
|
+
"Assinatura desenhada à mão" ou "Assinatura digitada: <nome>"; sem o campo, não diz nada. 422: `nao_e_sua` (não é o remetente deste contrato), `ja_assinado`, `sem_desenho`. Era a
|
|
87
155
|
última que faltava? o contrato fecha e o PDF final é gerado em seguida. Os que esperam você: `status=falta_eu`.
|
|
88
|
-
- **Envio por outros caminhos**: ação `send_signature_document` no FlowBuilder
|
|
156
|
+
- **Envio por outros caminhos**: ação `send_signature_document` no FlowBuilder (28/10: `collection` `ready`/`form`,
|
|
157
|
+
`message` junto do link e `send_link: false` para só gerar; o contrato criado vira `{{contrato.*}}`, com
|
|
158
|
+
`{{contrato.link}}`, para os blocos seguintes), na Macro e na Automação;
|
|
89
159
|
bloco `generate_contract` no Formulário público (gera pelas respostas e manda o link). Gatilhos do Flow
|
|
90
160
|
`signature_*` (8 acontecimentos) trazem `{{contrato.*}}` — ver `lionchat_flows_schema_reference`.
|
|
91
161
|
|
|
@@ -842,17 +842,35 @@ automática. Ver a seção de variáveis de conta acima.
|
|
|
842
842
|
2. `reports_list_*` (agent_overview) com `since=7d_ago`, `until=now`
|
|
843
843
|
3. Sintetize: agente X com Y resoluções, tempo médio Z
|
|
844
844
|
|
|
845
|
-
### "Enviar mensagem com anexo (
|
|
846
|
-
1. `upload_create` (
|
|
845
|
+
### "Enviar mensagem com anexo (foto, vídeo, áudio, PDF, documento)"
|
|
846
|
+
1. `upload_create` com `external_url` (link público de DOWNLOAD do arquivo) → resposta traz `file_url` e `blob_id`.
|
|
847
|
+
Pelo conector o arquivo sempre vai POR LINK — não existe envio direto do computador.
|
|
847
848
|
2. `conversations_messages_create` passando o `blob_id` (signed_id) dentro do array `attachments`:
|
|
848
849
|
```json
|
|
849
850
|
{ "content": "Segue o documento", "message_type": "outgoing", "attachments": ["<blob_id>"] }
|
|
850
851
|
```
|
|
851
852
|
Cada item de `attachments` é o `blob_id` retornado pelo upload. Pode mandar vários.
|
|
852
853
|
3. O mesmo padrão vale pra anexar mídia num card do Kanban (use o `blob_id` no campo de anexo do card).
|
|
853
|
-
4. **
|
|
854
|
-
|
|
855
|
-
|
|
854
|
+
4. **Tipos aceitos por link (23/10/2026):** foto, vídeo, áudio e documentos (PDF, Word, Excel, CSV, ZIP...). Até
|
|
855
|
+
23/10 o link só aceitava foto e vídeo — se uma resposta antiga sua disse que PDF não dava, isso mudou. Áudio e
|
|
856
|
+
documento respeitam o teto por tipo (`lionchat_upload_limits_show`).
|
|
857
|
+
5. **Link que abre uma PÁGINA é recusado** ("O link abre uma página, não o arquivo"): é o caso do link de
|
|
858
|
+
visualização do Google Drive (`.../file/d/<ID>/view`). Use o download direto
|
|
859
|
+
`https://drive.google.com/uc?export=download&id=<ID>` — e o arquivo precisa estar com acesso "qualquer pessoa com o
|
|
860
|
+
link". Na dúvida, confira antes com `lionchat_upload_validate` (`valid=true` = vai funcionar).
|
|
861
|
+
6. Funciona igual na conversa de um **grupo** do WhatsApp (caixa QR Code): a mensagem com anexo chega no grupo.
|
|
862
|
+
|
|
863
|
+
### "Mandar um relatório em PDF todo dia num grupo do WhatsApp"
|
|
864
|
+
1. Leia os números com as ferramentas de relatório (`lionchat_reports_summary`, `lionchat_custom_dashboards_widget_data`,
|
|
865
|
+
`lionchat_conversations_meta`...) e monte o PDF do seu lado.
|
|
866
|
+
2. Publique o PDF num link de download público (ex.: pasta do Google Drive com acesso "qualquer pessoa com o link" —
|
|
867
|
+
o link de visualização não serve, veja o item 5 acima).
|
|
868
|
+
3. Ache a conversa do grupo: `lionchat_conversations_list` na caixa WhatsApp QR Code (grupo só existe nela) ou busca
|
|
869
|
+
pelo nome do grupo.
|
|
870
|
+
4. `upload_create` com o link → `conversations_messages_create` na conversa do grupo com o `blob_id` em `attachments`.
|
|
871
|
+
5. **O conector não agenda nada**: "todo dia" depende de uma tarefa agendada do lado de quem usa o conector. Se texto
|
|
872
|
+
basta, prefira `lionchat_report_alerts_create` — o próprio servidor manda o resumo diário de um relatório
|
|
873
|
+
personalizado no grupo, sem depender de ninguém (siga o fluxo seguro da descrição: criar desligado, prévia, ligar).
|
|
856
874
|
|
|
857
875
|
## Cuidados com tools de criação
|
|
858
876
|
|
|
@@ -298,7 +298,9 @@ Funnel
|
|
|
298
298
|
├── account_id (FK)
|
|
299
299
|
├── name
|
|
300
300
|
├── stages (jsonb: hash com slug_etapa => { name, color, position, description, checklist_templates })
|
|
301
|
-
├── settings (jsonb: { agents: [], goals: [], automations: [{trigger_type, action, action_config, enabled}] }
|
|
301
|
+
├── settings (jsonb: { agents: [], goals: [], automations: [{trigger_type, action, action_config, enabled}] };
|
|
302
|
+
│ `automations[].action` inclui `create_task` (20/10/2026). `settings.removed_stages` = etapas já excluídas,
|
|
303
|
+
│ mantida só pelo servidor — enviada pela API é ignorada)
|
|
302
304
|
├── global_custom_attributes (jsonb array — NENHUMA tela lê este campo do funil; os campos da aba do card
|
|
303
305
|
│ são os do KanbanConfig acima)
|
|
304
306
|
├── meta_events_config (jsonb: won/lost/stages → Meta Pixel/CAPI events; cada bloco: enabled, name,
|
|
@@ -346,6 +348,14 @@ KanbanItemSnooze (kanban_item_snoozes — 11/10/2026: ate quando o card esta ADI
|
|
|
346
348
|
├── snoozed_by_id (quem adiou; nulo = automacao, macro ou fluxo)
|
|
347
349
|
└── created_at / updated_at
|
|
348
350
|
|
|
351
|
+
KanbanStageRemoval (kanban_stage_removals — 20/10/2026: a exclusão de etapa EM ANDAMENTO; sem chave estrangeira)
|
|
352
|
+
├── account_id, funnel_id (funil de ORIGEM), stage_key (a etapa excluída)
|
|
353
|
+
├── to_funnel_id, to_stage (destino dos cards; nulos quando a etapa estava vazia e saiu pelo Salvar do funil)
|
|
354
|
+
├── user_id (quem pediu), status (running | done), moved_count
|
|
355
|
+
├── started_at / last_seen_at / finished_at
|
|
356
|
+
└── Um só `running` por etapa: é ele que dá o 409 STAGE_REMOVAL_IN_PROGRESS a quem tenta excluir a mesma etapa
|
|
357
|
+
ao mesmo tempo. A IA NÃO lê nem grava esta tabela; ela só chama `lionchat_funnels_remove_stage` e repete
|
|
358
|
+
|
|
349
359
|
Item do checklist (elemento do array jsonb `checklist`)
|
|
350
360
|
├── id (uuid string)
|
|
351
361
|
├── text
|
|
@@ -504,8 +514,21 @@ AccountTask (agenda interna)
|
|
|
504
514
|
├── meeting_url (string, sala de reunião call/meeting)
|
|
505
515
|
├── guest_emails (jsonb array, convidados extras — máx 20)
|
|
506
516
|
├── conversation_id / contact_id / linked_kanban_item_id (FK opcionais)
|
|
517
|
+
├── kanban_item_id (FK opcional → KanbanItem, 20/10/2026) — a tarefa PRESA ao card (aparece na aba Tarefas do card).
|
|
518
|
+
│ NÃO confunda com `linked_kanban_item_id` (card apenas relacionado, não dono da tarefa). A API devolve também
|
|
519
|
+
│ `kanban_item_title` (só leitura). Agendamento (Booking), sessão de programa e evento do Google NÃO podem ser
|
|
520
|
+
│ presos a card (422). Apagar o card apaga só a tarefa SIMPLES presa a ele (sem conversa, contato, agendamento, sessão de programa,
|
|
521
|
+
│ anexo, que não veio do Google e não é somente leitura); as outras se soltam e ficam. A tarefa automática de card
|
|
522
|
+
│ COM conversa grava a conversa e por isso sobrevive à exclusão do card (fica na conversa)
|
|
523
|
+
├── occupies_agenda (boolean, padrão true, 20/10/2026) — se a tarefa bloqueia o horário na Agenda; false = lembrete
|
|
524
|
+
│ que não bloqueia (o padrão da regra "Criar tarefa" é false)
|
|
525
|
+
├── automation_event_key (string, só leitura, 20/10/2026) — chave de "uma tarefa por acontecimento" da tarefa
|
|
526
|
+
│ automática (`card:<id>:rule:...` no funil, `flow:<sessão>:<bloco>:<item>:<passagem>` no fluxo); índice único por
|
|
527
|
+
│ conta. Tarefa criada por gente fica com ela nula
|
|
507
528
|
├── booked_by (polimórfico User/Contact/Captain::Assistant) / booked_by_name / booking_source
|
|
508
529
|
│ (painel|link|ia|sistema|fluxo) — QUEM agendou e por onde (14/09)
|
|
530
|
+
│ Tarefa AUTOMÁTICA (20/10): pela automação do funil, `booked_by` = o Funil e `booking_source` = `sistema`;
|
|
531
|
+
│ pelo bloco "Criar tarefa" de um fluxo, `booked_by` = o Fluxo e `booking_source` = `fluxo`
|
|
509
532
|
├── attendance (enum attended=0 / no_show=1, NULO = nada registrado — CARIMBO, não muda status)
|
|
510
533
|
│ / attendance_by (polimórfico) / attendance_source — quem marcou Compareceu/Faltou (14/09)
|
|
511
534
|
├── selo (SÓ LEITURA, calculado — 17/09): o rótulo ÚNICO que a tela mostra ao lado da tarefa, juntando
|
|
@@ -729,7 +752,7 @@ Pra auditar o que foi/será disparado, use `lionchat_eclinica_reminder_history_l
|
|
|
729
752
|
**Um aviso por CONSULTA (desde 2026-09-17).** A regra antiga "um lembrete por dia" saiu: paciente com duas
|
|
730
753
|
consultas no mesmo dia — ou duas pessoas no mesmo celular (mãe e filho) — recebe um lembrete para CADA
|
|
731
754
|
consulta, cada um com o seu nome, horário, profissional e link. Eles não saem juntos: sai o da consulta
|
|
732
|
-
mais cedo e, ~
|
|
755
|
+
mais cedo e, ~2 minutos depois (desde 26/10/2026 a rotina roda de minuto em minuto; o irmão espera a janela de 120 s), o da próxima. No histórico
|
|
733
756
|
(`lionchat_eclinica_reminder_history_list`) isso aparece assim: o que espera a vez fica `pending` com
|
|
734
757
|
`fire_at` no passado por alguns minutos (normal); `skip_reason = outra_consulta_no_mesmo_dia` só existe em
|
|
735
758
|
linhas ANTIGAS (até 17/09); e `fail_reason = fluxo_ainda_em_andamento_com_este_contato` significa que o
|
|
@@ -197,16 +197,29 @@ SEM mudar nenhum número antigo (Ganhos e Receita continuam do vendedor):
|
|
|
197
197
|
|---|---|---|
|
|
198
198
|
| `any` (PADRÃO) | criado no período **OU** fechado no período | É a régua histórica e a mais larga. **Omitir mantém exatamente os números de sempre.** É a certa pra RECEITA: com qualquer outra, venda fechada no período de um lead antigo some (medido 07/08: 17% dos ganhos da frota) |
|
|
199
199
|
| `created` | só quando o card nasceu | "quantos leads entraram" |
|
|
200
|
-
| `moved` |
|
|
200
|
+
| `moved` | quando entrou numa etapa (período até hoje: a etapa atual, mesma expressão do `stage_date_*` da seção 3; período que já terminou: qualquer entrada registrada no período, mesmo que o card tenha andado de novo depois) | "o que se mexeu no período" |
|
|
201
201
|
| `closed` | só ganhos/perdidos no período | **a pergunta de receita** — é a régua certa pra "quanto vendemos em julho" |
|
|
202
202
|
|
|
203
203
|
**Ganho/perda pela DATA DO FECHAMENTO (23/09/2026).** Com a régua `any` o relatório traz também cards que
|
|
204
204
|
nasceram no período mas fecharam DEPOIS dele. Por isso, para "quanto ganhamos/perdemos em julho", leia
|
|
205
|
-
`wonInPeriod`/`wonValueInPeriod` e `lostInPeriod`/`lostValueInPeriod` (este último é campo NOVO)
|
|
206
|
-
`statusDistribution`, que é a foto do status de HOJE (serve só para "negócios abertos agora"). Desde 23/09 os
|
|
205
|
+
`wonInPeriod`/`wonValueInPeriod` e `lostInPeriod`/`lostValueInPeriod` (este último é campo NOVO). Desde 23/09 os
|
|
207
206
|
motivos de ganho/perda, os perdidos recentes, a receita por semana e o ranking de vendedores também contam só
|
|
208
207
|
o que FECHOU no período — antes somavam por status de hoje e divergiam do quadro de Ganhos na mesma tela.
|
|
209
208
|
|
|
209
|
+
**Situação no FIM do período (19/10/2026).** Num período que JÁ TERMINOU (pelo dia da conta), tudo que é
|
|
210
|
+
SITUAÇÃO sai como o card estava no último instante do período: `statusDistribution` (aberto/ganho/perdido/adiado),
|
|
211
|
+
`itemsByStage`/`itemsByStageSlug` (o "Funil — ocupação por etapa"), `stageMetrics.valueByStage`, `forecast`,
|
|
212
|
+
`topDeals`, `staleCards`, `agingAnalysis` e `stageVelocityData` (só abertos) e os "parados" por etapa. Período que
|
|
213
|
+
vai até HOJE = o estado de agora (números de sempre). Por isso `statusDistribution.won` passa a bater com
|
|
214
|
+
`wonInPeriod`. Campo NOVO `periodEndState` `{past, unknownStageCount, removedStageCount}`: se `unknownStageCount > 0`,
|
|
215
|
+
avise que esses cards aparecem como "Etapa desconhecida" (sem histórico daquela época — o histórico de etapas
|
|
216
|
+
começou em julho de 2026); as chaves cruas `:etapa_desconhecida`/`:etapa_removida` NUNCA devem ser mostradas ao
|
|
217
|
+
cliente — traduza para "Etapa desconhecida"/"Etapa removida". Card ganho/perdido conta no funil onde a venda
|
|
218
|
+
aconteceu (também quando foi transferido depois). `taskMetrics.overdue`/`upcoming7days` vêm `null` num período
|
|
219
|
+
passado — NÃO diga "nenhuma atrasada", diga que esse número só existe para períodos que vão até hoje. Ciclo de vendas
|
|
220
|
+
e "Tempo médio" só com ganhos do período; checklist e follow-up só com o que fechou no período (follow-up = ações
|
|
221
|
+
feitas por pessoa até ganhar/perder, não dias).
|
|
222
|
+
|
|
210
223
|
O relatório de UMA etapa — tool `lionchat_funnels_stage_report` (`GET /funnels/:id/stage_report`, o
|
|
211
224
|
painel que abre dentro do quadro) — tem as MESMAS 4 opções de régua, mesmo parâmetro `date_basis` e as
|
|
212
225
|
MESMAS expressões da seção 3, mas o **padrão dele é `moved`**, não `any`. Não é inconsistência: ele
|
|
@@ -216,7 +229,9 @@ que as duas telas não batem, a resposta é: escolha a MESMA régua nas duas.
|
|
|
216
229
|
|
|
217
230
|
Ela devolve números calculados no SERVIDOR (total de cards da etapa, faixa de valores, ganhos/perdidos,
|
|
218
231
|
distribuição por prioridade, ranking de vendedores da etapa) — antes a tela só somava os cards já
|
|
219
|
-
carregados na coluna.
|
|
232
|
+
carregados na coluna. Num período que JÁ TERMINOU (19/10/2026) ela responde quantos cards ESTAVAM na etapa no fim do
|
|
233
|
+
período, e os botões `show_*`/`statuses`/`stages` valem pela situação naquele dia (um card aberto no fim do período e
|
|
234
|
+
ganho depois aparece com o padrão "só abertos").
|
|
220
235
|
|
|
221
236
|
**Parâmetros de `lionchat_funnels_stage_report`:**
|
|
222
237
|
|