Servis: garancija po trajanju (dana) umesto fiksnog datuma

Garancija se sad čuva kao broj dana (GarancijaDana), a konkretan datum
(GarancijaDo) se računa tek kad nalog pređe u Završeno/Preuzeto — na osnovu
stvarnog datuma završetka, ne datuma prijema. Ranije se datum računao odmah
pri prijemu naloga, pa je garancija krenula da teče pre nego što je popravka
uopšte gotova.
This commit is contained in:
2026-07-02 10:42:01 +02:00
parent e26bda5d34
commit 2cc9c24aa9
+33 -21
View File
@@ -188,12 +188,13 @@ func (h *Handler) NoviNalog(w http.ResponseWriter, r *http.Request) {
ps := h.popuniPodaciStranice(r, podesavanja)
ps.Stranica = "servis"
ps.NaslovStranice = "Novi nalog"
dana := defaultGarancijaDana(podesavanja)
noviNalog := model.ServisniNalog{
BrojNaloga: brojNaloga,
Status: model.StatusPrimljeno,
DatumPrijema: time.Now(),
}
noviNalog.GarancijaDo = defaultGarancija(noviNalog.DatumPrijema, podesavanja)
noviNalog.GarancijaDana = &dana
h.renderujFormuNaloga(w, PodaciFormeNaloga{
PodaciStranice: ps,
Nalog: noviNalog,
@@ -236,9 +237,10 @@ func (h *Handler) SacuvajNalog(w http.ResponseWriter, r *http.Request) {
// forma novog naloga ne sadrži polje garancije — primeni podrazumevanu
// garanciju iz podešavanja, osim ako je korisnik izričito izabrao „bez garancije"
if nalog.GarancijaDo == nil && r.FormValue("bez_garancije") != "1" {
if nalog.GarancijaDana == nil && r.FormValue("bez_garancije") != "1" {
podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
nalog.GarancijaDo = defaultGarancija(nalog.DatumPrijema, podesavanja)
dana := defaultGarancijaDana(podesavanja)
nalog.GarancijaDana = &dana
}
// garancija ne sme da bude pre datuma prijema
@@ -337,14 +339,12 @@ func (h *Handler) IzmeniNalog(w http.ResponseWriter, r *http.Request) {
return
}
garancijaDefault := ""
if d := defaultGarancija(nalog.DatumPrijema, podesavanja); d != nil {
garancijaDefault = d.Format("2006-01-02")
}
garancijaDefault := strconv.Itoa(defaultGarancijaDana(podesavanja))
// stanje „bez garancije" čitamo iz baze pre nego što popunimo default za prikaz
bezGarancije := nalog.GarancijaDo == nil
if nalog.GarancijaDo == nil {
nalog.GarancijaDo = defaultGarancija(nalog.DatumPrijema, podesavanja)
bezGarancije := nalog.GarancijaDana == nil || *nalog.GarancijaDana <= 0
if nalog.GarancijaDana == nil {
dana := defaultGarancijaDana(podesavanja)
nalog.GarancijaDana = &dana
}
ps := h.popuniPodaciStranice(r, podesavanja)
ps.Stranica = "servis"
@@ -1230,17 +1230,6 @@ func (h *Handler) mozdaKreirajKlijenta(ctx context.Context, r *http.Request, nal
return ""
}
// defaultGarancija vraća datum garancije na osnovu datuma prijema i podešavanja;
// vraća nil ako je rok 0 ili podešavanje nedostaje
func defaultGarancija(datumPrijema time.Time, podesavanja map[string]string) *time.Time {
meseci, err := strconv.Atoi(vrednostIliDefault(podesavanja, "servis_garancija_meseci", "2"))
if err != nil || meseci <= 0 {
return nil
}
t := datumPrijema.AddDate(0, meseci, 0)
return &t
}
// defaultPredvidjenDatum računa predviđen rok popravke kao datum prijema + broj
// dana iz podešavanja (predvidjen_rok_dana, podrazumevano 15)
func defaultPredvidjenDatum(datumPrijema time.Time, podesavanja map[string]string) *time.Time {
@@ -2154,6 +2143,17 @@ func (h *Handler) PromeniStatus(w http.ResponseWriter, r *http.Request) {
_ = h.ServisniLogRepo.Kreiraj(r.Context(), id, "status:"+noviStatus, nil)
}
// pri prelasku u Završeno ili Preuzeto — auto-izračunaj garancija_do ako je postavljeno trajanje
if noviStatus == model.StatusZavrseno || noviStatus == model.StatusPreuzeto {
nalog, _ := h.ServisRepo.DohvatiID(r.Context(), id)
if nalog != nil && nalog.GarancijaDana != nil && *nalog.GarancijaDana > 0 && nalog.GarancijaDo == nil {
if nalog.DatumZavrsetka != nil {
garancijaDo := nalog.DatumZavrsetka.AddDate(0, 0, *nalog.GarancijaDana)
_ = h.ServisRepo.AzurirajGaranciju(r.Context(), id, &garancijaDo)
}
}
}
// pri prelasku u Preuzeto — auto-izračunaj cenu_konacnu ako nije uneta, pa sačuvaj naplatu i fiskalizuj
if noviStatus == model.StatusPreuzeto {
nalog, _ := h.ServisRepo.DohvatiID(r.Context(), id)
@@ -2565,6 +2565,18 @@ func (h *Handler) AzurirajGarancijaDana(w http.ResponseWriter, r *http.Request)
http.Error(w, "Greška pri ažuriranju garancije", http.StatusInternalServerError)
return
}
// ako je nalog već završen/preuzet, odmah preračunaj i garancija_do
if dana != nil && *dana > 0 {
nalog, _ := h.ServisRepo.DohvatiID(r.Context(), id)
if nalog != nil && (nalog.Status == model.StatusZavrseno || nalog.Status == model.StatusPreuzeto) {
if nalog.DatumZavrsetka != nil {
garancijaDo := nalog.DatumZavrsetka.AddDate(0, 0, *dana)
_ = h.ServisRepo.AzurirajGaranciju(r.Context(), id, &garancijaDo)
}
}
}
http.Redirect(w, r, "/servis/"+strconv.FormatInt(id, 10), http.StatusSeeOther)
}