Files
service-finder/backend/app/scripts/fix_orgs_complete.py
2026-03-31 06:20:43 +00:00

207 lines
8.6 KiB
Python

#!/usr/bin/env python3
"""
Complete database surgery for tester_pro organizations and vehicles.
Creates branches for Alpha/Beta organizations, distributes vehicles, and sets up asset assignments.
"""
import asyncio
import asyncpg
import os
import uuid
async def fix_database():
# Use the correct connection string for asyncpg
DATABASE_URL = "postgresql://service_finder_app:AppSafePass_2026@db:5432/service_finder"
print("=== DATABASE SURGERY STARTED ===")
conn = await asyncpg.connect(DATABASE_URL)
try:
# Start transaction
await conn.execute("BEGIN")
print("1. Checking existing organizations...")
# Get tester_pro's person_id (should be 29)
person = await conn.fetchrow("""
SELECT id FROM identity.persons WHERE email = 'tester_pro@profibot.hu'
""")
if not person:
print(" ❌ tester_pro not found!")
return
person_id = person['id']
print(f" ✓ Found tester_pro with person_id={person_id}")
# Check existing organizations
orgs = await conn.fetch("""
SELECT id, full_name, org_type FROM fleet.organizations
WHERE owner_id = $1 ORDER BY id
""", person_id)
print(f" ✓ Found {len(orgs)} organizations for tester_pro")
for org in orgs:
print(f" - ID {org['id']}: {org['full_name']} ({org['org_type']})")
# 1. Ensure Private Organization has correct owner_id (should already be fixed)
print("\n2. Fixing Private Organization owner_id...")
private_org = await conn.fetchrow("""
SELECT id FROM fleet.organizations
WHERE owner_id = $1 AND org_type = 'individual'
""", person_id)
if private_org:
print(f" ✓ Private Organization exists (ID: {private_org['id']})")
else:
print(" ⚠️ No Private Organization found")
# 2. Fix Corporate Organization owner_id (should already be fixed)
print("\n3. Fixing Corporate Organization owner_id...")
corp_org = await conn.fetchrow("""
SELECT id FROM fleet.organizations
WHERE owner_id = $1 AND org_type = 'fleet_owner' AND full_name LIKE '%Profibot Test Fleet%'
""", person_id)
if corp_org:
print(f" ✓ Corporate Organization exists (ID: {corp_org['id']})")
else:
print(" ⚠️ No Corporate Organization found")
# 3. Create branches for Alpha and Beta organizations if they don't exist
print("\n4. Creating branches for Alpha and Beta organizations...")
# Check Alpha organization
alpha_org = await conn.fetchrow("""
SELECT id, full_name FROM fleet.organizations
WHERE owner_id = $1 AND full_name = 'Test Kft. Alpha'
""", person_id)
if alpha_org:
print(f" ✓ Alpha Organization exists (ID: {alpha_org['id']})")
# Check if Alpha has a branch
alpha_branch = await conn.fetchrow("""
SELECT id FROM fleet.branches WHERE organization_id = $1
""", alpha_org['id'])
if not alpha_branch:
print(" Creating Alpha Branch...")
alpha_branch_id = str(uuid.uuid4())
await conn.execute("""
INSERT INTO fleet.branches (
id, name, organization_id, branch_rating, opening_hours,
status, is_deleted, created_at
) VALUES (
$1, $2, $3, 0.0, '{}'::jsonb, 'active', false, NOW()
)
""", alpha_branch_id, f"{alpha_org['full_name']} - Main Branch", alpha_org['id'])
print(f" ✓ Created Alpha Branch (ID: {alpha_branch_id})")
else:
print(f" ✓ Alpha Branch already exists (ID: {alpha_branch['id']})")
# Check Beta organization
beta_org = await conn.fetchrow("""
SELECT id, full_name FROM fleet.organizations
WHERE owner_id = $1 AND full_name = 'Test Kft. Beta'
""", person_id)
if beta_org:
print(f" ✓ Beta Organization exists (ID: {beta_org['id']})")
# Check if Beta has a branch
beta_branch = await conn.fetchrow("""
SELECT id FROM fleet.branches WHERE organization_id = $1
""", beta_org['id'])
if not beta_branch:
print(" Creating Beta Branch...")
beta_branch_id = str(uuid.uuid4())
await conn.execute("""
INSERT INTO fleet.branches (
id, name, organization_id, branch_rating, opening_hours,
status, is_deleted, created_at
) VALUES (
$1, $2, $3, 0.0, '{}'::jsonb, 'active', false, NOW()
)
""", beta_branch_id, f"{beta_org['full_name']} - Main Branch", beta_org['id'])
print(f" ✓ Created Beta Branch (ID: {beta_branch_id})")
else:
print(f" ✓ Beta Branch already exists (ID: {beta_branch['id']})")
# 4. Distribute vehicles
print("\n5. Distributing vehicles...")
# Get 3 vehicles owned by tester_pro
vehicles = await conn.fetch("""
SELECT id, license_plate, current_organization_id
FROM vehicle.assets
WHERE owner_person_id = $1
ORDER BY license_plate
LIMIT 3
""", person_id)
if len(vehicles) >= 3:
# Vehicle 1: Keep in Private Organization (ID 21)
private_org_id = 21 # From earlier check
await conn.execute("""
UPDATE vehicle.assets
SET current_organization_id = $1
WHERE id = $2
""", private_org_id, vehicles[0]['id'])
print(f" ✓ Vehicle '{vehicles[0]['license_plate']}' -> Private Organization")
# Vehicle 2: Move to Alpha Organization
if alpha_org:
await conn.execute("""
UPDATE vehicle.assets
SET current_organization_id = $1
WHERE id = $2
""", alpha_org['id'], vehicles[1]['id'])
print(f" ✓ Vehicle '{vehicles[1]['license_plate']}' -> Alpha Organization")
# Vehicle 3: Move to Beta Organization
if beta_org:
await conn.execute("""
UPDATE vehicle.assets
SET current_organization_id = $1
WHERE id = $2
""", beta_org['id'], vehicles[2]['id'])
print(f" ✓ Vehicle '{vehicles[2]['license_plate']}' -> Beta Organization")
# 5. Update asset assignments with proper UUIDs and status
print("\n6. Updating asset assignments...")
# Delete existing assignments for these vehicles
await conn.execute("""
DELETE FROM fleet.asset_assignments
WHERE asset_id IN ($1, $2, $3)
""", vehicles[0]['id'], vehicles[1]['id'], vehicles[2]['id'])
# Create new assignments with UUIDs and status
assignments = [
(str(uuid.uuid4()), vehicles[0]['id'], private_org_id, 'active'),
(str(uuid.uuid4()), vehicles[1]['id'], alpha_org['id'] if alpha_org else None, 'active'),
(str(uuid.uuid4()), vehicles[2]['id'], beta_org['id'] if beta_org else None, 'active')
]
for assignment_id, asset_id, org_id, status in assignments:
if org_id: # Skip if organization doesn't exist
await conn.execute("""
INSERT INTO fleet.asset_assignments (id, asset_id, organization_id, status)
VALUES ($1, $2, $3, $4)
""", assignment_id, asset_id, org_id, status)
print(f" ✓ Created {len([a for a in assignments if a[2]])} asset assignments")
else:
print(f" ⚠️ Not enough vehicles (need 3, have {len(vehicles)})")
# Commit transaction
await conn.execute("COMMIT")
print("\n=== DATABASE SURGERY COMPLETED SUCCESSFULLY ===")
except Exception as e:
await conn.execute("ROLLBACK")
print(f"\n=== ERROR: {e} ===")
raise
finally:
await conn.close()
if __name__ == "__main__":
asyncio.run(fix_database())