2026-09-07 19:05:58 +02:00
{% extends "shared/frontend/base.html" %}
{% block title %}Indkøbsoversigt{% endblock %}
{% block content %}
< div class = "container-fluid py-4" >
< div class = "d-flex flex-wrap justify-content-between align-items-end gap-3 mb-4" > < div > < div class = "text-uppercase small text-primary fw-bold" > Drift · indkøb< / div > < h1 class = "h3 mb-1" > Varekø og levering< / h1 > < p class = "text-muted mb-0" > Alt, der mangler at blive bestilt, modtaget eller sendt til kunden.< / p > < / div > < button class = "btn btn-outline-primary" onclick = "loadProcurement()" > < i class = "bi bi-arrow-clockwise me-1" > < / i > Opdatér< / button > < / div >
< div class = "row g-3 mb-4" id = "procurementKpis" > < / div >
< div class = "card border-0 shadow-sm rounded-4" > < div class = "card-body p-0" > < div class = "table-responsive" > < table class = "table table-hover align-middle mb-0" > < thead class = "table-light" > < tr > < th class = "ps-4" > Status< / th > < th > Vare< / th > < th > Sag / kunde< / th > < th > Antal< / th > < th > Indkøb< / th > < th > Salgsordre< / th > < th class = "pe-4" > < / th > < / tr > < / thead > < tbody id = "procurementRows" > < tr > < td colspan = "7" class = "text-center py-5 text-muted" > Henter indkøbskø…< / td > < / tr > < / tbody > < / table > < / div > < / div > < / div >
< / div >
< script >
const stateLabel={to_order:['Skal bestilles','danger'],ordered:['Bestilt','warning'],received:['Modtaget','success']};
const money=v=>new Intl.NumberFormat('da-DK',{style:'currency',currency:'DKK'}).format(Number(v||0));
2026-11-03 01:16:12 +01:00
async function loadProcurement(){const res=await fetch('/api/v1/procurement/overview');const data=await res.json();const c=data.counts||{};const requestedState=new URLSearchParams(window.location.search).get('status');const items=(data.items||[]).filter(x=>!requestedState||x.fulfilment_state===requestedState);document.getElementById('procurementKpis').innerHTML=[['Skal bestilles',c.to_order,'danger','cart-plus'],['Bestilt',c.ordered,'warning','truck'],['Modtaget',c.received,'success','box-seam'],['Mangler salgsordre',c.missing_sales_order,'secondary','receipt']].map(([l,n,col,i])=>`< div class = "col-sm-6 col-xl-3" > < div class = "card border-0 shadow-sm rounded-4" > < div class = "card-body d-flex justify-content-between" > < div > < div class = "small text-muted" > ${l}< / div > < div class = "display-6 fw-bold text-${col}" > ${n||0}< / div > < / div > < i class = "bi bi-${i} fs-3 text-${col} opacity-75" > < / i > < / div > < / div > < / div > `).join('');document.getElementById('procurementRows').innerHTML=items.map(x=>{const s=stateLabel[x.fulfilment_state]||stateLabel.to_order;return `< tr > < td class = "ps-4" > < span class = "badge text-bg-${s[1]}" > ${s[0]}< / span > < / td > < td > < strong > ${x.description||'Uden beskrivelse'}< / strong > < div class = "small text-muted" > ${x.external_ref||'Ingen reference'}< / div > < / td > < td > < a href = "/sag/${x.sag_id}/v3" > #${x.sag_id} · ${x.case_title||''}< / a > < div class = "small text-muted" > ${x.customer_name||'Ingen kunde'}< / div > < / td > < td > ${x.quantity||'—'} ${x.unit||''}< / td > < td > ${money(x.amount)}< / td > < td > ${x.has_sales_line?'< span class = "text-success" > < i class = "bi bi-check-circle me-1" > < / i > Oprettet< / span > ':'< span class = "text-danger" > < i class = "bi bi-exclamation-circle me-1" > < / i > Mangler< / span > '}< / td > < td class = "pe-4" > < a class = "btn btn-sm btn-outline-primary" href = "/sag/${x.sag_id}/v3?tab=sales" > Åbn sag< / a > < / td > < / tr > `}).join('')||'< tr > < td colspan = "7" class = "text-center py-5 text-success" > Ingen linjer matcher filteret.< / td > < / tr > '}
2026-09-07 19:05:58 +02:00
loadProcurement();
< / script >
{% endblock %}