diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go
index 15dd383..9e880a8 100644
--- a/cmd/ntech/main.go
+++ b/cmd/ntech/main.go
@@ -338,6 +338,7 @@ func main() {
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(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "servis.pregled")).Get("/servis/{id}/otpremnica", h.StampaOtpremnice)
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 fe6cac8..b6db5e2 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", "servis_stampa",
+ "prijava", "setup", "totp_provera", "prodaja_stampa", "servis_stampa", "servis_otpremnica",
}
// sablonskeFunkcije su pomoćne funkcije dostupne u svim šablonima.
diff --git a/internal/handler/servis.go b/internal/handler/servis.go
index d3183ab..e7f1adb 100644
--- a/internal/handler/servis.go
+++ b/internal/handler/servis.go
@@ -632,3 +632,86 @@ func (h *Handler) StampaServisa(w http.ResponseWriter, r *http.Request) {
PIB: podesavanja["pib"],
})
}
+
+// PodaciOtpremnice su podaci za otpremnicu pri preuzimanju uređaja
+type PodaciOtpremnice struct {
+ Nalog model.ServisniNalog
+ ServisniDelovi []model.ServisniDeoSaArtiklom
+ UkupnoDelovi float64
+ Klijent *model.Klijent
+ KlijentNaziv string
+ TehnicarNaziv string
+ NazivFirme string
+ Podnazlov string
+ Adresa string
+ Telefon string
+ PIB string
+}
+
+// StampaOtpremnice renderuje otpremnicu pri preuzimanju uređaja od strane klijenta
+func (h *Handler) StampaOtpremnice(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
+ }
+
+ var klijent *model.Klijent
+ klijentNaziv := ""
+ if nalog.KlijentID != nil {
+ k, err := h.KlijentiRepo.DohvatiID(r.Context(), *nalog.KlijentID)
+ if err == nil {
+ klijent = k
+ if k.NazivFirme != "" {
+ klijentNaziv = k.NazivFirme
+ } else {
+ klijentNaziv = strings.TrimSpace(k.Ime + " " + k.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_otpremnica", PodaciOtpremnice{
+ Nalog: *nalog,
+ ServisniDelovi: delovi,
+ UkupnoDelovi: ukupnoDelovi,
+ Klijent: klijent,
+ 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 96294f3..0ee0ad7 100644
--- a/web/templates/stranice/servis_detalji.html
+++ b/web/templates/stranice/servis_detalji.html
@@ -47,7 +47,10 @@