Dinari: formatiranje iznosa sa separatorom hiljada (helper dinari/dinariCeli); nabavka po dobavljaču (auto-veza, filter artikala, izbor dobavljača u formi artikla); UI doterivanja stavki nabavke
This commit is contained in:
@@ -31,6 +31,14 @@ type ArtikalRepository interface {
|
|||||||
SledecaSifra(ctx context.Context, kategorijaID *int64) (string, error)
|
SledecaSifra(ctx context.Context, kategorijaID *int64) (string, error)
|
||||||
// KorigujKolicinu postavlja novu količinu artikla i upisuje korekciju u magacinske_promene
|
// KorigujKolicinu postavlja novu količinu artikla i upisuje korekciju u magacinske_promene
|
||||||
KorigujKolicinu(ctx context.Context, artikalID int64, novaKolicina int, korisnikID *int64, napomena string) error
|
KorigujKolicinu(ctx context.Context, artikalID int64, novaKolicina int, korisnikID *int64, napomena string) error
|
||||||
|
// DobavljaciArtikla vraća ID-jeve dobavljača vezanih za artikal
|
||||||
|
DobavljaciArtikla(ctx context.Context, artikalID int64) ([]int64, error)
|
||||||
|
// PostaviDobavljaceArtikla zamenjuje skup dobavljača artikla datim ID-jevima
|
||||||
|
PostaviDobavljaceArtikla(ctx context.Context, artikalID int64, dobavljaciID []int64) error
|
||||||
|
// PoveziDobavljaca dodaje vezu artikal–dobavljač ako ne postoji (auto pri nabavci)
|
||||||
|
PoveziDobavljaca(ctx context.Context, artikalID, dobavljacID int64) error
|
||||||
|
// SveDobavljaceArtikala vraća mapu artikal_id → lista dobavljac_id (za filter u nabavci)
|
||||||
|
SveDobavljaceArtikala(ctx context.Context) (map[int64][]int64, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// KategorijaRepository definiše operacije nad kategorijama
|
// KategorijaRepository definiše operacije nad kategorijama
|
||||||
|
|||||||
@@ -309,6 +309,79 @@ func (r *ArtikalRepo) Vrati(ctx context.Context, id int64) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DobavljaciArtikla vraća ID-jeve dobavljača vezanih za artikal
|
||||||
|
func (r *ArtikalRepo) DobavljaciArtikla(ctx context.Context, artikalID int64) ([]int64, error) {
|
||||||
|
redovi, err := r.db.QueryContext(ctx,
|
||||||
|
"SELECT dobavljac_id FROM artikal_dobavljac WHERE artikal_id = ? ORDER BY dobavljac_id", artikalID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("ntech: ArtikalRepo.DobavljaciArtikla: %w", err)
|
||||||
|
}
|
||||||
|
defer redovi.Close()
|
||||||
|
|
||||||
|
var ids []int64
|
||||||
|
for redovi.Next() {
|
||||||
|
var id int64
|
||||||
|
if err := redovi.Scan(&id); err != nil {
|
||||||
|
return nil, fmt.Errorf("ntech: ArtikalRepo.DobavljaciArtikla: scan: %w", err)
|
||||||
|
}
|
||||||
|
ids = append(ids, id)
|
||||||
|
}
|
||||||
|
return ids, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PostaviDobavljaceArtikla zamenjuje skup dobavljača artikla datim ID-jevima (u transakciji)
|
||||||
|
func (r *ArtikalRepo) PostaviDobavljaceArtikla(ctx context.Context, artikalID int64, dobavljaciID []int64) error {
|
||||||
|
tx, err := r.db.BeginTx(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("ntech: ArtikalRepo.PostaviDobavljaceArtikla: begin tx: %w", err)
|
||||||
|
}
|
||||||
|
defer tx.Rollback()
|
||||||
|
|
||||||
|
if _, err := tx.ExecContext(ctx, "DELETE FROM artikal_dobavljac WHERE artikal_id = ?", artikalID); err != nil {
|
||||||
|
return fmt.Errorf("ntech: ArtikalRepo.PostaviDobavljaceArtikla: delete: %w", err)
|
||||||
|
}
|
||||||
|
for _, did := range dobavljaciID {
|
||||||
|
if _, err := tx.ExecContext(ctx,
|
||||||
|
"INSERT OR IGNORE INTO artikal_dobavljac (artikal_id, dobavljac_id) VALUES (?, ?)", artikalID, did); err != nil {
|
||||||
|
return fmt.Errorf("ntech: ArtikalRepo.PostaviDobavljaceArtikla: insert: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := tx.Commit(); err != nil {
|
||||||
|
return fmt.Errorf("ntech: ArtikalRepo.PostaviDobavljaceArtikla: commit: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PoveziDobavljaca dodaje vezu artikal–dobavljač ako ne postoji (auto pri nabavci)
|
||||||
|
func (r *ArtikalRepo) PoveziDobavljaca(ctx context.Context, artikalID, dobavljacID int64) error {
|
||||||
|
_, err := r.db.ExecContext(ctx,
|
||||||
|
"INSERT OR IGNORE INTO artikal_dobavljac (artikal_id, dobavljac_id) VALUES (?, ?)", artikalID, dobavljacID)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("ntech: ArtikalRepo.PoveziDobavljaca: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SveDobavljaceArtikala vraća mapu artikal_id → lista dobavljac_id
|
||||||
|
func (r *ArtikalRepo) SveDobavljaceArtikala(ctx context.Context) (map[int64][]int64, error) {
|
||||||
|
redovi, err := r.db.QueryContext(ctx,
|
||||||
|
"SELECT artikal_id, dobavljac_id FROM artikal_dobavljac ORDER BY artikal_id")
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("ntech: ArtikalRepo.SveDobavljaceArtikala: %w", err)
|
||||||
|
}
|
||||||
|
defer redovi.Close()
|
||||||
|
|
||||||
|
mapa := make(map[int64][]int64)
|
||||||
|
for redovi.Next() {
|
||||||
|
var aid, did int64
|
||||||
|
if err := redovi.Scan(&aid, &did); err != nil {
|
||||||
|
return nil, fmt.Errorf("ntech: ArtikalRepo.SveDobavljaceArtikala: scan: %w", err)
|
||||||
|
}
|
||||||
|
mapa[aid] = append(mapa[aid], did)
|
||||||
|
}
|
||||||
|
return mapa, nil
|
||||||
|
}
|
||||||
|
|
||||||
// KorigujKolicinu postavlja novu količinu i upisuje korekciju u magacinske_promene
|
// KorigujKolicinu postavlja novu količinu i upisuje korekciju u magacinske_promene
|
||||||
func (r *ArtikalRepo) KorigujKolicinu(ctx context.Context, artikalID int64, novaKolicina int, korisnikID *int64, napomena string) error {
|
func (r *ArtikalRepo) KorigujKolicinu(ctx context.Context, artikalID int64, novaKolicina int, korisnikID *int64, napomena string) error {
|
||||||
tx, err := r.db.BeginTx(ctx, nil)
|
tx, err := r.db.BeginTx(ctx, nil)
|
||||||
|
|||||||
@@ -53,6 +53,15 @@ var sablonskeFunkcije = template.FuncMap{
|
|||||||
}
|
}
|
||||||
return fmt.Sprintf("%d", int64(math.Round(*v)))
|
return fmt.Sprintf("%d", int64(math.Round(*v)))
|
||||||
},
|
},
|
||||||
|
// dinari formatira iznos sa separatorom hiljada (tačka) i 2 decimale (zarez):
|
||||||
|
// 1234567.5 → "1.234.567,50"
|
||||||
|
"dinari": func(v float64) string {
|
||||||
|
return formatirajDinare(v, 2)
|
||||||
|
},
|
||||||
|
// dinariCeli formatira iznos sa separatorom hiljada, bez decimala: 1234567 → "1.234.567"
|
||||||
|
"dinariCeli": func(v float64) string {
|
||||||
|
return formatirajDinare(v, 0)
|
||||||
|
},
|
||||||
// statusPre vraća true ako je `a` pre `b` u redosledu statusa
|
// statusPre vraća true ako je `a` pre `b` u redosledu statusa
|
||||||
"statusPre": func(a, b string, statusi []string) bool {
|
"statusPre": func(a, b string, statusi []string) bool {
|
||||||
ia, ib := -1, -1
|
ia, ib := -1, -1
|
||||||
@@ -172,3 +181,41 @@ func (h *Handler) renderujStandalone(w http.ResponseWriter, ime string, podaci a
|
|||||||
http.Error(w, "Greška pri prikazu stranice", http.StatusInternalServerError)
|
http.Error(w, "Greška pri prikazu stranice", http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// formatirajDinare formatira broj sa tačkom kao separatorom hiljada i zarezom
|
||||||
|
// za decimale (srpski format). decimale = broj decimalnih mesta (0 ili 2).
|
||||||
|
func formatirajDinare(v float64, decimale int) string {
|
||||||
|
negativan := v < 0
|
||||||
|
if negativan {
|
||||||
|
v = -v
|
||||||
|
}
|
||||||
|
|
||||||
|
var ceoStr, decStr string
|
||||||
|
if decimale == 2 {
|
||||||
|
// radi u stotinkama da zaokruživanje pravilno prenese (npr. 1234567.999 → 1.234.568,00)
|
||||||
|
stotinke := int64(math.Round(v * 100))
|
||||||
|
ceoStr = fmt.Sprintf("%d", stotinke/100)
|
||||||
|
decStr = fmt.Sprintf("%02d", stotinke%100)
|
||||||
|
} else {
|
||||||
|
ceoStr = fmt.Sprintf("%d", int64(math.Round(v)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ubaci tačke na svake 3 cifre s desna
|
||||||
|
var sb []byte
|
||||||
|
n := len(ceoStr)
|
||||||
|
for i, c := range ceoStr {
|
||||||
|
if i > 0 && (n-i)%3 == 0 {
|
||||||
|
sb = append(sb, '.')
|
||||||
|
}
|
||||||
|
sb = append(sb, byte(c))
|
||||||
|
}
|
||||||
|
rezultat := string(sb)
|
||||||
|
|
||||||
|
if decimale == 2 {
|
||||||
|
rezultat += "," + decStr
|
||||||
|
}
|
||||||
|
if negativan {
|
||||||
|
rezultat = "-" + rezultat
|
||||||
|
}
|
||||||
|
return rezultat
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ type PodaciFormeArtikla struct {
|
|||||||
Artikal model.Artikal
|
Artikal model.Artikal
|
||||||
Kategorije []model.Kategorija
|
Kategorije []model.Kategorija
|
||||||
KategorijaIDStr string
|
KategorijaIDStr string
|
||||||
|
Dobavljaci []model.Dobavljac // svi dobavljači za izbor
|
||||||
|
IzabraniDobavljaci map[int64]bool // dobavljači vezani za artikal (za checked stanje)
|
||||||
Greska string
|
Greska string
|
||||||
Izmena bool
|
Izmena bool
|
||||||
}
|
}
|
||||||
@@ -45,12 +47,15 @@ func (h *Handler) NoviArtikal(w http.ResponseWriter, r *http.Request) {
|
|||||||
predlogSifre = "ART-0001"
|
predlogSifre = "ART-0001"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dobavljaci, _ := h.DobavljaciRepo.Lista(r.Context(), "")
|
||||||
|
|
||||||
ps := h.popuniPodaciStranice(r, podesavanja)
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
||||||
ps.Stranica = "magacin"
|
ps.Stranica = "magacin"
|
||||||
ps.NaslovStranice = "Novi artikal"
|
ps.NaslovStranice = "Novi artikal"
|
||||||
h.renderujFormuArtikla(w, PodaciFormeArtikla{
|
h.renderujFormuArtikla(w, PodaciFormeArtikla{
|
||||||
PodaciStranice: ps,
|
PodaciStranice: ps,
|
||||||
Kategorije: kategorije,
|
Kategorije: kategorije,
|
||||||
|
Dobavljaci: dobavljaci,
|
||||||
Artikal: model.Artikal{Sifra: predlogSifre, Tip: model.TipProizvod, JedinicaMere: "kom"},
|
Artikal: model.Artikal{Sifra: predlogSifre, Tip: model.TipProizvod, JedinicaMere: "kom"},
|
||||||
Izmena: false,
|
Izmena: false,
|
||||||
})
|
})
|
||||||
@@ -72,6 +77,7 @@ func (h *Handler) SacuvajArtikal(w http.ResponseWriter, r *http.Request) {
|
|||||||
if greska != "" {
|
if greska != "" {
|
||||||
podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
||||||
kategorije, _ := h.KategorijeRepo.Lista(r.Context())
|
kategorije, _ := h.KategorijeRepo.Lista(r.Context())
|
||||||
|
dobavljaci, _ := h.DobavljaciRepo.Lista(r.Context(), "")
|
||||||
katIDStr := ""
|
katIDStr := ""
|
||||||
if artikal.KategorijaID != nil {
|
if artikal.KategorijaID != nil {
|
||||||
katIDStr = strconv.FormatInt(*artikal.KategorijaID, 10)
|
katIDStr = strconv.FormatInt(*artikal.KategorijaID, 10)
|
||||||
@@ -84,6 +90,8 @@ func (h *Handler) SacuvajArtikal(w http.ResponseWriter, r *http.Request) {
|
|||||||
Artikal: artikal,
|
Artikal: artikal,
|
||||||
Kategorije: kategorije,
|
Kategorije: kategorije,
|
||||||
KategorijaIDStr: katIDStr,
|
KategorijaIDStr: katIDStr,
|
||||||
|
Dobavljaci: dobavljaci,
|
||||||
|
IzabraniDobavljaci: mapaDobavljaca(citajDobavljaceForme(r)),
|
||||||
Greska: greska,
|
Greska: greska,
|
||||||
Izmena: false,
|
Izmena: false,
|
||||||
})
|
})
|
||||||
@@ -108,6 +116,11 @@ func (h *Handler) SacuvajArtikal(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
artikal.ID = id
|
artikal.ID = id
|
||||||
|
|
||||||
|
// veži izabrane dobavljače (forma); modal nema to polje pa ostaje prazno
|
||||||
|
if e := h.Artikli.PostaviDobavljaceArtikla(r.Context(), id, citajDobavljaceForme(r)); e != nil {
|
||||||
|
slog.Error("čuvanje dobavljača artikla nije uspelo", "artikal_id", id, "error", e)
|
||||||
|
}
|
||||||
|
|
||||||
// fetch zahtev (iz modala) dobija JSON sa ID-em i nazivom novog artikla
|
// fetch zahtev (iz modala) dobija JSON sa ID-em i nazivom novog artikla
|
||||||
if r.Header.Get("X-Requested-With") == "fetch" {
|
if r.Header.Get("X-Requested-With") == "fetch" {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
@@ -150,6 +163,14 @@ func (h *Handler) IzmeniArtikal(w http.ResponseWriter, r *http.Request) {
|
|||||||
katIDStr = strconv.FormatInt(*artikal.KategorijaID, 10)
|
katIDStr = strconv.FormatInt(*artikal.KategorijaID, 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dobavljaci, _ := h.DobavljaciRepo.Lista(r.Context(), "")
|
||||||
|
izabrani := map[int64]bool{}
|
||||||
|
if ids, e := h.Artikli.DobavljaciArtikla(r.Context(), id); e == nil {
|
||||||
|
for _, did := range ids {
|
||||||
|
izabrani[did] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ps := h.popuniPodaciStranice(r, podesavanja)
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
||||||
ps.Stranica = "magacin"
|
ps.Stranica = "magacin"
|
||||||
ps.NaslovStranice = "Izmeni artikal"
|
ps.NaslovStranice = "Izmeni artikal"
|
||||||
@@ -158,6 +179,8 @@ func (h *Handler) IzmeniArtikal(w http.ResponseWriter, r *http.Request) {
|
|||||||
Artikal: *artikal,
|
Artikal: *artikal,
|
||||||
Kategorije: kategorije,
|
Kategorije: kategorije,
|
||||||
KategorijaIDStr: katIDStr,
|
KategorijaIDStr: katIDStr,
|
||||||
|
Dobavljaci: dobavljaci,
|
||||||
|
IzabraniDobavljaci: izabrani,
|
||||||
Izmena: true,
|
Izmena: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -185,6 +208,7 @@ func (h *Handler) SacuvajIzmenuArtikla(w http.ResponseWriter, r *http.Request) {
|
|||||||
if greska != "" {
|
if greska != "" {
|
||||||
podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
||||||
kategorije, _ := h.KategorijeRepo.Lista(r.Context())
|
kategorije, _ := h.KategorijeRepo.Lista(r.Context())
|
||||||
|
dobavljaci, _ := h.DobavljaciRepo.Lista(r.Context(), "")
|
||||||
artikal.ID = id
|
artikal.ID = id
|
||||||
katIDStr := ""
|
katIDStr := ""
|
||||||
if artikal.KategorijaID != nil {
|
if artikal.KategorijaID != nil {
|
||||||
@@ -198,6 +222,8 @@ func (h *Handler) SacuvajIzmenuArtikla(w http.ResponseWriter, r *http.Request) {
|
|||||||
Artikal: artikal,
|
Artikal: artikal,
|
||||||
Kategorije: kategorije,
|
Kategorije: kategorije,
|
||||||
KategorijaIDStr: katIDStr,
|
KategorijaIDStr: katIDStr,
|
||||||
|
Dobavljaci: dobavljaci,
|
||||||
|
IzabraniDobavljaci: mapaDobavljaca(citajDobavljaceForme(r)),
|
||||||
Greska: greska,
|
Greska: greska,
|
||||||
Izmena: true,
|
Izmena: true,
|
||||||
})
|
})
|
||||||
@@ -223,6 +249,11 @@ func (h *Handler) SacuvajIzmenuArtikla(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ažuriraj dobavljače artikla prema formi
|
||||||
|
if e := h.Artikli.PostaviDobavljaceArtikla(r.Context(), id, citajDobavljaceForme(r)); e != nil {
|
||||||
|
slog.Error("čuvanje dobavljača artikla nije uspelo", "artikal_id", id, "error", e)
|
||||||
|
}
|
||||||
|
|
||||||
// ako se prodajna cena promenila, automatski upiši nivelacioni zapis (izvor "izmena")
|
// ako se prodajna cena promenila, automatski upiši nivelacioni zapis (izvor "izmena")
|
||||||
if razlika := artikal.ProdajnaCena - staraCena; razlika > 0.005 || razlika < -0.005 {
|
if razlika := artikal.ProdajnaCena - staraCena; razlika > 0.005 || razlika < -0.005 {
|
||||||
korisnikID := &k.ID
|
korisnikID := &k.ID
|
||||||
@@ -240,6 +271,26 @@ func (h *Handler) SacuvajIzmenuArtikla(w http.ResponseWriter, r *http.Request) {
|
|||||||
http.Redirect(w, r, "/magacin?sacuvano=1", http.StatusSeeOther)
|
http.Redirect(w, r, "/magacin?sacuvano=1", http.StatusSeeOther)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mapaDobavljaca pretvara listu ID-jeva u mapu za checked stanje u formi
|
||||||
|
func mapaDobavljaca(ids []int64) map[int64]bool {
|
||||||
|
m := make(map[int64]bool, len(ids))
|
||||||
|
for _, id := range ids {
|
||||||
|
m[id] = true
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// citajDobavljaceForme čita izabrane dobavljače (checkbox dobavljaci[]) iz forme
|
||||||
|
func citajDobavljaceForme(r *http.Request) []int64 {
|
||||||
|
var ids []int64
|
||||||
|
for _, v := range r.Form["dobavljaci"] {
|
||||||
|
if id, e := strconv.ParseInt(strings.TrimSpace(v), 10, 64); e == nil {
|
||||||
|
ids = append(ids, id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ids
|
||||||
|
}
|
||||||
|
|
||||||
// parseFormuArtikla čita polja iz forme i vraća artikal i eventualnu grešku
|
// parseFormuArtikla čita polja iz forme i vraća artikal i eventualnu grešku
|
||||||
func parseFormuArtikla(r *http.Request) (model.Artikal, string) {
|
func parseFormuArtikla(r *http.Request) (model.Artikal, string) {
|
||||||
naziv := r.FormValue("naziv")
|
naziv := r.FormValue("naziv")
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ type PodaciDetaljiNabavke struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// artikalUJSON pretvara listu artikala u template.JS vrednost bezbednu za umetanje u <script> tag
|
// artikalUJSON pretvara listu artikala u template.JS vrednost bezbednu za umetanje u <script> tag
|
||||||
func artikalUJSON(artikli []model.ArtikalSaKategorijom) template.JS {
|
func artikalUJSON(artikli []model.ArtikalSaKategorijom, vezeDobavljaca map[int64][]int64) template.JS {
|
||||||
type stavka struct {
|
type stavka struct {
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
Naziv string `json:"naziv"`
|
Naziv string `json:"naziv"`
|
||||||
@@ -54,13 +54,19 @@ func artikalUJSON(artikli []model.ArtikalSaKategorijom) template.JS {
|
|||||||
NabavnaCena float64 `json:"nabavna_cena"` // poslednja nabavna cena — predlog za Cena/kom
|
NabavnaCena float64 `json:"nabavna_cena"` // poslednja nabavna cena — predlog za Cena/kom
|
||||||
Marza *float64 `json:"marza"` // marža artikla; null = nije postavljeno
|
Marza *float64 `json:"marza"` // marža artikla; null = nije postavljeno
|
||||||
KategorijaMarza *float64 `json:"kategorija_marza"` // marža kategorije; fallback ako artikal nema
|
KategorijaMarza *float64 `json:"kategorija_marza"` // marža kategorije; fallback ako artikal nema
|
||||||
|
Dobavljaci []int64 `json:"dobavljaci"` // ID-jevi dobavljača koji isporučuju artikal
|
||||||
}
|
}
|
||||||
lista := make([]stavka, 0, len(artikli))
|
lista := make([]stavka, 0, len(artikli))
|
||||||
for _, a := range artikli {
|
for _, a := range artikli {
|
||||||
|
dob := vezeDobavljaca[a.ID]
|
||||||
|
if dob == nil {
|
||||||
|
dob = []int64{}
|
||||||
|
}
|
||||||
lista = append(lista, stavka{
|
lista = append(lista, stavka{
|
||||||
ID: a.ID, Naziv: a.Naziv, PdvStopa: a.PdvStopa,
|
ID: a.ID, Naziv: a.Naziv, PdvStopa: a.PdvStopa,
|
||||||
NabavnaCena: a.NabavnaCena,
|
NabavnaCena: a.NabavnaCena,
|
||||||
Marza: a.Marza, KategorijaMarza: a.KategorijaMarza,
|
Marza: a.Marza, KategorijaMarza: a.KategorijaMarza,
|
||||||
|
Dobavljaci: dob,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
b, _ := json.Marshal(lista)
|
b, _ := json.Marshal(lista)
|
||||||
@@ -120,13 +126,15 @@ func (h *Handler) NovaNabavka(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
veze, _ := h.Artikli.SveDobavljaceArtikala(r.Context())
|
||||||
|
|
||||||
ps := h.popuniPodaciStranice(r, podesavanja)
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
||||||
ps.Stranica = "nabavke"
|
ps.Stranica = "nabavke"
|
||||||
ps.NaslovStranice = "Nova nabavka"
|
ps.NaslovStranice = "Nova nabavka"
|
||||||
h.renderujFormuNabavke(w, PodaciFormeNabavke{
|
h.renderujFormuNabavke(w, PodaciFormeNabavke{
|
||||||
PodaciStranice: ps,
|
PodaciStranice: ps,
|
||||||
Artikli: artikli,
|
Artikli: artikli,
|
||||||
ArtikliJSON: artikalUJSON(artikli),
|
ArtikliJSON: artikalUJSON(artikli, veze),
|
||||||
Dobavljaci: dobavljaci,
|
Dobavljaci: dobavljaci,
|
||||||
Kategorije: kategorije,
|
Kategorije: kategorije,
|
||||||
Marza: vrednostIliDefault(podesavanja, "kalkulacija_marza", "20"),
|
Marza: vrednostIliDefault(podesavanja, "kalkulacija_marza", "20"),
|
||||||
@@ -151,13 +159,14 @@ func (h *Handler) SacuvajNabavku(w http.ResponseWriter, r *http.Request) {
|
|||||||
artikli, _ := h.Artikli.Lista(r.Context(), db.ArtikalFilter{})
|
artikli, _ := h.Artikli.Lista(r.Context(), db.ArtikalFilter{})
|
||||||
dobavljaci, _ := h.DobavljaciRepo.Lista(r.Context(), "")
|
dobavljaci, _ := h.DobavljaciRepo.Lista(r.Context(), "")
|
||||||
kategorije, _ := h.KategorijeRepo.Lista(r.Context())
|
kategorije, _ := h.KategorijeRepo.Lista(r.Context())
|
||||||
|
veze, _ := h.Artikli.SveDobavljaceArtikala(r.Context())
|
||||||
ps := h.popuniPodaciStranice(r, podesavanja)
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
||||||
ps.Stranica = "nabavke"
|
ps.Stranica = "nabavke"
|
||||||
ps.NaslovStranice = "Nova nabavka"
|
ps.NaslovStranice = "Nova nabavka"
|
||||||
h.renderujFormuNabavke(w, PodaciFormeNabavke{
|
h.renderujFormuNabavke(w, PodaciFormeNabavke{
|
||||||
PodaciStranice: ps,
|
PodaciStranice: ps,
|
||||||
Artikli: artikli,
|
Artikli: artikli,
|
||||||
ArtikliJSON: artikalUJSON(artikli),
|
ArtikliJSON: artikalUJSON(artikli, veze),
|
||||||
Dobavljaci: dobavljaci,
|
Dobavljaci: dobavljaci,
|
||||||
Kategorije: kategorije,
|
Kategorije: kategorije,
|
||||||
Marza: vrednostIliDefault(podesavanja, "kalkulacija_marza", "20"),
|
Marza: vrednostIliDefault(podesavanja, "kalkulacija_marza", "20"),
|
||||||
@@ -243,6 +252,15 @@ func (h *Handler) SacuvajNabavku(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// auto-veza artikal–dobavljač: svaki nabavljeni artikal se veže za dobavljača nabavke
|
||||||
|
if nabavka.DobavljacID != nil {
|
||||||
|
for _, s := range stavke {
|
||||||
|
if e := h.Artikli.PoveziDobavljaca(r.Context(), s.ArtikalID, *nabavka.DobavljacID); e != nil {
|
||||||
|
slog.Error("auto-veza dobavljača nije upisana", "artikal_id", s.ArtikalID, "error", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
http.Redirect(w, r, "/nabavke/"+strconv.FormatInt(id, 10)+"?sacuvano=1", http.StatusSeeOther)
|
http.Redirect(w, r, "/nabavke/"+strconv.FormatInt(id, 10)+"?sacuvano=1", http.StatusSeeOther)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+24
-2
@@ -188,6 +188,8 @@ document.addEventListener('alpine:init', () => {
|
|||||||
Alpine.data('nabavkaForma', () => ({
|
Alpine.data('nabavkaForma', () => ({
|
||||||
stavke: [{artikal_id: '', kolicina: 1, cena: 0, marza: 0, prodajna: 0}],
|
stavke: [{artikal_id: '', kolicina: 1, cena: 0, marza: 0, prodajna: 0}],
|
||||||
artikliOpcije: [],
|
artikliOpcije: [],
|
||||||
|
dobavljacId: '', // izabrani dobavljač nabavke — filtrira listu artikala
|
||||||
|
prikaziSveArtikle: false, // true = prikaži sve artikle, ne samo dobavljačeve
|
||||||
marzaDefault: 0,
|
marzaDefault: 0,
|
||||||
troskovi: [], // zavisni troškovi {naziv, iznos}
|
troskovi: [], // zavisni troškovi {naziv, iznos}
|
||||||
metodRaspodele: 'vrednost', // 'vrednost' ili 'kolicina'
|
metodRaspodele: 'vrednost', // 'vrednost' ili 'kolicina'
|
||||||
@@ -226,9 +228,21 @@ document.addEventListener('alpine:init', () => {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
dodajStavku() {
|
dodajStavku() {
|
||||||
|
// ne dozvoli novu stavku dok poslednja nema izabran artikal
|
||||||
|
const poslednja = this.stavke[this.stavke.length - 1]
|
||||||
|
if (poslednja && !poslednja.artikal_id) {
|
||||||
|
if (window.ntechToast) window.ntechToast('Prvo izaberi artikal u poslednjoj stavci.', 'greska')
|
||||||
|
return
|
||||||
|
}
|
||||||
this.stavke.push({artikal_id: '', kolicina: 1, cena: 0, marza: this.marzaDefault, prodajna: 0})
|
this.stavke.push({artikal_id: '', kolicina: 1, cena: 0, marza: this.marzaDefault, prodajna: 0})
|
||||||
this.preracunajSve()
|
this.preracunajSve()
|
||||||
},
|
},
|
||||||
|
// artikli za prikaz u stavkama: bez dobavljača (ili uz "prikaži sve") svi, inače samo njegovi
|
||||||
|
artikliZaDobavljaca() {
|
||||||
|
if (!this.dobavljacId || this.prikaziSveArtikle) return this.artikliOpcije
|
||||||
|
const did = Number(this.dobavljacId)
|
||||||
|
return this.artikliOpcije.filter(a => Array.isArray(a.dobavljaci) && a.dobavljaci.includes(did))
|
||||||
|
},
|
||||||
// PDV stopa izabranog artikla (iz JSON liste) — za obračun prodajne cene.
|
// PDV stopa izabranog artikla (iz JSON liste) — za obračun prodajne cene.
|
||||||
// Ako firma nije PDV obveznik, PDV se ne dodaje na prodajnu cenu (stopa = 0).
|
// Ako firma nije PDV obveznik, PDV se ne dodaje na prodajnu cenu (stopa = 0).
|
||||||
pdvStopa(artikalId) {
|
pdvStopa(artikalId) {
|
||||||
@@ -299,7 +313,12 @@ document.addEventListener('alpine:init', () => {
|
|||||||
this.preracunajSve()
|
this.preracunajSve()
|
||||||
},
|
},
|
||||||
ukloniStavku(i) {
|
ukloniStavku(i) {
|
||||||
if (this.stavke.length > 1) this.stavke.splice(i, 1)
|
if (this.stavke.length > 1) {
|
||||||
|
this.stavke.splice(i, 1)
|
||||||
|
} else {
|
||||||
|
// poslednja stavka — ne brišemo red nego ga resetujemo na prazno
|
||||||
|
this.stavke[0] = {artikal_id: '', kolicina: 1, cena: 0, marza: this.marzaDefault, prodajna: 0}
|
||||||
|
}
|
||||||
this.preracunajSve()
|
this.preracunajSve()
|
||||||
},
|
},
|
||||||
ukupnoStavke(s) {
|
ukupnoStavke(s) {
|
||||||
@@ -354,7 +373,10 @@ document.addEventListener('alpine:init', () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
const noviArtikal = await odgovor.json()
|
const noviArtikal = await odgovor.json()
|
||||||
this.artikliOpcije.push({id: noviArtikal.id, naziv: noviArtikal.naziv})
|
// veži novi artikal za izabranog dobavljača da se odmah prikaže u filtriranoj listi
|
||||||
|
// (veza se trajno upisuje u bazu pri čuvanju nabavke — auto-veza)
|
||||||
|
const dob = this.dobavljacId ? [Number(this.dobavljacId)] : []
|
||||||
|
this.artikliOpcije.push({id: noviArtikal.id, naziv: noviArtikal.naziv, dobavljaci: dob})
|
||||||
this.zatvoriModal()
|
this.zatvoriModal()
|
||||||
} catch {
|
} catch {
|
||||||
this.modalGreska = 'Greška pri komunikaciji sa serverom.'
|
this.modalGreska = 'Greška pri komunikaciji sa serverom.'
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
<path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6" />
|
<path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6" />
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div style="font-size:22px;font-weight:500;color:var(--tekst-glavni);">{{ printf "%.0f" .PrihodOvogMeseca }} din</div>
|
<div style="font-size:22px;font-weight:500;color:var(--tekst-glavni);">{{ dinariCeli .PrihodOvogMeseca }} din</div>
|
||||||
<div style="font-size:14px;color:var(--tekst-glavni);margin-top:4px;font-weight:500;">Prihod ovog meseca</div>
|
<div style="font-size:14px;color:var(--tekst-glavni);margin-top:4px;font-weight:500;">Prihod ovog meseca</div>
|
||||||
</a>
|
</a>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
<div style="text-align:right;flex-shrink:0;">
|
<div style="text-align:right;flex-shrink:0;">
|
||||||
<div style="font-size:13px;font-weight:500;color:var(--tekst-glavni);">{{ printf "%.0f" .Ukupno }} din</div>
|
<div style="font-size:13px;font-weight:500;color:var(--tekst-glavni);">{{ dinariCeli .Ukupno }} din</div>
|
||||||
<div style="font-size:11px;color:var(--tekst-sporedni);margin-top:1px;">{{ .Datum }}</div>
|
<div style="font-size:11px;color:var(--tekst-sporedni);margin-top:1px;">{{ .Datum }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -61,13 +61,13 @@
|
|||||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||||
<td style="padding:8px 12px;font-size:13px;color:var(--tekst-glavni);">{{.MesecPrikaz}}</td>
|
<td style="padding:8px 12px;font-size:13px;color:var(--tekst-glavni);">{{.MesecPrikaz}}</td>
|
||||||
<td style="padding:8px 12px;text-align:right;font-size:13px;color:var(--tekst-sporedni);">
|
<td style="padding:8px 12px;text-align:right;font-size:13px;color:var(--tekst-sporedni);">
|
||||||
{{if gt .Prodaja 0.0}}{{printf "%.0f" .Prodaja}} din{{else}}—{{end}}
|
{{if gt .Prodaja 0.0}}{{dinariCeli .Prodaja}} din{{else}}—{{end}}
|
||||||
</td>
|
</td>
|
||||||
<td style="padding:8px 12px;text-align:right;font-size:13px;color:var(--tekst-sporedni);">
|
<td style="padding:8px 12px;text-align:right;font-size:13px;color:var(--tekst-sporedni);">
|
||||||
{{if gt .Servis 0.0}}{{printf "%.0f" .Servis}} din{{else}}—{{end}}
|
{{if gt .Servis 0.0}}{{dinariCeli .Servis}} din{{else}}—{{end}}
|
||||||
</td>
|
</td>
|
||||||
<td style="padding:8px 12px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-glavni);">
|
<td style="padding:8px 12px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-glavni);">
|
||||||
{{if gt .Ukupno 0.0}}{{printf "%.0f" .Ukupno}} din{{else}}—{{end}}
|
{{if gt .Ukupno 0.0}}{{dinariCeli .Ukupno}} din{{else}}—{{end}}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
@@ -145,7 +145,7 @@
|
|||||||
<div style="font-size:11px;color:var(--tekst-sporedni);margin-top:1px;">{{.Kategorija}}</div>
|
<div style="font-size:11px;color:var(--tekst-sporedni);margin-top:1px;">{{.Kategorija}}</div>
|
||||||
</td>
|
</td>
|
||||||
<td style="padding:7px 8px;text-align:right;font-size:13px;color:var(--tekst-glavni);">{{.UkupnoKolicina}}</td>
|
<td style="padding:7px 8px;text-align:right;font-size:13px;color:var(--tekst-glavni);">{{.UkupnoKolicina}}</td>
|
||||||
<td style="padding:7px 8px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-glavni);">{{printf "%.0f" .UkupnoPrihod}} din</td>
|
<td style="padding:7px 8px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-glavni);">{{dinariCeli .UkupnoPrihod}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
</td>
|
</td>
|
||||||
<td style="padding:7px 8px;font-size:13px;color:var(--tekst-glavni);">{{.Naziv}}</td>
|
<td style="padding:7px 8px;font-size:13px;color:var(--tekst-glavni);">{{.Naziv}}</td>
|
||||||
<td style="padding:7px 8px;text-align:right;font-size:13px;color:var(--tekst-sporedni);">{{.BrojNaloga}}</td>
|
<td style="padding:7px 8px;text-align:right;font-size:13px;color:var(--tekst-sporedni);">{{.BrojNaloga}}</td>
|
||||||
<td style="padding:7px 8px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-glavni);">{{printf "%.0f" .UkupnoVrednost}} din</td>
|
<td style="padding:7px 8px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-glavni);">{{dinariCeli .UkupnoVrednost}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
@@ -101,7 +101,7 @@
|
|||||||
<span style="font-size:12px;color:var(--tekst-sporedni);">{{if eq .Tip "usluga"}}usluga{{else}}trošak{{end}}</span>
|
<span style="font-size:12px;color:var(--tekst-sporedni);">{{if eq .Tip "usluga"}}usluga{{else}}trošak{{end}}</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
</td>
|
</td>
|
||||||
<td style="padding:12px 16px;text-align:right;font-size:14px;color:var(--tekst-glavni);">{{printf "%.0f" .ProdajnaCena}} din</td>
|
<td style="padding:12px 16px;text-align:right;font-size:14px;color:var(--tekst-glavni);">{{dinariCeli .ProdajnaCena}} din</td>
|
||||||
<td style="padding:12px 16px;font-size:13px;color:var(--tekst-sporedni);">
|
<td style="padding:12px 16px;font-size:13px;color:var(--tekst-sporedni);">
|
||||||
{{if .Lokacija}}{{.Lokacija}}{{else}}—{{end}}
|
{{if .Lokacija}}{{.Lokacija}}{{else}}—{{end}}
|
||||||
</td>
|
</td>
|
||||||
@@ -192,7 +192,7 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
<div class="pomocni-tekst">
|
<div class="pomocni-tekst">
|
||||||
<span style="color:var(--tekst-glavni);font-weight:500;">Cena:</span> {{printf "%.0f" .ProdajnaCena}} din
|
<span style="color:var(--tekst-glavni);font-weight:500;">Cena:</span> {{dinariCeli .ProdajnaCena}} din
|
||||||
</div>
|
</div>
|
||||||
{{if .Lokacija}}
|
{{if .Lokacija}}
|
||||||
<div class="pomocni-tekst">
|
<div class="pomocni-tekst">
|
||||||
@@ -287,7 +287,7 @@ document.body.addEventListener('htmx:afterSwap', function (e) {
|
|||||||
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">×</button>
|
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">×</button>
|
||||||
</form>
|
</form>
|
||||||
<form method="POST" action="/magacin/promeni-cenu/{{.ID}}" style="display:flex;flex-direction:column;gap:12px;padding:16px;">
|
<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 style="font-size:13px;color:var(--tekst-sporedni);">Trenutna cena: <strong>{{dinariCeli .Cena}} din</strong></div>
|
||||||
<div>
|
<div>
|
||||||
<label class="polje-labela">Nova cena (din)</label>
|
<label class="polje-labela">Nova cena (din)</label>
|
||||||
<input type="number" name="nova_cena" min="0" step="0.01" value="{{printf "%.2f" .Cena}}" required
|
<input type="number" name="nova_cena" min="0" step="0.01" value="{{printf "%.2f" .Cena}}" required
|
||||||
|
|||||||
@@ -128,6 +128,22 @@
|
|||||||
placeholder="prazno = po kategoriji / globalna">
|
placeholder="prazno = po kategoriji / globalna">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- dobavljači koji isporučuju artikal -->
|
||||||
|
{{if .Dobavljaci}}
|
||||||
|
<div>
|
||||||
|
<label class="polje-labela">Dobavljači</label>
|
||||||
|
<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:6px;padding:10px 12px;border:0.5px solid var(--ivica);border-radius:8px;">
|
||||||
|
{{range .Dobavljaci}}
|
||||||
|
<label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;padding:4px 2px;">
|
||||||
|
<input type="checkbox" name="dobavljaci" value="{{.ID}}" {{if index $.IzabraniDobavljaci .ID}}checked{{end}} style="flex-shrink:0;">
|
||||||
|
<span style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">{{.Naziv}}</span>
|
||||||
|
</label>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div class="pomocni-tekst" style="margin-top:4px;">Određuje koje artikle dobavljač nudi pri nabavci.</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
<!-- lokacija (samo za proizvode) -->
|
<!-- lokacija (samo za proizvode) -->
|
||||||
<div data-lager>
|
<div data-lager>
|
||||||
<label class="polje-labela">Lokacija u magacinu</label>
|
<label class="polje-labela">Lokacija u magacinu</label>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Ukupan iznos</div>
|
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Ukupan iznos</div>
|
||||||
<div style="font-size:20px;font-weight:600;color:var(--sb-akcent);">
|
<div style="font-size:20px;font-weight:600;color:var(--sb-akcent);">
|
||||||
{{printf "%.2f" .Nabavka.Ukupno}} din
|
{{dinari .Nabavka.Ukupno}} din
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -71,8 +71,8 @@
|
|||||||
<tr class="animiraj red-tabele">
|
<tr class="animiraj red-tabele">
|
||||||
<td style="padding:10px 16px;font-size:14px;color:var(--tekst-glavni);">{{.ArtikalNaziv}}</td>
|
<td style="padding:10px 16px;font-size:14px;color:var(--tekst-glavni);">{{.ArtikalNaziv}}</td>
|
||||||
<td style="padding:10px 16px;text-align:center;font-size:14px;color:var(--tekst-glavni);">{{.Kolicina}}</td>
|
<td style="padding:10px 16px;text-align:center;font-size:14px;color:var(--tekst-glavni);">{{.Kolicina}}</td>
|
||||||
<td style="padding:10px 16px;text-align:right;font-size:14px;color:var(--tekst-sporedni);">{{printf "%.2f" .CenaPoKomadu}} din</td>
|
<td style="padding:10px 16px;text-align:right;font-size:14px;color:var(--tekst-sporedni);">{{dinari .CenaPoKomadu}} din</td>
|
||||||
<td style="padding:10px 16px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{printf "%.2f" .Ukupno}} din</td>
|
<td style="padding:10px 16px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{else}}
|
{{else}}
|
||||||
<tr>
|
<tr>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<tfoot>
|
<tfoot>
|
||||||
<tr style="border-top:0.5px solid var(--ivica);">
|
<tr style="border-top:0.5px solid var(--ivica);">
|
||||||
<td colspan="3" style="padding:10px 16px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-sporedni);">Ukupno:</td>
|
<td colspan="3" style="padding:10px 16px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-sporedni);">Ukupno:</td>
|
||||||
<td style="padding:10px 16px;text-align:right;font-size:15px;font-weight:600;color:var(--tekst-glavni);">{{printf "%.2f" .Nabavka.Ukupno}} din</td>
|
<td style="padding:10px 16px;text-align:right;font-size:15px;font-weight:600;color:var(--tekst-glavni);">{{dinari .Nabavka.Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
{{end}}
|
{{end}}
|
||||||
@@ -105,18 +105,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div style="font-size:11px;color:var(--tekst-sporedni);">Cena/kom</div>
|
<div style="font-size:11px;color:var(--tekst-sporedni);">Cena/kom</div>
|
||||||
<div style="font-size:14px;color:var(--tekst-sporedni);">{{printf "%.2f" .CenaPoKomadu}} din</div>
|
<div style="font-size:14px;color:var(--tekst-sporedni);">{{dinari .CenaPoKomadu}} din</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="text-align:right;">
|
<div style="text-align:right;">
|
||||||
<div style="font-size:11px;color:var(--tekst-sporedni);">Ukupno</div>
|
<div style="font-size:11px;color:var(--tekst-sporedni);">Ukupno</div>
|
||||||
<div style="font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{printf "%.2f" .Ukupno}} din</div>
|
<div style="font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .Ukupno}} din</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if .Stavke}}
|
{{if .Stavke}}
|
||||||
<div style="text-align:right;font-size:15px;font-weight:600;color:var(--tekst-glavni);padding:8px 4px;">
|
<div style="text-align:right;font-size:15px;font-weight:600;color:var(--tekst-glavni);padding:8px 4px;">
|
||||||
Ukupno: {{printf "%.2f" .Nabavka.Ukupno}} din
|
Ukupno: {{dinari .Nabavka.Ukupno}} din
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
@@ -135,12 +135,12 @@
|
|||||||
{{range .Troskovi}}
|
{{range .Troskovi}}
|
||||||
<div style="display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:0.5px solid var(--ivica);">
|
<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-glavni);">{{.Naziv}}</span>
|
||||||
<span style="font-size:14px;color:var(--tekst-sporedni);">{{printf "%.2f" .Iznos}} din</span>
|
<span style="font-size:14px;color:var(--tekst-sporedni);">{{dinari .Iznos}} din</span>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
<div style="display:flex;justify-content:space-between;align-items:center;padding:10px 0;">
|
<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: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>
|
<span style="font-size:15px;font-weight:600;color:var(--tekst-glavni);">{{dinari .UkupanTrosak}} din</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -47,12 +47,19 @@
|
|||||||
+ Novi dobavljač
|
+ Novi dobavljač
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<select name="dobavljac_id" x-ref="selDobavljac" style="width:100%;">
|
<select name="dobavljac_id" x-ref="selDobavljac" x-model="dobavljacId" style="width:100%;">
|
||||||
<option value="">— bez dobavljača —</option>
|
<option value="">— bez dobavljača —</option>
|
||||||
{{range .Dobavljaci}}
|
{{range .Dobavljaci}}
|
||||||
<option value="{{.ID}}">{{.Naziv}}</option>
|
<option value="{{.ID}}">{{.Naziv}}</option>
|
||||||
{{end}}
|
{{end}}
|
||||||
</select>
|
</select>
|
||||||
|
<label x-show="dobavljacId" style="display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;margin-top:8px;color:var(--tekst-sporedni);">
|
||||||
|
<input type="checkbox" x-model="prikaziSveArtikle">
|
||||||
|
Prikaži sve artikle (ne samo dobavljačeve)
|
||||||
|
</label>
|
||||||
|
<div x-show="dobavljacId && prikaziSveArtikle" class="pomocni-tekst" style="margin-top:4px;">
|
||||||
|
Napomena: izabrani artikal koji nije od ovog dobavljača biće mu dodat pri čuvanju nabavke.
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="polje-labela">Napomena</label>
|
<label class="polje-labela">Napomena</label>
|
||||||
@@ -73,9 +80,6 @@
|
|||||||
onmouseover="this.style.background='var(--pozadina)'" onmouseout="this.style.background='var(--kartica)'">
|
onmouseover="this.style.background='var(--pozadina)'" onmouseout="this.style.background='var(--kartica)'">
|
||||||
+ Novi artikal
|
+ Novi artikal
|
||||||
</button>
|
</button>
|
||||||
<button type="button" @click="dodajStavku()" class="btn-primarno" style="font-size:13px;padding:6px 14px;">
|
|
||||||
+ Dodaj stavku
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -100,7 +104,7 @@
|
|||||||
<select :name="'artikal_id[]'" x-model="stavka.artikal_id"
|
<select :name="'artikal_id[]'" x-model="stavka.artikal_id"
|
||||||
@change="izaberiArtikal(stavka)" :disabled="isMobile" style="width:100%;">
|
@change="izaberiArtikal(stavka)" :disabled="isMobile" style="width:100%;">
|
||||||
<option value="">— odaberi artikal —</option>
|
<option value="">— odaberi artikal —</option>
|
||||||
<template x-for="a in artikliOpcije" :key="a.id">
|
<template x-for="a in artikliZaDobavljaca()" :key="a.id">
|
||||||
<option :value="a.id" x-text="a.naziv"></option>
|
<option :value="a.id" x-text="a.naziv"></option>
|
||||||
</template>
|
</template>
|
||||||
</select>
|
</select>
|
||||||
@@ -130,7 +134,6 @@
|
|||||||
</td>
|
</td>
|
||||||
<td style="padding:8px 10px;text-align:center;">
|
<td style="padding:8px 10px;text-align:center;">
|
||||||
<button type="button" @click="ukloniStavku(i)"
|
<button type="button" @click="ukloniStavku(i)"
|
||||||
x-show="stavke.length > 1"
|
|
||||||
style="background:none;border:none;cursor:pointer;color:#dc2626;font-size:18px;line-height:1;padding:2px 6px;border-radius:4px;transition:background 0.15s;"
|
style="background:none;border:none;cursor:pointer;color:#dc2626;font-size:18px;line-height:1;padding:2px 6px;border-radius:4px;transition:background 0.15s;"
|
||||||
onmouseover="this.style.background='rgba(220,38,38,0.08)'"
|
onmouseover="this.style.background='rgba(220,38,38,0.08)'"
|
||||||
onmouseout="this.style.background='none'"
|
onmouseout="this.style.background='none'"
|
||||||
@@ -150,6 +153,10 @@
|
|||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
<button type="button" x-show="!isMobile" @click="dodajStavku()" class="btn-primarno"
|
||||||
|
style="width:100%;font-size:14px;padding:10px;margin-top:10px;">
|
||||||
|
+ Dodaj stavku
|
||||||
|
</button>
|
||||||
|
|
||||||
<!-- mobilne kartice stavki (display kontroliše .stavke-kartice: none na desktopu,
|
<!-- mobilne kartice stavki (display kontroliše .stavke-kartice: none na desktopu,
|
||||||
flex na mobilnom @media — inline display:none bi pobedio @media, zato ga NEMA) -->
|
flex na mobilnom @media — inline display:none bi pobedio @media, zato ga NEMA) -->
|
||||||
@@ -160,7 +167,6 @@
|
|||||||
<span style="font-size:13px;font-weight:500;color:var(--tekst-sporedni);"
|
<span style="font-size:13px;font-weight:500;color:var(--tekst-sporedni);"
|
||||||
x-text="'Stavka ' + (i + 1)"></span>
|
x-text="'Stavka ' + (i + 1)"></span>
|
||||||
<button type="button" @click="ukloniStavku(i)"
|
<button type="button" @click="ukloniStavku(i)"
|
||||||
x-show="stavke.length > 1"
|
|
||||||
style="background:none;border:0.5px solid #dc2626;color:#dc2626;cursor:pointer;font-size:13px;padding:2px 8px;border-radius:4px;">
|
style="background:none;border:0.5px solid #dc2626;color:#dc2626;cursor:pointer;font-size:13px;padding:2px 8px;border-radius:4px;">
|
||||||
Ukloni
|
Ukloni
|
||||||
</button>
|
</button>
|
||||||
@@ -171,7 +177,7 @@
|
|||||||
<select :name="'artikal_id[]'" x-model="stavka.artikal_id"
|
<select :name="'artikal_id[]'" x-model="stavka.artikal_id"
|
||||||
@change="izaberiArtikal(stavka)" :disabled="!isMobile" style="width:100%;">
|
@change="izaberiArtikal(stavka)" :disabled="!isMobile" style="width:100%;">
|
||||||
<option value="">— odaberi artikal —</option>
|
<option value="">— odaberi artikal —</option>
|
||||||
<template x-for="a in artikliOpcije" :key="a.id">
|
<template x-for="a in artikliZaDobavljaca()" :key="a.id">
|
||||||
<option :value="a.id" x-text="a.naziv"></option>
|
<option :value="a.id" x-text="a.naziv"></option>
|
||||||
</template>
|
</template>
|
||||||
</select>
|
</select>
|
||||||
@@ -202,6 +208,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
<button type="button" x-show="isMobile" @click="dodajStavku()" class="btn-primarno"
|
||||||
|
style="width:100%;font-size:14px;padding:10px;margin-top:4px;">
|
||||||
|
+ Dodaj stavku
|
||||||
|
</button>
|
||||||
<div style="text-align:right;font-size:15px;font-weight:600;color:var(--tekst-glavni);padding:8px 4px;">
|
<div style="text-align:right;font-size:15px;font-weight:600;color:var(--tekst-glavni);padding:8px 4px;">
|
||||||
Ukupno: <span x-text="ukupnoSvega() + ' din'"></span>
|
Ukupno: <span x-text="ukupnoSvega() + ' din'"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
{{if .Napomena}}{{.Napomena}}{{else}}—{{end}}
|
{{if .Napomena}}{{.Napomena}}{{else}}—{{end}}
|
||||||
</td>
|
</td>
|
||||||
<td style="padding:12px 16px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
|
<td style="padding:12px 16px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
|
||||||
{{printf "%.2f" .Ukupno}} din
|
{{dinari .Ukupno}} din
|
||||||
</td>
|
</td>
|
||||||
<td style="padding:12px 16px;text-align:center;">
|
<td style="padding:12px 16px;text-align:center;">
|
||||||
<div style="display:flex;align-items:center;justify-content:center;gap:8px;">
|
<div style="display:flex;align-items:center;justify-content:center;gap:8px;">
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);white-space:nowrap;">
|
<div style="font-size:15px;font-weight:500;color:var(--tekst-glavni);white-space:nowrap;">
|
||||||
{{printf "%.2f" .Ukupno}} din
|
{{dinari .Ukupno}} din
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{if .Napomena}}
|
{{if .Napomena}}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
<td style="padding: 12px 16px; font-size: 13px; font-family: monospace; color: var(--tekst-glavni)">{{.BrojNaloga}}</td>
|
<td style="padding: 12px 16px; font-size: 13px; font-family: monospace; color: var(--tekst-glavni)">{{.BrojNaloga}}</td>
|
||||||
<td style="padding: 12px 16px; font-size: 13px; color: var(--tekst-sporedni); white-space: nowrap">{{.Datum.Format "02.01.2006."}}</td>
|
<td style="padding: 12px 16px; font-size: 13px; color: var(--tekst-sporedni); white-space: nowrap">{{.Datum.Format "02.01.2006."}}</td>
|
||||||
<td style="padding: 12px 16px; font-size: 14px; font-weight: 500; color: var(--tekst-glavni)">{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}—{{end}}</td>
|
<td style="padding: 12px 16px; font-size: 14px; font-weight: 500; color: var(--tekst-glavni)">{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}—{{end}}</td>
|
||||||
<td style="padding: 12px 16px; text-align: right; font-size: 14px; font-weight: 500; color: var(--tekst-glavni)">{{printf "%.2f" .Ukupno}} din</td>
|
<td style="padding: 12px 16px; text-align: right; font-size: 14px; font-weight: 500; color: var(--tekst-glavni)">{{dinari .Ukupno}} din</td>
|
||||||
<td style="padding: 12px 16px; text-align: center">
|
<td style="padding: 12px 16px; text-align: center">
|
||||||
<div style="display: flex; align-items: center; justify-content: center; gap: 8px">
|
<div style="display: flex; align-items: center; justify-content: center; gap: 8px">
|
||||||
<a href="/prodaja/{{.ID}}" class="btn-primarno-malo">Detalji</a>
|
<a href="/prodaja/{{.ID}}" class="btn-primarno-malo">Detalji</a>
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
<div style="font-size: 14px; font-weight: 500; color: var(--tekst-glavni); margin-top: 2px">{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}Bez klijenta{{end}}</div>
|
<div style="font-size: 14px; font-weight: 500; color: var(--tekst-glavni); margin-top: 2px">{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}Bez klijenta{{end}}</div>
|
||||||
<div style="font-size: 12px; color: var(--tekst-sporedni); margin-top: 2px">{{.Datum.Format "02.01.2006."}}</div>
|
<div style="font-size: 12px; color: var(--tekst-sporedni); margin-top: 2px">{{.Datum.Format "02.01.2006."}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="font-size: 15px; font-weight: 500; color: var(--tekst-glavni); white-space: nowrap">{{printf "%.2f" .Ukupno}} din</div>
|
<div style="font-size: 15px; font-weight: 500; color: var(--tekst-glavni); white-space: nowrap">{{dinari .Ukupno}} din</div>
|
||||||
</div>
|
</div>
|
||||||
<a href="/prodaja/{{.ID}}" class="btn-primarno-malo" style="justify-content: center; width: 100%; box-sizing: border-box">Detalji</a>
|
<a href="/prodaja/{{.ID}}" class="btn-primarno-malo" style="justify-content: center; width: 100%; box-sizing: border-box">Detalji</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Ukupno</div>
|
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Ukupno</div>
|
||||||
<div style="font-size:20px;font-weight:600;color:var(--sb-akcent);">
|
<div style="font-size:20px;font-weight:600;color:var(--sb-akcent);">
|
||||||
{{printf "%.2f" .Nalog.Ukupno}} din
|
{{dinari .Nalog.Ukupno}} din
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{if .Nalog.RazlogStorniranja}}
|
{{if .Nalog.RazlogStorniranja}}
|
||||||
@@ -205,18 +205,18 @@
|
|||||||
<tr style="border-bottom: 0.5px solid var(--ivica)">
|
<tr style="border-bottom: 0.5px solid var(--ivica)">
|
||||||
<td style="padding:10px 20px;font-size:14px;color:var(--tekst-glavni);">{{.ArtikalNaziv}}</td>
|
<td style="padding:10px 20px;font-size:14px;color:var(--tekst-glavni);">{{.ArtikalNaziv}}</td>
|
||||||
<td style="padding:10px 20px;text-align:center;font-size:14px;color:var(--tekst-glavni);">{{.Kolicina}}</td>
|
<td style="padding:10px 20px;text-align:center;font-size:14px;color:var(--tekst-glavni);">{{.Kolicina}}</td>
|
||||||
<td style="padding:10px 20px;text-align:right;font-size:14px;color:var(--tekst-sporedni);">{{printf "%.2f" .CenaPoKomadu}} din</td>
|
<td style="padding:10px 20px;text-align:right;font-size:14px;color:var(--tekst-sporedni);">{{dinari .CenaPoKomadu}} din</td>
|
||||||
<td style="padding:10px 20px;text-align:center;font-size:13px;color:var(--tekst-sporedni);">
|
<td style="padding:10px 20px;text-align:center;font-size:13px;color:var(--tekst-sporedni);">
|
||||||
{{if .PdvStopa}}{{printf "%.0f" .PdvStopa}}%{{else}}—{{end}}
|
{{if .PdvStopa}}{{printf "%.0f" .PdvStopa}}%{{else}}—{{end}}
|
||||||
</td>
|
</td>
|
||||||
<td style="padding:10px 20px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{printf "%.2f" .Ukupno}} din</td>
|
<td style="padding:10px 20px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr style="border-top: 0.5px solid var(--ivica)">
|
<tr style="border-top: 0.5px solid var(--ivica)">
|
||||||
<td colspan="4" style="padding:12px 20px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-sporedni);">Ukupno:</td>
|
<td colspan="4" style="padding:12px 20px;text-align:right;font-size:13px;font-weight:500;color:var(--tekst-sporedni);">Ukupno:</td>
|
||||||
<td style="padding:12px 20px;text-align:right;font-size:16px;font-weight:600;color:var(--sb-akcent);">{{printf "%.2f" .Nalog.Ukupno}} din</td>
|
<td style="padding:12px 20px;text-align:right;font-size:16px;font-weight:600;color:var(--sb-akcent);">{{dinari .Nalog.Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -82,15 +82,15 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{.ArtikalNaziv}}</td>
|
<td>{{.ArtikalNaziv}}</td>
|
||||||
<td>{{.Kolicina}} {{.JedinicaMere}}</td>
|
<td>{{.Kolicina}} {{.JedinicaMere}}</td>
|
||||||
<td>{{printf "%.2f" .CenaPoKomadu}} din</td>
|
<td>{{dinari .CenaPoKomadu}} din</td>
|
||||||
<td>{{printf "%.2f" .Ukupno}} din</td>
|
<td>{{dinari .Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="3" class="ukupno-label">Ukupno za naplatu:</td>
|
<td colspan="3" class="ukupno-label">Ukupno za naplatu:</td>
|
||||||
<td class="ukupno-iznos">{{printf "%.2f" .Nalog.Ukupno}} din</td>
|
<td class="ukupno-iznos">{{dinari .Nalog.Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -188,7 +188,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Ugrađeni delovi</div>
|
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Ugrađeni delovi</div>
|
||||||
<div style="font-size:16px;font-weight:500;color:var(--tekst-glavni);">
|
<div style="font-size:16px;font-weight:500;color:var(--tekst-glavni);">
|
||||||
{{printf "%.2f" .UkupnoDelovi}} din
|
{{dinari .UkupnoDelovi}} din
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Ukupno</div>
|
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Ukupno</div>
|
||||||
<div style="font-size:20px;font-weight:600;color:var(--sb-akcent);">
|
<div style="font-size:20px;font-weight:600;color:var(--sb-akcent);">
|
||||||
{{printf "%.2f" .UkupnoSve}} din
|
{{dinari .UkupnoSve}} din
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
@@ -210,7 +210,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Za naplatu</div>
|
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Za naplatu</div>
|
||||||
<div style="font-size:20px;font-weight:600;color:#16a34a;">
|
<div style="font-size:20px;font-weight:600;color:#16a34a;">
|
||||||
{{printf "%.2f" .PreostaloSve}} din
|
{{dinari .PreostaloSve}} din
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
@@ -269,8 +269,8 @@
|
|||||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||||
<td style="padding:9px 10px;font-size:14px;color:var(--tekst-glavni);">{{.ArtikalNaziv}}</td>
|
<td style="padding:9px 10px;font-size:14px;color:var(--tekst-glavni);">{{.ArtikalNaziv}}</td>
|
||||||
<td style="padding:9px 10px;text-align:center;font-size:14px;color:var(--tekst-glavni);">{{.Kolicina}}</td>
|
<td style="padding:9px 10px;text-align:center;font-size:14px;color:var(--tekst-glavni);">{{.Kolicina}}</td>
|
||||||
<td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">{{printf "%.2f" .CenaKomada}} din</td>
|
<td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">{{dinari .CenaKomada}} din</td>
|
||||||
<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{printf "%.2f" .Ukupno}} din</td>
|
<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .Ukupno}} din</td>
|
||||||
<td style="padding:9px 10px;text-align:center;">
|
<td style="padding:9px 10px;text-align:center;">
|
||||||
{{if index $.Dozvole "servis.izmeni"}}
|
{{if index $.Dozvole "servis.izmeni"}}
|
||||||
<form method="POST" action="/servis/{{$.Nalog.ID}}/delovi/{{.ID}}/obrisi" style="display:inline;">
|
<form method="POST" action="/servis/{{$.Nalog.ID}}/delovi/{{.ID}}/obrisi" style="display:inline;">
|
||||||
|
|||||||
@@ -183,13 +183,13 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{.ArtikalNaziv}}</td>
|
<td>{{.ArtikalNaziv}}</td>
|
||||||
<td class="desno">{{.Kolicina}}</td>
|
<td class="desno">{{.Kolicina}}</td>
|
||||||
<td class="desno">{{printf "%.2f" .CenaKomada}} din</td>
|
<td class="desno">{{dinari .CenaKomada}} din</td>
|
||||||
<td class="desno">{{printf "%.2f" .Ukupno}} din</td>
|
<td class="desno">{{dinari .Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
<tr class="ukupno-red">
|
<tr class="ukupno-red">
|
||||||
<td colspan="3">Ukupno delovi</td>
|
<td colspan="3">Ukupno delovi</td>
|
||||||
<td class="desno">{{printf "%.2f" .UkupnoDelovi}} din</td>
|
<td class="desno">{{dinari .UkupnoDelovi}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -209,7 +209,7 @@
|
|||||||
{{if gt .UkupnoDelovi 0.0}}
|
{{if gt .UkupnoDelovi 0.0}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>Ugrađeni delovi i materijal</td>
|
<td>Ugrađeni delovi i materijal</td>
|
||||||
<td class="desno">{{printf "%.2f" .UkupnoDelovi}} din</td>
|
<td class="desno">{{dinari .UkupnoDelovi}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if .ImaAvans}}
|
{{if .ImaAvans}}
|
||||||
@@ -222,7 +222,7 @@
|
|||||||
</table>
|
</table>
|
||||||
<div class="naplata-blok">
|
<div class="naplata-blok">
|
||||||
<div class="naplata-labela">Za naplatu pri preuzimanju:</div>
|
<div class="naplata-labela">Za naplatu pri preuzimanju:</div>
|
||||||
<div class="naplata-iznos">{{printf "%.2f" .PreostaloSve}} din</div>
|
<div class="naplata-iznos">{{dinari .PreostaloSve}} din</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|||||||
@@ -174,13 +174,13 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{.ArtikalNaziv}}</td>
|
<td>{{.ArtikalNaziv}}</td>
|
||||||
<td class="desno">{{.Kolicina}}</td>
|
<td class="desno">{{.Kolicina}}</td>
|
||||||
<td class="desno">{{printf "%.2f" .CenaKomada}} din</td>
|
<td class="desno">{{dinari .CenaKomada}} din</td>
|
||||||
<td class="desno">{{printf "%.2f" .Ukupno}} din</td>
|
<td class="desno">{{dinari .Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
<tr class="ukupno-red">
|
<tr class="ukupno-red">
|
||||||
<td colspan="3">Ukupno delovi</td>
|
<td colspan="3">Ukupno delovi</td>
|
||||||
<td class="desno">{{printf "%.2f" .UkupnoDelovi}} din</td>
|
<td class="desno">{{dinari .UkupnoDelovi}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -196,18 +196,18 @@
|
|||||||
{{if .CenaRaspon}}
|
{{if .CenaRaspon}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>Cena rada (procena)</td>
|
<td>Cena rada (procena)</td>
|
||||||
<td class="desno" style="width:200px;">{{printf "%.2f" .CenaRadaOd}} – {{printf "%.2f" .CenaRadaDo}} din</td>
|
<td class="desno" style="width:200px;">{{dinari .CenaRadaOd}} – {{dinari .CenaRadaDo}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{else}}
|
{{else}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>Cena rada</td>
|
<td>Cena rada</td>
|
||||||
<td class="desno" style="width:200px;">{{printf "%.2f" .CenaRada}} din</td>
|
<td class="desno" style="width:200px;">{{dinari .CenaRada}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if gt .UkupnoDelovi 0.0}}
|
{{if gt .UkupnoDelovi 0.0}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>Predloženi delovi i materijal</td>
|
<td>Predloženi delovi i materijal</td>
|
||||||
<td class="desno">{{printf "%.2f" .UkupnoDelovi}} din</td>
|
<td class="desno">{{dinari .UkupnoDelovi}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -215,9 +215,9 @@
|
|||||||
<div class="naplata-blok">
|
<div class="naplata-blok">
|
||||||
<div class="naplata-labela">Procena ukupnog troška:</div>
|
<div class="naplata-labela">Procena ukupnog troška:</div>
|
||||||
{{if .CenaRaspon}}
|
{{if .CenaRaspon}}
|
||||||
<div class="naplata-iznos">{{printf "%.2f" .UkupnoOd}} – {{printf "%.2f" .UkupnoDo}} din</div>
|
<div class="naplata-iznos">{{printf "%.2f" .UkupnoOd}} – {{dinari .UkupnoDo}} din</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="naplata-iznos">{{printf "%.2f" .Ukupno}} din</div>
|
<div class="naplata-iznos">{{dinari .Ukupno}} din</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -188,13 +188,13 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{.ArtikalNaziv}}</td>
|
<td>{{.ArtikalNaziv}}</td>
|
||||||
<td class="desno">{{.Kolicina}}</td>
|
<td class="desno">{{.Kolicina}}</td>
|
||||||
<td class="desno">{{printf "%.2f" .CenaKomada}} din</td>
|
<td class="desno">{{dinari .CenaKomada}} din</td>
|
||||||
<td class="desno">{{printf "%.2f" .Ukupno}} din</td>
|
<td class="desno">{{dinari .Ukupno}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{end}}
|
{{end}}
|
||||||
<tr class="ukupno-red">
|
<tr class="ukupno-red">
|
||||||
<td colspan="3">Ukupno delovi</td>
|
<td colspan="3">Ukupno delovi</td>
|
||||||
<td class="desno">{{printf "%.2f" .UkupnoDelovi}} din</td>
|
<td class="desno">{{dinari .UkupnoDelovi}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div style="text-align:right;">
|
<div style="text-align:right;">
|
||||||
<div style="font-size:12px;color:var(--tekst-slabi);">Ukupna vrednost zalihe</div>
|
<div style="font-size:12px;color:var(--tekst-slabi);">Ukupna vrednost zalihe</div>
|
||||||
<div style="font-size:18px;font-weight:600;color:var(--tekst-glavni);">{{printf "%.2f" .UkupnaVrednost}} din</div>
|
<div style="font-size:18px;font-weight:600;color:var(--tekst-glavni);">{{dinari .UkupnaVrednost}} din</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
<tfoot>
|
<tfoot>
|
||||||
<tr style="border-top:1.5px solid var(--ivica);font-weight:600;">
|
<tr style="border-top:1.5px solid var(--ivica);font-weight:600;">
|
||||||
<td colspan="7" style="padding:10px 12px;font-size:13px;">Ukupna vrednost zalihe</td>
|
<td colspan="7" style="padding:10px 12px;font-size:13px;">Ukupna vrednost zalihe</td>
|
||||||
<td style="text-align:right;padding:10px 12px;font-family:monospace;">{{printf "%.2f" .UkupnaVrednost}} din</td>
|
<td style="text-align:right;padding:10px 12px;font-family:monospace;">{{dinari .UkupnaVrednost}} din</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
Reference in New Issue
Block a user