Knjigovodstvo: storno prodaje/nabavke više ne briše KIR/KPR/KPO
Storno je fizički brisao vezani KIR/KPR/KPO zapis — zakon o računovodstvu ne dozvoljava brisanje poslovnih knjiga (KPO dodatno ima redni broj bez prekida). Sad se original čuva, a storno se dograđuje kao poništavajuća stavka (negirani iznosi, referenca na original) — model.KirStorno/KprStorno/KpoStorno. Usput ispravljen i pravi uzrok prijavljenog bug-a: kirKandidatiProdaje je filtrirala samo internu mapu, ne i listu naloga koju obilazi KirBackfillProdaje — stornirani nalozi su zbog toga dobijali ponovni (pogrešan) KIR upis.
This commit is contained in:
@@ -115,10 +115,41 @@ func (r *KpoRepo) PostojiZaIzvor(ctx context.Context, izvor string, izvorID int6
|
||||
return n > 0, nil
|
||||
}
|
||||
|
||||
// ObrisiPoIzvoru briše KPO zapise vezane za dati izvor (npr. pri stornu prodaje).
|
||||
func (r *KpoRepo) ObrisiPoIzvoru(ctx context.Context, izvor string, izvorID int64) error {
|
||||
if _, err := r.db.ExecContext(ctx, "DELETE FROM kpo_unosi WHERE izvor = ? AND izvor_id = ?", izvor, izvorID); err != nil {
|
||||
return fmt.Errorf("ntech: KpoRepo.ObrisiPoIzvoru: %w", err)
|
||||
// DohvatiPoIzvoru vraća sve KPO zapise vezane za dati izvor (npr. za storno prodaje).
|
||||
func (r *KpoRepo) DohvatiPoIzvoru(ctx context.Context, izvor string, izvorID int64) ([]model.KpoZapis, error) {
|
||||
redovi, err := r.db.QueryContext(ctx, `
|
||||
SELECT id, datum_prometa, redni_broj, broj_dokumenta, opis, prihod,
|
||||
nacin_placanja, napomena, izvor, izvor_id, datum_unosa
|
||||
FROM kpo_unosi WHERE izvor = ? AND izvor_id = ?`, izvor, izvorID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ntech: KpoRepo.DohvatiPoIzvoru: %w", err)
|
||||
}
|
||||
return nil
|
||||
defer redovi.Close()
|
||||
|
||||
var rezultat []model.KpoZapis
|
||||
for redovi.Next() {
|
||||
var z model.KpoZapis
|
||||
var opis, nacinPlacanja, napomena sql.NullString
|
||||
var redniBroj sql.NullInt64
|
||||
var izvorIDCol sql.NullInt64
|
||||
|
||||
if err := redovi.Scan(
|
||||
&z.ID, &z.DatumPrometa, &redniBroj, &z.BrojDokumenta, &opis, &z.Prihod,
|
||||
&nacinPlacanja, &napomena, &z.Izvor, &izvorIDCol, &z.DatumUnosa,
|
||||
); err != nil {
|
||||
return nil, fmt.Errorf("ntech: KpoRepo.DohvatiPoIzvoru: scan: %w", err)
|
||||
}
|
||||
if redniBroj.Valid {
|
||||
n := int(redniBroj.Int64)
|
||||
z.RedniBroj = &n
|
||||
}
|
||||
z.Opis = opis.String
|
||||
z.NacinPlacanja = nacinPlacanja.String
|
||||
z.Napomena = napomena.String
|
||||
if izvorIDCol.Valid {
|
||||
z.IzvorID = &izvorIDCol.Int64
|
||||
}
|
||||
rezultat = append(rezultat, z)
|
||||
}
|
||||
return rezultat, redovi.Err()
|
||||
}
|
||||
|
||||
@@ -128,12 +128,32 @@ func (r *PdvKirRepo) Obrisi(ctx context.Context, id int64) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ObrisiPoIzvoru briše KIR zapise vezane za dati izvor (npr. pri stornu/brisanju prodaje)
|
||||
func (r *PdvKirRepo) ObrisiPoIzvoru(ctx context.Context, izvor string, izvorID int64) error {
|
||||
if _, err := r.db.ExecContext(ctx, "DELETE FROM pdv_kir WHERE izvor = ? AND izvor_id = ?", izvor, izvorID); err != nil {
|
||||
return fmt.Errorf("ntech: PdvKirRepo.ObrisiPoIzvoru: %w", err)
|
||||
// DohvatiPoIzvoru vraća sve KIR zapise vezane za dati izvor (npr. za storno prodaje)
|
||||
func (r *PdvKirRepo) DohvatiPoIzvoru(ctx context.Context, izvor string, izvorID int64) ([]model.PdvKir, error) {
|
||||
redovi, err := r.db.QueryContext(ctx, `
|
||||
SELECT id, datum_prometa, datum_knjizenja, broj_dokumenta,
|
||||
kupac_naziv, COALESCE(kupac_pib, ''), COALESCE(kupac_mesto, ''),
|
||||
osnovica_opsta, pdv_opsta, osnovica_posebna, pdv_posebna,
|
||||
osloboden_sa_pravom, osloboden_bez_prava, ukupno,
|
||||
COALESCE(napomena, ''), izvor, izvor_id, datum_unosa
|
||||
FROM pdv_kir WHERE izvor = ? AND izvor_id = ?`, izvor, izvorID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ntech: PdvKirRepo.DohvatiPoIzvoru: %w", err)
|
||||
}
|
||||
return nil
|
||||
defer redovi.Close()
|
||||
|
||||
var rezultat []model.PdvKir
|
||||
for redovi.Next() {
|
||||
k, err := skenirajKir(redovi.Scan)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ntech: PdvKirRepo.DohvatiPoIzvoru: scan: %w", err)
|
||||
}
|
||||
rezultat = append(rezultat, k)
|
||||
}
|
||||
if err := redovi.Err(); err != nil {
|
||||
return nil, fmt.Errorf("ntech: PdvKirRepo.DohvatiPoIzvoru: %w", err)
|
||||
}
|
||||
return rezultat, nil
|
||||
}
|
||||
|
||||
// PostojiZaIzvor vraća true ako postoji bar jedan KIR zapis za dati izvor i izvorID
|
||||
@@ -318,12 +338,32 @@ func (r *PdvKprRepo) Obrisi(ctx context.Context, id int64) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ObrisiPoIzvoru briše KPR zapise vezane za dati izvor (npr. pri brisanju nabavke)
|
||||
func (r *PdvKprRepo) ObrisiPoIzvoru(ctx context.Context, izvor string, izvorID int64) error {
|
||||
if _, err := r.db.ExecContext(ctx, "DELETE FROM pdv_kpr WHERE izvor = ? AND izvor_id = ?", izvor, izvorID); err != nil {
|
||||
return fmt.Errorf("ntech: PdvKprRepo.ObrisiPoIzvoru: %w", err)
|
||||
// DohvatiPoIzvoru vraća sve KPR zapise vezane za dati izvor (npr. za storno nabavke)
|
||||
func (r *PdvKprRepo) DohvatiPoIzvoru(ctx context.Context, izvor string, izvorID int64) ([]model.PdvKpr, error) {
|
||||
redovi, err := r.db.QueryContext(ctx, `
|
||||
SELECT id, datum_prometa, datum_knjizenja, datum_placanja, broj_dokumenta,
|
||||
dobavljac_naziv, COALESCE(dobavljac_pib, ''), COALESCE(dobavljac_mesto, ''),
|
||||
osnovica_opsta, pdv_opsta, osnovica_posebna, pdv_posebna,
|
||||
pdv_bez_odbitka, osloboden_nabavka, ukupno,
|
||||
COALESCE(napomena, ''), izvor, izvor_id, uvoz, datum_unosa
|
||||
FROM pdv_kpr WHERE izvor = ? AND izvor_id = ?`, izvor, izvorID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ntech: PdvKprRepo.DohvatiPoIzvoru: %w", err)
|
||||
}
|
||||
return nil
|
||||
defer redovi.Close()
|
||||
|
||||
var rezultat []model.PdvKpr
|
||||
for redovi.Next() {
|
||||
k, err := skenirajKpr(redovi.Scan)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ntech: PdvKprRepo.DohvatiPoIzvoru: scan: %w", err)
|
||||
}
|
||||
rezultat = append(rezultat, k)
|
||||
}
|
||||
if err := redovi.Err(); err != nil {
|
||||
return nil, fmt.Errorf("ntech: PdvKprRepo.DohvatiPoIzvoru: %w", err)
|
||||
}
|
||||
return rezultat, nil
|
||||
}
|
||||
|
||||
// PostojiZaIzvor vraća true ako postoji bar jedan KPR zapis za dati izvor i izvorID
|
||||
|
||||
@@ -162,12 +162,12 @@ func TestPdvKirIzvor(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// ObrisiPoIzvoru briše samo vezani auto zapis, ručni ostaje
|
||||
if err := repo.ObrisiPoIzvoru(ctx, "prodaja", 7); err != nil {
|
||||
t.Fatalf("ObrisiPoIzvoru: %v", err)
|
||||
// DohvatiPoIzvoru vraća samo vezani auto zapis
|
||||
poIzvoru, err := repo.DohvatiPoIzvoru(ctx, "prodaja", 7)
|
||||
if err != nil {
|
||||
t.Fatalf("DohvatiPoIzvoru: %v", err)
|
||||
}
|
||||
preostali, _ := repo.Lista(ctx, time.Time{}, time.Time{})
|
||||
if len(preostali) != 1 || preostali[0].BrojDokumenta != "R-1" {
|
||||
t.Errorf("posle ObrisiPoIzvoru očekivan samo ručni zapis, dobijeno %d", len(preostali))
|
||||
if len(poIzvoru) != 1 || poIzvoru[0].BrojDokumenta != "P-1" {
|
||||
t.Errorf("očekivan samo auto zapis P-1, dobijeno %d", len(poIzvoru))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user