Merge feature/knjigovodstvo: knjigovodstveni modul
Profil firme i moduli, PDV evidencija (KIR/KPR) sa auto-punjenjem, PDV obračun + PP-PDV, uvoz robe (006/106), šifarnik PDV stopa, kalkulacija prodajne cene (marža po kategoriji/artiklu, zavisni troškovi, dvosmerni izračun) i nivelacija uz trag. # Conflicts: # web/templates/stranice/magacin.html # web/templates/stranice/nabavka_forma.html
This commit is contained in:
@@ -59,6 +59,20 @@
|
||||
style="width:100%;">
|
||||
</div>
|
||||
|
||||
<!-- PIB i mesto (za KPR / POPDV) -->
|
||||
<div class="forma-grid-2">
|
||||
<div>
|
||||
<label class="polje-labela">PIB</label>
|
||||
<input type="text" name="pib" value="{{.Dobavljac.PIB}}"
|
||||
placeholder="npr. 123456789" style="width:100%;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Mesto / grad</label>
|
||||
<input type="text" name="mesto" value="{{.Dobavljac.Mesto}}"
|
||||
placeholder="npr. Beograd" style="width:100%;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- napomena -->
|
||||
<div>
|
||||
<label class="polje-labela">Napomena</label>
|
||||
|
||||
@@ -52,6 +52,11 @@
|
||||
<input type="text" name="opis" placeholder="Kratak opis kategorije..."
|
||||
style="width:100%;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Marža (%)</label>
|
||||
<input type="number" name="marza" min="0" step="0.01"
|
||||
placeholder="prazno = globalna marža" style="width:100%;">
|
||||
</div>
|
||||
<div style="display:flex;justify-content:flex-end;">
|
||||
<button type="submit"
|
||||
style="padding:8px 20px;background:var(--sb-akcent);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;">
|
||||
@@ -76,6 +81,38 @@
|
||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-top:2px;">{{.Opis}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{if .Marza}}
|
||||
<span style="font-size:12px;color:var(--tekst-sporedni);white-space:nowrap;">marža {{.Marza}}%</span>
|
||||
{{end}}
|
||||
{{if index $.Dozvole "kategorija.izmeni"}}
|
||||
<button type="button" class="btn-primarno-malo" onclick="this.nextElementSibling.showModal()">Izmeni</button>
|
||||
{{/* nativni modal — isti obrazac kao u magacinu (top layer, centriran) */}}
|
||||
<dialog id="kat-{{.ID}}" class="premesti-modal" onclick="if(event.target===this)this.close()">
|
||||
<form method="dialog" class="premesti-zaglavlje">
|
||||
<h3>Izmeni kategoriju</h3>
|
||||
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">×</button>
|
||||
</form>
|
||||
<form method="POST" action="/magacin/kategorije/izmeni/{{.ID}}" style="display:flex;flex-direction:column;gap:12px;padding:16px;">
|
||||
<div>
|
||||
<label class="polje-labela">Naziv <span style="color:#dc2626;">*</span></label>
|
||||
<input type="text" name="naziv" value="{{.Naziv}}" required
|
||||
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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Opis</label>
|
||||
<input type="text" name="opis" value="{{.Opis}}"
|
||||
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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Marža (%)</label>
|
||||
<input type="number" name="marza" min="0" step="0.01" value="{{if .Marza}}{{.Marza}}{{end}}"
|
||||
placeholder="prazno = globalna marža"
|
||||
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;">
|
||||
</div>
|
||||
<button type="submit" class="btn-primarno" style="align-self:flex-end;">Sačuvaj</button>
|
||||
</form>
|
||||
</dialog>
|
||||
{{end}}
|
||||
{{if index $.Dozvole "kategorija.obrisi"}}
|
||||
<a href="/magacin/kategorije/obrisi/{{.ID}}" class="btn-obrisi-malo"
|
||||
data-potvrda="Da li ste sigurni da želite da obrišete ovu kategoriju?">
|
||||
|
||||
@@ -117,6 +117,11 @@
|
||||
<input type="text" name="email" value="{{.Klijent.Email}}"
|
||||
placeholder="npr. marko@example.com">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Mesto / grad</label>
|
||||
<input type="text" name="mesto" value="{{.Klijent.Mesto}}"
|
||||
placeholder="npr. Niš">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -83,6 +83,7 @@
|
||||
<a href="/magacin/izmeni/{{.ID}}" class="btn-primarno-malo">
|
||||
Izmeni
|
||||
</a>
|
||||
{{template "promeniCenuMeni" (dict "ID" .ID "Cena" .ProdajnaCena)}}
|
||||
{{end}}
|
||||
{{if index $.Dozvole "artikal.premesti"}}{{if $.Kategorije}}
|
||||
{{template "premestiMeni" (dict "ID" .ID "Kategorije" $.Kategorije "Prefiks" "tab")}}
|
||||
@@ -112,7 +113,7 @@
|
||||
<div class="magacin-kartice">
|
||||
{{range .Artikli}}
|
||||
<div class="kartica magacin-kartica animiraj">
|
||||
<div class="red-izmedju" style="align-items:flex-start;gap:12px;margin-bottom:10px;">
|
||||
<div class="red-izmedju" style="align-items:flex-start;gap:12px;margin-bottom:10px;flex-wrap:wrap;">
|
||||
<div>
|
||||
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">{{.Naziv}}</div>
|
||||
{{if .KategorijaNaziv}}
|
||||
@@ -122,6 +123,7 @@
|
||||
<div style="display:flex;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;">
|
||||
{{if index $.Dozvole "artikal.izmeni"}}
|
||||
<a href="/magacin/izmeni/{{.ID}}" class="btn-primarno-malo">Izmeni</a>
|
||||
{{template "promeniCenuMeni" (dict "ID" .ID "Cena" .ProdajnaCena)}}
|
||||
{{end}}
|
||||
{{if index $.Dozvole "artikal.premesti"}}{{if $.Kategorije}}
|
||||
{{template "premestiMeni" (dict "ID" .ID "Kategorije" $.Kategorije "Prefiks" "kart")}}
|
||||
@@ -179,3 +181,29 @@
|
||||
</form>
|
||||
</dialog>
|
||||
{{end}}
|
||||
|
||||
{{define "promeniCenuMeni"}}
|
||||
<button type="button" class="btn-primarno-malo" style="align-self:center;"
|
||||
onclick="this.nextElementSibling.showModal()">Promeni cenu</button>
|
||||
{{/* nativni modal — isti obrazac kao premesti (top layer, centriran) */}}
|
||||
<dialog id="cena-{{.ID}}" class="premesti-modal" onclick="if(event.target===this)this.close()">
|
||||
<form method="dialog" class="premesti-zaglavlje">
|
||||
<h3>Promeni prodajnu cenu</h3>
|
||||
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">×</button>
|
||||
</form>
|
||||
<form method="POST" action="/magacin/promeni-cenu/{{.ID}}" style="display:flex;flex-direction:column;gap:12px;padding:16px;">
|
||||
<div style="font-size:13px;color:var(--tekst-sporedni);">Trenutna cena: <strong>{{printf "%.0f" .Cena}} din</strong></div>
|
||||
<div>
|
||||
<label class="polje-labela">Nova cena (din)</label>
|
||||
<input type="number" name="nova_cena" min="0" step="0.01" value="{{printf "%.2f" .Cena}}" required
|
||||
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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Razlog (opciono)</label>
|
||||
<input type="text" name="razlog" placeholder="npr. promena nabavne cene"
|
||||
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;">
|
||||
</div>
|
||||
<button type="submit" class="btn-primarno" style="align-self:flex-end;">Sačuvaj cenu</button>
|
||||
</form>
|
||||
</dialog>
|
||||
{{end}}
|
||||
|
||||
@@ -71,6 +71,13 @@
|
||||
<input type="number" name="prodajna_cena" value="{{.Artikal.ProdajnaCena}}" min="0" step="0.01" style="width:100%;">
|
||||
</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 -->
|
||||
<div>
|
||||
<label class="polje-labela">Lokacija u magacinu</label>
|
||||
|
||||
@@ -122,6 +122,30 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- zavisni troškovi -->
|
||||
{{if .Troskovi}}
|
||||
<div class="kartica detalji-kartica animiraj" style="padding:0;overflow:hidden;">
|
||||
<div style="padding:14px 16px;border-bottom:0.5px solid var(--ivica);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;">
|
||||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Zavisni troškovi</span>
|
||||
<span class="pomocni-tekst">
|
||||
Raspodela: {{if eq .Nabavka.MetodRaspodele "kolicina"}}po količini{{else}}po vrednosti stavke{{end}}
|
||||
</span>
|
||||
</div>
|
||||
<div style="padding:8px 16px;">
|
||||
{{range .Troskovi}}
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:0.5px solid var(--ivica);">
|
||||
<span style="font-size:14px;color:var(--tekst-glavni);">{{.Naziv}}</span>
|
||||
<span style="font-size:14px;color:var(--tekst-sporedni);">{{printf "%.2f" .Iznos}} din</span>
|
||||
</div>
|
||||
{{end}}
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;padding:10px 0;">
|
||||
<span style="font-size:13px;font-weight:500;color:var(--tekst-sporedni);">Ukupno troškovi:</span>
|
||||
<span style="font-size:15px;font-weight:600;color:var(--tekst-glavni);">{{printf "%.2f" .UkupanTrosak}} din</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<!-- zona za brisanje -->
|
||||
<div class="kartica detalji-kartica animiraj" style="border-color:#dc262633;">
|
||||
<div style="display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;">
|
||||
|
||||
@@ -8,13 +8,15 @@
|
||||
.forma-kartica:nth-child(1) { animation-delay: 0.04s; }
|
||||
.forma-kartica:nth-child(2) { animation-delay: 0.12s; }
|
||||
.modal-sadrzaj { animation: modalIn 0.25s ease forwards; }
|
||||
/* centriranje preko klase (ne inline) — x-show menja inline display, pa bi obrisao flex i modal bi pao u ćošak */
|
||||
.modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 50; display: flex; align-items: center; justify-content: center; padding: 16px; }
|
||||
</style>
|
||||
{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
|
||||
<!-- lista artikala kao JSON — bezbedno serijalizovana na serveru -->
|
||||
<script>var _ntechArtikli = {{.ArtikliJSON}};</script>
|
||||
<script>var _ntechArtikli = {{.ArtikliJSON}}; var _ntechMarza = {{.Marza}}; var _ntechPdvObveznik = {{.PdvObveznik}};</script>
|
||||
|
||||
<div style="width:100%;" x-data="nabavkaForma">
|
||||
|
||||
@@ -37,8 +39,15 @@
|
||||
</div>
|
||||
<div class="kolona" style="gap:14px;">
|
||||
<div>
|
||||
<label class="polje-labela">Dobavljač</label>
|
||||
<select name="dobavljac_id" style="width:100%;">
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;">
|
||||
<label class="polje-labela">Dobavljač</label>
|
||||
<button type="button" @click="otvoriModalDobavljac()"
|
||||
style="padding:6px 14px;background:var(--kartica);color:var(--tekst-sporedni);border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;cursor:pointer;margin-bottom:6px;transition:background 0.2s;"
|
||||
onmouseover="this.style.background='var(--pozadina)'" onmouseout="this.style.background='var(--kartica)'">
|
||||
+ Novi dobavljač
|
||||
</button>
|
||||
</div>
|
||||
<select name="dobavljac_id" x-ref="selDobavljac" style="width:100%;">
|
||||
<option value="">— bez dobavljača —</option>
|
||||
{{range .Dobavljaci}}
|
||||
<option value="{{.ID}}">{{.Naziv}}</option>
|
||||
@@ -78,6 +87,8 @@
|
||||
<th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);">Artikal</th>
|
||||
<th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:90px;">Količina</th>
|
||||
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Cena/kom (din)</th>
|
||||
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:120px;">Marža %</th>
|
||||
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Prodajna/kom (din)</th>
|
||||
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:110px;">Ukupno</th>
|
||||
<th style="width:40px;"></th>
|
||||
</tr>
|
||||
@@ -87,7 +98,7 @@
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:8px 10px;">
|
||||
<select :name="'artikal_id[]'" x-model="stavka.artikal_id"
|
||||
:disabled="isMobile" style="width:100%;">
|
||||
@change="izaberiArtikal(stavka)" :disabled="isMobile" style="width:100%;">
|
||||
<option value="">— odaberi artikal —</option>
|
||||
<template x-for="a in artikliOpcije" :key="a.id">
|
||||
<option :value="a.id" x-text="a.naziv"></option>
|
||||
@@ -96,10 +107,22 @@
|
||||
</td>
|
||||
<td style="padding:8px 10px;">
|
||||
<input type="number" :name="'kolicina[]'" x-model="stavka.kolicina"
|
||||
@input="preracunajSve()"
|
||||
min="1" :disabled="isMobile" style="width:100%;text-align:center;">
|
||||
</td>
|
||||
<td style="padding:8px 10px;">
|
||||
<input type="number" :name="'cena_po_komadu[]'" x-model="stavka.cena"
|
||||
@input="preracunajSve()"
|
||||
min="0" step="0.01" :disabled="isMobile" style="width:100%;text-align:right;">
|
||||
</td>
|
||||
<td style="padding:8px 10px;">
|
||||
<input type="number" :name="'marza[]'" x-model="stavka.marza"
|
||||
@input="izracunajProdajnu(stavka)"
|
||||
min="0" step="0.01" :disabled="isMobile" style="width:100%;text-align:right;">
|
||||
</td>
|
||||
<td style="padding:8px 10px;">
|
||||
<input type="number" :name="'prodajna[]'" x-model="stavka.prodajna"
|
||||
@input="izracunajMarzu(stavka)"
|
||||
min="0" step="0.01" :disabled="isMobile" style="width:100%;text-align:right;">
|
||||
</td>
|
||||
<td style="padding:8px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
|
||||
@@ -118,7 +141,7 @@
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="border-top:0.5px solid var(--ivica);">
|
||||
<td colspan="3" style="padding:10px 10px;text-align:right;font-size:13px;color:var(--tekst-sporedni);font-weight:500;">Ukupno:</td>
|
||||
<td colspan="5" style="padding:10px 10px;text-align:right;font-size:13px;color:var(--tekst-sporedni);font-weight:500;">Ukupno:</td>
|
||||
<td style="padding:10px 10px;text-align:right;font-size:15px;font-weight:600;color:var(--tekst-glavni);">
|
||||
<span x-text="ukupnoSvega() + ' din'"></span>
|
||||
</td>
|
||||
@@ -146,7 +169,7 @@
|
||||
<div>
|
||||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Artikal</label>
|
||||
<select :name="'artikal_id[]'" x-model="stavka.artikal_id"
|
||||
:disabled="!isMobile" style="width:100%;">
|
||||
@change="izaberiArtikal(stavka)" :disabled="!isMobile" style="width:100%;">
|
||||
<option value="">— odaberi artikal —</option>
|
||||
<template x-for="a in artikliOpcije" :key="a.id">
|
||||
<option :value="a.id" x-text="a.naziv"></option>
|
||||
@@ -156,11 +179,21 @@
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;">
|
||||
<div>
|
||||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Količina</label>
|
||||
<input type="number" :name="'kolicina[]'" x-model="stavka.kolicina" min="1" :disabled="!isMobile" style="width:100%;">
|
||||
<input type="number" :name="'kolicina[]'" x-model="stavka.kolicina" @input="preracunajSve()" min="1" :disabled="!isMobile" style="width:100%;">
|
||||
</div>
|
||||
<div>
|
||||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Cena/kom (din)</label>
|
||||
<input type="number" :name="'cena_po_komadu[]'" x-model="stavka.cena" min="0" step="0.01" :disabled="!isMobile" style="width:100%;">
|
||||
<input type="number" :name="'cena_po_komadu[]'" x-model="stavka.cena" @input="preracunajSve()" min="0" step="0.01" :disabled="!isMobile" style="width:100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;">
|
||||
<div>
|
||||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Marža %</label>
|
||||
<input type="number" :name="'marza[]'" x-model="stavka.marza" @input="izracunajProdajnu(stavka)" min="0" step="0.01" :disabled="!isMobile" style="width:100%;">
|
||||
</div>
|
||||
<div>
|
||||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Prodajna/kom (din)</label>
|
||||
<input type="number" :name="'prodajna[]'" x-model="stavka.prodajna" @input="izracunajMarzu(stavka)" min="0" step="0.01" :disabled="!isMobile" style="width:100%;">
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
|
||||
@@ -175,6 +208,50 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- zavisni troškovi -->
|
||||
<div class="kartica forma-kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;">
|
||||
<span style="font-size:16px;font-weight:500;color:var(--tekst-glavni);">Zavisni troškovi</span>
|
||||
<button type="button" @click="dodajTrosak()" class="btn-primarno" style="font-size:13px;padding:6px 14px;">
|
||||
+ Dodaj trošak
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<template x-if="troskovi.length > 0">
|
||||
<div class="kolona" style="gap:10px;">
|
||||
<!-- metod raspodele -->
|
||||
<div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">
|
||||
<label class="polje-labela" style="margin:0;">Raspodela na stavke:</label>
|
||||
<select name="metod_raspodele" x-model="metodRaspodele" @change="preracunajSve()" style="max-width:240px;">
|
||||
<option value="vrednost">po vrednosti stavke</option>
|
||||
<option value="kolicina">po količini</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- redovi troškova -->
|
||||
<template x-for="(t, i) in troskovi" :key="i">
|
||||
<div style="display:flex;gap:8px;align-items:center;">
|
||||
<input type="text" :name="'trosak_naziv[]'" x-model="t.naziv"
|
||||
placeholder="npr. Prevoz, Carina, Špedicija" style="flex:1;">
|
||||
<input type="number" :name="'trosak_iznos[]'" x-model="t.iznos"
|
||||
@input="preracunajSve()" min="0" step="0.01"
|
||||
placeholder="iznos (din)" style="width:140px;text-align:right;">
|
||||
<button type="button" @click="ukloniTrosak(i)"
|
||||
style="background:none;border:none;cursor:pointer;color:#dc2626;font-size:18px;line-height:1;padding:2px 6px;border-radius:4px;"
|
||||
title="Ukloni trošak">×</button>
|
||||
</div>
|
||||
</template>
|
||||
<div style="text-align:right;font-size:13px;color:var(--tekst-sporedni);">
|
||||
Ukupno troškovi: <strong x-text="ukupanTrosak().toFixed(2) + ' din'"></strong>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template x-if="troskovi.length === 0">
|
||||
<div style="font-size:13px;color:var(--tekst-sporedni);">
|
||||
Nema zavisnih troškova. Dodaj trošak (prevoz, carina…) — raspodeliće se na stavke i ući u kalkulativnu nabavnu cenu.
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<!-- dugmad forme -->
|
||||
<div style="display:flex;justify-content:flex-end;gap:10px;">
|
||||
<a href="/nabavke" class="btn-sekundarno">Odustani</a>
|
||||
@@ -188,10 +265,10 @@
|
||||
x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"
|
||||
style="position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:50;display:flex;align-items:center;justify-content:center;padding:16px;"
|
||||
class="modal-overlay"
|
||||
@click.self="zatvoriModal()" @keydown.escape.window="zatvoriModal()">
|
||||
|
||||
<div class="kartica modal-sadrzaj" style="width:100%;max-width:440px;padding:24px;">
|
||||
<div class="kartica modal-sadrzaj" style="width:100%;max-width:480px;padding:24px;max-height:90vh;overflow-y:auto;">
|
||||
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;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);">Novi artikal</span>
|
||||
@@ -222,12 +299,44 @@
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="polje-labela">Opis</label>
|
||||
<textarea x-model="modalOpis" rows="2"
|
||||
placeholder="Kratak opis artikla..."
|
||||
style="width:100%;resize:vertical;"></textarea>
|
||||
</div>
|
||||
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
|
||||
<div>
|
||||
<label class="polje-labela">Količina na stanju</label>
|
||||
<input type="number" x-model="modalKolicina" min="0" placeholder="0" style="width:100%;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Minimalna količina</label>
|
||||
<input type="number" x-model="modalKolicinaMin" min="0" placeholder="0" style="width:100%;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="polje-labela">Prodajna cena (din)</label>
|
||||
<input type="number" x-model="modalCena" min="0" step="0.01"
|
||||
placeholder="0"
|
||||
style="width:100%;">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="polje-labela">Lokacija u magacinu</label>
|
||||
<input type="text" x-model="modalLokacija"
|
||||
placeholder="npr. Regal A3, polica 2"
|
||||
style="width:100%;">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="polje-labela">Napomena</label>
|
||||
<textarea x-model="modalNapomena" rows="2"
|
||||
placeholder="Interna napomena o artiklu..."
|
||||
style="width:100%;resize:vertical;"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display:flex;justify-content:flex-end;gap:10px;margin-top:20px;padding-top:14px;border-top:0.5px solid var(--ivica);">
|
||||
@@ -241,5 +350,76 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- modal: novi dobavljač -->
|
||||
<div x-show="modalDob" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"
|
||||
class="modal-overlay"
|
||||
@click.self="zatvoriModalDobavljac()" @keydown.escape.window="zatvoriModalDobavljac()">
|
||||
|
||||
<div class="kartica modal-sadrzaj" style="width:100%;max-width:480px;padding:24px;max-height:90vh;overflow-y:auto;">
|
||||
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;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);">Novi dobavljač</span>
|
||||
<button type="button" @click="zatvoriModalDobavljac()" aria-label="Zatvori"
|
||||
style="background:none;border:none;cursor:pointer;color:var(--tekst-sporedni);font-size:20px;line-height:1;padding:2px 6px;border-radius:4px;transition:background 0.15s;">×</button>
|
||||
</div>
|
||||
|
||||
<div x-show="modalDobGreska" class="poruka-greska greska-animacija" x-text="modalDobGreska"></div>
|
||||
|
||||
<div class="kolona" style="gap:14px;">
|
||||
<div>
|
||||
<label class="polje-labela">Naziv <span style="color:#dc2626;">*</span></label>
|
||||
<input type="text" x-model="modalDobNaziv" x-ref="modalDobNazivInput"
|
||||
placeholder="npr. TechDistrib d.o.o." style="width:100%;"
|
||||
@keydown.enter.prevent="sacuvajDobavljaca()">
|
||||
</div>
|
||||
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
|
||||
<div>
|
||||
<label class="polje-labela">Kontakt osoba</label>
|
||||
<input type="text" x-model="modalDobKontakt" placeholder="npr. Marko Petrović" style="width:100%;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Telefon</label>
|
||||
<input type="text" x-model="modalDobTelefon" placeholder="npr. 011 123 4567" style="width:100%;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="polje-labela">E-pošta</label>
|
||||
<input type="text" x-model="modalDobEmail" placeholder="npr. nabavka@techdistrib.rs" style="width:100%;">
|
||||
</div>
|
||||
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
|
||||
<div>
|
||||
<label class="polje-labela">PIB</label>
|
||||
<input type="text" x-model="modalDobPib" placeholder="npr. 123456789" style="width:100%;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Mesto / grad</label>
|
||||
<input type="text" x-model="modalDobMesto" placeholder="npr. Beograd" style="width:100%;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="polje-labela">Napomena</label>
|
||||
<textarea x-model="modalDobNapomena" rows="2"
|
||||
placeholder="Interna napomena o dobavljaču..."
|
||||
style="width:100%;resize:vertical;"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display:flex;justify-content:flex-end;gap:10px;margin-top:20px;padding-top:14px;border-top:0.5px solid var(--ivica);">
|
||||
<button type="button" @click="zatvoriModalDobavljac()" class="btn-sekundarno">Odustani</button>
|
||||
<button type="button" @click="sacuvajDobavljaca()" :disabled="modalDobUcitavanje" class="btn-primarno"
|
||||
:style="modalDobUcitavanje ? 'opacity:0.6;cursor:not-allowed' : ''">
|
||||
<span x-text="modalDobUcitavanje ? 'Čuvanje...' : 'Dodaj dobavljača'"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}Nivelacije — promene cena — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="width:100%;max-width:100%;">
|
||||
|
||||
<!-- filter perioda -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<form method="GET" action="/nivelacije" style="display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;">
|
||||
<div>
|
||||
<label class="polje-labela">Od datuma</label>
|
||||
<input type="date" name="od" value="{{.Od}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Do datuma</label>
|
||||
<input type="date" name="do" value="{{.Do}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<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;">Prikaži</button>
|
||||
{{if or .Od .Do}}<a href="/nivelacije" class="nazad-link" style="margin-bottom:0;">Poništi filter</a>{{end}}
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- istorija nivelacija -->
|
||||
<div class="kartica animiraj" style="padding:0;overflow:hidden;">
|
||||
<div style="overflow-x:auto;">
|
||||
<table style="width:100%;border-collapse:collapse;font-size:13px;min-width:760px;">
|
||||
<thead>
|
||||
<tr style="text-align:left;color:var(--tekst-sporedni);border-bottom:0.5px solid var(--ivica);">
|
||||
<th style="padding:10px 12px;">Datum</th>
|
||||
<th style="padding:10px 12px;">Artikal</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Stara cena</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Nova cena</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Razlika</th>
|
||||
<th style="padding:10px 12px;">Izvor</th>
|
||||
<th style="padding:10px 12px;">Razlog</th>
|
||||
<th style="padding:10px 12px;">Korisnik</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range .Zapisi}}
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;white-space:nowrap;">{{.Datum.Format "02.01.2006."}}</td>
|
||||
<td style="padding:10px 12px;">{{.ArtikalNaziv}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;color:var(--tekst-sporedni);">{{printf "%.2f" .StaraCena}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;font-weight:500;">{{printf "%.2f" .NovaCena}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;white-space:nowrap;color:{{if .Poskupljenje}}var(--greska){{else}}var(--uspeh){{end}};">
|
||||
{{if .Poskupljenje}}+{{end}}{{printf "%.2f" .Razlika}}
|
||||
<div style="font-size:11px;">{{if .Poskupljenje}}+{{end}}{{printf "%.1f" .Procenat}}%</div>
|
||||
</td>
|
||||
<td style="padding:10px 12px;">
|
||||
{{if eq .Izvor "rucno"}}<span title="Posebna akcija „Promeni cenu“">ručno</span>
|
||||
{{else if eq .Izvor "izmena"}}<span title="Promenjeno kroz izmenu artikla">izmena</span>
|
||||
{{else if eq .Izvor "kalkulacija"}}<span title="Iz kalkulacije pri prijemu robe">kalkulacija</span>
|
||||
{{else}}{{.Izvor}}{{end}}
|
||||
</td>
|
||||
<td style="padding:10px 12px;color:var(--tekst-sporedni);">{{if .Razlog}}{{.Razlog}}{{else}}—{{end}}</td>
|
||||
<td style="padding:10px 12px;color:var(--tekst-sporedni);">{{if .KorisnikIme}}{{.KorisnikIme}}{{else}}—{{end}}</td>
|
||||
</tr>
|
||||
{{else}}
|
||||
<tr><td colspan="8" style="padding:28px;text-align:center;color:var(--tekst-sporedni);">Nema zabeleženih promena cena u izabranom periodu.</td></tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,90 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}KIR — knjiga izdatih računa — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="width:100%;max-width:100%;">
|
||||
|
||||
<!-- zaglavlje: filter perioda + dugme za novi zapis -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="display:flex;justify-content:space-between;align-items:flex-end;gap:12px;flex-wrap:wrap;">
|
||||
<form method="GET" action="/pdv/kir" style="display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;">
|
||||
<div>
|
||||
<label class="polje-labela">Od datuma</label>
|
||||
<input type="date" name="od" value="{{.Od}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Do datuma</label>
|
||||
<input type="date" name="do" value="{{.Do}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<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;">Prikaži</button>
|
||||
{{if or .Od .Do}}<a href="/pdv/kir" class="nazad-link" style="margin-bottom:0;">Poništi filter</a>{{end}}
|
||||
</form>
|
||||
<a href="/pdv/kir/nova" class="btn-primarno" style="font-size:13px;padding:8px 16px;white-space:nowrap;">+ Nov izlazni račun</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- knjiga -->
|
||||
<div class="kartica animiraj" style="padding:0;overflow:hidden;">
|
||||
<div style="overflow-x:auto;">
|
||||
<table style="width:100%;border-collapse:collapse;font-size:13px;min-width:900px;">
|
||||
<thead>
|
||||
<tr style="text-align:left;color:var(--tekst-sporedni);border-bottom:0.5px solid var(--ivica);">
|
||||
<th style="padding:10px 12px;">Datum prometa</th>
|
||||
<th style="padding:10px 12px;">Broj dok.</th>
|
||||
<th style="padding:10px 12px;">Kupac</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Osn. 20%</th>
|
||||
<th style="padding:10px 12px;text-align:right;">PDV 20%</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Osn. 10%</th>
|
||||
<th style="padding:10px 12px;text-align:right;">PDV 10%</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Oslobođeno</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Ukupno</th>
|
||||
<th style="padding:10px 12px;"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range .Zapisi}}
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;white-space:nowrap;">{{.DatumPrometa.Format "02.01.2006."}}</td>
|
||||
<td style="padding:10px 12px;">{{.BrojDokumenta}}</td>
|
||||
<td style="padding:10px 12px;">{{.KupacNaziv}}{{if .KupacPib}}<div style="font-size:11px;color:var(--tekst-sporedni);">{{.OznakaPoreskogBroja}}: {{.KupacPib}}</div>{{end}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .OsnovicaOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .PdvOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .OsnovicaPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .PdvPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .OslobodenUkupno}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;font-weight:500;">{{printf "%.2f" .Ukupno}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;white-space:nowrap;">
|
||||
{{if eq .Izvor "rucno"}}
|
||||
<form method="POST" action="/pdv/kir/obrisi/{{.ID}}" style="display:inline;">
|
||||
<button type="submit" class="btn-obrisi-malo" data-potvrda="Obrisati ovaj zapis iz KIR?">Obriši</button>
|
||||
</form>
|
||||
{{else}}
|
||||
<span style="font-size:11px;color:var(--tekst-sporedni);" title="Zavedeno automatski — upravlja se preko prodaje (storniraj/obriši prodaju)">iz prodaje</span>
|
||||
{{end}}
|
||||
</td>
|
||||
</tr>
|
||||
{{else}}
|
||||
<tr><td colspan="10" style="padding:28px;text-align:center;color:var(--tekst-sporedni);">Nema zapisa u izabranom periodu. <a href="/pdv/kir/nova" style="color:var(--sb-akcent);">Dodaj prvi.</a></td></tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
{{if .Zapisi}}
|
||||
<tfoot>
|
||||
<tr style="border-top:0.5px solid var(--ivica);font-weight:500;background:var(--pozadina);">
|
||||
<td style="padding:10px 12px;" colspan="3">UKUPNO ({{len .Zapisi}})</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.OsnovicaOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.PdvOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.OsnovicaPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.PdvPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.OslobodenUkupno}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.Ukupno}}</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
{{end}}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,123 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}Novi izlazni račun (KIR) — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="width:100%;max-width:760px;">
|
||||
|
||||
<a href="/pdv/kir" 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"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
Nazad na KIR
|
||||
</a>
|
||||
|
||||
<form method="POST" action="/pdv/kir/nova">
|
||||
<!-- dokument -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);margin-bottom:16px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">Dokument</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
|
||||
<div>
|
||||
<label class="polje-labela">Datum prometa</label>
|
||||
<input type="date" name="datum_prometa" value="{{.Danas}}" required 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Datum knjiženja</label>
|
||||
<input type="date" name="datum_knjizenja" value="{{.Danas}}" required 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;">
|
||||
</div>
|
||||
<div style="grid-column:1 / -1;">
|
||||
<label class="polje-labela">Broj dokumenta</label>
|
||||
<input type="text" name="broj_dokumenta" required 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. R-2026/001">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- kupac -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);margin-bottom:16px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">Kupac</div>
|
||||
<div class="kolona" style="gap:14px;">
|
||||
{{if .Klijenti}}
|
||||
<div>
|
||||
<label class="polje-labela">Izaberi iz klijenata (opciono)</label>
|
||||
<select onchange="popuniKupca(this)" 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;">
|
||||
<option value="">— ručni unos —</option>
|
||||
{{range .Klijenti}}
|
||||
<option data-naziv="{{.PunoIme}}" data-pib="{{if eq .Tip "pravno"}}{{.PIB}}{{else}}{{.JMBG}}{{end}}" data-mesto="{{.Mesto}}">{{.PunoIme}}{{if .Mesto}} — {{.Mesto}}{{end}}</option>
|
||||
{{end}}
|
||||
</select>
|
||||
<div class="pomocni-tekst" style="font-size:12px;margin-top:4px;">Izbor popunjava naziv i PIB/JMBG; možeš ih i ručno izmeniti.</div>
|
||||
</div>
|
||||
{{end}}
|
||||
<div>
|
||||
<label class="polje-labela">Naziv kupca</label>
|
||||
<input type="text" name="kupac_naziv" required 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;">
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
|
||||
<div>
|
||||
<label class="polje-labela">PIB / JMBG</label>
|
||||
<input type="text" name="kupac_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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Mesto</label>
|
||||
<input type="text" name="kupac_mesto" 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;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- iznosi po stopama -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);margin-bottom:6px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">Iznosi po stopama</div>
|
||||
<div class="pomocni-tekst" style="font-size:12px;margin-bottom:14px;">Ostavite 0 gde nema prometa. „Ukupno" se računa automatski kao zbir osnovica, PDV-a i oslobođenog prometa.</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
|
||||
<div>
|
||||
<label class="polje-labela">Osnovica opšta (20%)</label>
|
||||
<input type="number" step="0.01" min="0" name="osnovica_opsta" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">PDV opšta (20%)</label>
|
||||
<input type="number" step="0.01" min="0" name="pdv_opsta" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Osnovica posebna (10%)</label>
|
||||
<input type="number" step="0.01" min="0" name="osnovica_posebna" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">PDV posebna (10%)</label>
|
||||
<input type="number" step="0.01" min="0" name="pdv_posebna" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Oslobođeno sa pravom na odbitak</label>
|
||||
<input type="number" step="0.01" min="0" name="osloboden_sa_pravom" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Oslobođeno bez prava na odbitak</label>
|
||||
<input type="number" step="0.01" min="0" name="osloboden_bez_prava" value="0" 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;">
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-top:14px;">
|
||||
<label class="polje-labela">Napomena</label>
|
||||
<input type="text" name="napomena" 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;">
|
||||
</div>
|
||||
|
||||
<div style="display:flex;justify-content:flex-end;gap:10px;margin-top:20px;">
|
||||
<a href="/pdv/kir" class="btn-sekundarno" style="font-size:14px;padding:10px 20px;">Odustani</a>
|
||||
<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;">Sačuvaj</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Izbor klijenta iz padajuće liste popunjava polja kupca (naziv, PIB/JMBG, mesto).
|
||||
// KIR i dalje čuva kupca kao tekst — klijent samo popuni polja, koja se mogu i ručno menjati.
|
||||
function popuniKupca(sel) {
|
||||
var o = sel.options[sel.selectedIndex];
|
||||
var naziv = o.getAttribute('data-naziv');
|
||||
if (!naziv) return; // „— ručni unos —"
|
||||
var f = sel.closest('form');
|
||||
f.querySelector('input[name="kupac_naziv"]').value = naziv;
|
||||
f.querySelector('input[name="kupac_pib"]').value = o.getAttribute('data-pib') || '';
|
||||
f.querySelector('input[name="kupac_mesto"]').value = o.getAttribute('data-mesto') || '';
|
||||
}
|
||||
</script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,93 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}KPR — knjiga primljenih računa — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="width:100%;max-width:100%;">
|
||||
|
||||
<!-- zaglavlje: filter perioda + dugme za novi zapis -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="display:flex;justify-content:space-between;align-items:flex-end;gap:12px;flex-wrap:wrap;">
|
||||
<form method="GET" action="/pdv/kpr" style="display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;">
|
||||
<div>
|
||||
<label class="polje-labela">Od datuma</label>
|
||||
<input type="date" name="od" value="{{.Od}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Do datuma</label>
|
||||
<input type="date" name="do" value="{{.Do}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<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;">Prikaži</button>
|
||||
{{if or .Od .Do}}<a href="/pdv/kpr" class="nazad-link" style="margin-bottom:0;">Poništi filter</a>{{end}}
|
||||
</form>
|
||||
<a href="/pdv/kpr/nova" class="btn-primarno" style="font-size:13px;padding:8px 16px;white-space:nowrap;">+ Nov ulazni račun</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- knjiga -->
|
||||
<div class="kartica animiraj" style="padding:0;overflow:hidden;">
|
||||
<div style="overflow-x:auto;">
|
||||
<table style="width:100%;border-collapse:collapse;font-size:13px;min-width:980px;">
|
||||
<thead>
|
||||
<tr style="text-align:left;color:var(--tekst-sporedni);border-bottom:0.5px solid var(--ivica);">
|
||||
<th style="padding:10px 12px;">Datum prometa</th>
|
||||
<th style="padding:10px 12px;">Broj dok.</th>
|
||||
<th style="padding:10px 12px;">Dobavljač</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Osn. 20%</th>
|
||||
<th style="padding:10px 12px;text-align:right;">PDV 20%</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Osn. 10%</th>
|
||||
<th style="padding:10px 12px;text-align:right;">PDV 10%</th>
|
||||
<th style="padding:10px 12px;text-align:right;">PDV bez odb.</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Oslob. nab.</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Ukupno</th>
|
||||
<th style="padding:10px 12px;"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range .Zapisi}}
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;white-space:nowrap;">{{.DatumPrometa.Format "02.01.2006."}}</td>
|
||||
<td style="padding:10px 12px;">{{.BrojDokumenta}}{{if .Uvoz}}<div style="display:inline-block;margin-top:2px;font-size:10px;font-weight:600;color:var(--sb-akcent);border:0.5px solid var(--sb-akcent);border-radius:4px;padding:0 5px;">UVOZ</div>{{end}}</td>
|
||||
<td style="padding:10px 12px;">{{.DobavljacNaziv}}{{if .DobavljacPib}}<div style="font-size:11px;color:var(--tekst-sporedni);">{{.OznakaPoreskogBroja}}: {{.DobavljacPib}}</div>{{end}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .OsnovicaOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .PdvOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .OsnovicaPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .PdvPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .PdvBezOdbitka}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .OslobodenNabavka}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;font-weight:500;">{{printf "%.2f" .Ukupno}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;white-space:nowrap;">
|
||||
{{if eq .Izvor "rucno"}}
|
||||
<form method="POST" action="/pdv/kpr/obrisi/{{.ID}}" style="display:inline;">
|
||||
<button type="submit" class="btn-obrisi-malo" data-potvrda="Obrisati ovaj zapis iz KPR?">Obriši</button>
|
||||
</form>
|
||||
{{else}}
|
||||
<span style="font-size:11px;color:var(--tekst-sporedni);" title="Zavedeno automatski — upravlja se preko nabavke (obriši nabavku)">iz nabavke</span>
|
||||
{{end}}
|
||||
</td>
|
||||
</tr>
|
||||
{{else}}
|
||||
<tr><td colspan="11" style="padding:28px;text-align:center;color:var(--tekst-sporedni);">Nema zapisa u izabranom periodu. <a href="/pdv/kpr/nova" style="color:var(--sb-akcent);">Dodaj prvi.</a></td></tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
{{if .Zapisi}}
|
||||
<tfoot>
|
||||
<tr style="border-top:0.5px solid var(--ivica);font-weight:500;background:var(--pozadina);">
|
||||
<td style="padding:10px 12px;" colspan="3">UKUPNO ({{len .Zapisi}})</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.OsnovicaOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.PdvOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.OsnovicaPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.PdvPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.PdvBezOdbitka}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.OslobodenNabavka}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Sume.Ukupno}}</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
{{end}}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,136 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}Novi ulazni račun (KPR) — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="width:100%;max-width:760px;">
|
||||
|
||||
<a href="/pdv/kpr" 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"><polyline points="15 18 9 12 15 6"/></svg>
|
||||
Nazad na KPR
|
||||
</a>
|
||||
|
||||
<form method="POST" action="/pdv/kpr/nova">
|
||||
<!-- dokument -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);margin-bottom:16px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">Dokument</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
|
||||
<div>
|
||||
<label class="polje-labela">Datum prometa</label>
|
||||
<input type="date" name="datum_prometa" value="{{.Danas}}" required 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Datum knjiženja</label>
|
||||
<input type="date" name="datum_knjizenja" value="{{.Danas}}" required 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Datum plaćanja (opciono)</label>
|
||||
<input type="date" name="datum_placanja" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Broj dokumenta</label>
|
||||
<input type="text" name="broj_dokumenta" required 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. 2026-1234">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- dobavljač -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);margin-bottom:16px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">Dobavljač</div>
|
||||
<div class="kolona" style="gap:14px;">
|
||||
{{if .Dobavljaci}}
|
||||
<div>
|
||||
<label class="polje-labela">Izaberi iz dobavljača (opciono)</label>
|
||||
<select onchange="popuniDobavljaca(this)" 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;">
|
||||
<option value="">— ručni unos —</option>
|
||||
{{range .Dobavljaci}}
|
||||
<option data-naziv="{{.Naziv}}" data-pib="{{.PIB}}" data-mesto="{{.Mesto}}">{{.Naziv}}{{if .Mesto}} — {{.Mesto}}{{end}}</option>
|
||||
{{end}}
|
||||
</select>
|
||||
<div class="pomocni-tekst" style="font-size:12px;margin-top:4px;">Izbor popunjava naziv, PIB i mesto; možeš ih i ručno izmeniti.</div>
|
||||
</div>
|
||||
{{end}}
|
||||
<div>
|
||||
<label class="polje-labela">Naziv dobavljača</label>
|
||||
<input type="text" name="dobavljac_naziv" required 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;">
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
|
||||
<div>
|
||||
<label class="polje-labela">PIB</label>
|
||||
<input type="text" name="dobavljac_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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Mesto</label>
|
||||
<input type="text" name="dobavljac_mesto" 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;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- iznosi po stopama -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);margin-bottom:6px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);">Iznosi po stopama</div>
|
||||
<div class="pomocni-tekst" style="font-size:12px;margin-bottom:14px;">PDV (opšta/posebna) je iznos koji se može odbiti. „Ukupno" se računa automatski.</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
|
||||
<div>
|
||||
<label class="polje-labela">Osnovica opšta (20%)</label>
|
||||
<input type="number" step="0.01" min="0" name="osnovica_opsta" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">PDV opšta (20%, odbitni)</label>
|
||||
<input type="number" step="0.01" min="0" name="pdv_opsta" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Osnovica posebna (10%)</label>
|
||||
<input type="number" step="0.01" min="0" name="osnovica_posebna" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">PDV posebna (10%, odbitni)</label>
|
||||
<input type="number" step="0.01" min="0" name="pdv_posebna" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">PDV bez prava na odbitak</label>
|
||||
<input type="number" step="0.01" min="0" name="pdv_bez_odbitka" value="0" 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;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Oslobođena nabavka / bez PDV</label>
|
||||
<input type="number" step="0.01" min="0" name="osloboden_nabavka" value="0" 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;">
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-top:14px;">
|
||||
<label class="polje-labela">Napomena</label>
|
||||
<input type="text" name="napomena" 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;">
|
||||
</div>
|
||||
|
||||
<div style="margin-top:14px;">
|
||||
<label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;color:var(--tekst-glavni);">
|
||||
<input type="checkbox" name="uvoz" value="1" style="width:16px;height:16px;cursor:pointer;">
|
||||
Uvoz (JCI)
|
||||
</label>
|
||||
<div class="pomocni-tekst" style="margin-top:4px;">
|
||||
Označi ako je račun uvoz po carinskom dokumentu (JCI) — PDV ide u polja 006/106 obrasca PPPDV.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display:flex;justify-content:flex-end;gap:10px;margin-top:20px;">
|
||||
<a href="/pdv/kpr" class="btn-sekundarno" style="font-size:14px;padding:10px 20px;">Odustani</a>
|
||||
<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;">Sačuvaj</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Izbor dobavljača iz padajuće liste popunjava polja (naziv, PIB, mesto).
|
||||
function popuniDobavljaca(sel) {
|
||||
var o = sel.options[sel.selectedIndex];
|
||||
var naziv = o.getAttribute('data-naziv');
|
||||
if (!naziv) return; // „— ručni unos —"
|
||||
var f = sel.closest('form');
|
||||
f.querySelector('input[name="dobavljac_naziv"]').value = naziv;
|
||||
f.querySelector('input[name="dobavljac_pib"]').value = o.getAttribute('data-pib') || '';
|
||||
f.querySelector('input[name="dobavljac_mesto"]').value = o.getAttribute('data-mesto') || '';
|
||||
}
|
||||
</script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,200 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}PDV obračun — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="width:100%;max-width:100%;">
|
||||
|
||||
<!-- izbor perioda -->
|
||||
<div class="kartica animiraj" style="margin-bottom:16px;">
|
||||
<form method="GET" action="/pdv/obracun" style="display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;">
|
||||
<div>
|
||||
<label class="polje-labela">Od datuma</label>
|
||||
<input type="date" name="od" value="{{.Od}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div>
|
||||
<label class="polje-labela">Do datuma</label>
|
||||
<input type="date" name="do" value="{{.Do}}" style="padding:8px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<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;">Prikaži</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- obračun po stopama -->
|
||||
<div class="kartica animiraj" style="padding:0;overflow:hidden;margin-bottom:16px;">
|
||||
<div style="overflow-x:auto;">
|
||||
<table style="width:100%;border-collapse:collapse;font-size:13px;min-width:560px;">
|
||||
<thead>
|
||||
<tr style="text-align:left;color:var(--tekst-sporedni);border-bottom:0.5px solid var(--ivica);">
|
||||
<th style="padding:10px 12px;"></th>
|
||||
<th style="padding:10px 12px;text-align:right;">Osnovica</th>
|
||||
<th style="padding:10px 12px;text-align:right;">PDV</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- izlazni (dugovani) PDV — iz KIR -->
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;font-weight:500;" colspan="3">Izlazni (dugovani) PDV — KIR</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;padding-left:24px;">Opšta stopa (20%)</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .KirSume.OsnovicaOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Obracun.IzlazniPdvOpsta}}</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;padding-left:24px;">Posebna stopa (10%)</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .KirSume.OsnovicaPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Obracun.IzlazniPdvPosebna}}</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;padding-left:24px;color:var(--tekst-sporedni);">Oslobođen promet</td>
|
||||
<td style="padding:10px 12px;text-align:right;color:var(--tekst-sporedni);">{{printf "%.2f" .KirSume.OslobodenUkupno}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;color:var(--tekst-sporedni);">—</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);font-weight:500;background:var(--pozadina);">
|
||||
<td style="padding:10px 12px;">Ukupno izlazni PDV</td>
|
||||
<td style="padding:10px 12px;"></td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Obracun.IzlazniPdvUkupno}}</td>
|
||||
</tr>
|
||||
|
||||
<!-- odbitni (prethodni) PDV — iz KPR -->
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;font-weight:500;padding-top:18px;" colspan="3">Odbitni (prethodni) PDV — KPR</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;padding-left:24px;">Opšta stopa (20%)</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .KprSume.OsnovicaOpsta}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Obracun.OdbitniPdvOpsta}}</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;padding-left:24px;">Posebna stopa (10%)</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .KprSume.OsnovicaPosebna}}</td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Obracun.OdbitniPdvPosebna}}</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:10px 12px;padding-left:24px;color:var(--tekst-sporedni);">PDV bez prava na odbitak</td>
|
||||
<td style="padding:10px 12px;text-align:right;color:var(--tekst-sporedni);">—</td>
|
||||
<td style="padding:10px 12px;text-align:right;color:var(--tekst-sporedni);">{{printf "%.2f" .KprSume.PdvBezOdbitka}}</td>
|
||||
</tr>
|
||||
<tr style="font-weight:500;background:var(--pozadina);">
|
||||
<td style="padding:10px 12px;">Ukupno odbitni PDV</td>
|
||||
<td style="padding:10px 12px;"></td>
|
||||
<td style="padding:10px 12px;text-align:right;">{{printf "%.2f" .Obracun.OdbitniPdvUkupno}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- rezultat: obaveza za uplatu / povraćaj -->
|
||||
<div class="kartica animiraj" style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;
|
||||
border-left:4px solid {{if .Obracun.ZaUplatu}}var(--greska){{else}}var(--uspeh){{end}};">
|
||||
<div>
|
||||
<div style="font-size:13px;color:var(--tekst-sporedni);">
|
||||
{{if .Obracun.ZaUplatu}}PDV obaveza za uplatu{{else}}PDV za povraćaj / prenos u naredni period{{end}}
|
||||
</div>
|
||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-top:2px;">izlazni − odbitni PDV</div>
|
||||
</div>
|
||||
<div style="font-size:24px;font-weight:600;color:{{if .Obracun.ZaUplatu}}var(--greska){{else}}var(--uspeh){{end}};white-space:nowrap;">
|
||||
{{printf "%.2f" .Obracun.ObavezaApsolutna}} RSD
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PPPDV — prikaz polja zvanične poreske prijave PDV -->
|
||||
<div class="kartica animiraj" style="padding:0;overflow:hidden;">
|
||||
<div style="padding:16px 16px 0;">
|
||||
<div style="font-size:15px;font-weight:600;color:var(--tekst-glavni);">PPPDV — poreska prijava PDV</div>
|
||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-top:4px;">
|
||||
Prikaz polja obrasca za izabrani period, u celim dinarima.
|
||||
⚠ Uvoz (006/106) i PDV nadoknada poljoprivredniku (007/107) se ne vode zasebno u programu.
|
||||
</div>
|
||||
</div>
|
||||
<div style="overflow-x:auto;margin-top:12px;">
|
||||
<table style="width:100%;border-collapse:collapse;font-size:13px;min-width:560px;">
|
||||
<thead>
|
||||
<tr style="text-align:left;color:var(--tekst-sporedni);border-bottom:0.5px solid var(--ivica);">
|
||||
<th style="padding:10px 12px;width:48px;">Polje</th>
|
||||
<th style="padding:10px 12px;">Opis</th>
|
||||
<th style="padding:10px 12px;text-align:right;">Naknada bez PDV</th>
|
||||
<th style="padding:10px 12px;text-align:right;">PDV</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);"><td style="padding:8px 12px;font-weight:500;" colspan="4">I. Promet dobara i usluga</td></tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:8px 12px;color:var(--tekst-sporedni);">001</td>
|
||||
<td style="padding:8px 12px;">Oslobođen sa pravom na odbitak</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje001}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;color:var(--tekst-sporedni);">—</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:8px 12px;color:var(--tekst-sporedni);">002</td>
|
||||
<td style="padding:8px 12px;">Oslobođen bez prava na odbitak</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje002}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;color:var(--tekst-sporedni);">—</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:8px 12px;color:var(--tekst-sporedni);">003<div style="font-size:11px;">103</div></td>
|
||||
<td style="padding:8px 12px;">Promet po opštoj stopi (20%)</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje003}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje103}}</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:8px 12px;color:var(--tekst-sporedni);">004<div style="font-size:11px;">104</div></td>
|
||||
<td style="padding:8px 12px;">Promet po posebnoj stopi (10%)</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje004}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje104}}</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);font-weight:500;background:var(--pozadina);">
|
||||
<td style="padding:8px 12px;">005<div style="font-size:11px;">105</div></td>
|
||||
<td style="padding:8px 12px;">ZBIR (1+2+3+4)</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje005}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje105}}</td>
|
||||
</tr>
|
||||
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);"><td style="padding:8px 12px;font-weight:500;padding-top:14px;" colspan="4">II. Prethodni porez</td></tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);color:var(--tekst-sporedni);">
|
||||
<td style="padding:8px 12px;">006<div style="font-size:11px;">106</div></td>
|
||||
<td style="padding:8px 12px;">Prethodni porez pri uvozu</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje006}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje106}}</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);color:var(--tekst-sporedni);">
|
||||
<td style="padding:8px 12px;">007<div style="font-size:11px;">107</div></td>
|
||||
<td style="padding:8px 12px;">PDV nadoknada poljoprivredniku</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje007}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje107}}</td>
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:8px 12px;color:var(--tekst-sporedni);">008<div style="font-size:11px;">108</div></td>
|
||||
<td style="padding:8px 12px;">Ostali prethodni porez (domaće nabavke)</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje008}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje108}}</td>
|
||||
</tr>
|
||||
<tr style="font-weight:500;background:var(--pozadina);">
|
||||
<td style="padding:8px 12px;">009<div style="font-size:11px;">109</div></td>
|
||||
<td style="padding:8px 12px;">ZBIR (6+7+8)</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje009}}</td>
|
||||
<td style="padding:8px 12px;text-align:right;">{{.PPPDV.Polje109}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr style="border-top:0.5px solid var(--ivica);font-weight:600;">
|
||||
<td style="padding:10px 12px;">110</td>
|
||||
<td style="padding:10px 12px;" colspan="2">
|
||||
Iznos PDV u periodu (105 − 109)
|
||||
{{if .PPPDV.Povracaj}}<span style="color:var(--uspeh);"> — za povraćaj</span>{{else}}<span style="color:var(--greska);"> — za uplatu</span>{{end}}
|
||||
</td>
|
||||
<td style="padding:10px 12px;text-align:right;color:{{if .PPPDV.Povracaj}}var(--uspeh){{else}}var(--greska){{end}};">{{.PPPDV.Polje110Apsolutno}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:8px 12px;color:var(--tekst-sporedni);">11</td>
|
||||
<td style="padding:8px 12px;" colspan="3">Povraćaj: <strong>{{if .PPPDV.Povracaj}}DA{{else}}NE{{end}}</strong></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,115 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "naslov"}}Podešavanja — Kalkulacija i PDV — NTech{{end}}
|
||||
|
||||
{{define "sadrzaj"}}
|
||||
<div class="stranica-stack" style="width:100%;max-width:100%;">
|
||||
|
||||
<!-- kalkulacija: podrazumevana marža za formiranje prodajne cene pri nabavci -->
|
||||
<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"><line x1="12" y1="1" x2="12" y2="23"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>
|
||||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Kalkulacija</span>
|
||||
</div>
|
||||
<form method="POST" action="/podesavanja/sacuvaj">
|
||||
<input type="hidden" name="_next" value="/admin/podesavanja/kalkulacija-pdv">
|
||||
<div style="display:flex;gap:16px;flex-wrap:wrap;align-items:flex-end;">
|
||||
<div>
|
||||
<label for="kalkulacija_marza" class="polje-labela">Podrazumevana marža (%)</label>
|
||||
<input type="number" id="kalkulacija_marza" name="kalkulacija_marza" min="0" max="1000" step="0.01" value="{{.KalkulacijaMarza}}"
|
||||
style="width:140px;padding:8px 12px;background:var(--pozadina);border:0.5px solid var(--ivica);border-radius:8px;color:var(--tekst-glavni);font-size:14px;">
|
||||
</div>
|
||||
<button type="submit"
|
||||
style="padding:9px 18px;background:var(--sb-akcent);border:none;border-radius:8px;color:#fff;font-size:13px;font-weight:500;cursor:pointer;">
|
||||
Sačuvaj
|
||||
</button>
|
||||
</div>
|
||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-top:8px;">
|
||||
Početna marža za formiranje prodajne cene pri nabavci. Po stavci je možeš promeniti.
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- postojeće stope: svaki red je forma za izmenu + zasebna forma za arhiviranje -->
|
||||
<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"><line x1="19" y1="5" x2="5" y2="19"/><circle cx="6.5" cy="6.5" r="2.5"/><circle cx="17.5" cy="17.5" r="2.5"/></svg>
|
||||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Šifarnik PDV stopa</span>
|
||||
</div>
|
||||
|
||||
<div class="pomocni-tekst" style="font-size:12px;margin-bottom:14px;">
|
||||
Stope se koriste u kalkulaciji cena i PDV evidenciji. Stopa koja je negde upotrebljena se ne briše — arhivira se (nestaje iz padajućih lista, a postojeći zapisi ostaju ispravni).
|
||||
</div>
|
||||
|
||||
{{if not .Stope}}
|
||||
<div class="pomocni-tekst">Nema unetih PDV stopa.</div>
|
||||
{{end}}
|
||||
|
||||
{{range .Stope}}
|
||||
<div style="display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap;padding:10px 0;border-bottom:0.5px solid var(--ivica);{{if not .Aktivna}}opacity:0.5;{{end}}">
|
||||
<form method="POST" action="/podesavanja/pdv-stope/{{.ID}}/izmeni" style="display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap;flex:1;">
|
||||
<div style="flex:2;min-width:140px;">
|
||||
<label class="polje-labela">Naziv</label>
|
||||
<input type="text" name="naziv" value="{{.Naziv}}" style="width:100%;padding:7px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div style="width:80px;">
|
||||
<label class="polje-labela">Stopa %</label>
|
||||
<input type="text" name="stopa" value="{{printf "%g" .Stopa}}" style="width:100%;padding:7px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div style="width:150px;">
|
||||
<label class="polje-labela">Vrsta</label>
|
||||
<select name="oznaka" style="width:100%;padding:7px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
<option value="opsta" {{if eq .Oznaka "opsta"}}selected{{end}}>Opšta</option>
|
||||
<option value="posebna" {{if eq .Oznaka "posebna"}}selected{{end}}>Posebna</option>
|
||||
<option value="oslobodjeno" {{if eq .Oznaka "oslobodjeno"}}selected{{end}}>Oslobođeno</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width:80px;">
|
||||
<label class="polje-labela">Redosled</label>
|
||||
<input type="text" name="redosled" value="{{.Redosled}}" style="width:100%;padding:7px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<button type="submit" style="padding:7px 14px;background:var(--sb-akcent);color:#fff;border:none;border-radius:8px;font-size:13px;cursor:pointer;white-space:nowrap;">Sačuvaj</button>
|
||||
</form>
|
||||
<form method="POST" action="/podesavanja/pdv-stope/{{.ID}}/aktivnost">
|
||||
<button type="submit" style="padding:7px 14px;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;">{{if .Aktivna}}Arhiviraj{{else}}Vrati{{end}}</button>
|
||||
</form>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<!-- dodavanje nove stope -->
|
||||
<form method="POST" action="/podesavanja/pdv-stope/dodaj">
|
||||
<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"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
|
||||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Nova stopa</span>
|
||||
</div>
|
||||
|
||||
<div style="display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap;">
|
||||
<div style="flex:2;min-width:140px;">
|
||||
<label class="polje-labela">Naziv</label>
|
||||
<input type="text" name="naziv" placeholder="npr. Opšta stopa" style="width:100%;padding:7px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div style="width:80px;">
|
||||
<label class="polje-labela">Stopa %</label>
|
||||
<input type="text" name="stopa" placeholder="20" style="width:100%;padding:7px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<div style="width:150px;">
|
||||
<label class="polje-labela">Vrsta</label>
|
||||
<select name="oznaka" style="width:100%;padding:7px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
<option value="opsta">Opšta</option>
|
||||
<option value="posebna">Posebna</option>
|
||||
<option value="oslobodjeno">Oslobođeno</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="width:80px;">
|
||||
<label class="polje-labela">Redosled</label>
|
||||
<input type="text" name="redosled" placeholder="0" style="width:100%;padding:7px 10px;border:0.5px solid var(--ivica);border-radius:8px;font-size:13px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||||
</div>
|
||||
<button type="submit" style="padding:7px 16px;background:var(--sb-akcent);color:#fff;border:none;border-radius:8px;font-size:13px;font-weight:500;cursor:pointer;white-space:nowrap;">Dodaj</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -117,6 +117,94 @@
|
||||
</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}}
|
||||
@@ -135,4 +223,37 @@
|
||||
})();
|
||||
</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}}
|
||||
|
||||
Reference in New Issue
Block a user