Knjigovodstvo: storno prodaje/nabavke više ne briše KIR/KPR/KPO

Storno je fizički brisao vezani KIR/KPR/KPO zapis — zakon o računovodstvu ne
dozvoljava brisanje poslovnih knjiga (KPO dodatno ima redni broj bez prekida).
Sad se original čuva, a storno se dograđuje kao poništavajuća stavka
(negirani iznosi, referenca na original) — model.KirStorno/KprStorno/KpoStorno.

Usput ispravljen i pravi uzrok prijavljenog bug-a: kirKandidatiProdaje je
filtrirala samo internu mapu, ne i listu naloga koju obilazi KirBackfillProdaje
— stornirani nalozi su zbog toga dobijali ponovni (pogrešan) KIR upis.
This commit is contained in:
2026-07-02 10:35:24 +02:00
parent 3a0f98622b
commit 45831467e0
10 changed files with 253 additions and 36 deletions
+57
View File
@@ -129,6 +129,36 @@ func KirIzProdaje(nalog ProdajniNalog, stavke []StavkaProdaje, kupacNaziv, kupac
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
// dozvoljava brisanje knjigovodstvenih evidencija — storno se knjiži kao
// poništavajuća stavka koja upućuje na original, a ne kao brisanje reda.
func KirStorno(original PdvKir, razlog string, datumStorna time.Time) PdvKir {
napomena := "Storno računa " + original.BrojDokumenta
if razlog != "" {
napomena += ": " + razlog
}
return PdvKir{
DatumPrometa: datumStorna,
DatumKnjizenja: datumStorna,
BrojDokumenta: "STORNO-" + original.BrojDokumenta,
KupacNaziv: original.KupacNaziv,
KupacPib: original.KupacPib,
KupacMesto: original.KupacMesto,
OsnovicaOpsta: -original.OsnovicaOpsta,
PdvOpsta: -original.PdvOpsta,
OsnovicaPosebna: -original.OsnovicaPosebna,
PdvPosebna: -original.PdvPosebna,
OslobodenSaPravom: -original.OslobodenSaPravom,
OslobodenBezPrava: -original.OslobodenBezPrava,
Ukupno: -original.Ukupno,
Napomena: napomena,
Izvor: original.Izvor,
IzvorID: original.IzvorID,
}
}
// PdvKpr je jedan zapis u knjizi primljenih računa (ulazni PDV).
type PdvKpr struct {
ID int64
@@ -153,6 +183,33 @@ type PdvKpr struct {
DatumUnosa time.Time
}
// KprStorno gradi storno zapis za dati KPR red — vidi KirStorno.
func KprStorno(original PdvKpr, razlog string, datumStorna time.Time) PdvKpr {
napomena := "Storno dokumenta " + original.BrojDokumenta
if razlog != "" {
napomena += ": " + razlog
}
return PdvKpr{
DatumPrometa: datumStorna,
DatumKnjizenja: datumStorna,
BrojDokumenta: "STORNO-" + original.BrojDokumenta,
DobavljacNaziv: original.DobavljacNaziv,
DobavljacPib: original.DobavljacPib,
DobavljacMesto: original.DobavljacMesto,
OsnovicaOpsta: -original.OsnovicaOpsta,
PdvOpsta: -original.PdvOpsta,
OsnovicaPosebna: -original.OsnovicaPosebna,
PdvPosebna: -original.PdvPosebna,
PdvBezOdbitka: -original.PdvBezOdbitka,
OslobodenNabavka: -original.OslobodenNabavka,
Ukupno: -original.Ukupno,
Napomena: napomena,
Izvor: original.Izvor,
IzvorID: original.IzvorID,
Uvoz: original.Uvoz,
}
}
// OznakaPoreskogBroja vraća „JMBG" za 13-cifreni broj, inače „PIB" (dobavljači su obično firme).
func (k PdvKpr) OznakaPoreskogBroja() string {
cifre := 0