# ClientFlow v4928.1.4.9 — Opportunity Reply Assistant ## Objetivo Reduzir o atrito entre ClientFlow e Chatwoot. O operador passa a gerar e enviar mensagens comerciais a partir da tarefa, usando modelos e anexos já ligados à oportunidade. O Chatwoot continua a ser o canal técnico de envio, mas o ClientFlow passa a ser o cockpit operacional. ## O que foi adicionado ### Modelos de mensagem Novo catálogo em `app/message_templates.py`: - `SEND_INFO_EQUIPMENT_LIST` - `SEND_PRICE_LIST` - `SEND_QUOTE` - `SEND_PROFORMA` - `SEND_INVOICE` - `REQUEST_FISCAL_DATA` - `REQUEST_PAYMENT_PROOF` - `CONFIRM_PAYMENT_RECEIVED` - `FOLLOW_UP_QUOTE` Os modelos são determinísticos e editáveis antes do envio. ### Serviço de resposta Novo serviço `app/reply_assistant_service.py`: - carrega tarefa, oportunidade e documentos associados; - escolhe modelo por ação; - gera rascunho editável; - valida prontidão antes de enviar; - bloqueia anexos que não pertencem à oportunidade; - envia mensagem pública no Chatwoot; - regista comunicação outbound; - regista evento na timeline; - pode concluir a tarefa após envio. ### UI na tarefa A página da tarefa ganhou o bloco **Resposta ao cliente**: - seletor de modelo; - seleção de anexos da oportunidade; - botão **Gerar rascunho**; - textarea editável; - botão **Enviar**; - botão **Enviar e concluir tarefa**. ### Chatwoot `app/chatwoot_client.py` ganhou: - `send_public_message()`; - `send_public_message_with_attachments()`. O envio continua protegido por: ```env CHATWOOT_WRITE_ENABLED=true CHATWOOT_BASE_URL=... CHATWOOT_ACCOUNT_ID=... CHATWOOT_API_TOKEN=... ``` ### Auditoria Foi adicionada a tabela `message_drafts` para guardar rascunhos gerados e estado do envio. Cada envio cria também um registo em `communications` com: - `direction = outbound`; - `source_system = chatwoot`; - `conversation_id`; - `task_id`; - `opportunity_id`; - `metadata.template_code`; - `metadata.attachments`; - `metadata.chatwoot_result`. ### Timeline Ao enviar uma mensagem, o ClientFlow cria um evento `reply_sent` na timeline da oportunidade. ## Regras de segurança - Um documento só pode ser anexado se pertence à mesma oportunidade da tarefa. - Envio de documentos fiscais exige cliente fiscal minimamente preenchido. - Documentos sem `external_id` não são anexados automaticamente. - Nesta versão, PDF automático está limitado a documentos Jasmin suportados pelo serviço existente: `quotation` e `invoice`. - O LLM não é usado para decidir preço, documento ou anexo. ## LLM Foi adicionada a opção: ```env CLIENTFLOW_REPLY_LLM_ENABLED=false ``` Nesta versão fica desativada. A arquitetura fica preparada para uma versão seguinte onde o LLM apenas adapte o texto, mantendo oportunidade/documentos como fonte de verdade. ## Endpoints novos ```http POST /tasks/{task_id}/reply-draft POST /tasks/{task_id}/send-reply ``` ## Rollback A alteração é aditiva. Para rollback funcional: 1. manter `CHATWOOT_WRITE_ENABLED=false` para bloquear envio; 2. remover/ignorar o bloco UI de resposta; 3. a tabela `message_drafts` pode permanecer sem afetar o fluxo antigo.