Servis: ispravka logike potraživanih delova (5 bugova)

- BUG 1: pokriveni deo se sada prebacuje u ugrađene delove (servisni_delovi),
ne samo skida sa magacina — roba više ne nestaje iz evidencije
- BUG 2: DodajDeloNalogu sada atomično (UgradiIliPotrazuj) čita stanje i
ugrađuje u istoj transakciji — nema TOCTOU, lager ne ide u minus
- BUG 4: direktna izmena količine artikla beleži magacinski trag (korekcija)
- BUG 5: greška pri dodavanju dela se propagira korisniku, ne guta se
- uklonjen mrtav kod (Dodaj, DodajIliUvecaj) sa pogrešnim komentarom o minusu
- migracija 068: cena_komada u potraživanim delovima
- test TestPotrazivaniTok pokriva ceo tok
This commit is contained in:
2026-06-22 16:13:16 +02:00
parent b3739e3210
commit 7516f49571
8 changed files with 264 additions and 144 deletions
+13 -1
View File
@@ -251,12 +251,24 @@ func (h *Handler) SacuvajIzmenuArtikla(w http.ResponseWriter, r *http.Request) {
}
}
// promenu količine sprovodimo kroz KorigujKolicinu da bi se zabeležio magacinski
// trag (korekcija); Izmeni menja samo metapodatke, ne dira stanje
novaKolicina := artikal.Kolicina
artikal.Kolicina = staraKolicina
artikal.ID = id
if err := h.Artikli.Izmeni(r.Context(), &artikal); err != nil {
http.Error(w, "Greška pri čuvanju izmene", http.StatusInternalServerError)
return
}
// ako se količina promenila, koriguj stanje uz magacinski trag
if novaKolicina != staraKolicina {
if e := h.Artikli.KorigujKolicinu(r.Context(), id, novaKolicina, &k.ID, "izmena artikla"); e != nil {
slog.Error("korekcija količine pri izmeni artikla nije uspela", "artikal_id", id, "error", e)
}
}
// ažuriraj dobavljače artikla prema formi
if e := h.Artikli.PostaviDobavljaceArtikla(r.Context(), id, citajDobavljaceForme(r)); e != nil {
slog.Error("čuvanje dobavljača artikla nije uspelo", "artikal_id", id, "error", e)
@@ -277,7 +289,7 @@ func (h *Handler) SacuvajIzmenuArtikla(w http.ResponseWriter, r *http.Request) {
}
// ako je stanje poraslo, proveri potraživane servisne delove
if artikal.Kolicina > staraKolicina {
if novaKolicina > staraKolicina {
otkljucani, err := h.ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal(r.Context(), id)
if err != nil {
slog.Error("provera potraživanih delova nije uspela", "artikal_id", id, "error", err)