290e5c085a
Dodata kartica „Pravni i poreski status" na Podešavanja → Opšte: pravni oblik, režim rada, PDV obveznik, fiskalizacija. Čuva se u postojećoj key-value tabeli podesavanja (bez migracije). Fiskalizacija se zasivi i forsira na „Ne" u režimu „samo evidencija".
260 lines
18 KiB
HTML
260 lines
18 KiB
HTML
{{template "base" .}}
|
|
|
|
{{define "naslov"}}Podešavanja — Opšte — NTech{{end}}
|
|
|
|
{{define "sadrzaj"}}
|
|
<div class="stranica-stack" style="width:100%;max-width:100%;">
|
|
|
|
{{if .Sacuvano}}
|
|
<div class="poruka-uspeh">Podešavanja su uspešno sačuvana.</div>
|
|
{{end}}
|
|
|
|
<!-- upload loga — posebna forma jer je multipart, mora biti van glavne forme -->
|
|
<form method="POST" action="/podesavanja/logo" enctype="multipart/form-data">
|
|
<div class="kartica animiraj" style="margin-bottom:16px;">
|
|
<div style="display:flex;align-items:center;gap:10px;margin-bottom:16px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--sb-akcent)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>
|
|
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Logo firme</span>
|
|
</div>
|
|
{{if .LogoPutanja}}
|
|
<div style="margin-bottom:12px;">
|
|
<img src="{{.LogoPutanja}}" alt="Trenutni logo"
|
|
style="max-height:60px;max-width:200px;object-fit:contain;border:0.5px solid var(--ivica);border-radius:8px;padding:6px;background:var(--kartica);">
|
|
</div>
|
|
{{end}}
|
|
<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;">
|
|
<input type="file" id="logo-file" name="logo" accept=".png,.jpg,.jpeg,.svg"
|
|
style="display:none;"
|
|
onchange="var s=document.getElementById('logo-ime');s.textContent=this.files[0]?this.files[0].name:'Nijedan fajl nije izabran'">
|
|
<label for="logo-file"
|
|
style="padding:8px 16px;background:var(--sb-akcent);color:#fff;border:none;border-radius:8px;font-size:13px;cursor:pointer;white-space:nowrap;font-weight:500;">
|
|
Izaberi fajl
|
|
</label>
|
|
<span id="logo-ime" class="pomocni-tekst">Nijedan fajl nije izabran</span>
|
|
<button type="submit"
|
|
style="padding:8px 16px;background:var(--sb-aktivan);color:var(--tekst-jak);border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;cursor:pointer;white-space:nowrap;transition:opacity 0.2s;"
|
|
onmouseover="this.style.opacity='0.8'" onmouseout="this.style.opacity='1'">
|
|
Otpremi logo
|
|
</button>
|
|
</div>
|
|
<div class="pomocni-tekst" style="font-size:12px;margin-top:6px;">PNG, JPG ili SVG — maksimum 2 MB</div>
|
|
</div>
|
|
</form>
|
|
|
|
<!-- firma: naziv, podnazlov, adresa, telefon, PIB, logo zona -->
|
|
<form method="POST" action="/podesavanja/sacuvaj">
|
|
<input type="hidden" name="_next" value="/admin/podesavanja/opste">
|
|
<div class="kartica animiraj" style="margin-bottom:16px;">
|
|
<div style="display:flex;align-items:center;gap:10px;margin-bottom:16px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--sb-akcent)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
|
|
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Firma</span>
|
|
</div>
|
|
|
|
<div class="kolona" style="gap:14px;">
|
|
<div>
|
|
<label class="polje-labela">Naziv firme</label>
|
|
<input type="text" name="naziv_firme" value="{{.NazivFirme}}"
|
|
style="width:100%;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;"
|
|
placeholder="npr. NTech">
|
|
</div>
|
|
|
|
<div>
|
|
<label class="polje-labela">Podnazlov</label>
|
|
<input type="text" name="podnazlov" value="{{.Podnazlov}}"
|
|
style="width:100%;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;"
|
|
placeholder="npr. Servis računara">
|
|
</div>
|
|
|
|
<div>
|
|
<label class="polje-labela">Adresa</label>
|
|
<input type="text" name="adresa" value="{{.Adresa}}"
|
|
style="width:100%;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;"
|
|
placeholder="npr. Ulica i broj, Grad">
|
|
</div>
|
|
|
|
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
|
|
<div>
|
|
<label class="polje-labela">Telefon</label>
|
|
<input type="text" name="telefon" value="{{.Telefon}}"
|
|
style="width:100%;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;"
|
|
placeholder="npr. +381 11 123 4567">
|
|
</div>
|
|
<div>
|
|
<label class="polje-labela">PIB</label>
|
|
<input type="text" name="pib" value="{{.PIB}}"
|
|
style="width:100%;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;"
|
|
placeholder="npr. 123456789">
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:8px;">Logo zona</label>
|
|
<div style="display:flex;gap:10px;flex-wrap:wrap;">
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if or (eq .LogoTip "sa_nazivom") (eq .LogoTip "tekst") (eq .LogoTip "ikonica") (not .LogoTip)}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="logo_tip" value="sa_nazivom" {{if or (eq .LogoTip "sa_nazivom") (eq .LogoTip "tekst") (eq .LogoTip "ikonica") (not .LogoTip)}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Sa nazivom</span>
|
|
</label>
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .LogoTip "bez_naziva"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="logo_tip" value="bez_naziva" {{if eq .LogoTip "bez_naziva"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Bez naziva</span>
|
|
</label>
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;flex:1;{{if eq .LogoTip "slika"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}{{if not .LogoPutanja}}opacity:0.45;cursor:not-allowed;{{else}}cursor:pointer;{{end}}">
|
|
<input type="radio" name="logo_tip" value="slika" {{if eq .LogoTip "slika"}}checked{{end}} {{if not .LogoPutanja}}disabled{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Sa logom</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div style="display:flex;justify-content:flex-end;margin-top:20px;">
|
|
<button type="submit"
|
|
style="background:var(--sb-akcent);color:#fff;border:none;padding:10px 24px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:opacity 0.2s;"
|
|
onmouseover="this.style.opacity='0.85'" onmouseout="this.style.opacity='1'">
|
|
Sačuvaj opšte
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
|
|
<!-- profil firme: pravni/poreski status (Faza 0) — određuje koji se zakonski moduli pale -->
|
|
<form method="POST" action="/podesavanja/sacuvaj">
|
|
<input type="hidden" name="_next" value="/admin/podesavanja/opste">
|
|
<div class="kartica animiraj" style="margin-bottom:16px;">
|
|
<div style="display:flex;align-items:center;gap:10px;margin-bottom:16px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--sb-akcent)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg>
|
|
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Pravni i poreski status</span>
|
|
</div>
|
|
|
|
<div class="kolona" style="gap:18px;">
|
|
|
|
<!-- pravni oblik -->
|
|
<div>
|
|
<label class="polje-labela">Pravni oblik</label>
|
|
<div style="display:flex;gap:10px;flex-wrap:wrap;">
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaPravniOblik "pausalac"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_pravni_oblik" value="pausalac" {{if eq .FirmaPravniOblik "pausalac"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Paušalac</span>
|
|
</label>
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaPravniOblik "preduzetnik_knjige"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_pravni_oblik" value="preduzetnik_knjige" {{if eq .FirmaPravniOblik "preduzetnik_knjige"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Preduzetnik (knjige)</span>
|
|
</label>
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaPravniOblik "doo"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_pravni_oblik" value="doo" {{if eq .FirmaPravniOblik "doo"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">DOO</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- režim rada -->
|
|
<div>
|
|
<label class="polje-labela">Režim rada</label>
|
|
<div style="display:flex;gap:10px;flex-wrap:wrap;">
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaRezim "pun"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_rezim" value="pun" {{if eq .FirmaRezim "pun"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Pun (vodi poslovne knjige)</span>
|
|
</label>
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaRezim "samo_evidencija"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_rezim" value="samo_evidencija" {{if eq .FirmaRezim "samo_evidencija"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Samo evidencija</span>
|
|
</label>
|
|
</div>
|
|
<div class="pomocni-tekst" style="font-size:12px;margin-top:6px;">„Samo evidencija" gasi ceo zakonski sloj — program vodi servis i zalihe, ali ne izdaje fiskalne ni poreske dokumente.</div>
|
|
</div>
|
|
|
|
<!-- PDV obveznik -->
|
|
<div>
|
|
<label class="polje-labela">U sistemu PDV-a</label>
|
|
<div style="display:flex;gap:10px;flex-wrap:wrap;">
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaPdvObveznik "da"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_pdv_obveznik" value="da" {{if eq .FirmaPdvObveznik "da"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Da</span>
|
|
</label>
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaPdvObveznik "ne"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_pdv_obveznik" value="ne" {{if eq .FirmaPdvObveznik "ne"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Ne</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- fiskalizacija — zasivljena i forsirana na „Ne" kad je režim „samo evidencija" (vidi skriptu na dnu) -->
|
|
<div id="fiskalizacija-grupa">
|
|
<label class="polje-labela">Izdaje fiskalne račune (promet građanima)</label>
|
|
<div style="display:flex;gap:10px;flex-wrap:wrap;">
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaFiskalizacija "da"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_fiskalizacija" value="da" {{if eq .FirmaFiskalizacija "da"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Da</span>
|
|
</label>
|
|
<label style="display:flex;align-items:center;gap:8px;padding:10px 14px;border:0.5px solid var(--ivica);border-radius:8px;cursor:pointer;flex:1;{{if eq .FirmaFiskalizacija "ne"}}border-color:var(--sb-akcent);background:var(--pozadina);{{end}}">
|
|
<input type="radio" name="firma_fiskalizacija" value="ne" {{if eq .FirmaFiskalizacija "ne"}}checked{{end}} style="accent-color:var(--sb-akcent);">
|
|
<span style="font-size:13px;color:var(--tekst-glavni);">Ne</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div style="display:flex;justify-content:flex-end;margin-top:20px;">
|
|
<button type="submit"
|
|
style="background:var(--sb-akcent);color:#fff;border:none;padding:10px 24px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:opacity 0.2s;"
|
|
onmouseover="this.style.opacity='0.85'" onmouseout="this.style.opacity='1'">
|
|
Sačuvaj status
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
|
|
</div>
|
|
|
|
{{if .LogoGreska}}
|
|
<div id="toast-logo" class="toast toast-greska">
|
|
<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" style="flex-shrink:0;"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
|
|
{{.LogoGreska}}
|
|
</div>
|
|
<script>
|
|
(function() {
|
|
var t = document.getElementById('toast-logo');
|
|
if (!t) return;
|
|
setTimeout(function() {
|
|
t.classList.add('nestaje');
|
|
setTimeout(function() { t.remove(); }, 300);
|
|
}, 4000);
|
|
})();
|
|
</script>
|
|
{{end}}
|
|
|
|
<script>
|
|
// Fiskalizacija ima smisla samo u punom režimu. Kad je „samo evidencija", grupa se
|
|
// zasivi i forsira na „Ne". Ne koristimo disabled (jer disabled polje se ne šalje u
|
|
// POST pa bi stara vrednost ostala u bazi) — umesto toga pointer-events:none, a radio
|
|
// „Ne" ostaje aktivan i čekiran, pa se uredno sačuva „ne".
|
|
(function() {
|
|
var rezim = document.querySelectorAll('input[name="firma_rezim"]');
|
|
var grupa = document.getElementById('fiskalizacija-grupa');
|
|
var fisk = document.querySelectorAll('input[name="firma_fiskalizacija"]');
|
|
if (!grupa || !rezim.length) return;
|
|
|
|
function azuriraj() {
|
|
var izabran = document.querySelector('input[name="firma_rezim"]:checked');
|
|
var samoEvidencija = izabran && izabran.value === 'samo_evidencija';
|
|
grupa.style.opacity = samoEvidencija ? '0.45' : '';
|
|
grupa.style.pointerEvents = samoEvidencija ? 'none' : '';
|
|
if (samoEvidencija) {
|
|
fisk.forEach(function(r) {
|
|
r.checked = (r.value === 'ne');
|
|
var lab = r.closest('label');
|
|
if (lab) {
|
|
lab.style.borderColor = r.checked ? 'var(--sb-akcent)' : 'var(--ivica)';
|
|
lab.style.background = r.checked ? 'var(--pozadina)' : 'transparent';
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
rezim.forEach(function(r) { r.addEventListener('change', azuriraj); });
|
|
azuriraj();
|
|
})();
|
|
</script>
|
|
{{end}}
|