- 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
103 lines
3.3 KiB
Go
103 lines
3.3 KiB
Go
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)
|
|
}
|
|
}
|