From 6a96d07156bb82e7f63dfb7a1bbe19b46ab24c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Tue, 23 Jun 2026 11:08:58 +0200 Subject: [PATCH] =?UTF-8?q?Servis:=20radni=20nalog=20za=20servisera,=20hov?= =?UTF-8?q?er=20napomena,=20responsive=20popravke=20-=20Nalepnica:=20uklon?= =?UTF-8?q?jen=20QR=20(ostaje=20na=20ure=C4=91aju=20u=20servisu,=20klijent?= =?UTF-8?q?=20nema=20=C5=A1ta=20da=20skenira);=20oslobo=C4=91en=20prostor?= =?UTF-8?q?=20iskori=C5=A1=C4=87en=20za=20telefon=20klijenta=20i=20datume?= =?UTF-8?q?=20(prijem=20+=20rok)=20-=20Radni=20nalog:=20obrisani=20?= =?UTF-8?q?=E2=80=9Eservis=5Fstampa"=20i=20=E2=80=9Eservis=5Fpredracun";?= =?UTF-8?q?=20nov=20interni=20=E2=80=9Eservis=5Fradni=5Fnalog"=20(ruta=20/?= =?UTF-8?q?servis/{id}/radni-nalog)=20sa=20podacima=20samo=20za=20serviser?= =?UTF-8?q?a,=20bez=20cena,=20sa=20barkodom=20i=20praznim=20poljima=20(dij?= =?UTF-8?q?agnoza,=20ura=C4=91en=20rad,=20potpis)=20-=20Forma=20=E2=80=9EI?= =?UTF-8?q?zmeni=20nalog":=20kartice=20=E2=80=9EServiser"=20i=20=E2=80=9EA?= =?UTF-8?q?vans=20i=20napomena"=20spojene=20u=20jednu=20=E2=80=9EServiser,?= =?UTF-8?q?=20avans=20i=20napomena"=20-=20Servis=20kanban:=20dugme=20uz=20?= =?UTF-8?q?SN=20broj=20otvara=20internu=20napomenu=20(hover=20na=20desktop?= =?UTF-8?q?u,=20tap=E2=86=92focus=20na=20mobilnom);=20okida=C4=8D=20na=20o?= =?UTF-8?q?mota=C4=8Du=20da=20napomena=20ne=20treperi=20-=20Detalji=20nalo?= =?UTF-8?q?ga=20(responsive):=20forme=20=E2=80=9EDodaj=20rad/deo"=20izvu?= =?UTF-8?q?=C4=8Dene=20iz=20inline=20grid-a=20u=20klase=20+=20@media=20(2?= =?UTF-8?q?=20kolone=20na=20telefonu);=20tabele=20radova/delova=20u=20tabe?= =?UTF-8?q?la-skrol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/ntech/main.go | 3 +- internal/handler/kes.go | 2 +- internal/handler/servis.go | 215 ++------------ web/static/css/main.css | 67 +++++ web/templates/stranice/servis.html | 21 +- web/templates/stranice/servis_detalji.html | 15 +- web/templates/stranice/servis_forma.html | 34 ++- web/templates/stranice/servis_nalepnica.html | 34 ++- web/templates/stranice/servis_predracun.html | 263 ------------------ ...is_stampa.html => servis_radni_nalog.html} | 166 ++++------- 10 files changed, 226 insertions(+), 594 deletions(-) delete mode 100644 web/templates/stranice/servis_predracun.html rename web/templates/stranice/{servis_stampa.html => servis_radni_nalog.html} (51%) diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 7fa0d0b..117cbb5 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -355,10 +355,9 @@ func main() { r.With(doz("servis.izmeni")).Post("/servis/izmeni/{id}", h.SacuvajIzmenaNaloga) r.With(doz("servis.obrisi")).Post("/servis/obrisi/{id}", h.ObrisiNalog) 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}/radni-nalog", h.StampaRadnogNaloga) r.With(ntechmw.RequireDozvola(h.DozvoleRepo.ImaDozvolu, "servis.pregled")).Get("/servis/{id}/otpremnica", h.StampaOtpremnice) 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}/predracun", h.StampaPredracuna) 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 a4afad2..662ae09 100644 --- a/internal/handler/kes.go +++ b/internal/handler/kes.go @@ -43,7 +43,7 @@ var saSidebar = []string{ // standalone su šabloni bez base layouta var standaloneIme = []string{ - "prijava", "setup", "totp_provera", "prodaja_stampa", "servis_stampa", "servis_otpremnica", "servis_predracun", "servis_nalepnica", "servis_status_javni", + "prijava", "setup", "totp_provera", "prodaja_stampa", "servis_radni_nalog", "servis_otpremnica", "servis_nalepnica", "servis_status_javni", } // sablonskeFunkcije su pomoćne funkcije dostupne u svim šablonima. diff --git a/internal/handler/servis.go b/internal/handler/servis.go index 44867bc..8bc2c15 100644 --- a/internal/handler/servis.go +++ b/internal/handler/servis.go @@ -1105,23 +1105,19 @@ func (h *Handler) renderujFormuNaloga(w http.ResponseWriter, podaci PodaciFormeN h.renderujTemplate(w, "servis_forma", podaci) } -// PodaciStampeServisa su podaci za print-friendly prikaz servisnog naloga -type PodaciStampeServisa struct { +// PodaciRadnogNaloga su podaci za interni radni list servisera (bez cena) +type PodaciRadnogNaloga struct { Nalog model.ServisniNalog ServisniDelovi []model.ServisniDeoSaArtiklom - UkupnoDelovi float64 KlijentNaziv string + KlijentTelefon string TehnicarNaziv string NazivFirme string - Podnazlov string - Adresa string - Telefon string - PIB string - QRKod string // base64 PNG QR koda sa URL-om naloga + Barkod string // base64 PNG Code128 barkoda broja naloga (za skener) } -// StampaServisa renderuje print-friendly stranicu za servisni nalog -func (h *Handler) StampaServisa(w http.ResponseWriter, r *http.Request) { +// StampaRadnogNaloga renderuje interni radni list koji serviser preuzima uz uređaj +func (h *Handler) StampaRadnogNaloga(w http.ResponseWriter, r *http.Request) { id, err := parseID(chi.URLParam(r, "id")) if err != nil { http.Error(w, "Neispravan ID naloga", http.StatusBadRequest) @@ -1147,6 +1143,7 @@ func (h *Handler) StampaServisa(w http.ResponseWriter, r *http.Request) { } klijentNaziv := "" + klijentTelefon := "" if nalog.KlijentID != nil { klijent, err := h.KlijentiRepo.DohvatiID(r.Context(), *nalog.KlijentID) if err == nil { @@ -1155,6 +1152,7 @@ func (h *Handler) StampaServisa(w http.ResponseWriter, r *http.Request) { } else { klijentNaziv = strings.TrimSpace(klijent.Ime + " " + klijent.Prezime) } + klijentTelefon = klijent.Telefon } } @@ -1166,30 +1164,14 @@ func (h *Handler) StampaServisa(w http.ResponseWriter, r *http.Request) { } } - var ukupnoDelovi float64 - for _, d := range delovi { - ukupnoDelovi += d.Ukupno() - } - - // QR kod vodi na javnu status stranicu — dostupnu bez prijave - nalogURL := qrNalogURL(r, nalog.JavniToken) - var qrKod string - if png, err := qrcode.Encode(nalogURL, qrcode.Medium, 160); err == nil { - qrKod = base64.StdEncoding.EncodeToString(png) - } - - h.renderujStandalone(w, "servis_stampa", PodaciStampeServisa{ + h.renderujStandalone(w, "servis_radni_nalog", PodaciRadnogNaloga{ Nalog: *nalog, ServisniDelovi: delovi, - UkupnoDelovi: ukupnoDelovi, KlijentNaziv: klijentNaziv, + KlijentTelefon: klijentTelefon, TehnicarNaziv: tehnicarNaziv, NazivFirme: podesavanja["naziv_firme"], - Podnazlov: podesavanja["podnazlov"], - Adresa: podesavanja["adresa"], - Telefon: podesavanja["telefon"], - PIB: podesavanja["pib"], - QRKod: qrKod, + Barkod: barkodNaloga(nalog.BrojNaloga), }) } @@ -1304,10 +1286,12 @@ func (h *Handler) StampaOtpremnice(w http.ResponseWriter, r *http.Request) { // PodaciNalepnice su podaci za malu nalepnicu (70×40 mm) koja se lepi na uređaj type PodaciNalepnice struct { - Nalog model.ServisniNalog - KlijentNaziv string - QRKod string // base64 PNG QR koda sa URL-om naloga - Barkod string // base64 PNG Code128 barkoda sa brojem naloga (za laserski skener) + Nalog model.ServisniNalog + KlijentNaziv string + Telefon string // sirov telefon klijenta (formatira se u šablonu) + DatumPrijema string // kratki format, npr. "20.06." + PredvidjenRok string // kratki format predviđenog datuma; prazno ako nije postavljen + Barkod string // base64 PNG Code128 barkoda sa brojem naloga (za laserski skener) } // barkodNaloga generiše Code128 barkod broja naloga kao base64 PNG; prazan string ako ne uspe @@ -1343,6 +1327,7 @@ func (h *Handler) StampaNalepnice(w http.ResponseWriter, r *http.Request) { } klijentNaziv := "" + telefon := "" if nalog.KlijentID != nil { k, err := h.KlijentiRepo.DohvatiID(r.Context(), *nalog.KlijentID) if err == nil { @@ -1351,164 +1336,24 @@ func (h *Handler) StampaNalepnice(w http.ResponseWriter, r *http.Request) { } else { klijentNaziv = strings.TrimSpace(k.Ime + " " + k.Prezime) } + telefon = k.Telefon } } - nalogURL := qrNalogURL(r, nalog.JavniToken) - var qrKod string - if png, err := qrcode.Encode(nalogURL, qrcode.Medium, 160); err == nil { - qrKod = base64.StdEncoding.EncodeToString(png) + // kratki datumi za nalepnicu (npr. "20.06.") + datumPrijema := nalog.DatumPrijema.Format("02.01.") + predvidjenRok := "" + if nalog.PredvidjenDatum != nil { + predvidjenRok = nalog.PredvidjenDatum.Format("02.01.") } h.renderujStandalone(w, "servis_nalepnica", PodaciNalepnice{ - Nalog: *nalog, - KlijentNaziv: klijentNaziv, - QRKod: qrKod, - Barkod: barkodNaloga(nalog.BrojNaloga), - }) -} - -// PodaciPredracuna su podaci za predračun/ponudu koja se šalje klijentu pre rada -type PodaciPredracuna struct { - Nalog model.ServisniNalog - ServisniDelovi []model.ServisniDeoSaArtiklom - UkupnoDelovi float64 - - ImaCenuRada bool // ima li nalog uopšte cenu rada (raspon ili fiksnu) - CenaRaspon bool // true → prikaži procenu Od–Do; false → fiksnu cenu - CenaRadaOd float64 // donja granica procene - CenaRadaDo float64 // gornja granica procene - CenaRada float64 // fiksna cena rada - - UkupnoOd float64 // delovi + CenaRadaOd (kad je raspon) - UkupnoDo float64 // delovi + CenaRadaDo (kad je raspon) - Ukupno float64 // delovi + fiksna cena (ili samo delovi ako nema cene rada) - - DatumIzdavanja time.Time - VaziDo time.Time - - QRKod string - Klijent *model.Klijent - KlijentNaziv string - TehnicarNaziv string - NazivFirme string - Podnazlov string - Adresa string - Telefon string - PIB string -} - -// StampaPredracuna renderuje predračun/ponudu koja se šalje klijentu kada se utvrdi kvar -func (h *Handler) StampaPredracuna(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 - } - - delovi, err := h.deloviSaPotrazivanima(r.Context(), id) - if err != nil { - http.Error(w, "Greška pri učitavanju delova", http.StatusInternalServerError) - 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, err := h.KlijentiRepo.DohvatiID(r.Context(), *nalog.KlijentID) - if err == nil { - klijent = k - if k.NazivFirme != "" { - klijentNaziv = k.NazivFirme - } else { - klijentNaziv = strings.TrimSpace(k.Ime + " " + k.Prezime) - } - } - } - - tehnicarNaziv := "" - if nalog.TehnicarID != nil { - tehnicar, err := h.KorisniciRepo.DohvatiPoID(r.Context(), *nalog.TehnicarID) - if err == nil { - tehnicarNaziv = tehnicar.KorisnickoIme - } - } - - var ukupnoDelovi float64 - for _, d := range delovi { - ukupnoDelovi += d.Ukupno() - } - - // cena rada: ako postoji procena raspona (Od i Do) prikaži je, inače padni na fiksnu cenu - var imaCenuRada, cenaRaspon bool - var cenaRadaOd, cenaRadaDo, cenaRada float64 - var ukupnoOd, ukupnoDo, ukupno float64 - switch { - case nalog.CenaOd != nil && nalog.CenaDo != nil: - imaCenuRada = true - cenaRaspon = true - cenaRadaOd = *nalog.CenaOd - cenaRadaDo = *nalog.CenaDo - ukupnoOd = ukupnoDelovi + cenaRadaOd - ukupnoDo = ukupnoDelovi + cenaRadaDo - case nalog.CenaKonacna != nil: - imaCenuRada = true - cenaRada = *nalog.CenaKonacna - ukupno = ukupnoDelovi + cenaRada - default: - ukupno = ukupnoDelovi - } - - // rok važenja iz podešavanja (default 7 dana) - rok := 7 - if v, err := strconv.Atoi(podesavanja["predracun_rok_dana"]); err == nil && v > 0 { - rok = v - } - datumIzdavanja := time.Now() - vaziDo := datumIzdavanja.AddDate(0, 0, rok) - - // QR kod vodi na javnu status stranicu — dostupnu bez prijave - nalogURL := qrNalogURL(r, nalog.JavniToken) - var qrKod string - if png, err := qrcode.Encode(nalogURL, qrcode.Medium, 160); err == nil { - qrKod = base64.StdEncoding.EncodeToString(png) - } - - h.renderujStandalone(w, "servis_predracun", PodaciPredracuna{ - Nalog: *nalog, - ServisniDelovi: delovi, - UkupnoDelovi: ukupnoDelovi, - ImaCenuRada: imaCenuRada, - CenaRaspon: cenaRaspon, - CenaRadaOd: cenaRadaOd, - CenaRadaDo: cenaRadaDo, - CenaRada: cenaRada, - UkupnoOd: ukupnoOd, - UkupnoDo: ukupnoDo, - Ukupno: ukupno, - DatumIzdavanja: datumIzdavanja, - VaziDo: vaziDo, - QRKod: qrKod, - Klijent: klijent, - KlijentNaziv: klijentNaziv, - TehnicarNaziv: tehnicarNaziv, - NazivFirme: podesavanja["naziv_firme"], - Podnazlov: podesavanja["podnazlov"], - Adresa: podesavanja["adresa"], - Telefon: podesavanja["telefon"], - PIB: podesavanja["pib"], + Nalog: *nalog, + KlijentNaziv: klijentNaziv, + Telefon: telefon, + DatumPrijema: datumPrijema, + PredvidjenRok: predvidjenRok, + Barkod: barkodNaloga(nalog.BrojNaloga), }) } diff --git a/web/static/css/main.css b/web/static/css/main.css index 8887fdf..64c780c 100644 --- a/web/static/css/main.css +++ b/web/static/css/main.css @@ -1298,6 +1298,7 @@ select { /* kartica naloga u koloni — nasleđuje .kartica, dodaje kompaktan padding i hover */ .kanban-karta { display: block; + position: relative; text-decoration: none; padding: 12px; cursor: pointer; @@ -1307,6 +1308,72 @@ select { transform: translateY(-1px); box-shadow: 0 2px 10px rgba(0, 0, 0, 0.12); } +/* dugme uz SN broj — otvara internu napomenu */ +.napomena-omot { + display: inline-flex; +} +.napomena-dugme { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 2px; + border: none; + background: transparent; + color: var(--sb-akcent); + cursor: pointer; + border-radius: 5px; + line-height: 0; + opacity: 0.75; + user-select: none; + -webkit-user-select: none; + transition: opacity 0.12s ease, background 0.12s ease; +} +.napomena-dugme:hover, +.napomena-dugme:focus { + opacity: 1; + background: var(--pozadina-hover); + outline: none; +} +/* napomena kao overlay preko karte; ostaje u granicama karte → overflow kanbana je ne seče */ +.karta-napomena { + position: absolute; + inset: 0; + padding: 10px 12px; + background: var(--pozadina-kartica, var(--pozadina)); + border: 1px solid var(--sb-akcent); + border-radius: inherit; + font-size: 12px; + line-height: 1.45; + color: var(--tekst-glavni); + white-space: pre-wrap; + overflow: auto; + text-align: left; + opacity: 0; + visibility: hidden; + transition: opacity 0.12s ease; + z-index: 5; +} +/* okidač je omot (ne dugme): pošto je napomena DOM-dete omota, hover nad samom + napomenom drži omot „hovered" → ostaje stabilno vidljiva, ne treperi. + focus-within pokriva tap na mobilnom (fokus dugmeta unutar omota). */ +.napomena-omot:hover .karta-napomena, +.napomena-omot:focus-within .karta-napomena { + opacity: 1; + visibility: visible; +} + +/* forme „Dodaj rad/deo" u detaljima naloga — grid u CSS (ne inline) da ga @media može nadjačati */ +.detalji-forma-rad { display: grid; grid-template-columns: 1fr 80px 120px auto; gap: 10px; align-items: flex-end; } +.detalji-forma-deo { display: grid; grid-template-columns: 1fr 70px 80px 120px auto; gap: 10px; align-items: flex-end; } +@media (max-width: 600px) { + /* na telefonu: dve kolone, dugme preko cele širine */ + .detalji-forma-rad, + .detalji-forma-deo { grid-template-columns: 1fr 1fr; } + .detalji-forma-rad > :last-child, + .detalji-forma-deo > :last-child { grid-column: 1 / -1; } + .detalji-forma-rad > :last-child .btn-primarno, + .detalji-forma-deo > :last-child .btn-primarno { width: 100%; } +} @media (max-width: 768px) { .nabavke-tabela { display: none; } .nabavke-kartice { display: flex; } diff --git a/web/templates/stranice/servis.html b/web/templates/stranice/servis.html index 52e0ec6..3fd9190 100644 --- a/web/templates/stranice/servis.html +++ b/web/templates/stranice/servis.html @@ -48,8 +48,25 @@ {{range $.Nalozi}} {{if eq .Status $status}} -
- {{.BrojNaloga}} +
+ {{.BrojNaloga}} + {{if .Napomena}} + + + +
{{.Napomena}}
+
+ {{end}}
{{.Uredjaj}}
{{if .KlijentNaziv}} diff --git a/web/templates/stranice/servis_detalji.html b/web/templates/stranice/servis_detalji.html index 718653a..3bd369d 100644 --- a/web/templates/stranice/servis_detalji.html +++ b/web/templates/stranice/servis_detalji.html @@ -47,14 +47,9 @@
- {{if not (or (eq .Nalog.Status "Završeno") (eq .Nalog.Status "Preuzeto"))}} - + Radni nalog - - Predračun - - {{end}} {{if or (eq .Nalog.Status "Završeno") (eq .Nalog.Status "Preuzeto")}} Otpremnica @@ -263,7 +258,7 @@ {{if index .Dozvole "servis.izmeni"}}
-
+
-
+
- - {{range .Tehnicari}} - - {{end}} - -
-
- {{else}} + + {{if not .Izmena}}
Klijent
@@ -269,11 +255,23 @@
{{end}} - +
-
{{if .Izmena}}Avans, garancija i napomena{{else}}Avans i napomena{{end}}
+
{{if .Izmena}}Serviser, avans i napomena{{else}}Avans i napomena{{end}}
+ {{if .Izmena}} + +
+ + +
+ {{end}}
Klijent
{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}{{end}}
+
+
Telefon
+
{{if .Telefon}}{{telefon .Telefon}}{{else}}{{end}}
+
Uređaj
{{if .Nalog.Uredjaj}}{{.Nalog.Uredjaj}}{{else}}{{end}}
+
+
+ Primljen + {{.DatumPrijema}} +
+ {{if .PredvidjenRok}} +
+ Rok + {{.PredvidjenRok}} +
+ {{end}} +
- {{if .QRKod}} -
QR
- {{end}}
diff --git a/web/templates/stranice/servis_predracun.html b/web/templates/stranice/servis_predracun.html deleted file mode 100644 index 44ab86d..0000000 --- a/web/templates/stranice/servis_predracun.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - Predračun — {{.Nalog.BrojNaloga}} - - - -
- - -
-
-
{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}
-
- {{if .Podnazlov}}{{.Podnazlov}}
{{end}} - {{if .Adresa}}{{.Adresa}}
{{end}} - {{if .Telefon}}Tel: {{telefon .Telefon}}
{{end}} - {{if .PIB}}PIB: {{.PIB}}{{end}} -
-
-
-
-
Predračun / Ponuda
-
{{.Nalog.BrojNaloga}}
-
Datum izdavanja: {{.DatumIzdavanja.Format "02.01.2006."}}
-
Važi do: {{.VaziDo.Format "02.01.2006."}}
-
- {{if .QRKod}} - QR {{.Nalog.BrojNaloga}} - {{end}} -
-
- - -
-
-
Izdaje
-
{{if .NazivFirme}}{{.NazivFirme}}{{else}}—{{end}}
-
- {{if .Adresa}}{{.Adresa}}
{{end}} - {{if .Telefon}}{{telefon .Telefon}}{{end}} -
-
-
-
Za klijenta
- {{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 na servisu
-
-
-
Naziv uređaja
-
{{.Nalog.Uredjaj}}
-
-
-
Serijski broj
-
{{if .Nalog.SerijskiBroj}}{{.Nalog.SerijskiBroj}}{{else}}{{end}}
-
- {{if .TehnicarNaziv}} -
-
Serviser
-
{{.TehnicarNaziv}}
-
- {{end}} -
-
- - -
-
Utvrđeni kvar
-
{{if .Nalog.OpisKvara}}{{.Nalog.OpisKvara}}{{else}}{{end}}
-
- - - {{if .ServisniDelovi}} -
-
Predloženi delovi i materijal
- - - - - - - - - - - {{range .ServisniDelovi}} - - - - - - - {{end}} - - - - - -
ArtikalKol.Cena/komUkupno
{{.ArtikalNaziv}}{{.Kolicina}}{{dinari .CenaKomada}} din{{dinari .Ukupno}} din
Ukupno delovi{{dinari .UkupnoDelovi}} din
-
- {{end}} - - - {{if .ImaCenuRada}} -
-
Procena troška
- - - {{if .CenaRaspon}} - - - - - {{else}} - - - - - {{end}} - {{if gt .UkupnoDelovi 0.0}} - - - - - {{end}} - -
Cena rada (procena){{dinari .CenaRadaOd}} – {{dinari .CenaRadaDo}} din
Cena rada{{dinari .CenaRada}} din
Predloženi delovi i materijal{{dinari .UkupnoDelovi}} din
-
-
Procena ukupnog troška:
- {{if .CenaRaspon}} -
{{dinari .UkupnoOd}} – {{dinari .UkupnoDo}} din
- {{else}} -
{{dinari .Ukupno}} din
- {{end}} -
-
- {{else}} -
-
Procena troška još nije utvrđena.
-
- {{end}} - - -
-
-
Ova ponuda važi do:
-
{{.VaziDo.Format "02.01.2006."}}
-
-
- - {{if .Nalog.Napomena}} -
Napomena: {{.Nalog.Napomena}}
- {{end}} - -
- Ovo je predračun (ponuda) i ne predstavlja fiskalni dokument. Navedene cene su procena na osnovu - utvrđenog kvara; konačan iznos može odstupati ako se tokom servisa otkriju dodatni kvarovi. - Servis se započinje nakon saglasnosti klijenta. -
- - -
-
-
Ponudu izdao (firma)
-
-
-
Saglasan sa ponudom (klijent)
-
-
- -
- - - - - diff --git a/web/templates/stranice/servis_stampa.html b/web/templates/stranice/servis_radni_nalog.html similarity index 51% rename from web/templates/stranice/servis_stampa.html rename to web/templates/stranice/servis_radni_nalog.html index 481a25f..159095c 100644 --- a/web/templates/stranice/servis_stampa.html +++ b/web/templates/stranice/servis_radni_nalog.html @@ -3,7 +3,7 @@ - Servisni nalog {{.Nalog.BrojNaloga}} + Radni nalog {{.Nalog.BrojNaloga}}
- +
{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}
-
- {{if .Podnazlov}}{{.Podnazlov}}
{{end}} - {{if .Adresa}}{{.Adresa}}
{{end}} - {{if .Telefon}}Tel: {{telefon .Telefon}}
{{end}} - {{if .PIB}}PIB: {{.PIB}}{{end}} -
+
Radni nalog — interni
-
-
-
-
Servisni nalog
-
{{.Nalog.BrojNaloga}}
-
{{.Nalog.Status}}
-
- {{if .QRKod}} - QR {{.Nalog.BrojNaloga}} - {{end}} -
+
+
Broj naloga
+
{{.Nalog.BrojNaloga}}
+
{{.Nalog.Status}}
+ {{if .Barkod}} +
Barkod {{.Nalog.BrojNaloga}}
+ {{end}}
- +
Osnovni podaci
@@ -104,26 +91,26 @@
Datum prijema
{{.Nalog.DatumPrijema.Format "02.01.2006. u 15:04"}}
- {{if .Nalog.DatumZavrsetka}} + {{if .Nalog.PredvidjenDatum}}
-
Datum završetka
-
{{.Nalog.DatumZavrsetka.Format "02.01.2006."}}
+
Predviđen rok
+
{{.Nalog.PredvidjenDatum.Format "02.01.2006."}}
{{end}} - {{if .Nalog.GarancijaDo}} + {{if .TehnicarNaziv}}
-
Garancija do
-
{{.Nalog.GarancijaDo.Format "02.01.2006."}}
+
Serviser
+
{{.TehnicarNaziv}}
{{end}}
Klijent
{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}{{end}}
- {{if .TehnicarNaziv}} + {{if .KlijentTelefon}}
-
Serviser
-
{{.TehnicarNaziv}}
+
Telefon klijenta
+
{{telefon .KlijentTelefon}}
{{end}}
@@ -144,12 +131,12 @@ {{if .Nalog.PinUredjaja}}
PIN / lozinka
-
{{.Nalog.PinUredjaja}}
+
{{.Nalog.PinUredjaja}}
{{end}}
-
Opis kvara
+
Prijavljen kvar
{{if .Nalog.OpisKvara}}{{.Nalog.OpisKvara}}{{else}}{{end}}
{{if .Nalog.TrazeneNadogradnje}} @@ -176,17 +163,15 @@ {{end}}
- + {{if .ServisniDelovi}}
-
Ugrađeni delovi
+
Delovi na nalogu
- - - + @@ -194,62 +179,33 @@ - - {{end}} - - - -
ArtikalKol.Cena/komUkupnoKoličina
{{.ArtikalNaziv}} {{.Kolicina}}{{dinari .CenaKomada}} din{{dinari .Ukupno}} din
Ukupno delovi{{dinari .UkupnoDelovi}} din
{{end}} - +
-
Cene usluge
-
-
-
Procena od
-
{{if .Nalog.CenaOd}}{{.Nalog.CenaOdStr}} din{{else}}—{{end}}
-
-
-
Procena do
-
{{if .Nalog.CenaDo}}{{.Nalog.CenaDoStr}} din{{else}}—{{end}}
-
-
-
Avans
-
{{if .Nalog.Avans}}{{.Nalog.AvansStr}} din{{else}}—{{end}}
-
-
-
Cena rada
-
{{if .Nalog.CenaKonacna}}{{.Nalog.CenaKonacnaStr}} din{{else}}—{{end}}
-
-
- {{if .Nalog.PreostaloZaNaplatu}} -
- Preostalo za naplatu: - {{.Nalog.PreostaloZaNaplatuStr}} din -
- {{end}} +
Dijagnoza / utvrđen kvar
+
- {{if .Nalog.Napomena}}
-
Napomena
-
{{.Nalog.Napomena}}
+
Urađen rad
+
- {{end}} - -
+ +
-
Predao klijent
+
Datum završetka / utrošeno vreme
+
 
-
Primio serviser
+
Potpis servisera
+