--- tags: [skymilhas, tap, miles-go, fix, frontend, scraper, php] created: 2026-04-14 updated: 2026-04-15 --- # TAP Miles&Go - Correções Completas 2026-04-14/15 ## Problema Principal Scraper TAP retornava 86+ voos mas: 1. Todos em BRL (cash), milhas=0 (TAP exige login para milhas) 2. Pipeline tratava TAP como "milhas" → voos filtrados como incompatíveis 3. Múltiplas tarifas por voo (Basic,Classic,Plus,Executive) como cards separados 4. Frontend mostrava preço Business (R$ 19.267) como se fosse Economy ## Correções Aplicadas ### 1. Server.js - TAP como BRL (não milhas) **Arquivo:** `/opt/skymilhas/server.js` (~linha 5003) ```js // ANTES: if (p.includes('tap') || p.includes('miles')) return 'milhas'; // AGORA: if (p.includes('tap') || p.includes('miles&go') || p.includes('milesgo')) return 'BRL'; if (p.includes('miles') && !p.includes('tap')) return 'milhas'; ``` ### 2. PHP - TAP tratado como programa BRL (igual GOL) **Arquivo:** `/var/www/skymilhas/app/Libraries/MilhasApiService.php` (~linha 1103) - Adicionado bloco `$isTapDireto` (igual `$isGolDireto`) - `$tipoMoedaFinal = 'dinheiro'` - `$milhasFinal = null` - `$modeCompativel = true` (sempre mostra) ### 3. PHP - Mode compatibility fix Linha ~1127: GOL e TAP excluídos do filtro de mode: ```php if ($milhasFinal === null && $tipoMoedaFinal === 'dinheiro' && !$isGolDireto && !$isTapDireto) { $modeCompativel = false; } ``` **Sem isso, voos TAP eram filtrados quando usuário buscava em modo "milhas".** ### 4. PHP - Dedup TAP por horário Linha ~1305: Agrupa voos TAP pelo horário de saída e mantém apenas o menor preço Economy: - 86 tarifas → ~10-15 voos únicos - Parsing de valor corrigido (suporta `R$ 5854.13` e `R$ 5.854,13`) - Detecta cabine por código (`C`,`J`,`F`) e texto (`Business`,`Economy`) - `valorDinheiro` atualizado com menor Economy ### 5. Tentativa de milhas (FALHOU - revertido) Tentei 4 abordagens para ativar `payWithMiles=true`: 1. Parâmetro no deeplink URL → Ignorado pelo Angular 2. CDP Fetch intercept → Não funciona com puppeteer-real-browser 3. Puppeteer setRequestInterception → Não funciona 4. evaluateOnNewDocument XHR/fetch override → API retorna 0 resultados **Conclusão: TAP Miles&Go EXIGE login para milhas. Scraper revertido para modo cash.** ## Dados que o Scraper Retorna ``` 5 tarifas por voo direto GRU→LIS: Economy Discount = R$ 3408.27 Economy Basic = R$ 3748.84 Economy Classic = R$ 4089.40 ← Este bate com oficial (~7.390 com 2 pax) Economy Plus = R$ 4337.08 Business Top Executive = R$ 18424.04 ``` ## Arquivos Modificados - `/opt/skymilhas/server.js` - TAP como BRL - `/var/www/skymilhas/app/Libraries/MilhasApiService.php` - isTapDireto + dedup - `/opt/skymilhas/scrapers/tap/index.js` - REVERTIDO para original (sem payWithMiles) ## Pendente - Layout específico TAP (como GOL e AA têm) para visual mais próximo do oficial - Login TAP para buscar milhas Miles&Go