Servis: nabavka automatski vraća nalog iz Čeka delove na Primljeno
This commit is contained in:
@@ -223,7 +223,8 @@ type ServisniPotrazivaniDeloviRepository interface {
|
|||||||
ObrisiZaArtikal(ctx context.Context, nalogID, artikalID int64) error
|
ObrisiZaArtikal(ctx context.Context, nalogID, artikalID int64) error
|
||||||
// ProveriIPocistiZaArtikal proverava potraživane redove za dati artikal nakon
|
// ProveriIPocistiZaArtikal proverava potraživane redove za dati artikal nakon
|
||||||
// povećanja stanja i briše/smanjuje redove koji se mogu pokriti (FIFO).
|
// povećanja stanja i briše/smanjuje redove koji se mogu pokriti (FIFO).
|
||||||
ProveriIPocistiZaArtikal(ctx context.Context, artikalID int64) error
|
// Vraća ID-eve naloga čiji je poslednji potraživani red obrisan.
|
||||||
|
ProveriIPocistiZaArtikal(ctx context.Context, artikalID int64) ([]int64, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServisniRadoviRepository definiše operacije nad radovima (uslugama) na nalogu
|
// ServisniRadoviRepository definiše operacije nad radovima (uslugama) na nalogu
|
||||||
|
|||||||
@@ -109,39 +109,44 @@ func (r *ServisniPotrazivaniDeloviRepo) ObrisiZaArtikal(ctx context.Context, nal
|
|||||||
// ProveriIPocistiZaArtikal poziva se nakon što stanje artikla poraste (nabavka)
|
// ProveriIPocistiZaArtikal poziva se nakon što stanje artikla poraste (nabavka)
|
||||||
// i čisti potraživane redove koji se sada mogu pokriti dostupnim stanjem (FIFO).
|
// i čisti potraživane redove koji se sada mogu pokriti dostupnim stanjem (FIFO).
|
||||||
// Delimično pokrivanje smanjuje traženu količinu umesto brisanja.
|
// Delimično pokrivanje smanjuje traženu količinu umesto brisanja.
|
||||||
func (r *ServisniPotrazivaniDeloviRepo) ProveriIPocistiZaArtikal(ctx context.Context, artikalID int64) error {
|
// Vraća ID-eve naloga čiji su svi potraživani redovi obrisani (nalog može da se otključa).
|
||||||
|
func (r *ServisniPotrazivaniDeloviRepo) ProveriIPocistiZaArtikal(ctx context.Context, artikalID int64) ([]int64, error) {
|
||||||
var stanje int
|
var stanje int
|
||||||
err := r.db.QueryRowContext(ctx, "SELECT kolicina FROM artikli WHERE id = ?", artikalID).Scan(&stanje)
|
err := r.db.QueryRowContext(ctx, "SELECT kolicina FROM artikli WHERE id = ?", artikalID).Scan(&stanje)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: stanje: %w", err)
|
return nil, fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: stanje: %w", err)
|
||||||
}
|
}
|
||||||
if stanje <= 0 {
|
if stanje <= 0 {
|
||||||
return nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
redovi, err := r.db.QueryContext(ctx,
|
redovi, err := r.db.QueryContext(ctx,
|
||||||
"SELECT id, kolicina FROM servisni_potrazivani_delovi WHERE artikal_id = ? ORDER BY datum",
|
"SELECT id, nalog_id, kolicina FROM servisni_potrazivani_delovi WHERE artikal_id = ? ORDER BY datum",
|
||||||
artikalID,
|
artikalID,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: query: %w", err)
|
return nil, fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: query: %w", err)
|
||||||
}
|
}
|
||||||
defer redovi.Close()
|
defer redovi.Close()
|
||||||
|
|
||||||
type red struct {
|
type red struct {
|
||||||
id int64
|
id int64
|
||||||
|
nalogID int64
|
||||||
kolicina int
|
kolicina int
|
||||||
}
|
}
|
||||||
var lista []red
|
var lista []red
|
||||||
for redovi.Next() {
|
for redovi.Next() {
|
||||||
var p red
|
var p red
|
||||||
if err := redovi.Scan(&p.id, &p.kolicina); err != nil {
|
if err := redovi.Scan(&p.id, &p.nalogID, &p.kolicina); err != nil {
|
||||||
return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: scan: %w", err)
|
return nil, fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: scan: %w", err)
|
||||||
}
|
}
|
||||||
lista = append(lista, p)
|
lista = append(lista, p)
|
||||||
}
|
}
|
||||||
redovi.Close()
|
redovi.Close()
|
||||||
|
|
||||||
|
// prati naloge iz kojih smo obrisali red
|
||||||
|
obrisaniNalozi := map[int64]struct{}{}
|
||||||
|
|
||||||
dostupno := stanje
|
dostupno := stanje
|
||||||
for _, p := range lista {
|
for _, p := range lista {
|
||||||
if dostupno <= 0 {
|
if dostupno <= 0 {
|
||||||
@@ -149,16 +154,29 @@ func (r *ServisniPotrazivaniDeloviRepo) ProveriIPocistiZaArtikal(ctx context.Con
|
|||||||
}
|
}
|
||||||
if dostupno >= p.kolicina {
|
if dostupno >= p.kolicina {
|
||||||
if _, err := r.db.ExecContext(ctx, "DELETE FROM servisni_potrazivani_delovi WHERE id = ?", p.id); err != nil {
|
if _, err := r.db.ExecContext(ctx, "DELETE FROM servisni_potrazivani_delovi WHERE id = ?", p.id); err != nil {
|
||||||
return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: delete: %w", err)
|
return nil, fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: delete: %w", err)
|
||||||
}
|
}
|
||||||
|
obrisaniNalozi[p.nalogID] = struct{}{}
|
||||||
dostupno -= p.kolicina
|
dostupno -= p.kolicina
|
||||||
} else {
|
} else {
|
||||||
novaKol := p.kolicina - dostupno
|
novaKol := p.kolicina - dostupno
|
||||||
if _, err := r.db.ExecContext(ctx, "UPDATE servisni_potrazivani_delovi SET kolicina = ? WHERE id = ?", novaKol, p.id); err != nil {
|
if _, err := r.db.ExecContext(ctx, "UPDATE servisni_potrazivani_delovi SET kolicina = ? WHERE id = ?", novaKol, p.id); err != nil {
|
||||||
return fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: update: %w", err)
|
return nil, fmt.Errorf("ntech: ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal: update: %w", err)
|
||||||
}
|
}
|
||||||
dostupno = 0
|
dostupno = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
// vrati samo one naloge koji NEMAJU više nijedan potraživani red
|
||||||
|
var otkljucani []int64
|
||||||
|
for nalogID := range obrisaniNalozi {
|
||||||
|
var preostalo int
|
||||||
|
_ = r.db.QueryRowContext(ctx,
|
||||||
|
"SELECT COUNT(*) FROM servisni_potrazivani_delovi WHERE nalog_id = ?", nalogID,
|
||||||
|
).Scan(&preostalo)
|
||||||
|
if preostalo == 0 {
|
||||||
|
otkljucani = append(otkljucani, nalogID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return otkljucani, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -261,10 +261,17 @@ func (h *Handler) SacuvajNabavku(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// nakon povećanja stanja proveri da li se potraživani delovi u servisu mogu pokriti
|
// nakon povećanja stanja: počisti potraživane delove i vrati otključane naloge na Primljeno
|
||||||
for _, s := range stavke {
|
for _, s := range stavke {
|
||||||
if err := h.ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal(r.Context(), s.ArtikalID); err != nil {
|
otkljucani, err := h.ServisniPotrazivaniDeloviRepo.ProveriIPocistiZaArtikal(r.Context(), s.ArtikalID)
|
||||||
|
if err != nil {
|
||||||
slog.Error("provera potraživanih delova nije uspela", "artikal_id", s.ArtikalID, "error", err)
|
slog.Error("provera potraživanih delova nije uspela", "artikal_id", s.ArtikalID, "error", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, nalogID := range otkljucani {
|
||||||
|
if err := h.ServisRepo.AzurirajStatus(r.Context(), nalogID, model.StatusPrimljeno); err != nil {
|
||||||
|
slog.Error("automatski reset statusa naloga nije uspeo", "nalog_id", nalogID, "error", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user