134 lines
4.7 KiB
Python
134 lines
4.7 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""
|
||
|
|
Sync CVR numbers from Simply-CRM (OLD vTiger system) to local customers database
|
||
|
|
"""
|
||
|
|
import sys
|
||
|
|
import os
|
||
|
|
import asyncio
|
||
|
|
from dotenv import load_dotenv
|
||
|
|
|
||
|
|
# Load environment variables
|
||
|
|
load_dotenv()
|
||
|
|
|
||
|
|
# Override DATABASE_URL for local execution
|
||
|
|
if "postgres:5432" in os.getenv("DATABASE_URL", ""):
|
||
|
|
os.environ["DATABASE_URL"] = os.getenv("DATABASE_URL").replace("postgres:5432", "localhost:5433")
|
||
|
|
|
||
|
|
# Add parent directory to path
|
||
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
||
|
|
|
||
|
|
from app.core.database import execute_query, execute_update, init_db
|
||
|
|
from app.services.simplycrm_service import SimplyCRMService
|
||
|
|
|
||
|
|
|
||
|
|
async def sync_cvr_from_simplycrm():
|
||
|
|
"""Sync CVR numbers from Simply-CRM to local customers"""
|
||
|
|
|
||
|
|
print("🔌 Forbinder til database...")
|
||
|
|
init_db()
|
||
|
|
|
||
|
|
print("🔌 Forbinder til Simply-CRM (bmcnetworks.simply-crm.dk)...")
|
||
|
|
|
||
|
|
# Get all customers with vtiger_id but no cvr_number
|
||
|
|
print("\n📊 Henter kunder uden CVR...")
|
||
|
|
customers = execute_query("""
|
||
|
|
SELECT id, name, vtiger_id, cvr_number
|
||
|
|
FROM customers
|
||
|
|
WHERE vtiger_id IS NOT NULL
|
||
|
|
AND (cvr_number IS NULL OR cvr_number = '')
|
||
|
|
ORDER BY name
|
||
|
|
""", ())
|
||
|
|
|
||
|
|
print(f"✅ Fundet {len(customers)} kunder uden CVR\n")
|
||
|
|
|
||
|
|
if len(customers) == 0:
|
||
|
|
print("✅ Alle kunder har allerede CVR numre!")
|
||
|
|
return
|
||
|
|
|
||
|
|
# Fetch accounts from Simply-CRM
|
||
|
|
async with SimplyCRMService() as simplycrm:
|
||
|
|
print("📥 Henter alle firmaer fra Simply-CRM...")
|
||
|
|
|
||
|
|
# Query all accounts - lad os se hvilke felter der findes
|
||
|
|
query = "SELECT * FROM Accounts LIMIT 10;"
|
||
|
|
sample = await simplycrm.query(query)
|
||
|
|
|
||
|
|
if sample:
|
||
|
|
print(f"\n📋 Sample account:")
|
||
|
|
print(f" account_id: {sample[0].get('account_id')}")
|
||
|
|
print(f" id: {sample[0].get('id')}")
|
||
|
|
print(f" accountname: {sample[0].get('accountname')}")
|
||
|
|
print(f" vat_number: {sample[0].get('vat_number')}")
|
||
|
|
|
||
|
|
# Query alle accounts
|
||
|
|
query = "SELECT * FROM Accounts LIMIT 5000;"
|
||
|
|
accounts = await simplycrm.query(query)
|
||
|
|
|
||
|
|
print(f"✅ Fundet {len(accounts)} firmaer i Simply-CRM med CVR\n")
|
||
|
|
|
||
|
|
if len(accounts) == 0:
|
||
|
|
print("⚠️ Ingen firmaer med CVR i Simply-CRM!")
|
||
|
|
return
|
||
|
|
|
||
|
|
# Map Company NAME to CVR (Simply-CRM og vTiger har forskellige ID systemer!)
|
||
|
|
name_to_cvr = {}
|
||
|
|
for acc in accounts:
|
||
|
|
company_name = acc.get('accountname', '').strip().lower()
|
||
|
|
cvr = acc.get('vat_number', '').strip()
|
||
|
|
if company_name and cvr and cvr not in ['', 'null', 'NULL']:
|
||
|
|
# Clean CVR (remove spaces, dashes, "DK" prefix)
|
||
|
|
cvr_clean = cvr.replace(' ', '').replace('-', '').replace('DK', '').replace('dk', '')
|
||
|
|
if cvr_clean.isdigit() and len(cvr_clean) == 8:
|
||
|
|
name_to_cvr[company_name] = cvr_clean
|
||
|
|
|
||
|
|
print(f"✅ {len(name_to_cvr)} unikke firmanavne mapped med CVR\n")
|
||
|
|
|
||
|
|
# Match and update by company name
|
||
|
|
updated = 0
|
||
|
|
skipped = 0
|
||
|
|
|
||
|
|
print("🔄 Opdaterer CVR numre...\n")
|
||
|
|
|
||
|
|
for customer in customers:
|
||
|
|
customer_name = customer['name'].strip().lower()
|
||
|
|
|
||
|
|
if customer_name in name_to_cvr:
|
||
|
|
cvr = name_to_cvr[customer_name]
|
||
|
|
|
||
|
|
# Check if CVR already exists on another customer
|
||
|
|
existing = execute_query(
|
||
|
|
"SELECT id, name FROM customers WHERE cvr_number = %s AND id != %s",
|
||
|
|
(cvr, customer['id']),
|
||
|
|
fetchone=True
|
||
|
|
)
|
||
|
|
|
||
|
|
if existing:
|
||
|
|
print(f" ⚠️ {customer['name']:<50} CVR {cvr} allerede brugt af: {existing['name']}")
|
||
|
|
skipped += 1
|
||
|
|
continue
|
||
|
|
|
||
|
|
# Update customer
|
||
|
|
try:
|
||
|
|
execute_update(
|
||
|
|
"UPDATE customers SET cvr_number = %s WHERE id = %s",
|
||
|
|
(cvr, customer['id'])
|
||
|
|
)
|
||
|
|
print(f" ✓ {customer['name']:<50} CVR: {cvr}")
|
||
|
|
updated += 1
|
||
|
|
except Exception as e:
|
||
|
|
print(f" ❌ {customer['name']:<50} Error: {e}")
|
||
|
|
skipped += 1
|
||
|
|
else:
|
||
|
|
skipped += 1
|
||
|
|
|
||
|
|
# Summary
|
||
|
|
print(f"\n{'='*60}")
|
||
|
|
print(f"✅ Opdatering færdig!")
|
||
|
|
print(f" Opdateret: {updated}")
|
||
|
|
print(f" Ikke fundet i Simply-CRM: {skipped}")
|
||
|
|
print(f"{'='*60}\n")
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
asyncio.run(sync_cvr_from_simplycrm())
|