15995167b7
Tabela pdv_stope (seed 20/10/0%), model PdvStopa, PdvStopaRepository + SQLite implementacija (arhiviranje umesto brisanja) i integracioni test (migracija + CRUD round-trip).
102 lines
3.0 KiB
Go
102 lines
3.0 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"ntech/internal/model"
|
|
)
|
|
|
|
// PdvStopaRepo je SQLite implementacija PdvStopaRepository interfejsa
|
|
type PdvStopaRepo struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
// NoviPdvStopaRepo kreira novi PdvStopaRepo
|
|
func NoviPdvStopaRepo(db *sql.DB) *PdvStopaRepo {
|
|
return &PdvStopaRepo{db: db}
|
|
}
|
|
|
|
// Lista vraća stope iz šifarnika; ako je samoAktivne true, izostavlja arhivirane
|
|
func (r *PdvStopaRepo) Lista(ctx context.Context, samoAktivne bool) ([]model.PdvStopa, error) {
|
|
upit := `
|
|
SELECT id, naziv, stopa, oznaka, aktivna, redosled, datum_unosa
|
|
FROM pdv_stope
|
|
WHERE 1=1`
|
|
if samoAktivne {
|
|
upit += " AND aktivna = 1"
|
|
}
|
|
upit += " ORDER BY redosled ASC, stopa DESC"
|
|
|
|
redovi, err := r.db.QueryContext(ctx, upit)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("ntech: PdvStopaRepo.Lista: %w", err)
|
|
}
|
|
defer redovi.Close()
|
|
|
|
var rezultat []model.PdvStopa
|
|
for redovi.Next() {
|
|
var s model.PdvStopa
|
|
if err := redovi.Scan(&s.ID, &s.Naziv, &s.Stopa, &s.Oznaka, &s.Aktivna, &s.Redosled, &s.DatumUnosa); err != nil {
|
|
return nil, fmt.Errorf("ntech: PdvStopaRepo.Lista: scan: %w", err)
|
|
}
|
|
rezultat = append(rezultat, s)
|
|
}
|
|
if err := redovi.Err(); err != nil {
|
|
return nil, fmt.Errorf("ntech: PdvStopaRepo.Lista: %w", err)
|
|
}
|
|
return rezultat, nil
|
|
}
|
|
|
|
// DohvatiID vraća jednu stopu po identifikatoru
|
|
func (r *PdvStopaRepo) DohvatiID(ctx context.Context, id int64) (*model.PdvStopa, error) {
|
|
var s model.PdvStopa
|
|
err := r.db.QueryRowContext(ctx, `
|
|
SELECT id, naziv, stopa, oznaka, aktivna, redosled, datum_unosa
|
|
FROM pdv_stope WHERE id = ?`, id).
|
|
Scan(&s.ID, &s.Naziv, &s.Stopa, &s.Oznaka, &s.Aktivna, &s.Redosled, &s.DatumUnosa)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("ntech: PdvStopaRepo.DohvatiID: %w", err)
|
|
}
|
|
return &s, nil
|
|
}
|
|
|
|
// Kreiraj dodaje novu stopu i vraća njen id
|
|
func (r *PdvStopaRepo) Kreiraj(ctx context.Context, s *model.PdvStopa) (int64, error) {
|
|
rez, err := r.db.ExecContext(ctx, `
|
|
INSERT INTO pdv_stope (naziv, stopa, oznaka, aktivna, redosled)
|
|
VALUES (?, ?, ?, ?, ?)`,
|
|
s.Naziv, s.Stopa, s.Oznaka, s.Aktivna, s.Redosled)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("ntech: PdvStopaRepo.Kreiraj: %w", err)
|
|
}
|
|
id, err := rez.LastInsertId()
|
|
if err != nil {
|
|
return 0, fmt.Errorf("ntech: PdvStopaRepo.Kreiraj: id: %w", err)
|
|
}
|
|
return id, nil
|
|
}
|
|
|
|
// Izmeni menja podatke postojeće stope (osim datuma unosa)
|
|
func (r *PdvStopaRepo) Izmeni(ctx context.Context, s *model.PdvStopa) error {
|
|
_, err := r.db.ExecContext(ctx, `
|
|
UPDATE pdv_stope
|
|
SET naziv = ?, stopa = ?, oznaka = ?, aktivna = ?, redosled = ?
|
|
WHERE id = ?`,
|
|
s.Naziv, s.Stopa, s.Oznaka, s.Aktivna, s.Redosled, s.ID)
|
|
if err != nil {
|
|
return fmt.Errorf("ntech: PdvStopaRepo.Izmeni: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// PostaviAktivnu arhivira (false) ili vraća u upotrebu (true) stopu, bez brisanja
|
|
func (r *PdvStopaRepo) PostaviAktivnu(ctx context.Context, id int64, aktivna bool) error {
|
|
_, err := r.db.ExecContext(ctx, "UPDATE pdv_stope SET aktivna = ? WHERE id = ?", aktivna, id)
|
|
if err != nil {
|
|
return fmt.Errorf("ntech: PdvStopaRepo.PostaviAktivnu: %w", err)
|
|
}
|
|
return nil
|
|
}
|