Files
brewman/brewman/routers/employee_attendance.py
tanshu cda157f05c Employee Attendance Done!!
TODO: Only need to reload Attendance and Employee Attendance on Save
2020-05-14 22:13:34 +05:30

137 lines
4.3 KiB
Python

import uuid
from datetime import datetime, date
from fastapi import APIRouter, HTTPException, status, Depends, Security, Request
from sqlalchemy.orm import Session
from .attendance import date_range
from ..schemas.auth import UserToken
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal
from brewman.models.master import Employee
from brewman.models.voucher import Attendance
from brewman.routers.fingerprint import get_prints
import brewman.schemas.voucher as schemas
from ..core.session import (
get_start_date,
get_finish_date,
)
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),
}