Dashboard/izveštaji: ispravka obračuna prihoda + KIR servisa, testovi
- Prihod meseca: izbačeni stornirani nalozi, servis preko naplaceno+avans - Servis KIR: neto cena + PDV po stvarnoj stopi (PdvKir.DodajNeto), bez hardkodovanih 20% - TopKlijenti: samo preuzeti nalozi sa naplatom/avansom - Izveštaji: mesečni ključevi sidreni na 1. u mesecu (bez preliva dana) - BUG-04: konačna cena servisa bez dvostrukog računanja delova - Dashboard: uklonjena kartica „Prihod ovog meseca" - Default port 3000 - Dodati testovi: prihod/storno/delovi/nivelacija/KIR/mesečni ključevi
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
package sqlite
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"ntech/internal/model"
|
||||
)
|
||||
|
||||
// TestAzurirajStatus_DatumZavrsetka: datum_zavrsetka se setuje samo kad
|
||||
// nalog prelazi u Završeno ili Preuzeto, a ne za ostale statuse.
|
||||
func TestAzurirajStatus_DatumZavrsetka(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
baza := testDB(t)
|
||||
repo := NoviServisRepo(baza)
|
||||
|
||||
nalogID, _ := repo.Kreiraj(ctx, &model.ServisniNalog{
|
||||
BrojNaloga: "SN-ST-001", Uredjaj: "PC", OpisKvara: "kvar", Status: "Primljeno",
|
||||
})
|
||||
|
||||
// prelazak u "U popravci" — datum_zavrsetka ne sme biti postavljen
|
||||
repo.AzurirajStatus(ctx, nalogID, "U popravci")
|
||||
nalog, _ := repo.DohvatiID(ctx, nalogID)
|
||||
if nalog.DatumZavrsetka != nil {
|
||||
t.Errorf("U popravci: datum_zavrsetka = %v, očekivano nil", nalog.DatumZavrsetka)
|
||||
}
|
||||
|
||||
// prelazak u "Završeno" — datum_zavrsetka se postavlja
|
||||
repo.AzurirajStatus(ctx, nalogID, "Završeno")
|
||||
nalog, _ = repo.DohvatiID(ctx, nalogID)
|
||||
if nalog.DatumZavrsetka == nil {
|
||||
t.Error("Završeno: datum_zavrsetka je nil, očekivano da bude postavljen")
|
||||
}
|
||||
|
||||
// drugi prelazak u "Preuzeto" — datum_zavrsetka se čuva (COALESCE, ne menja)
|
||||
prvoDatum := nalog.DatumZavrsetka
|
||||
repo.AzurirajStatus(ctx, nalogID, "Preuzeto")
|
||||
nalog, _ = repo.DohvatiID(ctx, nalogID)
|
||||
if nalog.DatumZavrsetka == nil {
|
||||
t.Error("Preuzeto: datum_zavrsetka je nil")
|
||||
}
|
||||
if !nalog.DatumZavrsetka.Equal(*prvoDatum) {
|
||||
t.Errorf("datum_zavrsetka promenjen: bio %v, sada %v (COALESCE treba da čuva original)", prvoDatum, nalog.DatumZavrsetka)
|
||||
}
|
||||
}
|
||||
|
||||
// TestAzurirajStatus_ResetPopravkaOdbijena: svaka promena statusa resetuje
|
||||
// popravka_odbijena na 0, čak i ako je pre bila 1.
|
||||
func TestAzurirajStatus_ResetPopravkaOdbijena(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
baza := testDB(t)
|
||||
repo := NoviServisRepo(baza)
|
||||
|
||||
nalogID, _ := repo.Kreiraj(ctx, &model.ServisniNalog{
|
||||
BrojNaloga: "SN-ST-002", Uredjaj: "Laptop", OpisKvara: "kvar", Status: "U dijagnostici",
|
||||
})
|
||||
|
||||
// postavi popravka_odbijena=1 direktno
|
||||
baza.ExecContext(ctx, "UPDATE servisni_nalozi SET popravka_odbijena=1 WHERE id=?", nalogID)
|
||||
|
||||
nalog, _ := repo.DohvatiID(ctx, nalogID)
|
||||
if !nalog.PopravkaOdbijena {
|
||||
t.Fatal("setup: popravka_odbijena treba da bude true")
|
||||
}
|
||||
|
||||
// promena statusa → reset
|
||||
repo.AzurirajStatus(ctx, nalogID, "U popravci")
|
||||
nalog, _ = repo.DohvatiID(ctx, nalogID)
|
||||
if nalog.PopravkaOdbijena {
|
||||
t.Error("posle AzurirajStatus: popravka_odbijena treba da bude false")
|
||||
}
|
||||
}
|
||||
|
||||
// TestOdbijPopravku: status → Završeno, popravka_odbijena=1, datum_zavrsetka postavljen.
|
||||
func TestOdbijPopravku(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
baza := testDB(t)
|
||||
repo := NoviServisRepo(baza)
|
||||
|
||||
nalogID, _ := repo.Kreiraj(ctx, &model.ServisniNalog{
|
||||
BrojNaloga: "SN-ST-003", Uredjaj: "Telefon", OpisKvara: "razbijen ekran", Status: "U dijagnostici",
|
||||
})
|
||||
|
||||
const cenaDijag = 1500.0
|
||||
if err := repo.OdbijPopravku(ctx, nalogID, cenaDijag); err != nil {
|
||||
t.Fatalf("OdbijPopravku: %v", err)
|
||||
}
|
||||
|
||||
nalog, _ := repo.DohvatiID(ctx, nalogID)
|
||||
if nalog.Status != model.StatusZavrseno {
|
||||
t.Errorf("status = %q, očekivano %q", nalog.Status, model.StatusZavrseno)
|
||||
}
|
||||
if !nalog.PopravkaOdbijena {
|
||||
t.Error("popravka_odbijena treba da bude true")
|
||||
}
|
||||
if nalog.DatumZavrsetka == nil {
|
||||
t.Error("datum_zavrsetka treba da bude postavljen")
|
||||
}
|
||||
if nalog.CenaDijagnostike != cenaDijag {
|
||||
t.Errorf("cena_dijagnostike = %.2f, očekivano %.2f", nalog.CenaDijagnostike, cenaDijag)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user