From 8048834f872c96113ad0fd564b6e4bf951489849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Fri, 19 Jun 2026 19:46:05 +0200 Subject: [PATCH] =?UTF-8?q?Servis:=20dodata=20=C5=A1tampa=20servisnog=20na?= =?UTF-8?q?loga?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nova stranica /servis/{id}/stampa — print-friendly A4 dokument - Prikazuje: zaglavlje firme, broj naloga, status, klijent, tehničar, uređaj sa opisom kvara i pribором, ugrađene delove sa ukupnim iznosom, cene usluge i prostor za potpise - Dugme Štampaj nalog dodata na stranicu detalja naloga --- cmd/ntech/main.go | 1 + internal/handler/kes.go | 2 +- internal/handler/servis.go | 79 +++++++ web/templates/stranice/servis_detalji.html | 11 +- web/templates/stranice/servis_stampa.html | 246 +++++++++++++++++++++ 5 files changed, 335 insertions(+), 4 deletions(-) create mode 100644 web/templates/stranice/servis_stampa.html diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 473b1b3..15dd383 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -337,6 +337,7 @@ func main() { r.With(doz("servis.izmeni")).Post("/servis/izmeni/{id}", h.SacuvajIzmenaNaloga) r.With(doz("servis.obrisi")).Post("/servis/obrisi/{id}", h.ObrisiNalog) r.With(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "servis.pregled")).Get("/servis/{id}", h.DetaljiNaloga) + r.With(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "servis.pregled")).Get("/servis/{id}/stampa", h.StampaServisa) r.With(doz("servis.izmeni")).Post("/servis/{id}/delovi", h.DodajDeloNalogu) r.With(doz("servis.izmeni")).Post("/servis/{id}/delovi/{deo_id}/obrisi", h.ObrisiDeloNaloga) r.Get("/izvestaji", h.Izvestaji) diff --git a/internal/handler/kes.go b/internal/handler/kes.go index d4ed4ae..fe6cac8 100644 --- a/internal/handler/kes.go +++ b/internal/handler/kes.go @@ -38,7 +38,7 @@ var saSidebar = []string{ // standalone su šabloni bez base layouta var standaloneIme = []string{ - "prijava", "setup", "totp_provera", "prodaja_stampa", + "prijava", "setup", "totp_provera", "prodaja_stampa", "servis_stampa", } // sablonskeFunkcije su pomoćne funkcije dostupne u svim šablonima. diff --git a/internal/handler/servis.go b/internal/handler/servis.go index 6cfe5cb..d3183ab 100644 --- a/internal/handler/servis.go +++ b/internal/handler/servis.go @@ -553,3 +553,82 @@ func parseOpcionuCenu(s string) *float64 { func (h *Handler) renderujFormuNaloga(w http.ResponseWriter, podaci PodaciFormeNaloga) { h.renderujTemplate(w, "servis_forma", podaci) } + +// PodaciStampeServisa su podaci za print-friendly prikaz servisnog naloga +type PodaciStampeServisa struct { + Nalog model.ServisniNalog + ServisniDelovi []model.ServisniDeoSaArtiklom + UkupnoDelovi float64 + KlijentNaziv string + TehnicarNaziv string + NazivFirme string + Podnazlov string + Adresa string + Telefon string + PIB string +} + +// StampaServisa renderuje print-friendly stranicu za servisni nalog +func (h *Handler) StampaServisa(w http.ResponseWriter, r *http.Request) { + id, err := parseID(chi.URLParam(r, "id")) + if err != nil { + http.Error(w, "Neispravan ID naloga", http.StatusBadRequest) + return + } + + nalog, err := h.ServisRepo.DohvatiID(r.Context(), id) + if err != nil { + http.Error(w, "Nalog nije pronađen", http.StatusNotFound) + return + } + + delovi, err := h.ServisniDeloviRepo.DohvatiZaNalog(r.Context(), id) + if err != nil { + http.Error(w, "Greška pri učitavanju delova", http.StatusInternalServerError) + return + } + + podesavanja, err := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB) + if err != nil { + http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError) + return + } + + klijentNaziv := "" + if nalog.KlijentID != nil { + klijent, err := h.KlijentiRepo.DohvatiID(r.Context(), *nalog.KlijentID) + if err == nil { + if klijent.NazivFirme != "" { + klijentNaziv = klijent.NazivFirme + } else { + klijentNaziv = strings.TrimSpace(klijent.Ime + " " + klijent.Prezime) + } + } + } + + tehnicarNaziv := "" + if nalog.TehnicarID != nil { + tehnicar, err := h.KorisniciRepo.DohvatiPoID(r.Context(), *nalog.TehnicarID) + if err == nil { + tehnicarNaziv = tehnicar.KorisnickoIme + } + } + + var ukupnoDelovi float64 + for _, d := range delovi { + ukupnoDelovi += d.Ukupno() + } + + h.renderujStandalone(w, "servis_stampa", PodaciStampeServisa{ + Nalog: *nalog, + ServisniDelovi: delovi, + UkupnoDelovi: ukupnoDelovi, + KlijentNaziv: klijentNaziv, + TehnicarNaziv: tehnicarNaziv, + NazivFirme: podesavanja["naziv_firme"], + Podnazlov: podesavanja["podnazlov"], + Adresa: podesavanja["adresa"], + Telefon: podesavanja["telefon"], + PIB: podesavanja["pib"], + }) +} diff --git a/web/templates/stranice/servis_detalji.html b/web/templates/stranice/servis_detalji.html index 263bef5..96294f3 100644 --- a/web/templates/stranice/servis_detalji.html +++ b/web/templates/stranice/servis_detalji.html @@ -45,9 +45,14 @@ {{template "status-badge-detalji" .Nalog.Status}} - - Izmeni nalog - +
+ + Štampaj nalog + + + Izmeni nalog + +
diff --git a/web/templates/stranice/servis_stampa.html b/web/templates/stranice/servis_stampa.html new file mode 100644 index 0000000..71d50f6 --- /dev/null +++ b/web/templates/stranice/servis_stampa.html @@ -0,0 +1,246 @@ + + + + + + Servisni nalog {{.Nalog.BrojNaloga}} + + + +
+ + +
+
+
{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}
+
+ {{if .Podnazlov}}{{.Podnazlov}}
{{end}} + {{if .Adresa}}{{.Adresa}}
{{end}} + {{if .Telefon}}Tel: {{.Telefon}}
{{end}} + {{if .PIB}}PIB: {{.PIB}}{{end}} +
+
+
+
Servisni nalog
+
{{.Nalog.BrojNaloga}}
+
{{.Nalog.Status}}
+
+
+ + +
+
Osnovni podaci
+
+
+
Datum prijema
+
{{.Nalog.DatumPrijema.Format "02.01.2006. u 15:04"}}
+
+ {{if .Nalog.DatumZavrsetka}} +
+
Datum završetka
+
{{.Nalog.DatumZavrsetka.Format "02.01.2006."}}
+
+ {{end}} + {{if .Nalog.GarancijaDo}} +
+
Garancija do
+
{{.Nalog.GarancijaDo.Format "02.01.2006."}}
+
+ {{end}} +
+
Klijent
+
{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}{{end}}
+
+ {{if .TehnicarNaziv}} +
+
Tehničar
+
{{.TehnicarNaziv}}
+
+ {{end}} +
+
+ + +
+
Uređaj
+
+
+
Naziv uređaja
+
{{.Nalog.Uredjaj}}
+
+
+
Serijski broj
+
{{if .Nalog.SerijskiBroj}}{{.Nalog.SerijskiBroj}}{{else}}{{end}}
+
+ {{if .Nalog.PinUredjaja}} +
+
PIN / lozinka
+
{{.Nalog.PinUredjaja}}
+
+ {{end}} +
+
+
Opis kvara
+
{{if .Nalog.OpisKvara}}{{.Nalog.OpisKvara}}{{else}}{{end}}
+
+ {{if or .Nalog.Ostecenja .Nalog.Pribor}} +
+ {{if .Nalog.Ostecenja}} +
+
Oštećenja pri prijemu
+
{{.Nalog.Ostecenja}}
+
+ {{end}} + {{if .Nalog.Pribor}} +
+
Pribor i oprema
+
{{.Nalog.Pribor}}
+
+ {{end}} +
+ {{end}} +
+ + + {{if .ServisniDelovi}} +
+
Ugrađeni delovi
+ + + + + + + + + + + {{range .ServisniDelovi}} + + + + + + + {{end}} + + + + + +
ArtikalKol.Cena/komUkupno
{{.ArtikalNaziv}}{{.Kolicina}}{{printf "%.2f" .CenaKomada}} din{{printf "%.2f" .Ukupno}} din
Ukupno delovi{{printf "%.2f" .UkupnoDelovi}} din
+
+ {{end}} + + +
+
Cene usluge
+
+
+
Procena od
+
{{if .Nalog.CenaOd}}{{.Nalog.CenaOdStr}} din{{else}}—{{end}}
+
+
+
Procena do
+
{{if .Nalog.CenaDo}}{{.Nalog.CenaDoStr}} din{{else}}—{{end}}
+
+
+
Avans
+
{{if .Nalog.Avans}}{{.Nalog.AvansStr}} din{{else}}—{{end}}
+
+
+
Konačna cena
+
{{if .Nalog.CenaKonacna}}{{.Nalog.CenaKonacnaStr}} din{{else}}—{{end}}
+
+
+ {{if .Nalog.PreostaloZaNaplatu}} +
+ Preostalo za naplatu: + {{.Nalog.PreostaloZaNaplatuStr}} din +
+ {{end}} +
+ + {{if .Nalog.Napomena}} +
+
Napomena
+
{{.Nalog.Napomena}}
+
+ {{end}} + + +
+
+
Predao klijent
+
+
+
Primio tehničar
+
+
+ +
+ + + + +