Files
brewman/brewman/routers/attendance_report.py
tanshu 9c9f0dfdd6 Renamed Service Charges to Incentives including account fixture and permission
replaced my custom ValidationErro with FastAPI HTTPException
Fixed?:
 Attendance
 Employee Attendance
2020-05-12 20:52:07 +05:30

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