Cena sa PDV-om u magacinu + uslovno prikazivanje po modulu
- migrations/087: nova kolona cena_sa_pdv + popunjavanje postojećih - model.Artikal: polje CenaSaPdv, ispravljene CenaBezPdv/PdvIznos (neto) - sqlite/artikal.go: SELECT/Scan/INSERT/UPDATE za cena_sa_pdv (6 mesta) - magacin_forma.go: pdv_stopa iz forme, kalkulacija cena_sa_pdv, default PDV 20% - magacin.html: dinari format (25.999,00), kolona Sa PDV-om, uslovno po Moduli.pdv - magacin_forma.html: PDV dropdown + Cena sa PDV polje, uslovno po Moduli.pdv, optimizovan layout (Naziv/Jed. mere/Kategorija u 1 redu) - main.go: demo mod bez keširanja šablona (hot-reload) - model_test.go: ažurirani testovi za novo ponašanje CenaBezPdv/PdvIznos
This commit is contained in:
@@ -25,6 +25,7 @@ type Artikal struct {
|
||||
NabavnaCena float64
|
||||
ProdajnaCena float64
|
||||
PdvStopa float64
|
||||
CenaSaPdv float64 // prodajna cena sa PDV-om (bruto); = ProdajnaCena * (1 + PdvStopa/100)
|
||||
Marza *float64 // podrazumevana marža (%) za kalkulaciju; NULL = nije postavljeno
|
||||
Napomena string
|
||||
DatumUnosa time.Time
|
||||
@@ -37,14 +38,14 @@ func (a Artikal) PratiLager() bool {
|
||||
return a.Tip == TipProizvod || a.Tip == ""
|
||||
}
|
||||
|
||||
// CenaBezPdv izračunava prodajnu cenu bez PDV-a
|
||||
// CenaBezPdv vraća prodajnu cenu bez PDV-a (neto)
|
||||
func (a Artikal) CenaBezPdv() float64 {
|
||||
return a.ProdajnaCena / (1 + a.PdvStopa/100)
|
||||
return a.ProdajnaCena
|
||||
}
|
||||
|
||||
// PdvIznos izračunava iznos PDV-a za jednu jedinicu
|
||||
func (a Artikal) PdvIznos() float64 {
|
||||
return a.ProdajnaCena - a.CenaBezPdv()
|
||||
return a.CenaSaPdv - a.ProdajnaCena
|
||||
}
|
||||
|
||||
// Kategorija predstavlja kategoriju artikala
|
||||
|
||||
@@ -15,19 +15,20 @@ func ptr(v float64) *float64 { return &v }
|
||||
func TestArtikalCenaBezPdvIPdvIznos(t *testing.T) {
|
||||
testovi := []struct {
|
||||
naziv string
|
||||
prodajna float64
|
||||
prodajna float64 // neto
|
||||
cenaSaPdv float64 // bruto
|
||||
stopa float64
|
||||
ocekBezPdv float64
|
||||
ocekPdvIznos float64
|
||||
}{
|
||||
{"stopa 20%", 120, 20, 100, 20},
|
||||
{"stopa 0%", 100, 0, 100, 0},
|
||||
{"stopa 10%", 110, 10, 100, 10},
|
||||
{"nula cena", 0, 20, 0, 0},
|
||||
{"stopa 20%", 100, 120, 20, 100, 20},
|
||||
{"stopa 0%", 100, 100, 0, 100, 0},
|
||||
{"stopa 10%", 100, 110, 10, 100, 10},
|
||||
{"nula cena", 0, 0, 20, 0, 0},
|
||||
}
|
||||
for _, tt := range testovi {
|
||||
t.Run(tt.naziv, func(t *testing.T) {
|
||||
a := Artikal{ProdajnaCena: tt.prodajna, PdvStopa: tt.stopa}
|
||||
a := Artikal{ProdajnaCena: tt.prodajna, CenaSaPdv: tt.cenaSaPdv, PdvStopa: tt.stopa}
|
||||
if got := a.CenaBezPdv(); !jednako(got, tt.ocekBezPdv) {
|
||||
t.Errorf("CenaBezPdv() = %v, očekivano %v", got, tt.ocekBezPdv)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user