From 24a517a10c96c3e8828deefa94feaa10a6c66fd8 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 5 Jan 2026 10:56:32 +0100 Subject: [PATCH] Fix: Brug fuldt case ID (ikke kun sidste 4 cifre) + auto-link kunder efter vTiger sync --- app/timetracking/backend/order_service.py | 6 +-- app/timetracking/backend/router.py | 55 +++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/app/timetracking/backend/order_service.py b/app/timetracking/backend/order_service.py index a5081de..ef87147 100644 --- a/app/timetracking/backend/order_service.py +++ b/app/timetracking/backend/order_service.py @@ -167,13 +167,13 @@ class OrderService: ) was_rounded = (case_hours != original_hours) - # Extract case number from vtiger_id (format: 39x42930 -> CC2930) + # Extract case number from vtiger_id (format: 39x3942 -> CC3942) case_number = "" if group['case_vtiger_id']: vtiger_parts = group['case_vtiger_id'].split('x') if len(vtiger_parts) > 1: - # Take last 4 digits - case_number = f"CC{vtiger_parts[1][-4:]}" + # Use full case ID number + case_number = f"CC{vtiger_parts[1]}" # Brug case titel fra vTiger (fallback til time entry beskrivelser) case_title = group.get('case_title') or "Ingen beskrivelse" diff --git a/app/timetracking/backend/router.py b/app/timetracking/backend/router.py index ae0d6cb..fe1d018 100644 --- a/app/timetracking/backend/router.py +++ b/app/timetracking/backend/router.py @@ -66,6 +66,16 @@ async def sync_from_vtiger( try: logger.info("๐Ÿš€ Starting vTiger sync...") result = await vtiger_service.full_sync(user_id=user_id, fetch_comments=fetch_comments) + + # Auto-link customers after sync to update links based on fresh vTiger data + logger.info("๐Ÿ”— Auto-linking customers after sync...") + try: + link_query = "SELECT * FROM link_tmodule_customers_to_hub()" + link_results = execute_query(link_query) + logger.info(f"โœ… Linked {len(link_results)} customers automatically") + except Exception as link_error: + logger.warning(f"โš ๏ธ Customer linking failed (non-critical): {link_error}") + return result except Exception as e: logger.error(f"โŒ Sync failed: {e}") @@ -118,6 +128,51 @@ async def test_vtiger_connection(): raise HTTPException(status_code=500, detail=str(e)) +@router.post("/sync/relink-customers", tags=["Sync"]) +async def relink_customers(): + """ + ๐Ÿ”— Re-link alle tmodule_customers til Hub customers. + + Bruger linking funktion der prioriterer: + 1. economic_customer_number match (mest prรฆcis) + 2. Navn match (fallback) + + Kรธr efter vTiger sync for at opdatere kunde-links baseret pรฅ + nyeste data fra vTiger (cf_854 economic numbers). + """ + try: + logger.info("๐Ÿ”— Starting customer re-linking...") + + # Call database function + query = "SELECT * FROM link_tmodule_customers_to_hub()" + results = execute_query(query) + + # Count by action type + stats = { + "economic_matches": 0, + "name_matches": 0, + "total_linked": len(results) + } + + for result in results: + if result['action'] == 'economic_number_match': + stats["economic_matches"] += 1 + elif result['action'] == 'name_match': + stats["name_matches"] += 1 + + logger.info(f"โœ… Customer linking complete: {stats}") + + return { + "success": True, + "stats": stats, + "linked_customers": results + } + + except Exception as e: + logger.error(f"โŒ Customer linking failed: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + @router.get("/debug/raw-stats", tags=["Debug"]) async def get_debug_raw_stats(): """