From 2c589eaae0788c24499116777bb8035696c2b0eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Mon, 22 Jun 2026 15:19:50 +0200 Subject: [PATCH] =?UTF-8?q?Servis:=20otklju=C4=8Davanje=20naloga=20pri=20n?= =?UTF-8?q?abavci=20potra=C5=BEivanih=20delova=20Nakon=20=C5=A1to=20nabavk?= =?UTF-8?q?a=20pove=C4=87a=20stanje=20artikla,=20SacuvajNabavku=20poziva?= =?UTF-8?q?=20ProveriIPocistiZaArtikal=20koja=20FIFO=20bri=C5=A1e/smanjuje?= =?UTF-8?q?=20potra=C5=BEivane=20redove.=20Kada=20nestanu=20svi=20potra?= =?UTF-8?q?=C5=BEivani=20redovi,=20nalog=20izlazi=20iz=20=C4=8Ceka=20delov?= =?UTF-8?q?e.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/repository.go | 3 + .../db/sqlite/servisni_potrazivani_delovi.go | 57 +++++++++++++++++++ internal/handler/nabavka.go | 7 +++ 3 files changed, 67 insertions(+) diff --git a/internal/db/repository.go b/internal/db/repository.go index e8a1e2f..f8ee9ad 100644 --- a/internal/db/repository.go +++ b/internal/db/repository.go @@ -221,6 +221,9 @@ type ServisniPotrazivaniDeloviRepository interface { DodajIliUvecaj(ctx context.Context, nalogID, artikalID int64, kolicina int) (int64, error) Obrisi(ctx context.Context, id int64) error ObrisiZaArtikal(ctx context.Context, nalogID, artikalID int64) error + // ProveriIPocistiZaArtikal proverava potraživane redove za dati artikal nakon + // povećanja stanja i briše/smanjuje redove koji se mogu pokriti (FIFO). + ProveriIPocistiZaArtikal(ctx context.Context, artikalID int64) error } // ServisniRadoviRepository definiše operacije nad radovima (uslugama) na nalogu diff --git a/internal/db/sqlite/servisni_potrazivani_delovi.go b/internal/db/sqlite/servisni_potrazivani_delovi.go index da9eda8..c6c0614 100644 --- a/internal/db/sqlite/servisni_potrazivani_delovi.go +++ b/internal/db/sqlite/servisni_potrazivani_delovi.go @@ -105,3 +105,60 @@ func (r *ServisniPotrazivaniDeloviRepo) ObrisiZaArtikal(ctx context.Context, nal } return nil } + +// ProveriIPocistiZaArtikal poziva se nakon što stanje artikla poraste (nabavka) +// i čisti potraživane redove koji se sada mogu pokriti dostupnim stanjem (FIFO). +// Delimično pokrivanje smanjuje traženu količinu umesto brisanja. +func (r *ServisniPotrazivaniDeloviRepo) ProveriIPocistiZaArtikal(ctx context.Context, artikalID int64) error { + var stanje int + err := r.db.QueryRowContext(ctx, "SELECT kolicina FROM artikli WHERE id = ?", artikalID).Scan(&stanje) + if err != nil { + return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: stanje: %w", err) + } + if stanje <= 0 { + return nil + } + + redovi, err := r.db.QueryContext(ctx, + "SELECT id, kolicina FROM servisni_potrazivani_delovi WHERE artikal_id = ? ORDER BY datum", + artikalID, + ) + if err != nil { + return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: query: %w", err) + } + defer redovi.Close() + + type red struct { + id int64 + kolicina int + } + var lista []red + for redovi.Next() { + var p red + if err := redovi.Scan(&p.id, &p.kolicina); err != nil { + return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: scan: %w", err) + } + lista = append(lista, p) + } + redovi.Close() + + dostupno := stanje + for _, p := range lista { + if dostupno <= 0 { + break + } + if dostupno >= p.kolicina { + if _, err := r.db.ExecContext(ctx, "DELETE FROM servisni_potrazivani_delovi WHERE id = ?", p.id); err != nil { + return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: delete: %w", err) + } + dostupno -= p.kolicina + } else { + novaKol := p.kolicina - dostupno + if _, err := r.db.ExecContext(ctx, "UPDATE servisni_potrazivani_delovi SET kolicina = ? WHERE id = ?", novaKol, p.id); err != nil { + return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: update: %w", err) + } + dostupno = 0 + } + } + return nil +} diff --git a/internal/handler/nabavka.go b/internal/handler/nabavka.go index 8480d2c..a2a4e3c 100644 --- a/internal/handler/nabavka.go +++ b/internal/handler/nabavka.go @@ -261,6 +261,13 @@ func (h *Handler) SacuvajNabavku(w http.ResponseWriter, r *http.Request) { } } + // nakon povećanja stanja proveri da li se potraživani delovi u servisu mogu pokriti + for _, s := range stavke { + if err := h.ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal(r.Context(), s.ArtikalID); err != nil { + slog.Error("provera potraživanih delova nije uspela", "artikal_id", s.ArtikalID, "error", err) + } + } + http.Redirect(w, r, "/nabavke/"+strconv.FormatInt(id, 10)+"?sacuvano=1", http.StatusSeeOther) }