138 lines
4.2 KiB
Python
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),
|
|
}
|