diff --git a/internal/db/repository.go b/internal/db/repository.go index 515f56e..6b41af6 100644 --- a/internal/db/repository.go +++ b/internal/db/repository.go @@ -374,4 +374,5 @@ type PodsetnikRepository interface { type FiskalRepository interface { Kreiraj(ctx context.Context, fr *model.FiskalniRacun) (int64, error) DohvatiPoProdaji(ctx context.Context, prodajaID int64) (*model.FiskalniRacun, error) + DohvatiPoServisu(ctx context.Context, servisID int64) (*model.FiskalniRacun, error) } diff --git a/internal/db/sqlite/fiskal.go b/internal/db/sqlite/fiskal.go index d966a86..670e901 100644 --- a/internal/db/sqlite/fiskal.go +++ b/internal/db/sqlite/fiskal.go @@ -80,3 +80,34 @@ func (r *FiskalRepo) DohvatiPoProdaji(ctx context.Context, prodajaID int64) (*mo fr.Storniran = storniran != 0 return fr, nil } + +// DohvatiPoServisu vraća fiskalni račun za dati servisni nalog. +// Vraća nil bez greške ako račun ne postoji. +func (r *FiskalRepo) DohvatiPoServisu(ctx context.Context, servisID int64) (*model.FiskalniRacun, error) { + fr := &model.FiskalniRacun{} + var storniran int + var sID sql.NullInt64 + err := r.db.QueryRowContext(ctx, ` + SELECT id, prodaja_id, servis_id, tip_racuna, tip_transakcije, pfr_broj, pfr_vreme, + brojac, ekstenzija_brojaca, url_verifikacija, qr_kod, + poreske_stavke, ukupno_za_naplatu, ukupan_porez, + sirovi_odgovor, potpisao, zatrazio, poruka, storniran, vreme_kreiranja + FROM fiskalni_racuni WHERE servis_id = ? + `, servisID).Scan( + &fr.ID, &fr.ProdajaID, &sID, &fr.TipRacuna, &fr.TipTransakcije, &fr.PfrBroj, &fr.PfrVreme, + &fr.Brojac, &fr.EkstenzijaBrojaca, &fr.UrlVerifikacija, &fr.QRKod, + &fr.PoreskeStavke, &fr.UkupnoZaNaplatu, &fr.UkupanPorez, + &fr.SiroviOdgovor, &fr.Potpisao, &fr.Zatrazio, &fr.Poruka, &storniran, &fr.VremeKreiranja, + ) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, fmt.Errorf("ntech: FiskalRepo.DohvatiPoServisu: %w", err) + } + if sID.Valid { + fr.ServisID = sID.Int64 + } + fr.Storniran = storniran != 0 + return fr, nil +} diff --git a/internal/handler/servis.go b/internal/handler/servis.go index b27974e..04f4457 100644 --- a/internal/handler/servis.go +++ b/internal/handler/servis.go @@ -77,6 +77,7 @@ type PodaciDetaljiNaloga struct { CenaDijagnostikePredlog string // podrazumevana cena dijagnostike iz podešavanja (za prefill input-a) KorisceneUsluge map[int64]bool // ID-evi usluga već dodatih na nalog — izostavljaju se iz dropdown-a SviStatusi []string + FiskalniRacun *model.FiskalniRacun // nil ako nije fiskalizovano } // Servis renderuje listu servisnih naloga sa opcionom pretragom i filterom statusa @@ -698,6 +699,11 @@ func (h *Handler) DetaljiNaloga(w http.ResponseWriter, r *http.Request) { SviStatusi: model.SviStatusi, } + // učitaj fiskalni račun ako postoji (za prikaz u detaljima) + if fr, _ := h.FiskalRepo.DohvatiPoServisu(r.Context(), id); fr != nil { + podaci.FiskalniRacun = fr + } + h.renderujTemplate(w, "servis_detalji", podaci) } diff --git a/web/templates/stranice/servis_detalji.html b/web/templates/stranice/servis_detalji.html index a3f2fc9..bde85ec 100644 --- a/web/templates/stranice/servis_detalji.html +++ b/web/templates/stranice/servis_detalji.html @@ -877,6 +877,31 @@ + {{if .FiskalniRacun}} +
+
+ Fiskalni račun +
+
+
+

PFR broj: {{.FiskalniRacun.PfrBroj}}

+

Vreme: {{.FiskalniRacun.PfrVreme}}

+

Brojač: {{.FiskalniRacun.Brojac}}

+ {{if .FiskalniRacun.UrlVerifikacija}} +

+ Provera na PURS-u → +

+ {{end}} +
+ {{if .FiskalniRacun.QRKod}} +
+ QR kod +
+ {{end}} +
+
+ {{end}} + {{/* Brisanje je moguće samo dok je „Primljeno" (greška pri unosu); čim uđe u proceduru naplaćuje se dijagnostika */}} {{if eq .Nalog.Status "Primljeno"}}