Zalihe: razlikovanje manjka i viška pri popisu (manjak_popis/visak_popis tip promene)
This commit is contained in:
@@ -29,8 +29,8 @@ type ArtikalRepository interface {
|
|||||||
Vrati(ctx context.Context, id int64) error
|
Vrati(ctx context.Context, id int64) error
|
||||||
// SledecaSifra vraća predlog sledeće auto-šifre (npr. KOMP-0042 ili ART-0042)
|
// SledecaSifra vraća predlog sledeće auto-šifre (npr. KOMP-0042 ili ART-0042)
|
||||||
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 promenu 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, tipPromene string) error
|
||||||
// DobavljaciArtikla vraća ID-jeve dobavljača vezanih za artikal
|
// DobavljaciArtikla vraća ID-jeve dobavljača vezanih za artikal
|
||||||
DobavljaciArtikla(ctx context.Context, artikalID int64) ([]int64, error)
|
DobavljaciArtikla(ctx context.Context, artikalID int64) ([]int64, error)
|
||||||
// PostaviDobavljaceArtikla zamenjuje skup dobavljača artikla datim ID-jevima
|
// PostaviDobavljaceArtikla zamenjuje skup dobavljača artikla datim ID-jevima
|
||||||
@@ -152,7 +152,7 @@ type NabavkaRepository interface {
|
|||||||
DohvatiStavke(ctx context.Context, nabavkaID int64) ([]model.StavkaSaArtiklom, error)
|
DohvatiStavke(ctx context.Context, nabavkaID int64) ([]model.StavkaSaArtiklom, error)
|
||||||
DohvatiTroskove(ctx context.Context, nabavkaID int64) ([]model.NabavkaTrosak, error)
|
DohvatiTroskove(ctx context.Context, nabavkaID int64) ([]model.NabavkaTrosak, error)
|
||||||
Kreiraj(ctx context.Context, n *model.Nabavka, stavke []model.StavkaNabavke, troskovi []model.NabavkaTrosak, korisnikID *int64) (int64, error)
|
Kreiraj(ctx context.Context, n *model.Nabavka, stavke []model.StavkaNabavke, troskovi []model.NabavkaTrosak, korisnikID *int64) (int64, error)
|
||||||
Obrisi(ctx context.Context, id int64, korisnikID *int64) error
|
Storno(ctx context.Context, id int64, razlog string, korisnikID *int64) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// DobavljacRepository definiše operacije nad dobavljačima
|
// DobavljacRepository definiše operacije nad dobavljačima
|
||||||
|
|||||||
@@ -397,8 +397,9 @@ func (r *ArtikalRepo) SveDobavljaceArtikala(ctx context.Context) (map[int64][]in
|
|||||||
return mapa, nil
|
return mapa, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// KorigujKolicinu postavlja novu količinu i upisuje korekciju u magacinske_promene
|
// KorigujKolicinu postavlja novu količinu i upisuje promenu u magacinske_promene;
|
||||||
func (r *ArtikalRepo) KorigujKolicinu(ctx context.Context, artikalID int64, novaKolicina int, korisnikID *int64, napomena string) error {
|
// tipPromene određuje vrstu traga (korekcija, manjak_popis, visak_popis)
|
||||||
|
func (r *ArtikalRepo) KorigujKolicinu(ctx context.Context, artikalID int64, novaKolicina int, korisnikID *int64, napomena, tipPromene string) error {
|
||||||
tx, err := r.db.BeginTx(ctx, nil)
|
tx, err := r.db.BeginTx(ctx, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ntech: ArtikalRepo.KorigujKolicinu: begin: %w", err)
|
return fmt.Errorf("ntech: ArtikalRepo.KorigujKolicinu: begin: %w", err)
|
||||||
@@ -418,7 +419,7 @@ func (r *ArtikalRepo) KorigujKolicinu(ctx context.Context, artikalID int64, nova
|
|||||||
}
|
}
|
||||||
|
|
||||||
promena := novaKolicina - staraKolicina
|
promena := novaKolicina - staraKolicina
|
||||||
if err = zabeleziMagacinPromenu(ctx, tx, artikalID, model.PromenaKorekcija, promena,
|
if err = zabeleziMagacinPromenu(ctx, tx, artikalID, tipPromene, promena,
|
||||||
staraKolicina, novaKolicina, 0, korisnikID, napomena); err != nil {
|
staraKolicina, novaKolicina, 0, korisnikID, napomena); err != nil {
|
||||||
return fmt.Errorf("ntech: ArtikalRepo.KorigujKolicinu: %w", err)
|
return fmt.Errorf("ntech: ArtikalRepo.KorigujKolicinu: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -413,7 +413,11 @@ func (h *Handler) SacuvajPopis(w http.ResponseWriter, r *http.Request) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
povecano := nova > a.Kolicina
|
povecano := nova > a.Kolicina
|
||||||
if err := h.Artikli.KorigujKolicinu(r.Context(), a.ID, nova, &k.ID, napomena); err != nil {
|
tipPromene := model.PromenaManjak
|
||||||
|
if povecano {
|
||||||
|
tipPromene = model.PromenaVisak
|
||||||
|
}
|
||||||
|
if err := h.Artikli.KorigujKolicinu(r.Context(), a.ID, nova, &k.ID, napomena, tipPromene); err != nil {
|
||||||
slog.Error("popis: korekcija artikla", "id", a.ID, "error", err)
|
slog.Error("popis: korekcija artikla", "id", a.ID, "error", err)
|
||||||
greskaBroj++
|
greskaBroj++
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ func (h *Handler) SacuvajIzmenuArtikla(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
// ako se količina promenila, koriguj stanje uz magacinski trag
|
// ako se količina promenila, koriguj stanje uz magacinski trag
|
||||||
if novaKolicina != staraKolicina {
|
if novaKolicina != staraKolicina {
|
||||||
if e := h.Artikli.KorigujKolicinu(r.Context(), id, novaKolicina, &k.ID, "izmena artikla"); e != nil {
|
if e := h.Artikli.KorigujKolicinu(r.Context(), id, novaKolicina, &k.ID, "izmena artikla", model.PromenaKorekcija); e != nil {
|
||||||
slog.Error("korekcija količine pri izmeni artikla nije uspela", "artikal_id", id, "error", e)
|
slog.Error("korekcija količine pri izmeni artikla nije uspela", "artikal_id", id, "error", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ const (
|
|||||||
PromenaIzlazServis = "izlaz_servis"
|
PromenaIzlazServis = "izlaz_servis"
|
||||||
PromenaPovracaj = "povracaj"
|
PromenaPovracaj = "povracaj"
|
||||||
PromenaKorekcija = "korekcija"
|
PromenaKorekcija = "korekcija"
|
||||||
|
PromenaManjak = "manjak_popis"
|
||||||
|
PromenaVisak = "visak_popis"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MagacinskaPromenaSaDetaljem je promena stanja artikla sa nazivom artikla
|
// MagacinskaPromenaSaDetaljem je promena stanja artikla sa nazivom artikla
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
-- Proširuje CHECK constraint na magacinske_promene da uključi manjak_popis i visak_popis
|
||||||
|
-- SQLite ne podržava ALTER TABLE za CHECK, pa rekreiramo tabelu
|
||||||
|
PRAGMA foreign_keys=OFF;
|
||||||
|
|
||||||
|
CREATE TABLE magacinske_promene_nova (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
artikal_id INTEGER NOT NULL REFERENCES artikli(id) ON DELETE RESTRICT,
|
||||||
|
tip_promene TEXT NOT NULL CHECK (tip_promene IN (
|
||||||
|
'ulaz_nabavka', 'izlaz_prodaja', 'izlaz_servis',
|
||||||
|
'povracaj', 'korekcija', 'manjak_popis', 'visak_popis'
|
||||||
|
)),
|
||||||
|
referentni_id INTEGER NOT NULL,
|
||||||
|
promena_kolicine INTEGER NOT NULL,
|
||||||
|
stanje_pre INTEGER NOT NULL,
|
||||||
|
stanje_posle INTEGER NOT NULL,
|
||||||
|
korisnik_id INTEGER REFERENCES korisnici(id) ON DELETE SET NULL,
|
||||||
|
napomena TEXT,
|
||||||
|
datum DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO magacinske_promene_nova SELECT * FROM magacinske_promene;
|
||||||
|
DROP TABLE magacinske_promene;
|
||||||
|
ALTER TABLE magacinske_promene_nova RENAME TO magacinske_promene;
|
||||||
|
|
||||||
|
PRAGMA foreign_keys=ON;
|
||||||
@@ -129,6 +129,10 @@
|
|||||||
<span class="bedz" style="background:rgba(168,85,247,0.12);color:#a855f7;">Povraćaj</span>
|
<span class="bedz" style="background:rgba(168,85,247,0.12);color:#a855f7;">Povraćaj</span>
|
||||||
{{else if eq .TipPromene "korekcija"}}
|
{{else if eq .TipPromene "korekcija"}}
|
||||||
<span class="bedz" style="background:rgba(156,163,175,0.12);color:#9ca3af;">Korekcija</span>
|
<span class="bedz" style="background:rgba(156,163,175,0.12);color:#9ca3af;">Korekcija</span>
|
||||||
|
{{else if eq .TipPromene "manjak_popis"}}
|
||||||
|
<span class="bedz" style="background:rgba(220,38,38,0.12);color:#dc2626;">Manjak (popis)</span>
|
||||||
|
{{else if eq .TipPromene "visak_popis"}}
|
||||||
|
<span class="bedz" style="background:rgba(34,197,94,0.12);color:#22c55e;">Višak (popis)</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
<span class="bedz">{{.TipPromene}}</span>
|
<span class="bedz">{{.TipPromene}}</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|||||||
@@ -66,6 +66,10 @@
|
|||||||
<span class="bedz" style="background:rgba(168,85,247,0.12);color:#a855f7;">Povraćaj</span>
|
<span class="bedz" style="background:rgba(168,85,247,0.12);color:#a855f7;">Povraćaj</span>
|
||||||
{{else if eq .TipPromene "korekcija"}}
|
{{else if eq .TipPromene "korekcija"}}
|
||||||
<span class="bedz" style="background:rgba(156,163,175,0.12);color:#9ca3af;">Korekcija</span>
|
<span class="bedz" style="background:rgba(156,163,175,0.12);color:#9ca3af;">Korekcija</span>
|
||||||
|
{{else if eq .TipPromene "manjak_popis"}}
|
||||||
|
<span class="bedz" style="background:rgba(220,38,38,0.12);color:#dc2626;">Manjak (popis)</span>
|
||||||
|
{{else if eq .TipPromene "visak_popis"}}
|
||||||
|
<span class="bedz" style="background:rgba(34,197,94,0.12);color:#22c55e;">Višak (popis)</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
<span class="bedz">{{.TipPromene}}</span>
|
<span class="bedz">{{.TipPromene}}</span>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|||||||
Reference in New Issue
Block a user