"""Paperclip project creation via direct DB access (embedded PostgreSQL).""" from __future__ import annotations import logging import os import uuid import asyncpg logger = logging.getLogger(__name__) PAPERCLIP_DB_URL = os.environ.get( "PAPERCLIP_DB_URL", "postgresql://paperclip:paperclip@127.0.0.1:54329/paperclip" ) # Company IDs from Paperclip DB COMPANIES = { "licensing": "42a7acd0-30c5-4cbd-ac97-7424f65df294", # CMP — רישוי ובניה "betterment": "8639e837-4c9d-47fa-a76b-95788d651896", # CMPA — היטלי השבחה } APPEAL_TYPE_TO_COMPANY = { "רישוי": "licensing", "licensing": "licensing", "היטל השבחה": "betterment", "betterment_levy": "betterment", "פיצויים": "betterment", "compensation": "betterment", } def _get_company_id(appeal_type: str) -> str: key = APPEAL_TYPE_TO_COMPANY.get(appeal_type, "licensing") return COMPANIES[key] async def create_project( case_number: str, title: str, description: str = "", appeal_type: str = "רישוי", color: str = "#6366f1", ) -> dict: """Create a project in the Paperclip embedded DB, or return existing one.""" company_id = _get_company_id(appeal_type) prefix = "CMP" if _get_company_id(appeal_type) == COMPANIES["licensing"] else "CMPA" conn = await asyncpg.connect(PAPERCLIP_DB_URL) try: # Check for existing project with this case number existing = await conn.fetchrow( "SELECT id, name FROM projects WHERE name LIKE $1 AND company_id = $2::uuid", f"%{case_number}%", company_id, ) if existing: return { "id": str(existing["id"]), "company_id": company_id, "name": existing["name"], "url": f"https://pc.nautilus.marcusgroup.org/{prefix}/projects/{existing['id']}/issues", "existing": True, } project_id = str(uuid.uuid4()) project_name = f"ערר {case_number} — {title}"[:200] await conn.execute( """INSERT INTO projects (id, company_id, name, description, status, color) VALUES ($1, $2::uuid, $3, $4, 'backlog', $5)""", project_id, company_id, project_name, description[:500] if description else "", color, ) return { "id": project_id, "company_id": company_id, "name": project_name, "url": f"https://pc.nautilus.marcusgroup.org/{prefix}/projects/{project_id}/issues", "existing": False, } finally: await conn.close() async def get_project_url(case_number: str) -> str | None: """Find existing Paperclip project for a case number.""" conn = await asyncpg.connect(PAPERCLIP_DB_URL) try: row = await conn.fetchrow( "SELECT id, company_id FROM projects WHERE name LIKE $1", f"%{case_number}%", ) if row: prefix = "CMP" if row["company_id"] == uuid.UUID(COMPANIES["licensing"]) else "CMPA" return f"https://pc.nautilus.marcusgroup.org/{prefix}/projects/{row['id']}/issues" return None finally: await conn.close()