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:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -877,6 +877,31 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{if .FiskalniRacun}}
|
||||
<div class="kartica detalji-kartica animiraj">
|
||||
<div style="margin-bottom:12px;padding-bottom:10px;border-bottom:0.5px solid var(--ivica);">
|
||||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Fiskalni račun</span>
|
||||
</div>
|
||||
<div style="display:flex;gap:16px;flex-wrap:wrap;align-items:flex-start;">
|
||||
<div style="flex:1;min-width:200px;">
|
||||
<p style="margin:0 0 4px 0;"><strong>PFR broj:</strong> {{.FiskalniRacun.PfrBroj}}</p>
|
||||
<p style="margin:0 0 4px 0;"><strong>Vreme:</strong> {{.FiskalniRacun.PfrVreme}}</p>
|
||||
<p style="margin:0 0 4px 0;color:var(--tekst-sporedno);"><strong>Brojač:</strong> {{.FiskalniRacun.Brojac}}</p>
|
||||
{{if .FiskalniRacun.UrlVerifikacija}}
|
||||
<p style="margin:4px 0 0 0;font-size:13px;">
|
||||
<a href="{{.FiskalniRacun.UrlVerifikacija}}" target="_blank" rel="noopener noreferrer" style="color:var(--sb-akcent);">Provera na PURS-u →</a>
|
||||
</p>
|
||||
{{end}}
|
||||
</div>
|
||||
{{if .FiskalniRacun.QRKod}}
|
||||
<div>
|
||||
<img src="data:image/png;base64,{{.FiskalniRacun.QRKod}}" alt="QR kod" style="width:25mm;height:25mm;">
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<!-- zona za brisanje -->
|
||||
{{/* 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"}}
|
||||
|
||||
Reference in New Issue
Block a user