103 lines
2.7 KiB
Go
103 lines
2.7 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"ntech/internal/model"
|
|
)
|
|
|
|
// MagacinskePromeneRepo je SQLite implementacija MagacinskePromeneRepository interfejsa
|
|
type MagacinskePromeneRepo struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
// NoviMagacinskePromeneRepo kreira novi MagacinskePromeneRepo
|
|
func NoviMagacinskePromeneRepo(db *sql.DB) *MagacinskePromeneRepo {
|
|
return &MagacinskePromeneRepo{db: db}
|
|
}
|
|
|
|
// Lista vraća listu magacinskih promena, opcionalno filtrirano po artiklu
|
|
func (r *MagacinskePromeneRepo) Lista(ctx context.Context, artikalID *int64, limit int) ([]model.MagacinskaPromenaSaDetaljem, error) {
|
|
if limit <= 0 {
|
|
limit = 100
|
|
}
|
|
|
|
upit := `
|
|
SELECT mp.id, mp.artikal_id, a.naziv, mp.tip_promene, mp.referentni_id,
|
|
mp.promena_kolicine, mp.stanje_pre, mp.stanje_posle,
|
|
mp.korisnik_id, mp.napomena, mp.datum
|
|
FROM magacinske_promene mp
|
|
JOIN artikli a ON a.id = mp.artikal_id
|
|
WHERE 1=1`
|
|
|
|
args := []any{}
|
|
|
|
if artikalID != nil {
|
|
upit += " AND mp.artikal_id = ?"
|
|
args = append(args, *artikalID)
|
|
}
|
|
|
|
upit += " ORDER BY mp.datum DESC LIMIT ?"
|
|
args = append(args, limit)
|
|
|
|
redovi, err := r.db.QueryContext(ctx, upit, args...)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("ntech: MagacinskePromeneRepo.Lista: %w", err)
|
|
}
|
|
defer redovi.Close()
|
|
|
|
var rezultat []model.MagacinskaPromenaSaDetaljem
|
|
for redovi.Next() {
|
|
var p model.MagacinskaPromenaSaDetaljem
|
|
var korisnikID sql.NullInt64
|
|
var napomena sql.NullString
|
|
|
|
err := redovi.Scan(
|
|
&p.ID, &p.ArtikalID, &p.ArtikalNaziv, &p.TipPromene, &p.ReferentniID,
|
|
&p.PromenaKolicine, &p.StanjePre, &p.StanjePosle,
|
|
&korisnikID, &napomena, &p.Datum,
|
|
)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("ntech: MagacinskePromeneRepo.Lista: scan: %w", err)
|
|
}
|
|
|
|
if korisnikID.Valid {
|
|
v := korisnikID.Int64
|
|
p.KorisnikID = &v
|
|
}
|
|
p.Napomena = napomena.String
|
|
|
|
rezultat = append(rezultat, p)
|
|
}
|
|
|
|
return rezultat, nil
|
|
}
|
|
|
|
// zabeleziMagacinPromenu je interni helper koji upisuje jednu promenu stanja artikla.
|
|
// Poziva se iz Kreiraj/Storno unutar postojeće transakcije.
|
|
func zabeleziMagacinPromenu(
|
|
ctx context.Context,
|
|
tx *sql.Tx,
|
|
artikalID int64,
|
|
tipPromene string,
|
|
promenaKolicine, stanjePre, stanjePosle int,
|
|
referentniID int64,
|
|
korisnikID *int64,
|
|
napomena string,
|
|
) error {
|
|
_, err := tx.ExecContext(ctx, `
|
|
INSERT INTO magacinske_promene
|
|
(artikal_id, tip_promene, promena_kolicine, stanje_pre, stanje_posle,
|
|
referentni_id, korisnik_id, napomena)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
artikalID, tipPromene, promenaKolicine, stanjePre, stanjePosle,
|
|
referentniID, nullInt64(korisnikID), nullString(napomena),
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("ntech: zabeleziMagacinPromenu: %w", err)
|
|
}
|
|
return nil
|
|
}
|