Fix dead manual-send exclusion in campaign candidate query

The real manual-send route (routes/outreach.mjs) always inserts with
produto='' and lead_id=NULL, so the old single NOT EXISTS predicate
(produto = ? AND (lead_id = leads.id OR numero = leads.whatsapp)) could
never match a real manual send's row -- the numero branch was unreachable
in production even though a prior test fabricated a produto value manual
sends never write. Split into two NOT EXISTS clauses: one scoped to
produto+lead_id (automatic/campaign sends), one scoped to numero+
origem='manual' with no produto requirement (manual sends). Updated the
existing regression test to insert the row exactly like the real route
does (produto: '', lead_id: NULL, origem: 'manual').
This commit is contained in:
Gustavo
2026-08-03 13:06:43 -03:00
parent c7157ce96a
commit aa46c3da07
2 changed files with 12 additions and 3 deletions
+5 -2
View File
@@ -57,12 +57,15 @@ test('generateCampaignQueue exclui lead com envio ja enviado para o mesmo produt
db.close();
});
test('generateCampaignQueue exclui numero com envio manual ja enviado (sem lead_id) para o mesmo produto', () => {
test('generateCampaignQueue exclui numero com envio manual ja enviado (sem lead_id, produto vazio, como o envio manual real grava)', () => {
const db = openDb(':memory:');
inserirLead(db, { whatsapp: '5511999990009' });
// Reproduz exatamente como src/server/routes/outreach.mjs grava um envio
// manual: lead_id NULL, produto '' (nunca o produto da campanha) e
// origem='manual'. A exclusao precisa valer mesmo assim, por numero.
db.prepare(
`INSERT INTO outreach_sends (lead_id, produto, numero, mensagem_enviada, status, origem)
VALUES (NULL, 'ERP', '5511999990009', 'oi', 'enviado', 'manual')`
VALUES (NULL, '', '5511999990009', 'oi', 'enviado', 'manual')`
).run();
const campanha = campanhaComVariantes(db);