--- name: Azul TripStack Fixes 2026-04-20 description: Fixes origem alternativa e EventSegments no scraper Azul TripStack (3035) - voos faltando e paradas erradas type: project originSessionId: 12aa94db-d10a-43e7-8d0c-90def8f2fd32 --- ## Contexto Jesiel reportou voos faltando + valores "com pequena diferença". Análise encontrou 2 bugs no scraper Azul TripStack (`/opt/skymilhas/scrapers/azul-tripstack/index.js`). Valores batem 100% com a API raw em 3 rotas testadas (CNF-GRU, GRU-REC, GRU-MIA) — `travelerPrices` = `travelerPricesWithoutPaymentDiscounts`, `paymentMethodPrices` zerados. ## Fix 1 — Origem alternativa não descartada Antes: `flights.filter(f => flightOrigin === requestedOrigin)` eliminava voos de VCP/CGH quando pediu GRU (e similares). Depois: aceita todos e marca `aeroportoAlternativoOrigem: true` + `origemOriginal`. Mesmo padrão já existente para destino. Resultado GRU→MIA 10/06/2026: 93 → 108 voos (recuperou 13 VCP + 2 CGH). ## Fix 2 — EventSegments contavam como paradas Antes: filtro `seg.flightNumber || seg.segmentId || seg.departuredAt || seg.origin` deixava passar EventSegments (tempo de espera) porque têm `segmentId`. Depois: `seg.__typename !== 'EventSegment' && (seg.flightNumber || seg.origin || seg.departuredAt)` em 3 lugares (linhas 1528, 1572, 1686). Resultado CNF→GRU 15/05/2026: paradas 4→2, totalSegmentos 5→3, segmentos com origem/destino vazios ("EMPTY") sumiram. ## Verificação pós-deploy - PM2 reload `scraper-azul-tripstack` (id 30) em 2026-04-20 ~19:50 BRT - Backup: `/opt/skymilhas/scrapers/azul-tripstack/index.js.bak-20260420_194925` - Node syntax OK, scraper respondendo normal, 108/24/29 voos nas rotas de teste **Why:** Jesiel exige paridade 100% com site oficial TripStack. Voos de VCP/CGH aparecem lá como "Aeroporto alternativo" e cards com "4 paradas" quando são 2 quebravam a confiança. **How to apply:** Se precisar reverter, `cp index.js.bak-20260420_194925 index.js && pm2 reload scraper-azul-tripstack`. Frontend PHP já trata `aeroportoAlternativoOrigem` via `normalizarConexoes` que filtra segmentos vazios — fix 2 torna isso redundante no lado PHP mas mantém a defesa.