{% set proj_start_month = proposal.start_date[5:7]|int if proposal.start_date and proposal.start_date|length >= 7 else 1 %} {% set proj_start_year = proposal.start_date[:4]|int if proposal.start_date and proposal.start_date|length >= 4 else 2025 %} {% set month_names = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] %} {% if proposal.end_date and proposal.end_date|length >= 7 %} {% set proj_end_month = proposal.end_date[5:7]|int %} {% set proj_end_year = proposal.end_date[:4]|int %} {% set total_project_months = [(proj_end_year - proj_start_year) * 12 + (proj_end_month - proj_start_month) + 1, 1]|max %} {% else %} {% set max_end = 0 %} {% for r in all_rows %} {% for bar in r.bars %} {% set row_end = bar.offset + bar.duration %} {% if row_end > max_end %}{% set max_end = row_end %}{% endif %} {% endfor %} {% endfor %} {% set total_project_months = [max_end, 1]|max %} {% endif %} {% set label_w = 168 %} {% set month_w = 36 %} {% set pad = 14 %} {% set inner_w = label_w + total_project_months * month_w %} {% set chart_w = inner_w + 2 * pad %} {% set chart_h = 2 * pad + 34 + 18 + 18 + (all_rows|length) * 19 + 6 %}

Timeline

{% set years_in_proj = ((proj_start_month - 1 + total_project_months - 1) // 12) + 1 %}
{% for y in range(years_in_proj) %} {% set abs_y = proj_start_year + y %} {% set year_start_m = [(abs_y - proj_start_year) * 12 - (proj_start_month - 1), 0]|max %} {% set year_end_m = [(y + 1) * 12 - (proj_start_month - 1), total_project_months]|min %} {% set year_span = year_end_m - year_start_m %} {% if year_span > 0 %}
{{ abs_y }}
{% endif %} {% endfor %}
{% for m_offset in range(total_project_months) %} {% set abs_m = proj_start_month + m_offset - 1 %} {% set abs_m_1based = (abs_m % 12) + 1 %} {% set is_year_start = (abs_m_1based == 1) %}
{{ month_names[abs_m_1based - 1] }}
{% endfor %}
{% for r in all_rows %}
{{ r.name }}
{% for bar in r.bars %} {% set left_pct = (bar.offset / total_project_months * 100)|round(1) if total_project_months > 0 else 0 %} {% set width_pct = (bar.duration / total_project_months * 100)|round(1) if total_project_months > 0 else 100 %}
{% endfor %}
{% endfor %}