The batch form refuses to type over a QC status or move a failed batch, and the lineage formset refuses an allocation the intake cannot support. The origin-facility help text and the QC status card now describe what the form actually does, and buyer POSTs to the create and edit screens are refused.
88 lines
3.3 KiB
HTML
88 lines
3.3 KiB
HTML
{% extends 'ops/base_ops.html' %}
|
|
{% block title %}Batches - IXG Operations{% endblock %}
|
|
{% block content %}
|
|
|
|
<div class="page-header d-flex justify-content-between align-items-center">
|
|
<h2>Processing Batches</h2>
|
|
<div>
|
|
<span class="text-secondary me-2">{{ page_obj.paginator.count }} total</span>
|
|
<a href="{% url 'ops:batch_create' %}" class="btn btn-sm btn-primary"><i class="bi bi-plus-lg"></i> New batch</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="filter-bar">
|
|
<form method="get" class="row g-2 align-items-end">
|
|
<div class="col-auto">
|
|
<input type="text" name="q" class="form-control form-control-sm" placeholder="Search reference..." value="{{ current_q }}">
|
|
</div>
|
|
<div class="col-auto">
|
|
<select name="status" class="form-select form-select-sm">
|
|
<option value="">All Statuses</option>
|
|
{% for val, label in status_choices %}
|
|
<option value="{{ val }}" {% if current_status == val %}selected{% endif %}>{{ label }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div class="col-auto">
|
|
<select name="grade" class="form-select form-select-sm">
|
|
<option value="">All Grades</option>
|
|
{% for val, label in grade_choices %}
|
|
<option value="{{ val }}" {% if current_grade == val %}selected{% endif %}>{{ label }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div class="col-auto">
|
|
<button type="submit" class="btn btn-sm btn-primary">Filter</button>
|
|
<a href="{% url 'ops:batch_list' %}" class="btn btn-sm btn-outline-secondary">Clear</a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="stat-card p-0">
|
|
<table class="table table-hover mb-0">
|
|
<thead>
|
|
<tr>
|
|
<th>Reference</th>
|
|
<th>Grade</th>
|
|
<th>Weight (kg)</th>
|
|
<th>Status</th>
|
|
<th>Harvest Date</th>
|
|
<th>Created</th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for b in batches %}
|
|
<tr>
|
|
<td><strong>{{ b.batch_reference }}</strong></td>
|
|
<td>{{ b.grade|default:'-' }}</td>
|
|
<td>{{ b.weight_kg|default:'-' }}</td>
|
|
<td><span class="badge bg-secondary badge-status">{{ b.get_status_display }}</span></td>
|
|
<td>{{ b.harvest_date|date:'d/m/Y'|default:'-' }}</td>
|
|
<td>{{ b.created_at|date:'d/m/Y' }}</td>
|
|
<td><a href="{% url 'ops:batch_detail' b.pk %}" class="btn btn-sm btn-outline-primary">View</a></td>
|
|
</tr>
|
|
{% empty %}
|
|
<tr><td colspan="7" class="text-muted text-center py-3">No batches found</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
{% if page_obj.paginator.num_pages > 1 %}
|
|
<nav class="mt-3">
|
|
<ul class="pagination pagination-sm justify-content-center">
|
|
{% if page_obj.has_previous %}
|
|
<li class="page-item"><a class="page-link" href="?page=1">«</a></li>
|
|
<li class="page-item"><a class="page-link" href="?page="{{ page_obj.previous_page_number }}>{{ page_obj.previous_page_number }}</a></li>
|
|
{% endif %}
|
|
<li class="page-item active"><span class="page-link">{{ page_obj.number }}</span></li>
|
|
{% if page_obj.has_next %}
|
|
<li class="page-item"><a class="page-link" href="?page="{{ page_obj.next_page_number }}>{{ page_obj.next_page_number }}</a></li>
|
|
<li class="page-item"><a class="page-link" href="?page="{{ page_obj.paginator.num_pages }}>»</a></li>
|
|
{% endif %}
|
|
</ul>
|
|
</nav>
|
|
{% endif %}
|
|
|
|
{% endblock %}
|