From e26bda5d34cc8aaed1de5ba98448fd4670458628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Thu, 2 Jul 2026 10:41:53 +0200 Subject: [PATCH] =?UTF-8?q?KIR:=20prikaz=20sumnjivih=20duplikata=20(double?= =?UTF-8?q?-submit)=20presko=C4=8Denih=20pri=20backfill-u?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Na KIR stranici se sad vidi kartica sa B2B prodajama koje je automatski backfill preskočio jer izgledaju kao dupli submit forme naplate (isti kupac i iznos u roku od 60s) — sa objašnjenjem i linkom na ručni unos ili storno. --- internal/handler/pdv_kir.go | 40 ++++++++++++++++++-------- web/templates/stranice/pdv_kir.html | 44 +++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 11 deletions(-) diff --git a/internal/handler/pdv_kir.go b/internal/handler/pdv_kir.go index ef70535..f34459b 100644 --- a/internal/handler/pdv_kir.go +++ b/internal/handler/pdv_kir.go @@ -8,6 +8,7 @@ import ( "strings" "time" + appdb "ntech/internal/db" "ntech/internal/db/sqlite" "ntech/internal/middleware" "ntech/internal/model" @@ -20,11 +21,12 @@ import ( // PodaciPdvKir su podaci za pregled knjige izdatih računa type PodaciPdvKir struct { model.PodaciStranice - Zapisi []model.PdvKir - Sume model.PdvKirSume - Od string // filter perioda (YYYY-MM-DD), prazno = bez granice - Do string - Zastareo map[int64]bool // ID zapisa dnevnog pazara čiji je iznos van sinhronizacije sa trenutnim prometom (npr. posle naknadnog storna) + Zapisi []model.PdvKir + Sume model.PdvKirSume + Od string + Do string + Zastareo map[int64]bool + SumnjiviDuplikati []model.ProdajniNalogSaDetaljem // B2B prodaje preskočene pri backfill-u (double-submit) } // PodaciPdvKirForma su podaci za formu unosa zapisa KIR @@ -105,13 +107,29 @@ func (h *Handler) PdvKir(w http.ResponseWriter, r *http.Request) { ps := h.popuniPodaciStranice(r, podesavanja) ps.Stranica = "pdv-kir" ps.NaslovStranice = "KIR — knjiga izdatih računa" + + // detektuj sumnjive duplikate (double-submit) da ih korisnik vidi + var sumnjivi []model.ProdajniNalogSaDetaljem + if _, _, kandidati, err := h.kirKandidatiProdaje(r.Context()); err == nil { + duplikati := sumnjiviDuplikati(kandidati) + if len(duplikati) > 0 { + nalozi, _ := h.ProdajaRepo.Lista(r.Context(), appdb.ProdajaFilter{}) + for _, nd := range nalozi { + if duplikati[nd.ID] { + sumnjivi = append(sumnjivi, nd) + } + } + } + } + h.renderujTemplate(w, "pdv_kir", PodaciPdvKir{ - PodaciStranice: ps, - Zapisi: zapisi, - Sume: model.SumirajKir(zapisi), - Od: odStr, - Do: doStr, - Zastareo: zastareo, + PodaciStranice: ps, + Zapisi: zapisi, + Sume: model.SumirajKir(zapisi), + Od: odStr, + Do: doStr, + Zastareo: zastareo, + SumnjiviDuplikati: sumnjivi, }) } diff --git a/web/templates/stranice/pdv_kir.html b/web/templates/stranice/pdv_kir.html index f2184ae..cfcefc0 100644 --- a/web/templates/stranice/pdv_kir.html +++ b/web/templates/stranice/pdv_kir.html @@ -101,5 +101,49 @@ + + {{if .SumnjiviDuplikati}} +
+
+ ⚠ Sumnjivi duplikati + ({{len .SumnjiviDuplikati}} preskočeno pri uvozu — mogući double-submit, proveri ručno) +
+
+ + + + + + + + + + + + {{range .SumnjiviDuplikati}} + + + + + + + + {{end}} + +
BrojDatumKupacIznos
{{.BrojNaloga}}{{.Datum.Format "02.01.2006. 15:04"}}{{.KlijentNaziv}}{{dinari .Ukupno}} + Pregled +
+
+
+ Ovo su prodaje koje izgledaju kao dupli unos (isti kupac, isti iznos, unutar 60 sekundi). + Automatski uvoz ih preskače da ne bi duplirao prihod u KIR-u. + Ako su to stvarno dve odvojene prodaje — unesi ručno preko + + Nov izlazni račun. + Ako je greška (double-submit) — storniraj/obriši duplikat u Prodaji. +
+
+ {{end}} + {{end}}