Prodaja: filteri liste (period, storno) i pretraga klijenta u novoj prodaji
- Lista prodaje: filter po periodu (od/do), prečica 'Ovaj mesec', filter samo stornirano - Nova prodaja: pretraga klijenta sa filterom tipa (sva/pravna/fizička lica) umesto običnog dropdown-a, sa dogruzavanjem rezultata pri skrolu - Ispravljen nedostajući CSRF token u formi nove prodaje (POST je uvek padao na 403) - Ispravljeno vizuelno poravnanje polja Način plaćanja
This commit is contained in:
@@ -219,9 +219,17 @@ type ServisRepository interface {
|
||||
SacuvajNaplatu(ctx context.Context, id int64, nacinPlacanja string, naplaceno float64) error
|
||||
}
|
||||
|
||||
// ProdajaFilter definiše parametre za filtriranje liste prodajnih naloga
|
||||
type ProdajaFilter struct {
|
||||
Pretraga string
|
||||
Od string // YYYY-MM-DD, prazno = bez donje granice
|
||||
Do string // YYYY-MM-DD, prazno = bez gornje granice
|
||||
SamoStornirano bool
|
||||
}
|
||||
|
||||
// ProdajaRepository definiše operacije nad prodajnim nalozima
|
||||
type ProdajaRepository interface {
|
||||
Lista(ctx context.Context, pretraga string) ([]model.ProdajniNalogSaDetaljem, error)
|
||||
Lista(ctx context.Context, filter ProdajaFilter) ([]model.ProdajniNalogSaDetaljem, error)
|
||||
DohvatiID(ctx context.Context, id int64) (*model.ProdajniNalog, error)
|
||||
DohvatiStavke(ctx context.Context, nalogID int64) ([]model.StavkaProdajeSaArtiklom, error)
|
||||
Kreiraj(ctx context.Context, n *model.ProdajniNalog, stavke []model.StavkaProdaje, korisnikID *int64) (int64, error)
|
||||
|
||||
@@ -37,8 +37,8 @@ func (r *ProdajaRepo) SledeciBroj(ctx context.Context) (string, error) {
|
||||
return fmt.Sprintf("PR-%d-%04d", godina, sledeci), nil
|
||||
}
|
||||
|
||||
// Lista vraća listu prodajnih naloga sa imenom klijenta, opcionom pretragom
|
||||
func (r *ProdajaRepo) Lista(ctx context.Context, pretraga string) ([]model.ProdajniNalogSaDetaljem, error) {
|
||||
// Lista vraća listu prodajnih naloga sa imenom klijenta, po zadatom filteru
|
||||
func (r *ProdajaRepo) Lista(ctx context.Context, filter db.ProdajaFilter) ([]model.ProdajniNalogSaDetaljem, error) {
|
||||
upit := `
|
||||
SELECT
|
||||
pn.id, pn.klijent_id, pn.broj_naloga, pn.napomena, pn.ukupno,
|
||||
@@ -50,9 +50,22 @@ func (r *ProdajaRepo) Lista(ctx context.Context, pretraga string) ([]model.Proda
|
||||
|
||||
args := []any{}
|
||||
|
||||
if pretraga != "" {
|
||||
if filter.Pretraga != "" {
|
||||
upit += " AND (pn.broj_naloga LIKE ? OR kp.naziv LIKE ? OR pn.napomena LIKE ?)"
|
||||
args = append(args, "%"+pretraga+"%", "%"+pretraga+"%", "%"+pretraga+"%")
|
||||
args = append(args, "%"+filter.Pretraga+"%", "%"+filter.Pretraga+"%", "%"+filter.Pretraga+"%")
|
||||
}
|
||||
// pn.datum se čuva preko time.Time.String() (uključuje monotonic sufiks i naziv zone),
|
||||
// pa ga SQLite-ova date() funkcija ne parsira ispravno — poredimo samo ISO datum na početku stringa
|
||||
if filter.Od != "" {
|
||||
upit += " AND substr(pn.datum, 1, 10) >= ?"
|
||||
args = append(args, filter.Od)
|
||||
}
|
||||
if filter.Do != "" {
|
||||
upit += " AND substr(pn.datum, 1, 10) <= ?"
|
||||
args = append(args, filter.Do)
|
||||
}
|
||||
if filter.SamoStornirano {
|
||||
upit += " AND pn.stornirano = 1"
|
||||
}
|
||||
|
||||
upit += " ORDER BY pn.datum DESC"
|
||||
|
||||
Reference in New Issue
Block a user