f29e76612e
Servis: - Nova polja: ostecenja, pin_uredjaja, pribor (migracija 051) - Default garancija iz podešavanja, svič "Bez garancije" u formi - Podešavanja → Servis: konfigurabilan rok garancije (migracija 052) - Default datum prijema = danas; datum_prijema se eksplicitno upisuje - Sidebar link za Servis podešavanja PDV/Nivelacije: - Default raspon datuma = početak/kraj tekućeg meseca (KIR, KPR, Nivelacije) - Dodata class="tabela" na tabele bez klase (KIR, KPR, Obračun, Nivelacije) Animacije (Moj profil → Tema): - Korisnik bira vrstu animacije: bez, fadeInUp, fadeIn, scaleIn, slideLeft - Čuva se po korisniku u korisnici.lokalna_animacija (migracija 053) - CSS [data-animacija] radi na body (globalno) i na preview wrapperima (izolovano) - Preview animacije izolovan: data-animacija na #anim-preview-wrap, ne na body - Mobilne kartice se animiraju kad korisnik odabere stil (podrazumevano ne) - Animacija primenjena direktno na .tabela tbody tr (bez potrebe za .animiraj) Hover efekti (Moj profil → Tema): - Opcije: podrazumevano, bez, podizanje, svetlost, zoom, boja - Čuva se po korisniku u korisnici.lokalni_hover (migracija 054) - CSS [data-hover] radi izolovano; preview menja samo #hover-preview-wrap - Pojačane senke u oba teme (--senka i nova --senka-hover promenljiva) - Transition dodat za transform i background na karticama Grafikon (Izveštaji): toggle zamenjen globalnim .toggl/.toggl-klizac svičom
151 lines
3.4 KiB
Go
151 lines
3.4 KiB
Go
package model
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
)
|
||
|
||
// Statusi servisnog naloga
|
||
const (
|
||
StatusPrimljeno = "Primljeno"
|
||
StatusDijagnostika = "U dijagnostici"
|
||
StatusCekaDelove = "Čeka delove"
|
||
StatusUPopravci = "U popravci"
|
||
StatusZavrseno = "Završeno"
|
||
StatusPreuzeto = "Preuzeto"
|
||
)
|
||
|
||
// SviStatusi je uređena lista statusa za prikaz u dropdownu
|
||
var SviStatusi = []string{
|
||
StatusPrimljeno,
|
||
StatusDijagnostika,
|
||
StatusCekaDelove,
|
||
StatusUPopravci,
|
||
StatusZavrseno,
|
||
StatusPreuzeto,
|
||
}
|
||
|
||
// ServisniNalog predstavlja jedan servisni nalog
|
||
type ServisniNalog struct {
|
||
ID int64
|
||
KlijentID *int64
|
||
TehnicarID *int64
|
||
BrojNaloga string
|
||
Uredjaj string
|
||
SerijskiBroj string
|
||
OpisKvara string
|
||
Status string
|
||
CenaOd *float64
|
||
CenaDo *float64
|
||
CenaKonacna *float64
|
||
Avans *float64
|
||
Napomena string
|
||
GarancijaDo *time.Time
|
||
DatumPrijema time.Time
|
||
DatumZavrsetka *time.Time
|
||
Ostecenja string
|
||
PinUredjaja string
|
||
Pribor string
|
||
}
|
||
|
||
// ServisniDeo predstavlja jedan artikal ugrađen u servisni nalog
|
||
type ServisniDeo struct {
|
||
ID int64
|
||
NalogID int64
|
||
ArtikalID int64
|
||
Kolicina int
|
||
CenaKomada float64
|
||
Datum time.Time
|
||
}
|
||
|
||
// Ukupno vraća ukupnu vrednost dela (kolicina × cena)
|
||
func (d ServisniDeo) Ukupno() float64 {
|
||
return float64(d.Kolicina) * d.CenaKomada
|
||
}
|
||
|
||
// ServisniDeoSaArtiklom je servisni deo sa nazivom artikla — za prikaz
|
||
type ServisniDeoSaArtiklom struct {
|
||
ServisniDeo
|
||
ArtikalNaziv string
|
||
}
|
||
|
||
// ServisniNalogSaKlijentom proširuje ServisniNalog sa nazivom klijenta za prikaz u listi
|
||
type ServisniNalogSaKlijentom struct {
|
||
ServisniNalog
|
||
KlijentNaziv string
|
||
}
|
||
|
||
// KlijentIDVrednost vraća vrednost KlijentID pointera, ili 0 ako je nil
|
||
func (n ServisniNalog) KlijentIDVrednost() int64 {
|
||
if n.KlijentID == nil {
|
||
return 0
|
||
}
|
||
return *n.KlijentID
|
||
}
|
||
|
||
// TehnicarIDVrednost vraća vrednost TehnicarID pointera, ili 0 ako je nil
|
||
func (n ServisniNalog) TehnicarIDVrednost() int64 {
|
||
if n.TehnicarID == nil {
|
||
return 0
|
||
}
|
||
return *n.TehnicarID
|
||
}
|
||
|
||
// CenaOdStr vraća formatiranu procenu od, ili prazan string ako nije uneta
|
||
func (n ServisniNalog) CenaOdStr() string {
|
||
if n.CenaOd == nil {
|
||
return ""
|
||
}
|
||
return fmt.Sprintf("%.2f", *n.CenaOd)
|
||
}
|
||
|
||
// CenaDoStr vraća formatiranu procenu do, ili prazan string ako nije uneta
|
||
func (n ServisniNalog) CenaDoStr() string {
|
||
if n.CenaDo == nil {
|
||
return ""
|
||
}
|
||
return fmt.Sprintf("%.2f", *n.CenaDo)
|
||
}
|
||
|
||
// CenaKonacnaStr vraća formatiranu konačnu cenu, ili prazan string ako nije uneta
|
||
func (n ServisniNalog) CenaKonacnaStr() string {
|
||
if n.CenaKonacna == nil {
|
||
return ""
|
||
}
|
||
return fmt.Sprintf("%.2f", *n.CenaKonacna)
|
||
}
|
||
|
||
// AvansStr vraća formatirani avans, ili prazan string ako nije unet
|
||
func (n ServisniNalog) AvansStr() string {
|
||
if n.Avans == nil {
|
||
return ""
|
||
}
|
||
return fmt.Sprintf("%.2f", *n.Avans)
|
||
}
|
||
|
||
// PreostaloZaNaplatu vraća razliku konacna_cena − avans, minimum 0.
|
||
// Vraća nil ako konačna cena nije uneta.
|
||
func (n ServisniNalog) PreostaloZaNaplatu() *float64 {
|
||
if n.CenaKonacna == nil {
|
||
return nil
|
||
}
|
||
avans := 0.0
|
||
if n.Avans != nil {
|
||
avans = *n.Avans
|
||
}
|
||
v := *n.CenaKonacna - avans
|
||
if v < 0 {
|
||
v = 0
|
||
}
|
||
return &v
|
||
}
|
||
|
||
// PreostaloZaNaplatuStr vraća formatirano preostalo za naplatu, ili prazan string
|
||
func (n ServisniNalog) PreostaloZaNaplatuStr() string {
|
||
v := n.PreostaloZaNaplatu()
|
||
if v == nil {
|
||
return ""
|
||
}
|
||
return fmt.Sprintf("%.2f", *v)
|
||
}
|