diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 4151d59..ddf11ce 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -94,6 +94,7 @@ func main() { r.Get("/prodaja/nova", h.NovaProdaja) r.Post("/prodaja/nova", h.SacuvajProdaju) r.Post("/prodaja/obrisi/{id}", h.ObrisiProdaju) + r.Get("/prodaja/{id}/stampa", h.StampaProdaje) r.Get("/prodaja/{id}", h.DetaljiProdaje) log.Printf("NTech pokrenut na portu %s", port) diff --git a/internal/handler/dashboard.go b/internal/handler/dashboard.go index bd2adcd..7418f1d 100644 --- a/internal/handler/dashboard.go +++ b/internal/handler/dashboard.go @@ -38,7 +38,7 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) { if err := h.DB.QueryRowContext(ctx, ` SELECT COALESCE(SUM(ukupno), 0) FROM prodajni_nalozi - WHERE strftime('%Y-%m', datum) = strftime('%Y-%m', 'now', 'localtime')`, + WHERE substr(datum, 1, 7) = strftime('%Y-%m', 'now', 'localtime')`, ).Scan(&prihodOvogMeseca); err != nil { log.Printf("dashboard: prihod ovog meseca: %v", err) } diff --git a/internal/handler/podesavanja.go b/internal/handler/podesavanja.go index 3bdf827..9bcc78f 100644 --- a/internal/handler/podesavanja.go +++ b/internal/handler/podesavanja.go @@ -15,6 +15,9 @@ type PodaciPodesavanja struct { model.PodaciStranice NazivFirme string Podnazlov string + Adresa string + Telefon string + PIB string LogoTip string LogoPutanja string Tema string @@ -42,6 +45,9 @@ func (h *Handler) Podesavanja(w http.ResponseWriter, r *http.Request) { }, NazivFirme: podesavanja["naziv_firme"], Podnazlov: podesavanja["podnazlov"], + Adresa: podesavanja["adresa"], + Telefon: podesavanja["telefon"], + PIB: podesavanja["pib"], LogoTip: podesavanja["logo_tip"], LogoPutanja: podesavanja["logo_putanja"], Tema: podesavanja["tema"], @@ -75,6 +81,9 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) { polja := map[string]string{ "naziv_firme": r.FormValue("naziv_firme"), "podnazlov": r.FormValue("podnazlov"), + "adresa": r.FormValue("adresa"), + "telefon": r.FormValue("telefon"), + "pib": r.FormValue("pib"), "logo_tip": r.FormValue("logo_tip"), "tema": r.FormValue("tema"), } diff --git a/internal/handler/prodaja.go b/internal/handler/prodaja.go index d33cff2..f62d9e9 100644 --- a/internal/handler/prodaja.go +++ b/internal/handler/prodaja.go @@ -44,6 +44,18 @@ type PodaciDetaljiProdaje struct { Sacuvano bool } +// PodaciStampeProdaje su podaci za stranicu za štampanje priznanice +type PodaciStampeProdaje struct { + Nalog model.ProdajniNalog + Stavke []model.StavkaProdajeSaArtiklom + KlijentNaziv string + NazivFirme string + Podnazlov string + Adresa string + Telefon string + PIB string +} + // artikalUJSONSaCenom pretvara listu artikala u template.JS vrednost sa prodajnom cenom i stanjem func artikalUJSONSaCenom(artikli []model.ArtikalSaKategorijom) template.JS { type stavka struct { @@ -288,6 +300,68 @@ func (h *Handler) DetaljiProdaje(w http.ResponseWriter, r *http.Request) { } } +// StampaProdaje renderuje print-friendly stranicu za dati prodajni nalog +func (h *Handler) StampaProdaje(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.ProdajaRepo.DohvatiID(r.Context(), id) + if err != nil { + http.Error(w, "Nalog nije pronađen", http.StatusNotFound) + return + } + + stavke, err := h.ProdajaRepo.DohvatiStavke(r.Context(), id) + if err != nil { + http.Error(w, "Greška pri učitavanju stavki", 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 + } + + klijentNaziv := "" + if nalog.KlijentID != nil { + klijent, err := h.KlijentiRepo.DohvatiID(r.Context(), *nalog.KlijentID) + if err == nil { + if klijent.NazivFirme != "" { + klijentNaziv = klijent.NazivFirme + } else { + klijentNaziv = strings.TrimSpace(klijent.Ime + " " + klijent.Prezime) + } + } + } + + podaci := PodaciStampeProdaje{ + Nalog: *nalog, + Stavke: stavke, + KlijentNaziv: klijentNaziv, + NazivFirme: podesavanja["naziv_firme"], + Podnazlov: podesavanja["podnazlov"], + Adresa: podesavanja["adresa"], + Telefon: podesavanja["telefon"], + PIB: podesavanja["pib"], + } + + tmpl, err := template.ParseFiles("web/templates/stranice/prodaja_stampa.html") + if err != nil { + log.Printf("greška pri učitavanju šablona za štampu: %v", err) + http.Error(w, "Greška pri učitavanju stranice", http.StatusInternalServerError) + return + } + + if err := tmpl.ExecuteTemplate(w, "prodaja_stampa.html", podaci); err != nil { + log.Printf("greška pri renderovanju štampe: %v", err) + http.Error(w, "Greška pri prikazu stranice", http.StatusInternalServerError) + } +} + // ObrisiProdaju prima POST zahtev, vraća stanje na magacin i briše nalog func (h *Handler) ObrisiProdaju(w http.ResponseWriter, r *http.Request) { id, err := parseID(chi.URLParam(r, "id")) diff --git a/migrations/015_podesavanja_kontakt.sql b/migrations/015_podesavanja_kontakt.sql new file mode 100644 index 0000000..8081ba4 --- /dev/null +++ b/migrations/015_podesavanja_kontakt.sql @@ -0,0 +1,3 @@ +INSERT OR IGNORE INTO podesavanja (kljuc, vrednost) VALUES ('adresa', ''); +INSERT OR IGNORE INTO podesavanja (kljuc, vrednost) VALUES ('telefon', ''); +INSERT OR IGNORE INTO podesavanja (kljuc, vrednost) VALUES ('pib', ''); diff --git a/web/templates/stranice/podesavanja.html b/web/templates/stranice/podesavanja.html index 024bc80..e0d5e21 100644 --- a/web/templates/stranice/podesavanja.html +++ b/web/templates/stranice/podesavanja.html @@ -35,6 +35,28 @@ placeholder="npr. Servis računara"> +
| Artikal | +Kol. | +Cena/kom | +Ukupno | +
|---|---|---|---|
| {{.ArtikalNaziv}} | +{{.Kolicina}} | +{{printf "%.2f" .CenaPoKomadu}} din | +{{printf "%.2f" .Ukupno}} din | +
| Ukupno za naplatu: | +{{printf "%.2f" .Nalog.Ukupno}} din | +||