71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
"""
|
|
===============================================================================
|
|
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"} |