100 lines
3.8 KiB
Python
100 lines
3.8 KiB
Python
|
|
"""
|
|||
|
|
Модуль Отпуска/Больничные
|
|||
|
|
"""
|
|||
|
|
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
|
|||
|
|
)
|
|||
|
|
|