feat(magacin): nivelacija — promena cene uz trag (Faza A)

Tabela nivelacije (migr 045) beleži svaku promenu prodajne cene:
artikal, stara→nova cena, razlog, izvor, korisnik, datum. Dva okidača:
posebna akcija „Promeni cenu" (modal, izvor 'rucno') i auto-trag pri
izmeni artikla (izvor 'izmena'). PromeniCenu je transakciono (update
cene + upis zapisa). Pregled /nivelacije sa filterom perioda i razlikom
(+/− i %). Modal otvara svoj nextElementSibling — radi i na mobilnom
uprkos dupliranim id-jevima iz dva rasporeda.
This commit is contained in:
2026-06-14 09:37:49 +02:00
parent c9d4704c3d
commit 0f1f65c7f7
13 changed files with 463 additions and 2 deletions
+23
View File
@@ -0,0 +1,23 @@
package model
import "testing"
func TestNivelacija(t *testing.T) {
// poskupljenje: 100 → 120 = +20, +20%
n := Nivelacija{StaraCena: 100, NovaCena: 120}
if !blizu(n.Razlika(), 20) || !blizu(n.Procenat(), 20) || !n.Poskupljenje() {
t.Errorf("razlika=%v procenat=%v poskupljenje=%v, očekivano 20/20/true", n.Razlika(), n.Procenat(), n.Poskupljenje())
}
// pojeftinjenje: 200 → 150 = -50, -25%
n2 := Nivelacija{StaraCena: 200, NovaCena: 150}
if !blizu(n2.Razlika(), -50) || !blizu(n2.Procenat(), -25) || n2.Poskupljenje() {
t.Errorf("razlika=%v procenat=%v poskupljenje=%v, očekivano -50/-25/false", n2.Razlika(), n2.Procenat(), n2.Poskupljenje())
}
// stara cena 0 → procenat 0 (bez deljenja nulom)
n3 := Nivelacija{StaraCena: 0, NovaCena: 80}
if !blizu(n3.Procenat(), 0) {
t.Errorf("procenat=%v, očekivano 0 kada je stara cena 0", n3.Procenat())
}
}