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 @@
| Artikal | +Šifra | +Kategorija | +JM | +Nab. cena | +Knj. kol. | +Knj. vrednost | +Stvarno 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}} | +||||