PDV pravilo na štampanim dokumentima + fiksni layout + QR popravka

- PDV uslovi (Moduli.pdv) na: predračun, otpremnica, garantni list, prodaja_stampa
- Modal za preuzimanje: jedna cena (sa/bez PDV), ne duplo
- Javna status stranica: PDV uslovi za cene, predlog, checkbox-ove
- Svi print templejti: viewport=device-width+min-width, bez responsive
- JavniToken generisan za postojeće naloge bez tokena (QR popravka)
- UkupnoSaPdv() metode na ServisniRad i ServisniDeoSaArtiklom
- UkupnoBezPdv() na StavkaProdaje
This commit is contained in:
2026-06-27 02:06:18 +02:00
parent 8c6fc7e717
commit ff59c3edcf
15 changed files with 335 additions and 183 deletions
+3 -2
View File
@@ -24,7 +24,7 @@ func NoviServisniDeloviRepo(db *sql.DB) *ServisniDeloviRepo {
func (r *ServisniDeloviRepo) DohvatiZaNalog(ctx context.Context, nalogID int64) ([]model.ServisniDeoSaArtiklom, error) { func (r *ServisniDeloviRepo) DohvatiZaNalog(ctx context.Context, nalogID int64) ([]model.ServisniDeoSaArtiklom, error) {
redovi, err := r.db.QueryContext(ctx, ` redovi, err := r.db.QueryContext(ctx, `
SELECT sd.id, sd.nalog_id, sd.artikal_id, sd.kolicina, sd.cena_komada, sd.datum, SELECT sd.id, sd.nalog_id, sd.artikal_id, sd.kolicina, sd.cena_komada, sd.datum,
sd.predlozeno, a.naziv, a.sifra sd.predlozeno, a.naziv, a.sifra, a.pdv_stopa
FROM servisni_delovi sd FROM servisni_delovi sd
JOIN artikli a ON a.id = sd.artikal_id JOIN artikli a ON a.id = sd.artikal_id
WHERE sd.nalog_id = ? WHERE sd.nalog_id = ?
@@ -39,11 +39,12 @@ func (r *ServisniDeloviRepo) DohvatiZaNalog(ctx context.Context, nalogID int64)
var d model.ServisniDeoSaArtiklom var d model.ServisniDeoSaArtiklom
err := redovi.Scan( err := redovi.Scan(
&d.ID, &d.NalogID, &d.ArtikalID, &d.Kolicina, &d.CenaKomada, &d.Datum, &d.ID, &d.NalogID, &d.ArtikalID, &d.Kolicina, &d.CenaKomada, &d.Datum,
&d.Predlozeno, &d.ArtikalNaziv, &d.ArtikalSifra, &d.Predlozeno, &d.ArtikalNaziv, &d.ArtikalSifra, &d.PdvStopa,
) )
if err != nil { if err != nil {
return nil, fmt.Errorf("ntech: ServisniDeloviRepo.DohvatiZaNalog: scan: %w", err) return nil, fmt.Errorf("ntech: ServisniDeloviRepo.DohvatiZaNalog: scan: %w", err)
} }
d.CenaSaPdv = d.CenaKomada * (1 + d.PdvStopa/100)
rezultat = append(rezultat, d) rezultat = append(rezultat, d)
} }
+3 -2
View File
@@ -22,7 +22,7 @@ func NoviServisniRadoviRepo(baza *sql.DB) *ServisniRadoviRepo {
func (r *ServisniRadoviRepo) DohvatiZaNalog(ctx context.Context, nalogID int64) ([]model.ServisniRad, error) { func (r *ServisniRadoviRepo) DohvatiZaNalog(ctx context.Context, nalogID int64) ([]model.ServisniRad, error) {
redovi, err := r.db.QueryContext(ctx, ` redovi, err := r.db.QueryContext(ctx, `
SELECT sr.id, sr.nalog_id, COALESCE(sr.usluga_id, 0), sr.naziv, sr.kolicina, sr.cena_komada, sr.datum, sr.predlozeno, SELECT sr.id, sr.nalog_id, COALESCE(sr.usluga_id, 0), sr.naziv, sr.kolicina, sr.cena_komada, sr.datum, sr.predlozeno,
COALESCE(u.sifra, '') COALESCE(u.sifra, ''), COALESCE(u.pdv_stopa, 20.0)
FROM servis_radovi sr FROM servis_radovi sr
LEFT JOIN usluge u ON u.id = sr.usluga_id LEFT JOIN usluge u ON u.id = sr.usluga_id
WHERE sr.nalog_id = ? ORDER BY sr.id`, nalogID) WHERE sr.nalog_id = ? ORDER BY sr.id`, nalogID)
@@ -34,9 +34,10 @@ func (r *ServisniRadoviRepo) DohvatiZaNalog(ctx context.Context, nalogID int64)
var radovi []model.ServisniRad var radovi []model.ServisniRad
for redovi.Next() { for redovi.Next() {
var rad model.ServisniRad var rad model.ServisniRad
if err := redovi.Scan(&rad.ID, &rad.NalogID, &rad.UslugaID, &rad.Naziv, &rad.Kolicina, &rad.CenaKomada, &rad.Datum, &rad.Predlozeno, &rad.Sifra); err != nil { if err := redovi.Scan(&rad.ID, &rad.NalogID, &rad.UslugaID, &rad.Naziv, &rad.Kolicina, &rad.CenaKomada, &rad.Datum, &rad.Predlozeno, &rad.Sifra, &rad.PdvStopa); err != nil {
return nil, fmt.Errorf("ntech: ServisniRadoviRepo.DohvatiZaNalog: %w", err) return nil, fmt.Errorf("ntech: ServisniRadoviRepo.DohvatiZaNalog: %w", err)
} }
rad.CenaSaPdv = rad.CenaKomada * (1 + rad.PdvStopa/100)
radovi = append(radovi, rad) radovi = append(radovi, rad)
} }
return radovi, redovi.Err() return radovi, redovi.Err()
+10
View File
@@ -53,6 +53,8 @@ type PodaciStampeProdaje struct {
Nalog model.ProdajniNalog Nalog model.ProdajniNalog
Stavke []model.StavkaProdajeSaArtiklom Stavke []model.StavkaProdajeSaArtiklom
KlijentNaziv string KlijentNaziv string
Moduli map[string]bool
UkupnoBezPdv float64
NazivFirme string NazivFirme string
Podnazlov string Podnazlov string
Adresa string Adresa string
@@ -370,10 +372,18 @@ func (h *Handler) StampaProdaje(w http.ResponseWriter, r *http.Request) {
} }
} }
moduli := config.SviModuli(podesavanja)
var ukupnoBezPdv float64
for _, s := range stavke {
ukupnoBezPdv += s.CenaBezPdv * float64(s.Kolicina)
}
podaci := PodaciStampeProdaje{ podaci := PodaciStampeProdaje{
Nalog: *nalog, Nalog: *nalog,
Stavke: stavke, Stavke: stavke,
KlijentNaziv: klijentNaziv, KlijentNaziv: klijentNaziv,
Moduli: moduli,
UkupnoBezPdv: ukupnoBezPdv,
NazivFirme: podesavanja["naziv_firme"], NazivFirme: podesavanja["naziv_firme"],
Podnazlov: podesavanja["podnazlov"], Podnazlov: podesavanja["podnazlov"],
Adresa: podesavanja["adresa"], Adresa: podesavanja["adresa"],
+83 -6
View File
@@ -70,9 +70,13 @@ type PodaciDetaljiNaloga struct {
Sacuvano bool Sacuvano bool
UkupnoDelovi float64 UkupnoDelovi float64
UkupnoRadovi float64 UkupnoRadovi float64
UkupnoDeloviSaPdv float64
UkupnoRadoviSaPdv float64
UkupnoSve float64 UkupnoSve float64
UkupnoSveSaPdv float64
Avans float64 Avans float64
PreostaloSve float64 PreostaloSve float64
PreostaloSveSaPdv float64
ZakljucanStatus bool // onemogući promenu statusa dok ima potraživanih delova ZakljucanStatus bool // onemogući promenu statusa dok ima potraživanih delova
CenaDijagnostikePredlog string // podrazumevana cena dijagnostike iz podešavanja (za prefill input-a) CenaDijagnostikePredlog string // podrazumevana cena dijagnostike iz podešavanja (za prefill input-a)
KorisceneUsluge map[int64]bool // ID-evi usluga već dodatih na nalog — izostavljaju se iz dropdown-a KorisceneUsluge map[int64]bool // ID-evi usluga već dodatih na nalog — izostavljaju se iz dropdown-a
@@ -645,13 +649,16 @@ func (h *Handler) DetaljiNaloga(w http.ResponseWriter, r *http.Request) {
} }
var ukupnoDelovi, ukupnoRadovi float64 var ukupnoDelovi, ukupnoRadovi float64
var ukupnoDeloviSaPdv, ukupnoRadoviSaPdv float64
for _, d := range delovi { for _, d := range delovi {
ukupnoDelovi += d.Ukupno() ukupnoDelovi += d.Ukupno()
ukupnoDeloviSaPdv += d.CenaSaPdv * float64(d.Kolicina)
} }
// skup već dodatih usluga — izostavljaju se iz dropdown-a da se ista usluga ne doda dvaput // skup već dodatih usluga — izostavljaju se iz dropdown-a da se ista usluga ne doda dvaput
korisceneUsluge := make(map[int64]bool, len(radovi)) korisceneUsluge := make(map[int64]bool, len(radovi))
for _, rad := range radovi { for _, rad := range radovi {
ukupnoRadovi += rad.Ukupno() ukupnoRadovi += rad.Ukupno()
ukupnoRadoviSaPdv += rad.CenaSaPdv * rad.Kolicina
if rad.UslugaID != 0 { if rad.UslugaID != 0 {
korisceneUsluge[rad.UslugaID] = true korisceneUsluge[rad.UslugaID] = true
} }
@@ -665,6 +672,14 @@ func (h *Handler) DetaljiNaloga(w http.ResponseWriter, r *http.Request) {
} else { } else {
ukupnoSve = ukupnoRadovi + ukupnoDelovi ukupnoSve = ukupnoRadovi + ukupnoDelovi
} }
// ukupno sa PDV-om —suma CenaSaPdv za radove i delove
var ukupnoSveSaPdv float64
for _, rad := range radovi {
ukupnoSveSaPdv += rad.CenaSaPdv * rad.Kolicina
}
for _, d := range delovi {
ukupnoSveSaPdv += d.CenaSaPdv * float64(d.Kolicina)
}
avans := 0.0 avans := 0.0
if nalog.Avans != nil { if nalog.Avans != nil {
avans = *nalog.Avans avans = *nalog.Avans
@@ -673,6 +688,10 @@ func (h *Handler) DetaljiNaloga(w http.ResponseWriter, r *http.Request) {
if preostaloSve < 0 { if preostaloSve < 0 {
preostaloSve = 0 preostaloSve = 0
} }
preostaloSveSaPdv := ukupnoSveSaPdv - avans
if preostaloSveSaPdv < 0 {
preostaloSveSaPdv = 0
}
zakljucanStatus := false zakljucanStatus := false
for _, d := range delovi { for _, d := range delovi {
@@ -704,9 +723,13 @@ func (h *Handler) DetaljiNaloga(w http.ResponseWriter, r *http.Request) {
Sacuvano: r.URL.Query().Get("sacuvano") == "1", Sacuvano: r.URL.Query().Get("sacuvano") == "1",
UkupnoDelovi: ukupnoDelovi, UkupnoDelovi: ukupnoDelovi,
UkupnoRadovi: ukupnoRadovi, UkupnoRadovi: ukupnoRadovi,
UkupnoDeloviSaPdv: ukupnoDeloviSaPdv,
UkupnoRadoviSaPdv: ukupnoRadoviSaPdv,
UkupnoSve: ukupnoSve, UkupnoSve: ukupnoSve,
UkupnoSveSaPdv: ukupnoSveSaPdv,
Avans: avans, Avans: avans,
PreostaloSve: preostaloSve, PreostaloSve: preostaloSve,
PreostaloSveSaPdv: preostaloSveSaPdv,
ZakljucanStatus: zakljucanStatus, ZakljucanStatus: zakljucanStatus,
CenaDijagnostikePredlog: podesavanja["servis_cena_dijagnostike"], CenaDijagnostikePredlog: podesavanja["servis_cena_dijagnostike"],
KorisceneUsluge: korisceneUsluge, KorisceneUsluge: korisceneUsluge,
@@ -1375,12 +1398,17 @@ type PodaciOtpremnice struct {
Radovi []model.ServisniRad Radovi []model.ServisniRad
ServisniDelovi []model.ServisniDeoSaArtiklom ServisniDelovi []model.ServisniDeoSaArtiklom
UkupnoDelovi float64 UkupnoDelovi float64
UkupnoDeloviSaPdv float64
UkupnoSve float64
UkupnoSveSaPdv float64
PreostaloSve float64 PreostaloSve float64
PreostaloSveSaPdv float64
ImaAvans bool ImaAvans bool
QRKod string QRKod string
Klijent *model.Klijent Klijent *model.Klijent
KlijentNaziv string KlijentNaziv string
TehnicarNaziv string TehnicarNaziv string
Moduli map[string]bool
NazivFirme string NazivFirme string
LogoPutanja string LogoPutanja string
Podnazlov string Podnazlov string
@@ -1446,14 +1474,17 @@ func (h *Handler) StampaOtpremnice(w http.ResponseWriter, r *http.Request) {
} }
var ukupnoDelovi float64 var ukupnoDelovi float64
var ukupnoDeloviSaPdv float64
for _, d := range delovi { for _, d := range delovi {
ukupnoDelovi += d.Ukupno() ukupnoDelovi += d.Ukupno()
ukupnoDeloviSaPdv += d.CenaSaPdv * float64(d.Kolicina)
} }
var preostaloSve float64 var ukupnoSve, ukupnoSveSaPdv, preostaloSve, preostaloSveSaPdv float64
var imaAvans bool var imaAvans bool
if nalog.PopravkaOdbijena { if nalog.PopravkaOdbijena {
// klijent odbio popravku — naplaćuje se samo dijagnostika // klijent odbio popravku — naplaćuje se samo dijagnostika
ukupnoSve := nalog.CenaDijagnostike ukupnoSve = nalog.CenaDijagnostike
ukupnoSveSaPdv = nalog.CenaDijagnostike
avans := 0.0 avans := 0.0
if nalog.Avans != nil && *nalog.Avans > 0 { if nalog.Avans != nil && *nalog.Avans > 0 {
avans = *nalog.Avans avans = *nalog.Avans
@@ -1463,8 +1494,10 @@ func (h *Handler) StampaOtpremnice(w http.ResponseWriter, r *http.Request) {
if preostaloSve < 0 { if preostaloSve < 0 {
preostaloSve = 0 preostaloSve = 0
} }
preostaloSveSaPdv = preostaloSve
} else if nalog.CenaKonacna != nil { } else if nalog.CenaKonacna != nil {
ukupnoSve := *nalog.CenaKonacna + ukupnoDelovi ukupnoSve = *nalog.CenaKonacna + ukupnoDelovi
ukupnoSveSaPdv = *nalog.CenaKonacna + ukupnoDeloviSaPdv
avans := 0.0 avans := 0.0
if nalog.Avans != nil && *nalog.Avans > 0 { if nalog.Avans != nil && *nalog.Avans > 0 {
avans = *nalog.Avans avans = *nalog.Avans
@@ -1474,7 +1507,13 @@ func (h *Handler) StampaOtpremnice(w http.ResponseWriter, r *http.Request) {
if preostaloSve < 0 { if preostaloSve < 0 {
preostaloSve = 0 preostaloSve = 0
} }
preostaloSveSaPdv = ukupnoSveSaPdv - avans
if preostaloSveSaPdv < 0 {
preostaloSveSaPdv = 0
} }
}
moduli := config.SviModuli(podesavanja)
nalogURL := qrNalogURL(r, nalog.JavniToken, podesavanja["qr_bazni_url"]) nalogURL := qrNalogURL(r, nalog.JavniToken, podesavanja["qr_bazni_url"])
var qrKodOtpr string var qrKodOtpr string
@@ -1499,12 +1538,17 @@ func (h *Handler) StampaOtpremnice(w http.ResponseWriter, r *http.Request) {
Radovi: radovi, Radovi: radovi,
ServisniDelovi: delovi, ServisniDelovi: delovi,
UkupnoDelovi: ukupnoDelovi, UkupnoDelovi: ukupnoDelovi,
UkupnoDeloviSaPdv: ukupnoDeloviSaPdv,
UkupnoSve: ukupnoSve,
UkupnoSveSaPdv: ukupnoSveSaPdv,
PreostaloSve: preostaloSve, PreostaloSve: preostaloSve,
PreostaloSveSaPdv: preostaloSveSaPdv,
ImaAvans: imaAvans, ImaAvans: imaAvans,
QRKod: qrKodOtpr, QRKod: qrKodOtpr,
Klijent: klijent, Klijent: klijent,
KlijentNaziv: klijentNaziv, KlijentNaziv: klijentNaziv,
TehnicarNaziv: tehnicarNaziv, TehnicarNaziv: tehnicarNaziv,
Moduli: moduli,
NazivFirme: podesavanja["naziv_firme"], NazivFirme: podesavanja["naziv_firme"],
LogoPutanja: logoZaDokument(podesavanja), LogoPutanja: logoZaDokument(podesavanja),
Podnazlov: podesavanja["podnazlov"], Podnazlov: podesavanja["podnazlov"],
@@ -1527,6 +1571,7 @@ type PodaciGarantnog struct {
KlijentNaziv string KlijentNaziv string
TehnicarNaziv string TehnicarNaziv string
Uslovi string Uslovi string
Moduli map[string]bool
NazivFirme string NazivFirme string
LogoPutanja string LogoPutanja string
Podnazlov string Podnazlov string
@@ -1612,6 +1657,7 @@ func (h *Handler) StampaGarantnog(w http.ResponseWriter, r *http.Request) {
KlijentNaziv: klijentNaziv, KlijentNaziv: klijentNaziv,
TehnicarNaziv: tehnicarNaziv, TehnicarNaziv: tehnicarNaziv,
Uslovi: vrednostIliDefault(podesavanja, "servis_uslovi", podrazumevaniUsloviServisa), Uslovi: vrednostIliDefault(podesavanja, "servis_uslovi", podrazumevaniUsloviServisa),
Moduli: config.SviModuli(podesavanja),
NazivFirme: podesavanja["naziv_firme"], NazivFirme: podesavanja["naziv_firme"],
LogoPutanja: logoZaDokument(podesavanja), LogoPutanja: logoZaDokument(podesavanja),
Podnazlov: podesavanja["podnazlov"], Podnazlov: podesavanja["podnazlov"],
@@ -1720,9 +1766,12 @@ type PodaciPredracuna struct {
Nalog model.ServisniNalog Nalog model.ServisniNalog
Radovi []model.ServisniRad Radovi []model.ServisniRad
UkupnoRad float64 UkupnoRad float64
UkupnoRadSaPdv float64
ServisniDelovi []model.ServisniDeoSaArtiklom ServisniDelovi []model.ServisniDeoSaArtiklom
UkupnoDelovi float64 UkupnoDelovi float64
UkupnoDeloviSaPdv float64
UkupnoSve float64 UkupnoSve float64
UkupnoSveSaPdv float64
DatumIzdavanja time.Time DatumIzdavanja time.Time
VaziDo time.Time VaziDo time.Time
Klauzula string Klauzula string
@@ -1730,6 +1779,7 @@ type PodaciPredracuna struct {
Klijent *model.Klijent Klijent *model.Klijent
KlijentNaziv string KlijentNaziv string
TehnicarNaziv string TehnicarNaziv string
Moduli map[string]bool
NazivFirme string NazivFirme string
LogoPutanja string LogoPutanja string
Podnazlov string Podnazlov string
@@ -1791,14 +1841,22 @@ func (h *Handler) StampaPredracuna(w http.ResponseWriter, r *http.Request) {
} }
var ukupnoRad float64 var ukupnoRad float64
var ukupnoRadSaPdv float64
for _, rd := range radovi { for _, rd := range radovi {
ukupnoRad += rd.Ukupno() ukupnoRad += rd.Ukupno()
ukupnoRadSaPdv += rd.CenaSaPdv * rd.Kolicina
} }
var ukupnoDelovi float64 var ukupnoDelovi float64
var ukupnoDeloviSaPdv float64
for _, d := range delovi { for _, d := range delovi {
ukupnoDelovi += d.Ukupno() ukupnoDelovi += d.Ukupno()
ukupnoDeloviSaPdv += d.CenaSaPdv * float64(d.Kolicina)
} }
ukupnoSve := ukupnoRad + ukupnoDelovi
ukupnoSveSaPdv := ukupnoRadSaPdv + ukupnoDeloviSaPdv
moduli := config.SviModuli(podesavanja)
// rok važenja iz podešavanja (default 7 dana) // rok važenja iz podešavanja (default 7 dana)
rok := 7 rok := 7
if v, err := strconv.Atoi(podesavanja["predracun_rok_dana"]); err == nil && v > 0 { if v, err := strconv.Atoi(podesavanja["predracun_rok_dana"]); err == nil && v > 0 {
@@ -1817,9 +1875,12 @@ func (h *Handler) StampaPredracuna(w http.ResponseWriter, r *http.Request) {
Nalog: *nalog, Nalog: *nalog,
Radovi: radovi, Radovi: radovi,
UkupnoRad: ukupnoRad, UkupnoRad: ukupnoRad,
UkupnoRadSaPdv: ukupnoRadSaPdv,
ServisniDelovi: delovi, ServisniDelovi: delovi,
UkupnoDelovi: ukupnoDelovi, UkupnoDelovi: ukupnoDelovi,
UkupnoSve: ukupnoRad + ukupnoDelovi, UkupnoDeloviSaPdv: ukupnoDeloviSaPdv,
UkupnoSve: ukupnoSve,
UkupnoSveSaPdv: ukupnoSveSaPdv,
DatumIzdavanja: datumIzdavanja, DatumIzdavanja: datumIzdavanja,
VaziDo: vaziDo, VaziDo: vaziDo,
Klauzula: vrednostIliDefault(podesavanja, "servis_klauzula_predracuna", podrazumevanaKlauzulaPredracuna), Klauzula: vrednostIliDefault(podesavanja, "servis_klauzula_predracuna", podrazumevanaKlauzulaPredracuna),
@@ -1827,6 +1888,7 @@ func (h *Handler) StampaPredracuna(w http.ResponseWriter, r *http.Request) {
Klijent: klijent, Klijent: klijent,
KlijentNaziv: klijentNaziv, KlijentNaziv: klijentNaziv,
TehnicarNaziv: tehnicarNaziv, TehnicarNaziv: tehnicarNaziv,
Moduli: moduli,
NazivFirme: podesavanja["naziv_firme"], NazivFirme: podesavanja["naziv_firme"],
LogoPutanja: logoZaDokument(podesavanja), LogoPutanja: logoZaDokument(podesavanja),
Podnazlov: podesavanja["podnazlov"], Podnazlov: podesavanja["podnazlov"],
@@ -2544,12 +2606,16 @@ type PodaciJavnogStatusa struct {
Radovi []model.ServisniRad // ugrađeni/odobreni Radovi []model.ServisniRad // ugrađeni/odobreni
ServisniDelovi []model.ServisniDeoSaArtiklom // ugrađeni/odobreni ServisniDelovi []model.ServisniDeoSaArtiklom // ugrađeni/odobreni
UkupnoSve float64 // zbir ugrađenih (radovi + delovi) UkupnoSve float64 // zbir ugrađenih (radovi + delovi)
UkupnoSveSaPdv float64
PredlozeniRadovi []model.ServisniRad PredlozeniRadovi []model.ServisniRad
PredlozeniDelovi []model.ServisniDeoSaArtiklom PredlozeniDelovi []model.ServisniDeoSaArtiklom
UkupnoPredlog float64 // zbir predloženih (radovi + delovi) UkupnoPredlog float64 // zbir predloženih (radovi + delovi)
UkupnoPredlogSaPdv float64
ImaPredlog bool ImaPredlog bool
UkupnoSaPredlogom float64 // ukupno ugrađeno + predloženo UkupnoSaPredlogom float64 // ukupno ugrađeno + predloženo
Odgovoreno bool // klijent već odgovorio (nema predloga, nije „Primljeno") UkupnoSaPredlogomSaPdv float64
Odgovoreno bool // klijent vec odgovorio (nema predloga, nije "Primljeno")
Moduli map[string]bool
SviStatusi []string SviStatusi []string
} }
@@ -2578,14 +2644,16 @@ func (h *Handler) ServisJavniStatus(w http.ResponseWriter, r *http.Request) {
// razdvajamo ugrađene/odobrene od predloženih (čekaju odluku klijenta) // razdvajamo ugrađene/odobrene od predloženih (čekaju odluku klijenta)
var ugrRadovi, predRadovi []model.ServisniRad var ugrRadovi, predRadovi []model.ServisniRad
var ukupnoSve, ukupnoPredlog float64 var ukupnoSve, ukupnoSveSaPdv, ukupnoPredlog, ukupnoPredlogSaPdv float64
for _, rd := range radovi { for _, rd := range radovi {
if rd.Predlozeno { if rd.Predlozeno {
predRadovi = append(predRadovi, rd) predRadovi = append(predRadovi, rd)
ukupnoPredlog += rd.Ukupno() ukupnoPredlog += rd.Ukupno()
ukupnoPredlogSaPdv += rd.UkupnoSaPdv()
} else { } else {
ugrRadovi = append(ugrRadovi, rd) ugrRadovi = append(ugrRadovi, rd)
ukupnoSve += rd.Ukupno() ukupnoSve += rd.Ukupno()
ukupnoSveSaPdv += rd.UkupnoSaPdv()
} }
} }
var ugrDelovi, predDelovi []model.ServisniDeoSaArtiklom var ugrDelovi, predDelovi []model.ServisniDeoSaArtiklom
@@ -2593,13 +2661,16 @@ func (h *Handler) ServisJavniStatus(w http.ResponseWriter, r *http.Request) {
if d.Predlozeno { if d.Predlozeno {
predDelovi = append(predDelovi, d) predDelovi = append(predDelovi, d)
ukupnoPredlog += d.Ukupno() ukupnoPredlog += d.Ukupno()
ukupnoPredlogSaPdv += d.UkupnoSaPdv()
} else { } else {
ugrDelovi = append(ugrDelovi, d) ugrDelovi = append(ugrDelovi, d)
ukupnoSve += d.Ukupno() ukupnoSve += d.Ukupno()
ukupnoSveSaPdv += d.UkupnoSaPdv()
} }
} }
podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB) podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
moduli := config.SviModuli(podesavanja)
// kad je klijent odbio popravku, ne prikazujemo radove i delove // kad je klijent odbio popravku, ne prikazujemo radove i delove
if nalog.PopravkaOdbijena { if nalog.PopravkaOdbijena {
@@ -2608,7 +2679,9 @@ func (h *Handler) ServisJavniStatus(w http.ResponseWriter, r *http.Request) {
predRadovi = nil predRadovi = nil
predDelovi = nil predDelovi = nil
ukupnoSve = 0 ukupnoSve = 0
ukupnoSveSaPdv = 0
ukupnoPredlog = 0 ukupnoPredlog = 0
ukupnoPredlogSaPdv = 0
} }
h.renderujStandalone(w, "servis_status_javni", PodaciJavnogStatusa{ h.renderujStandalone(w, "servis_status_javni", PodaciJavnogStatusa{
@@ -2623,12 +2696,16 @@ func (h *Handler) ServisJavniStatus(w http.ResponseWriter, r *http.Request) {
Radovi: ugrRadovi, Radovi: ugrRadovi,
ServisniDelovi: ugrDelovi, ServisniDelovi: ugrDelovi,
UkupnoSve: ukupnoSve, UkupnoSve: ukupnoSve,
UkupnoSveSaPdv: ukupnoSveSaPdv,
PredlozeniRadovi: predRadovi, PredlozeniRadovi: predRadovi,
PredlozeniDelovi: predDelovi, PredlozeniDelovi: predDelovi,
UkupnoPredlog: ukupnoPredlog, UkupnoPredlog: ukupnoPredlog,
UkupnoPredlogSaPdv: ukupnoPredlogSaPdv,
ImaPredlog: len(predRadovi) > 0 || len(predDelovi) > 0, ImaPredlog: len(predRadovi) > 0 || len(predDelovi) > 0,
UkupnoSaPredlogom: ukupnoSve + ukupnoPredlog, UkupnoSaPredlogom: ukupnoSve + ukupnoPredlog,
UkupnoSaPredlogomSaPdv: ukupnoSveSaPdv + ukupnoPredlogSaPdv,
Odgovoreno: nalog.OdlukaKlijenta != "" || (!(len(predRadovi) > 0 || len(predDelovi) > 0) && nalog.Status != model.StatusPrimljeno), Odgovoreno: nalog.OdlukaKlijenta != "" || (!(len(predRadovi) > 0 || len(predDelovi) > 0) && nalog.Status != model.StatusPrimljeno),
Moduli: moduli,
SviStatusi: model.SviStatusi, SviStatusi: model.SviStatusi,
}) })
} }
+5
View File
@@ -28,6 +28,11 @@ type StavkaProdaje struct {
CenaBezPdv float64 CenaBezPdv float64
} }
// UkupnoBezPdv vraća ukupno bez PDV-a za stavku (CenaBezPdv × količina)
func (s StavkaProdaje) UkupnoBezPdv() float64 {
return s.CenaBezPdv * float64(s.Kolicina)
}
// ProdajniNalogSaDetaljem je nalog sa nazivom klijenta — za prikaz u listi // ProdajniNalogSaDetaljem je nalog sa nazivom klijenta — za prikaz u listi
type ProdajniNalogSaDetaljem struct { type ProdajniNalogSaDetaljem struct {
ProdajniNalog ProdajniNalog
+14
View File
@@ -78,11 +78,18 @@ func (d ServisniDeo) Ukupno() float64 {
return float64(d.Kolicina) * d.CenaKomada return float64(d.Kolicina) * d.CenaKomada
} }
// UkupnoSaPdv vraća ukupnu vrednost dela sa PDV-om (kolicina × cena_sa_pdv)
func (d ServisniDeoSaArtiklom) UkupnoSaPdv() float64 {
return float64(d.Kolicina) * d.CenaSaPdv
}
// ServisniDeoSaArtiklom je servisni deo sa nazivom artikla — za prikaz // ServisniDeoSaArtiklom je servisni deo sa nazivom artikla — za prikaz
type ServisniDeoSaArtiklom struct { type ServisniDeoSaArtiklom struct {
ServisniDeo ServisniDeo
ArtikalNaziv string ArtikalNaziv string
ArtikalSifra string ArtikalSifra string
PdvStopa float64
CenaSaPdv float64
Potrazivano int // komada koji nedostaju (iz servisni_potrazivani_delovi), 0 ako nema Potrazivano int // komada koji nedostaju (iz servisni_potrazivani_delovi), 0 ako nema
} }
@@ -110,6 +117,8 @@ type ServisniRad struct {
Sifra string Sifra string
Kolicina float64 Kolicina float64
CenaKomada float64 CenaKomada float64
PdvStopa float64
CenaSaPdv float64 // CenaKomada * (1 + PdvStopa/100)
Datum string Datum string
Predlozeno bool // true = serviser predložio posle dijagnostike; čeka odobrenje klijenta Predlozeno bool // true = serviser predložio posle dijagnostike; čeka odobrenje klijenta
} }
@@ -119,6 +128,11 @@ func (r ServisniRad) Ukupno() float64 {
return r.Kolicina * r.CenaKomada return r.Kolicina * r.CenaKomada
} }
// UkupnoSaPdv vraća ukupnu vrednost rada sa PDV-om (kolicina × cena_sa_pdv)
func (r ServisniRad) UkupnoSaPdv() float64 {
return r.Kolicina * r.CenaSaPdv
}
// ServisniNalogSaKlijentom proširuje ServisniNalog sa nazivom klijenta za prikaz u listi // ServisniNalogSaKlijentom proširuje ServisniNalog sa nazivom klijenta za prikaz u listi
type ServisniNalogSaKlijentom struct { type ServisniNalogSaKlijentom struct {
ServisniNalog ServisniNalog
+8 -8
View File
@@ -2,11 +2,11 @@
<html lang="sr"> <html lang="sr">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Priznanica {{.Nalog.BrojNaloga}}</title> <title>Priznanica {{.Nalog.BrojNaloga}}</title>
<style> <style>
* { box-sizing: border-box; margin: 0; padding: 0; } * { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-size: 14px; color: #111; background: #f5f5f5; padding: 32px 16px; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-size: 14px; color: #111; background: #f5f5f5; padding: 32px 16px; min-width: 640px; }
.stranica { background: #fff; max-width: 640px; margin: 0 auto; padding: 40px; border-radius: 8px; box-shadow: 0 1px 8px rgba(0, 0, 0, 0.08); } .stranica { background: #fff; max-width: 640px; margin: 0 auto; padding: 40px; border-radius: 8px; box-shadow: 0 1px 8px rgba(0, 0, 0, 0.08); }
.zaglavlje { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 32px; padding-bottom: 24px; border-bottom: 1px solid #e5e7eb; } .zaglavlje { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 32px; padding-bottom: 24px; border-bottom: 1px solid #e5e7eb; }
.firma-naziv { font-size: 20px; font-weight: 600; color: #111; } .firma-naziv { font-size: 20px; font-weight: 600; color: #111; }
@@ -33,7 +33,7 @@
.btn { padding: 9px 20px; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; border: none; text-decoration: none; display: inline-block; } .btn { padding: 9px 20px; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; border: none; text-decoration: none; display: inline-block; }
.btn-primarni { background: #2563eb; color: #fff; } .btn-primarni { background: #2563eb; color: #fff; }
.btn-sekundarni { background: #f3f4f6; color: #374151; } .btn-sekundarni { background: #f3f4f6; color: #374151; }
@media print { body { background: #fff; padding: 0; } .stranica { box-shadow: none; border-radius: 0; padding: 20px; max-width: 100%; } .ekran-dugmad { display: none; } } @media print { body { background: #fff; padding: 0; } .stranica { box-shadow: none; border-radius: 0; padding: 40px; max-width: 640px; } .ekran-dugmad { display: none; } }
</style> </style>
</head> </head>
<body> <body>
@@ -73,8 +73,8 @@
<tr> <tr>
<th>Artikal</th> <th>Artikal</th>
<th>Kol.</th> <th>Kol.</th>
<th>Cena/kom</th> <th>Cena/kom{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
<th>Ukupno</th> <th>Ukupno{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -82,15 +82,15 @@
<tr> <tr>
<td>{{.ArtikalNaziv}}</td> <td>{{.ArtikalNaziv}}</td>
<td>{{.Kolicina}} {{.JedinicaMere}}</td> <td>{{.Kolicina}} {{.JedinicaMere}}</td>
<td>{{dinari .CenaPoKomadu}} din</td> <td>{{if index $.Moduli "pdv"}}{{dinari .CenaPoKomadu}}{{else}}{{dinari .CenaBezPdv}}{{end}} din</td>
<td>{{dinari .Ukupno}} din</td> <td>{{if index $.Moduli "pdv"}}{{dinari .Ukupno}}{{else}}{{dinari .UkupnoBezPdv}}{{end}} 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">{{dinari .Nalog.Ukupno}} din</td> <td class="ukupno-iznos">{{if index .Moduli "pdv"}}{{dinari .Nalog.Ukupno}}{{else}}{{dinari .UkupnoBezPdv}}{{end}} din</td>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
+46 -2
View File
@@ -102,10 +102,17 @@
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">&times;</button> <button type="submit" class="premesti-zatvori" aria-label="Zatvori">&times;</button>
</form> </form>
<div style="display:flex;flex-direction:column;gap:10px;padding:16px;"> <div style="display:flex;flex-direction:column;gap:10px;padding:16px;">
{{if index .Moduli "pdv"}}
<div style="display:flex;justify-content:space-between;align-items:center;">
<span style="color:var(--tekst-sporedni);">Ukupno sa PDV-om</span>
<span style="color:var(--tekst-glavni);">{{dinari .UkupnoSveSaPdv}} din</span>
</div>
{{else}}
<div style="display:flex;justify-content:space-between;align-items:center;"> <div style="display:flex;justify-content:space-between;align-items:center;">
<span style="color:var(--tekst-sporedni);">Ukupno</span> <span style="color:var(--tekst-sporedni);">Ukupno</span>
<span style="color:var(--tekst-glavni);">{{dinari .UkupnoSve}} din</span> <span style="color:var(--tekst-glavni);">{{dinari .UkupnoSve}} din</span>
</div> </div>
{{end}}
{{if gt .Avans 0.0}} {{if gt .Avans 0.0}}
<div style="display:flex;justify-content:space-between;align-items:center;"> <div style="display:flex;justify-content:space-between;align-items:center;">
<span style="color:var(--tekst-sporedni);">Avans (uplaćeno)</span> <span style="color:var(--tekst-sporedni);">Avans (uplaćeno)</span>
@@ -116,7 +123,7 @@
{{end}} {{end}}
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:4px;padding-top:10px;border-top:0.5px solid var(--ivica);"> <div style="display:flex;justify-content:space-between;align-items:center;margin-top:4px;padding-top:10px;border-top:0.5px solid var(--ivica);">
<span style="font-size:16px;font-weight:600;color:var(--tekst-glavni);">Za naplatu</span> <span style="font-size:16px;font-weight:600;color:var(--tekst-glavni);">Za naplatu</span>
<span style="font-size:18px;font-weight:600;color:var(--tekst-glavni);" id="za-naplatu-iznos">{{dinari .PreostaloSve}} din</span> <span style="font-size:18px;font-weight:600;color:var(--tekst-glavni);" id="za-naplatu-iznos">{{if index .Moduli "pdv"}}{{dinari .PreostaloSveSaPdv}}{{else}}{{dinari .PreostaloSve}}{{end}} din</span>
</div> </div>
<div style="margin-top:10px;padding-top:10px;border-top:0.5px solid var(--ivica);"> <div style="margin-top:10px;padding-top:10px;border-top:0.5px solid var(--ivica);">
<label class="polje-labela">Primljeno (din)</label> <label class="polje-labela">Primljeno (din)</label>
@@ -129,7 +136,7 @@
<form method="POST" action="/servis/{{.Nalog.ID}}/status" data-refresh="#sadrzaj" style="margin-top:8px;"> <form method="POST" action="/servis/{{.Nalog.ID}}/status" data-refresh="#sadrzaj" style="margin-top:8px;">
<input type="hidden" name="_csrf" value="{{.CsrfToken}}"> <input type="hidden" name="_csrf" value="{{.CsrfToken}}">
<input type="hidden" name="status" value="Preuzeto"> <input type="hidden" name="status" value="Preuzeto">
<input type="hidden" name="naplaceno" value="{{printf "%.2f" .PreostaloSve}}"> <input type="hidden" name="naplaceno" value="{{if index .Moduli "pdv"}}{{printf "%.2f" .PreostaloSveSaPdv}}{{else}}{{printf "%.2f" .PreostaloSve}}{{end}}">
<div style="margin-bottom:10px;"> <div style="margin-bottom:10px;">
<label class="polje-labela">Način plaćanja</label> <label class="polje-labela">Način plaćanja</label>
<select name="nacin_placanja" id="nacin-placanja-sel" style="width:100%;padding:8px 12px;background:var(--pozadina);border:0.5px solid var(--ivica);border-radius:8px;color:var(--tekst-glavni);font-size:13px;" onchange="ntechNacinPlacanjaBroj(this)"> <select name="nacin_placanja" id="nacin-placanja-sel" style="width:100%;padding:8px 12px;background:var(--pozadina);border:0.5px solid var(--ivica);border-radius:8px;color:var(--tekst-glavni);font-size:13px;" onchange="ntechNacinPlacanjaBroj(this)">
@@ -581,7 +588,9 @@
<th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:90px;">Šifra</th> <th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:90px;">Šifra</th>
<th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:80px;">Kol.</th> <th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:80px;">Kol.</th>
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Cena/kom</th> <th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Cena/kom</th>
{{if index .Moduli "pdv"}}<th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:60px;">PDV %</th>{{end}}
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Ukupno</th> <th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Ukupno</th>
{{if index .Moduli "pdv"}}<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Sa PDV</th>{{end}}
<th style="width:50px;"></th> <th style="width:50px;"></th>
</tr> </tr>
</thead> </thead>
@@ -592,7 +601,9 @@
<td style="padding:9px 10px;font-size:12px;color:var(--tekst-sporedni);font-family:monospace;">{{.Sifra}}</td> <td style="padding:9px 10px;font-size:12px;color:var(--tekst-sporedni);font-family:monospace;">{{.Sifra}}</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);">{{dinari .CenaKomada}} din</td> <td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">{{dinari .CenaKomada}} din</td>
{{if index $.Moduli "pdv"}}<td style="padding:9px 10px;text-align:center;font-size:12px;color:var(--tekst-sporedni);">{{printf "%.0f" .PdvStopa}}%</td>{{end}}
<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:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .Ukupno}} din</td>
{{if index $.Moduli "pdv"}}<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .CenaSaPdv}} din</td>{{end}}
<td style="padding:9px 10px;text-align:center;"> <td style="padding:9px 10px;text-align:center;">
{{if and (not $.ZakljucaniUgradjeni) (index $.Dozvole "servis.izmeni")}} {{if and (not $.ZakljucaniUgradjeni) (index $.Dozvole "servis.izmeni")}}
<form method="POST" action="/servis/{{$.Nalog.ID}}/radovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#radovi-blok, #nalog-ukupno, #predlozeno-blok"> <form method="POST" action="/servis/{{$.Nalog.ID}}/radovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#radovi-blok, #nalog-ukupno, #predlozeno-blok">
@@ -613,7 +624,9 @@
<td style="padding:9px 10px;font-size:12px;color:var(--tekst-sporedni);font-family:monospace;">{{.Sifra}}</td> <td style="padding:9px 10px;font-size:12px;color:var(--tekst-sporedni);font-family:monospace;">{{.Sifra}}</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);">{{dinari .CenaKomada}} din</td> <td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">{{dinari .CenaKomada}} din</td>
{{if index $.Moduli "pdv"}}<td style="padding:9px 10px;text-align:center;font-size:12px;color:var(--tekst-sporedni);">{{printf "%.0f" .PdvStopa}}%</td>{{end}}
<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:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .Ukupno}} din</td>
{{if index $.Moduli "pdv"}}<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .CenaSaPdv}} din</td>{{end}}
<td style="padding:9px 10px;text-align:center;"> <td style="padding:9px 10px;text-align:center;">
{{if and (index $.Dozvole "servis.izmeni") (ne $.Nalog.Status "U popravci")}} {{if and (index $.Dozvole "servis.izmeni") (ne $.Nalog.Status "U popravci")}}
<form method="POST" action="/servis/{{$.Nalog.ID}}/radovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#radovi-blok, #nalog-ukupno, #predlozeno-blok"> <form method="POST" action="/servis/{{$.Nalog.ID}}/radovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#radovi-blok, #nalog-ukupno, #predlozeno-blok">
@@ -703,7 +716,9 @@
<th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:90px;">Šifra</th> <th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:90px;">Šifra</th>
<th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:80px;">Kol.</th> <th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:80px;">Kol.</th>
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Cena/kom</th> <th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Cena/kom</th>
{{if index .Moduli "pdv"}}<th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:60px;">PDV %</th>{{end}}
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Ukupno</th> <th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Ukupno</th>
{{if index .Moduli "pdv"}}<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Sa PDV</th>{{end}}
<th style="width:50px;"></th> <th style="width:50px;"></th>
</tr> </tr>
</thead> </thead>
@@ -718,9 +733,13 @@
<td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);"> <td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">
{{if .Kolicina}}{{dinari .CenaKomada}} din{{else}}—{{end}} {{if .Kolicina}}{{dinari .CenaKomada}} din{{else}}—{{end}}
</td> </td>
{{if index $.Moduli "pdv"}}<td style="padding:9px 10px;text-align:center;font-size:12px;color:var(--tekst-sporedni);">{{printf "%.0f" .PdvStopa}}%</td>{{end}}
<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);"> <td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
{{if .Kolicina}}{{dinari .Ukupno}} din{{else}}—{{end}} {{if .Kolicina}}{{dinari .Ukupno}} din{{else}}—{{end}}
</td> </td>
{{if index $.Moduli "pdv"}}<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
{{if .Kolicina}}{{dinari .CenaSaPdv}} din{{else}}—{{end}}
</td>{{end}}
<td style="padding:9px 10px;text-align:center;"> <td style="padding:9px 10px;text-align:center;">
{{if and (not $.ZakljucaniUgradjeni) (index $.Dozvole "servis.izmeni")}} {{if and (not $.ZakljucaniUgradjeni) (index $.Dozvole "servis.izmeni")}}
<form method="POST" action="/servis/{{$.Nalog.ID}}/delovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#delovi-blok, #nalog-zaglavlje, #nalog-ukupno, #predlozeno-blok"> <form method="POST" action="/servis/{{$.Nalog.ID}}/delovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#delovi-blok, #nalog-zaglavlje, #nalog-ukupno, #predlozeno-blok">
@@ -745,9 +764,13 @@
<td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);"> <td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">
{{if .Kolicina}}{{dinari .CenaKomada}} din{{else}}—{{end}} {{if .Kolicina}}{{dinari .CenaKomada}} din{{else}}—{{end}}
</td> </td>
{{if index $.Moduli "pdv"}}<td style="padding:9px 10px;text-align:center;font-size:12px;color:var(--tekst-sporedni);">{{printf "%.0f" .PdvStopa}}%</td>{{end}}
<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);"> <td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
{{if .Kolicina}}{{dinari .Ukupno}} din{{else}}—{{end}} {{if .Kolicina}}{{dinari .Ukupno}} din{{else}}—{{end}}
</td> </td>
{{if index $.Moduli "pdv"}}<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
{{if .Kolicina}}{{dinari .CenaSaPdv}} din{{else}}—{{end}}
</td>{{end}}
<td style="padding:9px 10px;text-align:center;"> <td style="padding:9px 10px;text-align:center;">
{{if and (index $.Dozvole "servis.izmeni") (ne $.Nalog.Status "U popravci")}} {{if and (index $.Dozvole "servis.izmeni") (ne $.Nalog.Status "U popravci")}}
{{if .ID}} {{if .ID}}
@@ -903,20 +926,41 @@
</div> </div>
{{end}} {{end}}
{{else}} {{else}}
{{if index .Moduli "pdv"}}
<div style="display:flex;justify-content:space-between;align-items:center;">
<span style="font-size:14px;color:var(--tekst-sporedni);">Usluge (rad) sa PDV-om</span>
<span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .UkupnoRadoviSaPdv}} din</span>
</div>
{{else}}
<div style="display:flex;justify-content:space-between;align-items:center;"> <div style="display:flex;justify-content:space-between;align-items:center;">
<span style="font-size:14px;color:var(--tekst-sporedni);">Usluge (rad)</span> <span style="font-size:14px;color:var(--tekst-sporedni);">Usluge (rad)</span>
<span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .UkupnoRadovi}} din</span> <span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .UkupnoRadovi}} din</span>
</div> </div>
{{end}}
{{if index .Moduli "pdv"}}
<div style="display:flex;justify-content:space-between;align-items:center;">
<span style="font-size:14px;color:var(--tekst-sporedni);">Ugrađeni delovi sa PDV-om</span>
<span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .UkupnoDeloviSaPdv}} din</span>
</div>
{{else}}
<div style="display:flex;justify-content:space-between;align-items:center;"> <div style="display:flex;justify-content:space-between;align-items:center;">
<span style="font-size:14px;color:var(--tekst-sporedni);">Ugrađeni delovi</span> <span style="font-size:14px;color:var(--tekst-sporedni);">Ugrađeni delovi</span>
<span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .UkupnoDelovi}} din</span> <span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .UkupnoDelovi}} din</span>
</div> </div>
{{end}} {{end}}
{{end}} {{end}}
{{end}}
{{if index .Moduli "pdv"}}
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:4px;">
<span style="font-size:16px;font-weight:700;color:var(--tekst-glavni);">UKUPNO sa PDV-om</span>
<span style="font-size:20px;font-weight:700;color:var(--tekst-glavni);">{{dinari .UkupnoSveSaPdv}} din</span>
</div>
{{else}}
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:8px;padding-top:14px;border-top:1px solid var(--ivica);"> <div style="display:flex;justify-content:space-between;align-items:center;margin-top:8px;padding-top:14px;border-top:1px solid var(--ivica);">
<span style="font-size:16px;font-weight:700;color:var(--tekst-glavni);">UKUPNO</span> <span style="font-size:16px;font-weight:700;color:var(--tekst-glavni);">UKUPNO</span>
<span style="font-size:20px;font-weight:700;color:var(--tekst-glavni);">{{dinari .UkupnoSve}} din</span> <span style="font-size:20px;font-weight:700;color:var(--tekst-glavni);">{{dinari .UkupnoSve}} din</span>
</div> </div>
{{end}}
</div> </div>
</div> </div>
@@ -6,7 +6,7 @@
<title>Garantni list — {{.Nalog.BrojNaloga}}</title> <title>Garantni list — {{.Nalog.BrojNaloga}}</title>
<style> <style>
* { box-sizing: border-box; margin: 0; padding: 0; } * { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; min-width: 780px; }
.strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; }
@@ -56,7 +56,7 @@
@media print { @media print {
body { font-size: 12px; } body { font-size: 12px; }
.strana { padding: 16px 20px; max-width: 100%; } .strana { padding: 32px 40px; max-width: 780px; }
.dugme-stampa { display: none !important; } .dugme-stampa { display: none !important; }
@page { size: A4; margin: 12mm 14mm; } @page { size: A4; margin: 12mm 14mm; }
} }
@@ -153,8 +153,8 @@
<tr> <tr>
<th>Opis rada</th> <th>Opis rada</th>
<th>Kol.</th> <th>Kol.</th>
<th>Cena</th> <th>Cena{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
<th>Ukupno</th> <th>Ukupno{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -162,8 +162,8 @@
<tr> <tr>
<td>{{.Naziv}}</td> <td>{{.Naziv}}</td>
<td style="text-align:right;">{{printf "%.0f" .Kolicina}}</td> <td style="text-align:right;">{{printf "%.0f" .Kolicina}}</td>
<td style="text-align:right;">{{dinari .CenaKomada}}</td> <td style="text-align:right;">{{if index $.Moduli "pdv"}}{{dinari .CenaSaPdv}}{{else}}{{dinari .CenaKomada}}{{end}}</td>
<td>{{dinari .Ukupno}}</td> <td>{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}}</td>
</tr> </tr>
{{end}} {{end}}
</tbody> </tbody>
@@ -183,8 +183,8 @@
<th>Naziv</th> <th>Naziv</th>
<th>Šifra</th> <th>Šifra</th>
<th>Kol.</th> <th>Kol.</th>
<th>Cena</th> <th>Cena{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
<th>Ukupno</th> <th>Ukupno{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -194,8 +194,8 @@
<td>{{.ArtikalNaziv}}</td> <td>{{.ArtikalNaziv}}</td>
<td style="font-family:monospace;">{{.ArtikalSifra}}</td> <td style="font-family:monospace;">{{.ArtikalSifra}}</td>
<td style="text-align:right;">{{.Kolicina}}</td> <td style="text-align:right;">{{.Kolicina}}</td>
<td style="text-align:right;">{{dinari .CenaKomada}}</td> <td style="text-align:right;">{{if index $.Moduli "pdv"}}{{dinari .CenaSaPdv}}{{else}}{{dinari .CenaKomada}}{{end}}</td>
<td>{{dinari .Ukupno}}</td> <td>{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}}</td>
</tr> </tr>
{{end}} {{end}}
{{end}} {{end}}
+1 -1
View File
@@ -6,7 +6,7 @@
<title>Nalepnica — {{.Nalog.BrojNaloga}}</title> <title>Nalepnica — {{.Nalog.BrojNaloga}}</title>
<style> <style>
* { box-sizing: border-box; margin: 0; padding: 0; } * { box-sizing: border-box; margin: 0; padding: 0; }
html, body { background: #f4f4f5; } html, body { background: #f4f4f5; min-width: 70mm; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; color: #111; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; color: #111; }
/* nalepnica 70×40 mm */ /* nalepnica 70×40 mm */
+14 -14
View File
@@ -6,7 +6,7 @@
<title>Otpremnica — {{.Nalog.BrojNaloga}}</title> <title>Otpremnica — {{.Nalog.BrojNaloga}}</title>
<style> <style>
* { box-sizing: border-box; margin: 0; padding: 0; } * { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; min-width: 780px; }
.strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; }
@@ -66,7 +66,7 @@
@media print { @media print {
body { font-size: 12px; } body { font-size: 12px; }
.strana { padding: 16px 20px; max-width: 100%; } .strana { padding: 32px 40px; max-width: 780px; }
.dugme-stampa { display: none !important; } .dugme-stampa { display: none !important; }
@page { size: A4; margin: 12mm 14mm; } @page { size: A4; margin: 12mm 14mm; }
/* red tabele se ne sme prelomiti preko granice stranice — prelom pada između stavki */ /* red tabele se ne sme prelomiti preko granice stranice — prelom pada između stavki */
@@ -177,8 +177,8 @@
<tr> <tr>
<th>Opis rada</th> <th>Opis rada</th>
<th class="desno" style="width:70px;">Kol.</th> <th class="desno" style="width:70px;">Kol.</th>
<th class="desno" style="width:120px;">Cena/kom</th> <th class="desno" style="width:120px;">Cena/kom{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
<th class="desno" style="width:120px;">Ukupno</th> <th class="desno" style="width:120px;">Ukupno{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -186,8 +186,8 @@
<tr> <tr>
<td>{{.Naziv}}</td> <td>{{.Naziv}}</td>
<td class="desno">{{printf "%.0f" .Kolicina}}</td> <td class="desno">{{printf "%.0f" .Kolicina}}</td>
<td class="desno">{{dinari .CenaKomada}} din</td> <td class="desno">{{if index $.Moduli "pdv"}}{{dinari .CenaSaPdv}}{{else}}{{dinari .CenaKomada}}{{end}} din</td>
<td class="desno">{{dinari .Ukupno}} din</td> <td class="desno">{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}} din</td>
</tr> </tr>
{{end}} {{end}}
</tbody> </tbody>
@@ -204,8 +204,8 @@
<tr> <tr>
<th>Artikal</th> <th>Artikal</th>
<th class="desno" style="width:70px;">Kol.</th> <th class="desno" style="width:70px;">Kol.</th>
<th class="desno" style="width:120px;">Cena/kom</th> <th class="desno" style="width:120px;">Cena/kom{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
<th class="desno" style="width:120px;">Ukupno</th> <th class="desno" style="width:120px;">Ukupno{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -213,13 +213,13 @@
<tr> <tr>
<td>{{.ArtikalNaziv}}</td> <td>{{.ArtikalNaziv}}</td>
<td class="desno">{{.Kolicina}}</td> <td class="desno">{{.Kolicina}}</td>
<td class="desno">{{dinari .CenaKomada}} din</td> <td class="desno">{{if index $.Moduli "pdv"}}{{dinari .CenaSaPdv}}{{else}}{{dinari .CenaKomada}}{{end}} din</td>
<td class="desno">{{dinari .Ukupno}} din</td> <td class="desno">{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}} 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">{{dinari .UkupnoDelovi}} din</td> <td class="desno">{{if index .Moduli "pdv"}}{{dinari .UkupnoDeloviSaPdv}}{{else}}{{dinari .UkupnoDelovi}}{{end}} din</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -246,7 +246,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">{{dinari .PreostaloSve}} din</div> <div class="naplata-iznos">{{if index .Moduli "pdv"}}{{dinari .PreostaloSveSaPdv}}{{else}}{{dinari .PreostaloSve}}{{end}} din</div>
</div> </div>
</div> </div>
{{else if .Nalog.CenaKonacna}} {{else if .Nalog.CenaKonacna}}
@@ -261,7 +261,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">{{dinari .UkupnoDelovi}} din</td> <td class="desno">{{if index .Moduli "pdv"}}{{dinari .UkupnoDeloviSaPdv}}{{else}}{{dinari .UkupnoDelovi}}{{end}} din</td>
</tr> </tr>
{{end}} {{end}}
{{if .ImaAvans}} {{if .ImaAvans}}
@@ -274,7 +274,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">{{dinari .PreostaloSve}} din</div> <div class="naplata-iznos">{{if index .Moduli "pdv"}}{{dinari .PreostaloSveSaPdv}}{{else}}{{dinari .PreostaloSve}}{{end}} din</div>
</div> </div>
</div> </div>
{{end}} {{end}}
+13 -13
View File
@@ -6,7 +6,7 @@
<title>Predračun — {{.Nalog.BrojNaloga}}</title> <title>Predračun — {{.Nalog.BrojNaloga}}</title>
<style> <style>
* { box-sizing: border-box; margin: 0; padding: 0; } * { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; min-width: 780px; }
.strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; }
@@ -50,7 +50,7 @@
@media print { @media print {
body { font-size: 12px; } body { font-size: 12px; }
.strana { padding: 16px 20px; max-width: 100%; } .strana { padding: 32px 40px; max-width: 780px; }
.dugme-stampa { display: none !important; } .dugme-stampa { display: none !important; }
@page { size: A4; margin: 12mm 14mm; } @page { size: A4; margin: 12mm 14mm; }
.tabela tr { break-inside: avoid; } .tabela tr { break-inside: avoid; }
@@ -152,8 +152,8 @@
<tr> <tr>
<th>Usluga</th> <th>Usluga</th>
<th class="desno" style="width:70px;">Kol.</th> <th class="desno" style="width:70px;">Kol.</th>
<th class="desno" style="width:120px;">Cena</th> <th class="desno" style="width:120px;">Cena{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
<th class="desno" style="width:120px;">Ukupno</th> <th class="desno" style="width:120px;">Ukupno{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -161,8 +161,8 @@
<tr> <tr>
<td>{{.Naziv}}</td> <td>{{.Naziv}}</td>
<td class="desno">{{.Kolicina}}</td> <td class="desno">{{.Kolicina}}</td>
<td class="desno">{{dinari .CenaKomada}} din</td> <td class="desno">{{if index $.Moduli "pdv"}}{{dinari .CenaSaPdv}}{{else}}{{dinari .CenaKomada}}{{end}} din</td>
<td class="desno">{{dinari .Ukupno}} din</td> <td class="desno">{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}} din</td>
</tr> </tr>
{{end}} {{end}}
</tbody> </tbody>
@@ -179,8 +179,8 @@
<tr> <tr>
<th>Artikal</th> <th>Artikal</th>
<th class="desno" style="width:70px;">Kol.</th> <th class="desno" style="width:70px;">Kol.</th>
<th class="desno" style="width:120px;">Cena/kom</th> <th class="desno" style="width:120px;">Cena/kom{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
<th class="desno" style="width:120px;">Ukupno</th> <th class="desno" style="width:120px;">Ukupno{{if index .Moduli "pdv"}} sa PDV{{end}}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -188,8 +188,8 @@
<tr> <tr>
<td>{{.ArtikalNaziv}}</td> <td>{{.ArtikalNaziv}}</td>
<td class="desno">{{.Kolicina}}</td> <td class="desno">{{.Kolicina}}</td>
<td class="desno">{{dinari .CenaKomada}} din</td> <td class="desno">{{if index $.Moduli "pdv"}}{{dinari .CenaSaPdv}}{{else}}{{dinari .CenaKomada}}{{end}} din</td>
<td class="desno">{{dinari .Ukupno}} din</td> <td class="desno">{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}} din</td>
</tr> </tr>
{{end}} {{end}}
</tbody> </tbody>
@@ -208,11 +208,11 @@
<!-- rekapitulacija: ponavlja sume po sekciji (korisno kad tabele pređu na prethodnu stranu) --> <!-- rekapitulacija: ponavlja sume po sekciji (korisno kad tabele pređu na prethodnu stranu) -->
<div class="rekap"> <div class="rekap">
{{if .Radovi}}<div class="rekap-red" style="font-weight:600;"><span>Ukupno radovi</span><span>{{dinari .UkupnoRad}} din</span></div>{{end}} {{if .Radovi}}<div class="rekap-red" style="font-weight:600;"><span>Ukupno radovi</span><span>{{if index .Moduli "pdv"}}{{dinari .UkupnoRadSaPdv}}{{else}}{{dinari .UkupnoRad}}{{end}} din</span></div>{{end}}
{{if .ServisniDelovi}}<div class="rekap-red" style="font-weight:600;"><span>Ukupno delovi</span><span>{{dinari .UkupnoDelovi}} din</span></div>{{end}} {{if .ServisniDelovi}}<div class="rekap-red" style="font-weight:600;"><span>Ukupno delovi</span><span>{{if index .Moduli "pdv"}}{{dinari .UkupnoDeloviSaPdv}}{{else}}{{dinari .UkupnoDelovi}}{{end}} din</span></div>{{end}}
<div class="rekap-ukupno"> <div class="rekap-ukupno">
<div class="rekap-ukupno-labela">Ukupno (procena):</div> <div class="rekap-ukupno-labela">Ukupno (procena):</div>
<div class="rekap-ukupno-iznos">{{dinari .UkupnoSve}} din</div> <div class="rekap-ukupno-iznos">{{if index .Moduli "pdv"}}{{dinari .UkupnoSveSaPdv}}{{else}}{{dinari .UkupnoSve}}{{end}} din</div>
</div> </div>
</div> </div>
@@ -6,7 +6,7 @@
<title>Radni nalog {{.Nalog.BrojNaloga}}</title> <title>Radni nalog {{.Nalog.BrojNaloga}}</title>
<style> <style>
* { box-sizing: border-box; margin: 0; padding: 0; } * { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; min-width: 780px; }
.strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; }
@@ -56,7 +56,7 @@
@media print { @media print {
body { font-size: 12px; } body { font-size: 12px; }
.strana { padding: 12px 16px; max-width: 100%; } .strana { padding: 32px 40px; max-width: 780px; }
.dugme-stampa { display: none !important; } .dugme-stampa { display: none !important; }
@page { size: A4; margin: 8mm 10mm; } @page { size: A4; margin: 8mm 10mm; }
.odeljak { margin-bottom: 10px; } .odeljak { margin-bottom: 10px; }
+2 -2
View File
@@ -6,7 +6,7 @@
<title>Revers — {{.Nalog.BrojNaloga}}</title> <title>Revers — {{.Nalog.BrojNaloga}}</title>
<style> <style>
* { box-sizing: border-box; margin: 0; padding: 0; } * { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; font-size: 13px; color: #111; background: #fff; min-width: 780px; }
.strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; } .strana { max-width: 780px; margin: 0 auto; padding: 32px 40px; }
@@ -57,7 +57,7 @@
@page { size: A4; margin: 12mm 14mm 18mm; } @page { size: A4; margin: 12mm 14mm 18mm; }
@media print { @media print {
body { font-size: 12px; } body { font-size: 12px; }
.strana { padding: 16px 20px; max-width: 100%; } .strana { padding: 32px 40px; max-width: 780px; }
.dugme-stampa { display: none !important; } .dugme-stampa { display: none !important; }
/* uslovi servisa (sa potpisima) idu na novu stranicu */ /* uslovi servisa (sa potpisima) idu na novu stranicu */
.uslovi-strana { break-before: page; } .uslovi-strana { break-before: page; }
@@ -243,26 +243,26 @@
{{range .Radovi}} {{range .Radovi}}
<div class="red"> <div class="red">
<span class="red-labela">{{.Naziv}}{{if gt .Kolicina 1.0}} &times;{{.Kolicina}}{{end}}</span> <span class="red-labela">{{.Naziv}}{{if gt .Kolicina 1.0}} &times;{{.Kolicina}}{{end}}</span>
<span class="red-vrednost">{{dinari .Ukupno}} din</span> <span class="red-vrednost">{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}} din</span>
</div> </div>
{{end}} {{end}}
{{range .ServisniDelovi}} {{range .ServisniDelovi}}
<div class="red"> <div class="red">
<span class="red-labela">{{.ArtikalNaziv}}{{if gt .Kolicina 1}} &times;{{.Kolicina}}{{end}}</span> <span class="red-labela">{{.ArtikalNaziv}}{{if gt .Kolicina 1}} &times;{{.Kolicina}}{{end}}</span>
<span class="red-vrednost">{{dinari .Ukupno}} din</span> <span class="red-vrednost">{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}} din</span>
</div> </div>
{{end}} {{end}}
<div class="cena-blok" style="margin-top:12px;display:flex;justify-content:space-between;align-items:center;"> <div class="cena-blok" style="margin-top:12px;display:flex;justify-content:space-between;align-items:center;">
<span class="cena-labela" style="margin:0;">Ukupno (procena)</span> <span class="cena-labela" style="margin:0;">Ukupno (procena)</span>
<span class="cena-vrednost">{{dinari .UkupnoSve}} din</span> <span class="cena-vrednost">{{if index .Moduli "pdv"}}{{dinari .UkupnoSveSaPdv}}{{else}}{{dinari .UkupnoSve}}{{end}} din</span>
</div> </div>
{{if .ImaPredlog}} {{if .ImaPredlog}}
<div class="cena-blok" style="margin-top:8px;padding:10px 14px;display:flex;justify-content:space-between;align-items:center;background:#0f172a;border:1px solid #f59e0b;border-radius:8px;"> <div class="cena-blok" style="margin-top:8px;padding:10px 14px;display:flex;justify-content:space-between;align-items:center;background:#0f172a;border:1px solid #f59e0b;border-radius:8px;">
<span class="cena-labela" style="margin:0;color:#fbbf24;">Sa predlogom</span> <span class="cena-labela" style="margin:0;color:#fbbf24;">Sa predlogom</span>
<span class="cena-vrednost" id="sa-predlogom-zbir" data-base="{{printf "%.2f" .UkupnoSve}}" style="font-size:16px;font-weight:700;color:#fbbf24;">{{dinari .UkupnoSaPredlogom}} din</span> <span class="cena-vrednost" id="sa-predlogom-zbir" data-base="{{if index .Moduli "pdv"}}{{printf "%.2f" .UkupnoSveSaPdv}}{{else}}{{printf "%.2f" .UkupnoSve}}{{end}}" style="font-size:16px;font-weight:700;color:#fbbf24;">{{if index .Moduli "pdv"}}{{dinari .UkupnoSaPredlogomSaPdv}}{{else}}{{dinari .UkupnoSaPredlogom}}{{end}} din</span>
</div> </div>
{{end}} {{end}}
</div> </div>
@@ -286,11 +286,11 @@
{{range .PredlozeniRadovi}} {{range .PredlozeniRadovi}}
<label style="display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:0.5px solid #1e293b;cursor:pointer;"> <label style="display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:0.5px solid #1e293b;cursor:pointer;">
<span style="display:flex;align-items:center;gap:10px;flex:1;"> <span style="display:flex;align-items:center;gap:10px;flex:1;">
<input type="checkbox" name="rad_id" value="{{.ID}}" checked data-iznos="{{printf "%.2f" .Ukupno}}" <input type="checkbox" name="rad_id" value="{{.ID}}" checked data-iznos="{{if index $.Moduli "pdv"}}{{printf "%.2f" .UkupnoSaPdv}}{{else}}{{printf "%.2f" .Ukupno}}{{end}}"
style="width:18px;height:18px;accent-color:#f59e0b;flex-shrink:0;"> style="width:18px;height:18px;accent-color:#f59e0b;flex-shrink:0;">
<span style="font-size:13px;color:#e2e8f0;">{{.Naziv}}{{if gt .Kolicina 1.0}} &times; {{printf "%.0f" .Kolicina}}{{end}}</span> <span style="font-size:13px;color:#e2e8f0;">{{.Naziv}}{{if gt .Kolicina 1.0}} &times; {{printf "%.0f" .Kolicina}}{{end}}</span>
</span> </span>
<span style="font-size:13px;font-weight:600;color:#fbbf24;white-space:nowrap;">{{dinari .Ukupno}} din</span> <span style="font-size:13px;font-weight:600;color:#fbbf24;white-space:nowrap;">{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}} din</span>
</label> </label>
{{end}} {{end}}
{{end}} {{end}}
@@ -300,18 +300,18 @@
{{range .PredlozeniDelovi}} {{range .PredlozeniDelovi}}
<label style="display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:0.5px solid #1e293b;cursor:pointer;"> <label style="display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:0.5px solid #1e293b;cursor:pointer;">
<span style="display:flex;align-items:center;gap:10px;flex:1;"> <span style="display:flex;align-items:center;gap:10px;flex:1;">
<input type="checkbox" name="artikal_id" value="{{.ArtikalID}}" checked data-iznos="{{printf "%.2f" .Ukupno}}" <input type="checkbox" name="artikal_id" value="{{.ArtikalID}}" checked data-iznos="{{if index $.Moduli "pdv"}}{{printf "%.2f" .UkupnoSaPdv}}{{else}}{{printf "%.2f" .Ukupno}}{{end}}"
style="width:18px;height:18px;accent-color:#f59e0b;flex-shrink:0;"> style="width:18px;height:18px;accent-color:#f59e0b;flex-shrink:0;">
<span style="font-size:13px;color:#e2e8f0;">{{.ArtikalNaziv}}{{if gt .Kolicina 1}} &times; {{.Kolicina}}{{end}}</span> <span style="font-size:13px;color:#e2e8f0;">{{.ArtikalNaziv}}{{if gt .Kolicina 1}} &times; {{.Kolicina}}{{end}}</span>
</span> </span>
<span style="font-size:13px;font-weight:600;color:#fbbf24;white-space:nowrap;">{{dinari .Ukupno}} din</span> <span style="font-size:13px;font-weight:600;color:#fbbf24;white-space:nowrap;">{{if index $.Moduli "pdv"}}{{dinari .UkupnoSaPdv}}{{else}}{{dinari .Ukupno}}{{end}} din</span>
</label> </label>
{{end}} {{end}}
{{end}} {{end}}
<div class="cena-blok predlog-ukupno" style="margin-top:12px;display:flex;justify-content:space-between;align-items:center;"> <div class="cena-blok predlog-ukupno" style="margin-top:12px;display:flex;justify-content:space-between;align-items:center;">
<span class="cena-labela" style="margin:0;">Predlog ukupno</span> <span class="cena-labela" style="margin:0;">Predlog ukupno</span>
<span class="cena-vrednost" id="predlog-zbir">{{dinari .UkupnoPredlog}} din</span> <span class="cena-vrednost" id="predlog-zbir">{{if index .Moduli "pdv"}}{{dinari .UkupnoPredlogSaPdv}}{{else}}{{dinari .UkupnoPredlog}}{{end}} din</span>
</div> </div>
<textarea name="komentar" placeholder="Poruka serviseru (opciono)..." rows="2" <textarea name="komentar" placeholder="Poruka serviseru (opciono)..." rows="2"