feat(turnstile): двухконтурный учет СКУД, реестры исключений с автокомплитом 1С и калибровка таймзон
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
"""
|
||||
===============================================================================
|
||||
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"}
|
||||
Reference in New Issue
Block a user