KPO: knjiga o ostvarenom prometu — lista, ručni unos, backfill, auto-upis iz prodaje i servisa
This commit is contained in:
@@ -99,9 +99,10 @@
|
||||
|
||||
{{/* Knjigovodstvo — grupa: KIR/KPR/Obračun (modul „pdv") + Nivelacije (dozvola izmene cena) */}}
|
||||
{{$pdvVid := and (index .Moduli "pdv") (index .Dozvole "pdv.pregled")}}
|
||||
{{$knjVid := or $pdvVid (index .Dozvole "artikal.izmeni")}}
|
||||
{{$kpoVid := and (index .Moduli "kpo") (index .Dozvole "kpo.pregled")}}
|
||||
{{$knjVid := or $pdvVid $kpoVid (index .Dozvole "artikal.izmeni")}}
|
||||
{{if $knjVid}}
|
||||
{{$knjAktivan := or (eq .Stranica "nivelacije") (eq .Stranica "pdv-kir") (eq .Stranica "pdv-kpr") (eq .Stranica "pdv-obracun")}}
|
||||
{{$knjAktivan := or (eq .Stranica "nivelacije") (eq .Stranica "kpo") (eq .Stranica "pdv-kir") (eq .Stranica "pdv-kpr") (eq .Stranica "pdv-obracun")}}
|
||||
<div>
|
||||
<button type="button" data-podmeni-dugme
|
||||
class="nav-stavka {{if $knjAktivan}}aktivan{{end}}"
|
||||
@@ -124,6 +125,13 @@
|
||||
<span class="nav-tooltip">Nivelacije — promene cena</span>
|
||||
</a>
|
||||
{{end}}
|
||||
{{if $kpoVid}}
|
||||
<a href="/kpo" class="nav-stavka nav-podstavka {{if eq .Stranica "kpo"}}aktivan{{end}}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/><line x1="8" y1="10" x2="16" y2="10"/><line x1="8" y1="14" x2="16" y2="14"/></svg>
|
||||
<span>KPO</span>
|
||||
<span class="nav-tooltip">KPO — knjiga o ostvarenom prometu</span>
|
||||
</a>
|
||||
{{end}}
|
||||
{{if $pdvVid}}
|
||||
<a href="/pdv/kir" class="nav-stavka nav-podstavka {{if eq .Stranica "pdv-kir"}}aktivan{{end}}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}KPO — knjiga o ostvarenom prometu — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="width:100%;max-width:100%;">
|
||||
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="display:flex;justify-content:space-between;align-items:flex-end;gap:12px;flex-wrap:wrap;">
|
||||
<form method="GET" action="/kpo" style="display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;">
|
||||
<div>
|
||||
<label class="polje-labela">Od datuma</label>
|
||||
<input type="date" name="od" value="{{.Od}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Do datuma</label>
|
||||
<input type="date" name="do" value="{{.Do}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<button type="submit" style="padding:8px 16px;background:var(--sb-aktivan);color:var(--tekst-jak);border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;cursor:pointer;">Prikaži</button>
|
||||
{{if or .Od .Do}}<a href="/kpo" class="nazad-link" hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML" style="margin-bottom:0;">Poništi filter</a>{{end}}
|
||||
</form>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center;">
|
||||
{{if index .Dozvole "kpo.dodaj"}}
|
||||
<form method="POST" action="/kpo/backfill" data-full-reload>
|
||||
<input type="hidden" name="csrf_token" value="{{.CsrfToken}}">
|
||||
<button type="submit" class="btn-sekundarno" style="font-size:13px;padding:8px 16px;white-space:nowrap;"
|
||||
data-potvrda="Uvesti sve prodaje i naplaćene servisne naloge koji još nisu u KPO-u?">
|
||||
Uvezi postojeće
|
||||
</button>
|
||||
</form>
|
||||
{{end}}
|
||||
{{if index .Dozvole "kpo.dodaj"}}
|
||||
<a hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML"
|
||||
href="/kpo/nova" class="btn-primarno" style="font-size:13px;padding:8px 16px;white-space:nowrap;">
|
||||
+ Ručni unos
|
||||
</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{if .Zapisi}}
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;padding:12px 18px;">
|
||||
<div style="display:flex;gap:32px;align-items:center;flex-wrap:wrap;">
|
||||
<div>
|
||||
<span class="polje-labela">Ukupan prihod</span>
|
||||
<div style="font-size:22px;font-weight:700;color:var(--zelena);">{{dinari .Sume.Prihod}} RSD</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="polje-labela">Broj unosa</span>
|
||||
<div style="font-size:22px;font-weight:700;">{{.Sume.Broj}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<div class="kartica animiraj">
|
||||
{{if .Zapisi}}
|
||||
<div class="tabela-omotac">
|
||||
<table class="tabela">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Datum</th>
|
||||
<th>Br. dokumenta</th>
|
||||
<th>Opis</th>
|
||||
<th>Način plaćanja</th>
|
||||
<th style="text-align:right;">Prihod (RSD)</th>
|
||||
<th>Izvor</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $z := .Zapisi}}
|
||||
<tr>
|
||||
<td style="white-space:nowrap;">{{$z.DatumPrometa.Format "02.01.2006."}}</td>
|
||||
<td style="font-weight:500;">{{$z.BrojDokumenta}}</td>
|
||||
<td style="color:var(--tekst-slab);font-size:13px;">{{$z.Opis}}</td>
|
||||
<td style="font-size:13px;">{{$z.NacinPlacanja}}</td>
|
||||
<td style="text-align:right;font-weight:600;color:var(--zelena);">{{dinari $z.Prihod}}</td>
|
||||
<td>
|
||||
{{if eq $z.Izvor "prodaja"}}<span class="bedz bedz-plava">prodaja</span>
|
||||
{{else if eq $z.Izvor "servis"}}<span class="bedz bedz-narandzasta">servis</span>
|
||||
{{else}}<span class="bedz">ručno</span>{{end}}
|
||||
</td>
|
||||
<td style="text-align:right;">
|
||||
{{if index $.Dozvole "kpo.obrisi"}}
|
||||
{{if eq $z.Izvor "rucno"}}
|
||||
<form method="POST" action="/kpo/obrisi/{{$z.ID}}" style="display:inline;" data-full-reload>
|
||||
<input type="hidden" name="csrf_token" value="{{$.CsrfToken}}">
|
||||
<button type="submit" class="btn-opasno-mali"
|
||||
data-potvrda="Obrisati ovaj KPO unos?">Obriši</button>
|
||||
</form>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{else}}
|
||||
<div style="text-align:center;padding:48px 16px;color:var(--tekst-slab);">
|
||||
<div style="font-size:32px;margin-bottom:12px;">📒</div>
|
||||
<div>Nema unosa za odabrani period.</div>
|
||||
{{if index .Dozvole "kpo.dodaj"}}
|
||||
<div style="margin-top:12px;">
|
||||
<a hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML"
|
||||
href="/kpo/nova" class="btn-primarno" style="font-size:13px;">+ Ručni unos</a>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,74 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}Novi KPO unos — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="max-width:640px;">
|
||||
|
||||
<div style="margin-bottom:12px;">
|
||||
<a href="/kpo" class="nazad-link" hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML">
|
||||
← KPO knjiga
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="kartica animiraj">
|
||||
<h2 style="margin:0 0 20px;font-size:18px;">Novi KPO unos</h2>
|
||||
|
||||
<form method="POST" action="/kpo/nova">
|
||||
<input type="hidden" name="csrf_token" value="{{.CsrfToken}}">
|
||||
|
||||
<div class="polje-grupa" style="margin-bottom:16px;">
|
||||
<label class="polje-labela">Datum prometa *</label>
|
||||
<input type="date" name="datum_prometa" value="{{.Danas}}" required
|
||||
style="width:100%;padding:10px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;box-sizing:border-box;">
|
||||
</div>
|
||||
|
||||
<div class="polje-grupa" style="margin-bottom:16px;">
|
||||
<label class="polje-labela">Broj dokumenta *</label>
|
||||
<input type="text" name="broj_dokumenta" required autocomplete="off"
|
||||
placeholder="npr. 2025/001 ili gotovina"
|
||||
style="width:100%;padding:10px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;box-sizing:border-box;">
|
||||
</div>
|
||||
|
||||
<div class="polje-grupa" style="margin-bottom:16px;">
|
||||
<label class="polje-labela">Opis (opcionalno)</label>
|
||||
<input type="text" name="opis" autocomplete="off"
|
||||
placeholder="Kratki opis prihoda"
|
||||
style="width:100%;padding:10px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;box-sizing:border-box;">
|
||||
</div>
|
||||
|
||||
<div class="polje-grupa" style="margin-bottom:16px;">
|
||||
<label class="polje-labela">Prihod (RSD) *</label>
|
||||
<input type="number" name="prihod" step="0.01" min="0" required
|
||||
style="width:100%;padding:10px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;box-sizing:border-box;">
|
||||
</div>
|
||||
|
||||
<div class="polje-grupa" style="margin-bottom:16px;">
|
||||
<label class="polje-labela">Način plaćanja</label>
|
||||
<select name="nacin_placanja"
|
||||
style="width:100%;padding:10px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;box-sizing:border-box;">
|
||||
<option value="">— nije navedeno —</option>
|
||||
<option value="Gotovina">Gotovina</option>
|
||||
<option value="Kartica">Kartica</option>
|
||||
<option value="Virman">Virman</option>
|
||||
<option value="Ostalo">Ostalo</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="polje-grupa" style="margin-bottom:24px;">
|
||||
<label class="polje-labela">Napomena</label>
|
||||
<textarea name="napomena" rows="2"
|
||||
style="width:100%;padding:10px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;box-sizing:border-box;resize:vertical;"></textarea>
|
||||
</div>
|
||||
|
||||
<div style="display:flex;gap:10px;justify-content:flex-end;">
|
||||
<a href="/kpo" class="btn-sekundarno" hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML">
|
||||
Otkaži
|
||||
</a>
|
||||
<button type="submit" class="btn-primarno">Sačuvaj</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
Reference in New Issue
Block a user