- 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>
184 lines
No EOL
9.1 KiB
JavaScript
184 lines
No EOL
9.1 KiB
JavaScript
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(); |