diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 5e07458..4dc0b89 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -339,6 +339,7 @@ func main() { 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}/status", h.PromeniStatus) 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/db/repository.go b/internal/db/repository.go index 94cee0d..3fceb26 100644 --- a/internal/db/repository.go +++ b/internal/db/repository.go @@ -114,6 +114,7 @@ type ServisRepository interface { DohvatiID(ctx context.Context, id int64) (*model.ServisniNalog, error) Kreiraj(ctx context.Context, n *model.ServisniNalog) (int64, error) Izmeni(ctx context.Context, n *model.ServisniNalog) error + AzurirajStatus(ctx context.Context, id int64, status string) error Obrisi(ctx context.Context, id int64) error SledeciBroj(ctx context.Context) (string, error) } diff --git a/internal/db/sqlite/servis.go b/internal/db/sqlite/servis.go index 37a55bf..8d5d51c 100644 --- a/internal/db/sqlite/servis.go +++ b/internal/db/sqlite/servis.go @@ -152,6 +152,24 @@ func (r *ServisRepo) Izmeni(ctx context.Context, n *model.ServisniNalog) error { return nil } +// AzurirajStatus menja samo status naloga; ako nalog prelazi u završno stanje +// i datum_zavrsetka još nije postavljen, automatski ga postavlja na danas. +func (r *ServisRepo) AzurirajStatus(ctx context.Context, id int64, status string) error { + var upit string + if status == model.StatusZavrseno || status == model.StatusPreuzeto { + upit = `UPDATE servisni_nalozi SET status = ?, + datum_zavrsetka = COALESCE(datum_zavrsetka, date('now', 'localtime')) + WHERE id = ?` + } else { + upit = `UPDATE servisni_nalozi SET status = ? WHERE id = ?` + } + _, err := r.db.ExecContext(ctx, upit, status, id) + if err != nil { + return fmt.Errorf("ntech: ServisRepo.AzurirajStatus: %w", err) + } + return nil +} + // Obrisi briše servisni nalog po ID-u func (r *ServisRepo) Obrisi(ctx context.Context, id int64) error { _, err := r.db.ExecContext(ctx, "DELETE FROM servisni_nalozi WHERE id = ?", id) diff --git a/internal/handler/servis.go b/internal/handler/servis.go index d11285a..6fa8bec 100644 --- a/internal/handler/servis.go +++ b/internal/handler/servis.go @@ -49,6 +49,7 @@ type PodaciDetaljiNaloga struct { UkupnoDelovi float64 UkupnoSve float64 PreostaloSve float64 + SviStatusi []string } // Servis renderuje listu servisnih naloga sa opcionom pretragom i filterom statusa @@ -389,6 +390,7 @@ func (h *Handler) DetaljiNaloga(w http.ResponseWriter, r *http.Request) { UkupnoDelovi: ukupnoDelovi, UkupnoSve: ukupnoSve, PreostaloSve: preostaloSve, + SviStatusi: model.SviStatusi, } h.renderujTemplate(w, "servis_detalji", podaci) @@ -756,3 +758,31 @@ func (h *Handler) StampaOtpremnice(w http.ResponseWriter, r *http.Request) { PIB: podesavanja["pib"], }) } + +// PromeniStatus obrađuje POST /servis/{id}/status i menja samo status naloga +func (h *Handler) PromeniStatus(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 + } + if err := r.ParseForm(); err != nil { + http.Error(w, "Greška pri čitanju forme", http.StatusBadRequest) + return + } + noviStatus := strings.TrimSpace(r.FormValue("status")) + dozvoljenStatusi := map[string]bool{} + for _, s := range model.SviStatusi { + dozvoljenStatusi[s] = true + } + if !dozvoljenStatusi[noviStatus] { + http.Error(w, "Nepoznat status", http.StatusBadRequest) + return + } + if err := h.ServisRepo.AzurirajStatus(r.Context(), id, noviStatus); err != nil { + slog.Error("greška pri promeni statusa naloga", "id", id, "error", err) + http.Error(w, "Greška pri promeni statusa", http.StatusInternalServerError) + return + } + http.Redirect(w, r, "/servis/"+strconv.FormatInt(id, 10)+"?sacuvano=1", http.StatusSeeOther) +} diff --git a/web/templates/stranice/servis_detalji.html b/web/templates/stranice/servis_detalji.html index 6867522..1594963 100644 --- a/web/templates/stranice/servis_detalji.html +++ b/web/templates/stranice/servis_detalji.html @@ -43,7 +43,18 @@ {{.Nalog.BrojNaloga}} - {{template "status-badge-detalji" .Nalog.Status}} +