Izveštaji: prometni list magacina i stanje zaliha

- Prometni list: sve promene magacina po periodu (filter od/do datuma),
  bojama označeni tipovi promena (ulaz/prodaja/servis/povraćaj/korekcija)
- Stanje zaliha: svi artikli sa stanjem, min. količinom, cenama i
  ukupnom vrednošću zalihe; kritične zalihe istaknute crvenom bojom
- Brzi linkovi na oba izveštaja sa glavne stranice izveštaja
This commit is contained in:
2026-06-19 19:53:06 +02:00
parent 4cf061e89a
commit a3c68632be
9 changed files with 353 additions and 1 deletions
+6
View File
@@ -22,6 +22,12 @@
{{define "sadrzaj"}}
<div class="kolona" style="gap:20px;">
<!-- brzi linkovi ka magacinskim izveštajima -->
<div style="display:flex;gap:10px;flex-wrap:wrap;">
<a href="/izvestaji/prometni-list" class="btn-sekundarno">Prometni list magacina</a>
<a href="/izvestaji/stanje-zaliha" class="btn-sekundarno">Stanje zaliha</a>
</div>
<!-- 1. mesečni prihod -->
<div class="kartica izv-sekcija animiraj">
<div style="display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-bottom:4px;">
+88
View File
@@ -0,0 +1,88 @@
{{template "base" .}}
{{define "naslov"}}Prometni list — NTech{{end}}
{{define "sadrzaj"}}
<div class="kolona" style="gap:16px;">
<!-- filter perioda -->
<div class="kartica animiraj">
<form method="GET" action="/izvestaji/prometni-list" style="display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap;">
<div>
<label class="polje-labela">Od datuma</label>
<input type="date" name="od" value="{{.Od}}" style="width:160px;">
</div>
<div>
<label class="polje-labela">Do datuma</label>
<input type="date" name="do" value="{{.Do}}" style="width:160px;">
</div>
<button type="submit" class="btn-primarno">Prikaži</button>
<a href="/izvestaji" class="btn-sekundarno">← Izveštaji</a>
</form>
</div>
<!-- tabela promena -->
<div class="kartica animiraj" style="padding:0;overflow:hidden;">
<div style="padding:16px 20px;border-bottom:0.5px solid var(--ivica);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;">
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Prometni list magacina</span>
<span style="font-size:12px;color:var(--tekst-slabi);">{{.Od}} — {{.Do}} &middot; {{.Ukupno}} promena</span>
</div>
{{if not .Promene}}
<div style="padding:40px;text-align:center;color:var(--tekst-slabi);font-size:14px;">
Nema promena u odabranom periodu.
</div>
{{else}}
<div style="overflow-x:auto;">
<table class="tabela">
<thead>
<tr>
<th>Datum</th>
<th>Artikal</th>
<th>Šifra</th>
<th>Vrsta</th>
<th style="text-align:right;">Promena</th>
<th style="text-align:right;">Pre</th>
<th style="text-align:right;">Posle</th>
<th>Napomena</th>
</tr>
</thead>
<tbody>
{{range .Promene}}
<tr>
<td style="white-space:nowrap;font-size:12px;color:var(--tekst-slabi);">
{{.Datum.Format "02.01.2006. 15:04"}}
</td>
<td style="font-weight:500;">{{.ArtikalNaziv}}</td>
<td style="font-family:monospace;font-size:12px;color:var(--tekst-slabi);">{{if .ArtikalSifra}}{{.ArtikalSifra}}{{else}}—{{end}}</td>
<td>
{{if eq .TipPromene "ulaz_nabavka"}}
<span class="bedz" style="background:rgba(34,197,94,0.12);color:#22c55e;">Ulaz</span>
{{else if eq .TipPromene "izlaz_prodaja"}}
<span class="bedz" style="background:rgba(59,130,246,0.12);color:#3b82f6;">Prodaja</span>
{{else if eq .TipPromene "izlaz_servis"}}
<span class="bedz" style="background:rgba(249,115,22,0.12);color:#f97316;">Servis</span>
{{else if eq .TipPromene "povracaj"}}
<span class="bedz" style="background:rgba(168,85,247,0.12);color:#a855f7;">Povraćaj</span>
{{else if eq .TipPromene "korekcija"}}
<span class="bedz" style="background:rgba(156,163,175,0.12);color:#9ca3af;">Korekcija</span>
{{else}}
<span class="bedz">{{.TipPromene}}</span>
{{end}}
</td>
<td style="text-align:right;font-family:monospace;font-weight:600;{{if gt .PromenaKolicine 0}}color:#22c55e;{{else}}color:#dc2626;{{end}}">
{{if gt .PromenaKolicine 0}}+{{end}}{{.PromenaKolicine}}
</td>
<td style="text-align:right;font-family:monospace;color:var(--tekst-slabi);">{{.StanjePre}}</td>
<td style="text-align:right;font-family:monospace;font-weight:500;">{{.StanjePosle}}</td>
<td style="font-size:12px;color:var(--tekst-slabi);">{{.Napomena}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
{{end}}
</div>
</div>
{{end}}
+79
View File
@@ -0,0 +1,79 @@
{{template "base" .}}
{{define "naslov"}}Stanje zaliha — NTech{{end}}
{{define "sadrzaj"}}
<div class="kolona" style="gap:16px;">
<!-- zaglavlje -->
<div style="display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;">
<div style="display:flex;align-items:center;gap:12px;">
<a href="/izvestaji" class="nazad-link" style="margin-bottom:0;">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 18 9 12 15 6"/></svg>
Izveštaji
</a>
</div>
<div style="display:flex;gap:16px;flex-wrap:wrap;">
<div style="text-align:right;">
<div style="font-size:12px;color:var(--tekst-slabi);">Broj artikala</div>
<div style="font-size:18px;font-weight:600;color:var(--tekst-glavni);">{{.BrojArtikala}}</div>
</div>
<div style="text-align:right;">
<div style="font-size:12px;color:var(--tekst-slabi);">Ukupna vrednost zalihe</div>
<div style="font-size:18px;font-weight:600;color:var(--tekst-glavni);">{{printf "%.2f" .UkupnaVrednost}} din</div>
</div>
</div>
</div>
<!-- tabela -->
<div class="kartica animiraj" style="padding:0;overflow:hidden;">
<div style="padding:14px 20px;border-bottom:0.5px solid var(--ivica);">
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Stanje zaliha</span>
</div>
{{if not .Zalihe}}
<div style="padding:40px;text-align:center;color:var(--tekst-slabi);font-size:14px;">
Nema artikala u magacinu.
</div>
{{else}}
<div style="overflow-x:auto;">
<table class="tabela">
<thead>
<tr>
<th>Artikal</th>
<th>Šifra</th>
<th>Kategorija</th>
<th style="text-align:right;">Stanje</th>
<th style="text-align:right;">Min.</th>
<th style="text-align:right;">Nab. cena</th>
<th style="text-align:right;">Prod. cena</th>
<th style="text-align:right;">Vrednost</th>
</tr>
</thead>
<tbody>
{{range .Zalihe}}
<tr {{if le .Kolicina .KolicinMin}}style="background:rgba(220,38,38,0.05);"{{end}}>
<td style="font-weight:500;{{if le .Kolicina .KolicinMin}}color:#dc2626;{{end}}">{{.Naziv}}</td>
<td style="font-family:monospace;font-size:12px;color:var(--tekst-slabi);">{{if .Sifra}}{{.Sifra}}{{else}}—{{end}}</td>
<td style="font-size:12px;color:var(--tekst-slabi);">{{if .Kategorija}}{{.Kategorija}}{{else}}—{{end}}</td>
<td style="text-align:right;font-weight:600;{{if le .Kolicina .KolicinMin}}color:#dc2626;{{end}}">{{.Kolicina}}</td>
<td style="text-align:right;font-size:12px;color:var(--tekst-slabi);">{{.KolicinMin}}</td>
<td style="text-align:right;font-family:monospace;font-size:12px;">{{printf "%.2f" .NabavnaCena}}</td>
<td style="text-align:right;font-family:monospace;font-size:12px;">{{printf "%.2f" .ProdajnaCena}}</td>
<td style="text-align:right;font-family:monospace;font-weight:500;">{{printf "%.2f" .VrednostZalihe}}</td>
</tr>
{{end}}
</tbody>
<tfoot>
<tr style="border-top:1.5px solid var(--ivica);font-weight:600;">
<td colspan="7" style="padding:10px 12px;font-size:13px;">Ukupna vrednost zalihe</td>
<td style="text-align:right;padding:10px 12px;font-family:monospace;">{{printf "%.2f" .UkupnaVrednost}} din</td>
</tr>
</tfoot>
</table>
</div>
{{end}}
</div>
</div>
{{end}}