{% extends "base.html" %} {% block content %}

Self Punch – {{ (selected_date or today).strftime('%d %b %Y') }}

{{ csrf_token() if csrf_token is defined }}
You can mark previous days punch only if salary is not processed for that month.

Next punch will be treated as: {{ next_dir }}

{% if day_summary.has_data %}

Day: IN {% if day_summary.check_in %} {{ day_summary.check_in.strftime('%H:%M') }}{% else %}-{% endif %}   | OUT {% if day_summary.check_out %} {{ day_summary.check_out.strftime('%H:%M') }}{% else %}-{% endif %}   | Hours: {% if day_summary.total_hours is not none %} {{ "%.2f"|format(day_summary.total_hours) }} {% else %}-{% endif %}

{% endif %}
Captured image preview: Captured
Or upload an existing photo (EXIF will be checked for timestamp).
Please take a clear selfie. Punch will be counted only after manager approval.
Punches – {{ (selected_date or today).strftime('%d %b %Y') }} Self punches need manager approval
{% if todays_punches %} {% for p in todays_punches %} {% endfor %} {% else %} {% endif %}
Time Direction Location Photo Status
{{ p.punch_time.strftime('%H:%M:%S') }} {{ p.direction|upper }} {% if p.latitude and p.longitude %} {{ p.location_note or ("%.5f"|format(p.latitude) ~ ", " ~ "%.5f"|format(p.longitude)) }} {% elif p.location_note %} {{ p.location_note }} {% else %} Not captured {% endif %} {% if p.photo_path %} Photo {% else %} No photo {% endif %} {% set is_self = (p.source_name == 'self') %} {% set status = p.approval_status or ('auto' if not is_self else 'pending') %} {% if is_self %} {% if status == 'approved' %} Approved {% elif status == 'rejected' %} Rejected {% else %} Pending {% endif %} {% else %} Device {% endif %}
No punches yet for this day.
Self punches will be considered in attendance only after manager approval. View monthly details
{% endblock %}