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.
41 lines
1.0 KiB
Go
41 lines
1.0 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"ntech/internal/model"
|
|
)
|
|
|
|
// TestKpoRedniBroj: redni_broj mora biti dodeljen automatski i bez prekida —
|
|
// Pravilnik o KPO zahteva kontinuiran niz, i knjiga se nikad ne briše (storno
|
|
// se dograđuje kao nov red, ne zamenjuje stari).
|
|
func TestKpoRedniBroj(t *testing.T) {
|
|
db := testDB(t)
|
|
repo := NoviKpoRepo(db)
|
|
ctx := context.Background()
|
|
dp := time.Date(2026, 7, 1, 0, 0, 0, 0, time.UTC)
|
|
|
|
for _, brojDok := range []string{"SN-1", "SN-2", "SN-3"} {
|
|
if _, err := repo.Kreiraj(ctx, &model.KpoZapis{
|
|
DatumPrometa: dp, BrojDokumenta: brojDok, Prihod: 100,
|
|
}); err != nil {
|
|
t.Fatalf("Kreiraj %s: %v", brojDok, err)
|
|
}
|
|
}
|
|
|
|
zapisi, err := repo.Lista(ctx, time.Time{}, time.Time{})
|
|
if err != nil {
|
|
t.Fatalf("Lista: %v", err)
|
|
}
|
|
if len(zapisi) != 3 {
|
|
t.Fatalf("očekivano 3 zapisa, dobijeno %d", len(zapisi))
|
|
}
|
|
for i, z := range zapisi {
|
|
if z.RedniBroj == nil || *z.RedniBroj != i+1 {
|
|
t.Errorf("zapis %q: redni_broj=%v, očekivano %d", z.BrojDokumenta, z.RedniBroj, i+1)
|
|
}
|
|
}
|
|
}
|