From a8d5b0e9b4f43b126224095f19a0ff66eae0fece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Tue, 23 Jun 2026 14:38:26 +0200 Subject: [PATCH] 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 --- internal/handler/podesavanja.go | 26 +++- internal/handler/servis.go | 99 ++++++++++-- web/templates/stranice/podesavanja_opste.html | 31 +--- .../stranice/podesavanja_servis.html | 14 ++ web/templates/stranice/servis_otpremnica.html | 71 ++++----- web/templates/stranice/servis_predracun.html | 74 ++++----- .../stranice/servis_radni_nalog.html | 68 ++++----- web/templates/stranice/servis_revers.html | 141 +++++++++--------- .../stranice/servis_status_javni.html | 102 ++++++------- 9 files changed, 335 insertions(+), 291 deletions(-) diff --git a/internal/handler/podesavanja.go b/internal/handler/podesavanja.go index 7959a71..33363fc 100644 --- a/internal/handler/podesavanja.go +++ b/internal/handler/podesavanja.go @@ -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 } diff --git a/internal/handler/servis.go b/internal/handler/servis.go index d02506e..24a6a71 100644 --- a/internal/handler/servis.go +++ b/internal/handler/servis.go @@ -1106,6 +1106,15 @@ func (h *Handler) renderujFormuNaloga(w http.ResponseWriter, podaci PodaciFormeN } // PodaciRadnogNaloga su podaci za interni radni list servisera (bez cena) +// logoZaDokument vraća putanju loga za štampu na dokumentima — samo ako je u +// Podešavanja → Opšte uključeno „Prikaži logo" (topbar_logo_slika). Inače prazno. +func logoZaDokument(podesavanja map[string]string) string { + if podesavanja["topbar_logo_slika"] == "1" { + return podesavanja["logo_putanja"] + } + return "" +} + type PodaciRadnogNaloga struct { Nalog model.ServisniNalog ServisniDelovi []model.ServisniDeoSaArtiklom @@ -1113,6 +1122,7 @@ type PodaciRadnogNaloga struct { KlijentTelefon string TehnicarNaziv string NazivFirme string + LogoPutanja string Barkod string // base64 PNG Code128 barkoda broja naloga (za skener) } @@ -1171,6 +1181,7 @@ func (h *Handler) StampaRadnogNaloga(w http.ResponseWriter, r *http.Request) { KlijentTelefon: klijentTelefon, TehnicarNaziv: tehnicarNaziv, NazivFirme: podesavanja["naziv_firme"], + LogoPutanja: logoZaDokument(podesavanja), Barkod: barkodNaloga(nalog.BrojNaloga), }) } @@ -1187,10 +1198,13 @@ type PodaciOtpremnice struct { KlijentNaziv string TehnicarNaziv string NazivFirme string + LogoPutanja string Podnazlov string Adresa string Telefon string PIB string + MaticniBroj string + Barkod string // base64 PNG Code128 barkoda broja naloga } // StampaOtpremnice renderuje otpremnicu pri preuzimanju uređaja od strane klijenta @@ -1260,7 +1274,7 @@ func (h *Handler) StampaOtpremnice(w http.ResponseWriter, r *http.Request) { } } - nalogURL := qrNalogURL(r, nalog.JavniToken) + nalogURL := qrNalogURL(r, nalog.JavniToken, podesavanja["qr_bazni_url"]) var qrKodOtpr string if png, err := qrcode.Encode(nalogURL, qrcode.Medium, 160); err == nil { qrKodOtpr = base64.StdEncoding.EncodeToString(png) @@ -1277,10 +1291,13 @@ func (h *Handler) StampaOtpremnice(w http.ResponseWriter, r *http.Request) { KlijentNaziv: klijentNaziv, TehnicarNaziv: tehnicarNaziv, 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), }) } @@ -1296,10 +1313,13 @@ type PodaciReversa struct { QRKod string // base64 QR ka javnoj status strani naloga Uslovi string // uslovi servisa iz podešavanja (servis_uslovi) NazivFirme string + LogoPutanja string Podnazlov string Adresa string Telefon string PIB string + MaticniBroj string + Barkod string // base64 PNG Code128 barkoda broja naloga } // StampaReversa renderuje revers (potvrdu o prijemu uređaja na servis) @@ -1346,7 +1366,7 @@ func (h *Handler) StampaReversa(w http.ResponseWriter, r *http.Request) { } } - nalogURL := qrNalogURL(r, nalog.JavniToken) + nalogURL := qrNalogURL(r, nalog.JavniToken, podesavanja["qr_bazni_url"]) var qrKod string if png, err := qrcode.Encode(nalogURL, qrcode.Medium, 160); err == nil { qrKod = base64.StdEncoding.EncodeToString(png) @@ -1362,10 +1382,13 @@ func (h *Handler) StampaReversa(w http.ResponseWriter, r *http.Request) { QRKod: qrKod, Uslovi: vrednostIliDefault(podesavanja, "servis_uslovi", podrazumevaniUsloviServisa), 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), }) } @@ -1386,10 +1409,13 @@ type PodaciPredracuna struct { KlijentNaziv string TehnicarNaziv string NazivFirme string + LogoPutanja string Podnazlov string Adresa string Telefon string PIB string + MaticniBroj string + Barkod string // base64 PNG Code128 barkoda broja naloga } // StampaPredracuna renderuje predračun (procenu cene) na osnovu traženih radova i delova @@ -1459,7 +1485,7 @@ func (h *Handler) StampaPredracuna(w http.ResponseWriter, r *http.Request) { datumIzdavanja := time.Now() vaziDo := datumIzdavanja.AddDate(0, 0, rok) - nalogURL := qrNalogURL(r, nalog.JavniToken) + nalogURL := qrNalogURL(r, nalog.JavniToken, podesavanja["qr_bazni_url"]) var qrKod string if png, err := qrcode.Encode(nalogURL, qrcode.Medium, 160); err == nil { qrKod = base64.StdEncoding.EncodeToString(png) @@ -1480,10 +1506,13 @@ func (h *Handler) StampaPredracuna(w http.ResponseWriter, r *http.Request) { KlijentNaziv: klijentNaziv, TehnicarNaziv: tehnicarNaziv, 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), }) } @@ -1779,11 +1808,20 @@ func (h *Handler) SacuvajNapomenuKlijentu(w http.ResponseWriter, r *http.Request // PodaciJavnogStatusa su podaci za javnu status stranicu servisnog naloga type PodaciJavnogStatusa struct { - Nalog model.ServisniNalog - NazivFirme string - Telefon string - Adresa string - SviStatusi []string + Nalog model.ServisniNalog + NazivFirme string + LogoPutanja string + Podnazlov string + Adresa string + Telefon string + PIB string + MaticniBroj string + Radovi []model.ServisniRad + UkupnoRad float64 + ServisniDelovi []model.ServisniDeoSaArtiklom + UkupnoDelovi float64 + UkupnoSve float64 + SviStatusi []string } // ServisJavniStatus prikazuje javnu status stranicu — dostupna bez prijave putem QR koda @@ -1800,21 +1838,50 @@ func (h *Handler) ServisJavniStatus(w http.ResponseWriter, r *http.Request) { return } + // javni link se „gasi" čim klijent preuzme uređaj — posle preuzimanja status više nije dostupan + if nalog.Status == model.StatusPreuzeto { + http.NotFound(w, r) + return + } + + radovi, _ := h.ServisniRadoviRepo.DohvatiZaNalog(r.Context(), nalog.ID) + delovi, _ := h.deloviSaPotrazivanima(r.Context(), nalog.ID) + var ukupnoRad, ukupnoDelovi float64 + for _, rd := range radovi { + ukupnoRad += rd.Ukupno() + } + for _, d := range delovi { + ukupnoDelovi += d.Ukupno() + } + podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB) h.renderujStandalone(w, "servis_status_javni", PodaciJavnogStatusa{ - Nalog: *nalog, - NazivFirme: podesavanja["naziv_firme"], - Telefon: podesavanja["telefon"], - Adresa: podesavanja["adresa"], - SviStatusi: model.SviStatusi, + Nalog: *nalog, + NazivFirme: podesavanja["naziv_firme"], + LogoPutanja: logoZaDokument(podesavanja), + Podnazlov: podesavanja["podnazlov"], + Adresa: podesavanja["adresa"], + Telefon: podesavanja["telefon"], + PIB: podesavanja["pib"], + MaticniBroj: podesavanja["maticni_broj"], + Radovi: radovi, + UkupnoRad: ukupnoRad, + ServisniDelovi: delovi, + UkupnoDelovi: ukupnoDelovi, + UkupnoSve: ukupnoRad + ukupnoDelovi, + SviStatusi: model.SviStatusi, }) } // qrNalogURL konstruiše URL za QR kod vodeći računa o reverse proxy-ju. -// Ako aplikacija radi iza nginx/Caddy/Traefik koji prekida TLS, r.TLS je nil, -// ali X-Forwarded-Proto header sadrži stvarnu šemu. -func qrNalogURL(r *http.Request, token string) string { +// Ako je u podešavanjima zadata fiksna adresa (bazniURL, npr. http://192.168.1.25:3000), +// koristi se ona — korisno da QR radi sa telefona kad se programu pristupa preko „localhost". +// Inače se host i šema čitaju iz zahteva (X-Forwarded-Proto pokriva nginx/Caddy/Traefik). +func qrNalogURL(r *http.Request, token, bazniURL string) string { + if b := strings.TrimRight(strings.TrimSpace(bazniURL), "/"); b != "" { + return b + "/status/" + token + } scheme := "http" if r.TLS != nil { scheme = "https" diff --git a/web/templates/stranice/podesavanja_opste.html b/web/templates/stranice/podesavanja_opste.html index f9de6fe..edb09f0 100644 --- a/web/templates/stranice/podesavanja_opste.html +++ b/web/templates/stranice/podesavanja_opste.html @@ -50,9 +50,10 @@ -
+ +
@@ -117,19 +118,11 @@
- -
- -
-
+
@@ -169,19 +162,11 @@
- -
- -
-
+
@@ -258,14 +243,6 @@
- -
- -
diff --git a/web/templates/stranice/podesavanja_servis.html b/web/templates/stranice/podesavanja_servis.html index e5c0129..907575a 100644 --- a/web/templates/stranice/podesavanja_servis.html +++ b/web/templates/stranice/podesavanja_servis.html @@ -89,6 +89,20 @@ Napomena na dnu predračuna (procena cene). Snima se automatski. + +
+ + +
+ Adresa koju otvara QR kod sa dokumenata kad ga klijent skenira telefonom. Ostavi prazno + da se koristi adresa iz pregledača. Za pristup sa telefona na lokalnoj mreži upiši IP + adresu servera (npr. http://192.168.1.25:3000). Snima se automatski. +
+
diff --git a/web/templates/stranice/servis_otpremnica.html b/web/templates/stranice/servis_otpremnica.html index 4aaca0c..f66ac3f 100644 --- a/web/templates/stranice/servis_otpremnica.html +++ b/web/templates/stranice/servis_otpremnica.html @@ -10,14 +10,14 @@ .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } - /* zaglavlje */ - .zaglavlje { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 24px; padding-bottom: 16px; border-bottom: 2px solid #111; gap: 20px; } - .firma-naziv { font-size: 20px; font-weight: 700; } + /* zaglavlje: tri okvira (firma · klijent · dokument) */ + .zaglavlje { display: flex; align-items: stretch; margin-bottom: 20px; gap: 12px; } + .zg-okvir { flex: 1; padding: 12px 14px; border: 0.5px solid #ddd; border-radius: 6px; } + .firma-naziv { font-size: 18px; font-weight: 700; } .firma-info { font-size: 11px; color: #555; margin-top: 4px; line-height: 1.7; } - .dok-naslov { text-align: right; } .dok-tip { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; color: #555; margin-bottom: 4px; } - .dok-broj { font-size: 22px; font-weight: 700; font-family: monospace; } - .dok-datum { font-size: 12px; color: #555; margin-top: 6px; } + .dok-broj { font-size: 18px; font-weight: 700; font-family: monospace; } + .dok-datum { font-size: 12px; color: #555; margin-top: 4px; } /* strane */ .strane-blok { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 20px; } @@ -79,57 +79,52 @@
-
+ +
+ {{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 .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}}
-
-
-
Otpremnica
-
{{.Nalog.BrojNaloga}}
-
Datum: {{.Nalog.DatumPrijema.Format "02.01.2006."}}
- {{if .Nalog.DatumZavrsetka}} -
Završeno: {{.Nalog.DatumZavrsetka.Format "02.01.2006."}}
- {{end}} -
- {{if .QRKod}} - QR {{.Nalog.BrojNaloga}} - {{end}} -
-
- - -
-
-
Isporučilac
-
{{if .NazivFirme}}{{.NazivFirme}}{{else}}—{{end}}
-
- {{if .Adresa}}{{.Adresa}}
{{end}} - {{if .Telefon}}{{telefon .Telefon}}{{end}} -
-
-
-
Primalac (klijent)
+ +
+
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}} + {{if .Klijent.Mesto}}{{.Klijent.Mesto}}
{{end}} + {{if .Klijent.PIB}}PIB: {{.Klijent.PIB}}{{end}} {{end}}
{{else}}
— klijent nije naveden —
{{end}}
+ +
+ {{if .Barkod}}Barkod {{.Nalog.BrojNaloga}}{{end}} +
+
+
Otpremnica
+
{{.Nalog.BrojNaloga}}
+
Datum: {{.Nalog.DatumPrijema.Format "02.01.2006."}}
+ {{if .Nalog.DatumZavrsetka}} +
Završeno: {{.Nalog.DatumZavrsetka.Format "02.01.2006."}}
+ {{end}} +
+ {{if .QRKod}}QR {{.Nalog.BrojNaloga}}{{end}} +
+
diff --git a/web/templates/stranice/servis_predracun.html b/web/templates/stranice/servis_predracun.html index 8751e10..e6d0643 100644 --- a/web/templates/stranice/servis_predracun.html +++ b/web/templates/stranice/servis_predracun.html @@ -10,13 +10,13 @@ .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } - .zaglavlje { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 24px; padding-bottom: 16px; border-bottom: 2px solid #111; gap: 20px; } - .firma-naziv { font-size: 20px; font-weight: 700; } - .firma-info { font-size: 11px; color: #555; margin-top: 4px; line-height: 1.7; } - .dok-naslov { text-align: right; } + .zaglavlje { display: flex; align-items: stretch; margin-bottom: 18px; gap: 12px; } + .zg-okvir { flex: 1; padding: 12px 14px; border: 0.5px solid #ddd; border-radius: 6px; } + .firma-naziv { font-size: 18px; font-weight: 700; } + .firma-info { font-size: 11px; color: #555; margin-top: 3px; line-height: 1.5; } .dok-tip { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; color: #555; margin-bottom: 4px; } - .dok-broj { font-size: 22px; font-weight: 700; font-family: monospace; } - .dok-datum { font-size: 12px; color: #555; margin-top: 6px; } + .dok-broj { font-size: 18px; font-weight: 700; font-family: monospace; } + .dok-datum { font-size: 12px; color: #555; margin-top: 4px; } .strane-blok { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 20px; } .strana-kartica { padding: 12px 14px; border: 0.5px solid #ddd; border-radius: 6px; } @@ -53,6 +53,12 @@ .strana { padding: 16px 20px; max-width: 100%; } .dugme-stampa { display: none !important; } @page { size: A4; margin: 12mm 14mm; } + /* red tabele se ne sme prelomiti preko granice stranice */ + .tabela tr { break-inside: avoid; } + /* zaglavlje tabele se ponavlja na svakoj stranici kad tabela pređe na novu */ + .tabela thead { display: table-header-group; } + /* rekapitulacija, klauzula i potpisi ostaju u jednom komadu */ + .rekap, .klauzula-blok, .potpisi { break-inside: avoid; } } .dugme-stampa { position: fixed; bottom: 24px; right: 24px; background: #111; color: #fff; border: none; padding: 12px 22px; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; box-shadow: 0 4px 12px rgba(0,0,0,0.2); } .dugme-stampa:hover { background: #333; } @@ -63,54 +69,50 @@
-
+ +
+ {{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 .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}}
-
-
-
Predračun (procena)
-
{{.Nalog.BrojNaloga}}
-
Datum: {{.DatumIzdavanja.Format "02.01.2006."}}
-
Važi do: {{.VaziDo.Format "02.01.2006."}}
-
- {{if .QRKod}} - QR {{.Nalog.BrojNaloga}} - {{end}} -
-
- - -
-
-
Izdao (servis)
-
{{if .NazivFirme}}{{.NazivFirme}}{{else}}—{{end}}
-
- {{if .Adresa}}{{.Adresa}}
{{end}} - {{if .Telefon}}{{telefon .Telefon}}{{end}} -
-
-
-
Za (klijent)
+ +
+
Klijent
{{if .KlijentNaziv}}
{{.KlijentNaziv}}
{{if .Klijent}} {{if .Klijent.Telefon}}Tel: {{telefon .Klijent.Telefon}}
{{end}} - {{if .Klijent.Mesto}}{{.Klijent.Mesto}}{{end}} + {{if .Klijent.Email}}{{.Klijent.Email}}
{{end}} + {{if .Klijent.Mesto}}{{.Klijent.Mesto}}
{{end}} + {{if .Klijent.PIB}}PIB: {{.Klijent.PIB}}{{end}} {{end}}
{{else}}
— klijent nije naveden —
{{end}}
+ +
+ {{if .Barkod}}Barkod {{.Nalog.BrojNaloga}}{{end}} +
+
+
Predračun (procena)
+
{{.Nalog.BrojNaloga}}
+
Datum: {{.DatumIzdavanja.Format "02.01.2006."}}
+
Važi do: {{.VaziDo.Format "02.01.2006."}}
+
+ {{if .QRKod}}QR {{.Nalog.BrojNaloga}}{{end}} +
+
diff --git a/web/templates/stranice/servis_radni_nalog.html b/web/templates/stranice/servis_radni_nalog.html index 159095c..d0eab1e 100644 --- a/web/templates/stranice/servis_radni_nalog.html +++ b/web/templates/stranice/servis_radni_nalog.html @@ -11,15 +11,15 @@ .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } /* zaglavlje */ - .zaglavlje { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 24px; padding-bottom: 14px; border-bottom: 2px solid #111; gap: 20px; } + .zaglavlje { display: flex; align-items: stretch; margin-bottom: 20px; gap: 12px; } + .zg-okvir { flex: 1; padding: 12px 14px; border: 0.5px solid #ddd; border-radius: 6px; } .firma-naziv { font-size: 16px; font-weight: 700; } .firma-podnaslov { font-size: 11px; color: #666; text-transform: uppercase; letter-spacing: 1px; margin-top: 2px; } - .nalog-desno { text-align: right; } .nalog-naslov { font-size: 11px; color: #555; text-transform: uppercase; letter-spacing: 0.6px; margin-bottom: 2px; } - .nalog-broj { font-size: 22px; font-weight: 700; font-family: monospace; } + .nalog-broj { font-size: 18px; font-weight: 700; font-family: monospace; } .status { display: inline-block; margin-top: 6px; padding: 2px 10px; border-radius: 20px; font-size: 11px; font-weight: 600; border: 1.5px solid #111; } - .barkod { margin-top: 8px; } - .barkod img { display: block; height: 11mm; width: 52mm; object-fit: fill; margin-left: auto; } + .barkod { margin-bottom: 10px; } + .barkod img { display: block; width: 100%; max-height: 46px; object-fit: contain; } /* odeljci */ .odeljak { margin-bottom: 18px; } @@ -69,50 +69,34 @@
-
+ +
+ {{if .LogoPutanja}} + Logo + {{else}}
{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}
+ {{end}}
Radni nalog — interni
-
-
Broj naloga
-
{{.Nalog.BrojNaloga}}
-
{{.Nalog.Status}}
+ +
+
Klijent
+
{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}{{end}}
+ {{if .KlijentTelefon}}
Tel: {{telefon .KlijentTelefon}}
{{end}} +
+ +
{{if .Barkod}}
Barkod {{.Nalog.BrojNaloga}}
{{end}} -
-
- - -
-
Osnovni podaci
-
-
-
Datum prijema
-
{{.Nalog.DatumPrijema.Format "02.01.2006. u 15:04"}}
+
Broj naloga
+
{{.Nalog.BrojNaloga}}
+
{{.Nalog.Status}}
+
+ Prijem: {{.Nalog.DatumPrijema.Format "02.01.2006."}} + {{if .Nalog.PredvidjenDatum}}
Rok: {{.Nalog.PredvidjenDatum.Format "02.01.2006."}}{{end}} + {{if .TehnicarNaziv}}
Serviser: {{.TehnicarNaziv}}{{end}}
- {{if .Nalog.PredvidjenDatum}} -
-
Predviđen rok
-
{{.Nalog.PredvidjenDatum.Format "02.01.2006."}}
-
- {{end}} - {{if .TehnicarNaziv}} -
-
Serviser
-
{{.TehnicarNaziv}}
-
- {{end}} -
-
Klijent
-
{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}{{end}}
-
- {{if .KlijentTelefon}} -
-
Telefon klijenta
-
{{telefon .KlijentTelefon}}
-
- {{end}}
diff --git a/web/templates/stranice/servis_revers.html b/web/templates/stranice/servis_revers.html index 27e0241..4deba51 100644 --- a/web/templates/stranice/servis_revers.html +++ b/web/templates/stranice/servis_revers.html @@ -10,14 +10,14 @@ .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } - /* zaglavlje */ - .zaglavlje { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 24px; padding-bottom: 16px; border-bottom: 2px solid #111; gap: 20px; } - .firma-naziv { font-size: 20px; font-weight: 700; } + /* zaglavlje: tri okvira (firma · klijent · dokument) */ + .zaglavlje { display: flex; align-items: stretch; margin-bottom: 20px; gap: 12px; } + .zg-okvir { flex: 1; padding: 12px 14px; border: 0.5px solid #ddd; border-radius: 6px; } + .firma-naziv { font-size: 18px; font-weight: 700; } .firma-info { font-size: 11px; color: #555; margin-top: 4px; line-height: 1.7; } - .dok-naslov { text-align: right; } .dok-tip { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; color: #555; margin-bottom: 4px; } - .dok-broj { font-size: 22px; font-weight: 700; font-family: monospace; } - .dok-datum { font-size: 12px; color: #555; margin-top: 6px; } + .dok-broj { font-size: 18px; font-weight: 700; font-family: monospace; } + .dok-datum { font-size: 12px; color: #555; margin-top: 4px; } /* strane */ .strane-blok { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 20px; } @@ -69,96 +69,97 @@
-
+ +
+ {{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 .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}}
-
-
-
Revers — potvrda o prijemu
-
{{.Nalog.BrojNaloga}}
-
Datum prijema: {{.Nalog.DatumPrijema.Format "02.01.2006."}}
- {{if .Nalog.PredvidjenDatum}} -
Predviđen rok: {{.Nalog.PredvidjenDatum.Format "02.01.2006."}}
- {{end}} -
- {{if .QRKod}} - QR {{.Nalog.BrojNaloga}} - {{end}} -
-
- - -
-
-
Primio (servis)
-
{{if .NazivFirme}}{{.NazivFirme}}{{else}}—{{end}}
-
- {{if .Adresa}}{{.Adresa}}
{{end}} - {{if .Telefon}}{{telefon .Telefon}}{{end}} -
-
-
-
Predao (klijent)
+ +
+
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}} + {{if .Klijent.PIB}}PIB: {{.Klijent.PIB}}{{end}} {{end}} - {{if .KlijentBrojIdent}}{{.KlijentOznakaIdent}}: {{.KlijentBrojIdent}}{{end}}
{{else}}
— klijent nije naveden —
{{end}}
+ +
+ {{if .Barkod}}Barkod {{.Nalog.BrojNaloga}}{{end}} +
Revers — potvrda o prijemu
+
{{.Nalog.BrojNaloga}}
+
Datum prijema: {{.Nalog.DatumPrijema.Format "02.01.2006."}}
+ {{if .Nalog.PredvidjenDatum}} +
Predviđen rok: {{.Nalog.PredvidjenDatum.Format "02.01.2006."}}
+ {{end}} +
- +
Uređaj na servisu
-
-
-
Naziv uređaja
-
{{if .Nalog.Uredjaj}}{{.Nalog.Uredjaj}}{{else}}{{end}}
+
+
+
+
+
Naziv uređaja
+
{{if .Nalog.Uredjaj}}{{.Nalog.Uredjaj}}{{else}}{{end}}
+
+
+
Serijski broj
+
{{if .Nalog.SerijskiBroj}}{{.Nalog.SerijskiBroj}}{{else}}{{end}}
+
+ {{if .Nalog.PinUredjaja}} +
+
PIN / lozinka
+
{{.Nalog.PinUredjaja}}
+
+ {{end}} +
+ {{if .Nalog.Pribor}} +
+
Pribor predat uz uređaj
+
{{.Nalog.Pribor}}
+
+ {{end}} + {{if .Nalog.Ostecenja}} +
+
Vidljiva oštećenja pri prijemu
+
{{.Nalog.Ostecenja}}
+
+ {{end}} + {{if .Nalog.TrazeneNadogradnje}} +
+
Tražene nadogradnje
+
{{.Nalog.TrazeneNadogradnje}}
+
+ {{end}}
-
-
Serijski broj
-
{{if .Nalog.SerijskiBroj}}{{.Nalog.SerijskiBroj}}{{else}}{{end}}
-
- {{if .Nalog.PinUredjaja}} -
-
PIN / lozinka
-
{{.Nalog.PinUredjaja}}
+ {{if .QRKod}} +
+ QR {{.Nalog.BrojNaloga}} +
Skenirajte za status
{{end}}
- {{if .Nalog.Pribor}} -
-
Pribor predat uz uređaj
-
{{.Nalog.Pribor}}
-
- {{end}} - {{if .Nalog.Ostecenja}} -
-
Vidljiva oštećenja pri prijemu
-
{{.Nalog.Ostecenja}}
-
- {{end}} - {{if .Nalog.TrazeneNadogradnje}} -
-
Tražene nadogradnje
-
{{.Nalog.TrazeneNadogradnje}}
-
- {{end}}
@@ -189,7 +190,7 @@
Predao (klijent)
-
Primio{{if .TehnicarNaziv}} — {{.TehnicarNaziv}}{{end}} (servis)
+
Primio (servis)
diff --git a/web/templates/stranice/servis_status_javni.html b/web/templates/stranice/servis_status_javni.html index e3faa9e..88b0cdc 100644 --- a/web/templates/stranice/servis_status_javni.html +++ b/web/templates/stranice/servis_status_javni.html @@ -78,10 +78,22 @@
- + +
Praćenje statusa popravke
+ +
+ {{if .LogoPutanja}} + Logo + {{else}}
{{if .NazivFirme}}{{.NazivFirme}}{{else}}Servis{{end}}
- {{if .Adresa}}
{{.Adresa}}
{{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}} +
@@ -129,75 +141,49 @@ {{.Nalog.DatumPrijema.Format "02.01.2006."}}
- {{if .Nalog.DatumZavrsetka}} + {{if .Nalog.PredvidjenDatum}}
- Datum završetka - {{.Nalog.DatumZavrsetka.Format "02.01.2006."}} + Predviđeni datum završetka + {{.Nalog.PredvidjenDatum.Format "02.01.2006."}}
{{end}} - {{if .Nalog.SerijskiBroj}}
- Serijski broj - {{.Nalog.SerijskiBroj}} + Garancija + {{garancijaTekst .Nalog.GarancijaDana}}
- {{end}} - {{if .Nalog.OpisKvara}} -
- Opis kvara - {{.Nalog.OpisKvara}} -
- {{end}} - - {{if .Nalog.GarancijaDo}} -
- Garancija do - {{.Nalog.GarancijaDo.Format "02.01.2006."}} -
- {{end}} - - - {{if or .Nalog.CenaOd .Nalog.CenaDo .Nalog.CenaKonacna}} -
-
Procena cene
-
- {{if .Nalog.CenaKonacna}} -
- {{formatBroj .Nalog.CenaKonacna}} din -
-
Konačna cena popravke
- {{else if and .Nalog.CenaOd .Nalog.CenaDo}} -
- {{formatBroj .Nalog.CenaOd}} - - {{formatBroj .Nalog.CenaDo}} din -
-
Procenjeni raspon cene
- {{else if .Nalog.CenaOd}} -
- od {{formatBroj .Nalog.CenaOd}} din -
-
Procenjena cena od
- {{end}} -
-
- {{end}} - - {{if .Nalog.Napomena}} + {{if .Nalog.NapomenaKlijentu}}
Napomena
-
{{.Nalog.Napomena}}
+
{{.Nalog.NapomenaKlijentu}}
{{end}}
- - {{if .Telefon}} -
-
Kontakt
- {{telefon .Telefon}} - {{if .Adresa}}
{{.Adresa}}
{{end}} + + {{if or .Radovi .ServisniDelovi}} +
+
Radovi i delovi
+ + {{range .Radovi}} +
+ {{.Naziv}}{{if gt .Kolicina 1.0}} ×{{.Kolicina}}{{end}} + {{dinari .Ukupno}} din +
+ {{end}} + + {{range .ServisniDelovi}} +
+ {{.ArtikalNaziv}}{{if gt .Kolicina 1}} ×{{.Kolicina}}{{end}} + {{dinari .Ukupno}} din +
+ {{end}} + +
+ Ukupno (procena) + {{dinari .UkupnoSve}} din +
{{end}}