Prodaja/Servis: broj naloga u formatu GGMM (godina-mesec), mesečni brojač
This commit is contained in:
@@ -20,10 +20,13 @@ func NoviProdajaRepo(db *sql.DB) *ProdajaRepo {
|
|||||||
return &ProdajaRepo{db: db}
|
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) {
|
func (r *ProdajaRepo) SledeciBroj(ctx context.Context) (string, error) {
|
||||||
godina := time.Now().Year()
|
sada := time.Now()
|
||||||
uzorak := fmt.Sprintf("PR-%d-%%", godina)
|
// 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
|
var sledeci int
|
||||||
err := r.db.QueryRowContext(ctx, `
|
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.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
|
// Lista vraća listu prodajnih naloga sa imenom klijenta, po zadatom filteru
|
||||||
|
|||||||
@@ -30,12 +30,12 @@ func NoviServisRepo(db *sql.DB) *ServisRepo {
|
|||||||
return &ServisRepo{db: db}
|
return &ServisRepo{db: db}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SledeciBroj generiše sledeći broj naloga u formatu SN-MMGG-NNN
|
// SledeciBroj generiše sledeći broj naloga u formatu SN-GGMM-NNN
|
||||||
// (MM mesec, GG dvocifrena godina); brojač NNN se resetuje svakog meseca
|
// (GG dvocifrena godina, MM mesec); brojač NNN se resetuje svakog meseca
|
||||||
func (r *ServisRepo) SledeciBroj(ctx context.Context) (string, error) {
|
func (r *ServisRepo) SledeciBroj(ctx context.Context) (string, error) {
|
||||||
sada := time.Now()
|
sada := time.Now()
|
||||||
// prefiks "SN-MMGG-" je dug 8 karaktera, pa brojač počinje od 9. karaktera
|
// prefiks "SN-GGMM-" je dug 8 karaktera, pa brojač počinje od 9. karaktera
|
||||||
prefiks := fmt.Sprintf("SN-%02d%02d-", int(sada.Month()), sada.Year()%100)
|
prefiks := fmt.Sprintf("SN-%02d%02d-", sada.Year()%100, int(sada.Month()))
|
||||||
uzorak := prefiks + "%"
|
uzorak := prefiks + "%"
|
||||||
|
|
||||||
// COALESCE(MAX, 0)+1 → prvi nalog u mesecu dobija 001
|
// COALESCE(MAX, 0)+1 → prvi nalog u mesecu dobija 001
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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);
|
||||||
Reference in New Issue
Block a user