diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 189062f..da73ad4 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -388,6 +388,7 @@ func main() { r.With(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "servis.pregled")).Get("/servis/{id}/predracun", h.StampaPredracuna) r.With(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "servis.pregled")).Get("/servis/{id}/nalepnica", h.StampaNalepnice) r.With(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "servis.pregled")).Get("/servis/{id}/garantni-list", h.StampaGarantnog) + r.With(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "servis.pregled")).Get("/servis/{id}/eskalacioni-list", h.StampaEskalacionogLista) r.With(doz("servis.izmeni")).Post("/servis/{id}/status", h.PromeniStatus) r.With(doz("servis.izmeni")).Post("/servis/{id}/garancija", h.AzurirajGaranciju) r.With(doz("servis.izmeni")).Post("/servis/{id}/garancija-dana", h.AzurirajGarancijaDana) diff --git a/internal/handler/kes.go b/internal/handler/kes.go index 554ce5d..8c08fd3 100644 --- a/internal/handler/kes.go +++ b/internal/handler/kes.go @@ -44,7 +44,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", "popis_stampa", + "prijava", "setup", "totp_provera", "prodaja_stampa", "servis_radni_nalog", "servis_otpremnica", "servis_revers", "servis_predracun", "servis_nalepnica", "servis_status_javni", "servis_garantni_list", "servis_eskalacioni_list", "fiskal_verifikacija", "popis_stampa", } // sablonskeFunkcije su pomoćne funkcije dostupne u svim šablonima. diff --git a/internal/handler/servis.go b/internal/handler/servis.go index d7ca53d..86331ec 100644 --- a/internal/handler/servis.go +++ b/internal/handler/servis.go @@ -1680,6 +1680,81 @@ func (h *Handler) StampaGarantnog(w http.ResponseWriter, r *http.Request) { }) } +// PodaciEskalacionogLista su podaci za interni list praćenja rokova naloga. +type PodaciEskalacionogLista struct { + Nalog model.ServisniNalog + KlijentNaziv string + Klijent *model.Klijent + TehnicarNaziv string + RokPodizanja *time.Time + NazivFirme string + LogoPutanja string + Podnazlov string + Adresa string + Telefon string + PIB string + MaticniBroj string + Barkod string +} + +// StampaEskalacionogLista renderuje interni list praćenja rokova. +func (h *Handler) StampaEskalacionogLista(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 + } + + 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, e := h.KlijentiRepo.DohvatiID(r.Context(), *nalog.KlijentID) + if e == nil { + klijent = k + if k.NazivFirme != "" { + klijentNaziv = k.NazivFirme + } else { + klijentNaziv = strings.TrimSpace(k.Ime + " " + k.Prezime) + } + } + } + + tehnicarNaziv := "" + if nalog.TehnicarID != nil { + if t, e := h.KorisniciRepo.DohvatiPoID(r.Context(), *nalog.TehnicarID); e == nil { + tehnicarNaziv = t.KorisnickoIme + } + } + + h.renderujStandalone(w, "servis_eskalacioni_list", PodaciEskalacionogLista{ + Nalog: *nalog, + KlijentNaziv: klijentNaziv, + Klijent: klijent, + TehnicarNaziv: tehnicarNaziv, + RokPodizanja: rokPodizanja(nalog.DatumZavrsetka), + NazivFirme: podesavanja["naziv_firme"], + LogoPutanja: logoZaDokument(podesavanja), + Podnazlov: podesavanja["podnazlov"], + Adresa: podesavanja["adresa"], + Telefon: podesavanja["telefon"], + PIB: podesavanja["pib"], + MaticniBroj: podesavanja["maticni_broj"], + Barkod: barkodNaloga(nalog.BrojNaloga), + }) +} + // PodaciReversa su podaci za revers — potvrdu o prijemu uređaja na servis. // Dokument se izdaje pri prijemu, pa nema cena. type PodaciReversa struct { diff --git a/web/templates/stranice/servis_detalji.html b/web/templates/stranice/servis_detalji.html index 1402e8a..ce072c8 100644 --- a/web/templates/stranice/servis_detalji.html +++ b/web/templates/stranice/servis_detalji.html @@ -238,6 +238,9 @@ {{end}} {{end}} + + Eskalacioni list + {{/* Nalepnica je primarna pri prijemu (lepi se na uređaj); reprint dok traje; ne u „Završeno" */}} {{if eq .Nalog.Status "Primljeno"}} diff --git a/web/templates/stranice/servis_eskalacioni_list.html b/web/templates/stranice/servis_eskalacioni_list.html new file mode 100644 index 0000000..e059ce5 --- /dev/null +++ b/web/templates/stranice/servis_eskalacioni_list.html @@ -0,0 +1,232 @@ + + + + + + Eskalacioni list — {{.Nalog.BrojNaloga}} + + + +
+ + +
+
+ {{if .LogoPutanja}} + Logo + {{else}} +
{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}
+ {{end}} +
+ {{if .Podnazlov}}{{.Podnazlov}}
{{end}} + {{if .Adresa}}{{.Adresa}}
{{end}} + {{if .Telefon}}Tel: {{telefon .Telefon}}
{{end}} + {{if .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}} +
+
+
+ {{if .Barkod}}Barkod {{.Nalog.BrojNaloga}}{{end}} +
Eskalacioni list — praćenje rokova
+
{{.Nalog.BrojNaloga}}
+ {{if .TehnicarNaziv}}
Serviser: {{.TehnicarNaziv}}
{{end}} +
Status: {{.Nalog.Status}}
+
+
+
Klijent
+ {{if .KlijentNaziv}} +
{{.KlijentNaziv}}
+
+ {{if .Klijent}} + {{if .Klijent.Telefon}}Tel: {{telefon .Klijent.Telefon}}
{{end}} + {{if .Klijent.Email}}{{.Klijent.Email}}
{{end}} + {{if .Klijent.Mesto}}{{.Klijent.Mesto}}{{end}} + {{end}} +
+ {{else}} +
— klijent nije naveden —
+ {{end}} +
+
+ + +
+
Uređaj
+
+
+
Naziv uređaja
+
{{if .Nalog.Uredjaj}}{{.Nalog.Uredjaj}}{{else}}{{end}}
+
+
+
Serijski broj
+
{{if .Nalog.SerijskiBroj}}{{.Nalog.SerijskiBroj}}{{else}}{{end}}
+
+
+
Prijavljeni kvar
+
{{if .Nalog.OpisKvara}}{{.Nalog.OpisKvara}}{{else}}{{end}}
+
+
+
+ + +
+
Praćenje rokova
+ + + + + + + + + + + + + + + + + + + + {{if .Nalog.PredvidjenDatum}} + + + + + + {{else}} + + + + + + {{end}} + + + + + + {{if .Nalog.DatumOdluke}} + + + + + + {{else}} + + + + + + {{end}} + + + + + + + + + + + {{if .Nalog.DatumZavrsetka}} + + + + + + {{else}} + + + + + + {{end}} + + + + + + + + + + + {{if .RokPodizanja}} + + + + + + {{else}} + + + + + + {{end}} + +
DogađajDatumNapomena / potpis
Prijem uređaja{{.Nalog.DatumPrijema.Format "02.01.2006."}} auto
Početak dijagnostike
Predviđeni datum završetka{{.Nalog.PredvidjenDatum.Format "02.01.2006."}} auto
Predviđeni datum završetka
Poziv klijenta (obaveštenje o dijagnozi)
Odobrenje klijenta{{.Nalog.DatumOdluke.Format "02.01.2006."}} auto{{if .Nalog.OdlukaKlijenta}}{{if eq .Nalog.OdlukaKlijenta "prihvaceno"}}Prihvaćeno{{else}}Odbijeno{{end}}{{end}}
Odobrenje klijenta
Narudžbina delova
Dolazak delova
Završetak popravke{{.Nalog.DatumZavrsetka.Format "02.01.2006."}} auto
Završetak popravke
Poziv klijenta (obaveštenje o završetku)
Preuzimanje uređaja
Rok za podizanje{{.RokPodizanja.Format "02.01.2006."}} auto30 dana od završetka
Rok za podizanje— upisuje se po završetku —
+
+ + {{if .Nalog.NalazDijagnostike}} +
+
Nalaz dijagnostike
+
{{.Nalog.NalazDijagnostike}}
+
+ {{end}} + + {{if .Nalog.Napomena}} +
+
Interna napomena
+
{{.Nalog.Napomena}}
+
+ {{end}} + +
+ + +