📄 COMERCIALRS-BUG-FIXES-2026-07-20.md

← Vault

ComercialRS — Bug Fixes (2026-07-20)

Resumo da Sessão

Correção de bugs no webhook WhatsApp (meta_webhook_vps_service.py) e schema do banco Supabase Cloud.

Data: 2026-07-20

VPS: 31.97.243.106


Bugs Encontrados e Corrigidos

Bug #1: pending_selections inexistente no banco 🔴 CRÍTICO

Sintoma: Corretores com 2+ tarefas abertas não conseguiam concluí-las via WhatsApp. Sistema enviava menu mas falha silenciosa.

Causa raiz: O fluxo multi-step (quando há 2+ tarefas → menu numerado → escolha) usava:

1. Duas tabelas/funções que NÃO existiam no banco: pending_selections, get_pending_selection, set_pending_selection, clear_pending_selection

2. Um dicionário Python em memória _pending_selections = {} (thread-local, TTL 120s)

Impacto: Reinício do container = pendências perdidas. Corretores ficavam sem confirmação.

Bug #2: Keywords de texto livre incompletas 🟡 ALTO

Sintoma: Mensagens como "nk", "pronto", "encerrada", "feita" não eram reconhecidas.

Causa: Duplicados no dicionário (comecou 2x, concluida 2x) e variants comuns faltando.

Bug #3: Webhook quebrado 🔴 CRÍTICO

Sintoma: Serviço em crash loop (159.221 restarts!).

Causa raiz: O diretório /var/www/comercialrs/data/ não existia — o serviço apontava para um path que não existia no disco. Todas as tentativas de restart falhavam.


Correções Aplicadas

1. Schema criado no Supabase Cloud

`sql

-- Tabela

CREATE TABLE IF NOT EXISTS public.pending_selections (

id uuid DEFAULT gen_random_uuid() PRIMARY KEY,

phone text NOT NULL,

selection_key text NOT NULL,

task_id uuid,

context jsonb DEFAULT '{}',

created_at timestamptz DEFAULT now(),

expires_at timestamptz DEFAULT (now() + interval '15 minutes')

);

-- Índice

CREATE INDEX IF NOT EXISTS idx_pending_selections_phone

ON public.pending_selections(phone);

-- Função: set_pending_selection

CREATE OR REPLACE FUNCTION public.set_pending_selection(

p_phone text, p_selection_key text, p_task_id uuid, p_context jsonb default '{}'

)

RETURNS void LANGUAGE plpgsql SECURITY DEFINER AS '

BEGIN

DELETE FROM public.pending_selections WHERE phone = p_phone;

INSERT INTO public.pending_selections (phone, selection_key, task_id, context)

VALUES (p_phone, p_selection_key, p_task_id, p_context);

END;

';

-- Função: get_pending_selection

CREATE OR REPLACE FUNCTION public.get_pending_selection(p_phone text)

RETURNS TABLE(id uuid, phone text, selection_key text, task_id uuid, context jsonb, created_at timestamptz, expires_at timestamptz)

LANGUAGE plpgsql SECURITY DEFINER AS '

BEGIN

RETURN QUERY SELECT ps.id, ps.phone, ps.selection_key, ps.task_id, ps.context, ps.created_at, ps.expires_at

FROM public.pending_selections ps

WHERE ps.phone = p_phone AND ps.expires_at > now();

END;

';

-- Função: clear_pending_selection

CREATE OR REPLACE FUNCTION public.clear_pending_selection(p_phone text)

RETURNS void LANGUAGE plpgsql SECURITY DEFINER AS '

BEGIN

DELETE FROM public.pending_selections WHERE phone = p_phone;

END;

';

`

2. Webhook atualizado (meta_webhook_vps_service.py)

Arquivo em produção: /var/www/comercialrs/data/meta_webhook_vps_service.py

Fonte editada: /tmp/comercialrs_build/data/meta_webhook_vps_service.py

Mudanças: