Servis: logo na dokumentima, jedinstveno 3-kolonsko zaglavlje, podesiva QR adresa, javni status

- Logo na dokumentima ako je ukljucen prikaz loga; helper logoZaDokument
- Jedinstveno zaglavlje (revers/predracun/otpremnica/radni nalog): firma | klijent | barkod+broj+datumi+QR; dodati MB i barkod
- Revers: QR u sekciju Uredjaj desno, bez JMBG, Primio bez imena servisera
- Podesavanja Opste: auto-snimanje sve 3 sekcije (marker _sekcija_firma za checkbox loga)
- Podesiva adresa za QR (qr_bazni_url) za pristup sa telefona / Caddy HTTPS
- Javni status: token se gasi po preuzimanju; predvidjeni datum zavrsetka, garancija i napomena iz baze; nova kartica Radovi i delovi sa procenom
This commit is contained in:
2026-06-23 14:38:26 +02:00
parent 51febc5d41
commit a8d5b0e9b4
9 changed files with 335 additions and 291 deletions
+22 -4
View File
@@ -67,6 +67,7 @@ type PodaciPodesavanja struct {
PredvidjenRokDana string
ServisUslovi string
ServisKlauzulaPredracuna string
QrBazniUrl string
LoginPozadina string
LoginPozadinaOpacity string
LoginPozadinaBlurPozadine string
@@ -280,10 +281,17 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) {
return
}
// checkbox-i: šalju vrednost samo kada su čekirani, pa ih uvek eksplicitno čitamo
topbarLogoSlika := "0"
if r.FormValue("topbar_logo_slika") == "1" {
topbarLogoSlika = "1"
// checkbox „topbar_logo_slika" živi u Firma sekciji. Pošto se sekcije auto-snimaju
// odvojeno, čitamo ga SAMO kad je poslata Firma sekcija (marker `_sekcija_firma`),
// inače ostaje "" pa ga petlja ispod preskoči i ne dira postojeću vrednost.
// (Checkbox koji nije čekiran se ne šalje, pa bi inače snimanje druge sekcije
// ugasilo logo u topbaru.)
topbarLogoSlika := ""
if _, jeFirmaSekcija := r.Form["_sekcija_firma"]; jeFirmaSekcija {
topbarLogoSlika = "0"
if r.FormValue("topbar_logo_slika") == "1" {
topbarLogoSlika = "1"
}
}
// matični broj — 8 cifara; prazno je dozvoljeno (polje nije obavezno)
@@ -441,6 +449,15 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) {
}
}
// bazna adresa za QR kod (npr. http://192.168.1.25:3000); prazno → koristi se host iz zahteva
if _, ima := r.Form["qr_bazni_url"]; ima {
bazni := strings.TrimSpace(r.FormValue("qr_bazni_url"))
if err := ntechsqlite.SacuvajPodesavanje(r.Context(), h.DB, "qr_bazni_url", bazni); err != nil {
http.Error(w, "Greška pri čuvanju podešavanja", http.StatusInternalServerError)
return
}
}
http.Redirect(w, r, sledeci+"?sacuvano=1", http.StatusSeeOther)
}
@@ -818,6 +835,7 @@ func (h *Handler) napuniPodaciPodesavanja(r *http.Request, naslov string) (Podac
PredvidjenRokDana: vrednostIliDefault(podesavanja, "predvidjen_rok_dana", "15"),
ServisUslovi: vrednostIliDefault(podesavanja, "servis_uslovi", podrazumevaniUsloviServisa),
ServisKlauzulaPredracuna: vrednostIliDefault(podesavanja, "servis_klauzula_predracuna", podrazumevanaKlauzulaPredracuna),
QrBazniUrl: podesavanja["qr_bazni_url"],
}, nil
}