brewman/brewman/brewman/routers/employee_attendance.py

138 lines
4.2 KiB
Python
Raw Normal View History

import uuid
2020-10-07 15:18:43 +00:00
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
2020-10-07 15:18:43 +00:00
from ..core.security import get_current_active_user as get_user
2020-10-07 15:18:43 +00:00
from ..core.session import get_finish_date, get_start_date
from ..db.session import SessionLocal
2020-10-07 15:18:43 +00:00
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(
2020-10-07 15:18:43 +00:00
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(
2020-10-07 15:18:43 +00:00
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()
2020-10-07 16:59:24 +00:00
start_date = (
employee.joining_date if employee.joining_date > start_date else start_date
)
finish_date = (
2020-10-07 16:59:24 +00:00
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
2020-10-07 16:59:24 +00:00
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(
2020-10-07 15:18:43 +00:00
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),
}