BUGFIX: fiskalni_racuni — dodata podrška za servisne naloge (servis_id kolona)

Migracija 083: rekreira fiskalni_racuni tabelu sa servis_id (nullable) i bez FK constraint-a
Model: dodat ServisID int64 polje
Repo: INSERT/SELECT sada koristi i servis_id
Handler: fiskalizujServis koristi ServisID umesto negativnog ProdajaID
This commit is contained in:
2026-06-26 01:00:22 +02:00
parent 280460b9cf
commit 1bd5125c70
4 changed files with 71 additions and 10 deletions
+19 -8
View File
@@ -19,16 +19,23 @@ func NoviFiskalRepo(db *sql.DB) *FiskalRepo {
}
// Kreiraj dodaje novi fiskalni račun u bazu. Vraća ID kreiranog reda.
// ProdajaID je UNIQUE — drugi poziv sa istim ID-jem pada na constraint.
// Koristi prodaja_id (za prodaju) ILI servis_id (za servis) — ne oba.
func (r *FiskalRepo) Kreiraj(ctx context.Context, fr *model.FiskalniRacun) (int64, error) {
var prodajaID, servisID any
if fr.ProdajaID > 0 {
prodajaID = fr.ProdajaID
}
if fr.ServisID > 0 {
servisID = fr.ServisID
}
rez, err := r.db.ExecContext(ctx, `
INSERT INTO fiskalni_racuni (
prodaja_id, tip_racuna, tip_transakcije, pfr_broj, pfr_vreme,
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
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`, fr.ProdajaID, fr.TipRacuna, fr.TipTransakcije, fr.PfrBroj, fr.PfrVreme,
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`, prodajaID, servisID, 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,
@@ -44,28 +51,32 @@ func (r *FiskalRepo) Kreiraj(ctx context.Context, fr *model.FiskalniRacun) (int6
}
// DohvatiPoProdaji vraća fiskalni račun za dati prodajni nalog.
// Vraća nil bez greške ako račun ne postoji (nije fiskalizovano).
// Vraća nil bez greške ako račun ne postoji.
func (r *FiskalRepo) DohvatiPoProdaji(ctx context.Context, prodajaID int64) (*model.FiskalniRacun, error) {
fr := &model.FiskalniRacun{}
var storniran int
var sID sql.NullInt64
err := r.db.QueryRowContext(ctx, `
SELECT id, prodaja_id, tip_racuna, tip_transakcije, pfr_broj, pfr_vreme,
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 prodaja_id = ?
`, prodajaID).Scan(
&fr.ID, &fr.ProdajaID, &fr.TipRacuna, &fr.TipTransakcije, &fr.PfrBroj, &fr.PfrVreme,
&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 // nije fiskalizovano — nije greška
return nil, nil
}
if err != nil {
return nil, fmt.Errorf("ntech: FiskalRepo.DohvatiPoProdaji: %w", err)
}
if sID.Valid {
fr.ServisID = sID.Int64
}
fr.Storniran = storniran != 0
return fr, nil
}