Add: Sync diagnostics endpoint for troubleshooting contact linking
This commit is contained in:
parent
6d949d7060
commit
e541758c44
@ -523,3 +523,91 @@ async def sync_cvr_to_economic() -> Dict[str, Any]:
|
||||
except Exception as e:
|
||||
logger.error(f"❌ CVR to e-conomic sync error: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
@router.get("/sync/diagnostics")
|
||||
async def sync_diagnostics() -> Dict[str, Any]:
|
||||
"""
|
||||
Diagnostics: Check contact linking coverage
|
||||
Shows why contacts aren't linking to customers
|
||||
"""
|
||||
try:
|
||||
logger.info("🔍 Running sync diagnostics...")
|
||||
|
||||
# Check Hub data
|
||||
hub_stats = execute_query("""
|
||||
SELECT
|
||||
COUNT(*) as total_customers,
|
||||
COUNT(vtiger_id) as customers_with_vtiger
|
||||
FROM customers
|
||||
""")
|
||||
|
||||
vtiger_ids_in_hub = execute_query(
|
||||
"SELECT vtiger_id FROM customers WHERE vtiger_id IS NOT NULL"
|
||||
)
|
||||
hub_vtiger_set = set(row['vtiger_id'] for row in vtiger_ids_in_hub)
|
||||
|
||||
contact_stats = execute_query("""
|
||||
SELECT
|
||||
COUNT(*) as total_contacts,
|
||||
COUNT(vtiger_id) as contacts_with_vtiger
|
||||
FROM contacts
|
||||
""")
|
||||
|
||||
link_stats = execute_query("""
|
||||
SELECT COUNT(*) as total_links
|
||||
FROM contact_companies
|
||||
""")
|
||||
|
||||
# Fetch sample contacts from vTiger
|
||||
vtiger = get_vtiger_service()
|
||||
query = "SELECT id, firstname, lastname, account_id FROM Contacts ORDER BY id LIMIT 200;"
|
||||
contacts = await vtiger.query(query)
|
||||
|
||||
# Analyze
|
||||
with_account = [c for c in contacts if c.get('account_id')]
|
||||
account_ids = set(c['account_id'] for c in with_account)
|
||||
|
||||
matched_accounts = [aid for aid in account_ids if aid in hub_vtiger_set]
|
||||
unmatched_accounts = [aid for aid in account_ids if aid not in hub_vtiger_set]
|
||||
|
||||
result = {
|
||||
"hub": {
|
||||
"total_customers": hub_stats[0]['total_customers'],
|
||||
"customers_with_vtiger_id": hub_stats[0]['customers_with_vtiger'],
|
||||
"unique_vtiger_ids": len(hub_vtiger_set),
|
||||
"total_contacts": contact_stats[0]['total_contacts'],
|
||||
"contacts_with_vtiger_id": contact_stats[0]['contacts_with_vtiger'],
|
||||
"total_links": link_stats[0]['total_links']
|
||||
},
|
||||
"vtiger_sample": {
|
||||
"sample_size": len(contacts),
|
||||
"contacts_with_account_id": len(with_account),
|
||||
"unique_account_ids": len(account_ids),
|
||||
"account_ids_found_in_hub": len(matched_accounts),
|
||||
"account_ids_missing_in_hub": len(unmatched_accounts),
|
||||
"match_rate_percent": round((len(matched_accounts) / len(account_ids) * 100), 1) if account_ids else 0
|
||||
},
|
||||
"examples": {
|
||||
"matched_account_ids": matched_accounts[:5],
|
||||
"unmatched_account_ids": unmatched_accounts[:10]
|
||||
},
|
||||
"recommendation": ""
|
||||
}
|
||||
|
||||
# Add recommendation
|
||||
match_rate = result['vtiger_sample']['match_rate_percent']
|
||||
if match_rate < 50:
|
||||
result['recommendation'] = f"⚠️ LOW MATCH RATE ({match_rate}%) - Kør først /sync/vtiger for at linke flere accounts"
|
||||
elif match_rate < 90:
|
||||
result['recommendation'] = f"⚡ MEDIUM MATCH RATE ({match_rate}%) - Nogen accounts mangler stadig at blive linket"
|
||||
else:
|
||||
result['recommendation'] = f"✅ HIGH MATCH RATE ({match_rate}%) - De fleste contacts kan linkes"
|
||||
|
||||
logger.info(f"✅ Diagnostics complete: {result['recommendation']}")
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Diagnostics error: {e}", exc_info=True)
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user