Valsts budžets kā kods v0.1: shēma, 2025. un 2026. gada budžeta likumi kā dati
Loģisks budžeta modelis (Source, Provision, Parameter, Actor, Purpose, Indicator, Rule, ClassItem, Allocation), nevis likuma pielikumu izkārtojuma kopija. Abi likumi: teksts un visi 12 pielikumi. Atpakaļsaderība: 2026 — 58 457 no 58 457, 2025 — 55 677 no 55 677 pielikumos drukāto skaitļu atjaunoti tikai no XML. Avoti (likumi.lv, klasifikāciju MK noteikumi), rīki, datu līgums B15, dokumentācija. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016679RwmHsuTFfxt26wP6rk
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
build/
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
9
CHANGELOG.md
Normal file
9
CHANGELOG.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Izmaiņu žurnāls
|
||||||
|
|
||||||
|
## 0.1.0 — 2026-10-11
|
||||||
|
|
||||||
|
- Shēma `schemas/valsts-budzets-0.1.xsd`: loģiskais budžeta modelis ar ierakstiem Source, Provision, Parameter, Actor, Purpose, Indicator, Rule, ClassItem, Allocation.
|
||||||
|
- Dati: 2025. un 2026. gada valsts budžeta likumi (`data/lv-vb-2025.xml`, `data/lv-vb-2026.xml`) — likuma teksts un visi 12 pielikumi.
|
||||||
|
- Atpakaļsaderības pārbaude: abos gados 100 % pielikumos drukāto skaitļu atjaunoti no XML (`docs/SADERIBA.md`).
|
||||||
|
- Rīki: parsētājs, pārbaudītājs, kopīgie summēšanas noteikumi, kodu vārdnīcu izgūšana.
|
||||||
|
- Datu līgums `contracts/B15-valsts-budzets.odcs.yaml`.
|
||||||
100
README.md
Normal file
100
README.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# Valsts budžets kā kods (Budget-as-Code)
|
||||||
|
|
||||||
|
Mašīnlasāma struktūra Latvijas valsts budžetam: viena XML datne katrai budžeta likuma versijai un viena XSD shēma visiem gadiem. Datne satur likuma tekstu, visus 12 pielikumus un saites starp tiem. Likuma tabulas no tās var atjaunot līdz pēdējam euro.
|
||||||
|
|
||||||
|
Autors: PPP Asociācija (PPPA), Valsts Pirmkods (VPK). Shēmas versija 0.1, melnraksts.
|
||||||
|
|
||||||
|
> **Koncepcijas demonstrācija.** Šīs datnes nav oficiāls valsts budžeta izdevums. Tās automātiski izveidotas no likumi.lv publicētā likuma un tā pielikumiem. Juridisks spēks ir tikai oficiālajai publikācijai Latvijas Vēstnesī.
|
||||||
|
|
||||||
|
## Kāpēc šāds modelis
|
||||||
|
|
||||||
|
Pieņemtais budžets šobrīd ir likuma teksts ar 12 pielikumiem (Excel un Word datnes), un katram pielikumam ir savs izkārtojums. Šis modelis neatkārto pielikumu formu. Tas apraksta budžetu kā lēmumu: kurš drīkst saņemt vai izlietot cik naudas, kādam mērķim un pēc kādiem noteikumiem. Pielikumi ir šo datu skati.
|
||||||
|
|
||||||
|
```
|
||||||
|
Budget (likuma versija, piemēram lv-vb-2026)
|
||||||
|
├── Source avota dokumenti ar SHA-256 (likuma teksts, 12 pielikumi)
|
||||||
|
├── Provision likuma panti (teksts)
|
||||||
|
├── Parameter lielumi, kas nav naudas piešķīrumi (IKP prognoze, informatīvie rādītāji)
|
||||||
|
├── Actor kurš tur vai saņem naudu: resors (ar VPK ID), pašvaldība, nesadalītie līdzekļi
|
||||||
|
├── Purpose kam nauda paredzēta: resors → programma → apakšprogramma → projekts; mērķdotācijas
|
||||||
|
├── Indicator rezultatīvie rādītāji (budžeta paskaidrojumos; likumā nav — rezervēts)
|
||||||
|
├── Rule mašīnlasāmi noteikumi no likuma teksta (rezervēts)
|
||||||
|
├── ClassItem izmantotie klasifikāciju kodi ar nosaukumiem un vecākkodu
|
||||||
|
└── Allocation viens naudas fakts: plūsma × fonds × būtība × gads × turētājs × mērķis × bloks × kods × summa
|
||||||
|
```
|
||||||
|
|
||||||
|
Visi ieraksti ir plakani un saistīti ar identifikatoriem. Kopsummas, starpsummas un bilances datnē netiek glabātas — tās aprēķina. Sīkāk: [docs/MODELIS.md](docs/MODELIS.md).
|
||||||
|
|
||||||
|
## Atpakaļsaderība ar likumu
|
||||||
|
|
||||||
|
Katrs likuma pielikumos drukātais skaitlis ir pārbaudīts: to aprēķina tikai no XML datnes un salīdzina ar publicēto vērtību.
|
||||||
|
|
||||||
|
| Likums | Pielikumos drukātie skaitļi | Atjaunoti no XML |
|
||||||
|
|---|---|---|
|
||||||
|
| Par valsts budžetu 2026. gadam un budžeta ietvaru 2026., 2027. un 2028. gadam | 58 457 | 58 457 (100 %) |
|
||||||
|
| Par valsts budžetu 2025. gadam un budžeta ietvaru 2025., 2026. un 2027. gadam | 55 677 | 55 677 (100 %) |
|
||||||
|
|
||||||
|
Abi gadi izmanto to pašu shēmu un tos pašus rīkus. Metode, rezultāti pa pielikumiem un avotos atrastās nekonsekvences: [docs/SADERIBA.md](docs/SADERIBA.md).
|
||||||
|
|
||||||
|
## Saturs
|
||||||
|
|
||||||
|
### Dati (`data/`)
|
||||||
|
|
||||||
|
| Datne | Saturs |
|
||||||
|
|---|---|
|
||||||
|
| `data/lv-vb-2026.xml` | 2026. gada valsts budžeta likums (LV 2025/244): 81 pants, 12 pielikumu dati, 6 400 naudas faktu |
|
||||||
|
| `data/lv-vb-2025.xml` | 2025. gada valsts budžeta likums (LV 2024/248): 82 panti, 12 pielikumu dati |
|
||||||
|
|
||||||
|
Datnes nosaukums ir budžeta identifikators.
|
||||||
|
|
||||||
|
### Shēma un datu līgums
|
||||||
|
|
||||||
|
| Datne | Saturs |
|
||||||
|
|---|---|
|
||||||
|
| `schemas/valsts-budzets-0.1.xsd` | Shēma: viens saknes elements, deviņi ierakstu veidi, vārdnīcas (plūsma, fonds, būtība, bloks, klasifikācija) |
|
||||||
|
| `contracts/B15-valsts-budzets.odcs.yaml` | ODCS v3 datu līgums, ģenerēts no XSD (tāpat kā B01–B14) |
|
||||||
|
|
||||||
|
### Dokumentācija
|
||||||
|
|
||||||
|
| Datne | Saturs |
|
||||||
|
|---|---|
|
||||||
|
| `docs/MODELIS.md` | Modeļa jēdzieni, konsolidācijas noteikums, pielikumu atbilstība modelim |
|
||||||
|
| `docs/IDENTIFIKATORI.md` | Identifikatoru veidošanas noteikumi |
|
||||||
|
| `docs/SADERIBA.md` | Atpakaļsaderības pārbaude: metode, rezultāti, atrastās avotu īpatnības |
|
||||||
|
| `verification/lv-vb-GGGG.verify.json` | Pārbaudes rezultāts pa pielikumiem |
|
||||||
|
|
||||||
|
### Avoti (`source/`)
|
||||||
|
|
||||||
|
| Mape | Saturs |
|
||||||
|
|---|---|
|
||||||
|
| `source/2026/`, `source/2025/` | Likuma teksts (likumi.lv HTML) un 12 pielikumu datnes tieši tā, kā publicētas; `links.json` ar adresēm |
|
||||||
|
| `source/klasifikacijas/` | Klasifikāciju MK noteikumi no likumi.lv (ekonomiskā, ieņēmumu, finansēšanas) |
|
||||||
|
| `source/kodi/` | Kodu vārdnīcas: no klasifikāciju noteikumiem, no pielikumu slēptajām SAP lapām, no Valsts kases izpildes datiem; resoru VPK ID |
|
||||||
|
|
||||||
|
### Rīki (`tools/`)
|
||||||
|
|
||||||
|
| Datne | Darbība |
|
||||||
|
|---|---|
|
||||||
|
| `tools/parse_budget.py` | Likums un pielikumi → `lv-vb-GGGG.xml` un katra drukātā skaitļa nozīme (`checks.json`) |
|
||||||
|
| `tools/verify_budget.py` | XSD pārbaude un katra drukātā skaitļa atjaunošana tikai no XML |
|
||||||
|
| `tools/calc.py` | Kopīgie summēšanas noteikumi (tie paši parsētājam un pārbaudītājam) |
|
||||||
|
| `tools/klasifikacijas.py` | Klasifikāciju kodu saraksti no likumi.lv noteikumu tabulām |
|
||||||
|
| `tools/kodi_no_sap.py` | Kodi no pielikumu slēptajām SAP BW lapām |
|
||||||
|
| `tools/rows.py`, `tools/rd.py` | Excel (.xlsx, .xls) un Word (.docx) lasītāji ar atkāpju līmeņiem |
|
||||||
|
|
||||||
|
Palaišana (Python 3.12, `pip install openpyxl xlrd lxml`):
|
||||||
|
|
||||||
|
```
|
||||||
|
python tools/klasifikacijas.py
|
||||||
|
python tools/kodi_no_sap.py 2026
|
||||||
|
python tools/parse_budget.py 2026 source/2026/likums.html source/2026 build/2026
|
||||||
|
python tools/verify_budget.py build/2026 2026
|
||||||
|
```
|
||||||
|
|
||||||
|
`source/kodi/vk_codes.tsv`, `vk_blocks.tsv` un `vpk_resorts.tsv` ir izgūti no VDZP (Valsts kases budžeta izpildes dati un Valsts kancelejas organizāciju reģistrs); vaicājumi ir aprakstīti `docs/MODELIS.md`.
|
||||||
|
|
||||||
|
## Saistītās datu kopas
|
||||||
|
|
||||||
|
- Valdības deklarācija un rīcības plāns: [Valdibas-Deklaracija-as-Code](https://processgit.org/Valsts-Pirmkods/Valdibas-Deklaracija-as-Code). Resori ir saistīti ar to pašu VPK ID.
|
||||||
|
- VDZP — Valsts datu un zināšanu platforma (demonstrācija): <https://lakehouse.pppa.lv/>.
|
||||||
|
- Valsts kases budžeta tāmes (izpildāmais budžets ar grozījumiem): `opendata.kase.gov.lv/api/v1/valsts_budzeta_tames`, saistāmas pēc resora, programmas, apakšprogrammas un EKK koda.
|
||||||
935
contracts/B15-valsts-budzets.odcs.yaml
Normal file
935
contracts/B15-valsts-budzets.odcs.yaml
Normal file
@@ -0,0 +1,935 @@
|
|||||||
|
# ODCS v3 datu līgums: B15 Valsts budžets (budžeta likums kā dati)
|
||||||
|
# Ģenerēts no schemas/valsts-budzets-0.1.xsd (tools/xsd_to_odcs.py, lakehouse). Shēmas daļu nelabot ar roku — labot XSD un ģenerēt no jauna.
|
||||||
|
apiVersion: v3.0.2
|
||||||
|
kind: DataContract
|
||||||
|
id: urn:pppa:cac:contract:B15
|
||||||
|
name: Valsts budžets (budžeta likums kā dati)
|
||||||
|
version: 0.1.0
|
||||||
|
status: active
|
||||||
|
domain: Valsts kā kods (Country as Code)
|
||||||
|
dataProduct: Valsts budžeta datukopa
|
||||||
|
tenant: PPP Asociācija (PPPA)
|
||||||
|
description:
|
||||||
|
purpose: Pieņemtais valsts budžeta likums kā dati — panti, ieņēmumi, apropriācijas pa programmām un apakšprogrammām, nākamo gadu maksimālie
|
||||||
|
apjomi, ilgtermiņa saistības un mērķdotācijas pašvaldībām; katrs likuma pielikumos drukātais skaitlis atjaunojams no datnes.
|
||||||
|
usage: Mašīnlasāma datu apmaiņa; ielāde datu ezerā katru dienu.
|
||||||
|
limitations: Koncepcijas demonstrācija, nav oficiāls izdevums. Budžeta paskaidrojumi (mērķi, rezultatīvie rādītāji) un gada laikā veiktās apropriācijas
|
||||||
|
izmaiņas vēl nav iekļautas.
|
||||||
|
servers:
|
||||||
|
- server: processgit
|
||||||
|
type: custom
|
||||||
|
format: xml
|
||||||
|
description: ProcessGit repozitorijs (Gitea API v1)
|
||||||
|
customProperties:
|
||||||
|
- property: url
|
||||||
|
value: https://processgit.org/Valsts-Pirmkods/Budget-as-Code
|
||||||
|
- property: ref
|
||||||
|
value: main
|
||||||
|
- property: path
|
||||||
|
value: data/lv-vb-*.xml
|
||||||
|
- property: schema
|
||||||
|
value: https://processgit.org/Valsts-Pirmkods/Budget-as-Code/src/branch/main/schemas/valsts-budzets-0.1.xsd
|
||||||
|
schema:
|
||||||
|
- name: Budget
|
||||||
|
logicalType: object
|
||||||
|
physicalType: xml-element
|
||||||
|
physicalName: Budget
|
||||||
|
description: ''
|
||||||
|
properties:
|
||||||
|
- name: id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?
|
||||||
|
description: 'Budžeta likuma versijas identifikators: lv-vb-GGGG[-rN], kur GGGG ir budžeta gads; -rN — N-tā likuma redakcija (grozījumi).'
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: title
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: year
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: horizonTo
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: status
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- draft
|
||||||
|
- adopted
|
||||||
|
- amended
|
||||||
|
- name: act
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: published
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: version
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Budžeta versija avota sistēmā (piemēram, D200).
|
||||||
|
- name: Source@id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
- name: Source@kind
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- lawText
|
||||||
|
- annex
|
||||||
|
- form
|
||||||
|
- name: Source@annex
|
||||||
|
logicalType: integer
|
||||||
|
required: false
|
||||||
|
- name: Source@title
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: Source@url
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: Source@sha256
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Provision
|
||||||
|
logicalType: array
|
||||||
|
required: false
|
||||||
|
items:
|
||||||
|
logicalType: string
|
||||||
|
- name: Provision@id
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
- name: Provision@chapter
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Provision@article
|
||||||
|
logicalType: integer
|
||||||
|
required: false
|
||||||
|
- name: Provision@part
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Provision@src
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: Parameter@id
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
- name: Parameter@name
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Parameter@code
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Parameter@year
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Parameter@value
|
||||||
|
logicalType: number
|
||||||
|
required: false
|
||||||
|
- name: Parameter@unit
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Parameter@src
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: Actor@id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
- name: Actor@kind
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- resort
|
||||||
|
- institution
|
||||||
|
- municipality
|
||||||
|
- unallocated
|
||||||
|
- other
|
||||||
|
- name: Actor@code
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Resora kods budžetā (01–74) vai cits avota kods.
|
||||||
|
- name: Actor@vpk
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: '[0-9]{2}-[0-9]{4}'
|
||||||
|
description: 'VPK ID no Valsts kancelejas organizāciju reģistra (B01): SS-IIII.'
|
||||||
|
- name: Actor@name
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: Purpose@id
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
- name: Purpose@kind
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- resort
|
||||||
|
- programme
|
||||||
|
- subprogramme
|
||||||
|
- project
|
||||||
|
- grant
|
||||||
|
- name: Purpose@code
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Programmas vai apakšprogrammas kods (NN.NN.NN) vai projekta kods.
|
||||||
|
- name: Purpose@name
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Purpose@parent
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: Purpose@holder
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: Purpose@block
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: core — valsts pamatfunkciju īstenošana; eu — Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansēto
|
||||||
|
projektu un pasākumu īstenošana.
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- core
|
||||||
|
- eu
|
||||||
|
- name: Purpose@function
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Indicator@id
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
- name: Indicator@purpose
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: Indicator@name
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Indicator@unit
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Indicator@year
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Indicator@base
|
||||||
|
logicalType: number
|
||||||
|
required: false
|
||||||
|
- name: Indicator@target
|
||||||
|
logicalType: number
|
||||||
|
required: false
|
||||||
|
- name: Indicator@src
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: Rule
|
||||||
|
logicalType: array
|
||||||
|
required: false
|
||||||
|
items:
|
||||||
|
logicalType: string
|
||||||
|
- name: Rule@id
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
- name: Rule@kind
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- limit
|
||||||
|
- condition
|
||||||
|
- permission
|
||||||
|
- name: Rule@appliesTo
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Rule@parameter
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Rule@value
|
||||||
|
logicalType: number
|
||||||
|
required: false
|
||||||
|
- name: Rule@unit
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Rule@provision
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: ClassItem@scheme
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
description: ekk — izdevumu ekonomiskā klasifikācija (MK 27.12.2005. noteikumi Nr. 1031); revenue — ieņēmumu klasifikācija (MK noteikumi par
|
||||||
|
budžetu ieņēmumu klasifikāciju); financing — finansēšanas klasifikācija (MK 22.11.2005. noteikumi Nr. 875); function — funkcionālā klasifikācija
|
||||||
|
(MK noteikumi Nr. 934, COFOG); commitment — ilgtermiņa saistību veidi (11. pielikums, 10 ciparu kods); law — likuma kopsavilkuma pozīcijas
|
||||||
|
bez klasifikācijas koda (piemēram, KA, PB, IKP).
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- ekk
|
||||||
|
- revenue
|
||||||
|
- financing
|
||||||
|
- function
|
||||||
|
- commitment
|
||||||
|
- law
|
||||||
|
- name: ClassItem@code
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: ClassItem@name
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: ClassItem@parent
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: ClassItem@intraFund
|
||||||
|
logicalType: boolean
|
||||||
|
required: false
|
||||||
|
description: true — transferts viena budžeta veida (fonda) ietvaros; fonda kopsummās (konsolidēti) to neskaita.
|
||||||
|
- name: ClassItem@parentScheme
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Vecākkoda shēma, ja tā atšķiras (piemēram, ekk 1000 zem likuma pozīcijas „Uzturēšanas izdevumi”).
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- ekk
|
||||||
|
- revenue
|
||||||
|
- financing
|
||||||
|
- function
|
||||||
|
- commitment
|
||||||
|
- law
|
||||||
|
- name: Allocation@id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
- name: Allocation@flow
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
description: revenue — valsts ieņēmumi (nodokļi, nodevas), ko administrē resors; resource — resursi izdevumu segšanai konkrētam mērķim (dotācija,
|
||||||
|
pašu ieņēmumi, transferti, ārvalstu palīdzība); expenditure — izdevumi; financing — finansēšana (aizņēmumi, aizdevumi, naudas līdzekļu izmaiņas).
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- revenue
|
||||||
|
- resource
|
||||||
|
- expenditure
|
||||||
|
- financing
|
||||||
|
- name: Allocation@fund
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- basic
|
||||||
|
- special
|
||||||
|
- name: Allocation@nature
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
description: appropriation — apropriācija (drīkst izlietot); forecast — prognoze (sagaidāmie ieņēmumi); ceiling — maksimāli pieļaujamais apjoms
|
||||||
|
nākamajiem gadiem (ietvars); commitment — ilgtermiņa saistības; earmarkedGrant — mērķdotācija pašvaldībai.
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- appropriation
|
||||||
|
- forecast
|
||||||
|
- ceiling
|
||||||
|
- commitment
|
||||||
|
- earmarkedGrant
|
||||||
|
- name: Allocation@year
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: Allocation@untilEnd
|
||||||
|
logicalType: boolean
|
||||||
|
required: false
|
||||||
|
description: true — summa attiecas uz laiku no „year” līdz projekta beigām (11. pielikuma „tālākā laika posmā”).
|
||||||
|
- name: Allocation@periodFrom
|
||||||
|
logicalType: date
|
||||||
|
required: false
|
||||||
|
- name: Allocation@periodTo
|
||||||
|
logicalType: date
|
||||||
|
required: false
|
||||||
|
- name: Allocation@holder
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: Actor, kura budžetā ir summa (resors).
|
||||||
|
- name: Allocation@recipient
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: Actor, kas saņem (piemēram, pašvaldība mērķdotācijai).
|
||||||
|
- name: Allocation@purpose
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: Allocation@block
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: core — valsts pamatfunkciju īstenošana; eu — Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansēto
|
||||||
|
projektu un pasākumu īstenošana.
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- core
|
||||||
|
- eu
|
||||||
|
- name: Allocation@commitmentKind
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Saistību veida kods (ClassItem scheme="commitment").
|
||||||
|
- name: Allocation@function
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: Allocation@scheme
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
description: ekk — izdevumu ekonomiskā klasifikācija (MK 27.12.2005. noteikumi Nr. 1031); revenue — ieņēmumu klasifikācija (MK noteikumi par
|
||||||
|
budžetu ieņēmumu klasifikāciju); financing — finansēšanas klasifikācija (MK 22.11.2005. noteikumi Nr. 875); function — funkcionālā klasifikācija
|
||||||
|
(MK noteikumi Nr. 934, COFOG); commitment — ilgtermiņa saistību veidi (11. pielikums, 10 ciparu kods); law — likuma kopsavilkuma pozīcijas
|
||||||
|
bez klasifikācijas koda (piemēram, KA, PB, IKP).
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- ekk
|
||||||
|
- revenue
|
||||||
|
- financing
|
||||||
|
- function
|
||||||
|
- commitment
|
||||||
|
- law
|
||||||
|
- name: Allocation@code
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: Allocation@amount
|
||||||
|
logicalType: number
|
||||||
|
required: true
|
||||||
|
description: Summa euro, kā publicēta (veseli euro vai ar centiem). Negatīva vērtība nozīmē samazinājumu vai līdzekļu izlietojumu finansēšanā.
|
||||||
|
- name: Allocation@partOf
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: '„Tai skaitā”: šī summa ir daļa no norādītā ieraksta.'
|
||||||
|
- name: Allocation@src
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: Allocation@srcRow
|
||||||
|
logicalType: integer
|
||||||
|
required: false
|
||||||
|
description: Rinda avota datnē, lai katru summu var pārbaudīt.
|
||||||
|
customProperties: []
|
||||||
|
- name: Source
|
||||||
|
logicalType: object
|
||||||
|
physicalType: xml-element
|
||||||
|
physicalName: Source
|
||||||
|
description: Avota dokuments. Katrs Allocation un Provision norāda savu avotu (src).
|
||||||
|
properties:
|
||||||
|
- name: id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: kind
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- lawText
|
||||||
|
- annex
|
||||||
|
- form
|
||||||
|
- name: annex
|
||||||
|
logicalType: integer
|
||||||
|
required: false
|
||||||
|
- name: title
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: url
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: sha256
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
customProperties: []
|
||||||
|
- name: Provision
|
||||||
|
logicalType: object
|
||||||
|
physicalType: xml-element
|
||||||
|
physicalName: Provision
|
||||||
|
description: ''
|
||||||
|
properties:
|
||||||
|
- name: id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: chapter
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: article
|
||||||
|
logicalType: integer
|
||||||
|
required: true
|
||||||
|
- name: part
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: src
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: text()
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
customProperties: []
|
||||||
|
- name: Parameter
|
||||||
|
logicalType: object
|
||||||
|
physicalType: xml-element
|
||||||
|
physicalName: Parameter
|
||||||
|
description: ''
|
||||||
|
properties:
|
||||||
|
- name: id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: name
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: code
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: year
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: value
|
||||||
|
logicalType: number
|
||||||
|
required: true
|
||||||
|
- name: unit
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: src
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
customProperties: []
|
||||||
|
- name: Actor
|
||||||
|
logicalType: object
|
||||||
|
physicalType: xml-element
|
||||||
|
physicalName: Actor
|
||||||
|
description: ''
|
||||||
|
properties:
|
||||||
|
- name: id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: kind
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- resort
|
||||||
|
- institution
|
||||||
|
- municipality
|
||||||
|
- unallocated
|
||||||
|
- other
|
||||||
|
- name: code
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Resora kods budžetā (01–74) vai cits avota kods.
|
||||||
|
- name: vpk
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: '[0-9]{2}-[0-9]{4}'
|
||||||
|
description: 'VPK ID no Valsts kancelejas organizāciju reģistra (B01): SS-IIII.'
|
||||||
|
- name: name
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
customProperties: []
|
||||||
|
- name: Purpose
|
||||||
|
logicalType: object
|
||||||
|
physicalType: xml-element
|
||||||
|
physicalName: Purpose
|
||||||
|
description: ''
|
||||||
|
properties:
|
||||||
|
- name: id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: kind
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- resort
|
||||||
|
- programme
|
||||||
|
- subprogramme
|
||||||
|
- project
|
||||||
|
- grant
|
||||||
|
- name: code
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Programmas vai apakšprogrammas kods (NN.NN.NN) vai projekta kods.
|
||||||
|
- name: name
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: parent
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: holder
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: block
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: core — valsts pamatfunkciju īstenošana; eu — Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansēto
|
||||||
|
projektu un pasākumu īstenošana.
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- core
|
||||||
|
- eu
|
||||||
|
- name: function
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
customProperties: []
|
||||||
|
- name: ClassItem
|
||||||
|
logicalType: object
|
||||||
|
physicalType: xml-element
|
||||||
|
physicalName: ClassItem
|
||||||
|
description: ''
|
||||||
|
properties:
|
||||||
|
- name: scheme
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
description: ekk — izdevumu ekonomiskā klasifikācija (MK 27.12.2005. noteikumi Nr. 1031); revenue — ieņēmumu klasifikācija (MK noteikumi par
|
||||||
|
budžetu ieņēmumu klasifikāciju); financing — finansēšanas klasifikācija (MK 22.11.2005. noteikumi Nr. 875); function — funkcionālā klasifikācija
|
||||||
|
(MK noteikumi Nr. 934, COFOG); commitment — ilgtermiņa saistību veidi (11. pielikums, 10 ciparu kods); law — likuma kopsavilkuma pozīcijas
|
||||||
|
bez klasifikācijas koda (piemēram, KA, PB, IKP).
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- ekk
|
||||||
|
- revenue
|
||||||
|
- financing
|
||||||
|
- function
|
||||||
|
- commitment
|
||||||
|
- law
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: code
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: name
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: parent
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: intraFund
|
||||||
|
logicalType: boolean
|
||||||
|
required: false
|
||||||
|
description: true — transferts viena budžeta veida (fonda) ietvaros; fonda kopsummās (konsolidēti) to neskaita.
|
||||||
|
- name: parentScheme
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Vecākkoda shēma, ja tā atšķiras (piemēram, ekk 1000 zem likuma pozīcijas „Uzturēšanas izdevumi”).
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- ekk
|
||||||
|
- revenue
|
||||||
|
- financing
|
||||||
|
- function
|
||||||
|
- commitment
|
||||||
|
- law
|
||||||
|
customProperties: []
|
||||||
|
- name: Allocation
|
||||||
|
logicalType: object
|
||||||
|
physicalType: xml-element
|
||||||
|
physicalName: Allocation
|
||||||
|
description: Viens naudas fakts. Kopsummas aprēķina, saskaitot ierakstus bez partOf.
|
||||||
|
properties:
|
||||||
|
- name: id
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: 'Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00.
|
||||||
|
Noteikumi: docs/IDENTIFIKATORI.md.'
|
||||||
|
primaryKey: true
|
||||||
|
unique: true
|
||||||
|
- name: flow
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
description: revenue — valsts ieņēmumi (nodokļi, nodevas), ko administrē resors; resource — resursi izdevumu segšanai konkrētam mērķim (dotācija,
|
||||||
|
pašu ieņēmumi, transferti, ārvalstu palīdzība); expenditure — izdevumi; financing — finansēšana (aizņēmumi, aizdevumi, naudas līdzekļu izmaiņas).
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- revenue
|
||||||
|
- resource
|
||||||
|
- expenditure
|
||||||
|
- financing
|
||||||
|
- name: fund
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- basic
|
||||||
|
- special
|
||||||
|
- name: nature
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
description: appropriation — apropriācija (drīkst izlietot); forecast — prognoze (sagaidāmie ieņēmumi); ceiling — maksimāli pieļaujamais apjoms
|
||||||
|
nākamajiem gadiem (ietvars); commitment — ilgtermiņa saistības; earmarkedGrant — mērķdotācija pašvaldībai.
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- appropriation
|
||||||
|
- forecast
|
||||||
|
- ceiling
|
||||||
|
- commitment
|
||||||
|
- earmarkedGrant
|
||||||
|
- name: year
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: untilEnd
|
||||||
|
logicalType: boolean
|
||||||
|
required: false
|
||||||
|
description: true — summa attiecas uz laiku no „year” līdz projekta beigām (11. pielikuma „tālākā laika posmā”).
|
||||||
|
- name: periodFrom
|
||||||
|
logicalType: date
|
||||||
|
required: false
|
||||||
|
- name: periodTo
|
||||||
|
logicalType: date
|
||||||
|
required: false
|
||||||
|
- name: holder
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: Actor, kura budžetā ir summa (resors).
|
||||||
|
- name: recipient
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: Actor, kas saņem (piemēram, pašvaldība mērķdotācijai).
|
||||||
|
- name: purpose
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: block
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: core — valsts pamatfunkciju īstenošana; eu — Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansēto
|
||||||
|
projektu un pasākumu īstenošana.
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- core
|
||||||
|
- eu
|
||||||
|
- name: commitmentKind
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
description: Saistību veida kods (ClassItem scheme="commitment").
|
||||||
|
- name: function
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
- name: scheme
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
description: ekk — izdevumu ekonomiskā klasifikācija (MK 27.12.2005. noteikumi Nr. 1031); revenue — ieņēmumu klasifikācija (MK noteikumi par
|
||||||
|
budžetu ieņēmumu klasifikāciju); financing — finansēšanas klasifikācija (MK 22.11.2005. noteikumi Nr. 875); function — funkcionālā klasifikācija
|
||||||
|
(MK noteikumi Nr. 934, COFOG); commitment — ilgtermiņa saistību veidi (11. pielikums, 10 ciparu kods); law — likuma kopsavilkuma pozīcijas
|
||||||
|
bez klasifikācijas koda (piemēram, KA, PB, IKP).
|
||||||
|
quality:
|
||||||
|
- type: library
|
||||||
|
rule: validValues
|
||||||
|
validValues:
|
||||||
|
- ekk
|
||||||
|
- revenue
|
||||||
|
- financing
|
||||||
|
- function
|
||||||
|
- commitment
|
||||||
|
- law
|
||||||
|
- name: code
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
- name: amount
|
||||||
|
logicalType: number
|
||||||
|
required: true
|
||||||
|
description: Summa euro, kā publicēta (veseli euro vai ar centiem). Negatīva vērtība nozīmē samazinājumu vai līdzekļu izlietojumu finansēšanā.
|
||||||
|
- name: partOf
|
||||||
|
logicalType: string
|
||||||
|
required: false
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
description: '„Tai skaitā”: šī summa ir daļa no norādītā ieraksta.'
|
||||||
|
- name: src
|
||||||
|
logicalType: string
|
||||||
|
required: true
|
||||||
|
logicalTypeOptions:
|
||||||
|
pattern: lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+
|
||||||
|
- name: srcRow
|
||||||
|
logicalType: integer
|
||||||
|
required: false
|
||||||
|
description: Rinda avota datnē, lai katru summu var pārbaudīt.
|
||||||
|
customProperties: []
|
||||||
|
quality:
|
||||||
|
- name: xsd_valid
|
||||||
|
type: custom
|
||||||
|
engine: xsd
|
||||||
|
implementation: schemas/valsts-budzets-0.1.xsd
|
||||||
|
description: Datne atbilst XSD shēmai; neatbilstoša datne tiek reģistrēta kā kļūda
|
||||||
|
dimension: conformity
|
||||||
|
- name: filename_is_id
|
||||||
|
type: custom
|
||||||
|
engine: cac-lakehouse
|
||||||
|
implementation: Path(path).stem == root/@id
|
||||||
|
description: Datnes nosaukums = dokumenta identifikators
|
||||||
|
dimension: consistency
|
||||||
|
- name: printed_numbers_reproduced
|
||||||
|
type: custom
|
||||||
|
engine: cac-lakehouse
|
||||||
|
implementation: app.cac_processgit:printed_numbers_reproduced
|
||||||
|
description: Katrs likuma pielikumos drukātais skaitlis atjaunojams no datnes (tools/verify_budget.py)
|
||||||
|
dimension: accuracy
|
||||||
|
- name: resort_has_vpk_id
|
||||||
|
type: custom
|
||||||
|
engine: cac-lakehouse
|
||||||
|
implementation: app.cac_processgit:resort_has_vpk_id
|
||||||
|
description: Resoram, kas ir institūcija, norādīts VPK ID
|
||||||
|
dimension: completeness
|
||||||
|
slaProperties:
|
||||||
|
- property: frequency
|
||||||
|
value: 1
|
||||||
|
unit: d
|
||||||
|
element: pull ingest (cron 03:30 UTC)
|
||||||
|
- property: retention
|
||||||
|
value: visas versijas (git vēsture)
|
||||||
|
team:
|
||||||
|
- role: owner
|
||||||
|
name: PPP Asociācija (PPPA)
|
||||||
|
- role: data steward
|
||||||
|
name: PPP Asociācija (PPPA)
|
||||||
|
support:
|
||||||
|
- channel: issues
|
||||||
|
url: https://processgit.org/Valsts-Pirmkods/Budget-as-Code/issues
|
||||||
|
customProperties:
|
||||||
|
- property: sourceId
|
||||||
|
value: B15
|
||||||
|
- property: namespace
|
||||||
|
value: urn:pppa:vpk:budzets:0.1
|
||||||
|
- property: rootElement
|
||||||
|
value: Budget
|
||||||
|
- property: identifiers
|
||||||
|
value: lv-vb-GGGG; pants .pNNN; resors .ac.rSS; programma .pr.SS.PP.AA.00; projekts .pj.…; naudas fakts .a.pNN.r<rinda>.y<gads>
|
||||||
7692
data/lv-vb-2025.xml
Normal file
7692
data/lv-vb-2025.xml
Normal file
File diff suppressed because it is too large
Load Diff
7918
data/lv-vb-2026.xml
Normal file
7918
data/lv-vb-2026.xml
Normal file
File diff suppressed because it is too large
Load Diff
39
docs/IDENTIFIKATORI.md
Normal file
39
docs/IDENTIFIKATORI.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Identifikatoru veidošanas noteikumi (v0.1)
|
||||||
|
|
||||||
|
Tie paši principi kā Valdības deklarācijas datukopā: viens elements — viens pastāvīgs identifikators; identifikators satur ceļu līdz saknei; atļautās rakstzīmes — latīņu burti, cipari, `-`, `_`, `.`; der XML `xs:ID`, datnes nosaukumā un tīmekļa adresē.
|
||||||
|
|
||||||
|
## Sakne
|
||||||
|
|
||||||
|
| Objekts | Forma | Piemērs |
|
||||||
|
|---|---|---|
|
||||||
|
| Budžeta likums | `lv-vb-GGGG` | `lv-vb-2026` — likums „Par valsts budžetu 2026. gadam un budžeta ietvaru 2026., 2027. un 2028. gadam” |
|
||||||
|
| Likuma redakcija pēc grozījumiem | `lv-vb-GGGG-rN` | `lv-vb-2026-r2` |
|
||||||
|
|
||||||
|
Datnes nosaukums = budžeta identifikators: `data/lv-vb-2026.xml`.
|
||||||
|
|
||||||
|
## Ieraksti
|
||||||
|
|
||||||
|
| Ieraksts | Forma | Piemērs |
|
||||||
|
|---|---|---|
|
||||||
|
| Avots | `…src.law`, `…src.pNN` | `lv-vb-2026.src.p04` — 4. pielikums |
|
||||||
|
| Pants | `…pNNN` | `lv-vb-2026.p017` — 17. pants |
|
||||||
|
| Parametrs | `…par.<nosaukums>-GGGG` | `lv-vb-2026.par.ikp-2027` |
|
||||||
|
| Resors | `…ac.rSS` (SS — resora kods; VPK ID atribūtā `vpk`) | `lv-vb-2026.ac.r13` (`vpk="13-0000"`) |
|
||||||
|
| Pašvaldība | `…ac.m-<nosaukums>` | `lv-vb-2026.ac.m-rigas-valstspilseta` |
|
||||||
|
| Resora mērķis | `…pr.SS` | `lv-vb-2026.pr.17` |
|
||||||
|
| Programma, apakšprogramma | `…pr.SS.PP.AA.00` | `lv-vb-2026.pr.17.23.06.00` |
|
||||||
|
| Projekts (11. pielikums) | `…pj.SS.PP.AA.00.<projekta kods>` | `lv-vb-2026.pj.12.67.02.00.ceki-em-002` |
|
||||||
|
| Mērķdotācija | `…pr.gNN` (NN — pielikums) | `lv-vb-2026.pr.g06` |
|
||||||
|
| Naudas fakts | `…a.pNN.r<rinda>.y<gads>[l][-N]` | `lv-vb-2026.a.p04.r89.y2026` |
|
||||||
|
|
||||||
|
Naudas fakta identifikators ir atvasināts no avota: pielikums, rinda avota datnē un gads. `l` nozīmē aili „tālākā laika posmā līdz projekta beigām”. `-N` tiek pievienots, ja viena avota šūna dod vairākus faktus (piemēram, mērķdotāciju ailes vienā rindā). Atkārtoti parsējot to pašu likumu, identifikatori nemainās.
|
||||||
|
|
||||||
|
## Klasifikāciju kodi
|
||||||
|
|
||||||
|
Kodus neveido no jauna. `ClassItem` izmanto oficiālos kodus:
|
||||||
|
|
||||||
|
- ekonomiskā klasifikācija (`ekk`): 4 cipari, piemēram `7131`;
|
||||||
|
- ieņēmumi (`revenue`): 5 cipari, piemēram `21710`;
|
||||||
|
- finansēšana (`financing`): `F` + 8 cipari, piemēram `F40020000`.
|
||||||
|
|
||||||
|
Likuma kopsavilkuma pozīcijām bez klasifikācijas koda izmanto SAP pielikumu kodus (`A100`, `B100`, `PB`…) shēmā `law`. Ja koda nav nevienā avotā, tiek veidots `L-<nosaukums>`.
|
||||||
104
docs/MODELIS.md
Normal file
104
docs/MODELIS.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# Budžeta modelis (v0.1)
|
||||||
|
|
||||||
|
## 1. Jēdzieni
|
||||||
|
|
||||||
|
Budžets ir lēmums par periodu: kurš drīkst saņemt vai izlietot cik naudas, kādam mērķim un pēc kādiem noteikumiem.
|
||||||
|
|
||||||
|
| Ieraksts | Kas tas ir | Galvenie lauki |
|
||||||
|
|---|---|---|
|
||||||
|
| `Budget` | Viena budžeta likuma versija | `id`, `year`, `horizonTo`, `status` (draft / adopted / amended), `act`, `published`, `version` |
|
||||||
|
| `Source` | Avota dokuments | `kind` (lawText / annex / form), `annex`, `url`, `sha256` |
|
||||||
|
| `Provision` | Likuma pants (teksts) | `article`, `chapter` |
|
||||||
|
| `Parameter` | Lielums, kas nav naudas piešķīrums | `name`, `code`, `year`, `value`, `unit` |
|
||||||
|
| `Actor` | Kurš tur vai saņem naudu | `kind` (resort / institution / municipality / unallocated), `code` (resora kods), `vpk` (VPK ID) |
|
||||||
|
| `Purpose` | Kam nauda paredzēta (koks) | `kind` (resort / programme / subprogramme / project / grant), `code`, `parent`, `holder`, `function` |
|
||||||
|
| `Indicator` | Rezultatīvais rādītājs | `purpose`, `unit`, `year`, `base`, `target` (rezervēts paskaidrojumiem) |
|
||||||
|
| `Rule` | Mašīnlasāms likuma noteikums | `kind` (limit / condition / permission), `parameter`, `value`, `provision` (rezervēts) |
|
||||||
|
| `ClassItem` | Izmantotais klasifikācijas kods | `scheme`, `code`, `name`, `parent`, `parentScheme`, `intraFund` |
|
||||||
|
| `Allocation` | Viens naudas fakts | skatīt 2. nodaļu |
|
||||||
|
|
||||||
|
## 2. Naudas fakts (`Allocation`)
|
||||||
|
|
||||||
|
| Lauks | Vērtības | Nozīme |
|
||||||
|
|---|---|---|
|
||||||
|
| `flow` | revenue · resource · expenditure · financing | valsts ieņēmumi · resursi izdevumu segšanai · izdevumi · finansēšana |
|
||||||
|
| `fund` | basic · special | valsts pamatbudžets · valsts speciālais budžets |
|
||||||
|
| `nature` | appropriation · forecast · ceiling · commitment · earmarkedGrant | apropriācija · ieņēmumu prognoze · maksimālais apjoms nākamajiem gadiem · ilgtermiņa saistības · mērķdotācija pašvaldībai |
|
||||||
|
| `year`, `untilEnd` | gads; `true` — no šī gada līdz projekta beigām | |
|
||||||
|
| `periodFrom`, `periodTo` | datumi | mērķdotācijām: 1.01.–31.08. un 1.09.–31.12. |
|
||||||
|
| `holder` | Actor | kura budžetā ir summa |
|
||||||
|
| `recipient` | Actor | kas saņem (pašvaldība) |
|
||||||
|
| `purpose` | Purpose | programma, apakšprogramma, projekts vai mērķdotācija |
|
||||||
|
| `block` | core · eu | valsts pamatfunkciju īstenošana · ES politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansētie projekti |
|
||||||
|
| `commitmentKind` | 10 ciparu kods | ilgtermiņa saistību veids (kodi grupējas pa diviem cipariem: `01 01 10 00 00`) |
|
||||||
|
| `function` | COFOG kods | funkcionālā klasifikācija |
|
||||||
|
| `scheme`, `code` | ekk · revenue · financing · law · commitment | klasifikācija un kods |
|
||||||
|
| `amount` | euro | kā publicēts |
|
||||||
|
| `partOf` | Allocation | „tai skaitā”: daļa no cita fakta, kopsummās otrreiz netiek skaitīta |
|
||||||
|
| `src`, `srcRow` | Source, rinda | kur summa ir avota datnē |
|
||||||
|
|
||||||
|
## 3. Kas tiek glabāts un kas aprēķināts
|
||||||
|
|
||||||
|
Katrs fakts tiek glabāts vienu reizi, no detalizētākā avota:
|
||||||
|
|
||||||
|
| Fakts | Avots |
|
||||||
|
|---|---|
|
||||||
|
| Izdevumi, resursi, finansēšana budžeta gadā | 4. pielikums (pamatbudžets) un 5. pielikums (speciālais budžets) — apakšprogrammu līmenī |
|
||||||
|
| Nākamo divu gadu maksimālie apjomi | 3. pielikums — resora un bloka līmenī (`nature="ceiling"`) |
|
||||||
|
| Ieņēmumi | 2. pielikums (`nature="forecast"`); speciālā budžeta budžeta gada ieņēmumi — 5. pielikums pa apakšprogrammām |
|
||||||
|
| Nodevas pa administrējošām ministrijām | 2. pielikums, `partOf` uz attiecīgo ieņēmumu kodu |
|
||||||
|
| Ilgtermiņa saistības | 11. pielikums — projekta vai programmas un saistību veida līmenī |
|
||||||
|
| Mērķdotācijas pašvaldībām | 6.–10. pielikums — pa pašvaldībām un periodiem; „tai skaitā” kā `partOf` |
|
||||||
|
| IKP prognoze | 1. pielikums (`Parameter`) |
|
||||||
|
|
||||||
|
Viss pārējais — kopsummas, starpsummas, resoru un programmu summas, finansiālā bilance, viss 1. pielikums un 3. pielikuma budžeta gada dati — tiek aprēķināts.
|
||||||
|
|
||||||
|
Daļa summu likumā parādīta tikai apkopojuma līmenī, piemēram, valsts aizņēmumi. Tie tiek glabāti tajā līmenī, kurā likums tos rāda (bez programmas). Tādu ir maz: skatīt `docs/SADERIBA.md`.
|
||||||
|
|
||||||
|
## 4. Konsolidācija
|
||||||
|
|
||||||
|
Transferti viena fonda iekšienē (piemēram, „Valsts pamatbudžeta savstarpējie transferti”, „Ārvalstu finanšu palīdzība atmaksām valsts pamatbudžetam”) kopsummā izslēdzas tajā līmenī, kurā ir gan devējs, gan saņēmējs. Noteikums:
|
||||||
|
|
||||||
|
- kods ar `intraFund="true"` tiek skaitīts mezgla kopsummā tikai tad, ja likums šo kodu šajā mezglā rāda;
|
||||||
|
- ja nerāda, tas mezglā ir izslēdzies.
|
||||||
|
|
||||||
|
Piemērs: 2026. gada pamatbudžeta resursi pa apakšprogrammām ir 13 500 542 589 euro, bet likumā kopā 13 363 050 794 euro. Starpība 137 491 795 euro ir pamatbudžeta iekšējie transferti (25,4 milj.), ārvalstu palīdzības atmaksas (110,1 milj.) un dotācijas atmaksas (2,0 milj.).
|
||||||
|
|
||||||
|
Starp fondiem (pamatbudžets ↔ speciālais budžets) konsolidē 1. pielikums: „mīnus transferts” rindas aprēķina no EKK kodiem 7110, 7120, 9110, 9120.
|
||||||
|
|
||||||
|
## 5. Klasifikāciju koks
|
||||||
|
|
||||||
|
Pielikumos kodi nav drukāti — tikai nosaukumi ar atkāpēm. Kodus piesaista pēc nosaukuma no trim avotiem: klasifikāciju MK noteikumiem, pielikumu slēptajām SAP lapām un Valsts kases izpildes datiem. Vecākkods tiek noteikts:
|
||||||
|
|
||||||
|
1. ar balsojumu pēc atkāpēm visos 2.–5. pielikuma blokos;
|
||||||
|
2. pārbaudot pret koda struktūru: skaitliskam kodam vecākkods var būt tikai tā prefikss (21200 nevar būt zem 21100).
|
||||||
|
|
||||||
|
Tas novērš avotu formatējuma kļūdas (sk. `docs/SADERIBA.md`).
|
||||||
|
|
||||||
|
## 6. Pielikumi kā skati
|
||||||
|
|
||||||
|
| Pielikums | Skats |
|
||||||
|
|---|---|
|
||||||
|
| 1. Konsolidētais budžets | Aprēķins no ieņēmumiem, izdevumiem un finansēšanas abos fondos; procenti no IKP — no `Parameter` |
|
||||||
|
| 2. Ieņēmumi | `flow="revenue"`; nodevas — `partOf` |
|
||||||
|
| 3. Resoru kopsavilkums | Budžeta gads — summa no 4./5. pielikuma faktiem pa resoriem un blokiem; nākamie gadi — `nature="ceiling"` |
|
||||||
|
| 4., 5. Programmas | `flow` resource / expenditure / financing pa apakšprogrammām |
|
||||||
|
| 6.–10. Mērķdotācijas | `nature="earmarkedGrant"`, `recipient` = pašvaldība |
|
||||||
|
| 11. Ilgtermiņa saistības | `nature="commitment"`, `commitmentKind`, projekti kā `Purpose kind="project"` |
|
||||||
|
| 12. Veidlapa | Tikai `Source` (datu nav) |
|
||||||
|
| Likuma teksts | `Provision` |
|
||||||
|
|
||||||
|
## 7. Ārējo kodu avoti
|
||||||
|
|
||||||
|
`source/kodi/` datnes izgūtas no VDZP (<https://lakehouse.pppa.lv/>):
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- vk_codes.tsv: ekonomiskās, ieņēmumu un finansēšanas klasifikācijas kodi ar nosaukumiem no Valsts kases izpildes datiem
|
||||||
|
SELECT DISTINCT klasifikacija, v FROM (SELECT klasifikacija, unnest(ARRAY[likuma_griezuma_ekk, ekk4, ekk5, ekk6, ekk7]) v
|
||||||
|
FROM cac_bronze.vk_budget_execution) x WHERE v ~ '^[A-Z]{0,2}[0-9]';
|
||||||
|
-- vk_blocks.tsv: budžeta bloks (pamatfunkcijas / ārvalstu finanšu palīdzība) katrai apakšprogrammai
|
||||||
|
SELECT gads, ministrija_kods, programma_kods, apaksprogramma_kods, budzeta_bloks, budzeta_tips, count(*)
|
||||||
|
FROM cac_bronze.vk_budget_execution WHERE gads IN ('2025','2026') GROUP BY 1,2,3,4,5,6;
|
||||||
|
-- vpk_resorts.tsv: resoru VPK ID (resora kods = VPK ID nozares daļa)
|
||||||
|
SELECT cac_id, name FROM cac_silver.organization WHERE cac_id LIKE '%-0000';
|
||||||
|
```
|
||||||
60
docs/SADERIBA.md
Normal file
60
docs/SADERIBA.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# Atpakaļsaderība ar budžeta likumu
|
||||||
|
|
||||||
|
## Metode
|
||||||
|
|
||||||
|
1. `tools/parse_budget.py` nolasa likuma tekstu un visus 12 pielikumus. Katru drukāto skaitli tas pieraksta kopā ar tā nozīmi: fonds, plūsma, gads, būtība, mērķis (resors / programma / projekts), bloks, saistību veids un klasifikācijas kodi, ko skaitlis aptver.
|
||||||
|
2. XML datnē tiek ierakstīti tikai naudas fakti (`Allocation`). Kopsummas, starpsummas un bilances netiek glabātas.
|
||||||
|
3. `tools/verify_budget.py` pārbauda XML pret XSD un **katru drukāto skaitli aprēķina no jauna tikai no XML**. Abi rīki izmanto tos pašus summēšanas noteikumus (`tools/calc.py`). Skaitlis ir atjaunots, ja starpība ir mazāka par 0,5 euro (procentiem no IKP — 0,005).
|
||||||
|
|
||||||
|
## Rezultāts
|
||||||
|
|
||||||
|
| Pielikums | 2026: drukāti | 2026: atjaunoti | 2025: drukāti | 2025: atjaunoti |
|
||||||
|
|---|---:|---:|---:|---:|
|
||||||
|
| 1. Valsts konsolidētais budžets | 253 | 253 | 252 | 252 |
|
||||||
|
| 2. Valsts budžeta ieņēmumi | 217 | 217 | 216 | 216 |
|
||||||
|
| 3. Pamatbudžeta un speciālā budžeta kopsavilkums | 6 241 | 6 241 | 5 944 | 5 944 |
|
||||||
|
| 4. Pamatbudžets pa programmām un apakšprogrammām | 8 160 | 8 160 | 7 863 | 7 863 |
|
||||||
|
| 5. Speciālais budžets pa programmām un apakšprogrammām | 233 | 233 | 233 | 233 |
|
||||||
|
| 6.–10. Mērķdotācijas pašvaldībām (kopsummas) | 14 | 14 | 14 | 14 |
|
||||||
|
| 11. Ilgtermiņa saistības | 43 339 | 43 339 | 41 155 | 41 155 |
|
||||||
|
| **Kopā** | **58 457** | **58 457 (100 %)** | **55 677** | **55 677 (100 %)** |
|
||||||
|
|
||||||
|
6.–10. pielikumā katra pašvaldības summa ir glabāta tieši (`Allocation` ar `recipient`). Pārbaude aprēķina pielikuma kopsummas un periodu kopsummas.
|
||||||
|
|
||||||
|
12. pielikums ir tukša aprēķina veidlapa. Skaitļu tajā nav.
|
||||||
|
|
||||||
|
Likuma teksts: 2026. gadā 81 pants, 2025. gadā 82 panti (`Provision`).
|
||||||
|
|
||||||
|
| Saturs XML | 2026 | 2025 |
|
||||||
|
|---|---:|---:|
|
||||||
|
| Naudas fakti (`Allocation`) | 6 400 | 6 322 |
|
||||||
|
| — apropriācijas (budžeta gads) | 1 892 | 1 826 |
|
||||||
|
| — maksimālie apjomi (nākamie divi gadi) | 838 | 796 |
|
||||||
|
| — ieņēmumu prognozes | 392 | 388 |
|
||||||
|
| — ilgtermiņa saistības | 2 919 | 2 947 |
|
||||||
|
| — mērķdotācijas pašvaldībām | 359 | 365 |
|
||||||
|
| Mērķi (`Purpose`), t. sk. projekti | 867 (243) | 834 (230) |
|
||||||
|
| Klasifikāciju kodi (`ClassItem`), t. sk. fonda iekšējie transferti | 236 (11) | 233 (11) |
|
||||||
|
| Resori ar VPK ID | 28 | 28 |
|
||||||
|
|
||||||
|
## Avotu īpatnības, kas atrastas pārbaudē
|
||||||
|
|
||||||
|
1. **Pielikumi ir SAP BW (BEx Analyzer) izdrukas.** Drukātajās tabulās klasifikācijas kodu nav, ir tikai nosaukumi ar atkāpēm. Kodi ir daļēji slēptajās lapās (`ZQZBC_PLN_*`, budžeta versija `D200`). Pārējos kodus piesaista pēc nosaukuma no klasifikāciju MK noteikumiem un Valsts kases datiem. Visām pielikumu rindām kods ir atrasts, izņemot „Resursi izdevumu segšanai” (aprēķināta kopsumma).
|
||||||
|
2. **Atkāpju kļūda.** Dažos blokos „Ārvalstu finanšu palīdzība atmaksām valsts pamatbudžetam” (21200) ir ar atkāpi zem „Iestādes ieņēmumi no ārvalstu finanšu palīdzības” (21100), lai gan tie ir blakus kodi. Piemērs: 2026. gada 4. pielikums, Aizsardzības ministrijas programma 73.00.00: 9 372 926 = 3 200 000 + 6 172 926. Koku nosaka balsojums pa visiem blokiem, ko pārbauda pret koda struktūru.
|
||||||
|
3. **11. pielikumā atkāpju nav.** Līmeņi ir nolasīti no tiem pašiem nosaukumiem 4. pielikumā. Saistību veidu kodi grupējas pa diviem cipariem (`01 01 10 00 00`). Viens projekts var parādīties vairākos saistību veidos (vispārīgajā un precīzākajā); glabāts tiek precīzākais.
|
||||||
|
4. **Galvenes forma atšķiras.** 11. pielikuma speciālā budžeta daļā resors ir „18 Labklājības ministrija” (bez punkta), citur „18. Labklājības ministrija”.
|
||||||
|
5. **Izkārtojums atšķiras starp gadiem.** 2025. gada pielikumi ir .xls, 2026. gada — .xlsx. 2025. gada 1. un 2. pielikumā ir papildu tukša pirmā aile. 2025. gada 7. pielikuma datne ir `7_PIELIKUMS_G.DOCX`.
|
||||||
|
6. **Summas, kas likumā redzamas tikai apkopojuma līmenī.** Valsts aizņēmumi, aizdevumi un naudas līdzekļu izmaiņas 4. pielikumā ir tikai budžeta kopsavilkumā vai resora līmenī bez programmas. Tās glabātas tajā pašā līmenī: 2026. gadā 4 no 4. pielikuma un 6 no 3. pielikuma.
|
||||||
|
7. **3. un 4. pielikums dažas summas rāda atšķirīgi.** 3. pielikums sadala pa blokiem (I pamatfunkcijas / II ES projekti) arī tās finansēšanas summas, kurām 4. pielikumā bloka nav — piemēram, Finanšu ministrijas aizdevumus (−334 457 337 euro). Tās ierakstītas ar bloku, ko norāda 3. pielikums, nemainot kopsummas: 4 pārklasifikācijas pa pāriem gan 2026., gan 2025. gadā.
|
||||||
|
8. **Speciālā budžeta ieņēmumi nākamajiem gadiem** 2. pielikumā ir tikai valsts līmenī. Tie piesaistīti Labklājības ministrijai (18), jo tā ir vienīgais speciālā budžeta turētājs, un blokam „pamatfunkcijas”.
|
||||||
|
9. **Budžeta bloks.** Programmu bloks (pamatfunkcijas / ES projekti) ņemts no Valsts kases izpildes datiem. 41 programmai, kurai izpildes datu nav, bloks noteikts pēc programmas koda (60.–85. programma — ES un ārvalstu finanšu palīdzība). Visas 3. pielikuma bloku summas atjaunojas.
|
||||||
|
10. **Kļūda klasifikācijas tekstā.** Ieņēmumu klasifikācijas tīmekļa tekstā ir „I estādes ieņēmumi no ārvalstu finanšu palīdzības” (ar atstarpi). Nosaukums salīdzināts, šo atstarpi neņemot vērā.
|
||||||
|
|
||||||
|
## Atkārtošana
|
||||||
|
|
||||||
|
```
|
||||||
|
python tools/parse_budget.py 2026 source/2026/likums.html source/2026 build/2026
|
||||||
|
python tools/verify_budget.py build/2026 2026
|
||||||
|
```
|
||||||
|
|
||||||
|
Kopsavilkums ir `verification/lv-vb-GGGG.verify.json`. Pilns pārbaudes saraksts (`build/GGGG/lv-vb-GGGG.checks.json`) tiek izveidots no jauna un repozitorijā netiek glabāts.
|
||||||
285
schemas/valsts-budzets-0.1.xsd
Normal file
285
schemas/valsts-budzets-0.1.xsd
Normal file
@@ -0,0 +1,285 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Valsts budžets kā kods — loģiskais modelis, shēma v0.1
|
||||||
|
PPP Asociācija (PPPA), Valsts Pirmkods (VPK). Melnraksts.
|
||||||
|
Plakana struktūra: viens saknes elements un septiņi ierakstu veidi, kas saistīti ar identifikatoriem.
|
||||||
|
-->
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="urn:pppa:vpk:budzets:0.1"
|
||||||
|
xmlns:b="urn:pppa:vpk:budzets:0.1"
|
||||||
|
targetNamespace="urn:pppa:vpk:budzets:0.1"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.1" xml:lang="lv">
|
||||||
|
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation xml:lang="lv">
|
||||||
|
Budžets ir lēmums par periodu: kurš drīkst saņemt vai izlietot cik naudas, kādam mērķim un pēc kādiem noteikumiem.
|
||||||
|
Modelis nav likuma pielikumu izkārtojuma kopija. Pielikumi ir skati, kurus var atjaunot no šiem ierakstiem.
|
||||||
|
|
||||||
|
Ierakstu veidi:
|
||||||
|
Source — avota dokuments (likuma teksts, pielikuma datne) ar kontrolsummu
|
||||||
|
Provision — likuma panta daļa (teksts)
|
||||||
|
Parameter — likumā vai pielikumā noteikts lielums, kas nav naudas piešķīrums (piemēram, IKP prognoze)
|
||||||
|
Actor — kurš tur, dod vai saņem naudu (resors, iestāde, pašvaldība)
|
||||||
|
Purpose — kam nauda paredzēta (resors, programma, apakšprogramma, projekts) kā koks
|
||||||
|
ClassItem — izmantotie klasifikāciju kodi ar nosaukumiem un vecākkodu
|
||||||
|
Allocation — viens naudas fakts
|
||||||
|
Indicator — mērķa sasniegšanas rādītājs (no budžeta paskaidrojumiem; likumā nav)
|
||||||
|
Rule — mašīnlasāms noteikums vai ierobežojums no likuma teksta (piemēram, pārdales robeža)
|
||||||
|
Kopsummas, starpsummas un bilance netiek glabātas: tās aprēķina no Allocation ierakstiem.
|
||||||
|
Izņēmums: Allocation ar partOf ir „tai skaitā” daļa no cita ieraksta un kopsummās netiek skaitīta otrreiz.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
|
||||||
|
<!-- ============================================================ identifikatori -->
|
||||||
|
<xs:simpleType name="BudgetId">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">Budžeta likuma versijas identifikators: lv-vb-GGGG[-rN], kur GGGG ir budžeta gads; -rN — N-tā likuma redakcija (grozījumi).</xs:documentation></xs:annotation>
|
||||||
|
<xs:restriction base="xs:ID"><xs:pattern value="lv-vb-[0-9]{4}(-r[0-9]+)?"/></xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="ItemId">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">Ieraksta identifikators: budžeta identifikators + segmenti, piemēram lv-vb-2026.a.p04.000123 vai lv-vb-2026.pr.17.23.06.00. Noteikumi: docs/IDENTIFIKATORI.md.</xs:documentation></xs:annotation>
|
||||||
|
<xs:restriction base="xs:ID"><xs:pattern value="lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+"/></xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="ItemRef">
|
||||||
|
<xs:restriction base="xs:string"><xs:pattern value="lv-vb-[0-9]{4}(-r[0-9]+)?(\.[A-Za-z0-9_-]+)+"/></xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="VpkId">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">VPK ID no Valsts kancelejas organizāciju reģistra (B01): SS-IIII.</xs:documentation></xs:annotation>
|
||||||
|
<xs:restriction base="xs:string"><xs:pattern value="[0-9]{2}-[0-9]{4}"/></xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="Amount">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">Summa euro, kā publicēta (veseli euro vai ar centiem). Negatīva vērtība nozīmē samazinājumu vai līdzekļu izlietojumu finansēšanā.</xs:documentation></xs:annotation>
|
||||||
|
<xs:restriction base="xs:decimal"><xs:fractionDigits value="2"/></xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<!-- ============================================================ vārdnīcas -->
|
||||||
|
<xs:simpleType name="Status">
|
||||||
|
<xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="draft"/> <!-- likumprojekts -->
|
||||||
|
<xs:enumeration value="adopted"/> <!-- pieņemts un izsludināts -->
|
||||||
|
<xs:enumeration value="amended"/> <!-- redakcija pēc grozījumiem -->
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="Flow">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">
|
||||||
|
revenue — valsts ieņēmumi (nodokļi, nodevas), ko administrē resors;
|
||||||
|
resource — resursi izdevumu segšanai konkrētam mērķim (dotācija, pašu ieņēmumi, transferti, ārvalstu palīdzība);
|
||||||
|
expenditure — izdevumi; financing — finansēšana (aizņēmumi, aizdevumi, naudas līdzekļu izmaiņas).
|
||||||
|
</xs:documentation></xs:annotation>
|
||||||
|
<xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="revenue"/>
|
||||||
|
<xs:enumeration value="resource"/>
|
||||||
|
<xs:enumeration value="expenditure"/>
|
||||||
|
<xs:enumeration value="financing"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="Fund">
|
||||||
|
<xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="basic"/> <!-- valsts pamatbudžets -->
|
||||||
|
<xs:enumeration value="special"/> <!-- valsts speciālais budžets -->
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="Block">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">
|
||||||
|
core — valsts pamatfunkciju īstenošana; eu — Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansēto projektu un pasākumu īstenošana.
|
||||||
|
</xs:documentation></xs:annotation>
|
||||||
|
<xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="core"/>
|
||||||
|
<xs:enumeration value="eu"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="Nature">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">
|
||||||
|
appropriation — apropriācija (drīkst izlietot); forecast — prognoze (sagaidāmie ieņēmumi);
|
||||||
|
ceiling — maksimāli pieļaujamais apjoms nākamajiem gadiem (ietvars); commitment — ilgtermiņa saistības;
|
||||||
|
earmarkedGrant — mērķdotācija pašvaldībai.
|
||||||
|
</xs:documentation></xs:annotation>
|
||||||
|
<xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="appropriation"/>
|
||||||
|
<xs:enumeration value="forecast"/>
|
||||||
|
<xs:enumeration value="ceiling"/>
|
||||||
|
<xs:enumeration value="commitment"/>
|
||||||
|
<xs:enumeration value="earmarkedGrant"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="Scheme">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">
|
||||||
|
ekk — izdevumu ekonomiskā klasifikācija (MK 27.12.2005. noteikumi Nr. 1031);
|
||||||
|
revenue — ieņēmumu klasifikācija (MK noteikumi par budžetu ieņēmumu klasifikāciju);
|
||||||
|
financing — finansēšanas klasifikācija (MK 22.11.2005. noteikumi Nr. 875);
|
||||||
|
function — funkcionālā klasifikācija (MK noteikumi Nr. 934, COFOG);
|
||||||
|
commitment — ilgtermiņa saistību veidi (11. pielikums, 10 ciparu kods);
|
||||||
|
law — likuma kopsavilkuma pozīcijas bez klasifikācijas koda (piemēram, KA, PB, IKP).
|
||||||
|
</xs:documentation></xs:annotation>
|
||||||
|
<xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="ekk"/>
|
||||||
|
<xs:enumeration value="revenue"/>
|
||||||
|
<xs:enumeration value="financing"/>
|
||||||
|
<xs:enumeration value="function"/>
|
||||||
|
<xs:enumeration value="commitment"/>
|
||||||
|
<xs:enumeration value="law"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="ActorKind">
|
||||||
|
<xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="resort"/> <!-- ministrija vai cita centrālā valsts iestāde (budžeta resors) -->
|
||||||
|
<xs:enumeration value="institution"/>
|
||||||
|
<xs:enumeration value="municipality"/>
|
||||||
|
<xs:enumeration value="unallocated"/> <!-- „nesadalītie līdzekļi” -->
|
||||||
|
<xs:enumeration value="other"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="PurposeKind">
|
||||||
|
<xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="resort"/>
|
||||||
|
<xs:enumeration value="programme"/>
|
||||||
|
<xs:enumeration value="subprogramme"/>
|
||||||
|
<xs:enumeration value="project"/>
|
||||||
|
<xs:enumeration value="grant"/> <!-- mērķdotācijas mērķis -->
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<!-- ============================================================ ieraksti -->
|
||||||
|
<xs:complexType name="SourceType">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">Avota dokuments. Katrs Allocation un Provision norāda savu avotu (src).</xs:documentation></xs:annotation>
|
||||||
|
<xs:attribute name="id" type="ItemId" use="required"/>
|
||||||
|
<xs:attribute name="kind" use="required">
|
||||||
|
<xs:simpleType><xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="lawText"/><xs:enumeration value="annex"/><xs:enumeration value="form"/>
|
||||||
|
</xs:restriction></xs:simpleType>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="annex" type="xs:positiveInteger"/>
|
||||||
|
<xs:attribute name="title" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="url" type="xs:anyURI" use="required"/>
|
||||||
|
<xs:attribute name="sha256" type="xs:hexBinary"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="ProvisionType">
|
||||||
|
<xs:simpleContent>
|
||||||
|
<xs:extension base="xs:string">
|
||||||
|
<xs:attribute name="id" type="ItemId" use="required"/>
|
||||||
|
<xs:attribute name="chapter" type="xs:string"/>
|
||||||
|
<xs:attribute name="article" type="xs:positiveInteger" use="required"/>
|
||||||
|
<xs:attribute name="part" type="xs:string"/>
|
||||||
|
<xs:attribute name="src" type="ItemRef" use="required"/>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:simpleContent>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="ParameterType">
|
||||||
|
<xs:attribute name="id" type="ItemId" use="required"/>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="code" type="xs:string"/>
|
||||||
|
<xs:attribute name="year" type="xs:gYear"/>
|
||||||
|
<xs:attribute name="value" type="xs:decimal" use="required"/>
|
||||||
|
<xs:attribute name="unit" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="src" type="ItemRef" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="ActorType">
|
||||||
|
<xs:attribute name="id" type="ItemId" use="required"/>
|
||||||
|
<xs:attribute name="kind" type="ActorKind" use="required"/>
|
||||||
|
<xs:attribute name="code" type="xs:string"><xs:annotation><xs:documentation xml:lang="lv">Resora kods budžetā (01–74) vai cits avota kods.</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
<xs:attribute name="vpk" type="VpkId"/>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="PurposeType">
|
||||||
|
<xs:attribute name="id" type="ItemId" use="required"/>
|
||||||
|
<xs:attribute name="kind" type="PurposeKind" use="required"/>
|
||||||
|
<xs:attribute name="code" type="xs:string"><xs:annotation><xs:documentation xml:lang="lv">Programmas vai apakšprogrammas kods (NN.NN.NN) vai projekta kods.</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="parent" type="ItemRef"/>
|
||||||
|
<xs:attribute name="holder" type="ItemRef"/>
|
||||||
|
<xs:attribute name="block" type="Block"/>
|
||||||
|
<xs:attribute name="function" type="xs:string"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="ClassItemType">
|
||||||
|
<xs:attribute name="scheme" type="Scheme" use="required"/>
|
||||||
|
<xs:attribute name="code" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="parent" type="xs:string"/>
|
||||||
|
<xs:attribute name="intraFund" type="xs:boolean" default="false"><xs:annotation><xs:documentation xml:lang="lv">true — transferts viena budžeta veida (fonda) ietvaros; fonda kopsummās (konsolidēti) to neskaita.</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
<xs:attribute name="parentScheme" type="Scheme"><xs:annotation><xs:documentation xml:lang="lv">Vecākkoda shēma, ja tā atšķiras (piemēram, ekk 1000 zem likuma pozīcijas „Uzturēšanas izdevumi”).</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="IndicatorType">
|
||||||
|
<xs:attribute name="id" type="ItemId" use="required"/>
|
||||||
|
<xs:attribute name="purpose" type="ItemRef" use="required"/>
|
||||||
|
<xs:attribute name="name" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="unit" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="year" type="xs:gYear" use="required"/>
|
||||||
|
<xs:attribute name="base" type="xs:decimal"/>
|
||||||
|
<xs:attribute name="target" type="xs:decimal"/>
|
||||||
|
<xs:attribute name="src" type="ItemRef" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="RuleType">
|
||||||
|
<xs:simpleContent>
|
||||||
|
<xs:extension base="xs:string">
|
||||||
|
<xs:attribute name="id" type="ItemId" use="required"/>
|
||||||
|
<xs:attribute name="kind" use="required">
|
||||||
|
<xs:simpleType><xs:restriction base="xs:token">
|
||||||
|
<xs:enumeration value="limit"/><xs:enumeration value="condition"/><xs:enumeration value="permission"/>
|
||||||
|
</xs:restriction></xs:simpleType>
|
||||||
|
</xs:attribute>
|
||||||
|
<xs:attribute name="appliesTo" type="xs:string"/>
|
||||||
|
<xs:attribute name="parameter" type="xs:string"/>
|
||||||
|
<xs:attribute name="value" type="xs:decimal"/>
|
||||||
|
<xs:attribute name="unit" type="xs:string"/>
|
||||||
|
<xs:attribute name="provision" type="ItemRef" use="required"/>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:simpleContent>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="AllocationType">
|
||||||
|
<xs:annotation><xs:documentation xml:lang="lv">Viens naudas fakts. Kopsummas aprēķina, saskaitot ierakstus bez partOf.</xs:documentation></xs:annotation>
|
||||||
|
<xs:attribute name="id" type="ItemId" use="required"/>
|
||||||
|
<xs:attribute name="flow" type="Flow" use="required"/>
|
||||||
|
<xs:attribute name="fund" type="Fund" use="required"/>
|
||||||
|
<xs:attribute name="nature" type="Nature" use="required"/>
|
||||||
|
<xs:attribute name="year" type="xs:gYear" use="required"/>
|
||||||
|
<xs:attribute name="untilEnd" type="xs:boolean" default="false"><xs:annotation><xs:documentation xml:lang="lv">true — summa attiecas uz laiku no „year” līdz projekta beigām (11. pielikuma „tālākā laika posmā”).</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
<xs:attribute name="periodFrom" type="xs:date"/>
|
||||||
|
<xs:attribute name="periodTo" type="xs:date"/>
|
||||||
|
<xs:attribute name="holder" type="ItemRef"><xs:annotation><xs:documentation xml:lang="lv">Actor, kura budžetā ir summa (resors).</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
<xs:attribute name="recipient" type="ItemRef"><xs:annotation><xs:documentation xml:lang="lv">Actor, kas saņem (piemēram, pašvaldība mērķdotācijai).</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
<xs:attribute name="purpose" type="ItemRef"/>
|
||||||
|
<xs:attribute name="block" type="Block"/>
|
||||||
|
<xs:attribute name="commitmentKind" type="xs:string"><xs:annotation><xs:documentation xml:lang="lv">Saistību veida kods (ClassItem scheme="commitment").</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
<xs:attribute name="function" type="xs:string"/>
|
||||||
|
<xs:attribute name="scheme" type="Scheme" use="required"/>
|
||||||
|
<xs:attribute name="code" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="amount" type="Amount" use="required"/>
|
||||||
|
<xs:attribute name="partOf" type="ItemRef"><xs:annotation><xs:documentation xml:lang="lv">„Tai skaitā”: šī summa ir daļa no norādītā ieraksta.</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
<xs:attribute name="src" type="ItemRef" use="required"/>
|
||||||
|
<xs:attribute name="srcRow" type="xs:positiveInteger"><xs:annotation><xs:documentation xml:lang="lv">Rinda avota datnē, lai katru summu var pārbaudīt.</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<!-- ============================================================ sakne -->
|
||||||
|
<xs:element name="Budget">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element name="Source" type="SourceType" maxOccurs="unbounded"/>
|
||||||
|
<xs:element name="Provision" type="ProvisionType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xs:element name="Parameter" type="ParameterType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xs:element name="Actor" type="ActorType" maxOccurs="unbounded"/>
|
||||||
|
<xs:element name="Purpose" type="PurposeType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xs:element name="Indicator" type="IndicatorType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xs:element name="Rule" type="RuleType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xs:element name="ClassItem" type="ClassItemType" maxOccurs="unbounded"/>
|
||||||
|
<xs:element name="Allocation" type="AllocationType" maxOccurs="unbounded"/>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute name="id" type="BudgetId" use="required"/>
|
||||||
|
<xs:attribute name="title" type="xs:string" use="required"/>
|
||||||
|
<xs:attribute name="year" type="xs:gYear" use="required"/>
|
||||||
|
<xs:attribute name="horizonTo" type="xs:gYear" use="required"/>
|
||||||
|
<xs:attribute name="status" type="Status" use="required"/>
|
||||||
|
<xs:attribute name="act" type="xs:anyURI" use="required"/>
|
||||||
|
<xs:attribute name="published" type="xs:string"/>
|
||||||
|
<xs:attribute name="version" type="xs:string"><xs:annotation><xs:documentation xml:lang="lv">Budžeta versija avota sistēmā (piemēram, D200).</xs:documentation></xs:annotation></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
<xs:key name="itemKey"><xs:selector xpath="b:Source|b:Provision|b:Parameter|b:Actor|b:Purpose|b:Indicator|b:Rule|b:Allocation"/><xs:field xpath="@id"/></xs:key>
|
||||||
|
<xs:key name="classKey"><xs:selector xpath="b:ClassItem"/><xs:field xpath="@scheme"/><xs:field xpath="@code"/></xs:key>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
BIN
source/2025/10_PIELIKUMS.DOCX
Normal file
BIN
source/2025/10_PIELIKUMS.DOCX
Normal file
Binary file not shown.
BIN
source/2025/11_PIELIKUMS.XLS
Normal file
BIN
source/2025/11_PIELIKUMS.XLS
Normal file
Binary file not shown.
BIN
source/2025/12_PIELIKUMS.DOCX
Normal file
BIN
source/2025/12_PIELIKUMS.DOCX
Normal file
Binary file not shown.
BIN
source/2025/1_PIELIKUMS.XLS
Normal file
BIN
source/2025/1_PIELIKUMS.XLS
Normal file
Binary file not shown.
BIN
source/2025/2_PIELIKUMS.XLS
Normal file
BIN
source/2025/2_PIELIKUMS.XLS
Normal file
Binary file not shown.
BIN
source/2025/3_PIELIKUMS.XLS
Normal file
BIN
source/2025/3_PIELIKUMS.XLS
Normal file
Binary file not shown.
BIN
source/2025/4_PIELIKUMS.XLS
Normal file
BIN
source/2025/4_PIELIKUMS.XLS
Normal file
Binary file not shown.
BIN
source/2025/5_PIELIKUMS.XLS
Normal file
BIN
source/2025/5_PIELIKUMS.XLS
Normal file
Binary file not shown.
BIN
source/2025/6_PIELIKUMS.DOCX
Normal file
BIN
source/2025/6_PIELIKUMS.DOCX
Normal file
Binary file not shown.
BIN
source/2025/7_PIELIKUMS_G.DOCX
Normal file
BIN
source/2025/7_PIELIKUMS_G.DOCX
Normal file
Binary file not shown.
BIN
source/2025/8_PIELIKUMS.DOCX
Normal file
BIN
source/2025/8_PIELIKUMS.DOCX
Normal file
Binary file not shown.
BIN
source/2025/9_PIELIKUMS.DOCX
Normal file
BIN
source/2025/9_PIELIKUMS.DOCX
Normal file
Binary file not shown.
1302
source/2025/likums.html
Normal file
1302
source/2025/likums.html
Normal file
File diff suppressed because one or more lines are too long
18
source/2025/links.json
Normal file
18
source/2025/links.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"law": "https://likumi.lv/ta/id/357450",
|
||||||
|
"published": "Latvijas Vēstnesis, 2024/248",
|
||||||
|
"annex": {
|
||||||
|
"1": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/1_PIELIKUMS.XLS",
|
||||||
|
"2": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/2_PIELIKUMS.XLS",
|
||||||
|
"3": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/3_PIELIKUMS.XLS",
|
||||||
|
"4": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/4_PIELIKUMS.XLS",
|
||||||
|
"5": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/5_PIELIKUMS.XLS",
|
||||||
|
"6": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/6_PIELIKUMS.DOCX",
|
||||||
|
"7": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/7_PIELIKUMS_G.DOCX",
|
||||||
|
"8": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/8_PIELIKUMS.DOCX",
|
||||||
|
"9": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/9_PIELIKUMS.DOCX",
|
||||||
|
"10": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/10_PIELIKUMS.DOCX",
|
||||||
|
"11": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/11_PIELIKUMS.XLS",
|
||||||
|
"12": "https://likumi.lv/wwwraksti/2024/248/BILDES/L_BUDZETS2025/12_PIELIKUMS.DOCX"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
source/2026/P01.XLSX
Normal file
BIN
source/2026/P01.XLSX
Normal file
Binary file not shown.
BIN
source/2026/P02.XLSX
Normal file
BIN
source/2026/P02.XLSX
Normal file
Binary file not shown.
BIN
source/2026/P03.XLSX
Normal file
BIN
source/2026/P03.XLSX
Normal file
Binary file not shown.
BIN
source/2026/P04.XLSX
Normal file
BIN
source/2026/P04.XLSX
Normal file
Binary file not shown.
BIN
source/2026/P05.XLSX
Normal file
BIN
source/2026/P05.XLSX
Normal file
Binary file not shown.
BIN
source/2026/P06.DOCX
Normal file
BIN
source/2026/P06.DOCX
Normal file
Binary file not shown.
BIN
source/2026/P07.DOCX
Normal file
BIN
source/2026/P07.DOCX
Normal file
Binary file not shown.
BIN
source/2026/P08.DOCX
Normal file
BIN
source/2026/P08.DOCX
Normal file
Binary file not shown.
BIN
source/2026/P09.DOCX
Normal file
BIN
source/2026/P09.DOCX
Normal file
Binary file not shown.
BIN
source/2026/P10.DOCX
Normal file
BIN
source/2026/P10.DOCX
Normal file
Binary file not shown.
BIN
source/2026/P11.XLSX
Normal file
BIN
source/2026/P11.XLSX
Normal file
Binary file not shown.
BIN
source/2026/P12.DOCX
Normal file
BIN
source/2026/P12.DOCX
Normal file
Binary file not shown.
1305
source/2026/likums.html
Normal file
1305
source/2026/likums.html
Normal file
File diff suppressed because one or more lines are too long
19
source/2026/links.json
Normal file
19
source/2026/links.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"law": "https://likumi.lv/ta/id/365272",
|
||||||
|
"published": "Latvijas Vēstnesis, 2025/244",
|
||||||
|
"version": "D200",
|
||||||
|
"annex": {
|
||||||
|
"1": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P01.XLSX",
|
||||||
|
"2": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P02.XLSX",
|
||||||
|
"3": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P03.XLSX",
|
||||||
|
"4": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P04.XLSX",
|
||||||
|
"5": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P05.XLSX",
|
||||||
|
"6": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P06.DOCX",
|
||||||
|
"7": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P07.DOCX",
|
||||||
|
"8": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P08.DOCX",
|
||||||
|
"9": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P09.DOCX",
|
||||||
|
"10": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P10.DOCX",
|
||||||
|
"11": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P11.XLSX",
|
||||||
|
"12": "https://www.likumi.lv/wwwraksti/2025/244/BILDES/L_BUDZETS2026/P12.DOCX"
|
||||||
|
}
|
||||||
|
}
|
||||||
822
source/klasifikacijas/122159.html
Normal file
822
source/klasifikacijas/122159.html
Normal file
File diff suppressed because one or more lines are too long
827
source/klasifikacijas/124831.html
Normal file
827
source/klasifikacijas/124831.html
Normal file
File diff suppressed because one or more lines are too long
827
source/klasifikacijas/124833.html
Normal file
827
source/klasifikacijas/124833.html
Normal file
File diff suppressed because one or more lines are too long
662
source/kodi/codepairs.json
Normal file
662
source/kodi/codepairs.json
Normal file
@@ -0,0 +1,662 @@
|
|||||||
|
{
|
||||||
|
"KA Valsts budžeta ieņēmumi (PA + SA)": [
|
||||||
|
"KA"
|
||||||
|
],
|
||||||
|
"Valsts pamatbudžeta ieņēmumi (bruto)": [
|
||||||
|
"A000"
|
||||||
|
],
|
||||||
|
"Nodokļu ieņēmumi": [
|
||||||
|
"A100"
|
||||||
|
],
|
||||||
|
"Ienākuma nodokļi": [
|
||||||
|
"A110"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no iedzīvotāju ienākuma nodokļa": [
|
||||||
|
"01100"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no uzņēmumu ienākuma nodokļa": [
|
||||||
|
"01200"
|
||||||
|
],
|
||||||
|
"Uzņēmumu ienākuma nodoklis": [
|
||||||
|
"01210"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no solidaritātes iemaksām": [
|
||||||
|
"01400"
|
||||||
|
],
|
||||||
|
"Sociālās apdrošināšanas iemaksas – kopā": [
|
||||||
|
"A120"
|
||||||
|
],
|
||||||
|
"Ieņēmumi valsts pamatbudžetā no valsts sociālās apdrošināšanas obligāto iemaksu sadales veselības aprūpes finansēšanai": [
|
||||||
|
"02500"
|
||||||
|
],
|
||||||
|
"Nodokļi par pakalpojumiem un precēm": [
|
||||||
|
"A150"
|
||||||
|
],
|
||||||
|
"Pievienotās vērtības nodoklis": [
|
||||||
|
"A151"
|
||||||
|
],
|
||||||
|
"Akcīzes nodoklis": [
|
||||||
|
"A152"
|
||||||
|
],
|
||||||
|
"Nodokļi atsevišķām precēm un pakalpojumu veidiem": [
|
||||||
|
"A154"
|
||||||
|
],
|
||||||
|
"Azartspēļu nodoklis": [
|
||||||
|
"05410"
|
||||||
|
],
|
||||||
|
"Izložu nodoklis": [
|
||||||
|
"05420"
|
||||||
|
],
|
||||||
|
"Elektroenerģijas nodoklis": [
|
||||||
|
"05440"
|
||||||
|
],
|
||||||
|
"Transportlīdzekļa ekspluatācijas nodoklis": [
|
||||||
|
"05450"
|
||||||
|
],
|
||||||
|
"Uzņēmumu vieglo transportlīdzekļu nodoklis": [
|
||||||
|
"05460"
|
||||||
|
],
|
||||||
|
"Nodokļi un maksājumi par tiesībām lietot atsevišķas preces": [
|
||||||
|
"A155"
|
||||||
|
],
|
||||||
|
"Dabas resursu nodoklis": [
|
||||||
|
"05530"
|
||||||
|
],
|
||||||
|
"Muitas nodoklis": [
|
||||||
|
"A160"
|
||||||
|
],
|
||||||
|
"Nenodokļu ieņēmumi": [
|
||||||
|
"A200"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no maksas pakalpojumiem un citi pašu ieņēmumi – kopā": [
|
||||||
|
"A300"
|
||||||
|
],
|
||||||
|
"Ārvalstu finanšu palīdzība": [
|
||||||
|
"A400"
|
||||||
|
],
|
||||||
|
"Transferti": [
|
||||||
|
"A500"
|
||||||
|
],
|
||||||
|
"Valsts pamatbudžetā saņemtie transferti no valsts speciālā budžeta": [
|
||||||
|
"18400"
|
||||||
|
],
|
||||||
|
"Pašvaldību budžetu transferti": [
|
||||||
|
"A520"
|
||||||
|
],
|
||||||
|
"No valsts budžeta daļēji finansēto atvasināto publisko personu un budžeta nefinansēto iestāžu transferti": [
|
||||||
|
"A530"
|
||||||
|
],
|
||||||
|
"mīnus transferts no valsts speciālā budžeta": [
|
||||||
|
"PAT"
|
||||||
|
],
|
||||||
|
"PA Valsts pamatbudžeta ieņēmumi (neto)": [
|
||||||
|
"PA"
|
||||||
|
],
|
||||||
|
"Valsts speciālā budžeta ieņēmumi (bruto)": [
|
||||||
|
"A000"
|
||||||
|
],
|
||||||
|
"mīnus transferts no valsts pamatbudžeta": [
|
||||||
|
"SAT"
|
||||||
|
],
|
||||||
|
"SA Valsts speciālā budžeta ieņēmumi (neto)": [
|
||||||
|
"SA"
|
||||||
|
],
|
||||||
|
"KB Valsts budžeta izdevumi (KB1+KB2)": [
|
||||||
|
"KB"
|
||||||
|
],
|
||||||
|
"KB1 Valsts budžeta uzturēšanas izdevumi (PB1+SB1)": [
|
||||||
|
"KB1"
|
||||||
|
],
|
||||||
|
"KB2 Valsts budžeta kapitālie izdevumi (PB2+SB2)": [
|
||||||
|
"KB2"
|
||||||
|
],
|
||||||
|
"Valsts budžeta finansiālā bilance (KA-KB)": [
|
||||||
|
"K1"
|
||||||
|
],
|
||||||
|
"Finansēšana": [
|
||||||
|
"F00000000",
|
||||||
|
"KF",
|
||||||
|
"PF",
|
||||||
|
"SF"
|
||||||
|
],
|
||||||
|
"Aizņēmumi": [
|
||||||
|
"KF40020000",
|
||||||
|
"PF40020000"
|
||||||
|
],
|
||||||
|
"Aizdevumi": [
|
||||||
|
"KF40010000",
|
||||||
|
"PF40010000"
|
||||||
|
],
|
||||||
|
"Naudas līdzekļi": [
|
||||||
|
"F21010000",
|
||||||
|
"KF21010000"
|
||||||
|
],
|
||||||
|
"Maksas pakalpojumu un citu pašu ieņēmumu naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)": [
|
||||||
|
"F210100001"
|
||||||
|
],
|
||||||
|
"Ārvalstu finanšu palīdzības naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)": [
|
||||||
|
"F210100002"
|
||||||
|
],
|
||||||
|
"Valsts speciālā budžeta naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)": [
|
||||||
|
"F210100003"
|
||||||
|
],
|
||||||
|
"Naudas līdzekļu aizdevumiem atlikumu izmaiņas palielinājums (-) vai samazinājums (+)": [
|
||||||
|
"F210100005"
|
||||||
|
],
|
||||||
|
"Akcijas un cita līdzdalība pašu kapitālā": [
|
||||||
|
"F50010000"
|
||||||
|
],
|
||||||
|
"Valsts pamatbudžeta izdevumi (bruto)": [
|
||||||
|
"B000"
|
||||||
|
],
|
||||||
|
"mīnus transferts valsts speciālajam budžetam": [
|
||||||
|
"PB1T",
|
||||||
|
"PB2T",
|
||||||
|
"PBT"
|
||||||
|
],
|
||||||
|
"PB Valsts pamatbudžeta izdevumi (neto)": [
|
||||||
|
"PB"
|
||||||
|
],
|
||||||
|
"Valsts pamatbudžeta uzturēšanas izdevumi (bruto)": [
|
||||||
|
"B100"
|
||||||
|
],
|
||||||
|
"PB1 Valsts pamatbudžeta uzturēšanas izdevumi (neto)": [
|
||||||
|
"PB1"
|
||||||
|
],
|
||||||
|
"Valsts pamatbudžeta kapitālie izdevumi (bruto)": [
|
||||||
|
"B200"
|
||||||
|
],
|
||||||
|
"PB2 Valsts pamatbudžeta kapitālie izdevumi (neto)": [
|
||||||
|
"PB2"
|
||||||
|
],
|
||||||
|
"Valsts pamatbudžeta finansiālā bilance": [
|
||||||
|
"P1"
|
||||||
|
],
|
||||||
|
"Valsts speciālā budžeta izdevumi (bruto)": [
|
||||||
|
"B000"
|
||||||
|
],
|
||||||
|
"mīnus transferts valsts pamatbudžetam": [
|
||||||
|
"SB1T",
|
||||||
|
"SBT"
|
||||||
|
],
|
||||||
|
"SB Valsts speciālā budžeta izdevumi (neto)": [
|
||||||
|
"SB"
|
||||||
|
],
|
||||||
|
"Valsts speciālā budžeta uzturēšanas izdevumi (bruto)": [
|
||||||
|
"B100"
|
||||||
|
],
|
||||||
|
"SB1 Valsts speciālā budžeta uzturēšanas izdevumi (neto)": [
|
||||||
|
"SB1"
|
||||||
|
],
|
||||||
|
"Valsts speciālā budžeta kapitālie izdevumi (bruto)": [
|
||||||
|
"B200"
|
||||||
|
],
|
||||||
|
"SB2 Valsts speciālā budžeta kapitālie izdevumi (neto)": [
|
||||||
|
"SB2"
|
||||||
|
],
|
||||||
|
"Valsts speciālā budžeta finansiālā bilance": [
|
||||||
|
"S1"
|
||||||
|
],
|
||||||
|
"Valsts budžeta ieņēmumi": [
|
||||||
|
"IKPKA"
|
||||||
|
],
|
||||||
|
"Valsts budžeta izdevumi": [
|
||||||
|
"IKPKB"
|
||||||
|
],
|
||||||
|
"Valsts budžeta finansiālā bilance": [
|
||||||
|
"IKPK1"
|
||||||
|
],
|
||||||
|
"IKP milj. euro": [
|
||||||
|
"IKP"
|
||||||
|
],
|
||||||
|
"Ieņēmumi – kopā": [
|
||||||
|
"A000"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no uzņēmējdarbības un īpašuma": [
|
||||||
|
"A210"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no dividendēm (ieņēmumi no valsts (pašvaldību) kapitāla izmantošanas)": [
|
||||||
|
"A213"
|
||||||
|
],
|
||||||
|
"Procentu ieņēmumi": [
|
||||||
|
"A214"
|
||||||
|
],
|
||||||
|
"Procentu ieņēmumi par aizdevumiem": [
|
||||||
|
"08400"
|
||||||
|
],
|
||||||
|
"Procentu ieņēmumi par depozītiem, kontu atlikumiem, valsts parāda vērtspapīriem un atlikto maksājumu": [
|
||||||
|
"08600"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no atvasināto finanšu instrumentu rezultāta": [
|
||||||
|
"A215"
|
||||||
|
],
|
||||||
|
"Pārējie finanšu ieņēmumi": [
|
||||||
|
"A219"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no Latvijai piešķirto emisijas kvotu izsolīšanas un darījumiem ar gada emisijas vienībām un Latvijai piešķirtajām emisijas kvotām": [
|
||||||
|
"08930"
|
||||||
|
],
|
||||||
|
"Valsts (pašvaldību) nodevas un kancelejas nodevas": [
|
||||||
|
"A220"
|
||||||
|
],
|
||||||
|
"Valsts nodevas par valsts sniegto nodrošinājumu un juridiskajiem un citiem pakalpojumiem": [
|
||||||
|
"09100"
|
||||||
|
],
|
||||||
|
"Valsts nodevas par speciālu atļauju (licenču) izsniegšanu un profesionālās kvalifikācijas atbilstības dokumentu reģistrāciju": [
|
||||||
|
"09200"
|
||||||
|
],
|
||||||
|
"Speciāliem mērķiem paredzētās valsts nodevas": [
|
||||||
|
"09300"
|
||||||
|
],
|
||||||
|
"Izložu un azartspēļu nodeva": [
|
||||||
|
"09340"
|
||||||
|
],
|
||||||
|
"Uzņēmējdarbības riska valsts nodeva": [
|
||||||
|
"09350"
|
||||||
|
],
|
||||||
|
"Numerācijas lietošanas tiesību ikgadēja valsts nodeva": [
|
||||||
|
"09370"
|
||||||
|
],
|
||||||
|
"Pārējās speciāliem mērķiem paredzētās valsts nodevas": [
|
||||||
|
"09390"
|
||||||
|
],
|
||||||
|
"Finanšu stabilitātes nodeva": [
|
||||||
|
"09391"
|
||||||
|
],
|
||||||
|
"Autoceļu lietošanas nodeva": [
|
||||||
|
"09392"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par Ieroču aprites likumā paredzētā kontrolšāviena ar vītņstobra šaujamieroci izdarīšanu, par šaujamieroča un lielas enerģijas pneimatiskā ieroča dezaktivēšanas apliecinājuma izsniegšanu un par salūtieroča (akustiskā ieroča) apliecinājuma izsniegšanu": [
|
||||||
|
"09393"
|
||||||
|
],
|
||||||
|
"Speciāliem mērķiem paredzētās valsts nodevas, kas nav minētas citos koda 9.3.9.0. apakškodos": [
|
||||||
|
"09399"
|
||||||
|
],
|
||||||
|
"Pārējās nodevas, kas ieskaitītas valsts budžetā": [
|
||||||
|
"09900"
|
||||||
|
],
|
||||||
|
"Naudas sodi un sankcijas": [
|
||||||
|
"A230"
|
||||||
|
],
|
||||||
|
"Pārējie nenodokļu ieņēmumi – kopā": [
|
||||||
|
"A240"
|
||||||
|
],
|
||||||
|
"Ārlietu ministrija": [
|
||||||
|
"11"
|
||||||
|
],
|
||||||
|
"Nodeva par konsulāro amatpersonu sniegtajiem pakalpojumiem": [
|
||||||
|
"09191"
|
||||||
|
],
|
||||||
|
"Nodeva par speciālu atļauju (licenču) izsniegšanu stratēģiskas nozīmes preču darījumiem": [
|
||||||
|
"09216"
|
||||||
|
],
|
||||||
|
"Ekonomikas ministrija": [
|
||||||
|
"12"
|
||||||
|
],
|
||||||
|
"Pārējās nodevas par speciālu atļauju (licenču) izsniegšanu atsevišķiem komercdarbības veidiem": [
|
||||||
|
"09219"
|
||||||
|
],
|
||||||
|
"Pārējās valsts nodevas par speciālu atļauju (licenču) izsniegšanu vai profesionālās kvalifikācijas atbilstības dokumentu reģistrāciju": [
|
||||||
|
"09290"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par reģistrācijas darbībām būvkomersantu reģistrā": [
|
||||||
|
"09292"
|
||||||
|
],
|
||||||
|
"Valsts nodevas par speciālu atļauju (licenču) izsniegšanu vai profesionālās kvalifikācijas atbilstības dokumentu reģistrāciju, kas nav minētas citos koda 9.2.9.0. apakškodos": [
|
||||||
|
"09299"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par naftas produktu drošības rezervju uzturēšanu": [
|
||||||
|
"09380"
|
||||||
|
],
|
||||||
|
"Pārējie dažādi nenodokļu ieņēmumi, kas nav iepriekš klasificēti šajā klasifikācijā": [
|
||||||
|
"12399"
|
||||||
|
],
|
||||||
|
"Finanšu ministrija": [
|
||||||
|
"13"
|
||||||
|
],
|
||||||
|
"Nodeva par muitas pakalpojumiem": [
|
||||||
|
"09192"
|
||||||
|
],
|
||||||
|
"Nodeva par speciālu atļauju (licenču) izsniegšanu komercdarbībai ar akcīzes precēm": [
|
||||||
|
"09214"
|
||||||
|
],
|
||||||
|
"Preču un pakalpojumu loteriju organizēšanas nodeva": [
|
||||||
|
"09260"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts ieņēmumu dienests, izņemot naudas sodus, ko uzliek Valsts ieņēmumu dienesta Muitas pārvalde": [
|
||||||
|
"10121"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts ieņēmumu dienesta Muitas pārvalde": [
|
||||||
|
"10123"
|
||||||
|
],
|
||||||
|
"Soda sankcijas par vispārējiem nodokļu maksāšanas pārkāpumiem": [
|
||||||
|
"10300"
|
||||||
|
],
|
||||||
|
"Citi ieņēmumi no valstij piekritīgās mantas realizācijas": [
|
||||||
|
"12190"
|
||||||
|
],
|
||||||
|
"Iekšlietu ministrija": [
|
||||||
|
"14"
|
||||||
|
],
|
||||||
|
"Nodeva par jebkāda veida ieroča atļaujas, atkārtotas atļaujas, atļaujas dublikāta, Eiropas šaujamieroču apliecības izsniegšanu, ieroča atļaujas un Eiropas šaujamieroču apliecības derīguma termiņa pagarināšanu": [
|
||||||
|
"09131"
|
||||||
|
],
|
||||||
|
"Nodeva par iekšējās drošības dienesta reģistrācijas apliecības, tās dublikāta un atkārtotas apliecības izsniegšanu": [
|
||||||
|
"09138"
|
||||||
|
],
|
||||||
|
"Nodeva par pasu izsniegšanu": [
|
||||||
|
"09181"
|
||||||
|
],
|
||||||
|
"Nodeva par personas apliecību izsniegšanu": [
|
||||||
|
"09182"
|
||||||
|
],
|
||||||
|
"Nodeva par informācijas saņemšanu no Fizisko personu reģistra": [
|
||||||
|
"09183"
|
||||||
|
],
|
||||||
|
"Nodeva par vīzas, uzturēšanās atļaujas vai Eiropas Savienības pastāvīgā iedzīvotāja statusa Latvijas Republikā pieprasīšanai nepieciešamo dokumentu izskatīšanu un ar to saistītajiem pakalpojumiem": [
|
||||||
|
"09185"
|
||||||
|
],
|
||||||
|
"Nodeva par ziņu par deklarēto dzīvesvietu reģistrāciju": [
|
||||||
|
"09186"
|
||||||
|
],
|
||||||
|
"Nodeva par naturalizācijas iesniegumu iesniegšanu": [
|
||||||
|
"09196"
|
||||||
|
],
|
||||||
|
"Nodeva par atteikšanās no Latvijas pilsonības un pilsonības atjaunošanas dokumentēšanu": [
|
||||||
|
"09197"
|
||||||
|
],
|
||||||
|
"Nodevas par kvalifikācijas pārbaudījumu kārtošanu un sertifikātu izsniegšanu apsardzes, ieroču un munīcijas aprites kārtības, pirotehnikas, spridzināšanas un detektīvdarbības jomā": [
|
||||||
|
"09220"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts policija": [
|
||||||
|
"10112"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts ugunsdzēsības un glābšanas dienests": [
|
||||||
|
"10115"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts robežsardze": [
|
||||||
|
"10117"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts policija par pārkāpumiem ceļu satiksmē, kas fiksēti ar Valsts policijai piederošajiem tehniskajiem līdzekļiem": [
|
||||||
|
"10151"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts policija par pārkāpumiem ceļu satiksmē, kas fiksēti ar komersanta tehniskajiem līdzekļiem": [
|
||||||
|
"10152"
|
||||||
|
],
|
||||||
|
"Pārējie naudas sodi, ko uzliek Valsts policija par pārkāpumiem ceļu satiksmē": [
|
||||||
|
"10153"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Pilsonības un migrācijas lietu pārvalde": [
|
||||||
|
"10196"
|
||||||
|
],
|
||||||
|
"Izglītības un zinātnes ministrija": [
|
||||||
|
"15"
|
||||||
|
],
|
||||||
|
"Nodeva par valsts valodas prasmes atestāciju profesionālo un amata pienākumu veikšanai": [
|
||||||
|
"09230"
|
||||||
|
],
|
||||||
|
"Zemkopības ministrija": [
|
||||||
|
"16"
|
||||||
|
],
|
||||||
|
"Citas nodevas par juridiskajiem un citiem pakalpojumiem": [
|
||||||
|
"09199"
|
||||||
|
],
|
||||||
|
"Nodeva par dokumentu izsniegšanu, kas attiecas uz medību saimniecības izmantošanu, mednieku un medību vadītāju eksāmeniem, medījamo dzīvnieku nodarīto zaudējumu aprēķinu un medību trofeju izvešanu no Latvijas": [
|
||||||
|
"09250"
|
||||||
|
],
|
||||||
|
"Naudas sodi par zivju resursiem nodarītajiem zaudējumiem": [
|
||||||
|
"10131"
|
||||||
|
],
|
||||||
|
"Naudas sodi par meža resursiem nodarītajiem kaitējumiem": [
|
||||||
|
"10132"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Pārtikas un veterinārais dienests": [
|
||||||
|
"10193"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no ūdenstilpju un zvejas tiesību nomas un zvejas tiesību rūpnieciskas izmantošanas (licences)": [
|
||||||
|
"12230"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no ūdenstilpju un zvejas tiesību nomas un zvejas tiesību nerūpnieciskas izmantošanas (makšķerēšanas kartes)": [
|
||||||
|
"12240"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no zaudējumu atlīdzības par meža resursiem nodarītiem kaitējumiem": [
|
||||||
|
"12260"
|
||||||
|
],
|
||||||
|
"Ieņēmumi no zaudējumu atlīdzības par zivju resursiem nodarītiem zaudējumiem": [
|
||||||
|
"12270"
|
||||||
|
],
|
||||||
|
"Satiksmes ministrija": [
|
||||||
|
"17"
|
||||||
|
],
|
||||||
|
"Labklājības ministrija": [
|
||||||
|
"18"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts darba inspekcija": [
|
||||||
|
"10198"
|
||||||
|
],
|
||||||
|
"Tieslietu ministrija": [
|
||||||
|
"19"
|
||||||
|
],
|
||||||
|
"Nodeva par darbību veikšanu tiesu iestādēs": [
|
||||||
|
"09112"
|
||||||
|
],
|
||||||
|
"Nodeva par izpildu dokumentu iesniegšanu": [
|
||||||
|
"09113"
|
||||||
|
],
|
||||||
|
"Nodeva par darbību veikšanu administratīvajā tiesā": [
|
||||||
|
"09114"
|
||||||
|
],
|
||||||
|
"Nodeva par darbību veikšanu Uzņēmumu reģistrā": [
|
||||||
|
"09132"
|
||||||
|
],
|
||||||
|
"Kredītinformācijas biroja nodeva un nodeva par licences izsniegšanu rīcības kodeksa pārraudzības institūcijai": [
|
||||||
|
"09136"
|
||||||
|
],
|
||||||
|
"Kancelejas nodeva par zemesgrāmatas veiktajām darbībām attiecībā uz mantojumu un dāvinājumu": [
|
||||||
|
"09171"
|
||||||
|
],
|
||||||
|
"Kancelejas nodeva par zemesgrāmatas veiktajām darbībām, kas iekasēta no fiziskām personām, izņemot mantojumus un dāvinājumus": [
|
||||||
|
"09172"
|
||||||
|
],
|
||||||
|
"Kancelejas nodeva par zemesgrāmatas veiktajām darbībām, kas iekasēta no juridiskām personām, izņemot mantojumus un dāvinājumus": [
|
||||||
|
"09173"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek tiesu iestādes": [
|
||||||
|
"10111"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Datu valsts inspekcija": [
|
||||||
|
"10192"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Valsts valodas centrs": [
|
||||||
|
"10195"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek Maksātnespējas kontroles dienests": [
|
||||||
|
"10197"
|
||||||
|
],
|
||||||
|
"Naudas sodi, ko uzliek pārējās iestādes, kas nav klasificētas iepriekšminētajos kodos": [
|
||||||
|
"10199"
|
||||||
|
],
|
||||||
|
"Klimata un enerģētikas ministrija": [
|
||||||
|
"20"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par ūdens resursu lietošanas atļauju": [
|
||||||
|
"09212"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par atkritumu savākšanas, pārvadāšanas, pārkraušanas, šķirošanas un uzglabāšanas atļauju": [
|
||||||
|
"09217"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par atļauju A un B kategorijas piesārņojošai darbībai": [
|
||||||
|
"09218"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par paredzētās darbības ietekmes uz vidi sākotnējo izvērtējumu": [
|
||||||
|
"09291"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par zemes dzīļu izmantošanas licenci un atradnes pasi": [
|
||||||
|
"09293"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par speciālās atļaujas (licences) vai atļaujas izsniegšanu darbībām ar jonizējošā starojuma avotiem": [
|
||||||
|
"09294"
|
||||||
|
],
|
||||||
|
"Viedās administrācijas un reģionālās attīstības ministrija": [
|
||||||
|
"21"
|
||||||
|
],
|
||||||
|
"Kultūras ministrija": [
|
||||||
|
"22"
|
||||||
|
],
|
||||||
|
"Nodeva par filmu producenta reģistrāciju": [
|
||||||
|
"09133"
|
||||||
|
],
|
||||||
|
"Veselības ministrija": [
|
||||||
|
"29"
|
||||||
|
],
|
||||||
|
"Nodeva par speciālu atļauju (licenču) izsniegšanu farmaceitiskajai darbībai": [
|
||||||
|
"09215"
|
||||||
|
],
|
||||||
|
"Radio un televīzijas regulators": [
|
||||||
|
"47"
|
||||||
|
],
|
||||||
|
"Valsts nodeva par apraides atļaujas izsniegšanu un pamatnosacījumu pārskatīšanu, retranslācijas atļaujas izsniegšanu un pārreģistrāciju, kā arī apraides tiesību īstenošanas uzraudzību": [
|
||||||
|
"09213"
|
||||||
|
],
|
||||||
|
"Valsts budžeta transferti": [
|
||||||
|
"A510"
|
||||||
|
],
|
||||||
|
"Valsts sociālās apdrošināšanas speciālajā budžetā": [
|
||||||
|
"A120"
|
||||||
|
],
|
||||||
|
"Valsts pamatbudžeta nenodokļu ieņēmumos iemaksājamā uzņēmējdarbības riska valsts nodeva": [
|
||||||
|
"09350"
|
||||||
|
],
|
||||||
|
"Izdevumi – kopā": [
|
||||||
|
"B000"
|
||||||
|
],
|
||||||
|
"Uzturēšanas izdevumi": [
|
||||||
|
"B100"
|
||||||
|
],
|
||||||
|
"Kārtējie izdevumi": [
|
||||||
|
"B110"
|
||||||
|
],
|
||||||
|
"Atlīdzība": [
|
||||||
|
"1000"
|
||||||
|
],
|
||||||
|
"Preces un pakalpojumi": [
|
||||||
|
"2000"
|
||||||
|
],
|
||||||
|
"Subsīdijas, dotācijas, sociālie maksājumi un kompensācijas": [
|
||||||
|
"B130"
|
||||||
|
],
|
||||||
|
"Subsīdijas un dotācijas": [
|
||||||
|
"3000"
|
||||||
|
],
|
||||||
|
"Sociāla rakstura maksājumi un kompensācijas": [
|
||||||
|
"6000"
|
||||||
|
],
|
||||||
|
"Kārtējie maksājumi Eiropas Savienības budžetā un starptautiskā sadarbība": [
|
||||||
|
"B140"
|
||||||
|
],
|
||||||
|
"Starptautiskā sadarbība": [
|
||||||
|
"7700"
|
||||||
|
],
|
||||||
|
"Transferti viena budžeta veida ietvaros un uzturēšanas izdevumu transferti starp budžeta veidiem": [
|
||||||
|
"B150"
|
||||||
|
],
|
||||||
|
"Valsts budžeta transferti un uzturēšanas izdevumu transferti": [
|
||||||
|
"7100"
|
||||||
|
],
|
||||||
|
"Valsts budžeta uzturēšanas izdevumu transferti no valsts speciālā budžeta uz valsts pamatbudžetu": [
|
||||||
|
"7110"
|
||||||
|
],
|
||||||
|
"Pārējie valsts budžeta uzturēšanas izdevumu transferti citiem budžetiem": [
|
||||||
|
"7400"
|
||||||
|
],
|
||||||
|
"Pārējie valsts budžeta uzturēšanas izdevumu transferti pašvaldībām": [
|
||||||
|
"7460"
|
||||||
|
],
|
||||||
|
"Pārējie valsts budžeta uzturēšanas izdevumu transferti valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm": [
|
||||||
|
"7470"
|
||||||
|
],
|
||||||
|
"Kapitālie izdevumi": [
|
||||||
|
"B200"
|
||||||
|
],
|
||||||
|
"Pamatkapitāla veidošana": [
|
||||||
|
"B210"
|
||||||
|
],
|
||||||
|
"Finansiālā bilance": [
|
||||||
|
"S1"
|
||||||
|
],
|
||||||
|
"Sociālās apdrošināšanas iemaksas": [
|
||||||
|
"02000"
|
||||||
|
],
|
||||||
|
"Brīvprātīgās sociālās apdrošināšanas iemaksas": [
|
||||||
|
"02100"
|
||||||
|
],
|
||||||
|
"Brīvprātīgās sociālās apdrošināšanas iemaksas valsts pensiju apdrošināšanai": [
|
||||||
|
"02110"
|
||||||
|
],
|
||||||
|
"Brīvprātīgās sociālās apdrošināšanas iemaksas invaliditātes, maternitātes, slimības un vecāku apdrošināšanai": [
|
||||||
|
"02120"
|
||||||
|
],
|
||||||
|
"Brīvprātīgās sociālās apdrošināšanas iemaksas sociālajai apdrošināšanai bezdarba gadījumiem": [
|
||||||
|
"02130"
|
||||||
|
],
|
||||||
|
"Brīvprātīgās sociālās apdrošināšanas iemaksas sociālajai apdrošināšanai pret nelaimes gadījumiem darbā un arodslimībām": [
|
||||||
|
"02140"
|
||||||
|
],
|
||||||
|
"Ieņēmumi valsts speciālajā budžetā no valsts sociālās apdrošināšanas obligāto iemaksu sadales": [
|
||||||
|
"02400"
|
||||||
|
],
|
||||||
|
"Valsts sociālās apdrošināšanas obligātās iemaksas valsts pensiju apdrošināšanai": [
|
||||||
|
"02410"
|
||||||
|
],
|
||||||
|
"Valsts sociālās apdrošināšanas obligātās iemaksas sociālajai apdrošināšanai bezdarba gadījumiem": [
|
||||||
|
"02420"
|
||||||
|
],
|
||||||
|
"Valsts sociālās apdrošināšanas obligātās iemaksas sociālajai apdrošināšanai pret nelaimes gadījumiem darbā un arodslimībām": [
|
||||||
|
"02430"
|
||||||
|
],
|
||||||
|
"Valsts sociālās apdrošināšanas obligātās iemaksas invaliditātes, maternitātes, slimības un vecāku apdrošināšanai": [
|
||||||
|
"02440"
|
||||||
|
],
|
||||||
|
"Valsts speciālajā budžetā saņemtie transferti no valsts pamatbudžeta": [
|
||||||
|
"18200"
|
||||||
|
],
|
||||||
|
"Valsts speciālā budžeta savstarpējie transferti": [
|
||||||
|
"18500"
|
||||||
|
],
|
||||||
|
"Valsts sociālās apdrošināšanas speciālā budžeta transferti": [
|
||||||
|
"18520"
|
||||||
|
],
|
||||||
|
"No nodarbinātības speciālā budžeta valsts pensiju apdrošināšanai": [
|
||||||
|
"18521"
|
||||||
|
],
|
||||||
|
"No darba negadījumu speciālā budžeta valsts pensiju apdrošināšanai": [
|
||||||
|
"18522"
|
||||||
|
],
|
||||||
|
"No invaliditātes, maternitātes un slimības speciālā budžeta valsts pensiju apdrošināšanai": [
|
||||||
|
"18523"
|
||||||
|
],
|
||||||
|
"Valsts budžeta transferti no valsts speciālā budžeta uz valsts speciālo budžetu": [
|
||||||
|
"7140"
|
||||||
|
],
|
||||||
|
"No darba negadījumu speciālā budžeta sociālajai apdrošināšanai bezdarba gadījumam": [
|
||||||
|
"18524"
|
||||||
|
],
|
||||||
|
"No invaliditātes, maternitātes un slimības speciālā budžeta sociālajai apdrošināšanai bezdarba gadījumam": [
|
||||||
|
"18525"
|
||||||
|
],
|
||||||
|
"Saņemtie transferti viena speciālā budžeta veida ietvaros": [
|
||||||
|
"18530"
|
||||||
|
],
|
||||||
|
"No valsts pensiju speciālā budžeta ieskaitītie līdzekļi Valsts sociālās apdrošināšanas aģentūrai": [
|
||||||
|
"18526"
|
||||||
|
],
|
||||||
|
"No nodarbinātības speciālā budžeta ieskaitītie līdzekļi Valsts sociālās apdrošināšanas aģentūrai": [
|
||||||
|
"18527"
|
||||||
|
],
|
||||||
|
"No darba negadījumu speciālā budžeta ieskaitītie līdzekļi Valsts sociālās apdrošināšanas aģentūrai": [
|
||||||
|
"18528"
|
||||||
|
],
|
||||||
|
"No invaliditātes, maternitātes un slimības speciālā budžeta ieskaitītie līdzekļi Valsts sociālās apdrošināšanas aģentūrai": [
|
||||||
|
"18529"
|
||||||
|
]
|
||||||
|
}
|
||||||
1
source/kodi/klasdict.json
Normal file
1
source/kodi/klasdict.json
Normal file
File diff suppressed because one or more lines are too long
1066
source/kodi/vk_blocks.tsv
Normal file
1066
source/kodi/vk_blocks.tsv
Normal file
File diff suppressed because it is too large
Load Diff
559
source/kodi/vk_codes.tsv
Normal file
559
source/kodi/vk_codes.tsv
Normal file
@@ -0,0 +1,559 @@
|
|||||||
|
Ieņēmumi 02000
|
||||||
|
Ieņēmumi 02100
|
||||||
|
Ieņēmumi 02110
|
||||||
|
Ieņēmumi 02110 Brīvprātīgās sociālās apdrošināšanas iemaksas valsts pensiju apdrošināšanai
|
||||||
|
Ieņēmumi 02120
|
||||||
|
Ieņēmumi 02130
|
||||||
|
Ieņēmumi 02400
|
||||||
|
Ieņēmumi 02410
|
||||||
|
Ieņēmumi 02410 Valsts sociālās apdrošināšanas obligātās iemaksas valsts pensiju apdrošināšanai
|
||||||
|
Ieņēmumi 02420
|
||||||
|
Ieņēmumi 02420 Valsts sociālās apdrošināšanas obligātās iemaksas sociālajai apdrošināšanai bezdarba gadījumiem
|
||||||
|
Ieņēmumi 02430
|
||||||
|
Ieņēmumi 02430 Valsts sociālās apdrošināšanas obligātās iemaksas sociālajai apdrošināšanai pret nelaimes gadījumiem darbā un arodslimībām
|
||||||
|
Ieņēmumi 02440
|
||||||
|
Ieņēmumi 02440 Valsts sociālās apdrošināšanas obligātās iemaksas invaliditātes, maternitātes, slimības un vecāku apdrošināšanai
|
||||||
|
Ieņēmumi 04000
|
||||||
|
Ieņēmumi 04100
|
||||||
|
Ieņēmumi 04110
|
||||||
|
Ieņēmumi 04111
|
||||||
|
Ieņēmumi 05000
|
||||||
|
Ieņēmumi 05500
|
||||||
|
Ieņēmumi 05530
|
||||||
|
Ieņēmumi 09000
|
||||||
|
Ieņēmumi 09100
|
||||||
|
Ieņēmumi 09110
|
||||||
|
Ieņēmumi 09112
|
||||||
|
Ieņēmumi 09113
|
||||||
|
Ieņēmumi 09170
|
||||||
|
Ieņēmumi 09173
|
||||||
|
Ieņēmumi 09190
|
||||||
|
Ieņēmumi 09199
|
||||||
|
Ieņēmumi 1.9.apakšgrupa
|
||||||
|
Izdevumi 1000
|
||||||
|
Izdevumi 1000 Atlīdzība
|
||||||
|
Ieņēmumi 10000
|
||||||
|
Ieņēmumi 10100
|
||||||
|
Ieņēmumi 10110
|
||||||
|
Ieņēmumi 10112
|
||||||
|
Izdevumi 1100
|
||||||
|
Izdevumi 1110
|
||||||
|
Izdevumi 1111
|
||||||
|
Izdevumi 1112
|
||||||
|
Izdevumi 1113
|
||||||
|
Izdevumi 1114
|
||||||
|
Izdevumi 1115
|
||||||
|
Izdevumi 1116
|
||||||
|
Izdevumi 1119
|
||||||
|
Izdevumi 1140
|
||||||
|
Izdevumi 1141
|
||||||
|
Izdevumi 1142
|
||||||
|
Izdevumi 1143
|
||||||
|
Izdevumi 1144
|
||||||
|
Izdevumi 1145
|
||||||
|
Izdevumi 1146
|
||||||
|
Izdevumi 1147
|
||||||
|
Izdevumi 1148
|
||||||
|
Izdevumi 1149
|
||||||
|
Izdevumi 1150
|
||||||
|
Izdevumi 1170
|
||||||
|
Ieņēmumi 12.0.0.0.
|
||||||
|
Izdevumi 1200
|
||||||
|
Ieņēmumi 12000
|
||||||
|
Izdevumi 1210
|
||||||
|
Izdevumi 1220
|
||||||
|
Ieņēmumi 12200
|
||||||
|
Izdevumi 1221
|
||||||
|
Izdevumi 1222
|
||||||
|
Izdevumi 1223
|
||||||
|
Izdevumi 1224
|
||||||
|
Ieņēmumi 12240
|
||||||
|
Izdevumi 1225
|
||||||
|
Izdevumi 1226
|
||||||
|
Izdevumi 1227
|
||||||
|
Izdevumi 1228
|
||||||
|
Ieņēmumi 12300
|
||||||
|
Ieņēmumi 12340
|
||||||
|
Ieņēmumi 12390
|
||||||
|
Ieņēmumi 17000
|
||||||
|
Ieņēmumi 17100
|
||||||
|
Ieņēmumi 17110
|
||||||
|
Ieņēmumi 17110 Valsts budžeta iestāžu saņemtie transferti no savas ministrijas, centrālās valsts iestādes padotībā esošām no valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm
|
||||||
|
Ieņēmumi 17120
|
||||||
|
Ieņēmumi 17120 Valsts budžeta iestāžu saņemtie transferti no citas ministrijas, centrālās valsts iestādes padotībā esošām no valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm
|
||||||
|
Ieņēmumi 17130
|
||||||
|
Ieņēmumi 17130 Valsts budžeta iestāžu saņemtā atmaksa no savas ministrijas, centrālās valsts iestādes padotībā esošām no valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm par Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansēto projektu (pasākumu) īstenošanai piešķirtajiem līdzekļiem
|
||||||
|
Ieņēmumi 17140
|
||||||
|
Ieņēmumi 17140 Valsts budžeta iestāžu saņemtā atmaksa no citas ministrijas, centrālās valsts iestādes padotībā esošām no valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm par Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansēto projektu (pasākumu) īstenošanai piešķirtajiem līdzekļiem
|
||||||
|
Ieņēmumi 18000
|
||||||
|
Ieņēmumi 18100
|
||||||
|
Ieņēmumi 18130
|
||||||
|
Ieņēmumi 18131
|
||||||
|
Ieņēmumi 18131 Valsts pamatbudžeta iestāžu saņemtie transferti no valsts pamatbudžeta dotācijas no vispārējiem ieņēmumiem
|
||||||
|
Ieņēmumi 18132
|
||||||
|
Ieņēmumi 18132 Valsts pamatbudžeta iestāžu saņemtie transferti no ārvalstu finanšu palīdzības līdzekļiem
|
||||||
|
Ieņēmumi 18139
|
||||||
|
Ieņēmumi 18139 Pārējie valsts pamatbudžetā saņemtie transferti no valsts pamatbudžeta
|
||||||
|
Ieņēmumi 18200
|
||||||
|
Ieņēmumi 18200 Valsts speciālajā budžetā saņemtie transferti no valsts pamatbudžeta
|
||||||
|
Ieņēmumi 18210
|
||||||
|
Ieņēmumi 18211
|
||||||
|
Ieņēmumi 18212
|
||||||
|
Ieņēmumi 18213
|
||||||
|
Ieņēmumi 18214
|
||||||
|
Ieņēmumi 18215
|
||||||
|
Ieņēmumi 18217
|
||||||
|
Ieņēmumi 18218
|
||||||
|
Ieņēmumi 18230
|
||||||
|
Ieņēmumi 18300
|
||||||
|
Ieņēmumi 18310
|
||||||
|
Ieņēmumi 18311
|
||||||
|
Ieņēmumi 18312
|
||||||
|
Ieņēmumi 18313
|
||||||
|
Ieņēmumi 18400
|
||||||
|
Ieņēmumi 18400 Valsts pamatbudžetā saņemtie transferti no valsts speciālā budžeta
|
||||||
|
Ieņēmumi 18500
|
||||||
|
Ieņēmumi 18520
|
||||||
|
Ieņēmumi 18521
|
||||||
|
Ieņēmumi 18521 No nodarbinātības speciālā budžeta valsts pensiju apdrošināšanai
|
||||||
|
Ieņēmumi 18522
|
||||||
|
Ieņēmumi 18522 No darba negadījumu speciālā budžeta valsts pensiju apdrošināšanai
|
||||||
|
Ieņēmumi 18523
|
||||||
|
Ieņēmumi 18523 No invaliditātes, maternitātes un slimības speciālā budžeta valsts pensiju apdrošināšanai
|
||||||
|
Ieņēmumi 18524
|
||||||
|
Ieņēmumi 18524 No darba negadījumu speciālā budžeta sociālajai apdrošināšanai bezdarba gadījumam
|
||||||
|
Ieņēmumi 18525
|
||||||
|
Ieņēmumi 18525 No invaliditātes, maternitātes un slimības speciālā budžeta sociālajai apdrošināšanai bezdarba gadījumam
|
||||||
|
Ieņēmumi 18526
|
||||||
|
Ieņēmumi 18526 No valsts pensiju speciālā budžeta ieskaitītie līdzekļi Valsts sociālās apdrošināšanas aģentūrai
|
||||||
|
Ieņēmumi 18527
|
||||||
|
Ieņēmumi 18527 No nodarbinātības speciālā budžeta ieskaitītie līdzekļi Valsts sociālās apdrošināšanas aģentūrai
|
||||||
|
Ieņēmumi 18528
|
||||||
|
Ieņēmumi 18528 No darba negadījumu speciālā budžeta ieskaitītie līdzekļi Valsts sociālās apdrošināšanas aģentūrai
|
||||||
|
Ieņēmumi 18529
|
||||||
|
Ieņēmumi 18529 No invaliditātes, maternitātes un slimības speciālā budžeta ieskaitītie līdzekļi Valsts sociālās apdrošināšanas aģentūrai
|
||||||
|
Ieņēmumi 18530
|
||||||
|
Ieņēmumi 18530 Saņemtie transferti viena speciālā budžeta veida ietvaros
|
||||||
|
Ieņēmumi 18600
|
||||||
|
Ieņēmumi 18620
|
||||||
|
Ieņēmumi 18630
|
||||||
|
Ieņēmumi 19000
|
||||||
|
Ieņēmumi 19500
|
||||||
|
Ieņēmumi 19550
|
||||||
|
Ieņēmumi 19550 Valsts budžeta iestāžu saņemtie transferti (izņemot atmaksas) no pašvaldībām
|
||||||
|
Ieņēmumi 19560
|
||||||
|
Ieņēmumi 19560 Valsts budžeta iestāžu saņemtā atmaksa no pašvaldībām par iepriekšējos gados saņemtajiem un neizlietotajiem valsts budžeta transfertiem
|
||||||
|
Ieņēmumi 19570
|
||||||
|
Ieņēmumi 19570 Valsts budžeta iestāžu saņemtā atmaksa no pašvaldībām par Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansētajos projektos (pasākumos) piešķirtajiem līdzekļiem
|
||||||
|
Izdevumi 2000
|
||||||
|
Izdevumi 2000 Preces un pakalpojumi
|
||||||
|
Ieņēmumi 21.4.1.0.
|
||||||
|
Ieņēmumi 21.4.2.0.
|
||||||
|
Ieņēmumi 21.4.9.0.
|
||||||
|
Izdevumi 2100
|
||||||
|
Izdevumi 2110
|
||||||
|
Ieņēmumi 21100
|
||||||
|
Izdevumi 2111
|
||||||
|
Izdevumi 2112
|
||||||
|
Ieņēmumi 21140
|
||||||
|
Ieņēmumi 21150
|
||||||
|
Ieņēmumi 21190
|
||||||
|
Ieņēmumi 21191
|
||||||
|
Ieņēmumi 21193
|
||||||
|
Ieņēmumi 21194
|
||||||
|
Izdevumi 2120
|
||||||
|
Ieņēmumi 21200
|
||||||
|
Izdevumi 2121
|
||||||
|
Izdevumi 2122
|
||||||
|
Ieņēmumi 21300
|
||||||
|
Ieņēmumi 21350
|
||||||
|
Ieņēmumi 21351
|
||||||
|
Ieņēmumi 21352
|
||||||
|
Ieņēmumi 21359
|
||||||
|
Ieņēmumi 21360
|
||||||
|
Ieņēmumi 21370
|
||||||
|
Ieņēmumi 21371
|
||||||
|
Ieņēmumi 21379
|
||||||
|
Ieņēmumi 21380
|
||||||
|
Ieņēmumi 21381
|
||||||
|
Ieņēmumi 21382
|
||||||
|
Ieņēmumi 21383
|
||||||
|
Ieņēmumi 21384
|
||||||
|
Ieņēmumi 21389
|
||||||
|
Ieņēmumi 21390
|
||||||
|
Ieņēmumi 21391
|
||||||
|
Ieņēmumi 21392
|
||||||
|
Ieņēmumi 21393
|
||||||
|
Ieņēmumi 21394
|
||||||
|
Ieņēmumi 21395
|
||||||
|
Ieņēmumi 21396
|
||||||
|
Ieņēmumi 21397
|
||||||
|
Ieņēmumi 21399
|
||||||
|
Ieņēmumi 21400
|
||||||
|
Ieņēmumi 21410
|
||||||
|
Ieņēmumi 21411
|
||||||
|
Ieņēmumi 21412
|
||||||
|
Ieņēmumi 21420
|
||||||
|
Ieņēmumi 21421
|
||||||
|
Ieņēmumi 21423
|
||||||
|
Ieņēmumi 21424
|
||||||
|
Ieņēmumi 21425
|
||||||
|
Ieņēmumi 21426
|
||||||
|
Ieņēmumi 21427
|
||||||
|
Ieņēmumi 21429
|
||||||
|
Ieņēmumi 21490
|
||||||
|
Ieņēmumi 21710
|
||||||
|
Ieņēmumi 21710 Vispārējā kārtībā sadalāmā dotācija no vispārējiem ieņēmumiem
|
||||||
|
Ieņēmumi 21720
|
||||||
|
Ieņēmumi 21720 Dotācija no vispārējiem ieņēmumiem atmaksām valsts pamatbudžetā
|
||||||
|
Ieņēmumi 22.4.0.0.
|
||||||
|
Ieņēmumi 22.6.0.0.
|
||||||
|
Izdevumi 2200
|
||||||
|
Izdevumi 2210
|
||||||
|
Izdevumi 2220
|
||||||
|
Izdevumi 2221
|
||||||
|
Izdevumi 2222
|
||||||
|
Izdevumi 2223
|
||||||
|
Izdevumi 2224
|
||||||
|
Izdevumi 2229
|
||||||
|
Izdevumi 2230
|
||||||
|
Izdevumi 2231
|
||||||
|
Izdevumi 2232
|
||||||
|
Izdevumi 2233
|
||||||
|
Izdevumi 2234
|
||||||
|
Izdevumi 2235
|
||||||
|
Izdevumi 2236
|
||||||
|
Izdevumi 2238
|
||||||
|
Izdevumi 2239
|
||||||
|
Izdevumi 2240
|
||||||
|
Ieņēmumi 22400
|
||||||
|
Izdevumi 2241
|
||||||
|
Ieņēmumi 22410
|
||||||
|
Izdevumi 2242
|
||||||
|
Ieņēmumi 22420
|
||||||
|
Ieņēmumi 22422
|
||||||
|
Izdevumi 2243
|
||||||
|
Ieņēmumi 22430
|
||||||
|
Izdevumi 2244
|
||||||
|
Ieņēmumi 22440
|
||||||
|
Izdevumi 2246
|
||||||
|
Izdevumi 2247
|
||||||
|
Ieņēmumi 22470
|
||||||
|
Izdevumi 2249
|
||||||
|
Ieņēmumi 22490
|
||||||
|
Izdevumi 2250
|
||||||
|
Ieņēmumi 22500
|
||||||
|
Ieņēmumi 22520
|
||||||
|
Ieņēmumi 22540
|
||||||
|
Ieņēmumi 22560
|
||||||
|
Ieņēmumi 22561
|
||||||
|
Ieņēmumi 22562
|
||||||
|
Ieņēmumi 22563
|
||||||
|
Ieņēmumi 22590
|
||||||
|
Izdevumi 2260
|
||||||
|
Ieņēmumi 22600
|
||||||
|
Izdevumi 2261
|
||||||
|
Izdevumi 2262
|
||||||
|
Ieņēmumi 22620
|
||||||
|
Izdevumi 2263
|
||||||
|
Izdevumi 2264
|
||||||
|
Izdevumi 2269
|
||||||
|
Ieņēmumi 22690
|
||||||
|
Izdevumi 2270
|
||||||
|
Izdevumi 2271
|
||||||
|
Izdevumi 2272
|
||||||
|
Izdevumi 2273
|
||||||
|
Izdevumi 2274
|
||||||
|
Izdevumi 2275
|
||||||
|
Izdevumi 2276
|
||||||
|
Izdevumi 2280
|
||||||
|
Izdevumi 2300
|
||||||
|
Izdevumi 2310
|
||||||
|
Izdevumi 2311
|
||||||
|
Izdevumi 2312
|
||||||
|
Izdevumi 2313
|
||||||
|
Izdevumi 2314
|
||||||
|
Izdevumi 2320
|
||||||
|
Izdevumi 2321
|
||||||
|
Izdevumi 2322
|
||||||
|
Izdevumi 2329
|
||||||
|
Izdevumi 2330
|
||||||
|
Izdevumi 2340
|
||||||
|
Ieņēmumi 23400
|
||||||
|
Izdevumi 2341
|
||||||
|
Ieņēmumi 23410
|
||||||
|
Izdevumi 2343
|
||||||
|
Izdevumi 2344
|
||||||
|
Izdevumi 2350
|
||||||
|
Ieņēmumi 23500
|
||||||
|
Ieņēmumi 23510
|
||||||
|
Izdevumi 2360
|
||||||
|
Izdevumi 2361
|
||||||
|
Izdevumi 2362
|
||||||
|
Izdevumi 2363
|
||||||
|
Izdevumi 2364
|
||||||
|
Izdevumi 2365
|
||||||
|
Izdevumi 2366
|
||||||
|
Izdevumi 2369
|
||||||
|
Izdevumi 2370
|
||||||
|
Izdevumi 2380
|
||||||
|
Izdevumi 2381
|
||||||
|
Izdevumi 2389
|
||||||
|
Izdevumi 2390
|
||||||
|
Izdevumi 2400
|
||||||
|
Izdevumi 2500
|
||||||
|
Izdevumi 2510
|
||||||
|
Izdevumi 2512
|
||||||
|
Izdevumi 2513
|
||||||
|
Izdevumi 2514
|
||||||
|
Izdevumi 2515
|
||||||
|
Izdevumi 2516
|
||||||
|
Izdevumi 2519
|
||||||
|
Izdevumi 2520
|
||||||
|
Izdevumi 3000
|
||||||
|
Izdevumi 3000 Subsīdijas un dotācijas
|
||||||
|
Izdevumi 3100
|
||||||
|
Izdevumi 3110
|
||||||
|
Izdevumi 3111
|
||||||
|
Izdevumi 3112
|
||||||
|
Izdevumi 3190
|
||||||
|
Izdevumi 3192
|
||||||
|
Izdevumi 3200
|
||||||
|
Izdevumi 3230
|
||||||
|
Izdevumi 3232
|
||||||
|
Izdevumi 3260
|
||||||
|
Izdevumi 3261
|
||||||
|
Izdevumi 3262
|
||||||
|
Izdevumi 3263
|
||||||
|
Izdevumi 3264
|
||||||
|
Izdevumi 3280
|
||||||
|
Izdevumi 3282
|
||||||
|
Izdevumi 3290
|
||||||
|
Izdevumi 3291
|
||||||
|
Izdevumi 3292
|
||||||
|
Izdevumi 3293
|
||||||
|
Izdevumi 3294
|
||||||
|
Izdevumi 3295
|
||||||
|
Izdevumi 3300
|
||||||
|
Izdevumi 3310
|
||||||
|
Izdevumi 4000
|
||||||
|
Izdevumi 4000 Procentu izdevumi
|
||||||
|
Izdevumi 4100
|
||||||
|
Izdevumi 4110
|
||||||
|
Izdevumi 4200
|
||||||
|
Izdevumi 4240
|
||||||
|
Izdevumi 4300
|
||||||
|
Izdevumi 4330
|
||||||
|
Izdevumi 4331
|
||||||
|
Izdevumi 4332
|
||||||
|
Izdevumi 4334
|
||||||
|
Izdevumi 4339
|
||||||
|
Izdevumi 5000
|
||||||
|
Izdevumi 5000 Pamatkapitāla veidošana
|
||||||
|
Izdevumi 5100
|
||||||
|
Izdevumi 5110
|
||||||
|
Izdevumi 5120
|
||||||
|
Izdevumi 5130
|
||||||
|
Izdevumi 5140
|
||||||
|
Izdevumi 5200
|
||||||
|
Izdevumi 5210
|
||||||
|
Izdevumi 5211
|
||||||
|
Izdevumi 5212
|
||||||
|
Izdevumi 5213
|
||||||
|
Izdevumi 5214
|
||||||
|
Izdevumi 5217
|
||||||
|
Izdevumi 5218
|
||||||
|
Izdevumi 5219
|
||||||
|
Izdevumi 5220
|
||||||
|
Izdevumi 5230
|
||||||
|
Izdevumi 5231
|
||||||
|
Izdevumi 5233
|
||||||
|
Izdevumi 5234
|
||||||
|
Izdevumi 5235
|
||||||
|
Izdevumi 5236
|
||||||
|
Izdevumi 5238
|
||||||
|
Izdevumi 5239
|
||||||
|
Izdevumi 5240
|
||||||
|
Izdevumi 5250
|
||||||
|
Izdevumi 5260
|
||||||
|
Izdevumi 5269
|
||||||
|
Izdevumi 5270
|
||||||
|
Izdevumi 6000
|
||||||
|
Izdevumi 6000 Sociāla rakstura maksājumi un kompensācijas
|
||||||
|
Izdevumi 6200
|
||||||
|
Izdevumi 6210
|
||||||
|
Izdevumi 6211
|
||||||
|
Izdevumi 6212
|
||||||
|
Izdevumi 6213
|
||||||
|
Izdevumi 6214
|
||||||
|
Izdevumi 6215
|
||||||
|
Izdevumi 6216
|
||||||
|
Izdevumi 6220
|
||||||
|
Izdevumi 6221
|
||||||
|
Izdevumi 6222
|
||||||
|
Izdevumi 6223
|
||||||
|
Izdevumi 6224
|
||||||
|
Izdevumi 6225
|
||||||
|
Izdevumi 6226
|
||||||
|
Izdevumi 6227
|
||||||
|
Izdevumi 6228
|
||||||
|
Izdevumi 6229
|
||||||
|
Izdevumi 6230
|
||||||
|
Izdevumi 6231
|
||||||
|
Izdevumi 6232
|
||||||
|
Izdevumi 6233
|
||||||
|
Izdevumi 6234
|
||||||
|
Izdevumi 6235
|
||||||
|
Izdevumi 6237
|
||||||
|
Izdevumi 6238
|
||||||
|
Izdevumi 6239
|
||||||
|
Izdevumi 6240
|
||||||
|
Izdevumi 6241
|
||||||
|
Izdevumi 6242
|
||||||
|
Izdevumi 6290
|
||||||
|
Izdevumi 6291
|
||||||
|
Izdevumi 6292
|
||||||
|
Izdevumi 6293
|
||||||
|
Izdevumi 6294
|
||||||
|
Izdevumi 6295
|
||||||
|
Izdevumi 6296
|
||||||
|
Izdevumi 6299
|
||||||
|
Izdevumi 6400
|
||||||
|
Izdevumi 6420
|
||||||
|
Izdevumi 6422
|
||||||
|
Izdevumi 6500
|
||||||
|
Izdevumi 6510
|
||||||
|
Izdevumi 6520
|
||||||
|
Izdevumi 7100
|
||||||
|
Izdevumi 7100 Valsts budžeta uzturēšanas izdevumu transferti
|
||||||
|
Izdevumi 7110
|
||||||
|
Izdevumi 7120
|
||||||
|
Izdevumi 7130
|
||||||
|
Izdevumi 7131
|
||||||
|
Izdevumi 7132
|
||||||
|
Izdevumi 7139
|
||||||
|
Izdevumi 7140
|
||||||
|
Izdevumi 7300
|
||||||
|
Izdevumi 7320
|
||||||
|
Izdevumi 7320 Valsts budžeta uzturēšanas izdevumu transferti pašvaldībām Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansētajiem projektiem (pasākumiem)
|
||||||
|
Izdevumi 7350
|
||||||
|
Izdevumi 7350 Valsts budžeta transferti valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm noteiktam mērķim
|
||||||
|
Izdevumi 7353
|
||||||
|
Izdevumi 7354
|
||||||
|
Izdevumi 7400
|
||||||
|
Izdevumi 7460
|
||||||
|
Izdevumi 7460 Pārējie valsts budžeta uzturēšanas izdevumu transferti pašvaldībām
|
||||||
|
Izdevumi 7470
|
||||||
|
Izdevumi 7470 Pārējie valsts budžeta uzturēšanas izdevumu transferti valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm
|
||||||
|
Izdevumi 7471
|
||||||
|
Izdevumi 7472
|
||||||
|
Izdevumi 7500
|
||||||
|
Izdevumi 7500 Atmaksa valsts budžetā par veiktajiem uzturēšanas izdevumiem
|
||||||
|
Izdevumi 7600
|
||||||
|
Izdevumi 7600 Kārtējie maksājumi Eiropas Savienības budžetā
|
||||||
|
Izdevumi 7610
|
||||||
|
Izdevumi 7620
|
||||||
|
Izdevumi 7621
|
||||||
|
Izdevumi 7622
|
||||||
|
Izdevumi 7623
|
||||||
|
Izdevumi 7624
|
||||||
|
Izdevumi 7625
|
||||||
|
Izdevumi 7630
|
||||||
|
Izdevumi 7700
|
||||||
|
Izdevumi 7700 Starptautiskā sadarbība
|
||||||
|
Izdevumi 7710
|
||||||
|
Izdevumi 7711
|
||||||
|
Izdevumi 7712
|
||||||
|
Izdevumi 7713
|
||||||
|
Izdevumi 7720
|
||||||
|
Izdevumi 7730
|
||||||
|
Izdevumi 9000
|
||||||
|
Izdevumi 9100
|
||||||
|
Izdevumi 9120
|
||||||
|
Izdevumi 9120 Valsts budžeta kapitālo izdevumu transferti no valsts pamatbudžeta uz valsts speciālo budžetu
|
||||||
|
Izdevumi 9500
|
||||||
|
Izdevumi 9580
|
||||||
|
Izdevumi 9580 Valsts budžeta kapitālo izdevumu transferti pašvaldībām Eiropas Savienības politiku instrumentu un pārējās ārvalstu finanšu palīdzības līdzfinansētajiem projektiem (pasākumiem)
|
||||||
|
Izdevumi 9590
|
||||||
|
Izdevumi 9590 Valsts budžeta kapitālo izdevumu transferti valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm noteiktam mērķim
|
||||||
|
Izdevumi 9593
|
||||||
|
Izdevumi 9594
|
||||||
|
Izdevumi 9700
|
||||||
|
Izdevumi 9710
|
||||||
|
Izdevumi 9710 Pārējie valsts budžeta kapitālo izdevumu transferti pašvaldībām
|
||||||
|
Izdevumi 9720
|
||||||
|
Izdevumi 9720 Pārējie valsts budžeta transferti kapitālajiem izdevumiem valsts budžeta daļēji finansētām atvasinātām publiskām personām un budžeta nefinansētām iestādēm
|
||||||
|
Izdevumi 9721
|
||||||
|
Izdevumi 9722
|
||||||
|
Ieņēmumi A200 Nenodokļu ieņēmumi
|
||||||
|
Ieņēmumi A300 Ieņēmumi no maksas pakalpojumiem un citi pašu ieņēmumi – kopā
|
||||||
|
Ieņēmumi A420 Ārvalstu finanšu palīdzība iestādes ieņēmumos
|
||||||
|
Finansēšana F210100001
|
||||||
|
Finansēšana F210100001 Maksas pakalpojumu un citu pašu ieņēmumu naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)
|
||||||
|
Finansēšana F210100002
|
||||||
|
Finansēšana F210100002 Ārvalstu finanšu palīdzības naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)
|
||||||
|
Finansēšana F210100003
|
||||||
|
Finansēšana F210100003 Valsts speciālā budžeta naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)
|
||||||
|
Finansēšana F210100101
|
||||||
|
Finansēšana F210100102
|
||||||
|
Finansēšana F210100103
|
||||||
|
Finansēšana F210100201
|
||||||
|
Finansēšana F210100202
|
||||||
|
Finansēšana F22010010
|
||||||
|
Finansēšana F22010020
|
||||||
|
Finansēšana F29010010
|
||||||
|
Finansēšana F29010020
|
||||||
|
Finansēšana F29110010
|
||||||
|
Finansēšana F29110020
|
||||||
|
Finansēšana F29111010
|
||||||
|
Finansēšana F29111020
|
||||||
|
Finansēšana F29111210
|
||||||
|
Finansēšana F29111220
|
||||||
|
Finansēšana F29210010
|
||||||
|
Finansēšana F29210020
|
||||||
|
Finansēšana F29211010
|
||||||
|
Finansēšana F29211020
|
||||||
|
Finansēšana F29211210
|
||||||
|
Finansēšana F29211220
|
||||||
|
Finansēšana F40010010 Izsniegtie aizdevumi
|
||||||
|
Finansēšana F40010020 Izsniegto aizdevumu saņemtā atmaksa
|
||||||
|
Finansēšana F40020020 Saņemto aizņēmumu atmaksa
|
||||||
|
Finansēšana F40110010
|
||||||
|
Finansēšana F40110020
|
||||||
|
Finansēšana F40111010
|
||||||
|
Finansēšana F40111020
|
||||||
|
Finansēšana F40111210
|
||||||
|
Finansēšana F40111220
|
||||||
|
Finansēšana F40112020
|
||||||
|
Finansēšana F40112220
|
||||||
|
Finansēšana F40210010
|
||||||
|
Finansēšana F40210020
|
||||||
|
Finansēšana F40211010
|
||||||
|
Finansēšana F40211020
|
||||||
|
Finansēšana F40211210
|
||||||
|
Finansēšana F40211220
|
||||||
|
Finansēšana F40211310
|
||||||
|
Finansēšana F40212010
|
||||||
|
Finansēšana F40212020
|
||||||
|
Finansēšana F40212210
|
||||||
|
Finansēšana F40212220
|
||||||
|
Finansēšana F40310010
|
||||||
|
Finansēšana F40310020
|
||||||
|
Finansēšana F40311010
|
||||||
|
Finansēšana F40311020
|
||||||
|
Finansēšana F40311210
|
||||||
|
Finansēšana F40311220
|
||||||
|
Finansēšana F40312010
|
||||||
|
Finansēšana F40312020
|
||||||
|
Finansēšana F40312210
|
||||||
|
Finansēšana F40312220
|
||||||
|
Finansēšana F40313020
|
||||||
|
Finansēšana F40313220
|
||||||
|
Finansēšana F40320020
|
||||||
|
Finansēšana F40322020
|
||||||
|
Finansēšana F40322220
|
||||||
|
Finansēšana F50010000 Akcijas un cita līdzdalība pašu kapitālā
|
||||||
|
Finansēšana F55010010
|
||||||
|
Finansēšana F55010012
|
||||||
|
Finansēšana F55010013
|
||||||
|
Finansēšana F55010019
|
||||||
|
28
source/kodi/vpk_resorts.tsv
Normal file
28
source/kodi/vpk_resorts.tsv
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
01-0000 LATVIJAS VALSTS PREZIDENTA KANCELEJA
|
||||||
|
02-0000 LATVIJAS REPUBLIKAS SAEIMA
|
||||||
|
03-0000 VALSTS KANCELEJA
|
||||||
|
04-0000 KORUPCIJAS NOVĒRŠANAS UN APKAROŠANAS BIROJS
|
||||||
|
05-0000 LATVIJAS REPUBLIKAS TIESĪBSARGA BIROJS
|
||||||
|
08-0000 SABIEDRĪBAS INTEGRĀCIJAS FONDS
|
||||||
|
09-0000 SABIEDRISKO PAKALPOJUMU REGULĒŠANAS KOMISIJA
|
||||||
|
10-0000 AIZSARDZĪBAS MINISTRIJA
|
||||||
|
11-0000 ĀRLIETU MINISTRIJA
|
||||||
|
12-0000 EKONOMIKAS MINISTRIJA
|
||||||
|
13-0000 FINANŠU MINISTRIJA
|
||||||
|
14-0000 LATVIJAS REPUBLIKAS IEKŠLIETU MINISTRIJA
|
||||||
|
15-0000 IZGLĪTĪBAS UN ZINĀTNES MINISTRIJA
|
||||||
|
16-0000 ZEMKOPĪBAS MINISTRIJA
|
||||||
|
17-0000 SATIKSMES MINISTRIJA
|
||||||
|
18-0000 LABKLĀJĪBAS MINISTRIJA
|
||||||
|
19-0000 TIESLIETU MINISTRIJA
|
||||||
|
20-0000 KLIMATA UN ENERĢĒTIKAS MINISTRIJA
|
||||||
|
21-0000 VIEDĀS ADMINISTRĀCIJAS UN REĢIONĀLĀS ATTĪSTĪBAS MINISTRIJA
|
||||||
|
22-0000 KULTŪRAS MINISTRIJA
|
||||||
|
24-0000 LATVIJAS REPUBLIKAS VALSTS KONTROLE
|
||||||
|
28-0000 LATVIJAS REPUBLIKAS AUGSTĀKĀ TIESA
|
||||||
|
29-0000 LATVIJAS REPUBLIKAS VESELĪBAS MINISTRIJA
|
||||||
|
30-0000 LR SATVERSMES TIESA
|
||||||
|
32-0000 LATVIJAS REPUBLIKAS PROKURATŪRA
|
||||||
|
35-0000 CENTRĀLĀ VĒLĒŠANU KOMISIJA
|
||||||
|
46-0000 SABIEDRISKO ELEKTRONISKO PLAŠSAZIŅAS LĪDZEKĻU PADOME
|
||||||
|
47-0000 NACIONĀLĀ ELEKTRONISKO PLAŠSAZIŅAS LĪDZEKĻU PADOME
|
||||||
|
90
tools/calc.py
Normal file
90
tools/calc.py
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
"""Shared summation rules for the budget model (used by the parser for residuals and by the verifier).
|
||||||
|
|
||||||
|
A printed number in the law is reproduced by summing Allocation records that match its selector:
|
||||||
|
fund, flow, year, nature, untilEnd, purpose subtree, block, commitment kind, and classification codes.
|
||||||
|
Consolidation: a node's total includes an intra-fund transfer only if that node itself prints the transfer's code;
|
||||||
|
otherwise intra-fund transfers are eliminated (they cancel out inside the node).
|
||||||
|
"""
|
||||||
|
import collections
|
||||||
|
|
||||||
|
|
||||||
|
def kind_stem(k):
|
||||||
|
"""Commitment-kind codes are hierarchical in 2-digit groups: 0101100000 -> 010110."""
|
||||||
|
s = k or ''
|
||||||
|
while len(s) > 2 and s.endswith('00'):
|
||||||
|
s = s[:-2]
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
|
class Calc:
|
||||||
|
def __init__(self, allocs, purpose_parent, cls_parent, intra_codes, blockcodes, purpose_holder=None):
|
||||||
|
self.purpose_parent = purpose_parent
|
||||||
|
self.purpose_holder = purpose_holder or {}
|
||||||
|
self.cls_parent = cls_parent
|
||||||
|
self.intra = intra_codes
|
||||||
|
self.blockcodes = {k: {f: set(v) for f, v in d.items()} for k, d in blockcodes.items()}
|
||||||
|
self.idx = collections.defaultdict(list)
|
||||||
|
for a in allocs:
|
||||||
|
self.add(a)
|
||||||
|
|
||||||
|
def chain(self, p):
|
||||||
|
out = set()
|
||||||
|
while p and p not in out:
|
||||||
|
out.add(p)
|
||||||
|
p = self.purpose_parent.get(p)
|
||||||
|
return out
|
||||||
|
|
||||||
|
def code_chain(self, k):
|
||||||
|
out = set()
|
||||||
|
while k and k not in out:
|
||||||
|
out.add(k)
|
||||||
|
k = self.cls_parent.get(k)
|
||||||
|
return out
|
||||||
|
|
||||||
|
def add(self, a):
|
||||||
|
a['_pchain'] = self.chain(a.get('purpose'))
|
||||||
|
a['_ck'] = f"{a['scheme']}:{a['code']}"
|
||||||
|
a['_cchain'] = self.code_chain(a['_ck'])
|
||||||
|
a['_intra'] = bool(a['_cchain'] & self.intra)
|
||||||
|
self.idx[(a['fund'], a['flow'], int(a['year']), a['nature'])].append(a)
|
||||||
|
|
||||||
|
def total(self, fund, flow, year, nature, purpose=None, block=None, codes=None, ckind=None, untilEnd=False,
|
||||||
|
blk=None, ekk_prefix=None, consolidated=None, holder_view=False):
|
||||||
|
"""holder_view: also count budget-level amounts (no purpose) whose holder administers the selected purpose."""
|
||||||
|
printed = self.blockcodes.get(blk, {}).get(flow) if blk else None
|
||||||
|
if consolidated is None:
|
||||||
|
consolidated = purpose is None
|
||||||
|
codes = set(codes) if codes else None
|
||||||
|
s = 0.0
|
||||||
|
for f in ([fund] if fund else ['basic', 'special']):
|
||||||
|
for a in self.idx.get((f, flow, int(year), nature), ()):
|
||||||
|
if a.get('partOf'):
|
||||||
|
continue
|
||||||
|
if bool(a.get('untilEnd')) != bool(untilEnd):
|
||||||
|
continue
|
||||||
|
if purpose and purpose not in a['_pchain']:
|
||||||
|
if not (holder_view and not a.get('purpose') and a.get('holder') and a.get('holder') == self.purpose_holder.get(purpose)):
|
||||||
|
continue
|
||||||
|
if block and a.get('block') != block:
|
||||||
|
continue
|
||||||
|
if ckind and not (a.get('commitmentKind') or '').startswith(kind_stem(ckind)):
|
||||||
|
continue
|
||||||
|
if ekk_prefix and not (a['scheme'] == 'ekk' and a['code'].startswith(ekk_prefix)):
|
||||||
|
continue
|
||||||
|
ck, cc = a['_ck'], a['_cchain']
|
||||||
|
if printed is not None:
|
||||||
|
shown = ck in printed
|
||||||
|
if not shown and a['_intra']:
|
||||||
|
continue
|
||||||
|
if codes is not None:
|
||||||
|
if not (ck in codes or (not shown and cc & codes)):
|
||||||
|
continue
|
||||||
|
elif codes is not None:
|
||||||
|
if not (cc & codes):
|
||||||
|
continue
|
||||||
|
if consolidated and a['_intra'] and ck not in codes:
|
||||||
|
continue
|
||||||
|
elif consolidated and a['_intra']:
|
||||||
|
continue
|
||||||
|
s += float(a['amount'])
|
||||||
|
return s
|
||||||
26
tools/klasifikacijas.py
Normal file
26
tools/klasifikacijas.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
"""Classification code lists from the regulation tables on likumi.lv:
|
||||||
|
MK 27.12.2005. noteikumi Nr. 1031 (expenditure, EKK), MK noteikumi par budžetu ieņēmumu klasifikāciju (revenue), MK 22.11.2005. noteikumi Nr. 875 (financing).
|
||||||
|
Input: source/klasifikacijas/<likumi.lv id>.html Output: source/kodi/klasdict.json (name -> [[scheme, code], ...])
|
||||||
|
"""
|
||||||
|
import re, html, json, os
|
||||||
|
ROOT = os.environ.get('BUDGET_ROOT', os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
out = {}
|
||||||
|
CODE = re.compile(r'(?:[A-Z]{1,2})?\d{1,2}(?:\.\d{1,2}){1,5}\.?|\d{4,5}|F\d{8}|[A-Z]\d{1,2}(?:\.\d+)*\.?')
|
||||||
|
for act, kind in (('124833', 'ekk'), ('124831', 'revenue'), ('122159', 'financing')):
|
||||||
|
s = open(os.path.join(ROOT, 'source', 'klasifikacijas', f'{act}.html'), encoding='utf-8', errors='replace').read()
|
||||||
|
n = 0
|
||||||
|
for tr in re.findall(r'(?is)<tr[^>]*>(.*?)</tr>', s):
|
||||||
|
cells = [re.sub(r'\s+', ' ', html.unescape(re.sub(r'<[^>]+>', ' ', c))).strip() for c in re.findall(r'(?is)<td[^>]*>(.*?)</td>', tr)]
|
||||||
|
for i, c in enumerate(cells[:-1]):
|
||||||
|
if CODE.fullmatch(c) and cells[i + 1] and not CODE.fullmatch(cells[i + 1]) and not cells[i + 1].startswith('Kodā'):
|
||||||
|
code = c.rstrip('.')
|
||||||
|
if kind == 'revenue' and '.' in code:
|
||||||
|
p = code.split('.'); code = (p[0].zfill(2) + ''.join(p[1:])).ljust(5, '0')
|
||||||
|
if kind == 'financing' and '.' in code:
|
||||||
|
code = 'F' + code.replace('.', '')
|
||||||
|
out.setdefault(cells[i + 1].strip(' .;:'), set()).add((kind, code)); n += 1
|
||||||
|
break
|
||||||
|
print(act, kind, 'rows', n)
|
||||||
|
for k in [k for k in out if re.search(r'Dotācija no vispār|savstarpējie|Kapitālo izdevumu transferti$|7200|uz valsts pamatbudžetu', k)][:12]:
|
||||||
|
print(' ', sorted(out[k])[:3], k[:100])
|
||||||
|
json.dump({k: sorted(v) for k, v in out.items()}, open(os.path.join(ROOT, 'source', 'kodi', 'klasdict.json'), 'w'), ensure_ascii=False)
|
||||||
23
tools/kodi_no_sap.py
Normal file
23
tools/kodi_no_sap.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
"""Code-name pairs from the hidden SAP BW (BEx) sheets inside the budget law annex files.
|
||||||
|
The printed annex tables show line names only; the hidden ZQZBC_* sheets carry the code next to the name.
|
||||||
|
Input: source/<year>/P01.XLSX, P02.XLSX, P03.XLSX, P05.XLSX, P11.XLSX Output: source/kodi/codepairs.json (name -> [codes])
|
||||||
|
Usage: python tools/kodi_no_sap.py [year] (default 2026)
|
||||||
|
"""
|
||||||
|
import sys, os, re, json, collections
|
||||||
|
TOOLS = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
ROOT = os.environ.get('BUDGET_ROOT', os.path.dirname(TOOLS))
|
||||||
|
sys.path.insert(0, TOOLS)
|
||||||
|
from rd import sheets
|
||||||
|
year = sys.argv[1] if len(sys.argv) > 1 else '2026'
|
||||||
|
pairs = collections.OrderedDict()
|
||||||
|
for f in ('P01.XLSX', 'P02.XLSX', 'P05.XLSX', 'P03.XLSX', 'P11.XLSX'):
|
||||||
|
for name, rows in sheets(os.path.join(ROOT, 'source', year, f)):
|
||||||
|
if not name.startswith('ZQZ'):
|
||||||
|
continue
|
||||||
|
for r in rows:
|
||||||
|
for i in range(len(r) - 1):
|
||||||
|
c, nm = str(r[i]), r[i + 1]
|
||||||
|
if re.fullmatch(r'[A-Z]{0,3}\d[\dA-Z]*|[A-Z]{1,5}\d?T?|\d{4,5}', c) and isinstance(nm, str) and len(nm) > 3 and not nm.startswith('Nosaukums'):
|
||||||
|
pairs.setdefault(nm.strip(), set()).add(c)
|
||||||
|
json.dump({k: sorted(v) for k, v in pairs.items()}, open(os.path.join(ROOT, 'source', 'kodi', 'codepairs.json'), 'w', encoding='utf-8'), ensure_ascii=False, indent=0)
|
||||||
|
print('pairs', len(pairs))
|
||||||
32
tools/odcs-config.yaml
Normal file
32
tools/odcs-config.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# B15 datu līguma konfigurācija lakehouse rīkam tools/xsd_to_odcs.py (tas pats rīks, ar ko ģenerēti B01–B14).
|
||||||
|
# python3 tools/xsd_to_odcs.py <šī datne> <repozitorija sakne> contracts Budget-as-Code
|
||||||
|
base_url: https://processgit.org
|
||||||
|
contracts:
|
||||||
|
- id: B15
|
||||||
|
file: B15-valsts-budzets.odcs.yaml
|
||||||
|
name: Valsts budžets (budžeta likums kā dati)
|
||||||
|
version: 0.1.0
|
||||||
|
org: Valsts-Pirmkods
|
||||||
|
repo: Budget-as-Code
|
||||||
|
pattern: data/lv-vb-*.xml
|
||||||
|
filename_is_id: true
|
||||||
|
schema: schemas/valsts-budzets-0.1.xsd
|
||||||
|
root: Budget
|
||||||
|
namespace: urn:pppa:vpk:budzets:0.1
|
||||||
|
owner: PPP Asociācija (PPPA)
|
||||||
|
data_product: Valsts budžeta datukopa
|
||||||
|
purpose: Pieņemtais valsts budžeta likums kā dati — panti, ieņēmumi, apropriācijas pa programmām un apakšprogrammām, nākamo gadu maksimālie apjomi, ilgtermiņa saistības un mērķdotācijas pašvaldībām; katrs likuma pielikumos drukātais skaitlis atjaunojams no datnes.
|
||||||
|
limitations: Koncepcijas demonstrācija, nav oficiāls izdevums. Budžeta paskaidrojumi (mērķi, rezultatīvie rādītāji) un gada laikā veiktās apropriācijas izmaiņas vēl nav iekļautas.
|
||||||
|
identifiers: "lv-vb-GGGG; pants .pNNN; resors .ac.rSS; programma .pr.SS.PP.AA.00; projekts .pj.…; naudas fakts .a.pNN.r<rinda>.y<gads>"
|
||||||
|
objects:
|
||||||
|
- {element: Budget, keys: [id]}
|
||||||
|
- {element: Source, keys: [id]}
|
||||||
|
- {element: Provision, keys: [id]}
|
||||||
|
- {element: Parameter, keys: [id]}
|
||||||
|
- {element: Actor, keys: [id]}
|
||||||
|
- {element: Purpose, keys: [id]}
|
||||||
|
- {element: ClassItem, keys: [scheme, code]}
|
||||||
|
- {element: Allocation, keys: [id]}
|
||||||
|
rules:
|
||||||
|
- {rule: printed_numbers_reproduced, description: "Katrs likuma pielikumos drukātais skaitlis atjaunojams no datnes (tools/verify_budget.py)", dimension: accuracy}
|
||||||
|
- {rule: resort_has_vpk_id, description: "Resoram, kas ir institūcija, norādīts VPK ID"}
|
||||||
862
tools/parse_budget.py
Normal file
862
tools/parse_budget.py
Normal file
@@ -0,0 +1,862 @@
|
|||||||
|
"""Convert an adopted Latvian state budget law (text + 12 annexes) into one XML file
|
||||||
|
following valsts-budzets-0.1.xsd, plus a JSON list of every printed number as a check.
|
||||||
|
|
||||||
|
Usage: python parse_budget.py YEAR LAW_HTML ANNEX_DIR OUT_DIR
|
||||||
|
Annex files are found by number (P04.XLSX, 4_PIELIKUMS.XLS, ...).
|
||||||
|
Storage rule: each fact is stored once, from its most detailed source; every other printed number becomes a check.
|
||||||
|
"""
|
||||||
|
import sys, os, re, json, html, hashlib, collections, datetime
|
||||||
|
TOOLS = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
ROOT = os.environ.get('BUDGET_ROOT', os.path.dirname(TOOLS))
|
||||||
|
KODI = os.path.join(ROOT, 'source', 'kodi')
|
||||||
|
sys.path.insert(0, TOOLS)
|
||||||
|
from rows import read_rows
|
||||||
|
from rd import docx_tables, num
|
||||||
|
from xml.sax.saxutils import quoteattr, escape
|
||||||
|
from calc import Calc
|
||||||
|
|
||||||
|
YEAR, LAW_HTML, ADIR, OUT = int(sys.argv[1]), sys.argv[2], sys.argv[3], sys.argv[4]
|
||||||
|
Y3 = [YEAR, YEAR + 1, YEAR + 2]
|
||||||
|
BID = f'lv-vb-{YEAR}'
|
||||||
|
report = collections.defaultdict(list)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ helpers
|
||||||
|
def norm(s):
|
||||||
|
s = str(s).lower().replace(' ', ' ').replace('–', '-').replace('—', '-')
|
||||||
|
s = re.sub(r'^i estādes', 'iestādes', s)
|
||||||
|
return re.sub(r'[^0-9a-zāčēģīķļņšūž]+', ' ', s).strip()
|
||||||
|
|
||||||
|
def slug(s, n=40):
|
||||||
|
t = norm(s).translate(str.maketrans('āčēģīķļņšūž', 'acegiklnsuz'))
|
||||||
|
return re.sub(r'\s+', '-', t)[:n].strip('-')
|
||||||
|
|
||||||
|
def annex_file(n):
|
||||||
|
for f in os.listdir(ADIR):
|
||||||
|
m = re.match(r'^P?0*(\d+)[_.]', f, re.I)
|
||||||
|
if m and int(m.group(1)) == n:
|
||||||
|
return os.path.join(ADIR, f)
|
||||||
|
raise FileNotFoundError(f'annex {n}')
|
||||||
|
|
||||||
|
def sha(path):
|
||||||
|
return hashlib.sha256(open(path, 'rb').read()).hexdigest()
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ code book
|
||||||
|
SCHEME_OF_FLOW = {'expenditure': 'ekk', 'resource': 'revenue', 'revenue': 'revenue', 'financing': 'financing'}
|
||||||
|
book = collections.defaultdict(lambda: collections.defaultdict(set)) # scheme -> normname -> codes
|
||||||
|
for nm, kc in json.load(open(os.path.join(KODI, 'klasdict.json'), encoding='utf-8')).items():
|
||||||
|
for kind, c in kc:
|
||||||
|
book[kind][norm(nm)].add(c)
|
||||||
|
KL = {'Izdevumi': 'ekk', 'Ieņēmumi': 'revenue', 'Finansēšana': 'financing'}
|
||||||
|
for line in open(os.path.join(KODI, 'vk_codes.tsv'), encoding='utf-8'):
|
||||||
|
kl, v = line.rstrip('\n').split('\t')
|
||||||
|
m = re.match(r'^([A-Z]{0,2}\d[\d.]*)\s+(.+)$', v)
|
||||||
|
if m and kl in KL:
|
||||||
|
book[KL[kl]][norm(m.group(2))].add(m.group(1))
|
||||||
|
for nm, codes in json.load(open(os.path.join(KODI, 'codepairs.json'), encoding='utf-8')).items():
|
||||||
|
for c in codes:
|
||||||
|
sch = 'financing' if c.startswith('F') or re.fullmatch(r'[A-Z]{1,2}F\d+', c) else ('ekk' if re.fullmatch(r'\d{4}', c) else ('revenue' if re.fullmatch(r'\d{5}', c) else 'law'))
|
||||||
|
book[sch][norm(nm)].add(c)
|
||||||
|
|
||||||
|
classitems = {} # (scheme, code) -> {'name', 'parent'}
|
||||||
|
SECTION = {'ieņēmumi kopā': 'revenue', 'resursi izdevumu segšanai': 'resource', 'izdevumi kopā': 'expenditure',
|
||||||
|
'finansēšana': 'financing', 'finansiālā bilance': 'balance'}
|
||||||
|
|
||||||
|
def canon(sch, c):
|
||||||
|
if sch == 'financing' and re.fullmatch(r'[PKS]F\d{8}', c):
|
||||||
|
return c[1:]
|
||||||
|
return c
|
||||||
|
|
||||||
|
def code_for(label, flow):
|
||||||
|
n = norm(label)
|
||||||
|
pref = SCHEME_OF_FLOW.get(flow, 'law')
|
||||||
|
for sch in (pref, 'law', 'revenue', 'ekk', 'financing'):
|
||||||
|
cs = book[sch].get(n)
|
||||||
|
if cs:
|
||||||
|
cs = {canon(sch, x) for x in cs}
|
||||||
|
c = sorted(cs, key=lambda x: (len(x), x))[0]
|
||||||
|
if len(cs) > 1:
|
||||||
|
report['ambiguous_code'].append(f'{label[:60]} -> {sorted(cs)} (took {c})')
|
||||||
|
return sch, c
|
||||||
|
c = 'L-' + slug(label)
|
||||||
|
report['synthesised_code'].append(label)
|
||||||
|
return 'law', c
|
||||||
|
|
||||||
|
INTRA = ('savstarpējie transferti', 'no valsts pamatbudžeta uz valsts pamatbudžetu', 'no valsts speciālā budžeta uz valsts speciālo budžetu',
|
||||||
|
'atmaksām valsts pamatbudžet', 'atmaksa valsts budžetā par veiktajiem', 'valsts pamatbudžeta iestāžu saņemtie transferti no valsts pamatbudžeta',
|
||||||
|
'pārējie valsts pamatbudžetā saņemtie transferti no valsts pamatbudžeta', 'valsts speciālā budžeta iestāžu saņemtie transferti no valsts speciālā budžeta')
|
||||||
|
def is_intra(name):
|
||||||
|
n = norm(name)
|
||||||
|
return any(norm(k) in n for k in INTRA)
|
||||||
|
|
||||||
|
VOTE_WEIGHT = {'a2': 1, 'a3': 1, 'a4': 1, 'a5': 1, 'a11': 0}
|
||||||
|
CUR_ANNEX = ['a4']
|
||||||
|
def register_class(sch, code, name, parent):
|
||||||
|
k = (sch, code)
|
||||||
|
d = classitems.setdefault(k, {'name': name, 'parent': None, 'votes': collections.Counter()})
|
||||||
|
w = VOTE_WEIGHT.get(CUR_ANNEX[0], 1)
|
||||||
|
if w:
|
||||||
|
d['votes'][parent] += w
|
||||||
|
|
||||||
|
def structural_ok(child, parent):
|
||||||
|
"""Numeric classification codes carry their own hierarchy: 21200 cannot sit under 21100, 7131 can sit under 7130."""
|
||||||
|
cs, cc = child.split(':', 1)
|
||||||
|
ps, pc = parent.split(':', 1)
|
||||||
|
if not (cc.isdigit() and pc.isdigit() and cs == ps and len(cc) == len(pc)):
|
||||||
|
return True
|
||||||
|
stem = pc.rstrip('0')
|
||||||
|
return cc != pc and cc.startswith(stem)
|
||||||
|
|
||||||
|
def finalize_classes():
|
||||||
|
"""Canonical parent = majority vote over indented annex blocks, restricted to structurally possible parents."""
|
||||||
|
for k, d in classitems.items():
|
||||||
|
votes = d['votes']
|
||||||
|
ck = f'{k[0]}:{k[1]}'
|
||||||
|
real = [(p, n) for p, n in votes.most_common() if p and structural_ok(ck, p)]
|
||||||
|
rejected = [p for p in votes if p and not structural_ok(ck, p)]
|
||||||
|
if rejected:
|
||||||
|
report['parent_rejected_by_structure'].append(f'{ck} {d["name"][:40]}: not under {rejected}')
|
||||||
|
d['parent'] = real[0][0] if real and (not votes.get(None) or real[0][1] >= votes[None] or rejected) else None
|
||||||
|
if len(real) > 1:
|
||||||
|
report['class_parent_votes'].append(f'{k[0]}:{k[1]} {d["name"][:50]} votes {dict(votes)} -> {d["parent"]}')
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ actors and purposes
|
||||||
|
actors, purposes = {}, {}
|
||||||
|
VPK_RESORTS = {l.split('\t')[0] for l in open(os.path.join(KODI, 'vpk_resorts.tsv'), encoding='utf-8') if l.strip()}
|
||||||
|
def resort_actor(code, name):
|
||||||
|
aid = f'{BID}.ac.r{code}'
|
||||||
|
vpk = f'{code}-0000' if f'{code}-0000' in VPK_RESORTS else None
|
||||||
|
actors.setdefault(aid, {'kind': 'resort', 'code': code, 'name': name, 'vpk': vpk})
|
||||||
|
pid = f'{BID}.pr.{code}'
|
||||||
|
purposes.setdefault(pid, {'kind': 'resort', 'code': code, 'name': name, 'holder': aid})
|
||||||
|
return aid, pid
|
||||||
|
|
||||||
|
def prog_purpose(rcode, pcode, name, function, parent_pid):
|
||||||
|
pid = f'{BID}.pr.{rcode}.{pcode}'
|
||||||
|
kind = 'programme' if pcode.endswith('.00.00') else 'subprogramme'
|
||||||
|
d = purposes.setdefault(pid, {'kind': kind, 'code': pcode, 'name': name, 'parent': parent_pid,
|
||||||
|
'holder': f'{BID}.ac.r{rcode}', 'function': function})
|
||||||
|
if function and not d.get('function'):
|
||||||
|
d['function'] = function
|
||||||
|
return pid
|
||||||
|
|
||||||
|
def project_purpose(rcode, pcode, projcode, name, parent_pid):
|
||||||
|
pid = f'{BID}.pj.{rcode}.{pcode or "x"}.{slug(projcode, 60)}'
|
||||||
|
purposes.setdefault(pid, {'kind': 'project', 'code': projcode, 'name': name, 'parent': parent_pid,
|
||||||
|
'holder': f'{BID}.ac.r{rcode}'})
|
||||||
|
return pid
|
||||||
|
|
||||||
|
def municipality(name):
|
||||||
|
aid = f'{BID}.ac.m-{slug(name)}'
|
||||||
|
actors.setdefault(aid, {'kind': 'municipality', 'name': name})
|
||||||
|
return aid
|
||||||
|
|
||||||
|
# block (core/eu) per subprogramme, from Valsts kase execution data; fallback by code range
|
||||||
|
blockmap = {}
|
||||||
|
for line in open(os.path.join(KODI, 'vk_blocks.tsv'), encoding='utf-8'):
|
||||||
|
g, m, p, sp, blk, bt, n = line.rstrip('\n').split('\t')
|
||||||
|
if int(g) in (YEAR, YEAR - 1):
|
||||||
|
blockmap.setdefault((m, sp), 'eu' if blk.startswith('Ārvalstu') else 'core')
|
||||||
|
def block_of(rcode, pcode):
|
||||||
|
b = blockmap.get((rcode, pcode))
|
||||||
|
if b:
|
||||||
|
return b
|
||||||
|
report['block_fallback'].append(f'{rcode} {pcode}')
|
||||||
|
return 'eu' if pcode[:2] in ('60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85') else 'core'
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ outputs
|
||||||
|
allocs, checks = [], []
|
||||||
|
blockcodes = collections.defaultdict(lambda: collections.defaultdict(set)) # block id -> flow -> printed codes
|
||||||
|
def register_block(bid, lines):
|
||||||
|
for ln in lines:
|
||||||
|
if not ln.get('skip') and not ln.get('section') and ln.get('flow') not in (None, 'balance'):
|
||||||
|
blockcodes[bid][ln['flow']].add(f"{ln['scheme']}:{ln['code']}")
|
||||||
|
_alloc_ids = collections.Counter()
|
||||||
|
def add_alloc(**a):
|
||||||
|
"""Allocation id = source annex + source row + year (+ 'l' for 'later years' column, + -N if the same cell yields several facts).
|
||||||
|
Derived from the source, so re-parsing the same law gives the same ids."""
|
||||||
|
base = f'{BID}.a.{a.pop("srcAnnex")}.r{a.get("srcRow", 0)}.y{a["year"]}{"l" if a.get("untilEnd") else ""}'
|
||||||
|
_alloc_ids[base] += 1
|
||||||
|
a['id'] = base if _alloc_ids[base] == 1 else f'{base}-{_alloc_ids[base]}'
|
||||||
|
allocs.append(a)
|
||||||
|
return a['id']
|
||||||
|
|
||||||
|
def add_check(annex, row, value, **sel):
|
||||||
|
checks.append({'annex': annex, 'row': row, 'value': value, 'sel': sel})
|
||||||
|
|
||||||
|
pending = [] # (bid, flow, ck, alloc kwargs) for lines of detailed blocks; leafness decided on the canonical tree
|
||||||
|
def queue_alloc(_bid, _flow, _ck, **kw):
|
||||||
|
pending.append((_bid, _flow, _ck, kw))
|
||||||
|
|
||||||
|
def canon_chain(ck, parent):
|
||||||
|
out, k = [], ck
|
||||||
|
while k and k not in out:
|
||||||
|
out.append(k)
|
||||||
|
k = parent.get(k)
|
||||||
|
return out
|
||||||
|
|
||||||
|
def finalize_lines():
|
||||||
|
parent = {f'{k[0]}:{k[1]}': v['parent'] for k, v in classitems.items() if v['parent']}
|
||||||
|
below = {} # (bid, flow, ck) -> printed codes in that block whose canonical chain contains ck
|
||||||
|
for bid, fl in blockcodes.items():
|
||||||
|
for flow, codes in fl.items():
|
||||||
|
for c in codes:
|
||||||
|
for anc in canon_chain(c, parent):
|
||||||
|
if anc in codes:
|
||||||
|
below.setdefault((bid, flow, anc), []).append(c)
|
||||||
|
for c in checks:
|
||||||
|
r = c['sel'].get('codes')
|
||||||
|
if isinstance(r, dict) and 'resolve' in r:
|
||||||
|
bid, flow, ck = r['resolve']
|
||||||
|
c['sel']['codes'] = sorted(set(below.get((bid, flow, ck), [ck])) | {ck})
|
||||||
|
for bid, flow, ck, kw in pending:
|
||||||
|
if len(set(below.get((bid, flow, ck), [ck])) - {ck}) == 0:
|
||||||
|
add_alloc(**kw)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ generic tree-annex reader
|
||||||
|
def tree_blocks(rows, label_col, amount_cols, header_fn, level_fn):
|
||||||
|
"""Split rows into blocks keyed by header path; each block has lines with level, flow, amounts."""
|
||||||
|
blocks, path, cur = [], {}, None
|
||||||
|
for r in rows:
|
||||||
|
cells = r['cells']
|
||||||
|
h = header_fn(r, path)
|
||||||
|
if h:
|
||||||
|
path = h
|
||||||
|
cur = {'path': dict(path), 'lines': []}
|
||||||
|
blocks.append(cur)
|
||||||
|
continue
|
||||||
|
label = str(cells[label_col]) if len(cells) > label_col else ''
|
||||||
|
amts = {}
|
||||||
|
for y, ci in amount_cols.items():
|
||||||
|
v = num(cells[ci]) if ci < len(cells) else None
|
||||||
|
if v is not None:
|
||||||
|
amts[y] = v
|
||||||
|
if not label or not amts:
|
||||||
|
continue
|
||||||
|
if cur is None:
|
||||||
|
cur = {'path': dict(path), 'lines': []}
|
||||||
|
blocks.append(cur)
|
||||||
|
cur['lines'].append({'row': r['row'], 'label': label, 'level': level_fn(r, label), 'amounts': amts})
|
||||||
|
return blocks
|
||||||
|
|
||||||
|
def resolve_lines(block):
|
||||||
|
"""Assign flow, code and parent code to every line; mark leaves (no deeper line follows in the same section)."""
|
||||||
|
lines, flow, stack = block['lines'], None, []
|
||||||
|
for i, ln in enumerate(lines):
|
||||||
|
n = norm(ln['label'])
|
||||||
|
if n in SECTION:
|
||||||
|
flow = SECTION[n]
|
||||||
|
ln.update(flow=flow, section=True, scheme='law', code='S-' + flow, leaf=False)
|
||||||
|
stack = [(ln['level'], ln)]
|
||||||
|
continue
|
||||||
|
if flow is None:
|
||||||
|
ln.update(flow=None, skip=True)
|
||||||
|
continue
|
||||||
|
while stack and stack[-1][0] >= ln['level']:
|
||||||
|
stack.pop()
|
||||||
|
parent = stack[-1][1] if stack else None
|
||||||
|
sch, code = code_for(ln['label'], flow)
|
||||||
|
ln.update(flow=flow, scheme=sch, code=code, section=False)
|
||||||
|
if parent is not None and not parent.get('section'):
|
||||||
|
register_class(sch, code, ln['label'], f'{parent["scheme"]}:{parent["code"]}')
|
||||||
|
else:
|
||||||
|
register_class(sch, code, ln['label'], None)
|
||||||
|
stack.append((ln['level'], ln))
|
||||||
|
for i, ln in enumerate(lines):
|
||||||
|
if ln.get('skip'):
|
||||||
|
continue
|
||||||
|
desc = [] if ln.get('section') else [f"{ln['scheme']}:{ln['code']}"]
|
||||||
|
for x in lines[i + 1:]:
|
||||||
|
if x.get('skip'):
|
||||||
|
continue
|
||||||
|
if x.get('section') or x['level'] <= ln['level'] or x.get('flow') != ln.get('flow'):
|
||||||
|
break
|
||||||
|
desc.append(f"{x['scheme']}:{x['code']}")
|
||||||
|
ln['codes'] = desc
|
||||||
|
for i, ln in enumerate(lines):
|
||||||
|
if ln.get('section') or ln.get('skip'):
|
||||||
|
continue
|
||||||
|
nxt = next((x for x in lines[i + 1:] if not x.get('skip')), None)
|
||||||
|
ln['leaf'] = nxt is None or nxt.get('section') or nxt['level'] <= ln['level'] or nxt.get('flow') != ln['flow']
|
||||||
|
return lines
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ annex 4 and 5 (2026 appropriations by subprogramme)
|
||||||
|
label_levels = collections.defaultdict(collections.Counter) # (flow, normlabel) -> relative level counts, learned for annex 11
|
||||||
|
|
||||||
|
def parse_programmes(n, fund):
|
||||||
|
CUR_ANNEX[0] = f'a{n}'
|
||||||
|
path_ = annex_file(n)
|
||||||
|
rows = read_rows(path_, label_col=2)
|
||||||
|
progs_seen = {}
|
||||||
|
def header(r, path):
|
||||||
|
c = r['cells']
|
||||||
|
lab = str(c[2]) if len(c) > 2 else ''
|
||||||
|
m = re.match(r'^(\d{2})\.?\s+(\D.+)$', lab)
|
||||||
|
if m and num(c[3] if len(c) > 3 else '') is None:
|
||||||
|
aid, pid = resort_actor(m.group(1), m.group(2))
|
||||||
|
return {'resort': m.group(1), 'rpid': pid}
|
||||||
|
code = str(c[0])
|
||||||
|
if re.fullmatch(r'\d{2}\.\d{2}\.\d{2}', code) and 'resort' in path:
|
||||||
|
rc = path['resort']
|
||||||
|
parent = path['rpid']
|
||||||
|
pcode = code
|
||||||
|
if not code.endswith('.00.00'):
|
||||||
|
pp = code[:2] + '.00.00'
|
||||||
|
if (rc, pp) in progs_seen:
|
||||||
|
parent = progs_seen[(rc, pp)]
|
||||||
|
func = str(c[1]) if re.fullmatch(r'\d{2}\.\d{3}', str(c[1])) else None
|
||||||
|
pid = prog_purpose(rc, pcode, lab, func, parent)
|
||||||
|
progs_seen[(rc, pcode)] = pid
|
||||||
|
return {'resort': rc, 'rpid': path['rpid'], 'pcode': pcode, 'pid': pid, 'parent': parent, 'func': func}
|
||||||
|
return None
|
||||||
|
blocks = tree_blocks(rows, 2, {YEAR: 3}, header, lambda r, lab: r['indent'])
|
||||||
|
# leaf blocks: subprogrammes, or programmes without subprogrammes
|
||||||
|
has_child = set(b['path'].get('parent') for b in blocks if b['path'].get('pcode'))
|
||||||
|
for bi, b in enumerate(blocks):
|
||||||
|
lines = resolve_lines(b)
|
||||||
|
bid = f'a{n}:{bi}'
|
||||||
|
register_block(bid, lines)
|
||||||
|
p = b['path']
|
||||||
|
if 'pid' in p:
|
||||||
|
sel_purpose = p['pid']
|
||||||
|
elif 'rpid' in p:
|
||||||
|
sel_purpose = p['rpid']
|
||||||
|
else:
|
||||||
|
sel_purpose = None
|
||||||
|
leafblock = 'pid' in p and p['pid'] not in has_child
|
||||||
|
blk = block_of(p['resort'], p['pcode']) if 'pcode' in p else None
|
||||||
|
# learn relative levels for annex 11
|
||||||
|
base = None
|
||||||
|
for ln in lines:
|
||||||
|
if ln.get('section'):
|
||||||
|
base = ln['level']
|
||||||
|
elif not ln.get('skip') and base is not None:
|
||||||
|
label_levels[(ln['flow'], norm(ln['label']))][ln['level'] - base] += 1
|
||||||
|
for ln in lines:
|
||||||
|
if ln.get('skip') or ln['flow'] == 'balance':
|
||||||
|
if ln.get('flow') == 'balance' or ln.get('section') and ln['flow'] == 'balance':
|
||||||
|
add_check(n, ln['row'], ln['amounts'][YEAR], kind='balance', fund=fund, year=YEAR, purpose=sel_purpose, nature='appropriation', blk=bid)
|
||||||
|
continue
|
||||||
|
nature = 'forecast' if ln['flow'] == 'revenue' and fund == 'basic' else 'appropriation'
|
||||||
|
if fund == 'special' and ln['flow'] == 'revenue':
|
||||||
|
nature = 'forecast'
|
||||||
|
add_check(n, ln['row'], ln['amounts'][YEAR], fund=fund, flow=ln['flow'], year=YEAR, purpose=sel_purpose,
|
||||||
|
code=None if ln.get('section') else f"{ln['scheme']}:{ln['code']}", codes=None if ln.get('section') else {'resolve': [bid, ln['flow'], f"{ln['scheme']}:{ln['code']}"]}, nature=nature, blk=bid)
|
||||||
|
store = leafblock and not ln.get('section')
|
||||||
|
if fund == 'basic' and ln['flow'] == 'revenue':
|
||||||
|
store = False # basic-budget revenue is stored from annex 2
|
||||||
|
if store:
|
||||||
|
queue_alloc(bid, ln['flow'], f"{ln['scheme']}:{ln['code']}", srcAnnex=f'p{n:02d}', flow=ln['flow'], fund=fund, nature=nature, year=YEAR,
|
||||||
|
holder=f'{BID}.ac.r{p["resort"]}', purpose=p['pid'], block=blk, function=p.get('func'),
|
||||||
|
scheme=ln['scheme'], code=ln['code'], amount=ln['amounts'][YEAR],
|
||||||
|
src=f'{BID}.src.p{n:02d}', srcRow=ln['row'])
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ annex 2 (revenue forecasts, 3 years)
|
||||||
|
def parse_revenue():
|
||||||
|
CUR_ANNEX[0] = 'a2'
|
||||||
|
raw = read_rows(annex_file(2), label_col=0)
|
||||||
|
# the label column differs between years (2025 .xls has an extra empty first column): find it from the header row
|
||||||
|
lc = next((i for r in raw for i, c in enumerate(r['cells']) if str(c).startswith('Ieņēmumu avots')), 0)
|
||||||
|
rows = read_rows(annex_file(2), label_col=lc) if lc else raw
|
||||||
|
part, fund, mode = None, 'basic', 'tree'
|
||||||
|
lines, fees, info = [], [], []
|
||||||
|
cur_resort = None
|
||||||
|
for r in rows:
|
||||||
|
c = r['cells']
|
||||||
|
lab = str(c[lc]) if lc < len(c) else ''
|
||||||
|
if re.match(r'^I\.\s', lab):
|
||||||
|
fund, mode = 'basic', 'tree'; continue
|
||||||
|
if re.match(r'^II\.\s', lab):
|
||||||
|
fund, mode = 'special', 'tree'; continue
|
||||||
|
if lab.startswith('Ministrija (cita'):
|
||||||
|
mode = 'fees'; continue
|
||||||
|
if lab.startswith('Informatīvi'):
|
||||||
|
mode = 'info'; continue
|
||||||
|
amts = {y: num(c[lc + 1 + i]) for i, y in enumerate(Y3) if lc + 1 + i < len(c) and num(c[lc + 1 + i]) is not None}
|
||||||
|
if not amts or not lab:
|
||||||
|
continue
|
||||||
|
if mode == 'tree':
|
||||||
|
lines.append({'row': r['row'], 'label': lab, 'level': r['indent'], 'amounts': amts, 'fund': fund})
|
||||||
|
elif mode == 'fees':
|
||||||
|
fees.append({'row': r['row'], 'label': lab, 'level': r['indent'], 'bold': r['bold'], 'amounts': amts})
|
||||||
|
else:
|
||||||
|
info.append({'row': r['row'], 'label': lab, 'amounts': amts})
|
||||||
|
stored = {}
|
||||||
|
for fund in ('basic', 'special'):
|
||||||
|
blk = {'lines': [dict(l) for l in lines if l['fund'] == fund]}
|
||||||
|
resolve_lines(blk)
|
||||||
|
register_block(f'a2:{fund}', blk['lines'])
|
||||||
|
for ln in blk['lines']:
|
||||||
|
if ln.get('skip'):
|
||||||
|
continue
|
||||||
|
for y, v in ln['amounts'].items():
|
||||||
|
add_check(2, ln['row'], v, fund=fund, flow='revenue', year=y, nature='forecast', label=ln['label'],
|
||||||
|
code=None if ln.get('section') else f"{ln['scheme']}:{ln['code']}", codes=ln.get('codes'), blk=f'a2:{fund}')
|
||||||
|
if ln.get('leaf') and not ln.get('section'):
|
||||||
|
if fund == 'special' and y == YEAR:
|
||||||
|
continue # 2026 special revenue is stored from annex 5 (by subprogramme)
|
||||||
|
aid = add_alloc(srcAnnex='p02', flow='revenue', fund=fund, nature='forecast', year=y,
|
||||||
|
holder=None, purpose=None, scheme=ln['scheme'], code=ln['code'], amount=v,
|
||||||
|
src=f'{BID}.src.p02', srcRow=ln['row'])
|
||||||
|
stored[(fund, ln['code'], y)] = aid
|
||||||
|
# fees by administering resort: a breakdown of stored revenue leaves -> partOf
|
||||||
|
leaf_codes = sorted({k[1] for k in stored if k[0] == 'basic'}, key=len, reverse=True)
|
||||||
|
for f in fees:
|
||||||
|
n_ = norm(f['label'])
|
||||||
|
if n_.startswith('ieņēmumi valsts pamatbudžetā kopā'):
|
||||||
|
for y, v in f['amounts'].items():
|
||||||
|
add_check(2, f['row'], v, kind='fees_total', year=y)
|
||||||
|
continue
|
||||||
|
if f['bold']:
|
||||||
|
name = f['label']
|
||||||
|
m = [a for a, d in actors.items() if d['kind'] == 'resort' and norm(d['name']) == n_]
|
||||||
|
cur_resort = m[0] if m else None
|
||||||
|
if not cur_resort:
|
||||||
|
report['fee_resort_unmatched'].append(f['label'])
|
||||||
|
for y, v in f['amounts'].items():
|
||||||
|
add_check(2, f['row'], v, kind='fees_resort', holder=cur_resort, year=y)
|
||||||
|
continue
|
||||||
|
sch, code = code_for(f['label'], 'revenue')
|
||||||
|
register_class(sch, code, f['label'], None)
|
||||||
|
parent = next((stored[('basic', lc, y0)] for lc in leaf_codes for y0 in [YEAR] if code.startswith(lc.rstrip('0') or lc) and ('basic', lc, YEAR) in stored), None)
|
||||||
|
if parent is None:
|
||||||
|
report['fee_parent_unmatched'].append(f'{code} {f["label"][:60]}')
|
||||||
|
for y, v in f['amounts'].items():
|
||||||
|
par = None
|
||||||
|
if parent:
|
||||||
|
pc = next(k for k, a in stored.items() if a == parent)[1]
|
||||||
|
par = stored.get(('basic', pc, y))
|
||||||
|
add_alloc(srcAnnex='p02', flow='revenue', fund='basic', nature='forecast', year=y, holder=cur_resort,
|
||||||
|
purpose=None, scheme=sch, code=code, amount=v, partOf=par, src=f'{BID}.src.p02', srcRow=f['row'])
|
||||||
|
for i in info:
|
||||||
|
for y, v in i['amounts'].items():
|
||||||
|
params.append({'id': f'{BID}.par.p02-{i["row"]}-{y}', 'name': i['label'], 'year': y, 'value': v, 'unit': 'EUR',
|
||||||
|
'src': f'{BID}.src.p02'})
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ annex 3 (resort summaries, 3 years; 2027-28 stored as ceilings)
|
||||||
|
def parse_resort_summary():
|
||||||
|
CUR_ANNEX[0] = 'a3'
|
||||||
|
rows = read_rows(annex_file(3), label_col=0)
|
||||||
|
fund_names = {'valsts pamatbudžets': 'basic', 'valsts speciālais budžets': 'special'}
|
||||||
|
def header(r, path):
|
||||||
|
lab = str(r['cells'][0])
|
||||||
|
n_ = norm(lab)
|
||||||
|
if num(r['cells'][1] if len(r['cells']) > 1 else '') is not None:
|
||||||
|
return None
|
||||||
|
if n_ in fund_names:
|
||||||
|
p = {k: v for k, v in path.items() if k in ('resort', 'rpid')}
|
||||||
|
p['fund'] = fund_names[n_]
|
||||||
|
return p
|
||||||
|
m = re.match(r'^(\d{2})\.?\s+(\D.+)$', lab)
|
||||||
|
if m:
|
||||||
|
aid, pid = resort_actor(m.group(1), m.group(2))
|
||||||
|
return {'resort': m.group(1), 'rpid': pid, 'fund': 'basic'}
|
||||||
|
if re.match(r'^I\.\s+Valsts pamatfunkciju', lab):
|
||||||
|
p = {k: v for k, v in path.items() if k != 'block'}; p['block'] = 'core'; return p
|
||||||
|
if re.match(r'^II\.\s+ES politiku', lab):
|
||||||
|
p = {k: v for k, v in path.items() if k != 'block'}; p['block'] = 'eu'; return p
|
||||||
|
return None
|
||||||
|
blocks = tree_blocks(rows, 0, {Y3[0]: 1, Y3[1]: 2, Y3[2]: 3}, header, lambda r, lab: r['indent'])
|
||||||
|
keys = [(b['path'].get('resort'), b['path'].get('fund')) for b in blocks]
|
||||||
|
for bi, b in enumerate(blocks):
|
||||||
|
lines = resolve_lines(b)
|
||||||
|
bid = f'a3:{bi}'
|
||||||
|
register_block(bid, lines)
|
||||||
|
p = b['path']
|
||||||
|
fund = p.get('fund', 'basic')
|
||||||
|
# a resort's special-budget part may appear without its own fund header: detect by section content later
|
||||||
|
leafblock = 'resort' in p and 'block' in p
|
||||||
|
sel = dict(fund=fund, purpose=p.get('rpid'), block=p.get('block'), blk=bid, holderView=True)
|
||||||
|
for ln in lines:
|
||||||
|
if ln.get('skip'):
|
||||||
|
continue
|
||||||
|
for y, v in ln['amounts'].items():
|
||||||
|
if ln['flow'] == 'balance':
|
||||||
|
add_check(3, ln['row'], v, kind='balance', year=y, nature='appropriation' if y == YEAR else 'ceiling', **sel)
|
||||||
|
continue
|
||||||
|
nature = 'forecast' if ln['flow'] == 'revenue' else ('appropriation' if y == YEAR else 'ceiling')
|
||||||
|
add_check(3, ln['row'], v, flow=ln['flow'], year=y, nature=nature,
|
||||||
|
code=None if ln.get('section') else f"{ln['scheme']}:{ln['code']}", codes=None if ln.get('section') else {'resolve': [bid, ln['flow'], f"{ln['scheme']}:{ln['code']}"]}, **sel)
|
||||||
|
if leafblock and not ln.get('section') and y != YEAR and ln['flow'] != 'revenue':
|
||||||
|
queue_alloc(bid, ln['flow'], f"{ln['scheme']}:{ln['code']}", srcAnnex='p03', flow=ln['flow'], fund=fund, nature='ceiling', year=y,
|
||||||
|
holder=f'{BID}.ac.r{p["resort"]}', purpose=p['rpid'], block=p['block'],
|
||||||
|
scheme=ln['scheme'], code=ln['code'], amount=v, src=f'{BID}.src.p03', srcRow=ln['row'])
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ annex 11 (long-term commitments)
|
||||||
|
def parse_commitments():
|
||||||
|
CUR_ANNEX[0] = 'a11'
|
||||||
|
rows = read_rows(annex_file(11), label_col=1)
|
||||||
|
hdr = next(r for r in rows if 'Projekta kods' in [str(x) for x in r['cells']])
|
||||||
|
years = {}
|
||||||
|
for i, c in enumerate(hdr['cells']):
|
||||||
|
m = re.match(r'^(\d{4})\.', str(c))
|
||||||
|
if m:
|
||||||
|
years[int(m.group(1))] = i
|
||||||
|
elif str(c).startswith('Tālākā'):
|
||||||
|
years['later'] = i
|
||||||
|
last = max(y for y in years if y != 'later')
|
||||||
|
kinds = {}
|
||||||
|
def level_fn(r, lab):
|
||||||
|
cnt = None
|
||||||
|
for fl in ('expenditure', 'resource', 'financing', 'revenue'):
|
||||||
|
c = label_levels.get((fl, norm(lab)))
|
||||||
|
if c:
|
||||||
|
cnt = c.most_common(1)[0][0] + 1
|
||||||
|
break
|
||||||
|
if cnt is None and norm(lab) not in SECTION:
|
||||||
|
report['a11_level_unknown'].append(lab)
|
||||||
|
return 99
|
||||||
|
return cnt or 0
|
||||||
|
progs_seen = {}
|
||||||
|
state = {'prev_header': None}
|
||||||
|
def header(r, path):
|
||||||
|
h = _header(r, path)
|
||||||
|
state['prev_header'] = h is not None and h.get('_kindable', False)
|
||||||
|
if h is not None:
|
||||||
|
h.pop('_kindable', None)
|
||||||
|
return h
|
||||||
|
def _header(r, path):
|
||||||
|
c = r['cells']
|
||||||
|
lab = str(c[1]) if len(c) > 1 else ''
|
||||||
|
if any(num(c[i]) is not None for i in years.values() if i < len(c)):
|
||||||
|
return None
|
||||||
|
if lab.upper().startswith('VALSTS PAMATBUDŽETS'):
|
||||||
|
return {'fund': 'basic'}
|
||||||
|
if lab.upper().startswith('VALSTS SPECIĀLAIS BUDŽETS'):
|
||||||
|
return {'fund': 'special'}
|
||||||
|
m = re.match(r'^(\d{10})\s+(.+)$', lab)
|
||||||
|
if m:
|
||||||
|
kinds[m.group(1)] = m.group(2)
|
||||||
|
register_class('commitment', m.group(1), m.group(2), None)
|
||||||
|
if state['prev_header']: # directly under a resort or programme header
|
||||||
|
p = dict(path); p['kind'] = m.group(1)
|
||||||
|
if 'pcode' not in p:
|
||||||
|
p['rkind'] = m.group(1)
|
||||||
|
return p
|
||||||
|
return {'fund': path.get('fund', 'basic'), 'kind': m.group(1), 'topkind': m.group(1)} # new top-level commitment-kind section
|
||||||
|
m = re.match(r'^(\d{2})\.?\s+(\D.+)$', lab)
|
||||||
|
if m:
|
||||||
|
aid, pid = resort_actor(m.group(1), m.group(2))
|
||||||
|
return {'fund': path.get('fund', 'basic'), 'resort': m.group(1), 'rpid': pid, '_kindable': True,
|
||||||
|
'topkind': path.get('topkind'), 'kind': path.get('topkind')}
|
||||||
|
code = str(c[0])
|
||||||
|
if re.fullmatch(r'\d{2}\.\d{2}\.\d{2}', code) and 'resort' in path:
|
||||||
|
rc = path['resort']
|
||||||
|
pid = f'{BID}.pr.{rc}.{code}'
|
||||||
|
if pid not in purposes:
|
||||||
|
parent = purposes.get(f'{BID}.pr.{rc}.{code[:2]}.00.00') and f'{BID}.pr.{rc}.{code[:2]}.00.00' or path['rpid']
|
||||||
|
prog_purpose(rc, code, lab, None, parent)
|
||||||
|
report['a11_new_programme'].append(f'{rc} {code} {lab[:50]}')
|
||||||
|
p = {k: v for k, v in path.items() if k in ('fund', 'resort', 'rpid', 'topkind', 'rkind')}
|
||||||
|
p.update(pcode=code, pid=pid, _kindable=True, kind=path.get('rkind') or path.get('topkind'))
|
||||||
|
return p
|
||||||
|
proj = str(c[2]) if len(c) > 2 else ''
|
||||||
|
if proj and 'resort' in path:
|
||||||
|
parent = path.get('pid') or path['rpid']
|
||||||
|
pj = project_purpose(path['resort'], path.get('pcode'), proj, lab, parent)
|
||||||
|
p = dict(path); p['project'] = proj; p['pjid'] = pj
|
||||||
|
return p
|
||||||
|
return None
|
||||||
|
amount_cols = {y: i for y, i in years.items()}
|
||||||
|
blocks = tree_blocks(rows, 1, amount_cols, header, level_fn)
|
||||||
|
|
||||||
|
def more_specific(k2, k): # commitment kind k2 is a sub-type of k (or equal); codes nest in 2-digit groups
|
||||||
|
from calc import kind_stem
|
||||||
|
if not k:
|
||||||
|
return True
|
||||||
|
return bool(k2 and k2.startswith(kind_stem(k)))
|
||||||
|
def refined(bi):
|
||||||
|
"""A detailed block is refined (not a leaf) if, within the same resort+programme, a later or earlier block adds
|
||||||
|
a project under a compatible kind, or shows the same project under a more specific kind."""
|
||||||
|
p = blocks[bi]['path']
|
||||||
|
for j, b2 in enumerate(blocks):
|
||||||
|
if j == bi:
|
||||||
|
continue
|
||||||
|
q = b2['path']
|
||||||
|
if q.get('resort') != p.get('resort') or q.get('fund') != p.get('fund') or not q.get('pcode'):
|
||||||
|
continue
|
||||||
|
if q['pcode'] != p.get('pcode'):
|
||||||
|
# a programme block is refined by its subprogramme blocks (same resort, same programme number)
|
||||||
|
if (p.get('pcode') or '').endswith('.00.00') and q['pcode'][:2] == p['pcode'][:2] and not q['pcode'].endswith('.00.00') \
|
||||||
|
and not p.get('project') and more_specific(q.get('kind'), p.get('kind')):
|
||||||
|
return True
|
||||||
|
continue
|
||||||
|
if not p.get('project') and q.get('project') and more_specific(q.get('kind'), p.get('kind')):
|
||||||
|
return True
|
||||||
|
if p.get('project') and q.get('project') == p['project'] and q.get('kind') != p.get('kind') and more_specific(q.get('kind'), p.get('kind')):
|
||||||
|
return True
|
||||||
|
if not p.get('project') and not q.get('project') and q.get('kind') != p.get('kind') and more_specific(q.get('kind'), p.get('kind')):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
# leaf blocks: those whose path is not extended by a later block
|
||||||
|
def key(p):
|
||||||
|
return (p.get('fund'), p.get('kind'), p.get('resort'), p.get('pcode'), p.get('project'))
|
||||||
|
keys = [key(b['path']) for b in blocks]
|
||||||
|
def extends(a, b): # b is strictly more specific than a
|
||||||
|
return a != b and all(x is None or x == y or (i == 1 and x and y and y.startswith(x.rstrip('0'))) for i, (x, y) in enumerate(zip(a, b)))
|
||||||
|
for bi, b in enumerate(blocks):
|
||||||
|
lines = resolve_lines(b)
|
||||||
|
bid = f'a11:{bi}'
|
||||||
|
register_block(bid, lines)
|
||||||
|
p = b['path']
|
||||||
|
leafblock = bool(p.get('pcode')) and not refined(bi)
|
||||||
|
sel = dict(fund=p.get('fund', 'basic'), ckind=p.get('kind'), purpose=p.get('pjid') or p.get('pid') or p.get('rpid'), blk=bid)
|
||||||
|
for ln in lines:
|
||||||
|
if ln.get('skip'):
|
||||||
|
continue
|
||||||
|
for y, v in ln['amounts'].items():
|
||||||
|
yy, until = (last + 1, True) if y == 'later' else (y, False)
|
||||||
|
if ln['flow'] == 'balance':
|
||||||
|
add_check(11, ln['row'], v, kind='balance', year=yy, untilEnd=until, nature='commitment', **sel)
|
||||||
|
continue
|
||||||
|
add_check(11, ln['row'], v, flow=ln['flow'], year=yy, untilEnd=until, nature='commitment',
|
||||||
|
code=None if ln.get('section') else f"{ln['scheme']}:{ln['code']}", codes=None if ln.get('section') else {'resolve': [bid, ln['flow'], f"{ln['scheme']}:{ln['code']}"]}, **sel)
|
||||||
|
if leafblock and not ln.get('section') and v != 0:
|
||||||
|
queue_alloc(bid, ln['flow'], f"{ln['scheme']}:{ln['code']}", srcAnnex='p11', flow=ln['flow'], fund=sel['fund'], nature='commitment', year=yy, untilEnd=until,
|
||||||
|
holder=f'{BID}.ac.r{p["resort"]}' if p.get('resort') else None,
|
||||||
|
purpose=sel['purpose'], commitmentKind=p.get('kind'),
|
||||||
|
scheme=ln['scheme'], code=ln['code'], amount=v, src=f'{BID}.src.p11', srcRow=ln['row'])
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ annexes 6-10 (earmarked grants to municipalities)
|
||||||
|
def parse_grants(n):
|
||||||
|
path_ = annex_file(n)
|
||||||
|
t = docx_tables(path_)[-1]
|
||||||
|
title = next((r[0] for r in t if r and len(r[0]) > 40), f'{n}. pielikums')
|
||||||
|
gid = f'{BID}.pr.g{n:02d}'
|
||||||
|
purposes[gid] = {'kind': 'grant', 'code': f'P{n:02d}', 'name': title}
|
||||||
|
period = (f'{YEAR}-01-01', f'{YEAR}-12-31')
|
||||||
|
cols = None
|
||||||
|
for ri, r in enumerate(t):
|
||||||
|
first = r[0] if r else ''
|
||||||
|
m = re.match(r'^(I{1,2})\.\s', first)
|
||||||
|
if m:
|
||||||
|
period = (f'{YEAR}-01-01', f'{YEAR}-08-31') if m.group(1) == 'I' else (f'{YEAR}-09-01', f'{YEAR}-12-31')
|
||||||
|
continue
|
||||||
|
if first.startswith('Pašvaldības'):
|
||||||
|
cols = r; continue
|
||||||
|
vals = [num(x) for x in r[1:]]
|
||||||
|
if not first or not any(v is not None for v in vals):
|
||||||
|
continue
|
||||||
|
n_ = norm(first)
|
||||||
|
if n_ in ('kopā', 'pavisam kopā'):
|
||||||
|
heads_ = [norm(h) for h in (cols or [])[1:]]
|
||||||
|
for ci, v in enumerate(vals):
|
||||||
|
if v is not None:
|
||||||
|
h = heads_[ci] if ci < len(heads_) else ''
|
||||||
|
add_check(n, ri + 1, v, kind='grant_total', purpose=gid, code=f'law:G{n:02d}-{slug(h or "summa", 30) or "summa"}',
|
||||||
|
periodFrom=None if n_ == 'pavisam kopā' else period[0], periodTo=None if n_ == 'pavisam kopā' else period[1], year=YEAR)
|
||||||
|
continue
|
||||||
|
recip = f'{BID}.ac.unallocated' if n_.startswith('nesadalītie') else municipality(first)
|
||||||
|
if recip.endswith('unallocated'):
|
||||||
|
actors[recip] = {'kind': 'unallocated', 'name': 'Nesadalītie līdzekļi'}
|
||||||
|
heads = [norm(h) for h in (cols or [])[1:]]
|
||||||
|
# column roles: 'pavisam kopā' = total; 'tai skaitā …' = part of previous; otherwise the main amount
|
||||||
|
ids = {}
|
||||||
|
total_idx = next((i for i, h in enumerate(heads) if h.startswith('pavisam kopā')), None)
|
||||||
|
main_idx = 0
|
||||||
|
order = ([total_idx] if total_idx is not None else []) + [i for i in range(len(vals)) if i != total_idx]
|
||||||
|
for ci in order:
|
||||||
|
v = vals[ci] if ci < len(vals) else None
|
||||||
|
if v is None:
|
||||||
|
continue
|
||||||
|
h = heads[ci] if ci < len(heads) else ''
|
||||||
|
part = None
|
||||||
|
if h.startswith('tai skaitā'):
|
||||||
|
part = ids.get(ci - 1)
|
||||||
|
elif total_idx is not None and ci != total_idx:
|
||||||
|
part = ids.get(total_idx)
|
||||||
|
aid = add_alloc(srcAnnex=f'p{n:02d}', flow='expenditure', fund='basic', nature='earmarkedGrant', year=YEAR,
|
||||||
|
periodFrom=period[0], periodTo=period[1], recipient=recip, purpose=gid,
|
||||||
|
scheme='law', code=f'G{n:02d}-{slug(h or "summa", 30) or "summa"}', amount=v, partOf=part,
|
||||||
|
src=f'{BID}.src.p{n:02d}', srcRow=ri + 1)
|
||||||
|
register_class('law', f'G{n:02d}-{slug(h or "summa", 30) or "summa"}', (cols[ci + 1] if cols and ci + 1 < len(cols) else 'Summa') or 'Summa', None)
|
||||||
|
ids[ci] = aid
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ annex 1 (consolidated; checks and GDP parameter)
|
||||||
|
params = []
|
||||||
|
def parse_consolidated():
|
||||||
|
rows = read_rows(annex_file(1), label_col=0)
|
||||||
|
hdr = next(r for r in rows if any(re.match(r'^\d{4}\.', str(c)) for c in r['cells']))
|
||||||
|
ycols = {int(re.match(r'^(\d{4})', str(c)).group(1)): i for i, c in enumerate(hdr['cells']) if re.match(r'^\d{4}\.', str(c))}
|
||||||
|
lc = next(i for i, c in enumerate(hdr['cells']) if str(c) == 'Nosaukums')
|
||||||
|
pct = False
|
||||||
|
for r in rows:
|
||||||
|
c = r['cells']
|
||||||
|
lab = str(c[lc]) if lc < len(c) else ''
|
||||||
|
if lab.startswith('Procentos no IKP'):
|
||||||
|
pct = True; continue
|
||||||
|
for y, i in ycols.items():
|
||||||
|
v = num(c[i]) if i < len(c) else None
|
||||||
|
if v is None or not lab:
|
||||||
|
continue
|
||||||
|
if lab.startswith('IKP milj'):
|
||||||
|
params.append({'id': f'{BID}.par.ikp-{y}', 'name': 'IKP prognoze', 'code': 'IKP', 'year': y, 'value': v,
|
||||||
|
'unit': 'milj. EUR', 'src': f'{BID}.src.p01'})
|
||||||
|
continue
|
||||||
|
add_check(1, r['row'], v, kind='a1', label=lab, indent=r['indent'], pct=pct, year=y)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ law text
|
||||||
|
provisions = []
|
||||||
|
def parse_law():
|
||||||
|
s = open(LAW_HTML, encoding='utf-8', errors='replace').read()
|
||||||
|
chapter = None
|
||||||
|
for m in re.finditer(r"<div class='(TV212|TV213)'([^>]*)>(.*?)(?=<div class='TV21[23]'|<div class='TV9|$)", s, re.S):
|
||||||
|
kind, tag, body = m.groups()
|
||||||
|
mm = re.search(r'data-num="(\d+)"', tag)
|
||||||
|
nr = mm.group(1) if mm else None
|
||||||
|
text = body.replace('</p>', '\n').replace('<br />', ' ')
|
||||||
|
text = html.unescape(re.sub(r'<[^>]+>', '', text))
|
||||||
|
text = re.sub(r'[ \t]+', ' ', re.sub(r'\n\s*\n+', '\n', text)).strip()
|
||||||
|
if kind == 'TV212':
|
||||||
|
chapter = re.sub(r'\s+', ' ', text)
|
||||||
|
continue
|
||||||
|
if not nr:
|
||||||
|
continue
|
||||||
|
text = re.sub(r'\n?\d+\s*$', '', text).strip()
|
||||||
|
provisions.append({'id': f'{BID}.p{int(nr):03d}', 'chapter': chapter, 'article': int(nr), 'text': text,
|
||||||
|
'src': f'{BID}.src.law'})
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ run
|
||||||
|
parse_law()
|
||||||
|
parse_programmes(4, 'basic')
|
||||||
|
parse_programmes(5, 'special')
|
||||||
|
parse_revenue()
|
||||||
|
parse_resort_summary()
|
||||||
|
parse_commitments()
|
||||||
|
for g in (6, 7, 8, 9, 10):
|
||||||
|
parse_grants(g)
|
||||||
|
parse_consolidated()
|
||||||
|
finalize_classes()
|
||||||
|
finalize_lines()
|
||||||
|
|
||||||
|
# special budget revenue 2026 belongs to the resort that holds the special budget; annex 2 2027+ special revenue too
|
||||||
|
special_holders = sorted({a['holder'] for a in allocs if a['fund'] == 'special' and a.get('holder')})
|
||||||
|
for a in allocs:
|
||||||
|
if a['fund'] == 'special' and a['flow'] == 'revenue' and not a.get('holder') and len(special_holders) == 1:
|
||||||
|
a['holder'] = special_holders[0]
|
||||||
|
a['purpose'] = a.get('purpose') or f"{BID}.pr.{special_holders[0].rsplit('.r', 1)[1]}"
|
||||||
|
if a['fund'] == 'special' and a['flow'] == 'revenue' and not a.get('block'):
|
||||||
|
a['block'] = 'core' # the special budget (social insurance) is entirely basic functions
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ residuals: amounts the law shows only at an aggregate level
|
||||||
|
purpose_parent = {k: v.get('parent') for k, v in purposes.items()}
|
||||||
|
cls_parent = {f'{k[0]}:{k[1]}': v['parent'] for k, v in classitems.items() if v['parent']}
|
||||||
|
intra_codes = {f'{k[0]}:{k[1]}' for k, v in classitems.items() if is_intra(v['name'])}
|
||||||
|
purpose_holder = {k: v.get('holder') for k, v in purposes.items()}
|
||||||
|
calc = Calc(allocs, purpose_parent, cls_parent, intra_codes, blockcodes, purpose_holder)
|
||||||
|
def depth(p):
|
||||||
|
d = 0
|
||||||
|
while p:
|
||||||
|
d += 1
|
||||||
|
p = purpose_parent.get(p)
|
||||||
|
return d
|
||||||
|
cands = []
|
||||||
|
for c in checks:
|
||||||
|
s_ = c['sel']
|
||||||
|
if c['annex'] not in (3, 4, 5, 11) or s_.get('kind') or not s_.get('code') or not s_.get('codes') or len(s_['codes']) != 1 or s_.get('flow') == 'revenue':
|
||||||
|
continue
|
||||||
|
if c['annex'] == 3 and s_['year'] == YEAR:
|
||||||
|
continue
|
||||||
|
cands.append(c)
|
||||||
|
cands.sort(key=lambda c: (-depth(c['sel'].get('purpose')), c['sel'].get('block') is None, c['annex'] in (3,), c['annex']))
|
||||||
|
nres = collections.Counter()
|
||||||
|
for c in cands:
|
||||||
|
s_ = c['sel']
|
||||||
|
got = calc.total(s_.get('fund'), s_['flow'], s_['year'], s_['nature'], purpose=s_.get('purpose'), block=s_.get('block'),
|
||||||
|
codes=s_['codes'], ckind=s_.get('ckind'), untilEnd=s_.get('untilEnd', False), blk=s_.get('blk'))
|
||||||
|
diff = c['value'] - got
|
||||||
|
if abs(diff) < 0.5:
|
||||||
|
continue
|
||||||
|
if not (s_['flow'] == 'financing' or abs(got) < 0.5):
|
||||||
|
report['unexplained'].append(f"annex {c['annex']} row {c['row']} {s_['code']} {s_.get('purpose')} {s_['year']}: printed {c['value']} children {got}")
|
||||||
|
continue
|
||||||
|
sch, code = s_['code'].split(':', 1)
|
||||||
|
if is_intra(classitems.get((sch, code), {}).get('name', '')) and s_.get('purpose') is None:
|
||||||
|
continue
|
||||||
|
pur = s_.get('purpose')
|
||||||
|
holder = (purposes.get(pur) or {}).get('holder') if pur else None
|
||||||
|
a = dict(srcAnnex=f"p{c['annex']:02d}", flow=s_['flow'], fund=s_.get('fund') or 'basic', nature=s_['nature'], year=s_['year'],
|
||||||
|
untilEnd=s_.get('untilEnd', False), holder=holder, purpose=pur, block=s_.get('block'), commitmentKind=s_.get('ckind'),
|
||||||
|
scheme=sch, code=code, amount=diff, src=f"{BID}.src.p{c['annex']:02d}", srcRow=c['row'])
|
||||||
|
add_alloc(**a)
|
||||||
|
calc.add(allocs[-1])
|
||||||
|
nres[c['annex']] += 1
|
||||||
|
splits = [c for c in checks if c['annex'] == 3 and not c['sel'].get('kind') and c['sel']['year'] == YEAR
|
||||||
|
and c['sel'].get('flow') == 'financing' and c['sel'].get('block') and c['sel'].get('code')
|
||||||
|
and len(c['sel'].get('codes') or []) == 1]
|
||||||
|
splits.sort(key=lambda c: -depth(c['sel'].get('purpose')))
|
||||||
|
for c in splits:
|
||||||
|
s_ = c['sel']
|
||||||
|
got = calc.total(s_.get('fund'), 'financing', YEAR, s_['nature'], purpose=s_.get('purpose'), block=s_['block'], codes=s_['codes'],
|
||||||
|
blk=s_.get('blk'))
|
||||||
|
diff = c['value'] - got
|
||||||
|
if abs(diff) < 0.5:
|
||||||
|
continue
|
||||||
|
sch, code = s_['code'].split(':', 1)
|
||||||
|
pur = s_.get('purpose')
|
||||||
|
holder = (purposes.get(pur) or {}).get('holder') if pur else None
|
||||||
|
# annex 3 attributes an amount that annex 4 shows without a block to a block: reclassify within the same purpose (totals unchanged)
|
||||||
|
for pur_, hol_, blk_, amt in ((pur, holder, s_['block'], diff), (pur, holder, None, -diff)):
|
||||||
|
add_alloc(srcAnnex='p03', flow='financing', fund=s_.get('fund') or 'basic', nature=s_['nature'], year=YEAR, holder=hol_,
|
||||||
|
purpose=pur_, block=blk_, scheme=sch, code=code, amount=amt, src=f'{BID}.src.p03', srcRow=c['row'])
|
||||||
|
calc.add(allocs[-1])
|
||||||
|
nres['3-block-split'] += 1
|
||||||
|
report['residual_allocations'] = [f'annex {k}: {v}' for k, v in sorted(nres.items(), key=str)]
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ sources
|
||||||
|
law_title = re.search(r"<div class='TV207'[^>]*>(.*?)</div>", open(LAW_HTML, encoding='utf-8').read(), re.S)
|
||||||
|
law_title = html.unescape(re.sub(r'<[^>]+>', '', law_title.group(1))).strip() if law_title else f'Par valsts budžetu {YEAR}. gadam'
|
||||||
|
links = json.load(open(os.path.join(ADIR, 'links.json'), encoding='utf-8'))
|
||||||
|
sources = [{'id': f'{BID}.src.law', 'kind': 'lawText', 'title': law_title, 'url': links['law'], 'sha256': sha(LAW_HTML)}]
|
||||||
|
for n in range(1, 13):
|
||||||
|
f = annex_file(n)
|
||||||
|
sources.append({'id': f'{BID}.src.p{n:02d}', 'kind': 'form' if n == 12 else 'annex', 'annex': n,
|
||||||
|
'title': f'{n}. pielikums', 'url': links['annex'][str(n)], 'sha256': sha(f)})
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ write XML
|
||||||
|
def attrs(d, order):
|
||||||
|
out = []
|
||||||
|
for k in order:
|
||||||
|
v = d.get(k)
|
||||||
|
if v is None or v == '' or v is False:
|
||||||
|
continue
|
||||||
|
if isinstance(v, bool):
|
||||||
|
v = 'true'
|
||||||
|
if isinstance(v, float):
|
||||||
|
v = (f'{v:.2f}'.rstrip('0').rstrip('.')) if v != int(v) else str(int(v))
|
||||||
|
out.append(f'{k}={quoteattr(str(v))}')
|
||||||
|
return ' '.join(out)
|
||||||
|
|
||||||
|
os.makedirs(OUT, exist_ok=True)
|
||||||
|
xp = os.path.join(OUT, f'{BID}.xml')
|
||||||
|
with open(xp, 'w', encoding='utf-8') as fo:
|
||||||
|
fo.write('<?xml version="1.0" encoding="UTF-8"?>\n')
|
||||||
|
fo.write(f'<Budget xmlns="urn:pppa:vpk:budzets:0.1" {attrs({"id": BID, "title": law_title, "year": YEAR, "horizonTo": YEAR + 2, "status": "adopted", "act": links["law"], "published": links.get("published"), "version": links.get("version")}, ["id", "title", "year", "horizonTo", "status", "act", "published", "version"])}>\n')
|
||||||
|
for s_ in sources:
|
||||||
|
fo.write(f' <Source {attrs(s_, ["id", "kind", "annex", "title", "url", "sha256"])}/>\n')
|
||||||
|
for p in provisions:
|
||||||
|
fo.write(f' <Provision {attrs(p, ["id", "chapter", "article", "src"])}>{escape(p["text"])}</Provision>\n')
|
||||||
|
for p in params:
|
||||||
|
fo.write(f' <Parameter {attrs(p, ["id", "name", "code", "year", "value", "unit", "src"])}/>\n')
|
||||||
|
for aid, a in sorted(actors.items()):
|
||||||
|
fo.write(f' <Actor {attrs(dict(a, id=aid), ["id", "kind", "code", "vpk", "name"])}/>\n')
|
||||||
|
for pid, p in purposes.items():
|
||||||
|
fo.write(f' <Purpose {attrs(dict(p, id=pid), ["id", "kind", "code", "name", "parent", "holder", "block", "function"])}/>\n')
|
||||||
|
for (sch, code), c in sorted(classitems.items()):
|
||||||
|
ps, par = (c['parent'].split(':', 1) if c['parent'] else (None, None))
|
||||||
|
fo.write(f' <ClassItem {attrs({"scheme": sch, "code": code, "name": c["name"], "parent": par, "parentScheme": ps if ps != sch else None, "intraFund": is_intra(c["name"]) or None}, ["scheme", "code", "name", "parent", "parentScheme", "intraFund"])}/>\n')
|
||||||
|
for a in allocs:
|
||||||
|
a = {k: v for k, v in a.items() if not k.startswith('_')}
|
||||||
|
fo.write(f' <Allocation {attrs(a, ["id", "flow", "fund", "nature", "year", "untilEnd", "periodFrom", "periodTo", "holder", "recipient", "purpose", "block", "commitmentKind", "function", "scheme", "code", "amount", "partOf", "src", "srcRow"])}/>\n')
|
||||||
|
fo.write('</Budget>\n')
|
||||||
|
|
||||||
|
json.dump({'checks': checks, 'blockcodes': {k: {f: sorted(v) for f, v in d.items()} for k, d in blockcodes.items()}},
|
||||||
|
open(os.path.join(OUT, f'{BID}.checks.json'), 'w', encoding='utf-8'), ensure_ascii=False)
|
||||||
|
summary = {'provisions': len(provisions), 'parameters': len(params), 'actors': len(actors), 'purposes': len(purposes),
|
||||||
|
'classitems': len(classitems), 'allocations': len(allocs), 'checks': len(checks),
|
||||||
|
'allocations_by_annex': collections.Counter(a['src'].rsplit('.', 1)[1] for a in allocs)}
|
||||||
|
print(json.dumps(summary, ensure_ascii=False, default=str))
|
||||||
|
for k, v in report.items():
|
||||||
|
print(f'REPORT {k}: {len(v)}')
|
||||||
|
for x in v[:8]:
|
||||||
|
print(' ', x)
|
||||||
|
json.dump(report, open(os.path.join(OUT, f'{BID}.report.json'), 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
|
||||||
55
tools/rd.py
Normal file
55
tools/rd.py
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
"""Shared readers for budget-law annex files (xlsx via openpyxl, xls via xlrd, docx via stdlib)."""
|
||||||
|
import zipfile, re, xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
def sheets(path):
|
||||||
|
"""Yield (sheet_name, rows) with rows as lists of stripped strings/numbers; hidden BEx sheets included."""
|
||||||
|
if path.lower().endswith('.xlsx'):
|
||||||
|
import openpyxl
|
||||||
|
wb = openpyxl.load_workbook(path, read_only=True, data_only=True)
|
||||||
|
for ws in wb.worksheets:
|
||||||
|
rows = []
|
||||||
|
for r in ws.iter_rows(values_only=True):
|
||||||
|
rows.append([("" if v is None else (v.strip() if isinstance(v, str) else v)) for v in r])
|
||||||
|
yield ws.title, rows
|
||||||
|
elif path.lower().endswith('.xls'):
|
||||||
|
import xlrd
|
||||||
|
wb = xlrd.open_workbook(path)
|
||||||
|
for ws in wb.sheets():
|
||||||
|
rows = []
|
||||||
|
for i in range(ws.nrows):
|
||||||
|
rows.append([(c.strip() if isinstance(c, str) else c) for c in ws.row_values(i)])
|
||||||
|
yield ws.name, rows
|
||||||
|
|
||||||
|
def main_sheet(path):
|
||||||
|
"""The printed annex sheet: the one whose name ends with 'piel' or is the first non-BEx sheet with most rows."""
|
||||||
|
best = None
|
||||||
|
for name, rows in sheets(path):
|
||||||
|
if name.lower().endswith('piel') or re.match(r'^\d+\.?\s*piel', name.lower()):
|
||||||
|
return name, rows
|
||||||
|
if name.startswith(('BEx', 'HEADER', 'FOOTER', 'ZQZ', 'var', 'list', 'parms')):
|
||||||
|
continue
|
||||||
|
if best is None or len(rows) > len(best[1]):
|
||||||
|
best = (name, rows)
|
||||||
|
return best
|
||||||
|
|
||||||
|
W = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
|
||||||
|
def docx_tables(path):
|
||||||
|
"""List of tables, each a list of rows of cell texts."""
|
||||||
|
x = ET.fromstring(zipfile.ZipFile(path).read('word/document.xml'))
|
||||||
|
out = []
|
||||||
|
for t in x.iter(W + 'tbl'):
|
||||||
|
rows = []
|
||||||
|
for tr in t.findall(W + 'tr'):
|
||||||
|
rows.append([''.join(n.text or '' for n in tc.iter(W + 't')).strip() for tc in tr.findall(W + 'tc')])
|
||||||
|
out.append(rows)
|
||||||
|
return out
|
||||||
|
|
||||||
|
def docx_paras(path):
|
||||||
|
x = ET.fromstring(zipfile.ZipFile(path).read('word/document.xml'))
|
||||||
|
return [''.join(n.text or '' for n in p.iter(W + 't')).strip() for p in x.iter(W + 'p')]
|
||||||
|
|
||||||
|
def num(v):
|
||||||
|
"""Parse an amount cell: numbers, '1 234 567', '-1 234', '–'. Returns float or None."""
|
||||||
|
if isinstance(v, (int, float)): return float(v)
|
||||||
|
s = str(v).replace(' ', ' ').replace(' ', '').replace('–', '-').replace('−', '-').replace(',', '.')
|
||||||
|
return float(s) if re.fullmatch(r'-?\d+(\.\d+)?', s) else None
|
||||||
33
tools/rows.py
Normal file
33
tools/rows.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
"""Uniform row reader with indent level of the label column, for xlsx (openpyxl) and xls (xlrd)."""
|
||||||
|
import re
|
||||||
|
def _label_col(cells):
|
||||||
|
return next((i for i, v in enumerate(cells) if isinstance(v, str) and v and not re.fullmatch(r'[\d.]+', v)), 0)
|
||||||
|
def read_rows(path, sheet_hint='piel', label_col=None, max_col=12):
|
||||||
|
"""Return list of dicts: row (1-based), cells, indent (of label cell), bold. Stops after 200 empty rows."""
|
||||||
|
out, empty = [], 0
|
||||||
|
if path.lower().endswith('.xlsx'):
|
||||||
|
import openpyxl
|
||||||
|
wb = openpyxl.load_workbook(path, read_only=False, data_only=True)
|
||||||
|
ws = next(w for w in wb.worksheets if sheet_hint in w.title.lower().replace('.', ''))
|
||||||
|
for row in ws.iter_rows(min_row=1, max_col=max_col):
|
||||||
|
cells = [("" if c.value is None else (c.value.strip() if isinstance(c.value, str) else c.value)) for c in row]
|
||||||
|
if not any(str(v) for v in cells):
|
||||||
|
empty += 1
|
||||||
|
if empty > 200: break
|
||||||
|
continue
|
||||||
|
empty = 0
|
||||||
|
lc = label_col if label_col is not None else _label_col(cells)
|
||||||
|
c = row[lc] if lc < len(row) else row[0]
|
||||||
|
out.append({'row': row[0].row, 'cells': cells, 'indent': int(c.alignment.indent or 0), 'bold': bool(c.font and c.font.b)})
|
||||||
|
else:
|
||||||
|
import xlrd
|
||||||
|
bk = xlrd.open_workbook(path, formatting_info=True)
|
||||||
|
sh = next(bk.sheet_by_name(n) for n in bk.sheet_names() if sheet_hint in n.lower().replace('.', ''))
|
||||||
|
for r in range(sh.nrows):
|
||||||
|
cells = [(c.strip() if isinstance(c, str) else c) for c in sh.row_values(r)][:max_col]
|
||||||
|
if not any(str(v) for v in cells): continue
|
||||||
|
lc = label_col if label_col is not None else _label_col(cells)
|
||||||
|
xf = bk.xf_list[sh.cell_xf_index(r, lc)] if lc < sh.ncols else None
|
||||||
|
out.append({'row': r + 1, 'cells': cells, 'indent': xf.alignment.indent_level if xf else 0,
|
||||||
|
'bold': bool(xf and bk.font_list[xf.font_index].bold)})
|
||||||
|
return out
|
||||||
174
tools/verify_budget.py
Normal file
174
tools/verify_budget.py
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
"""Round-trip proof: recompute every printed number of the budget law annexes from the XML alone.
|
||||||
|
|
||||||
|
Usage: python verify_budget.py OUT_DIR YEAR
|
||||||
|
Reads lv-vb-YEAR.xml (validated against the XSD) and lv-vb-YEAR.checks.json (each printed number with its meaning).
|
||||||
|
A check passes when the value computed from the XML equals the printed value (difference < 0.5 EUR; < 0.005 for % of GDP).
|
||||||
|
"""
|
||||||
|
import sys, os, re, json, collections
|
||||||
|
TOOLS = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
ROOT = os.environ.get('BUDGET_ROOT', os.path.dirname(TOOLS))
|
||||||
|
sys.path.insert(0, TOOLS)
|
||||||
|
from lxml import etree
|
||||||
|
from calc import Calc
|
||||||
|
|
||||||
|
OUT, YEAR = sys.argv[1], int(sys.argv[2])
|
||||||
|
BID = f'lv-vb-{YEAR}'
|
||||||
|
NS = '{urn:pppa:vpk:budzets:0.1}'
|
||||||
|
schema = etree.XMLSchema(etree.parse(os.path.join(ROOT, 'schemas', 'valsts-budzets-0.1.xsd')))
|
||||||
|
doc = etree.parse(os.path.join(OUT, f'{BID}.xml'))
|
||||||
|
valid = schema.validate(doc)
|
||||||
|
print('XSD valid:', valid)
|
||||||
|
for e in list(schema.error_log)[:10]:
|
||||||
|
print(' ', e.line, e.message[:200])
|
||||||
|
|
||||||
|
def norm(s):
|
||||||
|
s = str(s).lower().replace(' ', ' ').replace('–', '-').replace('—', '-')
|
||||||
|
return re.sub(r'[^0-9a-zāčēģīķļņšūž]+', ' ', s).strip()
|
||||||
|
|
||||||
|
root = doc.getroot()
|
||||||
|
purpose_parent = {p.get('id'): p.get('parent') for p in root.iter(NS + 'Purpose')}
|
||||||
|
cls_parent, cls_by_name, intra = {}, collections.defaultdict(set), set()
|
||||||
|
for c in root.iter(NS + 'ClassItem'):
|
||||||
|
k = f"{c.get('scheme')}:{c.get('code')}"
|
||||||
|
if c.get('parent'):
|
||||||
|
cls_parent[k] = f"{c.get('parentScheme') or c.get('scheme')}:{c.get('parent')}"
|
||||||
|
if c.get('intraFund') == 'true':
|
||||||
|
intra.add(k)
|
||||||
|
cls_by_name[norm(c.get('name'))].add(k)
|
||||||
|
gdp = {int(p.get('year')): float(p.get('value')) for p in root.iter(NS + 'Parameter') if p.get('code') == 'IKP'}
|
||||||
|
A = []
|
||||||
|
for a in root.iter(NS + 'Allocation'):
|
||||||
|
d = dict(a.attrib)
|
||||||
|
d['year'] = int(d['year'])
|
||||||
|
d['untilEnd'] = d.get('untilEnd') == 'true'
|
||||||
|
A.append(d)
|
||||||
|
data = json.load(open(os.path.join(OUT, f'{BID}.checks.json'), encoding='utf-8'))
|
||||||
|
purpose_holder = {p.get('id'): p.get('holder') for p in root.iter(NS + 'Purpose')}
|
||||||
|
calc = Calc(A, purpose_parent, cls_parent, intra, data['blockcodes'], purpose_holder)
|
||||||
|
print('allocations:', len(A))
|
||||||
|
|
||||||
|
res = collections.defaultdict(lambda: {'n': 0, 'ok': 0, 'bad': [], 'skip': 0})
|
||||||
|
def judge(c, got, tol=0.5):
|
||||||
|
r = res[c['annex']]
|
||||||
|
r['n'] += 1
|
||||||
|
if got is None:
|
||||||
|
r['skip'] += 1
|
||||||
|
r['bad'].append(('not computed', c['row'], c['sel'].get('label', ''), c['value'], None))
|
||||||
|
elif abs(got - c['value']) < tol:
|
||||||
|
r['ok'] += 1
|
||||||
|
else:
|
||||||
|
r['bad'].append(('mismatch', c['row'], json.dumps({k: v for k, v in c['sel'].items() if k != 'codes'}, ensure_ascii=False)[:230], c['value'], round(got, 2)))
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ annex 1: consolidated budget by formula
|
||||||
|
def a1_value(label, year, ctx, pct):
|
||||||
|
n = norm(label)
|
||||||
|
base = 'appropriation' if year == YEAR else 'ceiling'
|
||||||
|
T = calc.total
|
||||||
|
def rev(f): return T(f, 'revenue', year, 'forecast')
|
||||||
|
def exp(f, pre=None): return T(f, 'expenditure', year, base, ekk_prefix=pre)
|
||||||
|
def fin(f, codes=None): return T(f, 'financing', year, base, codes=codes)
|
||||||
|
def cap(f): return exp(f, '5') + exp(f, '9')
|
||||||
|
b2s_m, b2s_c, s2b_m, s2b_c = exp('basic', '712'), exp('basic', '912'), exp('special', '711'), exp('special', '911')
|
||||||
|
PA, SA = rev('basic') - (s2b_m + s2b_c), rev('special') - (b2s_m + b2s_c)
|
||||||
|
PB, SB = exp('basic') - (b2s_m + b2s_c), exp('special') - (s2b_m + s2b_c)
|
||||||
|
PB2, SB2 = cap('basic') - b2s_c, cap('special') - s2b_c
|
||||||
|
PB1, SB1 = PB - PB2, SB - SB2
|
||||||
|
if pct:
|
||||||
|
g = gdp.get(year)
|
||||||
|
if not g:
|
||||||
|
return None
|
||||||
|
val = {'valsts budžeta ieņēmumi': PA + SA, 'valsts budžeta izdevumi': PB + SB, 'valsts budžeta finansiālā bilance': PA + SA - PB - SB}
|
||||||
|
for k, v in val.items():
|
||||||
|
if n.startswith(k):
|
||||||
|
return round(v / (g * 1e6) * 100, 2)
|
||||||
|
return None
|
||||||
|
first = n.split(' ')[0] if n else ''
|
||||||
|
exact = {'ka': PA + SA, 'pa': PA, 'sa': SA, 'kb': PB + SB, 'kb1': PB1 + SB1, 'kb2': PB2 + SB2,
|
||||||
|
'pb': PB, 'pb1': PB1, 'pb2': PB2, 'sb': SB, 'sb1': SB1, 'sb2': SB2}
|
||||||
|
if first in exact:
|
||||||
|
return exact[first]
|
||||||
|
prefix = [
|
||||||
|
('valsts pamatbudžeta ieņēmumi', rev('basic')), ('valsts speciālā budžeta ieņēmumi', rev('special')),
|
||||||
|
('valsts pamatbudžeta izdevumi', exp('basic')), ('valsts speciālā budžeta izdevumi', exp('special')),
|
||||||
|
('valsts pamatbudžeta uzturēšanas izdevumi', exp('basic') - cap('basic')), ('valsts pamatbudžeta kapitālie izdevumi', cap('basic')),
|
||||||
|
('valsts speciālā budžeta uzturēšanas izdevumi', exp('special') - cap('special')), ('valsts speciālā budžeta kapitālie izdevumi', cap('special')),
|
||||||
|
('valsts budžeta finansiālā bilance', PA + SA - PB - SB),
|
||||||
|
('valsts pamatbudžeta finansiālā bilance', rev('basic') - exp('basic')),
|
||||||
|
('valsts speciālā budžeta finansiālā bilance', rev('special') - exp('special')),
|
||||||
|
]
|
||||||
|
for k, v in prefix:
|
||||||
|
if n.startswith(k):
|
||||||
|
return v
|
||||||
|
if n.startswith('mīnus transferts no valsts speciālā'): return s2b_m + s2b_c
|
||||||
|
if n.startswith('mīnus transferts no valsts pamatbudžeta'): return b2s_m + b2s_c
|
||||||
|
if n.startswith('mīnus transferts valsts speciāl'):
|
||||||
|
return {'gross': b2s_m + b2s_c, 'maint': b2s_m, 'cap': b2s_c}[ctx['exp_part']]
|
||||||
|
if n.startswith('mīnus transferts valsts pamatbudžet'):
|
||||||
|
return {'gross': s2b_m + s2b_c, 'maint': s2b_m, 'cap': s2b_c}[ctx['exp_part']]
|
||||||
|
f = {'fin_all': None, 'fin_basic': 'basic', 'fin_special': 'special'}.get(ctx['part'])
|
||||||
|
if n == 'finansēšana' and ctx['part'].startswith('fin'):
|
||||||
|
return fin(f)
|
||||||
|
if not ctx['part'].startswith('fin'):
|
||||||
|
a2 = a2_codes.get((ctx['fund'], n))
|
||||||
|
if a2:
|
||||||
|
return calc.total(ctx['fund'], 'revenue', year, 'forecast', codes=a2, blk=f"a2:{ctx['fund']}")
|
||||||
|
codes = cls_by_name.get(n)
|
||||||
|
if not codes:
|
||||||
|
return None
|
||||||
|
if ctx['part'].startswith('fin'):
|
||||||
|
return fin(f, codes)
|
||||||
|
return calc.total(ctx['fund'], 'revenue', year, 'forecast', codes=codes)
|
||||||
|
|
||||||
|
a2_codes = {}
|
||||||
|
for c in data['checks']:
|
||||||
|
if c['annex'] == 2 and c['sel'].get('label') and c['sel'].get('codes'):
|
||||||
|
a2_codes.setdefault((c['sel']['fund'], norm(c['sel']['label'])), c['sel']['codes'])
|
||||||
|
ctx = {'fund': 'basic', 'part': 'rev', 'exp_part': 'gross'}
|
||||||
|
for c in sorted([c for c in data['checks'] if c['annex'] == 1], key=lambda c: (c['row'], c['sel']['year'])):
|
||||||
|
n = norm(c['sel']['label'])
|
||||||
|
if n.startswith('valsts pamatbudžeta ieņēmumi'): ctx.update(fund='basic', part='rev')
|
||||||
|
if n.startswith('valsts speciālā budžeta ieņēmumi'): ctx.update(fund='special', part='rev')
|
||||||
|
if n.startswith('valsts budžeta finansiālā bilance'): ctx.update(part='fin_all')
|
||||||
|
if n.startswith('valsts pamatbudžeta finansiālā bilance'): ctx.update(part='fin_basic')
|
||||||
|
if n.startswith('valsts speciālā budžeta finansiālā bilance'): ctx.update(part='fin_special')
|
||||||
|
if n.startswith(('valsts pamatbudžeta', 'valsts speciālā budžeta')) and 'izdevumi' in n:
|
||||||
|
ctx.update(exp_part='maint' if 'uzturēšanas' in n else ('cap' if 'kapitālie' in n else 'gross'))
|
||||||
|
judge(c, a1_value(c['sel']['label'], c['sel']['year'], ctx, c['sel']['pct']), tol=0.005 if c['sel']['pct'] else 0.5)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ all other annexes
|
||||||
|
for c in data['checks']:
|
||||||
|
if c['annex'] == 1:
|
||||||
|
continue
|
||||||
|
s = c['sel']
|
||||||
|
kind = s.get('kind')
|
||||||
|
if kind == 'grant_total':
|
||||||
|
got = sum(float(a['amount']) for a in A if a.get('purpose') == s['purpose'] and f"{a['scheme']}:{a['code']}" == s['code']
|
||||||
|
and (not s.get('periodFrom') or a.get('periodFrom') == s['periodFrom']))
|
||||||
|
judge(c, got); continue
|
||||||
|
if kind in ('fees_resort', 'fees_total'):
|
||||||
|
got = sum(float(a['amount']) for a in A if a.get('partOf') and a['src'].endswith('.p02') and a['year'] == s['year']
|
||||||
|
and (kind == 'fees_total' or a.get('holder') == s['holder']))
|
||||||
|
judge(c, got); continue
|
||||||
|
common = dict(purpose=s.get('purpose'), block=s.get('block'), ckind=s.get('ckind'), untilEnd=s.get('untilEnd', False), blk=s.get('blk'),
|
||||||
|
holder_view=bool(s.get('holderView')))
|
||||||
|
if kind == 'balance':
|
||||||
|
printed = data['blockcodes'].get(s.get('blk'), {})
|
||||||
|
if c['annex'] != 11 and ((s.get('purpose') is None and not s.get('block')) or s.get('fund') == 'special'):
|
||||||
|
inflow = calc.total(s.get('fund'), 'revenue', s['year'], 'forecast', **common)
|
||||||
|
else:
|
||||||
|
inflow = calc.total(s.get('fund'), 'resource', s['year'], s['nature'], **common)
|
||||||
|
judge(c, inflow - calc.total(s.get('fund'), 'expenditure', s['year'], s['nature'], **common)); continue
|
||||||
|
judge(c, calc.total(s.get('fund'), s['flow'], s['year'], s['nature'], codes=s.get('codes'), **common))
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ report
|
||||||
|
tot_n = tot_ok = 0
|
||||||
|
summary = {}
|
||||||
|
for an in sorted(res):
|
||||||
|
r = res[an]
|
||||||
|
tot_n += r['n']; tot_ok += r['ok']
|
||||||
|
summary[an] = {'checks': r['n'], 'ok': r['ok'], 'mismatch': r['n'] - r['ok'] - r['skip'], 'not_computed': r['skip']}
|
||||||
|
print(f"annex {an:2d}: {r['n']:6d} printed numbers, {r['ok']:6d} reproduced ({100 * r['ok'] / max(r['n'], 1):.2f}%), {r['skip']} not computed")
|
||||||
|
print(f'TOTAL: {tot_ok}/{tot_n} printed numbers reproduced from XML ({100 * tot_ok / max(tot_n, 1):.3f}%)')
|
||||||
|
json.dump({'xsd_valid': valid, 'allocations': len(A), 'annexes': summary, 'total': tot_n, 'reproduced': tot_ok,
|
||||||
|
'issues': {an: r['bad'][:300] for an, r in res.items()}},
|
||||||
|
open(os.path.join(OUT, f'{BID}.verify.json'), 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
|
||||||
133
verification/lv-vb-2025.verify.json
Normal file
133
verification/lv-vb-2025.verify.json
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
{
|
||||||
|
"xsd_valid": true,
|
||||||
|
"allocations": 6322,
|
||||||
|
"annexes": {
|
||||||
|
"1": {
|
||||||
|
"checks": 252,
|
||||||
|
"ok": 252,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"checks": 216,
|
||||||
|
"ok": 216,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"3": {
|
||||||
|
"checks": 5944,
|
||||||
|
"ok": 5944,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"checks": 7863,
|
||||||
|
"ok": 7863,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"5": {
|
||||||
|
"checks": 233,
|
||||||
|
"ok": 233,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"6": {
|
||||||
|
"checks": 3,
|
||||||
|
"ok": 3,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
"checks": 3,
|
||||||
|
"ok": 3,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"8": {
|
||||||
|
"checks": 5,
|
||||||
|
"ok": 5,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"checks": 2,
|
||||||
|
"ok": 2,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"checks": 1,
|
||||||
|
"ok": 1,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
"checks": 41155,
|
||||||
|
"ok": 41155,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"total": 55677,
|
||||||
|
"reproduced": 55677,
|
||||||
|
"parser_report": {
|
||||||
|
"block_fallback": [
|
||||||
|
"03 62.00.00",
|
||||||
|
"03 63.00.00",
|
||||||
|
"03 70.00.00",
|
||||||
|
"03 73.00.00",
|
||||||
|
"03 74.00.00",
|
||||||
|
"08 63.00.00",
|
||||||
|
"08 70.00.00",
|
||||||
|
"08 74.00.00",
|
||||||
|
"10 22.00.00",
|
||||||
|
"10 70.00.00",
|
||||||
|
"10 73.00.00",
|
||||||
|
"11 70.00.00",
|
||||||
|
"11 96.00.00",
|
||||||
|
"12 26.00.00",
|
||||||
|
"12 27.00.00",
|
||||||
|
"12 29.00.00",
|
||||||
|
"12 60.00.00",
|
||||||
|
"12 62.00.00",
|
||||||
|
"12 63.00.00",
|
||||||
|
"12 67.00.00",
|
||||||
|
"12 69.00.00",
|
||||||
|
"12 70.00.00",
|
||||||
|
"12 74.00.00",
|
||||||
|
"13 31.00.00",
|
||||||
|
"13 38.00.00",
|
||||||
|
"13 39.00.00",
|
||||||
|
"13 41.00.00",
|
||||||
|
"13 62.00.00",
|
||||||
|
"13 63.00.00",
|
||||||
|
"13 67.00.00",
|
||||||
|
"13 70.00.00",
|
||||||
|
"13 71.00.00",
|
||||||
|
"13 72.00.00",
|
||||||
|
"13 73.00.00",
|
||||||
|
"13 74.00.00",
|
||||||
|
"13 75.00.00",
|
||||||
|
"14 02.00.00",
|
||||||
|
"14 06.00.00",
|
||||||
|
"14 11.00.00",
|
||||||
|
"14 38.00.00",
|
||||||
|
"… +116"
|
||||||
|
],
|
||||||
|
"a11_new_programme": [
|
||||||
|
"12 60.02.00 Atmaksas valsts pamatbudžetā par Eiropas infrastru"
|
||||||
|
],
|
||||||
|
"class_parent_votes": [
|
||||||
|
"revenue:18400 Valsts pamatbudžetā saņemtie transferti no valsts votes {'revenue:18000': 8, 'law:A500': 1} -> revenue:18000"
|
||||||
|
],
|
||||||
|
"parent_rejected_by_structure": [
|
||||||
|
"revenue:21200 Ārvalstu finanšu palīdzība atmaksām vals: not under ['revenue:21100']"
|
||||||
|
],
|
||||||
|
"residual_allocations": [
|
||||||
|
"annex 3-block-split: 4",
|
||||||
|
"annex 3: 6",
|
||||||
|
"annex 4: 4"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
135
verification/lv-vb-2026.verify.json
Normal file
135
verification/lv-vb-2026.verify.json
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
{
|
||||||
|
"xsd_valid": true,
|
||||||
|
"allocations": 6400,
|
||||||
|
"annexes": {
|
||||||
|
"1": {
|
||||||
|
"checks": 253,
|
||||||
|
"ok": 253,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"checks": 217,
|
||||||
|
"ok": 217,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"3": {
|
||||||
|
"checks": 6241,
|
||||||
|
"ok": 6241,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"checks": 8160,
|
||||||
|
"ok": 8160,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"5": {
|
||||||
|
"checks": 233,
|
||||||
|
"ok": 233,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"6": {
|
||||||
|
"checks": 3,
|
||||||
|
"ok": 3,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
"checks": 3,
|
||||||
|
"ok": 3,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"8": {
|
||||||
|
"checks": 5,
|
||||||
|
"ok": 5,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"checks": 2,
|
||||||
|
"ok": 2,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"checks": 1,
|
||||||
|
"ok": 1,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
"checks": 43339,
|
||||||
|
"ok": 43339,
|
||||||
|
"mismatch": 0,
|
||||||
|
"not_computed": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"total": 58457,
|
||||||
|
"reproduced": 58457,
|
||||||
|
"parser_report": {
|
||||||
|
"block_fallback": [
|
||||||
|
"03 62.00.00",
|
||||||
|
"03 63.00.00",
|
||||||
|
"03 70.00.00",
|
||||||
|
"03 73.00.00",
|
||||||
|
"03 74.00.00",
|
||||||
|
"08 63.00.00",
|
||||||
|
"08 74.00.00",
|
||||||
|
"10 22.00.00",
|
||||||
|
"10 70.00.00",
|
||||||
|
"10 73.00.00",
|
||||||
|
"11 70.00.00",
|
||||||
|
"11 96.00.00",
|
||||||
|
"12 26.00.00",
|
||||||
|
"12 29.00.00",
|
||||||
|
"12 60.00.00",
|
||||||
|
"12 62.00.00",
|
||||||
|
"12 63.00.00",
|
||||||
|
"12 67.00.00",
|
||||||
|
"12 69.00.00",
|
||||||
|
"12 70.00.00",
|
||||||
|
"12 74.00.00",
|
||||||
|
"13 31.00.00",
|
||||||
|
"13 38.00.00",
|
||||||
|
"13 39.00.00",
|
||||||
|
"13 41.00.00",
|
||||||
|
"13 61.00.00",
|
||||||
|
"13 62.00.00",
|
||||||
|
"13 63.00.00",
|
||||||
|
"13 67.00.00",
|
||||||
|
"13 70.00.00",
|
||||||
|
"13 72.00.00",
|
||||||
|
"13 73.00.00",
|
||||||
|
"13 74.00.00",
|
||||||
|
"13 75.00.00",
|
||||||
|
"14 02.00.00",
|
||||||
|
"14 06.00.00",
|
||||||
|
"14 11.00.00",
|
||||||
|
"14 38.00.00",
|
||||||
|
"14 40.00.00",
|
||||||
|
"14 62.00.00",
|
||||||
|
"… +114"
|
||||||
|
],
|
||||||
|
"a11_new_programme": [
|
||||||
|
"12 60.02.00 Atmaksas valsts pamatbudžetā par Eiropas infrastru",
|
||||||
|
"17 60.51.00 Atmaksas valsts pamatbudžetā par Eiropas transport",
|
||||||
|
"12 67.02.00 Atmaksas valsts pamatbudžetā par Eiropas Kopienas "
|
||||||
|
],
|
||||||
|
"class_parent_votes": [
|
||||||
|
"revenue:18400 Valsts pamatbudžetā saņemtie transferti no valsts votes {'revenue:18000': 8, 'law:A500': 1} -> revenue:18000"
|
||||||
|
],
|
||||||
|
"parent_rejected_by_structure": [
|
||||||
|
"revenue:21200 Ārvalstu finanšu palīdzība atmaksām vals: not under ['revenue:21100']"
|
||||||
|
],
|
||||||
|
"residual_allocations": [
|
||||||
|
"annex 3-block-split: 4",
|
||||||
|
"annex 3: 6",
|
||||||
|
"annex 4: 4"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user