From b9d960a4a0c0e8d5f3cf703ba0f9553ddfced634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Mon, 1 Jun 2026 20:52:59 +0200 Subject: [PATCH] Uklanjanje nabavne cene iz artikala, responsive dashboard, dodavanje tabela za nabavke --- internal/db/sqlite/artikal.go | 18 ++++----- internal/handler/magacin_forma.go | 8 ---- internal/model/artikal.go | 3 +- migrations/012_nabavke.sql | 46 +++++++++++++++++++++++ web/templates/stranice/dashboard.html | 4 +- web/templates/stranice/magacin.html | 2 - web/templates/stranice/magacin_forma.html | 13 ++----- 7 files changed, 61 insertions(+), 33 deletions(-) create mode 100644 migrations/012_nabavke.sql diff --git a/internal/db/sqlite/artikal.go b/internal/db/sqlite/artikal.go index 16fedc6..ed995fb 100644 --- a/internal/db/sqlite/artikal.go +++ b/internal/db/sqlite/artikal.go @@ -25,7 +25,7 @@ func (r *ArtikalRepo) Lista(ctx context.Context, filter db.ArtikalFilter) ([]mod SELECT a.id, a.kategorija_id, a.naziv, a.opis, a.kolicina, a.kolicina_min, a.lokacija, - a.nabavna_cena, a.prodajna_cena, a.napomena, a.datum_unosa, + a.prodajna_cena, a.napomena, a.datum_unosa, COALESCE(k.naziv, '') as kategorija_naziv FROM artikli a LEFT JOIN kategorije k ON a.kategorija_id = k.id @@ -63,7 +63,7 @@ func (r *ArtikalRepo) Lista(ctx context.Context, filter db.ArtikalFilter) ([]mod err := redovi.Scan( &a.ID, &kategorijaID, &a.Naziv, &a.Opis, &a.Kolicina, &a.KolicinMin, &a.Lokacija, - &a.NabavnaCena, &a.ProdajnaCena, &a.Napomena, &a.DatumUnosa, + &a.ProdajnaCena, &a.Napomena, &a.DatumUnosa, &a.KategorijaNaziv, ) if err != nil { @@ -89,11 +89,11 @@ func (r *ArtikalRepo) DohvatiID(ctx context.Context, id int64) (*model.Artikal, err := r.db.QueryRowContext(ctx, ` SELECT id, kategorija_id, naziv, opis, kolicina, kolicina_min, - lokacija, nabavna_cena, prodajna_cena, napomena, datum_unosa + lokacija, prodajna_cena, napomena, datum_unosa FROM artikli WHERE id = ?`, id).Scan( &a.ID, &kategorijaID, &a.Naziv, &a.Opis, &a.Kolicina, &a.KolicinMin, &a.Lokacija, - &a.NabavnaCena, &a.ProdajnaCena, &a.Napomena, &a.DatumUnosa, + &a.ProdajnaCena, &a.Napomena, &a.DatumUnosa, ) if err != nil { return nil, fmt.Errorf("ntech: ArtikalRepo.DohvatiID: %w", err) @@ -111,10 +111,10 @@ func (r *ArtikalRepo) Kreiraj(ctx context.Context, a *model.Artikal) (int64, err rezultat, err := r.db.ExecContext(ctx, ` INSERT INTO artikli (kategorija_id, naziv, opis, kolicina, kolicina_min, lokacija, - nabavna_cena, prodajna_cena, napomena) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + prodajna_cena, napomena) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, a.KategorijaID, a.Naziv, a.Opis, a.Kolicina, a.KolicinMin, - a.Lokacija, a.NabavnaCena, a.ProdajnaCena, a.Napomena, + a.Lokacija, a.ProdajnaCena, a.Napomena, ) if err != nil { return 0, fmt.Errorf("ntech: ArtikalRepo.Kreiraj: %w", err) @@ -133,11 +133,11 @@ func (r *ArtikalRepo) Izmeni(ctx context.Context, a *model.Artikal) error { _, err := r.db.ExecContext(ctx, ` UPDATE artikli SET kategorija_id = ?, naziv = ?, opis = ?, kolicina = ?, - kolicina_min = ?, lokacija = ?, nabavna_cena = ?, + kolicina_min = ?, lokacija = ?, prodajna_cena = ?, napomena = ? WHERE id = ?`, a.KategorijaID, a.Naziv, a.Opis, a.Kolicina, - a.KolicinMin, a.Lokacija, a.NabavnaCena, + a.KolicinMin, a.Lokacija, a.ProdajnaCena, a.Napomena, a.ID, ) if err != nil { diff --git a/internal/handler/magacin_forma.go b/internal/handler/magacin_forma.go index 06928ee..0208682 100644 --- a/internal/handler/magacin_forma.go +++ b/internal/handler/magacin_forma.go @@ -230,14 +230,6 @@ func parseFormuArtikla(r *http.Request) (model.Artikal, string) { artikal.KolicinMin = v } - if c := r.FormValue("nabavna_cena"); c != "" { - v, err := strconv.ParseFloat(c, 64) - if err != nil || v < 0 { - return artikal, "Nabavna cena mora biti pozitivan broj." - } - artikal.NabavnaCena = v - } - if c := r.FormValue("prodajna_cena"); c != "" { v, err := strconv.ParseFloat(c, 64) if err != nil || v < 0 { diff --git a/internal/model/artikal.go b/internal/model/artikal.go index a4f67f5..b7f16f7 100644 --- a/internal/model/artikal.go +++ b/internal/model/artikal.go @@ -11,7 +11,6 @@ type Artikal struct { Kolicina int KolicinMin int Lokacija string - NabavnaCena float64 ProdajnaCena float64 Napomena string DatumUnosa time.Time @@ -28,5 +27,5 @@ type Kategorija struct { type ArtikalSaKategorijom struct { Artikal KategorijaNaziv string - KriticnaZaliha bool // true ako je kolicina <= kolicina_min + KriticnaZaliha bool } diff --git a/migrations/012_nabavke.sql b/migrations/012_nabavke.sql new file mode 100644 index 0000000..a05a79f --- /dev/null +++ b/migrations/012_nabavke.sql @@ -0,0 +1,46 @@ +-- uklanjamo nabavnu cenu iz artikala +-- SQLite ne podržava DROP COLUMN direktno pre verzije 3.35 +-- koristimo standardni pristup: nova tabela, kopiranje, brisanje stare +CREATE TABLE artikli_novi ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + kategorija_id INTEGER REFERENCES kategorije(id) ON DELETE SET NULL, + naziv TEXT NOT NULL, + opis TEXT, + kolicina INTEGER NOT NULL DEFAULT 0, + kolicina_min INTEGER NOT NULL DEFAULT 0, + lokacija TEXT, + prodajna_cena REAL NOT NULL DEFAULT 0, + napomena TEXT, + datum_unosa DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +INSERT INTO artikli_novi + (id, kategorija_id, naziv, opis, kolicina, kolicina_min, + lokacija, prodajna_cena, napomena, datum_unosa) +SELECT + id, kategorija_id, naziv, opis, kolicina, kolicina_min, + lokacija, prodajna_cena, napomena, datum_unosa +FROM artikli; + +DROP TABLE artikli; +ALTER TABLE artikli_novi RENAME TO artikli; + +-- tabela nabavki +CREATE TABLE IF NOT EXISTS nabavke ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + dobavljac_id INTEGER REFERENCES dobavljaci(id) ON DELETE SET NULL, + broj_nabavke TEXT NOT NULL UNIQUE, + napomena TEXT, + ukupno REAL NOT NULL DEFAULT 0, + datum DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- stavke nabavke +CREATE TABLE IF NOT EXISTS stavke_nabavke ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + nabavka_id INTEGER NOT NULL REFERENCES nabavke(id) ON DELETE CASCADE, + artikal_id INTEGER NOT NULL REFERENCES artikli(id) ON DELETE RESTRICT, + kolicina INTEGER NOT NULL DEFAULT 1, + cena_po_komadu REAL NOT NULL, + ukupno REAL NOT NULL +); diff --git a/web/templates/stranice/dashboard.html b/web/templates/stranice/dashboard.html index 58767b8..02d6bb0 100644 --- a/web/templates/stranice/dashboard.html +++ b/web/templates/stranice/dashboard.html @@ -3,7 +3,7 @@ {{define "naslov"}}Dashboard — NTech{{end}} {{define "sadrzaj"}} -
+
@@ -38,7 +38,7 @@
-
+
diff --git a/web/templates/stranice/magacin.html b/web/templates/stranice/magacin.html index 9313d4d..e7bd7aa 100644 --- a/web/templates/stranice/magacin.html +++ b/web/templates/stranice/magacin.html @@ -56,7 +56,6 @@ Naziv Kategorija Količina - Nabavna Prodajna Lokacija Akcije @@ -76,7 +75,6 @@ {{.Kolicina}} - {{printf "%.0f" .NabavnaCena}} din {{printf "%.0f" .ProdajnaCena}} din {{if .Lokacija}}{{.Lokacija}}{{else}}—{{end}} diff --git a/web/templates/stranice/magacin_forma.html b/web/templates/stranice/magacin_forma.html index 4e13208..b7c365c 100644 --- a/web/templates/stranice/magacin_forma.html +++ b/web/templates/stranice/magacin_forma.html @@ -68,16 +68,9 @@
- -
-
- - -
-
- - -
+
+ +