Servis: oznaka naloga bez izdatog fiskalnog računa u arhivi

This commit is contained in:
2026-07-01 11:21:46 +02:00
parent 18f242d73f
commit d39df48a56
4 changed files with 47 additions and 7 deletions
+1
View File
@@ -384,6 +384,7 @@ type FiskalRepository interface {
DohvatiPoProdaji(ctx context.Context, prodajaID int64) (*model.FiskalniRacun, error)
DohvatiPoServisu(ctx context.Context, servisID int64) (*model.FiskalniRacun, error)
OznačiKaoStorniran(ctx context.Context, id int64) error
ServisiBezFiskalnog(ctx context.Context) (map[int64]bool, error)
}
// ServisniLogRepository definiše operacije nad log-om događaja servisnog naloga.
+22
View File
@@ -115,6 +115,28 @@ func (r *FiskalRepo) DohvatiPoServisu(ctx context.Context, servisID int64) (*mod
return fr, nil
}
// ServisiBezFiskalnog vraća skup ID-eva servisnih naloga koji su u statusu "Preuzeto"
// a nemaju fiskalni račun (za oznaku u listi naloga).
func (r *FiskalRepo) ServisiBezFiskalnog(ctx context.Context) (map[int64]bool, error) {
rows, err := r.db.QueryContext(ctx, `
SELECT sn.id FROM servisni_nalozi sn
LEFT JOIN fiskalni_racuni fr ON fr.servis_id = sn.id AND fr.storniran = 0
WHERE sn.status = 'Preuzeto' AND fr.id IS NULL`)
if err != nil {
return nil, err
}
defer rows.Close()
out := make(map[int64]bool)
for rows.Next() {
var id int64
if err := rows.Scan(&id); err != nil {
return nil, err
}
out[id] = true
}
return out, rows.Err()
}
// OznačiKaoStorniran postavlja storniran=1 za fiskalni račun sa datim ID-jem.
func (r *FiskalRepo) OznačiKaoStorniran(ctx context.Context, id int64) error {
_, err := r.db.ExecContext(ctx, "UPDATE fiskalni_racuni SET storniran = 1 WHERE id = ?", id)
+17 -6
View File
@@ -29,12 +29,13 @@ import (
// PodaciServisa su podaci za stranicu sa listom servisnih naloga
type PodaciServisa struct {
model.PodaciStranice
Nalozi []model.ServisniNalogSaKlijentom
Pretraga string
FilterStatus string
SviStatusi []string
Sacuvano bool
Obrisan bool
Nalozi []model.ServisniNalogSaKlijentom
Pretraga string
FilterStatus string
SviStatusi []string
Sacuvano bool
Obrisan bool
NemaFiskalnog map[int64]bool // ID-evi naloga sa statusom Preuzeto koji nemaju fiskalni račun
}
// PodaciFormeNaloga su podaci za formu novog/izmenjenog servisnog naloga
@@ -106,6 +107,10 @@ func (h *Handler) Servis(w http.ResponseWriter, r *http.Request) {
ps := h.popuniPodaciStranice(r, podesavanja)
ps.Stranica = "servis"
ps.NaslovStranice = "Servis"
var nemaFiskalnog map[int64]bool
if h.modulUkljucen(r.Context(), config.ModulFiskalizacija) {
nemaFiskalnog, _ = h.FiskalRepo.ServisiBezFiskalnog(r.Context())
}
podaci := PodaciServisa{
PodaciStranice: ps,
Nalozi: nalozi,
@@ -114,6 +119,7 @@ func (h *Handler) Servis(w http.ResponseWriter, r *http.Request) {
SviStatusi: model.SviStatusi,
Sacuvano: r.URL.Query().Get("sacuvano") == "1",
Obrisan: r.URL.Query().Get("obrisan") == "1",
NemaFiskalnog: nemaFiskalnog,
}
h.renderujTemplate(w, "servis", podaci)
@@ -138,11 +144,16 @@ func (h *Handler) ArhivaServisa(w http.ResponseWriter, r *http.Request) {
ps := h.popuniPodaciStranice(r, podesavanja)
ps.Stranica = "servis"
ps.NaslovStranice = "Arhiva servisa"
var nemaFiskalnog map[int64]bool
if h.modulUkljucen(r.Context(), config.ModulFiskalizacija) {
nemaFiskalnog, _ = h.FiskalRepo.ServisiBezFiskalnog(r.Context())
}
podaci := PodaciServisa{
PodaciStranice: ps,
Nalozi: nalozi,
Pretraga: pretraga,
SviStatusi: model.SviStatusi,
NemaFiskalnog: nemaFiskalnog,
}
h.renderujTemplate(w, "servis_arhiva", podaci)