{% extends "base.html" %} {% load static %} {% block title %}{{ meta_title }}{% endblock %} {% block content %}

Trip workflow

{{ page_heading }}

Capture the route, odometer readings, and audit-ready timestamps in one place.

{% csrf_token %} {% if form.non_field_errors %}
{{ form.non_field_errors }}
{% endif %}
{{ form.date }}
Past dates are supported for retroactive entries.
{% for error in form.date.errors %}
{{ error }}
{% endfor %}
{{ form.start_time }} {% for error in form.start_time.errors %}
{{ error }}
{% endfor %}
{{ form.end_time }} {% for error in form.end_time.errors %}
{{ error }}
{% endfor %}
{{ form.start_location }} {% for error in form.start_location.errors %}
{{ error }}
{% endfor %}
{{ form.end_location }} {% for error in form.end_location.errors %}
{{ error }}
{% endfor %}
{{ form.business_purpose }}
{{ form.business_purpose.help_text }}
{% for error in form.business_purpose.errors %}
{{ error }}
{% endfor %}
{{ form.trip_type }} {% for error in form.trip_type.errors %}
{{ error }}
{% endfor %}
{{ form.start_odometer }}
{% if latest_end_odometer %}Suggested from your most recent ending odometer: {{ latest_end_odometer }} miles.{% else %}Optional, but recommended for audit-ready logs.{% endif %}
{% for error in form.start_odometer.errors %}
{{ error }}
{% endfor %}
{{ form.end_odometer }} {% for error in form.end_odometer.errors %}
{{ error }}
{% endfor %}
{{ form.distance_miles }}
{{ form.distance_miles.help_text }}
{% for error in form.distance_miles.errors %}
{{ error }}
{% endfor %}
Enter both locations to calculate route mileage.
{{ form.update_end_odometer_from_map }}
{{ form.update_end_odometer_from_map.help_text }}
{{ form.notes }} {% for error in form.notes.errors %}
{{ error }}
{% endfor %}

Audit trail

Timestamp controls

{{ form.created_at_override }}
{{ form.created_at_override.help_text }}
{% for error in form.created_at_override.errors %}
{{ error }}
{% endfor %}
{{ form.updated_at_override }}
{{ form.updated_at_override.help_text }}
{% for error in form.updated_at_override.errors %}
{{ error }}
{% endfor %}
{% if trip %}

Current stored timestamps: created {{ trip.created_at|date:"M j, Y g:i A" }} ยท updated {{ trip.updated_at|date:"M j, Y g:i A" }}

{% endif %}
Back to trip list

How mileage is chosen

1. Odometer first

If both start and end odometer readings are present, MileLedger saves that difference as the primary trip distance.

2. Google Maps fallback

If odometer readings are incomplete, the distance field stores the Google Maps estimate instead.

3. Human review stays in control

You can edit route miles, adjust timestamps, and confirm the ending odometer before saving.

{% endblock %} {% block scripts %} {% endblock %}