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