feat(nabavka): kalkulacija — formiranje prodajne cene pri nabavci (Faza B)

Po stavci nabavke: marža% (predpopunjena globalnom iz podešavanja,
kalkulacija_marza) i prodajna cena = nabavna × (1+marža/100) × (1+PDV/100),
živo računato u Alpine, izmenjivo. Na čuvanje se ažurira nabavna+prodajna
cena artikla (ArtikalRepo.AzurirajCene) i upiše nivelacija 'kalkulacija';
prazna/nulta prodajna se preskače. ArtikliJSON nosi pdv_stopa. Postavka
podrazumevane marže u Podešavanja → Sistem.
This commit is contained in:
2026-06-14 10:13:56 +02:00
parent a466f591b6
commit 97683534ac
7 changed files with 139 additions and 11 deletions
+17 -2
View File
@@ -186,8 +186,9 @@ document.addEventListener('alpine:init', () => {
// forma za nabavku
Alpine.data('nabavkaForma', () => ({
stavke: [{artikal_id: '', kolicina: 1, cena: 0}],
stavke: [{artikal_id: '', kolicina: 1, cena: 0, marza: 0, prodajna: 0}],
artikliOpcije: [],
marzaDefault: 0,
isMobile: false,
modal: false,
modalUcitavanje: false,
@@ -212,13 +213,27 @@ document.addEventListener('alpine:init', () => {
modalDobNapomena: '',
init() {
this.artikliOpcije = window._ntechArtikli || []
this.marzaDefault = parseFloat(window._ntechMarza) || 0
this.stavke.forEach(s => { s.marza = this.marzaDefault })
this.isMobile = window.matchMedia('(max-width: 768px)').matches
window.matchMedia('(max-width: 768px)').addEventListener('change', e => {
this.isMobile = e.matches
})
},
dodajStavku() {
this.stavke.push({artikal_id: '', kolicina: 1, cena: 0})
this.stavke.push({artikal_id: '', kolicina: 1, cena: 0, marza: this.marzaDefault, prodajna: 0})
},
// PDV stopa izabranog artikla (iz JSON liste) — za obračun prodajne cene
pdvStopa(artikalId) {
const a = this.artikliOpcije.find(x => String(x.id) === String(artikalId))
return a ? (parseFloat(a.pdv_stopa) || 0) : 0
},
// prodajna (sa PDV) = nabavna × (1 + marža/100) × (1 + pdvStopa/100), zaokruženo na 2 decimale
izracunajProdajnu(s) {
const cena = parseFloat(s.cena) || 0
const marza = parseFloat(s.marza) || 0
const pdv = this.pdvStopa(s.artikal_id)
s.prodajna = Math.round(cena * (1 + marza / 100) * (1 + pdv / 100) * 100) / 100
},
ukloniStavku(i) {
if (this.stavke.length > 1) this.stavke.splice(i, 1)