from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from datetime import datetime from typing import List from database.database import get_db from database.models import Issue, User, ReviewStatus from database.schemas import ( ManagementUpdateRequest, AdditionalInfoUpdateRequest, Issue as IssueSchema ) from routers.auth import get_current_user from routers.page_permissions import check_page_access router = APIRouter(prefix="/api/management", tags=["management"]) @router.get("/", response_model=List[IssueSchema]) async def get_management_issues( current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """ 관리함 - 진행 중 및 완료된 부적합 목록 조회 """ # 관리함 페이지 권한 확인 if not check_page_access(current_user.id, 'issues_management', db): raise HTTPException(status_code=403, detail="관리함 접근 권한이 없습니다.") # 진행 중 또는 완료된 이슈들 조회 issues = db.query(Issue).filter( Issue.review_status.in_([ReviewStatus.in_progress, ReviewStatus.completed]) ).order_by(Issue.reviewed_at.desc()).all() return issues @router.put("/{issue_id}/additional-info") async def update_additional_info( issue_id: int, additional_info: AdditionalInfoUpdateRequest, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """ 추가 정보 업데이트 (원인부서, 해당자 상세, 원인 상세) """ # 관리함 페이지 권한 확인 if not check_page_access(current_user.id, 'issues_management', db): raise HTTPException(status_code=403, detail="관리함 접근 권한이 없습니다.") # 이슈 조회 issue = db.query(Issue).filter(Issue.id == issue_id).first() if not issue: raise HTTPException(status_code=404, detail="부적합을 찾을 수 없습니다.") # 진행 중 상태인지 확인 if issue.review_status != ReviewStatus.in_progress: raise HTTPException(status_code=400, detail="진행 중 상태의 부적합만 추가 정보를 입력할 수 있습니다.") # 추가 정보 업데이트 update_data = additional_info.dict(exclude_unset=True) for field, value in update_data.items(): setattr(issue, field, value) # 추가 정보 입력 시간 및 입력자 기록 issue.additional_info_updated_at = datetime.now() issue.additional_info_updated_by_id = current_user.id db.commit() db.refresh(issue) return { "message": "추가 정보가 성공적으로 업데이트되었습니다.", "issue_id": issue.id, "updated_at": issue.additional_info_updated_at, "updated_by": current_user.username } @router.get("/{issue_id}/additional-info") async def get_additional_info( issue_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """ 추가 정보 조회 """ # 관리함 페이지 권한 확인 if not check_page_access(current_user.id, 'issues_management', db): raise HTTPException(status_code=403, detail="관리함 접근 권한이 없습니다.") # 이슈 조회 issue = db.query(Issue).filter(Issue.id == issue_id).first() if not issue: raise HTTPException(status_code=404, detail="부적합을 찾을 수 없습니다.") return { "issue_id": issue.id, "cause_department": issue.cause_department.value if issue.cause_department else None, "responsible_person_detail": issue.responsible_person_detail, "cause_detail": issue.cause_detail, "additional_info_updated_at": issue.additional_info_updated_at, "additional_info_updated_by_id": issue.additional_info_updated_by_id }