brewman/brewman/brewman/routers/employee_attendance.py

138 lines
4.2 KiB
Python

import uuid
from datetime import date, datetime
import brewman.schemas.voucher as schemas
from fastapi import APIRouter, Depends, HTTPException, Request, Security, status
from sqlalchemy.orm import Session
from ..core.security import get_current_active_user as get_user
from ..core.session import get_finish_date, get_start_date
from ..db.session import SessionLocal
from ..models.master import Employee
from ..models.voucher import Attendance
from ..routers.fingerprint import get_prints
from ..schemas.auth import UserToken
from .attendance import date_range
router = APIRouter()
# Dependency
def get_db() -> Session:
try:
db = SessionLocal()
yield db
finally:
db.close()
@router.get("", response_model=schemas.EmployeeAttendance)
def show_blank(
request: Request,
user: UserToken = Security(get_user, scopes=["attendance"]),
):
return {
"startDate": get_start_date(request.session),
"finishDate": get_finish_date(request.session),
"employee": None,
"body": [],
}
@router.get("/{id_}", response_model=schemas.EmployeeAttendance)
def employee_attendance_report(
id_: uuid.UUID,
request: Request,
s: str = None,
f: str = None,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["attendance"]),
):
employee: Employee = db.query(Employee).filter(Employee.id == id_).first()
if employee is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Employee not found",
)
start_date = s if s is not None else get_start_date(request.session)
finish_date = f if f is not None else get_finish_date(request.session)
info = {
"startDate": start_date,
"finishDate": finish_date,
"employee": {"id": employee.id, "name": employee.name},
}
start_date = datetime.strptime(start_date, "%d-%b-%Y").date()
finish_date = datetime.strptime(finish_date, "%d-%b-%Y").date()
start_date = (
employee.joining_date if employee.joining_date > start_date else start_date
)
finish_date = (
employee.leaving_date
if not employee.is_active and employee.leaving_date < finish_date
else finish_date
)
info["body"] = employee_attendance(employee, start_date, finish_date, db)
return info
def employee_attendance(
employee: Employee, start_date: date, finish_date: date, db: Session
):
list_ = []
for item in date_range(start_date, finish_date, inclusive=True):
att = (
db.query(Attendance)
.filter(Attendance.employee_id == employee.id)
.filter(Attendance.date == item)
.filter(Attendance.is_valid == True)
.first()
)
att = 0 if att is None else att.attendance_type
prints, hours_worked, full_day = get_prints(employee.id, item, db)
list_.append(
schemas.EmployeeAttendanceItem(
date=item.strftime("%d-%b-%Y"),
attendanceType={"id": att},
prints=prints,
hoursWorked=hours_worked,
fullDay=full_day,
)
)
return list_
@router.post("/{id_}", response_model=schemas.EmployeeAttendance)
def save_employee_attendance(
id_: uuid.UUID,
data: schemas.EmployeeAttendance,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["attendance"]),
):
start_date = None
finish_date = None
employee: Employee = db.query(Employee).filter(Employee.id == id_).first()
for item in data.body:
if start_date is None:
start_date = item.date_
finish_date = item.date_
attendance_type = item.attendance_type.id_
if attendance_type != 0:
attendance = Attendance(
employee_id=employee.id,
date=item.date_,
attendance_type=attendance_type,
user_id=user.id_,
)
attendance.create(db)
db.commit()
return {
"startDate": start_date.strftime("%d-%b-%Y"),
"finishDate": finish_date.strftime("%d-%b-%Y"),
"employee": {"id": employee.id, "name": employee.name},
"body": employee_attendance(employee, start_date, finish_date, db),
}