Files
GoNtech/web/templates/stranice/magacin_forma.html
T

212 lines
10 KiB
HTML

{{template "base" .}}
{{define "naslov"}}{{if .Izmena}}Izmeni artikal{{else}}Novi artikal{{end}} — NTech{{end}}
{{define "sadrzaj"}}
<div style="width:100%;">
<!-- nazad dugme -->
<a href="/magacin" class="nazad-link">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 18 9 12 15 6"/></svg>
Nazad na magacin
</a>
<div class="kartica animiraj">
<div style="margin-bottom:20px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);">
<span style="font-size:16px;font-weight:500;color:var(--tekst-glavni);">
{{if .Izmena}}Izmeni artikal{{else}}Novi artikal{{end}}
</span>
</div>
{{if .Greska}}
<div class="poruka-greska greska-animacija">{{.Greska}}</div>
{{end}}
<form method="POST" action="{{if .Izmena}}/magacin/izmeni/{{.Artikal.ID}}{{else}}/magacin/novi{{end}}">
<div class="kolona" style="gap:14px;">
<!-- šifra i barkod -->
<div class="forma-grid-2" style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
<div>
<label class="polje-labela">Šifra artikla</label>
<input type="text" name="sifra" id="sifra-input" value="{{.Artikal.Sifra}}"
placeholder="npr. KOMP-0001"
style="width:100%;font-family:monospace;">
<div style="font-size:11px;color:var(--tekst-slabi);margin-top:4px;">Ako ostaviš prazno, šifra se automatski dodeljuje.</div>
</div>
<div>
<label class="polje-labela">Barkod (EAN)</label>
<input type="text" name="barkod" value="{{.Artikal.Barkod}}"
placeholder="npr. 3830057592015"
style="width:100%;font-family:monospace;">
<div style="font-size:11px;color:var(--tekst-slabi);margin-top:4px;">Barkod sa pakovanja (opciono).</div>
</div>
</div>
<!-- naziv -->
<div>
<label class="polje-labela">
Naziv <span style="color:#dc2626;">*</span>
</label>
<input type="text" name="naziv" value="{{.Artikal.Naziv}}"
placeholder="npr. RAM DDR4 8GB Kingston"
style="width:100%;">
</div>
<!-- tip i jedinica mere -->
<div class="forma-grid-2" style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
<div>
<label class="polje-labela">Tip artikla</label>
<select name="tip" id="tip-artikla" style="width:100%;">
<option value="proizvod" {{if eq .Artikal.Tip "proizvod"}}selected{{end}}>Proizvod (prati lager)</option>
<option value="usluga" {{if eq .Artikal.Tip "usluga"}}selected{{end}}>Usluga</option>
<option value="trosak" {{if eq .Artikal.Tip "trosak"}}selected{{end}}>Trošak</option>
</select>
</div>
<div>
<label class="polje-labela">Jedinica mere</label>
{{$jm := .Artikal.JedinicaMere}}
<select name="jedinica_mere" style="width:100%;">
<option value="kom" {{if eq $jm "kom"}}selected{{end}}>kom</option>
<option value="sat" {{if eq $jm "sat"}}selected{{end}}>sat</option>
<option value="set" {{if eq $jm "set"}}selected{{end}}>set</option>
<option value="m" {{if eq $jm "m"}}selected{{end}}>m</option>
<option value="m2" {{if eq $jm "m2"}}selected{{end}}></option>
<option value="l" {{if eq $jm "l"}}selected{{end}}>l</option>
<option value="kg" {{if eq $jm "kg"}}selected{{end}}>kg</option>
<option value="pak" {{if eq $jm "pak"}}selected{{end}}>pak</option>
</select>
</div>
</div>
<!-- kategorija -->
<div>
<label class="polje-labela">Kategorija</label>
<select name="kategorija_id" style="width:100%;">
<option value="">— bez kategorije —</option>
{{range .Kategorije}}
<option value="{{.ID}}" {{if eq (printf "%d" .ID) $.KategorijaIDStr}}selected{{end}}>{{.Naziv}}</option>
{{end}}
</select>
</div>
<!-- opis -->
<div>
<label class="polje-labela">Opis</label>
<textarea name="opis" rows="2"
placeholder="Kratak opis artikla..."
style="width:100%;resize:vertical;">{{.Artikal.Opis}}</textarea>
</div>
<!-- količina i minimum (samo za proizvode) -->
<div class="forma-grid-2" data-lager style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
<div>
<label class="polje-labela">Količina na stanju</label>
<input type="number" name="kolicina" value="{{.Artikal.Kolicina}}" min="0" style="width:100%;">
</div>
<div>
<label class="polje-labela">Minimalna količina</label>
<input type="number" name="kolicina_min" value="{{.Artikal.KolicinMin}}" min="0" style="width:100%;">
</div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
<div>
<label class="polje-labela">Nabavna cena (din)</label>
<input type="number" name="nabavna_cena" value="{{.Artikal.NabavnaCena}}" min="0" step="0.01" style="width:100%;">
</div>
<div>
<label class="polje-labela">Prodajna cena (din)</label>
<input type="number" name="prodajna_cena" value="{{.Artikal.ProdajnaCena}}" min="0" step="0.01" style="width:100%;">
</div>
</div>
<!-- marža za kalkulaciju; prazno = nasleđuje maržu kategorije ili globalnu -->
<div>
<label class="polje-labela">Marža (%)</label>
<input type="number" name="marza" value="{{if .Artikal.Marza}}{{.Artikal.Marza}}{{end}}" min="0" step="0.01" style="width:100%;"
placeholder="prazno = po kategoriji / globalna">
</div>
<!-- lokacija (samo za proizvode) -->
<div data-lager>
<label class="polje-labela">Lokacija u magacinu</label>
<input type="text" name="lokacija" value="{{.Artikal.Lokacija}}"
placeholder="npr. Polica A3, Kutija 2..."
style="width:100%;">
</div>
<!-- napomena -->
<div>
<label class="polje-labela">Napomena</label>
<textarea name="napomena" rows="2"
placeholder="Interna napomena..."
style="width:100%;resize:vertical;">{{.Artikal.Napomena}}</textarea>
</div>
<!-- dugmad -->
<div style="display:flex;justify-content:flex-end;gap:10px;margin-top:6px;">
<a href="/magacin" class="btn-sekundarno">Odustani</a>
<button type="submit" class="btn-primarno">
{{if .Izmena}}Sačuvaj izmene{{else}}Dodaj artikal{{end}}
</button>
</div>
</div>
</form>
</div>
</div>
<script>
(function () {
// sakrivanje polja lagera za usluge i troškove
var tip = document.getElementById('tip-artikla');
var lager = document.querySelectorAll('[data-lager]');
function azurirajLager() {
var prati = tip.value === 'proizvod';
lager.forEach(function (el) { el.style.display = prati ? '' : 'none'; });
}
tip.addEventListener('change', azurirajLager);
azurirajLager();
// auto-predlog šifre pri promeni kategorije (samo za nov artikal i ako šifra nije ručno menjana)
var kat = document.querySelector('select[name="kategorija_id"]');
var sifra = document.getElementById('sifra-input');
var jeIzmena = {{if .Izmena}}true{{else}}false{{end}};
if (sifra) {
sifra.addEventListener('input', function () { sifra.dataset.rucno = '1'; });
}
if (kat && sifra && !jeIzmena) {
kat.addEventListener('change', function () {
if (sifra.dataset.rucno === '1' && sifra.value !== '') return;
fetch('/magacin/sledeca-sifra?kategorija=' + encodeURIComponent(kat.value))
.then(function (r) { return r.ok ? r.text() : ''; })
.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);
}
})();
</script>
{{end}}