Files
brewman/brewman/brewman/routers/employee_attendance.py
T
tanshu 350edf7126 Removed timezone information from columns. Time will be stored in UTC coordinates.
Moved to Sqlalchemy 1.4 model and SessionFuture.

Upgraded to Angular 12

Upgraded the python dependencies
2021-09-07 12:59:18 +05:30

124 lines
4.2 KiB
Python

import uuid
from datetime import date, datetime
import brewman.schemas.voucher as schemas
from fastapi import APIRouter, Request, Security
from sqlalchemy import select
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 SessionFuture
from ..models.attendance import Attendance
from ..models.employee import Employee
from ..routers.fingerprint import get_prints
from ..schemas.user import UserToken
from .attendance import date_range
router = APIRouter()
@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,
user: UserToken = Security(get_user, scopes=["attendance"]),
):
with SessionFuture() as db:
employee: Employee = db.execute(select(Employee).where(Employee.id == id_)).scalar_one()
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.execute(
select(Attendance).where(
Attendance.employee_id == employee.id,
Attendance.date == item,
Attendance.is_valid == True, # noqa: E712
)
)
.scalars()
.one_or_none()
)
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,
user: UserToken = Security(get_user, scopes=["attendance"]),
):
start_date = None
finish_date = None
with SessionFuture() as db:
employee: Employee = db.execute(select(Employee).where(Employee.id == id_)).scalar_one()
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),
}