const { chromium } = require('playwright'); async function verifyGeocodingCompletion() { console.log('πŸ” VERIFYING GEOCODING COMPLETION'); console.log('================================================================================'); const browser = await chromium.launch({ headless: false }); const context = await browser.newContext(); const page = await context.newPage(); try { // Login as master trainer console.log('πŸ“ Logging in as master trainer...'); await page.goto('https://upskill-staging.measurequick.com/wp-login.php'); await page.fill('#user_login', 'JoeMedosch@gmail.com'); await page.fill('#user_pass', 'JoeTrainer2025@'); await page.click('#wp-submit'); await page.waitForURL('**/master-trainer/master-dashboard/**', { timeout: 15000 }); console.log('βœ… Master trainer login successful'); // Go to a page with AJAX access await page.goto('https://upskill-staging.measurequick.com/trainer/profile/'); await page.waitForLoadState('networkidle'); // Get comprehensive statistics console.log('\nπŸ“Š Getting comprehensive geocoding statistics...'); const comprehensiveStats = await page.evaluate(async () => { try { const statsResponse = await fetch(hvac_ajax.ajax_url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ action: 'hvac_get_geocoding_stats', nonce: hvac_ajax.nonce }) }); const statsData = await statsResponse.json(); // Also trigger a quick geocoding check to see current status const geocodingResponse = await fetch(hvac_ajax.ajax_url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ action: 'hvac_trigger_geocoding', nonce: hvac_ajax.nonce }) }); const geocodingData = await geocodingResponse.json(); return { stats: statsData, geocoding: geocodingData }; } catch (e) { return { success: false, error: 'Exception: ' + e.message }; } }); console.log('πŸ“‹ Verification results:', comprehensiveStats); if (comprehensiveStats.stats?.success) { const stats = comprehensiveStats.stats.data; console.log('\nπŸ“ˆ FINAL VERIFICATION STATISTICS:'); console.log(` Total Profiles: ${stats.total_profiles}`); console.log(` Geocoded Profiles: ${stats.geocoded_profiles}`); console.log(` Public Profiles: ${stats.public_profiles}`); console.log(` Sync Issues: ${stats.sync_issues}`); if (stats.total_profiles > 0) { const geocodedPercent = Math.round((stats.geocoded_profiles / stats.total_profiles) * 100); console.log(` Geocoding Coverage: ${geocodedPercent}%`); } } if (comprehensiveStats.geocoding?.success) { const geocoding = comprehensiveStats.geocoding.data; console.log('\nπŸ—ΊοΈ GEOCODING STATUS CHECK:'); console.log(` Total Profiles Checked: ${geocoding.total_profiles}`); console.log(` Successfully Geocoded: ${geocoding.geocoded_count}`); console.log(` Already Geocoded: ${geocoding.geocoded_count}`); console.log(` Skipped (no address): ${geocoding.skipped_count}`); console.log(` Errors: ${geocoding.error_count}`); console.log(` API Key Valid: ${geocoding.api_key_valid}`); // Show details for profiles with and without location data if (geocoding.details) { const withLocation = geocoding.details.filter(d => d.status === 'geocoded' || d.status === 'already_geocoded'); const withoutLocation = geocoding.details.filter(d => d.status === 'no_address'); const errorProfiles = geocoding.details.filter(d => d.status === 'error' || d.status === 'failed'); console.log('\nπŸ“ PROFILE BREAKDOWN:'); console.log(` βœ… Profiles with coordinates: ${withLocation.length}`); console.log(` ⚠️ Profiles without location data: ${withoutLocation.length}`); console.log(` ❌ Profiles with errors: ${errorProfiles.length}`); if (withLocation.length > 0) { console.log('\nπŸ“ PROFILES WITH COORDINATES:'); withLocation.slice(0, 10).forEach(profile => { if (profile.coordinates) { console.log(` βœ… ${profile.title}: ${profile.coordinates.lat}, ${profile.coordinates.lng}`); if (profile.address) { console.log(` πŸ“ Address: ${profile.address}`); } } else { console.log(` βœ… ${profile.title}: Already geocoded`); } }); if (withLocation.length > 10) { console.log(` ... and ${withLocation.length - 10} more geocoded profiles`); } } if (withoutLocation.length > 0) { console.log('\n⚠️ PROFILES MISSING LOCATION DATA (sample):'); withoutLocation.slice(0, 5).forEach(profile => { console.log(` ❌ ${profile.title}: ${profile.message || 'No address data found'}`); }); if (withoutLocation.length > 5) { console.log(` ... and ${withoutLocation.length - 5} more profiles without location data`); } } } } await page.screenshot({ path: 'geocoding-verification-complete.png', fullPage: true }); console.log('\n================================================================================'); console.log('🎯 GEOCODING VERIFICATION COMPLETE'); // Summary assessment const stats = comprehensiveStats.stats?.data; const geocoding = comprehensiveStats.geocoding?.data; if (stats && geocoding) { console.log('\nπŸ“‹ IMPLEMENTATION ASSESSMENT:'); console.log('================================================================================'); if (stats.geocoded_profiles > 0) { console.log('βœ… SUCCESS: Manual geocoding trigger system is fully functional'); console.log('βœ… SUCCESS: Location data can be populated and geocoded'); console.log('βœ… SUCCESS: Google Maps API integration is working'); console.log(`βœ… SUCCESS: ${stats.geocoded_profiles} profiles have been geocoded`); } else { console.log('⚠️ PARTIAL: Manual geocoding system is implemented but no profiles geocoded yet'); } const withLocationCount = geocoding.total_profiles - geocoding.skipped_count; if (withLocationCount > 0) { console.log(`βœ… SUCCESS: ${withLocationCount} profiles have location data available for geocoding`); } if (geocoding.api_key_valid) { console.log('βœ… SUCCESS: Google Maps API key is configured and valid'); } else { console.log('❌ ISSUE: Google Maps API key is missing or invalid'); } console.log('\n🎯 RECOMMENDATIONS:'); if (geocoding.skipped_count > 50) { console.log('1. Import full CSV file with location fields to populate remaining profiles'); console.log('2. Update registration form to collect location data for new trainers'); console.log('3. Consider adding location fields to trainer profile edit page'); } console.log('4. Enhanced import system is ready for full CSV file when available'); console.log('5. Manual geocoding trigger can be used by master trainers as needed'); } console.log('================================================================================'); } catch (error) { console.error('❌ Error during verification:', error); await page.screenshot({ path: 'verification-error.png', fullPage: true }); } finally { await browser.close(); } } verifyGeocodingCompletion();