From 1b0217ef7bfdb936fe22b33918504305f353720f Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 23 Dec 2025 15:36:17 +0100 Subject: [PATCH] feat: manual link customer to e-conomic (v1.3.58) - Added POST /api/v1/customers/{id}/link-economic endpoint - Allows manually setting economic_customer_number for customers without CVR - Useful for vTiger customers that can't auto-match via CVR or name - Updates last_synced_at timestamp when linking --- VERSION | 2 +- app/customers/backend/router.py | 39 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0aad741..f33f3c6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.57 \ No newline at end of file +1.3.58 \ No newline at end of file diff --git a/app/customers/backend/router.py b/app/customers/backend/router.py index 87385a3..39a8c50 100644 --- a/app/customers/backend/router.py +++ b/app/customers/backend/router.py @@ -288,6 +288,45 @@ async def update_customer(customer_id: int, update: CustomerUpdate): raise HTTPException(status_code=500, detail=str(e)) +@router.post("/customers/{customer_id}/link-economic") +async def link_economic_customer(customer_id: int, link_request: dict): + """Manually link customer to e-conomic customer number""" + try: + economic_customer_number = link_request.get('economic_customer_number') + + if not economic_customer_number: + raise HTTPException(status_code=400, detail="economic_customer_number required") + + # Get customer + customer = execute_query_single( + "SELECT id, name FROM customers WHERE id = %s", + (customer_id,)) + + if not customer: + raise HTTPException(status_code=404, detail="Customer not found") + + # Update economic customer number + execute_query( + "UPDATE customers SET economic_customer_number = %s, last_synced_at = NOW() WHERE id = %s", + (economic_customer_number, customer_id) + ) + + logger.info(f"✅ Linked customer {customer_id} ({customer['name']}) to e-conomic #{economic_customer_number}") + + return { + "status": "success", + "message": f"Kunde linket til e-conomic kundenr. {economic_customer_number}", + "customer_id": customer_id, + "economic_customer_number": economic_customer_number + } + + except HTTPException: + raise + except Exception as e: + logger.error(f"❌ Failed to link customer {customer_id} to e-conomic: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + @router.post("/customers/{customer_id}/subscriptions/lock") async def lock_customer_subscriptions(customer_id: int, lock_request: dict): """Lock/unlock subscriptions for customer in local DB - BMC Låst status controlled in vTiger"""