upskill-event-manager/verify-geocoding-completion.js
bengizmo 993a820a84 feat: Add comprehensive development artifacts to repository
- Add 26 documentation files including test reports, deployment guides, and troubleshooting documentation
- Include 3 CSV data files for trainer imports and user registration tracking
- Add 43 JavaScript test files covering mobile optimization, Safari compatibility, and E2E testing
- Include 18 PHP utility files for debugging, geocoding, and data analysis
- Add 12 shell scripts for deployment verification, user management, and database operations
- Update .gitignore with whitelist patterns for development files, documentation, and CSV data

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-11 12:26:11 -03:00

184 lines
No EOL
9.1 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();