Servis: prikaz fiskalnog računa u detaljima naloga (PFR broj + QR kod)

Dodat FiskalRepository.DohvatiPoServisu (repo + interfejs)
PodaciDetaljiNaloga.FiskalniRacun — učitava se pri otvaranju detalja
Kartica u servis_detalji.html — PFR broj, vreme, brojač, QR, link ka PURS-u
This commit is contained in:
2026-06-26 01:04:34 +02:00
parent afde0850bb
commit 7882b70500
4 changed files with 63 additions and 0 deletions
+1
View File
@@ -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)
}
+31
View File
@@ -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
}
+6
View File
@@ -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)
}