88 lines
2.8 KiB
Python
88 lines
2.8 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"}
|
|
|
|
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"} |