97 lines
2.7 KiB
Python
97 lines
2.7 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""
|
||
|
|
Lookup and update missing CVR numbers using CVR.dk API
|
||
|
|
"""
|
||
|
|
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.cvr_service import get_cvr_service
|
||
|
|
|
||
|
|
|
||
|
|
async def lookup_missing_cvr():
|
||
|
|
"""Lookup CVR numbers for customers without CVR using CVR.dk API"""
|
||
|
|
|
||
|
|
print("🔌 Forbinder til database...")
|
||
|
|
init_db()
|
||
|
|
|
||
|
|
print("🔌 Initialiserer CVR service...")
|
||
|
|
cvr_service = get_cvr_service()
|
||
|
|
|
||
|
|
# Get customers without CVR
|
||
|
|
print("\n📊 Henter kunder uden CVR...")
|
||
|
|
customers = execute_query("""
|
||
|
|
SELECT id, name, cvr_number, city
|
||
|
|
FROM customers
|
||
|
|
WHERE (cvr_number IS NULL OR cvr_number = '')
|
||
|
|
AND name NOT LIKE %s
|
||
|
|
AND name NOT LIKE %s
|
||
|
|
ORDER BY name
|
||
|
|
LIMIT 100
|
||
|
|
""", ('%privat%', '%test%'))
|
||
|
|
|
||
|
|
print(f"✅ Fundet {len(customers)} kunder uden CVR (henter max 100)\n")
|
||
|
|
|
||
|
|
if len(customers) == 0:
|
||
|
|
print("✅ Alle kunder har allerede CVR numre!")
|
||
|
|
return
|
||
|
|
|
||
|
|
updated = 0
|
||
|
|
not_found = 0
|
||
|
|
errors = 0
|
||
|
|
|
||
|
|
print("🔍 Slår CVR op via CVR.dk API...\n")
|
||
|
|
|
||
|
|
for idx, customer in enumerate(customers, 1):
|
||
|
|
try:
|
||
|
|
print(f"[{idx}/{len(customers)}] {customer['name']:<50} ... ", end='', flush=True)
|
||
|
|
|
||
|
|
# Lookup by company name
|
||
|
|
result = await cvr_service.lookup_by_name(customer['name'])
|
||
|
|
|
||
|
|
if result and result.get('vat'):
|
||
|
|
cvr = result['vat']
|
||
|
|
|
||
|
|
# Update customer
|
||
|
|
execute_update(
|
||
|
|
"UPDATE customers SET cvr_number = %s WHERE id = %s",
|
||
|
|
(cvr, customer['id'])
|
||
|
|
)
|
||
|
|
|
||
|
|
print(f"✓ CVR: {cvr}")
|
||
|
|
updated += 1
|
||
|
|
else:
|
||
|
|
print("✗ Ikke fundet")
|
||
|
|
not_found += 1
|
||
|
|
|
||
|
|
# Rate limiting - wait a bit between requests
|
||
|
|
await asyncio.sleep(0.5)
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
print(f"❌ Fejl: {e}")
|
||
|
|
errors += 1
|
||
|
|
|
||
|
|
# Summary
|
||
|
|
print(f"\n{'='*60}")
|
||
|
|
print(f"✅ Opslag færdig!")
|
||
|
|
print(f" Opdateret: {updated}")
|
||
|
|
print(f" Ikke fundet: {not_found}")
|
||
|
|
print(f" Fejl: {errors}")
|
||
|
|
print(f"{'='*60}\n")
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
asyncio.run(lookup_missing_cvr())
|