=== Chat App Brasil ===
Contributors: lupeedesign
Tags: whatsapp, woocommerce, whatsapp notifications, abandoned cart, whatsapp button
Requires at least: 6.0
Tested up to: 6.9
Requires PHP: 7.4
Stable tag: 3.5.1
WC requires at least: 7.0
WC tested up to: 9.8
License: GPLv2 or later

Envie mensagens WhatsApp automáticas para clientes WooCommerce. Notificações, carrinho abandonado, PIX, rastreamento e botão WhatsApp.

== Descrição ==

**Chat App Brasil** é o plugin WhatsApp para WooCommerce mais completo do Brasil. Conecte sua loja ao WhatsApp e envie mensagens automáticas para seus clientes em cada etapa da jornada de compra — do novo pedido até o pós-venda.

Integração oficial com a plataforma **ChatAppBrasil** — sem necessidade de WhatsApp Business API direta.

= Por que usar o Chat App Brasil? =

* ✅ **WhatsApp + WooCommerce nativos** — sem configurações complexas
* ✅ **Botão flutuante WhatsApp** customizável com rastreamento de cliques
* ✅ **Recuperação de carrinho abandonado** via WhatsApp (CartBounty)
* ✅ **PIX via WhatsApp** — QR code automático (Mercado Pago e Asaas)
* ✅ **Rastreamento de pedidos** — Correios e Melhor Envio
* ✅ **Assinaturas WooCommerce** — notificações de renovação e cancelamento
* ✅ **Back In Stock** — avisa cliente quando produto volta ao estoque
* ✅ **HPOS compatível** — WooCommerce 7.1+

= Funcionalidades Principais =

**Notificações Automáticas de Pedido**
Cada status do WooCommerce dispara mensagem personalizada ao cliente e
opcionalmente ao administrador. Toggle individual por notificação — a mensagem
permanece salva mesmo quando desativada. Status suportados:
* Novo pedido, pendente, em espera, processando, concluído, cancelado,
  reembolsado, falhado, nota de pedido, status personalizados

**Aba Pagamentos — Mercado Pago PIX**
Envio automático do QR code e código copia e cola. Dois modos:
* Imediato: envia em tempo real
* Lembrete: envia somente se não pago após X minutos (cancela se pagar antes)
* Notificação de PIX expirado: avisa o cliente quando o tempo expira

**Aba Pagamentos — Asaas PIX**
Integração completa com o gateway Asaas para pagamentos via PIX.
Mesmas opções de imediato/lembrete do Mercado Pago. QR code + código copia e cola.

**Aba Pagamentos — Asaas Boleto**
Envio automático do link do boleto quando um pedido Asaas Boleto é criado.
Use %boleto_url% na mensagem para incluir o link.

**Aba Pagamentos — PIX Expirado**
Notificação unificada para Mercado Pago e Asaas quando o PIX expira sem
pagamento. Configura quantos minutos após a geração do PIX disparar o aviso.

**Aba Rastreamento — Correios e Melhor Envio**
Notificação automática quando o pedido é concluído e há código de rastreio.
Detecta automaticamente Correios (WooCommerce Correios) e Melhor Envio.
Tags: %tracking_code%, %tracking_url%

**Recuperação de Carrinho Abandonado**
Até 3 follow-ups via CartBounty Free ou Pro, com intervalo configurável.
Toggle independente por follow-up.

**Pós-venda (Aftersales)**
Mensagem X horas após conclusão do pedido.

**Back In Stock**
Notificação via WhatsApp quando produto volta ao estoque.

**Easy Digital Downloads (EDD)**
Notificações de novo pedido e pedido completo para produtos digitais.

**Contact Form 7 / Caldera Forms**
Mensagens disparadas via formulários com substituição de tags e quebras de linha.

**Botão Flutuante WhatsApp**
SVG configurável: posição, tamanho (40-200px), distância da borda (0-300px),
efeito pulsante, tooltip, mensagem pré-preenchida, ocultar por dispositivo.

**Rastreamento de Cliques**
Cada clique no botão é registrado via AJAX (visitantes e logados).

**Disparo em Massa**
Posts/produtos para lista de números, mensagens personalizadas, importação de clientes.

**Logs de Mensagens**
Estatísticas (enviadas, erros, dedup), linhas expansíveis com link ao pedido,
botão de reenvio, abas por tipo, paginação, link direto ao pedido WooCommerce.

**Notas Privadas nos Pedidos**
Nota automática a cada envio WhatsApp com status, número e link de reenvio.

**Proteção e Segurança**
Deduplicação configurável, rate limiting, filtro de horário, monitoramento de
erros (pausa automática após 1h de falhas), erros técnicos em linguagem amigável.

**Compatibilidade HPOS**
Totalmente compatível com HPOS (WooCommerce 7.1+).

== Instalação ==

1. Plugins > Adicionar Novo > Enviar Plugin > selecione o .zip
2. Ative o plugin
3. Chat App Brasil > Configuração > insira seu Access Token
4. Configure mensagens em Notificações, Pagamentos, Rastreamento e demais abas

== Tags Disponíveis ==

= Pedido =
%id%, %order_key%, %order_date%, %order_time%, %order_link%, %order_status%,
%product%, %product_name%, %order_subtotal%, %order_shipping%, %order_total%,
%order_discount%, %currency%, %cust_note%, %shipping_method%,
%payment_method_title%, %payment_url%

= Cliente =
%billing_first_name%, %billing_last_name%, %billing_email%, %billing_phone%,
%billing_city%, %billing_state%, %billing_address_1%

= Entrega =
%shipping_first_name%, %shipping_address_1%, %shipping_city%, %shipping_state%

= Rastreamento =
%tracking_code% — código de rastreio (Correios ou Melhor Envio)
%tracking_url%  — link de rastreamento

= Pagamentos =
%pix_code%   — código copia e cola PIX (Mercado Pago ou Asaas)
%boleto_url% — link do boleto (Asaas)
%payment_url% — link de pagamento pendente do WooCommerce

= Outros =
%shop_name%, %note%
Spintax: {Olá|Oi|Bom dia} — variação aleatória por envio

== FAQ ==

= Como enviar mensagem WhatsApp automática no WooCommerce? =
Configure seu token em Chat App Brasil > Configuração e defina as mensagens em Chat App Brasil > Notificações. O WhatsApp é enviado automaticamente em cada mudança de status do pedido.

= É possível enviar o QR code do PIX pelo WhatsApp? =
Sim. O plugin integra com Mercado Pago PIX e Asaas PIX. O QR code é enviado automaticamente como imagem junto com o código copia e cola quando o pedido é criado.

= Funciona com WhatsApp Business? =
Sim. A plataforma ChatAppBrasil usa a API do WhatsApp Business. Você precisa de uma conta ativa em chatappbrasil.com.

= Como recuperar carrinho abandonado pelo WhatsApp? =
Instale o CartBounty Free ou Pro, configure os follow-ups na aba Carrinho Abandonado e o plugin envia mensagens automáticas via WhatsApp para clientes que abandonaram o carrinho.

= Posso enviar código de rastreamento pelo WhatsApp? =
Sim. Instale WooCommerce Correios ou Melhor Envio. Quando o pedido for concluído com código de rastreio, o plugin envia automaticamente na aba Rastreamento.

= O botão não aparece =
Preencha o número em Chat App Brasil > Botão.

= Mensagens não enviadas =
Confirme o Access Token, verifique os Logs e certifique que a mensagem não está vazia.
Veja se há alerta de "Envios pausados" no painel.

= PIX Asaas não envia =
Verifique se o plugin WooCommerce Asaas está ativo e se o método de pagamento
do pedido é "asaas-pix". O meta __ASAAS_ORDER precisa estar salvo.

= Tracking não envia =
O código de rastreio precisa estar disponível no momento em que o pedido é
marcado como Concluído. Verifique se WooCommerce Correios ou Melhor Envio
está ativo e com código cadastrado no pedido.

= Vi "Envios pausados" =
WhatsApp desconectado. Acesse dashboard.chatappbrasil.com, reconecte e clique
em "Reativar envios" no alerta do painel.

== Changelog ==

= 3.5.1 =
* CORREÇÃO: notificação de rastreio que falhava no envio dava o pedido por avisado assim mesmo. O pedido era marcado como "rastreio enviado" sem olhar o resultado, e essa marca é justamente o que faz a nova tentativa e o robô do Melhor Envio pularem o pedido — um erro da plataforma e o cliente ficava sem o código para sempre. Agora só é marcado o que saiu de verdade
* NOVO: rastreio que não saiu é tentado de novo sozinho — 5 minutos depois, 15, 1 hora e 12 horas. Esgotadas as tentativas, o plugin desiste (em vez de insistir de hora em hora por 30 dias) e escreve uma nota no pedido dizendo o último erro e como reenviar
* CORREÇÃO: quando o envio passava pela fila anti-ban, a falha acontecia depois que o plugin já tinha dado o rastreio por enviado, e ninguém mais olhava para aquele pedido. A fila agora avisa, a marca é desfeita e o rastreio volta para a fila de tentativas
* CORREÇÃO: salvar no pedido o código de rastreio que já estava gravado não enviava nada e não dizia por quê — quem gera a etiqueta no plugin do Melhor Envio abre o pedido com o campo já preenchido, clicava em salvar, lia "Código salvo" e o cliente não recebia nada. Agora o botão avisa o cliente sempre que o pedido ainda não foi avisado, e a tela diz o que aconteceu de verdade: enviado, na fila, já avisado antes, ou o erro do envio
* NOVO: você escolhe em quais status do pedido o rastreio é procurado e enviado (aba Rastreamento → "Quando procurar o rastreio"). Antes era "Concluído" e ponto: loja que despacha em "Processando" ou num status próprio nunca via o aviso sair sozinho. Nada marcado continua valendo como Concluído, e o robô do Melhor Envio passa a varrer exatamente os mesmos status
* CORREÇÃO: erro interno da plataforma de envio (ERR_INTERNAL_ERROR) em mensagem com link agora é repetido uma vez sem a prévia do link. A prévia é montada pelo servidor de envio, que precisa abrir a URL da mensagem: link que ele não consegue abrir derrubava a mensagem inteira. Sem a prévia perde-se o cartãozinho do link, não o aviso
* MELHORIA: ERR_INTERNAL_ERROR aparecia cru no log e na nota do pedido. Agora vira texto em português, como os outros erros

= 3.5.0 =
* CORREÇÃO: mensagem recusada com "mensagem idêntica já enviada hoje" sem ter sido enviada. A marca de duplicata era gravada ANTES do envio e ficava de pé mesmo quando a API recusava — o cliente ficava sem o aviso e toda retentativa levava a mesma recusa. Agora a marca só vale para o que saiu de verdade: envio que falha apaga a própria marca
* CORREÇÃO: o botão Reenviar (na nota do pedido, na lista de pedidos e no log) e o Teste de envio eram barrados como duplicata. São ações intencionais — mandar de novo o mesmo texto para o mesmo número é exatamente o que se pediu — e agora saem sempre
* CORREÇÃO: pedidos diferentes com o mesmo texto disputavam a mesma marca. A chave passou a ser do evento (pedido + número + mensagem), então dois pedidos do mesmo cliente, ou dois clientes, nunca se bloqueiam
* CORREÇÃO: número e texto eram grudados sem separador para formar a chave, e dois clientes cujo número e mensagem se encaixavam viravam a mesma chave — o segundo nunca recebia nada
* CORREÇÃO: janela de bloqueio salva em branco ou em zero valia PARA SEMPRE (o prazo 0 nunca expira). Em branco vale 24h, e o teto é uma semana
* MELHORIA: a recusa por duplicata agora diz o que houve com a gêmea — "já entregue há X (origem: Y)" ou "está na fila, aguardando o disparo" — em vez de anunciar um envio que talvez não tenha acontecido
* MELHORIA: a nota no pedido de uma duplicata deixa de dizer "falhou ✗" para uma mensagem que foi entregue, e a linha do log passa a levar o pedido e a origem, para achar a gêmea
* NOVO: Consulta de pedidos pela IA — a loja passa a responder "cadê meu pedido?" para a inteligência artificial do WhatsApp, com status, itens, rastreio e link de pagamento. Ligue em Chat App Brasil → Configuração, no cartão "Consulta de pedidos pela IA": um botão gera o token e a tela mostra o endereço e o token prontos para copiar
* A consulta nasce DESLIGADA. Sem token gerado, o endereço recusa qualquer pergunta — atualizar o plugin não abre nada sozinho
* SEGURANÇA: a IA só enxerga pedidos do telefone de quem está conversando. Quem comprou usando outro telefone consegue pelo par número do pedido + CPF/CNPJ, e nunca só pelo documento
* SEGURANÇA: "pedido não existe" e "documento não confere" respondem exatamente a mesma coisa, para ninguém descobrir a existência de um pedido chutando números
* SEGURANÇA: a resposta nunca inclui CPF, e-mail ou endereço. Saem só status, data, total, itens, rastreio e link de pagamento — e o link de pagamento apenas em pedido que ainda aguarda pagamento
* O telefone é comparado por DDD + os 8 dígitos finais, então o nono dígito e a máscara do checkout não separam o cliente dos próprios pedidos
* O rastreio da consulta sai do mesmo resolvedor das mensagens (Correios → Melhor Envio → API do Melhor Envio), para a consulta e o WhatsApp nunca discordarem sobre o mesmo pedido
* Botões para gerar outro token e para desligar a consulta a qualquer momento
* MELHORIA: Um clique liga a consulta — o plugin registra esta loja no XMetric Whats sozinho, usando a chave de envio que ele já tem, e confirma que o gateway conseguiu consultar. Nada para copiar entre painéis
* O cartão "Consulta de pedidos pela IA" só aparece para quem usa o XMetric Whats como servidor de envio. Com uma exceção: se a consulta já estiver ligada, o cartão continua visível mesmo com o servidor de volta no ChatApp Brasil, porque esconder uma chave ligada deixaria a loja sem como desligá-la
* Desligar a consulta avisa o XMetric Whats, para ele parar de perguntar em vez de acumular erro numa tela que o lojista já desligou

= 3.4.0 =
* NOVO: Opção de servidor de envio — além do ChatApp Brasil (padrão), o plugin passa a poder enviar pelo XMetric Whats. A opção é discreta, fica no rodapé do cartão de Access Token em Configuração, e só aparece como uma linha de texto até ser ligada
* O ChatApp Brasil continua sendo o padrão: quem nunca abrir essa opção não tem nenhuma mudança de comportamento, e quem atualizar do 3.3.1 continua enviando exatamente como antes
* NOVO: Ao ligar o XMetric Whats, o cartão troca os campos — endereço do servidor (já preenchido com https://whats.xmetric.com.br) e o rótulo do token vira "Chave do cliente". A opção "Salvar mensagens no ticket" some, porque não se aplica a esse servidor
* MELHORIA: Testar Conexão passou a responder duas coisas no XMetric Whats — se a chave vale e se existe número pareado. Antes, um token bom em loja sem número conectado era anunciado como pronto para enviar
* MELHORIA: Trocar o servidor ou o endereço invalida a validação anterior do token, como já acontecia ao trocar o token — chave aprovada por uma plataforma não diz nada sobre a outra
* MELHORIA: O endereço do XMetric aceita ser colado de qualquer jeito (sem https, com barra no fim, ou o painel inteiro copiado do navegador) e é normalizado antes de gravar
* INTERNO: As três chamadas que montavam o endereço da API por conta própria (envio de texto, envio de mídia e teste de token) passaram a usar um resolvedor único. O filtro wlp_api_url continua valendo, e vale por último

= 3.3.1 =
* NOVO: Integração direta com a API do Melhor Envio — configure o token de acesso na aba Rastreamento e o plugin busca o código de rastreio automaticamente, sem depender do plugin ME para salvar os dados
* NOVO: Card de rastreamento no painel do pedido — adicione ou edite o código de rastreio manualmente e o WhatsApp é disparado na hora para o cliente
* NOVO: Poller automático (a cada hora) que verifica novos códigos no Melhor Envio para pedidos concluídos ainda sem rastreio enviado
* NOVO: Retry automático via Action Scheduler se o código de rastreio ainda não estiver disponível quando o pedido for concluído
* CORRECAO: Mensagem de PIX expirado duplicada — idempotência via meta _wlp_pix_expired_sent impede que AS e hook de cancelamento enviem duas mensagens consecutivas para o mesmo pedido (MP e Asaas)
* CORRECAO: Verificação do método de pagamento em wlp_mp_pix_expired corrigida para strpos, compatível com variações do gateway Mercado Pago PIX
* CORRECAO: Tag %rt_total% no carrinho abandonado agora funciona como alias de %cart_total%

= 3.3.0 =
* CORRECAO: Compatibilidade com a nova plataforma (Whaticket) — o sucesso do envio agora é determinado pelo código HTTP da resposta, e não mais pelo campo "status" da API antiga. Mensagens entregues não aparecem mais como "Desconhecido"/erro no log e nas notas do pedido, e o aviso falso de "Envios pausados" deixa de ser disparado
* CORRECAO: Endpoint de envio atualizado para o endereço documentado da plataforma (dashboard.chatappbrasil.com/backend/api/messages/send), personalizável via filtro wlp_api_url
* NOVO: Sistema anti-banimento — espaçamento mínimo configurável entre envios (padrão 20s) + variação aleatória (padrão até 15s). Envios em rajada entram em uma fila e saem um por vez, imitando o ritmo humano; a fila é processada em toda requisição e por cron de 1 minuto
* NOVO: Mensagens que estouram o limite por minuto agora entram na fila anti-ban em vez de serem descartadas
* NOVO: Opção "Salvar mensagens no ticket do painel" (saveOnTicket) — registra os envios da loja na conversa do contato na plataforma; linkPreview habilitado nos envios de texto
* CORRECAO: Teste de token compatível com o formato de erro da plataforma nova (HTTP 401/403 e códigos ERR_*)
* CORRECAO: A frequência do carrinho abandonado escolhida na tela de configuração agora é persistida ao salvar (antes revertia para 5 min)
* CORRECAO: Os toggles "Bloquear mensagens idênticas" e "Janela de horário" agora podem ser desativados (o estado desligado não era salvo)
* MELHORIA: Novos códigos de erro da plataforma traduzidos no log (ERR_SENDING_WAPP_MSG, ERR_SESSION_EXPIRED, ERR_WAPP_INVALID_CONTACT)
* SEGURANÇA: Diretório de logs agora usa sufixo secreto no nome (uploads/woosend-logs-xxxx) — em servidores Nginx o .htaccess não é lido e os logs (com telefones e mensagens de clientes) ficavam acessíveis por URL previsível; migração do diretório antigo é automática
* CORRECAO: Janela de horário de envio agora suporta período que atravessa a meia-noite (ex: 22h–8h) — antes essa configuração bloqueava todos os envios
* CORRECAO: Números locais do DDD 55 (região de Santa Maria-RS) agora recebem o DDI 55 corretamente — antes eram enviados sem DDI e não chegavam
* CORRECAO: Carrinho abandonado (CartBounty Pro): follow-ups 2 e 3 nunca disparavam — a janela de elegibilidade de 24h era menor que os prazos deles (48h/72h); janela agora cobre o horizonte completo dos follow-ups
* CORRECAO: Carrinho abandonado (CartBounty Free): adicionada janela de elegibilidade — antes, ativar o plugin com carrinhos históricos podia disparar mensagens para carrinhos de meses atrás
* CORRECAO: Carrinho abandonado (Free): carrinho não fica mais travado permanentemente após 3 tentativas bloqueadas por horário/erro temporário
* CORRECAO: Boleto Asaas e mensagem de novo pedido não são mais reenviados quando o cliente recarrega a página de obrigado (guard por meta no pedido)
* CORRECAO: Back In Stock: assinante notificado via hook direto agora é marcado como processado — o cron não reenvia mais a mesma notificação depois de 5 minutos
* CORRECAO: Pós-venda: cálculo do tempo desde a conclusão não mistura mais fusos (desvio de ±3h) e a janela de horário de envio passou a valer para o pós-venda
* CORRECAO: Envio de mídia não exige mais a extensão cURL (usa a API HTTP do WordPress)
* MELHORIA: Pós-venda, nota do pedido e lembrete PIX agora registram nota no pedido e aparecem categorizados corretamente no log
* MELHORIA: Rastreamento de cliques do botão flutuante reescrito em JavaScript puro com sendBeacon — funciona em temas sem jQuery e não atrasa a navegação do visitante
* LIMPEZA: Removido o painel de ações de instância (status/reconectar/reiniciar/resetar/webhook/QR) — os endpoints /api/instance/* eram da plataforma antiga e não existem no Whaticket; a conexão é gerenciada no painel dashboard.chatappbrasil.com
* MELHORIA: Controle de step do carrinho abandonado (Pro) migrado do post meta para colunas próprias (wlp_step/wlp_last_sent) na tabela do CartBounty, com migração automática dos valores antigos
* CORRECAO: Contagem de cliques do botão não depende mais de nonce — páginas servidas por cache (WP Rocket etc.) entregavam nonce vencido e os cliques paravam de ser contados após ~12h; proteção mantida via checagem de origem + rate limit por IP
* CORRECAO: Reenvio pela lista de pedidos agora redireciona após disparar (padrão PRG) — recarregar a página não reenvia mais a mensagem; adicionado aviso de confirmação no admin
* CORRECAO: Corrigido erro de sintaxe latente no JS do admin (handler órfão do antigo bloco de autoresponders)

= 3.2.1 =
* CONFIABILIDADE: Lembretes de PIX (Mercado Pago e Asaas) migrados do WP-Cron para o Action Scheduler — funciona mesmo com DISABLE_WP_CRON=true e WP Rocket, pois o AS tem runner próprio ativado por requisições AJAX, REST e admin
* CONFIABILIDADE: Dupla garantia para lembretes PIX — além do AS, uma fila em wp_options é processada em toda requisição WordPress (frontend, admin, AJAX), garantindo disparo em segundos independente de cron ou tráfego
* CONFIABILIDADE: Trava de idempotência (transient 2h) impede duplo envio quando Action Scheduler e fila de requests disparam o mesmo lembrete quase simultaneamente
* CONFIABILIDADE: Helpers internos wlp_schedule_single e wlp_unschedule_all com fallback automático para WP-Cron quando o Action Scheduler não estiver disponível
* CORRECAO: Quando um pedido PIX é cancelado pelo gateway (PIX expirado sem pagamento), a mensagem de "PIX expirado" é enviada IMEDIATAMENTE via hook woocommerce_order_status_cancelled — antes dependia do AS executar ação agendada, podendo demorar minutos sem avisar o cliente
* CORRECAO: Notificação de novo pedido (wlp_wa_order_receive) agora passa order_id corretamente para o log e para as notas de pedido
* LIMPEZA: Removido método morto wlp_mp_pix_delayed_send que tinha hook registrado mas nunca era chamado
* MELHORIA: Toda mensagem WhatsApp relacionada a pedidos (status, PIX, lembrete, expirado, rastreamento, novo pedido) registra automaticamente nota privada no pedido WooCommerce com: fonte, telefone mascarado, status de envio, prévia e link ↺ Reenviar
* LOG: wlp_debug_log registra agendamento via AS ou WP-Cron (fallback), aviso se AS indisponível, e cada disparo da fila de requests com atraso em segundos
* DIAGNÓSTICO: Relatório de debug exibe status do Action Scheduler (versão, disponibilidade, ações pendentes do plugin)

= 3.1.0 =
* NOVO: Notificação do admin e formulários CF7/Caldera aceitam múltiplos números separados por vírgula — envia para cada destinatário individualmente
* SEGURANÇA: Verificação do header Content-Length antes do download de imagens externas — rejeita arquivos acima de 2 MB sem desperdiçar banda
* SEGURANÇA: Rate limiting por IP no endpoint de rastreamento de cliques do botão (máx. 10 cliques/hora por IP) para evitar flood na tabela
* SEGURANÇA: Hash de deduplicação migrado de MD5 para SHA-256
* SEGURANÇA: Construção da URL do botão WhatsApp corrigida (esc_url_raw em vez de esc_attr) e número sanitizado com regex antes de compor a URL
* CONFIABILIDADE: file_put_contents do QR PIX verifica retorno e registra erro no log de debug se a escrita falhar
* CONFIABILIDADE: Resposta HTTP 4xx/5xx da API ChatAppBrasil agora é tratada como erro (antes era registrada como sucesso se o JSON fosse válido)
* CONFIABILIDADE: Lock do cron de carrinho abandonado usa transient atômico (além do UPDATE condicional) para prevenir envios duplicados em crons paralelos
* CONFIABILIDADE: normalize_phone_number valida tamanho mínimo (DDI + 7 dígitos) e máximo (15 dígitos E.164) — números inválidos são descartados antes de chegar à API
* FLEXIBILIDADE: Timeouts da API (60s) e de download de imagens (30s) agora são configuráveis via filtros wlp_api_timeout e wlp_download_timeout
* LIMPEZA: Blocos de comentário vazios remanescentes da refatoração para traits removidos de wlp-main.php

= 3.0.7 =
* CORRECAO: Adicionado o callback que faltava para o retry do Asaas PIX (wlp_asaas_pix_retry). Antes o evento era agendado quando o meta __ASAAS_ORDER ainda nao estava salvo, mas nunca era tratado, e a mensagem podia nunca ser enviada
* CORRECAO: A deduplicacao deixou de bloquear lembretes, PIX expirado e reenvios manuais (envios com parametro resend), que agora sempre passam
* MELHORIA: Unificado o log das mensagens de Back In Stock (removida a gravacao manual duplicada); agora ha um unico registro por envio, identificado como Back in Stock e com o nome do cliente
* MELHORIA: A aba Debug agora exibe um quadro fixo com as integracoes suportadas e suas versoes instaladas (Melhor Envio, Mercado Pago, Asaas, Correios, CartBounty, Back In Stock Notifier, WooCommerce, etc), indicando ativo/nao instalado, alem da versao do plugin, do WordPress e do PHP

= 3.0.6 =
* CORRECAO: Back In Stock voltou a disparar o WhatsApp quando o e-mail de retorno ao estoque e enviado. O handler resolvia o produto do assinante por uma chave de meta errada (cwginstock_product_id) e abortava; agora usa cwginstock_pid/cwginstock_bypass_pid. Tambem passou a ouvir os eventos de envio automatico e manual (cwginstock_auto_email_sent e cwginstock_manual_email_sent)
* MELHORIA: Nova aba Back In Stock no log, no mesmo estilo dos Carrinhos abandonados, listando os assinantes elegiveis (com telefone) com status "Aguardando estoque" (ampulheta), "E-mail enviado" e "WhatsApp enviado", alem do status de estoque atual do produto

= 3.0.5 =
* CORRECAO: PIX expirado nao era agendado quando o modo de envio estava em "Lembrete" (a funcao retornava antes de agendar). Agora o PIX expirado e agendado em qualquer modo, no Mercado Pago e no Asaas
* CORRECAO: A mensagem de PIX expirado nunca disparava porque exigia o pedido em pending/on-hold, mas ao expirar o gateway ja cancela o pedido. Agora ela e enviada a menos que o cliente tenha pago (processando/concluido/reembolsado)
* MELHORIA: Back In Stock mais robusto na leitura do telefone do assinante (tenta multiplas chaves de meta, incluindo subscriber_phone) e o cron deixou de excluir assinantes por causa do nome da chave de telefone

= 3.0.4 =
* MELHORIA: Log de mensagens agora tem busca por nome, telefone ou numero do pedido, e filtro por tipo de mensagem (pedido concluido, processando, falhou, aguardando, PIX gerado, envio de rastreio, carrinho abandonado, assinatura, Back in Stock, etc). A busca e o filtro respeitam a paginacao
* MELHORIA: Cada envio agora registra o nome do cliente no log e a mensagem de carrinho abandonado passou a ser identificada como tal (antes caia em "Pedido")

= 3.0.3 =
* CORREÇÃO: Deteccao do plugin Melhor Envio na aba Rastreamento. O plugin verificava o arquivo melhor-envio-cotacao.php (inexistente) e a classe MelhorEnvio\MelhorEnvio (inexistente), exibindo "nao esta instalado ou ativo" mesmo com o Melhor Envio ativo. Agora detecta pela constante MELHORENVIO_VERSION, pela classe Melhor_Envio_Plugin e pelo arquivo correto melhor-envio-beta.php

= 3.0.2 =
* CORREÇÃO: Lembrete de carrinho abandonado não é mais enviado quando o cliente já fez a compra. Antes de disparar, o plugin verifica via wc_get_orders (compatível com HPOS) se já existe pedido pago (processando ou concluído) para o e-mail ou telefone do carrinho e, em caso positivo, marca o carrinho como concluído para não reenviar
* UX: Tela de Carrinhos abandonados passa a ocultar carrinhos sem número de telefone e a exibir apenas carrinhos criados após a ativação do plugin (wlp_install_date). Contagem e paginação ajustadas aos mesmos filtros
* UX: Carrinhos que viraram venda agora exibem o selo "(recuperado)" na coluna Status WA e um aviso no detalhe; o botão de envio manual fica oculto nesses casos
* FILTRO: Novo hook wlp_converted_order_statuses para personalizar quais status de pedido contam como "já comprou" (padrão: processando e concluído)

= 3.0.1 =
* ARQUITETURA: wlp-main.php refatorado de 3.300 para 1.942 linhas com separação em 7 PHP Traits
* ARQUITETURA: Criado includes/trait-wlp-api.php — HTTP client, send_msg, process_variables, QR image
* ARQUITETURA: Criado includes/trait-wlp-orders.php — process_states, order_receive, resend
* ARQUITETURA: Criado includes/trait-wlp-payments.php — MP PIX, Asaas PIX, Asaas Boleto, expirados
* ARQUITETURA: Criado includes/trait-wlp-cart.php — CartBounty, abandoned_order, aftersales
* ARQUITETURA: Criado includes/trait-wlp-subscriptions.php — 7 eventos de assinatura WCS
* ARQUITETURA: Criado includes/trait-wlp-tracking.php — Correios e Melhor Envio
* ARQUITETURA: Criado includes/trait-wlp-bis.php — Back In Stock + watchers + cron
* PERFORMANCE: CSS do painel extraído para assets/css/wlp-admin.css (cache do browser)
* PERFORMANCE: Endpoint público AJAX get_base_url removido; URL injetada via wp_localize_script
* PERFORMANCE: Limpeza de cliques (90 dias) movida do AJAX público para cron diário
* SEGURANÇA: Validação de tamanho (máx. 2 MB) e MIME (JPEG/PNG/WebP/GIF) antes do envio de mídia
* CORREÇÃO: Normalização de posição do botão agora aplica corretamente o mapa de variantes legadas
* LIMPEZA: Variável $curl_err morta removida
* LIMPEZA: UI de wlp_autoresponders sem backend removida do JS administrativo
* CONFIABILIDADE: Watchers BIS (save_post, meta, transition_post_status) registrados como hooks
* UX: Aba "📚 Tags" adicionada ao painel de Notificações com referência completa de variáveis
* UX: Frequência do cron de carrinho abandonado configurável na tela de Segurança (1/2/5/10 min)
* DEPRECIADO: wlp_bis_legacy_hook(), remove_emoji(), wlp_wa_encoding() marcados @deprecated

= 2.9.8 =
* PERFORMANCE: Cron do carrinho abandonado configurável (1, 2, 5 ou 10 min) com padrão de 5 min
* CONFIABILIDADE: Watchers BIS registrados como hooks formais (save_post, updated_post_meta, transition_post_status)
* DEPRECIADO: wlp_bis_legacy_hook(), remove_emoji(), wlp_wa_encoding() marcados com @deprecated
* UX: Aba "📚 Tags" exposta no painel de Notificações (render_help)

= 2.9.7 =
* SEGURANÇA: Endpoint público AJAX get_base_url removido; URL injetada via wp_localize_script
* PERFORMANCE: DELETE de retenção de cliques movido do AJAX para cron diário wlp_button_cleanup_clicks
* SEGURANÇA: Validação de tamanho (máx. 2 MB) e MIME antes do envio de mídia
* LIMPEZA: Variável $curl_err morta removida
* CORREÇÃO: Normalização de posição do botão aplica corretamente $pos_map[$val]
* LIMPEZA: UI wlp_autoresponders removida do JS (backend nunca implementado)

= 2.9.6 =
* SEGURANÇA: MD5 substituído por wp_hash() na validação do Access Token
* SEGURANÇA: @unserialize substituído por is_serialized() + allowed_classes false
* SEGURANÇA: cURL manual substituído por WP_Http no envio de imagens
* PERFORMANCE: Hook admin_init de migração com guard (só registra se necessário)
* LIMPEZA: Lottie Player removido (hook + método enqueue_lottie)
* CORREÇÃO: Posições do botão normalizadas (left-bottom → bottom-left)
* LIMPEZA: uninstall.php remove logs JSONL, flags de migração e transients

= 2.9.6 =
* SEGURANÇA: MD5 substituído por wp_hash() (HMAC-SHA256) na validação do Access Token
* SEGURANÇA: @unserialize substituído por verificação com is_serialized() + allowed_classes false
* SEGURANÇA: cURL manual substituído por WP_Http (wp_remote_post) no envio de imagens
* SEGURANÇA: Todos os dados de log já usam esc_html() na renderização (proteção XSS)
* PERFORMANCE: Hook admin_init de migração agora só registra se a migração ainda não ocorreu
* PERFORMANCE: Código morto do Lottie Player removido (hook + método enqueue_lottie)
* CORREÇÃO: Posições do botão flutuante normalizadas (left-bottom → bottom-left)
* LIMPEZA: uninstall.php agora remove logs JSONL, flags de migração e transients

= 2.9.0 =
* NOVO: Integração Asaas PIX — QR code + código copia e cola, modos imediato/lembrete
* NOVO: Integração Asaas Boleto — link do boleto via %boleto_url%
* NOVO: Notificação de PIX expirado — compartilhada entre Mercado Pago e Asaas
* NOVO: Aba Pagamentos — centraliza Mercado Pago PIX, Asaas PIX, Asaas Boleto e PIX Expirado
* NOVO: Aba Rastreamento — Correios e Melhor Envio com detecção automática
* NOVO: Tags %tracking_code%, %tracking_url% — código e link de rastreio
* NOVO: Tags %order_status%, %order_time%, %payment_url% — novas tags para mensagens
* CORRIGIDO: Notificação de "envios pausados" aparecia duplicada no painel admin
* ATUALIZADO: readme.txt e readme-en_US.txt completos para v2.9.0

= 2.8.0 =
* NOVO: Lembrete PIX, notas privadas nos pedidos, toggle por notificação
* NOVO: Linhas expansíveis nos logs, monitoramento de erros, friendly errors
* CORRIGIDO: Estatísticas de logs, quebra de linha CF7, botão Limpar Logs

= 2.7.5 =
* Rate limiting, filtro de horário, dedup configurável, Back In Stock, debug mode

= 2.7.0 =
* Compatibilidade HPOS, wc_get_order(), WC_Order API

= 2.0.0 =
* Botão flutuante SVG com preview, rastreamento de cliques

= 1.0.0 =
* Lançamento inicial
