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), }