"""종류별 프로젝트 행 만들기 — D 예정노선 · E 안정성평가(요구 345). 임도설계(ROAD)는 B02 그대로. 저장소 경로 · 초기 폴더는 B02 함수를 그대로 씀. """ from __future__ import annotations from datetime import datetime from typing import Any from uuid import uuid4 from B02_ProjRegister.B02_ProjRegister_Repository import ( _build_project_storage, _initialize_project_storage, ) from common_util.common_util_audit import record_audit from common_util.common_util_storage import get_project_stage_path from common_util.common_util_workflow_state import initialize_project_stages from config.config_db import get_db_pool KIND_STAGE_DIRS = { "PLAN": ("D02_PlanBase", "D03_PlanAnalysis", "D04_PlanConfirm"), "STABILITY": ( "E02_StabGround", "E03_StabSection", "E04_Stab3D", "E05_StabReport", "E06_StabRock", "E07_StabArea", ), } async def create_kind_project( *, request: Any | None, user_id: int, company_id: int, kind: str, name: str, region: str | None, road_type: str | None, project_year: int | None, project_year_end: int | None = None, design_speed_kph: int | None = None, route_start_m: float | None = None, route_end_m: float | None = None, source_project_id: str | None = None, ) -> str: """projects 행 + 참여자 + 종류별 단계 + 저장소 폴더 → 새 project_id.""" project_id = str(uuid4()) storage_path, project_root = _build_project_storage(company_id, user_id, project_id) now = datetime.utcnow() async with get_db_pool().acquire() as connection, connection.cursor() as cursor: try: await connection.begin() await cursor.execute( """ INSERT INTO projects ( id, user_id, company_id, name, region, road_type, project_kind, project_year, project_year_end, design_speed_kph, route_start_m, route_end_m, status, crs_epsg, storage_path, source_project_id, source_copied_at, created_at, updated_at ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 'NEW', 5178, %s, %s, %s, %s, %s) """, ( project_id, user_id, company_id, name, region, road_type, kind, project_year, project_year_end, design_speed_kph, route_start_m, route_end_m, storage_path, source_project_id, now if source_project_id else None, now, now, ), ) await cursor.execute( "INSERT IGNORE INTO project_members (project_id, user_id) VALUES (%s, %s)", (project_id, user_id), ) await initialize_project_stages(cursor, project_id, kind) await record_audit( cursor, actor_id=user_id, action="PROJECT_CREATE", resource_type="project", resource_ref=project_id, request=request, ) _initialize_project_storage(project_root, project_id) for stage_dir in KIND_STAGE_DIRS[kind]: get_project_stage_path(str(project_root), stage_dir) await connection.commit() except Exception: await connection.rollback() raise return project_id