Servis: oznaka naloga bez izdatog fiskalnog računa u arhivi
This commit is contained in:
@@ -384,6 +384,7 @@ type FiskalRepository interface {
|
|||||||
DohvatiPoProdaji(ctx context.Context, prodajaID int64) (*model.FiskalniRacun, error)
|
DohvatiPoProdaji(ctx context.Context, prodajaID int64) (*model.FiskalniRacun, error)
|
||||||
DohvatiPoServisu(ctx context.Context, servisID int64) (*model.FiskalniRacun, error)
|
DohvatiPoServisu(ctx context.Context, servisID int64) (*model.FiskalniRacun, error)
|
||||||
OznačiKaoStorniran(ctx context.Context, id int64) error
|
OznačiKaoStorniran(ctx context.Context, id int64) error
|
||||||
|
ServisiBezFiskalnog(ctx context.Context) (map[int64]bool, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServisniLogRepository definiše operacije nad log-om događaja servisnog naloga.
|
// ServisniLogRepository definiše operacije nad log-om događaja servisnog naloga.
|
||||||
|
|||||||
@@ -115,6 +115,28 @@ func (r *FiskalRepo) DohvatiPoServisu(ctx context.Context, servisID int64) (*mod
|
|||||||
return fr, nil
|
return fr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ServisiBezFiskalnog vraća skup ID-eva servisnih naloga koji su u statusu "Preuzeto"
|
||||||
|
// a nemaju fiskalni račun (za oznaku u listi naloga).
|
||||||
|
func (r *FiskalRepo) ServisiBezFiskalnog(ctx context.Context) (map[int64]bool, error) {
|
||||||
|
rows, err := r.db.QueryContext(ctx, `
|
||||||
|
SELECT sn.id FROM servisni_nalozi sn
|
||||||
|
LEFT JOIN fiskalni_racuni fr ON fr.servis_id = sn.id AND fr.storniran = 0
|
||||||
|
WHERE sn.status = 'Preuzeto' AND fr.id IS NULL`)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
out := make(map[int64]bool)
|
||||||
|
for rows.Next() {
|
||||||
|
var id int64
|
||||||
|
if err := rows.Scan(&id); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out[id] = true
|
||||||
|
}
|
||||||
|
return out, rows.Err()
|
||||||
|
}
|
||||||
|
|
||||||
// OznačiKaoStorniran postavlja storniran=1 za fiskalni račun sa datim ID-jem.
|
// OznačiKaoStorniran postavlja storniran=1 za fiskalni račun sa datim ID-jem.
|
||||||
func (r *FiskalRepo) OznačiKaoStorniran(ctx context.Context, id int64) error {
|
func (r *FiskalRepo) OznačiKaoStorniran(ctx context.Context, id int64) error {
|
||||||
_, err := r.db.ExecContext(ctx, "UPDATE fiskalni_racuni SET storniran = 1 WHERE id = ?", id)
|
_, err := r.db.ExecContext(ctx, "UPDATE fiskalni_racuni SET storniran = 1 WHERE id = ?", id)
|
||||||
|
|||||||
@@ -29,12 +29,13 @@ import (
|
|||||||
// PodaciServisa su podaci za stranicu sa listom servisnih naloga
|
// PodaciServisa su podaci za stranicu sa listom servisnih naloga
|
||||||
type PodaciServisa struct {
|
type PodaciServisa struct {
|
||||||
model.PodaciStranice
|
model.PodaciStranice
|
||||||
Nalozi []model.ServisniNalogSaKlijentom
|
Nalozi []model.ServisniNalogSaKlijentom
|
||||||
Pretraga string
|
Pretraga string
|
||||||
FilterStatus string
|
FilterStatus string
|
||||||
SviStatusi []string
|
SviStatusi []string
|
||||||
Sacuvano bool
|
Sacuvano bool
|
||||||
Obrisan bool
|
Obrisan bool
|
||||||
|
NemaFiskalnog map[int64]bool // ID-evi naloga sa statusom Preuzeto koji nemaju fiskalni račun
|
||||||
}
|
}
|
||||||
|
|
||||||
// PodaciFormeNaloga su podaci za formu novog/izmenjenog servisnog naloga
|
// PodaciFormeNaloga su podaci za formu novog/izmenjenog servisnog naloga
|
||||||
@@ -106,6 +107,10 @@ func (h *Handler) Servis(w http.ResponseWriter, r *http.Request) {
|
|||||||
ps := h.popuniPodaciStranice(r, podesavanja)
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
||||||
ps.Stranica = "servis"
|
ps.Stranica = "servis"
|
||||||
ps.NaslovStranice = "Servis"
|
ps.NaslovStranice = "Servis"
|
||||||
|
var nemaFiskalnog map[int64]bool
|
||||||
|
if h.modulUkljucen(r.Context(), config.ModulFiskalizacija) {
|
||||||
|
nemaFiskalnog, _ = h.FiskalRepo.ServisiBezFiskalnog(r.Context())
|
||||||
|
}
|
||||||
podaci := PodaciServisa{
|
podaci := PodaciServisa{
|
||||||
PodaciStranice: ps,
|
PodaciStranice: ps,
|
||||||
Nalozi: nalozi,
|
Nalozi: nalozi,
|
||||||
@@ -114,6 +119,7 @@ func (h *Handler) Servis(w http.ResponseWriter, r *http.Request) {
|
|||||||
SviStatusi: model.SviStatusi,
|
SviStatusi: model.SviStatusi,
|
||||||
Sacuvano: r.URL.Query().Get("sacuvano") == "1",
|
Sacuvano: r.URL.Query().Get("sacuvano") == "1",
|
||||||
Obrisan: r.URL.Query().Get("obrisan") == "1",
|
Obrisan: r.URL.Query().Get("obrisan") == "1",
|
||||||
|
NemaFiskalnog: nemaFiskalnog,
|
||||||
}
|
}
|
||||||
|
|
||||||
h.renderujTemplate(w, "servis", podaci)
|
h.renderujTemplate(w, "servis", podaci)
|
||||||
@@ -138,11 +144,16 @@ func (h *Handler) ArhivaServisa(w http.ResponseWriter, r *http.Request) {
|
|||||||
ps := h.popuniPodaciStranice(r, podesavanja)
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
||||||
ps.Stranica = "servis"
|
ps.Stranica = "servis"
|
||||||
ps.NaslovStranice = "Arhiva servisa"
|
ps.NaslovStranice = "Arhiva servisa"
|
||||||
|
var nemaFiskalnog map[int64]bool
|
||||||
|
if h.modulUkljucen(r.Context(), config.ModulFiskalizacija) {
|
||||||
|
nemaFiskalnog, _ = h.FiskalRepo.ServisiBezFiskalnog(r.Context())
|
||||||
|
}
|
||||||
podaci := PodaciServisa{
|
podaci := PodaciServisa{
|
||||||
PodaciStranice: ps,
|
PodaciStranice: ps,
|
||||||
Nalozi: nalozi,
|
Nalozi: nalozi,
|
||||||
Pretraga: pretraga,
|
Pretraga: pretraga,
|
||||||
SviStatusi: model.SviStatusi,
|
SviStatusi: model.SviStatusi,
|
||||||
|
NemaFiskalnog: nemaFiskalnog,
|
||||||
}
|
}
|
||||||
|
|
||||||
h.renderujTemplate(w, "servis_arhiva", podaci)
|
h.renderujTemplate(w, "servis_arhiva", podaci)
|
||||||
|
|||||||
@@ -48,6 +48,9 @@
|
|||||||
style="font-size:14px;font-weight:500;color:var(--sb-akcent);text-decoration:none;font-family:monospace;">
|
style="font-size:14px;font-weight:500;color:var(--sb-akcent);text-decoration:none;font-family:monospace;">
|
||||||
{{.BrojNaloga}}
|
{{.BrojNaloga}}
|
||||||
</a>
|
</a>
|
||||||
|
{{if index $.NemaFiskalnog .ID}}
|
||||||
|
<span style="display:inline-block;margin-left:6px;font-size:10px;font-weight:600;padding:1px 6px;border-radius:4px;background:#fef3c7;color:#92400e;border:1px solid #fde68a;vertical-align:middle;" title="Fiskalni račun nije izdat">!</span>
|
||||||
|
{{end}}
|
||||||
</td>
|
</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 .KlijentNaziv}}{{.KlijentNaziv}}{{else}}—{{end}}
|
{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}—{{end}}
|
||||||
@@ -81,7 +84,10 @@
|
|||||||
<a hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML" href="/servis/{{.ID}}" class="kartica servis-kartica animiraj kartica-link">
|
<a hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML" href="/servis/{{.ID}}" class="kartica servis-kartica animiraj kartica-link">
|
||||||
<div class="red-izmedju" style="align-items:flex-start;gap:12px;margin-bottom:10px;">
|
<div class="red-izmedju" style="align-items:flex-start;gap:12px;margin-bottom:10px;">
|
||||||
<div>
|
<div>
|
||||||
<div style="font-size:15px;font-weight:500;color:var(--sb-akcent);font-family:monospace;">{{.BrojNaloga}}</div>
|
<div style="font-size:15px;font-weight:500;color:var(--sb-akcent);font-family:monospace;">
|
||||||
|
{{.BrojNaloga}}
|
||||||
|
{{if index $.NemaFiskalnog .ID}}<span style="display:inline-block;margin-left:4px;font-size:10px;font-weight:600;padding:1px 5px;border-radius:4px;background:#fef3c7;color:#92400e;border:1px solid #fde68a;vertical-align:middle;" title="Fiskalni račun nije izdat">!</span>{{end}}
|
||||||
|
</div>
|
||||||
<div style="font-size:13px;color:var(--tekst-glavni);margin-top:2px;">{{.Uredjaj}}</div>
|
<div style="font-size:13px;color:var(--tekst-glavni);margin-top:2px;">{{.Uredjaj}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="flex-shrink:0;">{{template "status-badge" .Status}}</div>
|
<div style="flex-shrink:0;">{{template "status-badge" .Status}}</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user