ixg_platform/templates/portal/compliance.html
ixgadmin 08096e168f P99C: compliance automation - CoA auto-generation and EUDR due diligence
- Versioned product specification table (Unrefined Shea Butter v1.0 seed) with
  spec-based QC evaluation replacing hard-coded thresholds
- Structured QC results with test methods and four-eyes verification
  (submitter cannot self-approve)
- reportlab IXG Quality Summary PDF auto-generated on quality approval,
  SHA-256 hashed; original independent lab PDF kept authoritative
- CertificateOfAnalysis version/status/hash/approval/supersede lifecycle;
  commercial release publishes to buyers and triggers notification
- EUDR evidence workflow: Facility, OriginZone, CollectorGroup, HarvestIntake,
  IntakeBatchLineage, DueDiligenceCase, EUDREvidence, RiskAssessment,
  MitigationAction, DueDiligenceStatementReference with rule-based
  completeness check and risk assessment (no AI legal conclusions)
- Ops portal: QC Approvals, CoA Reviews, EUDR Compliance screens
- Buyer portal: /portal/compliance page
- 22 automated tests covering four-eyes, CAPA, PDF+hash, publish/notify,
  EUDR blocks and buyer isolation
2026-08-05 13:58:39 +00:00

62 lines
2.7 KiB
HTML

{% extends 'portal/base_portal.html' %}
{% block title %}Compliance - IXG Buyer Portal{% endblock %}
{% block content %}
<div class="page-header d-flex justify-content-between align-items-center">
<h2>Compliance</h2>
<span class="text-secondary">Approved evidence for your batches</span>
</div>
<div class="alert alert-light border py-2 small">
<i class="bi bi-info-circle"></i> Shea butter is not listed in EUDR Annex I; the due-diligence status shown here is
evidence and buyer assurance provided by IXG, not an EU-mandated filing.
</div>
<div class="row g-3">
<div class="col-md-7">
<div class="stat-card">
<h6 class="mb-3"><i class="bi bi-file-earmark-medical"></i> Certificates of Analysis (approved)</h6>
<table class="table table-sm mb-0">
<thead><tr><th>Batch</th><th>Product</th><th>Issued</th><th>Download</th></tr></thead>
<tbody>
{% for c in approved_coas %}
<tr>
<td><strong>{{ c.batch.batch_reference }}</strong></td>
<td>Unrefined Shea Butter</td>
<td>{{ c.issue_date|date:'d/m/Y'|default:'-' }}</td>
<td><a href="{{ c.file_url }}" target="_blank" class="btn btn-sm btn-outline-success"><i class="bi bi-download"></i> PDF</a></td>
</tr>
{% empty %}
<tr><td colspan="4" class="text-muted text-center py-3">No approved certificates available</td></tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="col-md-5">
<div class="stat-card">
<h6 class="mb-3"><i class="bi bi-shield-check"></i> EUDR Due Diligence Status</h6>
<table class="table table-sm mb-0">
<thead><tr><th>Batch</th><th>Status</th><th>Risk</th></tr></thead>
<tbody>
{% for c in eudr_cases %}
<tr>
<td><strong>{{ c.batch.batch_reference }}</strong></td>
<td><span class="badge
{% if c.status == 'approved' %}bg-success
{% elif c.status == 'rejected' %}bg-danger
{% elif c.status == 'complete_for_review' %}bg-primary
{% elif c.status == 'mitigation_required' or c.status == 'risk_identified' %}bg-warning text-dark
{% else %}bg-secondary{% endif %}">{{ c.get_status_display }}</span></td>
<td><span class="badge {% if c.risk_level == 'high' %}bg-danger{% elif c.risk_level == 'low' %}bg-success{% else %}bg-info text-dark{% endif %}">{{ c.get_risk_level_display }}</span></td>
</tr>
{% empty %}
<tr><td colspan="3" class="text-muted text-center py-3">No due-diligence cases recorded</td></tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endblock %}