From 4daac1eed65e75f56e2f2f6d2a604982c6cc474a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Tue, 30 Jun 2026 16:47:50 +0200 Subject: [PATCH] =?UTF-8?q?Popis:=20=C5=A1tampa=20u=20novom=20tabu=20?= =?UTF-8?q?=E2=80=94=20standalone=20A4=20stranica=20sa=20zaglavljem=20i=20?= =?UTF-8?q?sumarima?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/ntech/main.go | 1 + internal/handler/izvestaji.go | 146 ++++++++++++++++++++ internal/handler/kes.go | 2 +- web/templates/stranice/popis.html | 2 +- web/templates/stranice/popis_stampa.html | 165 +++++++++++++++++++++++ 5 files changed, 314 insertions(+), 2 deletions(-) create mode 100644 web/templates/stranice/popis_stampa.html diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index a870920..4ab3eb8 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -400,6 +400,7 @@ func main() { r.Get("/izvestaji/stanje-zaliha", h.StanjeZalihaIzvestaj) r.Get("/izvestaji/popis", h.Popis) r.With(doz("artikal.izmeni")).Post("/izvestaji/popis", h.SacuvajPopis) + r.Get("/izvestaji/popis/stampa", h.PopisStampa) r.With(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "prodaja.pregled")).Get("/prodaja", h.Prodaja) r.Get("/prodaja/nova", h.NovaProdaja) r.With(doz("prodaja.dodaj")).Post("/prodaja/nova", h.SacuvajProdaju) diff --git a/internal/handler/izvestaji.go b/internal/handler/izvestaji.go index c31cf62..5567b3f 100644 --- a/internal/handler/izvestaji.go +++ b/internal/handler/izvestaji.go @@ -452,3 +452,149 @@ func (h *Handler) SacuvajPopis(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/izvestaji/popis?sacuvano=1", http.StatusSeeOther) } + +// PodaciPopisStampa su podaci za štampu popisa (standalone template) +type PodaciPopisStampa struct { + NazivFirme string + KorisnikIme string + TipPopisaNaziv string + DatumPopisa string + Redovi []PopisStampaRed + UkupnoKnjiznoKol int + UkupnoKnjiznoVredStr string + UkupnoStvarnoKol int + UkupnoRazlikaKolStr string + UkupnoRazlikaVredStr string + ManjakKol int + ManjakVredStr string + VisakKol int + VisakVredStr string +} + +// PopisStampaRed je jedan red u štampi popisa +type PopisStampaRed struct { + Naziv string + Sifra string + KategorijaNaziv string + JedinicaMere string + NabavnaCenaStr string + Kolicina int + KnjiznaVrednostStr string + StvarnaKolicina int + Razlika int + RazlikaStr string + RazlikaVrednost float64 + RazlikaVrednostStr string +} + +// PopisStampa prikazuje standalone stranicu za štampu popisa +func (h *Handler) PopisStampa(w http.ResponseWriter, r *http.Request) { + if _, ok := h.zahtevajDozvolu(w, r, "artikal.izmeni"); !ok { + return + } + + artikli, err := h.Artikli.Lista(r.Context(), appdbPkg.ArtikalFilter{Tip: model.TipProizvod}) + if err != nil { + http.Error(w, "Greška pri učitavanju artikala", http.StatusInternalServerError) + return + } + + podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB) + tip := "godišnji" + + var redovi []PopisStampaRed + var ukKnjKol, ukStvKol, ukRazKol, manjakKol, visakKol int + var ukKnjVred, ukRazVred, manjakVred, visakVred float64 + + for _, a := range artikli { + knjKol := a.Kolicina + cena := a.NabavnaCena + knjVred := cena * float64(knjKol) + stvKol := knjKol + razlika := stvKol - knjKol + razlikaVred := cena * float64(razlika) + + ukKnjKol += knjKol + ukKnjVred += knjVred + ukStvKol += stvKol + ukRazKol += razlika + ukRazVred += razlikaVred + + if razlika < 0 { + manjakKol += -razlika + manjakVred += -razlikaVred + } else if razlika > 0 { + visakKol += razlika + visakVred += razlikaVred + } + + jm := a.JedinicaMere + if jm == "" { + jm = "kom" + } + + razlikaStr := "—" + if razlika > 0 { + razlikaStr = fmt.Sprintf("+%d", razlika) + } else if razlika < 0 { + razlikaStr = fmt.Sprintf("%d", razlika) + } + + razlikaVredStr := "—" + if razlikaVred != 0 { + predznak := "" + if razlikaVred > 0 { + predznak = "+" + } + razlikaVredStr = predznak + formatirajDinare(razlikaVred, 2) + } + + redovi = append(redovi, PopisStampaRed{ + Naziv: a.Naziv, + Sifra: a.Sifra, + KategorijaNaziv: a.KategorijaNaziv, + JedinicaMere: jm, + NabavnaCenaStr: formatirajDinare(cena, 0), + Kolicina: knjKol, + KnjiznaVrednostStr: formatirajDinare(knjVred, 2), + StvarnaKolicina: stvKol, + Razlika: razlika, + RazlikaStr: razlikaStr, + RazlikaVrednost: razlikaVred, + RazlikaVrednostStr: razlikaVredStr, + }) + } + + ukRazKolStr := "—" + if ukRazKol > 0 { + ukRazKolStr = fmt.Sprintf("+%d", ukRazKol) + } else if ukRazKol < 0 { + ukRazKolStr = fmt.Sprintf("%d", ukRazKol) + } + + ukRazVredStr := "—" + if ukRazVred != 0 { + predznak := "" + if ukRazVred > 0 { + predznak = "+" + } + ukRazVredStr = predznak + formatirajDinare(ukRazVred, 2) + } + + h.renderujStandalone(w, "popis_stampa", PodaciPopisStampa{ + NazivFirme: podesavanja["naziv_firme"], + KorisnikIme: middleware.KorisnikIzKonteksta(r.Context()).KorisnickoIme, + TipPopisaNaziv: tipPopisaNaziv(tip), + DatumPopisa: time.Now().Format("02.01.2006."), + Redovi: redovi, + UkupnoKnjiznoKol: ukKnjKol, + UkupnoKnjiznoVredStr: formatirajDinare(ukKnjVred, 2), + UkupnoStvarnoKol: ukStvKol, + UkupnoRazlikaKolStr: ukRazKolStr, + UkupnoRazlikaVredStr: ukRazVredStr, + ManjakKol: manjakKol, + ManjakVredStr: formatirajDinare(manjakVred, 2), + VisakKol: visakKol, + VisakVredStr: formatirajDinare(visakVred, 2), + }) +} diff --git a/internal/handler/kes.go b/internal/handler/kes.go index a61b787..996eb05 100644 --- a/internal/handler/kes.go +++ b/internal/handler/kes.go @@ -43,7 +43,7 @@ var saSidebar = []string{ // standalone su šabloni bez base layouta var standaloneIme = []string{ - "prijava", "setup", "totp_provera", "prodaja_stampa", "servis_radni_nalog", "servis_otpremnica", "servis_revers", "servis_predracun", "servis_nalepnica", "servis_status_javni", "servis_garantni_list", "fiskal_verifikacija", + "prijava", "setup", "totp_provera", "prodaja_stampa", "servis_radni_nalog", "servis_otpremnica", "servis_revers", "servis_predracun", "servis_nalepnica", "servis_status_javni", "servis_garantni_list", "fiskal_verifikacija", "popis_stampa", } // sablonskeFunkcije su pomoćne funkcije dostupne u svim šablonima. diff --git a/web/templates/stranice/popis.html b/web/templates/stranice/popis.html index 9883023..b1ff829 100644 --- a/web/templates/stranice/popis.html +++ b/web/templates/stranice/popis.html @@ -230,7 +230,7 @@
← Izveštaji - +
diff --git a/web/templates/stranice/popis_stampa.html b/web/templates/stranice/popis_stampa.html new file mode 100644 index 0000000..631dcba --- /dev/null +++ b/web/templates/stranice/popis_stampa.html @@ -0,0 +1,165 @@ + + + + + + Popis — {{.NazivFirme}} + + + +
+ +
+
{{.NazivFirme}}
+
Popis magacina
+
+ {{.TipPopisaNaziv}}  |  Datum: {{.DatumPopisa}}  |  Sačinio: {{.KorisnikIme}} +
+
+ + + + + + + + + + + + + + + + + + {{range .Redovi}} + + + + + + + + + + + + + {{end}} + + + + + + + + + + + +
ArtikalŠifraKategorijaJMNab. cenaKnj. kol.Knj. vrednostStvarno kol.Razlika kol.Razlika vred.
{{.Naziv}}{{if .Sifra}}{{.Sifra}}{{else}}—{{end}}{{if .KategorijaNaziv}}{{.KategorijaNaziv}}{{else}}—{{end}}{{if .JedinicaMere}}{{.JedinicaMere}}{{else}}kom{{end}}{{.NabavnaCenaStr}}{{.Kolicina}}{{.KnjiznaVrednostStr}}{{.StvarnaKolicina}}{{.RazlikaStr}}{{.RazlikaVrednostStr}}
UKUPNO:{{.UkupnoKnjiznoKol}}{{.UkupnoKnjiznoVredStr}}{{.UkupnoStvarnoKol}}{{.UkupnoRazlikaKolStr}}{{.UkupnoRazlikaVredStr}}
+ +
+
+
+ Manjkovi (kom) + {{.ManjakKol}} +
+
+ Manjkovi (vrednost) + {{.ManjakVredStr}} +
+
+ Viškovi (kom) + {{.VisakKol}} +
+
+ Viškovi (vrednost) + {{.VisakVredStr}} +
+
+
+ +
+
+
Potpis lica koje je izvršilo popis
+
+
+
Potpis odgovornog lica
+
+
+ +
+ + + + +