{% extends "base.html" %} {% block title %}OT Attendance · {{ month_name }} · WageWise Neo{% endblock %} {% block content %}
Enter OT in hours, using decimals for part hours — e.g. 1, 0.5, or 1.5.
{% if all_employees %}

OT Opt-in for {{ month_name }}

Tick to include in OT this month.
{% for emp in all_employees %} {% set is_opted = emp.id in opted_this_month %} {% endfor %}
{% endif %}

Highlighted columns = Weekly Off ({{ weekly_off_name }}, set in Company Settings). OT can still be entered on a highlighted day if worked.

{% if employees %}
{% for d in range(1, days_in_month + 1) %} {% set is_future = d > max_editable_day %} {% set day_title = "Future date — OT can't be entered yet" if is_future else "" %} {% endfor %} {% for emp in employees %} {% for d in range(1, days_in_month + 1) %} {% set ot = ot_map.get((emp.id, d), {}) %} {% set mh = ot.get('morning_hours', 0) if ot else 0 %} {% set is_future = d > max_editable_day %} {% endfor %} {% for d in range(1, days_in_month + 1) %} {% set ot = ot_map.get((emp.id, d), {}) %} {% set eh = ot.get('evening_hours', 0) if ot else 0 %} {% set is_future = d > max_editable_day %} {% endfor %} {% endfor %}
Employee {{ d }}
{{ day_dow.get(d, '') }}
Total
M / E Hrs
Total
Hrs
OT Pay
{{ emp.full_name }}
₹{{ "{:,.0f}".format(emp.overtime_rate_per_hour) }}/hr
M {% set tm = namespace(val=0) %}{% set te = namespace(val=0) %} {% for d4 in range(1, days_in_month+1) %} {% set ot4 = ot_map.get((emp.id, d4), {}) %} {% if ot4 %}{% set tm.val = tm.val + ot4.get('morning_hours',0) %}{% set te.val = te.val + ot4.get('evening_hours',0) %}{% endif %} {% endfor %} M: {{ "{:.1f}".format(tm.val) }}
E: {{ "{:.1f}".format(te.val) }}
{% set total = namespace(val=0) %} {% for d2 in range(1, days_in_month+1) %} {% set ot2 = ot_map.get((emp.id, d2), {}) %} {% if ot2 %}{% set total.val = total.val + ot2.get('morning_hours',0) + ot2.get('evening_hours',0) %}{% endif %} {% endfor %} {{ "{:.1f}".format(total.val) }} {% set total2 = namespace(val=0) %} {% for d3 in range(1, days_in_month+1) %} {% set ot3 = ot_map.get((emp.id, d3), {}) %} {% if ot3 %}{% set total2.val = total2.val + ot3.get('morning_hours',0) + ot3.get('evening_hours',0) %}{% endif %} {% endfor %} ₹{{ "{:,.0f}".format(total2.val * emp.overtime_rate_per_hour) }}
E

Monthly OT Summary

{% set grand_hrs = namespace(val=0) %}{% set grand_pay = namespace(val=0) %} {% for emp in employees %} {% set tot = namespace(val=0) %} {% for d in range(1, days_in_month+1) %} {% set ot = ot_map.get((emp.id, d), {}) %} {% if ot %}{% set tot.val = tot.val + ot.get('morning_hours',0) + ot.get('evening_hours',0) %}{% endif %} {% endfor %} {% set pay = tot.val * emp.overtime_rate_per_hour %} {% set grand_hrs.val = grand_hrs.val + tot.val %} {% set grand_pay.val = grand_pay.val + pay %} {% endfor %}
Employee Rate / hr Total OT Hours OT Pay Included in Gross?
{{ emp.full_name }} ₹{{ emp.overtime_rate_per_hour }} {{ "{:.1f}".format(tot.val) }} ₹{{ "{:,.0f}".format(pay) }} {{ 'Yes — in PF/ESI' if emp.ot_in_gross else 'No — bank only' }}
Grand Total {{ "{:.1f}".format(grand_hrs.val) }} hrs ₹{{ "{:,.0f}".format(grand_pay.val) }}
Discard
{% else %}

No employees have OT opted in. Enable OT from the employee record (Edit → OT & Commission tab).

Go to Employees
{% endif %} {% endblock %}