From fcae2ae441fd41e92dbc7a67d7b2db7d127a0f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Wed, 1 Jul 2026 23:01:10 +0200 Subject: [PATCH] =?UTF-8?q?Prodaja/Servis:=20broj=20naloga=20u=20formatu?= =?UTF-8?q?=20GGMM=20(godina-mesec),=20mese=C4=8Dni=20broja=C4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/sqlite/prodaja.go | 11 +++--- internal/db/sqlite/servis.go | 8 ++--- .../098_prodaja_broj_naloga_mesecno.sql | 34 +++++++++++++++++++ migrations/099_servis_broj_naloga_gg_mm.sql | 32 +++++++++++++++++ 4 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 migrations/098_prodaja_broj_naloga_mesecno.sql create mode 100644 migrations/099_servis_broj_naloga_gg_mm.sql diff --git a/internal/db/sqlite/prodaja.go b/internal/db/sqlite/prodaja.go index db23fb9..179d1e4 100644 --- a/internal/db/sqlite/prodaja.go +++ b/internal/db/sqlite/prodaja.go @@ -20,10 +20,13 @@ func NoviProdajaRepo(db *sql.DB) *ProdajaRepo { return &ProdajaRepo{db: db} } -// SledeciBroj generiše sledeći broj naloga u formatu PR-GGGG-NNNN +// SledeciBroj generiše sledeći broj naloga u formatu PR-GGMM-NNNN +// (GG dvocifrena godina, MM mesec); brojač NNNN se resetuje svakog meseca func (r *ProdajaRepo) SledeciBroj(ctx context.Context) (string, error) { - godina := time.Now().Year() - uzorak := fmt.Sprintf("PR-%d-%%", godina) + sada := time.Now() + // prefiks "PR-GGMM-" je dug 8 karaktera, pa brojač počinje od 9. karaktera + prefiks := fmt.Sprintf("PR-%02d%02d-", sada.Year()%100, int(sada.Month())) + uzorak := prefiks + "%" var sledeci int err := r.db.QueryRowContext(ctx, ` @@ -34,7 +37,7 @@ func (r *ProdajaRepo) SledeciBroj(ctx context.Context) (string, error) { return "", fmt.Errorf("ntech: ProdajaRepo.SledeciBroj: %w", err) } - return fmt.Sprintf("PR-%d-%04d", godina, sledeci), nil + return fmt.Sprintf("%s%04d", prefiks, sledeci), nil } // Lista vraća listu prodajnih naloga sa imenom klijenta, po zadatom filteru diff --git a/internal/db/sqlite/servis.go b/internal/db/sqlite/servis.go index c61f2a9..b2b980f 100644 --- a/internal/db/sqlite/servis.go +++ b/internal/db/sqlite/servis.go @@ -30,12 +30,12 @@ func NoviServisRepo(db *sql.DB) *ServisRepo { return &ServisRepo{db: db} } -// SledeciBroj generiše sledeći broj naloga u formatu SN-MMGG-NNN -// (MM mesec, GG dvocifrena godina); brojač NNN se resetuje svakog meseca +// SledeciBroj generiše sledeći broj naloga u formatu SN-GGMM-NNN +// (GG dvocifrena godina, MM mesec); brojač NNN se resetuje svakog meseca func (r *ServisRepo) SledeciBroj(ctx context.Context) (string, error) { sada := time.Now() - // prefiks "SN-MMGG-" je dug 8 karaktera, pa brojač počinje od 9. karaktera - prefiks := fmt.Sprintf("SN-%02d%02d-", int(sada.Month()), sada.Year()%100) + // prefiks "SN-GGMM-" je dug 8 karaktera, pa brojač počinje od 9. karaktera + prefiks := fmt.Sprintf("SN-%02d%02d-", sada.Year()%100, int(sada.Month())) uzorak := prefiks + "%" // COALESCE(MAX, 0)+1 → prvi nalog u mesecu dobija 001 diff --git a/migrations/098_prodaja_broj_naloga_mesecno.sql b/migrations/098_prodaja_broj_naloga_mesecno.sql new file mode 100644 index 0000000..da9857b --- /dev/null +++ b/migrations/098_prodaja_broj_naloga_mesecno.sql @@ -0,0 +1,34 @@ +-- Prodaja: broj naloga menja format iz PR-GGGG-NNNN (puna godina, brojač po godini) +-- u PR-GGMM-NNNN (dvocifrena godina + mesec, brojač po mesecu) — usklađeno sa +-- servisnim nalozima koji već koriste mesečni brojač. +-- +-- Idempotentno: pogađa samo redove čiji četvorocifreni blok NIJE validan mesec na +-- poslednje dve cifre (stari format: puna godina npr. "2026" → poslednje dve cifre +-- "26" nisu 01-12; novi format: "2601" → "01" jeste validan mesec — pa migracija na +-- ponovnom pokretanju ništa ne dira). + +WITH stari AS ( + SELECT id, datum FROM prodajni_nalozi + WHERE CAST(substr(broj_naloga, 6, 2) AS INTEGER) NOT BETWEEN 1 AND 12 +), +raspored AS ( + SELECT id, + 'PR-' || substr(datum, 3, 2) || substr(datum, 6, 2) || '-' || + printf('%04d', ROW_NUMBER() OVER ( + PARTITION BY substr(datum, 1, 7) + ORDER BY datum, id + )) AS novi_broj + FROM stari +) +UPDATE prodajni_nalozi +SET broj_naloga = (SELECT novi_broj FROM raspored WHERE raspored.id = prodajni_nalozi.id) +WHERE id IN (SELECT id FROM raspored); + +-- uskladi denormalizovane kopije broja dokumenta u KIR/KPO sa novim brojem naloga +UPDATE pdv_kir +SET broj_dokumenta = (SELECT broj_naloga FROM prodajni_nalozi WHERE id = pdv_kir.izvor_id) +WHERE izvor = 'prodaja' AND izvor_id IN (SELECT id FROM prodajni_nalozi); + +UPDATE kpo_unosi +SET broj_dokumenta = (SELECT broj_naloga FROM prodajni_nalozi WHERE id = kpo_unosi.izvor_id) +WHERE izvor = 'prodaja' AND izvor_id IN (SELECT id FROM prodajni_nalozi); diff --git a/migrations/099_servis_broj_naloga_gg_mm.sql b/migrations/099_servis_broj_naloga_gg_mm.sql new file mode 100644 index 0000000..0e6df85 --- /dev/null +++ b/migrations/099_servis_broj_naloga_gg_mm.sql @@ -0,0 +1,32 @@ +-- Servis: broj naloga menja redosled iz SN-MMGG-NNN (mesec-godina) u SN-GGMM-NNN +-- (godina-mesec) — usklađeno sa prodajnim nalozima (PR-GGMM-NNNN, migracija 098). +-- +-- Idempotentno: broj se za svaki nalog PONOVO izračunava iz datum_prijema (isti +-- hronološki raspored po mesecu daje isti rezultat svaki put), pa se UPDATE +-- primenjuje samo na redove čija se trenutna vrednost razlikuje od izračunate. + +WITH raspored AS ( + SELECT id, + 'SN-' || substr(datum_prijema, 3, 2) || substr(datum_prijema, 6, 2) || '-' || + printf('%03d', ROW_NUMBER() OVER ( + PARTITION BY substr(datum_prijema, 1, 7) + ORDER BY datum_prijema, id + )) AS novi_broj + FROM servisni_nalozi +) +UPDATE servisni_nalozi +SET broj_naloga = (SELECT novi_broj FROM raspored WHERE raspored.id = servisni_nalozi.id) +WHERE id IN ( + SELECT raspored.id FROM raspored + JOIN servisni_nalozi sn ON sn.id = raspored.id + WHERE raspored.novi_broj != sn.broj_naloga +); + +-- uskladi denormalizovane kopije broja dokumenta u KIR/KPO sa novim brojem naloga +UPDATE pdv_kir +SET broj_dokumenta = (SELECT broj_naloga FROM servisni_nalozi WHERE id = pdv_kir.izvor_id) +WHERE izvor = 'servis' AND izvor_id IN (SELECT id FROM servisni_nalozi); + +UPDATE kpo_unosi +SET broj_dokumenta = (SELECT broj_naloga FROM servisni_nalozi WHERE id = kpo_unosi.izvor_id) +WHERE izvor = 'servis' AND izvor_id IN (SELECT id FROM servisni_nalozi);