From f69e8be988941bc77b2628e43188c8ff608c4e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Wed, 24 Jun 2026 23:18:26 +0200 Subject: [PATCH] =?UTF-8?q?Fiskalizacija:=20pode=C5=A1avanja=20L-PFR=20vez?= =?UTF-8?q?e,=20test=20konekcije=20(HTMX)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/ntech/main.go | 2 + internal/handler/kes.go | 2 +- internal/handler/podesavanja.go | 63 +++++++++++++ migrations/080_fiskalizacija_podesavanja.sql | 3 + web/templates/komponente/sidebar.html | 7 +- .../stranice/podesavanja_fiskalizacija.html | 93 +++++++++++++++++++ 6 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 migrations/080_fiskalizacija_podesavanja.sql create mode 100644 web/templates/stranice/podesavanja_fiskalizacija.html diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 0e81e41..8d637d8 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -277,6 +277,8 @@ func main() { r.Get("/admin/podesavanja/izgled", h.PodesavanjaIzgled) r.Get("/admin/podesavanja/sistem", h.PodesavanjaSistem) r.Get("/admin/podesavanja/servis", h.PodesavanjaServis) + r.Get("/admin/podesavanja/fiskalizacija", h.PodesavanjaFiskalizacija) + r.Get("/podesavanja/fiskalizacija/test", h.TestFiskalizacije) r.Get("/admin/podesavanja/kalkulacija-pdv", h.PdvStope) r.With(doz("podesavanja.izmeni")).Post("/podesavanja/pdv-stope/dodaj", h.DodajPdvStopu) r.With(doz("podesavanja.izmeni")).Post("/podesavanja/pdv-stope/{id}/izmeni", h.IzmeniPdvStopu) diff --git a/internal/handler/kes.go b/internal/handler/kes.go index 1e52367..a57354e 100644 --- a/internal/handler/kes.go +++ b/internal/handler/kes.go @@ -27,7 +27,7 @@ var saSidebar = []string{ "klijenti", "klijent_forma", "magacin", "magacin_forma", "magacin_kartica", "nabavke", "nabavka_forma", "nabavka_detalji", - "podesavanja", "podesavanja_opste", "podesavanja_izgled", "podesavanja_sistem", "podesavanja_servis", + "podesavanja", "podesavanja_opste", "podesavanja_izgled", "podesavanja_sistem", "podesavanja_servis", "podesavanja_fiskalizacija", "pdv_stope", "pdv_kir", "pdv_kir_forma", "pdv_kpr", "pdv_kpr_forma", diff --git a/internal/handler/podesavanja.go b/internal/handler/podesavanja.go index ee9ccac..0b59291 100644 --- a/internal/handler/podesavanja.go +++ b/internal/handler/podesavanja.go @@ -15,6 +15,8 @@ import ( "strings" "time" + "encoding/json" + ntechsqlite "ntech/internal/db/sqlite" "ntech/internal/middleware" "ntech/internal/model" @@ -69,6 +71,8 @@ type PodaciPodesavanja struct { ServisUslovi string ServisKlauzulaPredracuna string QrBazniUrl string + PfrUrl string + PfrTip string LoginPozadina string LoginPozadinaOpacity string LoginPozadinaBlurPozadine string @@ -324,6 +328,9 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) { "firma_pdv_obveznik": r.FormValue("firma_pdv_obveznik"), "firma_fiskalizacija": r.FormValue("firma_fiskalizacija"), "firma_rezim": r.FormValue("firma_rezim"), + // fiskalizacija — L-PFR podešavanja + "pfr_url": r.FormValue("pfr_url"), + "pfr_tip": r.FormValue("pfr_tip"), } for kljuc, vrednost := range polja { @@ -342,6 +349,7 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) { "/admin/podesavanja/sistem": "/admin/podesavanja/sistem", "/admin/podesavanja/servis": "/admin/podesavanja/servis", "/admin/podesavanja/kalkulacija-pdv": "/admin/podesavanja/kalkulacija-pdv", + "/admin/podesavanja/fiskalizacija": "/admin/podesavanja/fiskalizacija", "/podesavanja": "/podesavanja", } sledeci := "/podesavanja" @@ -852,6 +860,8 @@ func (h *Handler) napuniPodaciPodesavanja(r *http.Request, naslov string) (Podac ServisUslovi: vrednostIliDefault(podesavanja, "servis_uslovi", podrazumevaniUsloviServisa), ServisKlauzulaPredracuna: vrednostIliDefault(podesavanja, "servis_klauzula_predracuna", podrazumevanaKlauzulaPredracuna), QrBazniUrl: podesavanja["qr_bazni_url"], + PfrUrl: vrednostIliDefault(podesavanja, "pfr_url", "http://127.0.0.1:4566"), + PfrTip: vrednostIliDefault(podesavanja, "pfr_tip", "teron"), }, nil } @@ -883,6 +893,59 @@ func (h *Handler) PodesavanjaIzgled(w http.ResponseWriter, r *http.Request) { h.renderujTemplate(w, "podesavanja_izgled", podaci) } +// PodesavanjaFiskalizacija renderuje stranicu sa podešavanjima L-PFR veze +func (h *Handler) PodesavanjaFiskalizacija(w http.ResponseWriter, r *http.Request) { + if _, ok := h.zahtevajDozvolu(w, r, "podesavanja.pregled"); !ok { + return + } + podaci, err := h.napuniPodaciPodesavanja(r, "Podešavanja — Fiskalizacija") + if err != nil { + http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError) + return + } + podaci.Stranica = "podesavanja-fiskalizacija" + h.renderujTemplate(w, "podesavanja_fiskalizacija", podaci) +} + +// TestFiskalizacije udara /api/status na konfigurisanom PFR URL-u i vraća HTMX fragment +func (h *Handler) TestFiskalizacije(w http.ResponseWriter, r *http.Request) { + if _, ok := h.zahtevajDozvolu(w, r, "podesavanja.pregled"); !ok { + return + } + podesavanja, err := ntechsqlite.DohvatiSvaPodesavanja(r.Context(), h.DB) + if err != nil { + http.Error(w, "Greška", http.StatusInternalServerError) + return + } + pfrURL := vrednostIliDefault(podesavanja, "pfr_url", "http://127.0.0.1:4566") + + klijent := &http.Client{Timeout: 5 * time.Second} + resp, err := klijent.Get(pfrURL + "/api/status") + if err != nil { + w.Header().Set("Content-Type", "text/html; charset=utf-8") + fmt.Fprintf(w, `
✗ Nije dostupan — %s
`, err.Error()) + return + } + defer resp.Body.Close() + + var status map[string]any + _ = json.NewDecoder(resp.Body).Decode(&status) + + sdcDateTime, _ := status["sdcDateTime"].(string) + lastInvoice, _ := status["lastInvoiceNumber"].(string) + tin, _ := status["tin"].(string) + + w.Header().Set("Content-Type", "text/html; charset=utf-8") + fmt.Fprintf(w, `
+ ✓ Povezano — %s +
+ TIN: %s + Poslednji račun: %s + Vreme: %s +
+
`, pfrURL, tin, lastInvoice, sdcDateTime) +} + // PodesavanjaSistem renderuje stranicu sa sistemskim podešavanjima (backup) func (h *Handler) PodesavanjaSistem(w http.ResponseWriter, r *http.Request) { if _, ok := h.zahtevajDozvolu(w, r, "podesavanja.pregled"); !ok { diff --git a/migrations/080_fiskalizacija_podesavanja.sql b/migrations/080_fiskalizacija_podesavanja.sql new file mode 100644 index 0000000..c53ef81 --- /dev/null +++ b/migrations/080_fiskalizacija_podesavanja.sql @@ -0,0 +1,3 @@ +-- podešavanja L-PFR veze (Teron i kompatibilni) +INSERT OR IGNORE INTO podesavanja (kljuc, vrednost) VALUES ('pfr_url', 'http://127.0.0.1:4566'); +INSERT OR IGNORE INTO podesavanja (kljuc, vrednost) VALUES ('pfr_tip', 'teron'); diff --git a/web/templates/komponente/sidebar.html b/web/templates/komponente/sidebar.html index a883e1f..36a0a17 100644 --- a/web/templates/komponente/sidebar.html +++ b/web/templates/komponente/sidebar.html @@ -211,7 +211,7 @@ Podešavanja -