1
0

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:
2026-10-10 22:34:28 +00:00
commit 71250e7b0e
56 changed files with 26144 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
build/
__pycache__/
*.pyc

9
CHANGELOG.md Normal file
View 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
View 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.

View 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
View File

File diff suppressed because it is too large Load Diff

7918
data/lv-vb-2026.xml Normal file
View File

File diff suppressed because it is too large Load Diff

39
docs/IDENTIFIKATORI.md Normal file
View 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
View 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
View 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.

View 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>

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

BIN
source/2025/1_PIELIKUMS.XLS Normal file
View File

Binary file not shown.

BIN
source/2025/2_PIELIKUMS.XLS Normal file
View File

Binary file not shown.

BIN
source/2025/3_PIELIKUMS.XLS Normal file
View File

Binary file not shown.

BIN
source/2025/4_PIELIKUMS.XLS Normal file
View File

Binary file not shown.

BIN
source/2025/5_PIELIKUMS.XLS Normal file
View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

1302
source/2025/likums.html Normal file
View File

File diff suppressed because one or more lines are too long

18
source/2025/links.json Normal file
View 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
View File

Binary file not shown.

BIN
source/2026/P02.XLSX Normal file
View File

Binary file not shown.

BIN
source/2026/P03.XLSX Normal file
View File

Binary file not shown.

BIN
source/2026/P04.XLSX Normal file
View File

Binary file not shown.

BIN
source/2026/P05.XLSX Normal file
View File

Binary file not shown.

BIN
source/2026/P06.DOCX Normal file
View File

Binary file not shown.

BIN
source/2026/P07.DOCX Normal file
View File

Binary file not shown.

BIN
source/2026/P08.DOCX Normal file
View File

Binary file not shown.

BIN
source/2026/P09.DOCX Normal file
View File

Binary file not shown.

BIN
source/2026/P10.DOCX Normal file
View File

Binary file not shown.

BIN
source/2026/P11.XLSX Normal file
View File

Binary file not shown.

BIN
source/2026/P12.DOCX Normal file
View File

Binary file not shown.

1305
source/2026/likums.html Normal file
View File

File diff suppressed because one or more lines are too long

19
source/2026/links.json Normal file
View 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"
}
}

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

662
source/kodi/codepairs.json Normal file
View 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"
]
}

View File

File diff suppressed because one or more lines are too long

1066
source/kodi/vk_blocks.tsv Normal file
View File

File diff suppressed because it is too large Load Diff

559
source/kodi/vk_codes.tsv Normal file
View 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
1 Ieņēmumi 02000
2 Ieņēmumi 02100
3 Ieņēmumi 02110
4 Ieņēmumi 02110 Brīvprātīgās sociālās apdrošināšanas iemaksas valsts pensiju apdrošināšanai
5 Ieņēmumi 02120
6 Ieņēmumi 02130
7 Ieņēmumi 02400
8 Ieņēmumi 02410
9 Ieņēmumi 02410 Valsts sociālās apdrošināšanas obligātās iemaksas valsts pensiju apdrošināšanai
10 Ieņēmumi 02420
11 Ieņēmumi 02420 Valsts sociālās apdrošināšanas obligātās iemaksas sociālajai apdrošināšanai bezdarba gadījumiem
12 Ieņēmumi 02430
13 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
14 Ieņēmumi 02440
15 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
16 Ieņēmumi 04000
17 Ieņēmumi 04100
18 Ieņēmumi 04110
19 Ieņēmumi 04111
20 Ieņēmumi 05000
21 Ieņēmumi 05500
22 Ieņēmumi 05530
23 Ieņēmumi 09000
24 Ieņēmumi 09100
25 Ieņēmumi 09110
26 Ieņēmumi 09112
27 Ieņēmumi 09113
28 Ieņēmumi 09170
29 Ieņēmumi 09173
30 Ieņēmumi 09190
31 Ieņēmumi 09199
32 Ieņēmumi 1.9.apakšgrupa
33 Izdevumi 1000
34 Izdevumi 1000 Atlīdzība
35 Ieņēmumi 10000
36 Ieņēmumi 10100
37 Ieņēmumi 10110
38 Ieņēmumi 10112
39 Izdevumi 1100
40 Izdevumi 1110
41 Izdevumi 1111
42 Izdevumi 1112
43 Izdevumi 1113
44 Izdevumi 1114
45 Izdevumi 1115
46 Izdevumi 1116
47 Izdevumi 1119
48 Izdevumi 1140
49 Izdevumi 1141
50 Izdevumi 1142
51 Izdevumi 1143
52 Izdevumi 1144
53 Izdevumi 1145
54 Izdevumi 1146
55 Izdevumi 1147
56 Izdevumi 1148
57 Izdevumi 1149
58 Izdevumi 1150
59 Izdevumi 1170
60 Ieņēmumi 12.0.0.0.
61 Izdevumi 1200
62 Ieņēmumi 12000
63 Izdevumi 1210
64 Izdevumi 1220
65 Ieņēmumi 12200
66 Izdevumi 1221
67 Izdevumi 1222
68 Izdevumi 1223
69 Izdevumi 1224
70 Ieņēmumi 12240
71 Izdevumi 1225
72 Izdevumi 1226
73 Izdevumi 1227
74 Izdevumi 1228
75 Ieņēmumi 12300
76 Ieņēmumi 12340
77 Ieņēmumi 12390
78 Ieņēmumi 17000
79 Ieņēmumi 17100
80 Ieņēmumi 17110
81 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
82 Ieņēmumi 17120
83 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
84 Ieņēmumi 17130
85 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
86 Ieņēmumi 17140
87 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
88 Ieņēmumi 18000
89 Ieņēmumi 18100
90 Ieņēmumi 18130
91 Ieņēmumi 18131
92 Ieņēmumi 18131 Valsts pamatbudžeta iestāžu saņemtie transferti no valsts pamatbudžeta dotācijas no vispārējiem ieņēmumiem
93 Ieņēmumi 18132
94 Ieņēmumi 18132 Valsts pamatbudžeta iestāžu saņemtie transferti no ārvalstu finanšu palīdzības līdzekļiem
95 Ieņēmumi 18139
96 Ieņēmumi 18139 Pārējie valsts pamatbudžetā saņemtie transferti no valsts pamatbudžeta
97 Ieņēmumi 18200
98 Ieņēmumi 18200 Valsts speciālajā budžetā saņemtie transferti no valsts pamatbudžeta
99 Ieņēmumi 18210
100 Ieņēmumi 18211
101 Ieņēmumi 18212
102 Ieņēmumi 18213
103 Ieņēmumi 18214
104 Ieņēmumi 18215
105 Ieņēmumi 18217
106 Ieņēmumi 18218
107 Ieņēmumi 18230
108 Ieņēmumi 18300
109 Ieņēmumi 18310
110 Ieņēmumi 18311
111 Ieņēmumi 18312
112 Ieņēmumi 18313
113 Ieņēmumi 18400
114 Ieņēmumi 18400 Valsts pamatbudžetā saņemtie transferti no valsts speciālā budžeta
115 Ieņēmumi 18500
116 Ieņēmumi 18520
117 Ieņēmumi 18521
118 Ieņēmumi 18521 No nodarbinātības speciālā budžeta valsts pensiju apdrošināšanai
119 Ieņēmumi 18522
120 Ieņēmumi 18522 No darba negadījumu speciālā budžeta valsts pensiju apdrošināšanai
121 Ieņēmumi 18523
122 Ieņēmumi 18523 No invaliditātes, maternitātes un slimības speciālā budžeta valsts pensiju apdrošināšanai
123 Ieņēmumi 18524
124 Ieņēmumi 18524 No darba negadījumu speciālā budžeta sociālajai apdrošināšanai bezdarba gadījumam
125 Ieņēmumi 18525
126 Ieņēmumi 18525 No invaliditātes, maternitātes un slimības speciālā budžeta sociālajai apdrošināšanai bezdarba gadījumam
127 Ieņēmumi 18526
128 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
129 Ieņēmumi 18527
130 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
131 Ieņēmumi 18528
132 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
133 Ieņēmumi 18529
134 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
135 Ieņēmumi 18530
136 Ieņēmumi 18530 Saņemtie transferti viena speciālā budžeta veida ietvaros
137 Ieņēmumi 18600
138 Ieņēmumi 18620
139 Ieņēmumi 18630
140 Ieņēmumi 19000
141 Ieņēmumi 19500
142 Ieņēmumi 19550
143 Ieņēmumi 19550 Valsts budžeta iestāžu saņemtie transferti (izņemot atmaksas) no pašvaldībām
144 Ieņēmumi 19560
145 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
146 Ieņēmumi 19570
147 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
148 Izdevumi 2000
149 Izdevumi 2000 Preces un pakalpojumi
150 Ieņēmumi 21.4.1.0.
151 Ieņēmumi 21.4.2.0.
152 Ieņēmumi 21.4.9.0.
153 Izdevumi 2100
154 Izdevumi 2110
155 Ieņēmumi 21100
156 Izdevumi 2111
157 Izdevumi 2112
158 Ieņēmumi 21140
159 Ieņēmumi 21150
160 Ieņēmumi 21190
161 Ieņēmumi 21191
162 Ieņēmumi 21193
163 Ieņēmumi 21194
164 Izdevumi 2120
165 Ieņēmumi 21200
166 Izdevumi 2121
167 Izdevumi 2122
168 Ieņēmumi 21300
169 Ieņēmumi 21350
170 Ieņēmumi 21351
171 Ieņēmumi 21352
172 Ieņēmumi 21359
173 Ieņēmumi 21360
174 Ieņēmumi 21370
175 Ieņēmumi 21371
176 Ieņēmumi 21379
177 Ieņēmumi 21380
178 Ieņēmumi 21381
179 Ieņēmumi 21382
180 Ieņēmumi 21383
181 Ieņēmumi 21384
182 Ieņēmumi 21389
183 Ieņēmumi 21390
184 Ieņēmumi 21391
185 Ieņēmumi 21392
186 Ieņēmumi 21393
187 Ieņēmumi 21394
188 Ieņēmumi 21395
189 Ieņēmumi 21396
190 Ieņēmumi 21397
191 Ieņēmumi 21399
192 Ieņēmumi 21400
193 Ieņēmumi 21410
194 Ieņēmumi 21411
195 Ieņēmumi 21412
196 Ieņēmumi 21420
197 Ieņēmumi 21421
198 Ieņēmumi 21423
199 Ieņēmumi 21424
200 Ieņēmumi 21425
201 Ieņēmumi 21426
202 Ieņēmumi 21427
203 Ieņēmumi 21429
204 Ieņēmumi 21490
205 Ieņēmumi 21710
206 Ieņēmumi 21710 Vispārējā kārtībā sadalāmā dotācija no vispārējiem ieņēmumiem
207 Ieņēmumi 21720
208 Ieņēmumi 21720 Dotācija no vispārējiem ieņēmumiem atmaksām valsts pamatbudžetā
209 Ieņēmumi 22.4.0.0.
210 Ieņēmumi 22.6.0.0.
211 Izdevumi 2200
212 Izdevumi 2210
213 Izdevumi 2220
214 Izdevumi 2221
215 Izdevumi 2222
216 Izdevumi 2223
217 Izdevumi 2224
218 Izdevumi 2229
219 Izdevumi 2230
220 Izdevumi 2231
221 Izdevumi 2232
222 Izdevumi 2233
223 Izdevumi 2234
224 Izdevumi 2235
225 Izdevumi 2236
226 Izdevumi 2238
227 Izdevumi 2239
228 Izdevumi 2240
229 Ieņēmumi 22400
230 Izdevumi 2241
231 Ieņēmumi 22410
232 Izdevumi 2242
233 Ieņēmumi 22420
234 Ieņēmumi 22422
235 Izdevumi 2243
236 Ieņēmumi 22430
237 Izdevumi 2244
238 Ieņēmumi 22440
239 Izdevumi 2246
240 Izdevumi 2247
241 Ieņēmumi 22470
242 Izdevumi 2249
243 Ieņēmumi 22490
244 Izdevumi 2250
245 Ieņēmumi 22500
246 Ieņēmumi 22520
247 Ieņēmumi 22540
248 Ieņēmumi 22560
249 Ieņēmumi 22561
250 Ieņēmumi 22562
251 Ieņēmumi 22563
252 Ieņēmumi 22590
253 Izdevumi 2260
254 Ieņēmumi 22600
255 Izdevumi 2261
256 Izdevumi 2262
257 Ieņēmumi 22620
258 Izdevumi 2263
259 Izdevumi 2264
260 Izdevumi 2269
261 Ieņēmumi 22690
262 Izdevumi 2270
263 Izdevumi 2271
264 Izdevumi 2272
265 Izdevumi 2273
266 Izdevumi 2274
267 Izdevumi 2275
268 Izdevumi 2276
269 Izdevumi 2280
270 Izdevumi 2300
271 Izdevumi 2310
272 Izdevumi 2311
273 Izdevumi 2312
274 Izdevumi 2313
275 Izdevumi 2314
276 Izdevumi 2320
277 Izdevumi 2321
278 Izdevumi 2322
279 Izdevumi 2329
280 Izdevumi 2330
281 Izdevumi 2340
282 Ieņēmumi 23400
283 Izdevumi 2341
284 Ieņēmumi 23410
285 Izdevumi 2343
286 Izdevumi 2344
287 Izdevumi 2350
288 Ieņēmumi 23500
289 Ieņēmumi 23510
290 Izdevumi 2360
291 Izdevumi 2361
292 Izdevumi 2362
293 Izdevumi 2363
294 Izdevumi 2364
295 Izdevumi 2365
296 Izdevumi 2366
297 Izdevumi 2369
298 Izdevumi 2370
299 Izdevumi 2380
300 Izdevumi 2381
301 Izdevumi 2389
302 Izdevumi 2390
303 Izdevumi 2400
304 Izdevumi 2500
305 Izdevumi 2510
306 Izdevumi 2512
307 Izdevumi 2513
308 Izdevumi 2514
309 Izdevumi 2515
310 Izdevumi 2516
311 Izdevumi 2519
312 Izdevumi 2520
313 Izdevumi 3000
314 Izdevumi 3000 Subsīdijas un dotācijas
315 Izdevumi 3100
316 Izdevumi 3110
317 Izdevumi 3111
318 Izdevumi 3112
319 Izdevumi 3190
320 Izdevumi 3192
321 Izdevumi 3200
322 Izdevumi 3230
323 Izdevumi 3232
324 Izdevumi 3260
325 Izdevumi 3261
326 Izdevumi 3262
327 Izdevumi 3263
328 Izdevumi 3264
329 Izdevumi 3280
330 Izdevumi 3282
331 Izdevumi 3290
332 Izdevumi 3291
333 Izdevumi 3292
334 Izdevumi 3293
335 Izdevumi 3294
336 Izdevumi 3295
337 Izdevumi 3300
338 Izdevumi 3310
339 Izdevumi 4000
340 Izdevumi 4000 Procentu izdevumi
341 Izdevumi 4100
342 Izdevumi 4110
343 Izdevumi 4200
344 Izdevumi 4240
345 Izdevumi 4300
346 Izdevumi 4330
347 Izdevumi 4331
348 Izdevumi 4332
349 Izdevumi 4334
350 Izdevumi 4339
351 Izdevumi 5000
352 Izdevumi 5000 Pamatkapitāla veidošana
353 Izdevumi 5100
354 Izdevumi 5110
355 Izdevumi 5120
356 Izdevumi 5130
357 Izdevumi 5140
358 Izdevumi 5200
359 Izdevumi 5210
360 Izdevumi 5211
361 Izdevumi 5212
362 Izdevumi 5213
363 Izdevumi 5214
364 Izdevumi 5217
365 Izdevumi 5218
366 Izdevumi 5219
367 Izdevumi 5220
368 Izdevumi 5230
369 Izdevumi 5231
370 Izdevumi 5233
371 Izdevumi 5234
372 Izdevumi 5235
373 Izdevumi 5236
374 Izdevumi 5238
375 Izdevumi 5239
376 Izdevumi 5240
377 Izdevumi 5250
378 Izdevumi 5260
379 Izdevumi 5269
380 Izdevumi 5270
381 Izdevumi 6000
382 Izdevumi 6000 Sociāla rakstura maksājumi un kompensācijas
383 Izdevumi 6200
384 Izdevumi 6210
385 Izdevumi 6211
386 Izdevumi 6212
387 Izdevumi 6213
388 Izdevumi 6214
389 Izdevumi 6215
390 Izdevumi 6216
391 Izdevumi 6220
392 Izdevumi 6221
393 Izdevumi 6222
394 Izdevumi 6223
395 Izdevumi 6224
396 Izdevumi 6225
397 Izdevumi 6226
398 Izdevumi 6227
399 Izdevumi 6228
400 Izdevumi 6229
401 Izdevumi 6230
402 Izdevumi 6231
403 Izdevumi 6232
404 Izdevumi 6233
405 Izdevumi 6234
406 Izdevumi 6235
407 Izdevumi 6237
408 Izdevumi 6238
409 Izdevumi 6239
410 Izdevumi 6240
411 Izdevumi 6241
412 Izdevumi 6242
413 Izdevumi 6290
414 Izdevumi 6291
415 Izdevumi 6292
416 Izdevumi 6293
417 Izdevumi 6294
418 Izdevumi 6295
419 Izdevumi 6296
420 Izdevumi 6299
421 Izdevumi 6400
422 Izdevumi 6420
423 Izdevumi 6422
424 Izdevumi 6500
425 Izdevumi 6510
426 Izdevumi 6520
427 Izdevumi 7100
428 Izdevumi 7100 Valsts budžeta uzturēšanas izdevumu transferti
429 Izdevumi 7110
430 Izdevumi 7120
431 Izdevumi 7130
432 Izdevumi 7131
433 Izdevumi 7132
434 Izdevumi 7139
435 Izdevumi 7140
436 Izdevumi 7300
437 Izdevumi 7320
438 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)
439 Izdevumi 7350
440 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
441 Izdevumi 7353
442 Izdevumi 7354
443 Izdevumi 7400
444 Izdevumi 7460
445 Izdevumi 7460 Pārējie valsts budžeta uzturēšanas izdevumu transferti pašvaldībām
446 Izdevumi 7470
447 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
448 Izdevumi 7471
449 Izdevumi 7472
450 Izdevumi 7500
451 Izdevumi 7500 Atmaksa valsts budžetā par veiktajiem uzturēšanas izdevumiem
452 Izdevumi 7600
453 Izdevumi 7600 Kārtējie maksājumi Eiropas Savienības budžetā
454 Izdevumi 7610
455 Izdevumi 7620
456 Izdevumi 7621
457 Izdevumi 7622
458 Izdevumi 7623
459 Izdevumi 7624
460 Izdevumi 7625
461 Izdevumi 7630
462 Izdevumi 7700
463 Izdevumi 7700 Starptautiskā sadarbība
464 Izdevumi 7710
465 Izdevumi 7711
466 Izdevumi 7712
467 Izdevumi 7713
468 Izdevumi 7720
469 Izdevumi 7730
470 Izdevumi 9000
471 Izdevumi 9100
472 Izdevumi 9120
473 Izdevumi 9120 Valsts budžeta kapitālo izdevumu transferti no valsts pamatbudžeta uz valsts speciālo budžetu
474 Izdevumi 9500
475 Izdevumi 9580
476 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)
477 Izdevumi 9590
478 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
479 Izdevumi 9593
480 Izdevumi 9594
481 Izdevumi 9700
482 Izdevumi 9710
483 Izdevumi 9710 Pārējie valsts budžeta kapitālo izdevumu transferti pašvaldībām
484 Izdevumi 9720
485 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
486 Izdevumi 9721
487 Izdevumi 9722
488 Ieņēmumi A200 Nenodokļu ieņēmumi
489 Ieņēmumi A300 Ieņēmumi no maksas pakalpojumiem un citi pašu ieņēmumi – kopā
490 Ieņēmumi A420 Ārvalstu finanšu palīdzība iestādes ieņēmumos
491 Finansēšana F210100001
492 Finansēšana F210100001 Maksas pakalpojumu un citu pašu ieņēmumu naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)
493 Finansēšana F210100002
494 Finansēšana F210100002 Ārvalstu finanšu palīdzības naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)
495 Finansēšana F210100003
496 Finansēšana F210100003 Valsts speciālā budžeta naudas līdzekļu atlikumu izmaiņas palielinājums (-) vai samazinājums (+)
497 Finansēšana F210100101
498 Finansēšana F210100102
499 Finansēšana F210100103
500 Finansēšana F210100201
501 Finansēšana F210100202
502 Finansēšana F22010010
503 Finansēšana F22010020
504 Finansēšana F29010010
505 Finansēšana F29010020
506 Finansēšana F29110010
507 Finansēšana F29110020
508 Finansēšana F29111010
509 Finansēšana F29111020
510 Finansēšana F29111210
511 Finansēšana F29111220
512 Finansēšana F29210010
513 Finansēšana F29210020
514 Finansēšana F29211010
515 Finansēšana F29211020
516 Finansēšana F29211210
517 Finansēšana F29211220
518 Finansēšana F40010010 Izsniegtie aizdevumi
519 Finansēšana F40010020 Izsniegto aizdevumu saņemtā atmaksa
520 Finansēšana F40020020 Saņemto aizņēmumu atmaksa
521 Finansēšana F40110010
522 Finansēšana F40110020
523 Finansēšana F40111010
524 Finansēšana F40111020
525 Finansēšana F40111210
526 Finansēšana F40111220
527 Finansēšana F40112020
528 Finansēšana F40112220
529 Finansēšana F40210010
530 Finansēšana F40210020
531 Finansēšana F40211010
532 Finansēšana F40211020
533 Finansēšana F40211210
534 Finansēšana F40211220
535 Finansēšana F40211310
536 Finansēšana F40212010
537 Finansēšana F40212020
538 Finansēšana F40212210
539 Finansēšana F40212220
540 Finansēšana F40310010
541 Finansēšana F40310020
542 Finansēšana F40311010
543 Finansēšana F40311020
544 Finansēšana F40311210
545 Finansēšana F40311220
546 Finansēšana F40312010
547 Finansēšana F40312020
548 Finansēšana F40312210
549 Finansēšana F40312220
550 Finansēšana F40313020
551 Finansēšana F40313220
552 Finansēšana F40320020
553 Finansēšana F40322020
554 Finansēšana F40322220
555 Finansēšana F50010000 Akcijas un cita līdzdalība pašu kapitālā
556 Finansēšana F55010010
557 Finansēšana F55010012
558 Finansēšana F55010013
559 Finansēšana F55010019

View 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
1 01-0000 LATVIJAS VALSTS PREZIDENTA KANCELEJA
2 02-0000 LATVIJAS REPUBLIKAS SAEIMA
3 03-0000 VALSTS KANCELEJA
4 04-0000 KORUPCIJAS NOVĒRŠANAS UN APKAROŠANAS BIROJS
5 05-0000 LATVIJAS REPUBLIKAS TIESĪBSARGA BIROJS
6 08-0000 SABIEDRĪBAS INTEGRĀCIJAS FONDS
7 09-0000 SABIEDRISKO PAKALPOJUMU REGULĒŠANAS KOMISIJA
8 10-0000 AIZSARDZĪBAS MINISTRIJA
9 11-0000 ĀRLIETU MINISTRIJA
10 12-0000 EKONOMIKAS MINISTRIJA
11 13-0000 FINANŠU MINISTRIJA
12 14-0000 LATVIJAS REPUBLIKAS IEKŠLIETU MINISTRIJA
13 15-0000 IZGLĪTĪBAS UN ZINĀTNES MINISTRIJA
14 16-0000 ZEMKOPĪBAS MINISTRIJA
15 17-0000 SATIKSMES MINISTRIJA
16 18-0000 LABKLĀJĪBAS MINISTRIJA
17 19-0000 TIESLIETU MINISTRIJA
18 20-0000 KLIMATA UN ENERĢĒTIKAS MINISTRIJA
19 21-0000 VIEDĀS ADMINISTRĀCIJAS UN REĢIONĀLĀS ATTĪSTĪBAS MINISTRIJA
20 22-0000 KULTŪRAS MINISTRIJA
21 24-0000 LATVIJAS REPUBLIKAS VALSTS KONTROLE
22 28-0000 LATVIJAS REPUBLIKAS AUGSTĀKĀ TIESA
23 29-0000 LATVIJAS REPUBLIKAS VESELĪBAS MINISTRIJA
24 30-0000 LR SATVERSMES TIESA
25 32-0000 LATVIJAS REPUBLIKAS PROKURATŪRA
26 35-0000 CENTRĀLĀ VĒLĒŠANU KOMISIJA
27 46-0000 SABIEDRISKO ELEKTRONISKO PLAŠSAZIŅAS LĪDZEKĻU PADOME
28 47-0000 NACIONĀLĀ ELEKTRONISKO PLAŠSAZIŅAS LĪDZEKĻU PADOME

90
tools/calc.py Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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)

View 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"
]
}
}

View 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"
]
}
}