Files
dash/backend/app/api/v1/leave.py

100 lines
3.8 KiB
Python
Raw Normal View History

"""
Модуль Отпуска/Больничные
"""
from fastapi import APIRouter, Depends, Query, HTTPException, status
from sqlalchemy.orm import Session
from datetime import date
from typing import List
from app.core.database import get_service_db
from app.core.security import get_current_user, get_admin_user
from app.models.service_db import AppUser, LeaveEvent
from app.schemas.leave import LeaveEventCreate, LeaveEventResponse
router = APIRouter()
@router.get("/events", response_model=List[LeaveEventResponse])
async def get_leave_events(
start_date: date = Query(..., description="Начальная дата"),
end_date: date = Query(..., description="Конечная дата"),
current_user: AppUser = Depends(get_current_user),
db: Session = Depends(get_service_db)
):
"""
Получение списка событий отпусков и больничных за период
"""
if start_date > end_date:
raise HTTPException(status_code=400, detail="Начальная дата должна быть раньше конечной")
events = db.query(LeaveEvent).filter(
LeaveEvent.start_date <= end_date,
LeaveEvent.end_date >= start_date
).all()
result = []
for event in events:
result.append(LeaveEventResponse(
id=event.id,
user_id=event.user_id,
user_login=event.user.login if event.user else None,
start_date=event.start_date,
end_date=event.end_date,
leave_type=event.leave_type,
created_at=event.created_at.isoformat() if event.created_at else None
))
return result
@router.post("/events", response_model=LeaveEventResponse, status_code=status.HTTP_201_CREATED)
async def create_leave_event(
event_data: LeaveEventCreate,
admin_user: AppUser = Depends(get_admin_user),
db: Session = Depends(get_service_db)
):
"""
Создание нового события отпуска/больничного (только для администраторов)
"""
if event_data.start_date > event_data.end_date:
raise HTTPException(status_code=400, detail="Начальная дата должна быть раньше конечной")
# Проверка существования пользователя
user = db.query(AppUser).filter(AppUser.id == event_data.user_id).first()
if not user:
raise HTTPException(status_code=404, detail="Пользователь не найден")
# Проверка на пересечение с существующими событиями
overlapping = db.query(LeaveEvent).filter(
LeaveEvent.user_id == event_data.user_id,
LeaveEvent.start_date <= event_data.end_date,
LeaveEvent.end_date >= event_data.start_date
).first()
if overlapping:
raise HTTPException(
status_code=400,
detail="Уже существует событие в этом периоде для данного пользователя"
)
new_event = LeaveEvent(
user_id=event_data.user_id,
start_date=event_data.start_date,
end_date=event_data.end_date,
leave_type=event_data.leave_type
)
db.add(new_event)
db.commit()
db.refresh(new_event)
return LeaveEventResponse(
id=new_event.id,
user_id=new_event.user_id,
user_login=new_event.user.login if new_event.user else None,
start_date=new_event.start_date,
end_date=new_event.end_date,
leave_type=new_event.leave_type,
created_at=new_event.created_at.isoformat() if new_event.created_at else None
)