PDV: profil firme blokira nemoguće kombinacije, stope iz šifarnika umesto hardkoda
- Podešavanja: nemoguća kombinacija (samo evidencija + PDV/fiskalizacija=da) se sad odbija i na serveru, ne samo u brauzeru (validirajProfilFirme). - Servis: fiskalni račun/refund više ne iskazuje PDV kad firma nije PDV obveznik (stavkeFiskalnogServisa nulira stopu, isto kao Prodaja). - Avans: uklonjena hardkodovana konstanta 20% PDV — stopa se sad uzima iz šifarnika (Podešavanja → Kalkulacija i PDV) ili je 0 kad firma nije obveznik. - fiskal.NapraviZahtev: uklonjen fallback koji je prepisivao namerno postavljenu 0% stopu nazad na 20% (poništavao je zaštitu Prodaje za ne-PDV firme). - Forme (usluge, artikli) i validacija PDV stope u prodaji sad koriste šifarnik umesto literala 20 / 0,10,20. Detaljna pravna analiza i status svake stavke u docs/Greške.md (van git-a).
This commit is contained in:
@@ -78,6 +78,28 @@ func (r *PdvStopaRepo) Kreiraj(ctx context.Context, s *model.PdvStopa) (int64, e
|
||||
return id, nil
|
||||
}
|
||||
|
||||
// PodrazumevanaOpsta vraća aktivnu opštu stopu iz šifarnika (prva po redosledu),
|
||||
// ili nil ako u šifarniku nema nijedne aktivne opšte stope — poziocalac tada mora
|
||||
// sam odlučiti o fallback vrednosti (šifarnik nikad ne sme biti prazan u praksi,
|
||||
// ali ne oslanjamo se na to).
|
||||
func (r *PdvStopaRepo) PodrazumevanaOpsta(ctx context.Context) (*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 oznaka = 'opsta' AND aktivna = 1
|
||||
ORDER BY redosled ASC, stopa DESC
|
||||
LIMIT 1`).
|
||||
Scan(&s.ID, &s.Naziv, &s.Stopa, &s.Oznaka, &s.Aktivna, &s.Redosled, &s.DatumUnosa)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, nil
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ntech: PdvStopaRepo.PodrazumevanaOpsta: %w", err)
|
||||
}
|
||||
return &s, 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, `
|
||||
|
||||
@@ -20,9 +20,14 @@ func NoviServisniRadoviRepo(baza *sql.DB) *ServisniRadoviRepo {
|
||||
|
||||
// DohvatiZaNalog vraća sve radove (usluge) jednog naloga, redom unosa
|
||||
func (r *ServisniRadoviRepo) DohvatiZaNalog(ctx context.Context, nalogID int64) ([]model.ServisniRad, error) {
|
||||
// COALESCE fallback je za „ad-hoc" rad bez veze na cenovnik usluga
|
||||
// (sr.usluga_id NULL) — tad se PDV stopa uzima iz šifarnika (Podešavanja →
|
||||
// Kalkulacija i PDV), ne hardkodovana vrednost. 20.0 ostaje samo kao
|
||||
// apsolutno poslednje utočište ako šifarnik nema nijednu aktivnu opštu stopu.
|
||||
redovi, err := r.db.QueryContext(ctx, `
|
||||
SELECT sr.id, sr.nalog_id, COALESCE(sr.usluga_id, 0), sr.naziv, sr.kolicina, sr.cena_komada, sr.datum, sr.predlozeno,
|
||||
COALESCE(u.sifra, ''), COALESCE(u.pdv_stopa, 20.0)
|
||||
COALESCE(u.sifra, ''),
|
||||
COALESCE(u.pdv_stopa, (SELECT stopa FROM pdv_stope WHERE oznaka = 'opsta' AND aktivna = 1 ORDER BY redosled ASC, stopa DESC LIMIT 1), 20.0)
|
||||
FROM servis_radovi sr
|
||||
LEFT JOIN usluge u ON u.id = sr.usluga_id
|
||||
WHERE sr.nalog_id = ? ORDER BY sr.id`, nalogID)
|
||||
|
||||
Reference in New Issue
Block a user