207 lines
8.6 KiB
Python
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()) |