replaced my custom ValidationErro with FastAPI HTTPException Fixed?: Attendance Employee Attendance
61 lines
2.3 KiB
Python
61 lines
2.3 KiB
Python
import datetime
|
|
from sqlalchemy import or_
|
|
from ..models.master import AttendanceType, Employee
|
|
from ..models.voucher import Attendance
|
|
from .attendance import date_range
|
|
from ..core.session import get_start_date, get_finish_date
|
|
|
|
from fastapi import APIRouter
|
|
|
|
router = APIRouter()
|
|
|
|
@router.get("/") # "Attendance", renderer="csv"
|
|
def get_report(request):
|
|
start_date = request.GET.get("StartDate", get_start_date(request))
|
|
finish_date = request.GET.get("FinishDate", get_finish_date(request))
|
|
start_date = datetime.datetime.strptime(start_date, "%d-%b-%Y")
|
|
finish_date = datetime.datetime.strptime(finish_date, "%d-%b-%Y")
|
|
header, report = attendance_record(start_date, finish_date, request.dbsession)
|
|
return {"header": header, "rows": report, "filename": "Attendance Record.csv"}
|
|
|
|
|
|
def attendance_record(start_date, finish_date, dbsession):
|
|
report = []
|
|
header = ["Code", "Name", "Designation", "Department", "Salary", "SC Points"]
|
|
for date in date_range(start_date, finish_date, inclusive=True):
|
|
header.append(date.strftime("%d-%b"))
|
|
|
|
not_set = AttendanceType.by_id(0)
|
|
employees = (
|
|
dbsession.query(Employee)
|
|
.filter(Employee.joining_date <= finish_date)
|
|
.filter(or_(Employee.is_active, Employee.leaving_date >= start_date))
|
|
.order_by(Employee.cost_centre_id)
|
|
.order_by(Employee.designation)
|
|
.order_by(Employee.name)
|
|
.all()
|
|
)
|
|
for employee in employees:
|
|
row_display = [
|
|
employee.code,
|
|
employee.name,
|
|
employee.designation,
|
|
employee.cost_centre.name,
|
|
employee.salary,
|
|
employee.points,
|
|
]
|
|
row_value = ["", "", "", "", employee.salary, employee.points]
|
|
for date in date_range(start_date, finish_date, inclusive=True):
|
|
att = (
|
|
dbsession.query(Attendance)
|
|
.filter(Attendance.employee_id == employee.id)
|
|
.filter(Attendance.date == date)
|
|
.filter(Attendance.is_valid == True)
|
|
.first()
|
|
)
|
|
att = not_set if att is None else AttendanceType.by_id(att.attendance_type)
|
|
row_display.append(att.name)
|
|
row_value.append(att.value)
|
|
report.extend([tuple(row_display), tuple(row_value)])
|
|
return header, report
|