""" =============================================================================== FILE: modules/web_api/routers/manual_absences.py ROLE: REST API эндпоинты для реестров "Мест. командир.", "Иное" и автокомплита. =============================================================================== """ from fastapi import APIRouter, HTTPException, Query from pydantic import BaseModel from typing import Optional, List, Dict, Any from services.manual_absences_repo import ( search_staff_suggestions, get_static_reasons, add_manual_absence, delete_manual_absence, get_manual_absences_list ) router = APIRouter(prefix="/api/v1/manual-absences", tags=["Manual Absences"]) class AddAbsenceRequest(BaseModel): absence_type: str # 'LOCAL_TRIP' или 'OTHER' fio: str reason: Optional[str] = "" department: Optional[str] = "" position: Optional[str] = "" date_start: Optional[str] = None date_end: Optional[str] = None comment: Optional[str] = "" @router.get("/staff-autocomplete") def api_staff_autocomplete(q: str = Query(..., min_length=2)): return search_staff_suggestions(q) @router.get("/reasons") def api_get_reasons(): return {"reasons": get_static_reasons()} @router.get("/") def api_list_manual_absences(type: Optional[str] = None): return {"items": get_manual_absences_list(type)} @router.post("/") def api_add_manual_absence(req: AddAbsenceRequest): reason = req.reason or ("Местная командировка" if req.absence_type == "LOCAL_TRIP" else "Иное") res_id = add_manual_absence( absence_type=req.absence_type, fio=req.fio, reason=reason, department=req.department, position=req.position, date_start=req.date_start, date_end=req.date_end, comment=req.comment ) if not res_id: raise HTTPException(status_code=400, detail="Не удалось добавить запись") return {"status": "success", "id": res_id} @router.delete("/{item_id}") def api_delete_manual_absence(item_id: int): if not delete_manual_absence(item_id): raise HTTPException(status_code=404, detail="Запись не найдена") return {"status": "success"} class UpdateAbsenceDatesRequest(BaseModel): id: int date_start: Optional[str] = None date_end: Optional[str] = None @router.put("/{item_id}") def api_update_manual_absence(item_id: int, req: UpdateAbsenceDatesRequest): with get_connection() as conn: cursor = conn.cursor() cursor.execute(""" UPDATE manual_absences SET date_start = ?, date_end = ? WHERE id = ? """, (req.date_start, req.date_end, item_id)) conn.commit() return {"status": "success"}