Files
GoNtech/internal/db/sqlite/magacin.go
T

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
}