Servis: sprečeno dupliranje KIR/KPO/fiskalnog pri ponovnom Preuzeto; KPO redni_broj

Ponovni ulazak naloga u status Preuzeto (dupli klik, dupli submit modala naplate,
sekvenca Preuzeto→Završeno→Preuzeto) je ponovo pokretao fiskalizaciju i upis u
KIR/KPO bez provere da li već postoje — svaki ulazak je duplirao prihod i PDV
obavezu, a dashboard/backfill duplikat nikad nije prijavljivao jer je dovoljan
bio bar jedan zapis. Dodate PostojiZaIzvor/DohvatiPoServisu provere pre svakog
upisa (isti obrazac kao RetryFiskalizacija).

KIR upis servisa refaktorisan u model.KirIzServisa (deljeno sa budućim backfill-om).

KpoRepo.Kreiraj sad dodeljuje redni_broj automatski (COALESCE(MAX,0)+1) — kolona
je postojala u šemi ali se nikad nije popunjavala, pa knjiga o ostvarenom prometu
paušalaca nije imala redni broj koji Pravilnik zahteva.
This commit is contained in:
2026-07-02 11:27:19 +02:00
parent 2cc9c24aa9
commit 3c61063bbb
5 changed files with 123 additions and 33 deletions
+32
View File
@@ -129,6 +129,38 @@ func KirIzProdaje(nalog ProdajniNalog, stavke []StavkaProdaje, kupacNaziv, kupac
return k
}
// KirIzServisa gradi KIR zapis iz preuzetog servisnog naloga: radovi i ugrađeni
// delovi (bez predloženih koji čekaju odobrenje klijenta) se sabiraju kao NETO
// stavke po svojoj PDV stopi. datumPrometa je trenutak prometa (za sveže naloge
// „sada", za backfill starih naloga datum preuzimanja); datumKnjizenja je kad se
// zapis stvarno upisuje u knjigu (za backfill kasni za periodom).
func KirIzServisa(nalog ServisniNalog, radovi []ServisniRad, delovi []ServisniDeoSaArtiklom, kupacNaziv, kupacPib, kupacMesto string, datumPrometa, datumKnjizenja time.Time) PdvKir {
id := nalog.ID
k := PdvKir{
DatumPrometa: datumPrometa,
DatumKnjizenja: datumKnjizenja,
BrojDokumenta: nalog.BrojNaloga,
KupacNaziv: kupacNaziv,
KupacPib: kupacPib,
KupacMesto: kupacMesto,
Izvor: "servis",
IzvorID: &id,
}
for _, r := range radovi {
if r.Predlozeno {
continue
}
k.DodajNeto(r.Ukupno(), r.PdvStopa)
}
for _, d := range delovi {
if d.Predlozeno {
continue
}
k.DodajNeto(d.Ukupno(), d.PdvStopa)
}
return k
}
// KirStorno gradi storno (knjižno odobrenje) zapis za dati KIR red: iznosi su
// negirani original, upisan pod istim izvorom/izvor_id tako da PostojiZaIzvor
// ostane tačan i backfill ne pokuša ponovni upis. Zakon o računovodstvu ne