{% extends "pos/base.html" %} {% load static %} {% block content %}

Product / Stock Utilization Report Sale vs BOM Expected vs Actual Production — Variance Analysis

{# ─── Filter Form ──────────────────────────────────────────────────────────── #}
Filters
{# Date From #}
{# Date To #}
{# Company #}
{# Department #}
{# Finished Products (Select2 multi) #}
{# Raw Materials (Select2 multi) #}
{# /form-row #}
Clear
{% if has_results %} {# ─── Export Buttons ───────────────────────────────────────────────────────── #}
Export Excel (4 Sheets) Export PDF
{# ══════════════════════════════════════════════════════════════════════════ #} {# SECTION 1 — SALE SUMMARY #} {# ══════════════════════════════════════════════════════════════════════════ #}
1. Sale Summary {{ date_from }} → {{ date_to }}
{% for r in sale_summary %} {% empty %} {% endfor %} {% if sale_summary %} {% endif %}
# Product Code Product Name Company Total Sold Qty Sale Amount
{{ forloop.counter }} {{ r.code }} {{ r.name }} {{ r.company }} {{ r.total_qty|floatformat:2 }} {{ r.total_amount|floatformat:2 }}
Is date range mein koi sales nahi milein.
Totals: {{ total_sale_qty|floatformat:2 }} {{ total_sale_amt|floatformat:2 }}
{# ══════════════════════════════════════════════════════════════════════════ #} {# SECTIONS 2 & 3 — EXPECTED (LEFT) + ACTUAL (RIGHT) SIDE BY SIDE #} {# ══════════════════════════════════════════════════════════════════════════ #}
{# ── LEFT: BOM Expected ── #}
2. BOM Based Expected Utilization Total: {{ total_exp_qty|floatformat:4 }}
{% for r in expected_detail %} {% empty %} {% endfor %} {% if expected_detail %} {% endif %}
Raw Code Raw Material Company BOM Qty/Unit Sold Qty Expected Usage Fin. Item
{{ r.raw_code }} {{ r.raw_name }} {{ r.company }} {{ r.bom_qty }} {{ r.sold_qty|floatformat:2 }} {{ r.exp_qty|floatformat:4 }} {{ r.fin_code }}
Selected items ka koi BOM define nahi hai.
Total Expected: {{ total_exp_qty|floatformat:4 }}
{# ── RIGHT: Actual Utilization ── #}
3. Actual Production Utilization Total: {{ total_actual_qty|floatformat:4 }}  |  Cost: {{ total_actual_cost|floatformat:2 }}
{% for r in actual_detail %} {% empty %} {% endfor %} {% if actual_detail %} {% endif %}
Raw Code Raw Material Dept Actual Qty Unit Cost Total Cost Run #
{{ r.raw_code }} {{ r.raw_name }} {{ r.dept }} {{ r.actual_qty|floatformat:4 }} {{ r.unit_cost|floatformat:4 }} {{ r.total_cost|floatformat:2 }} {{ r.run_no }}
Is date range mein koi production run nahi mila.
Totals: {{ total_actual_qty|floatformat:4 }} {{ total_actual_cost|floatformat:2 }}
{# /row #} {# ══════════════════════════════════════════════════════════════════════════ #} {# SECTION 4 — VARIANCE ANALYSIS #} {# ══════════════════════════════════════════════════════════════════════════ #}
4. Variance Analysis   (Actual Usage − BOM Expected)
{% for r in variance_rows %} {# Row background by status #} {% empty %} {% endfor %}
# Raw Code Raw Material Name Expected Usage Actual Usage Difference Qty Diff % Status
{{ forloop.counter }} {{ r.raw_code }} {{ r.raw_name }} {{ r.expected|floatformat:4 }} {{ r.actual|floatformat:4 }} {% if r.diff > 0 %}+{% endif %}{{ r.diff|floatformat:4 }} {% if r.diff_pct != 0 %} {% if r.diff_pct > 0 %}+{% endif %}{{ r.diff_pct }}% {% else %}—{% endif %} {% if r.status == 'Normal' %} ✔ Normal {% elif r.status == 'Extra Used' %} ⬆ Extra Used {% elif r.status == 'Less Used' %} ⬇ Less Used {% elif r.status == 'Missing in Production' %} ✘ Missing in Production {% elif r.status == 'Not Defined in BOM' %} ? Not in BOM {% endif %}
Variance calculate karne ke liye pehle date range set karein.
{# Legend #}
{% elif request.GET %}
Is date range mein koi data nahi mila. Filters check karein.
{% else %}
Upar filters set karein aur Generate Report press karein.
{% endif %} {% endblock %} {% block javascripts %} {% endblock %}