Files
GoNtech/internal/model/pdv_evidencija.go
T
Dasko 1539ec799f feat(pdv): izvor veza u KIR/KPR — temelj za auto-punjenje (Faza 2b-0)
Kolone izvor ('rucno'/'prodaja'/'nabavka') + izvor_id na pdv_kir/pdv_kpr
(migracija 044, postojeći zapisi → 'rucno'). Repo Kreiraj upisuje izvor,
nova ObrisiPoIzvoru za čišćenje pri stornu/brisanju izvora. Test.
2026-06-14 02:27:23 +02:00

141 lines
3.7 KiB
Go

package model
import "time"
// PdvKir je jedan zapis u knjizi izdatih računa (izlazni PDV).
// Iznosi se vode po vrsti stope (opšta/posebna) — vidi migraciju 041.
type PdvKir struct {
ID int64
DatumPrometa time.Time
DatumKnjizenja time.Time
BrojDokumenta string
KupacNaziv string
KupacPib string
KupacMesto string
OsnovicaOpsta float64
PdvOpsta float64
OsnovicaPosebna float64
PdvPosebna float64
OslobodenSaPravom float64
OslobodenBezPrava float64
Ukupno float64
Napomena string
Izvor string // "rucno" | "prodaja" | "nabavka"
IzvorID *int64 // id izvornog naloga (nil za ručni unos)
DatumUnosa time.Time
}
// OslobodenUkupno vraća zbir oslobođenog prometa (sa i bez prava na odbitak).
func (k PdvKir) OslobodenUkupno() float64 {
return k.OslobodenSaPravom + k.OslobodenBezPrava
}
// OznakaPoreskogBroja vraća „JMBG" ako uneti broj ima 13 cifara (fizičko lice),
// inače „PIB" (pravno lice / preduzetnik — PIB ima 9 cifara).
func (k PdvKir) OznakaPoreskogBroja() string {
cifre := 0
for _, r := range k.KupacPib {
if r >= '0' && r <= '9' {
cifre++
}
}
if cifre == 13 {
return "JMBG"
}
return "PIB"
}
// PdvKirSume su zbirovi kolona KIR-a (za red „ukupno" u pregledu knjige).
type PdvKirSume struct {
OsnovicaOpsta float64
PdvOpsta float64
OsnovicaPosebna float64
PdvPosebna float64
OslobodenSaPravom float64
OslobodenBezPrava float64
Ukupno float64
}
// OslobodenUkupno vraća zbir oslobođenog prometa (sa i bez prava na odbitak).
func (s PdvKirSume) OslobodenUkupno() float64 {
return s.OslobodenSaPravom + s.OslobodenBezPrava
}
// SumirajKir sabira sve kolone iz liste KIR zapisa.
func SumirajKir(zapisi []PdvKir) PdvKirSume {
var s PdvKirSume
for _, z := range zapisi {
s.OsnovicaOpsta += z.OsnovicaOpsta
s.PdvOpsta += z.PdvOpsta
s.OsnovicaPosebna += z.OsnovicaPosebna
s.PdvPosebna += z.PdvPosebna
s.OslobodenSaPravom += z.OslobodenSaPravom
s.OslobodenBezPrava += z.OslobodenBezPrava
s.Ukupno += z.Ukupno
}
return s
}
// PdvKpr je jedan zapis u knjizi primljenih računa (ulazni PDV).
type PdvKpr struct {
ID int64
DatumPrometa time.Time
DatumKnjizenja time.Time
DatumPlacanja *time.Time // može biti prazan
BrojDokumenta string
DobavljacNaziv string
DobavljacPib string
DobavljacMesto string
OsnovicaOpsta float64
PdvOpsta float64
OsnovicaPosebna float64
PdvPosebna float64
PdvBezOdbitka float64
OslobodenNabavka float64
Ukupno float64
Napomena string
Izvor string // "rucno" | "prodaja" | "nabavka"
IzvorID *int64 // id izvorne nabavke (nil za ručni unos)
DatumUnosa time.Time
}
// OznakaPoreskogBroja vraća „JMBG" za 13-cifreni broj, inače „PIB" (dobavljači su obično firme).
func (k PdvKpr) OznakaPoreskogBroja() string {
cifre := 0
for _, r := range k.DobavljacPib {
if r >= '0' && r <= '9' {
cifre++
}
}
if cifre == 13 {
return "JMBG"
}
return "PIB"
}
// PdvKprSume su zbirovi kolona KPR-a (za red „ukupno" u pregledu knjige).
type PdvKprSume struct {
OsnovicaOpsta float64
PdvOpsta float64
OsnovicaPosebna float64
PdvPosebna float64
PdvBezOdbitka float64
OslobodenNabavka float64
Ukupno float64
}
// SumirajKpr sabira sve kolone iz liste KPR zapisa.
func SumirajKpr(zapisi []PdvKpr) PdvKprSume {
var s PdvKprSume
for _, z := range zapisi {
s.OsnovicaOpsta += z.OsnovicaOpsta
s.PdvOpsta += z.PdvOpsta
s.OsnovicaPosebna += z.OsnovicaPosebna
s.PdvPosebna += z.PdvPosebna
s.PdvBezOdbitka += z.PdvBezOdbitka
s.OslobodenNabavka += z.OslobodenNabavka
s.Ukupno += z.Ukupno
}
return s
}