From 91998a7736b7a9efaa8e54068b4cff0d5f43ff2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Sun, 21 Jun 2026 00:01:09 +0200 Subject: [PATCH] =?UTF-8?q?Nabavka:=20predlog=20cene=20pri=20izboru=20arti?= =?UTF-8?q?kla;=20forma=20artikla:=20dvosmerno=20mar=C5=BEa=E2=86=94prodaj?= =?UTF-8?q?na=20cena?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/nabavka.go | 4 +++- web/static/js/ntech.js | 2 ++ web/templates/stranice/magacin_forma.html | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/internal/handler/nabavka.go b/internal/handler/nabavka.go index 9378571..033e076 100644 --- a/internal/handler/nabavka.go +++ b/internal/handler/nabavka.go @@ -51,6 +51,7 @@ func artikalUJSON(artikli []model.ArtikalSaKategorijom) template.JS { ID int64 `json:"id"` Naziv string `json:"naziv"` PdvStopa float64 `json:"pdv_stopa"` + NabavnaCena float64 `json:"nabavna_cena"` // poslednja nabavna cena — predlog za Cena/kom Marza *float64 `json:"marza"` // marža artikla; null = nije postavljeno KategorijaMarza *float64 `json:"kategorija_marza"` // marža kategorije; fallback ako artikal nema } @@ -58,7 +59,8 @@ func artikalUJSON(artikli []model.ArtikalSaKategorijom) template.JS { for _, a := range artikli { lista = append(lista, stavka{ ID: a.ID, Naziv: a.Naziv, PdvStopa: a.PdvStopa, - Marza: a.Marza, KategorijaMarza: a.KategorijaMarza, + NabavnaCena: a.NabavnaCena, + Marza: a.Marza, KategorijaMarza: a.KategorijaMarza, }) } b, _ := json.Marshal(lista) diff --git a/web/static/js/ntech.js b/web/static/js/ntech.js index 571c5d6..0eb35a3 100644 --- a/web/static/js/ntech.js +++ b/web/static/js/ntech.js @@ -240,11 +240,13 @@ document.addEventListener('alpine:init', () => { izaberiArtikal(s) { const a = this.artikliOpcije.find(x => String(x.id) === String(s.artikal_id)) if (a) { + if (a.nabavna_cena != null) s.cena = a.nabavna_cena if (a.marza != null) s.marza = a.marza else if (a.kategorija_marza != null) s.marza = a.kategorija_marza else s.marza = this.marzaDefault } this.izracunajProdajnu(s) + this.preracunajSve() }, // ukupan zavisni trošak nabavke ukupanTrosak() { diff --git a/web/templates/stranice/magacin_forma.html b/web/templates/stranice/magacin_forma.html index a1e3f9d..5a9f86c 100644 --- a/web/templates/stranice/magacin_forma.html +++ b/web/templates/stranice/magacin_forma.html @@ -184,6 +184,28 @@ .then(function (t) { if (t) sifra.value = t; }); }); } + + // dvosmerno povezivanje: nabavna + marža → prodajna, i prodajna → marža + var nabavna = document.querySelector('[name="nabavna_cena"]'); + var prodajna = document.querySelector('[name="prodajna_cena"]'); + var marza = document.querySelector('[name="marza"]'); + function broj(el) { return parseFloat(el.value) || 0; } + // postavljanje .value programski ne okida 'input', pa nema beskonačne petlje + function izProdajne() { + var n = broj(nabavna); + if (n <= 0) return; + prodajna.value = (n * (1 + broj(marza) / 100)).toFixed(2); + } + function izMarze() { + var n = broj(nabavna), p = broj(prodajna); + if (n <= 0) { marza.value = ''; return; } + marza.value = ((p / n - 1) * 100).toFixed(2); + } + if (nabavna && prodajna && marza) { + marza.addEventListener('input', izProdajne); + nabavna.addEventListener('input', izProdajne); + prodajna.addEventListener('input', izMarze); + } })(); {{end}}