Jauni likumi (16): Publiskās un privātās partnerības likums; Publiskas personas kapitāla daļu un kapitālsabiedrību pārvaldības likums; Augstskolu; Valsts valodas; Muzeju; Par ietekmes uz vidi novērtējumu; Sociālo pakalpojumu un sociālās palīdzības; Būvniecības; Maksātnespējas; Valsts kultūrkapitāla fonda; Jūrlietu pārvaldes un jūras drošības (lv-lik-2002-10-31-2); Latvijas vides aizsardzības fonda; Publisko iepirkumu; Zinātniskās darbības; Par darbinieku aizsardzību darba devēja maksātnespējas gadījumā; Par piesārņojumu. validate: 58/58 OK. Shēma (saderīga paplašināšana, datu līgums tāpat): - sadaļa virs nodaļām: Chapter kind="division", ID …sA - pants, kas vēl nav spēkā: status="pending", bez teksta - ID: art…[a-z] (644¹⁸A), ann…sN (1.¹ pielikums) Konvertors: pielikumi (Annex, ieskaitot tabulas rindas; pilnības skaitā); tās pašas dienas likumi → -2; „8.pants” bez punkta; „48.¹” pārejas noteikumos; virsraksts ar izslēgšanas piezīmi; Augstākās Padomes paraksti; noslēgums netiek skaitīts XML pusē (iepriekš mazos likumos >101 %). Neielādēti (vecā struktūra, nākamais darbs): Civilprocesa likums, Satversme, Par policiju, Par Latvijas Nacionālo bibliotēku. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016igpMJBtapmG6vHE4vSF9q
111 lines
7.7 KiB
Markdown
111 lines
7.7 KiB
Markdown
# Likums-as-Code
|
|
|
|
Latvijas Republikas likumi kā strukturēti dati: katrs likums ir viens XML fails, kas atbilst shēmai `schemas/likumi-0.1.xsd`. Tāds pats stils kā `MK-noteikumi-as-Code` (Act, TextVersion, Source, DataVersion, ID shēma, pārbaudes).
|
|
|
|
PPP Asociācijas (PPPA) pilotprojekta **Valsts PirmKods** daļa. Dati katru dienu tiek ielādēti PPPA Valsts Datu Ezerkrātuvē kā datu kopa **B20**; datu līgums — [contracts/B20-likumi.odcs.yaml](contracts/B20-likumi.odcs.yaml).
|
|
|
|
> Šie nav oficiāli dati. Juridiski saistošs ir oficiālajā izdevumā „Latvijas Vēstnesis” publicētais teksts.
|
|
|
|
## Struktūra
|
|
|
|
```
|
|
Likums-as-Code/
|
|
├── schemas/likumi-0.1.xsd # shēma, nosaukumtelpa urn:pppa:vpk:likumi:0.1
|
|
├── data/<id>.xml # viens fails katram likumam
|
|
├── verification/<id>.verify.json
|
|
├── tools/convert.py # likumi.lv konsolidētā teksta Word → XML
|
|
├── tools/validate.py # XSD + faila nosaukums = @id
|
|
├── likumi.yaml # katalogs
|
|
├── contracts/B20-likumi.odcs.yaml # datu līgums (ODCS v3)
|
|
└── README.md
|
|
```
|
|
|
|
## Dokumenta uzbūve
|
|
|
|
`Law @id` → `Act` (rekvizīti), `TextVersion` (redakcija un grozījumi), `Source` (iesniegtais fails, SHA-256), `EnactingFormula`, `Body` (`Chapter` → `Article` → `Part` → `Point` → `Point`), `TransitionalProvisions`, `EuReference`, `InForceStatement`, `Adoption`, `Promulgation`, `Signatory`, `Annex`, `DataVersion`.
|
|
|
|
- `TextVersion @basis`: `consolidated` (konsolidētā redakcija, `@asOf` = attēlotās redakcijas datums) vai `original`.
|
|
- `Article`, `Part`, `Point @status`: `in_force` vai `deleted` (izslēgta vienība paliek failā ar izslēgšanas tekstu).
|
|
- `Note`: redakcijas atzīmes "(Ar grozījumiem, kas izdarīti ar …)" un "(… likuma redakcijā …)" pie attiecīgās vienības.
|
|
- `kind`: apraksta birka (purpose, scope, definition, lead, item, provision, delegation, in_force, transitional, deleted), nevis juridiska klasifikācija.
|
|
|
|
## Avots: likumi.lv lapa (HTML)
|
|
|
|
`tools/convert.py` pieņem arī likumi.lv likuma lapu (`<likumi_id>.html`) — Word eksportu nevar lejupielādēt automātiski.
|
|
`tools/html_source.py` no lapas izveido to pašu rindkopu secību, ko dod Word fails, un convert.py to strukturē ar tiem pašiem noteikumiem.
|
|
|
|
```
|
|
python3 tools/html_source.py fetch <likumi_id> <kešs> # lapa + grozījumu likumu lapas
|
|
python3 tools/convert.py <kešs>/<likumi_id>.html data/<id>.xml
|
|
```
|
|
|
|
- Numuri (pants, daļa, punkts) lapā ir drukāti tekstā, tāpēc tie tiek ņemti tieši, nevis skaitīti kā Word numerācijā.
|
|
- Grozījumu saraksts (`TextVersion/Amendment`) tiek veidots no grozījumu likumiem, uz kuriem atsaucas redakcijas piezīmes,
|
|
un katra grozījuma lapas pases (pieņemts, publicēts, stājas spēkā). Grozījums, kas tekstā neatstāja piezīmi
|
|
(piem., valūtas maiņa uz eiro), sarakstā var nebūt.
|
|
- Iestarpināta nodaļa: „II¹ nodaļa” → `c2.1` (`n="2¹"`), „Piektā A nodaļa” → `c5.1` (`n="5A"`).
|
|
- Panti bez nosaukuma („2.pants. (1) …”) un izslēgti panti („28.pants. (Izslēgts …)”) tiek atpazīti.
|
|
- Bloki pēc paraksta, kas nav likuma teksts (piem., „PIEZĪMES”), un izslēgtas atsauces uz regulām netiek iekļauti; tie ir verification failā.
|
|
- Kataloga ierakstiem no HTML ir `likumi_id` un `source: html`.
|
|
- Ja noslēgumā nav „Likums Saeimā pieņemts …” (piem., Augstākās Padomes likumi), pieņemšanas datums tiek ņemts no likumi.lv pases; tas ir verification failā.
|
|
- ES atsauce ar vienu aktu bez saraksta: ievadteikums kļūst par vienīgo `Item`. CELEX tiek noteikts arī formai „(ES) 2022/2557” (direktīva L, regula R, lēmums D).
|
|
- Sadaļa virs nodaļām („A sadaļa …”, piem., PPP likums, kapitāla daļu likums) → `Chapter kind="division"`, ID `…sA`; nodaļas ir tajā ieliktas, to ID paliek pēc drukātā numura (`c1` … `c30`).
|
|
- Pielikumi (likumi.lv bloki pēc paraksta) → `Annex` ar `Heading`, `Title` un `Line` katrai rindkopai vai tabulas rindai (šūnas atdalītas ar „ | ”); „1.¹ pielikums” → `ann1s1`. Pielikumu teksts ir pilnības skaitā.
|
|
- Divi likumi, pieņemti vienā dienā: otrais saņem ID ar `-2` (… `-9`), izšķir `likumi.yaml` pēc `likumi_id` (piem., `lv-lik-2002-10-31-2`).
|
|
- Pants, kas pieņemts, bet vēl nav spēkā (likumi.lv rāda tikai nosaukumu un piezīmi „Pants stājas spēkā … un iekļauts likuma redakcijā uz …”) → `status="pending"`, bez teksta.
|
|
- Numuru varianti: „8.pants (1) …” (bez punkta), „644.¹⁸A pants” → `art644s18a`, pārejas noteikumu „48.¹ …” → `tp.p48s1`.
|
|
- Augstākās Padomes likumu paraksti („Latvijas Republikas Augstākās Padomes priekšsēdētājs …”, „… sekretārs …”) → `Signatory`.
|
|
- Lielapjoma ielāde: tiek ieņemts tikai fails, kas atbilst XSD un kura teksta pilnība ir 99–101 %; pārējie paliek ārpus `data/` ar iemeslu atskaitē.
|
|
|
|
Salīdzinājums ar Word avotu (lv-lik-2000-10-19): tie paši nodaļu, pantu un daļu identifikatori, tie paši rekvizīti un noslēgums;
|
|
HTML versijā 12 vietās nav Word eksporta salipušo punktu, un tai nav neviena konvertora lēmuma pārbaudei (Word: 15).
|
|
|
|
## Identifikatori
|
|
|
|
| Vienība | Paraugs | Piemērs |
|
|
|---|---|---|
|
|
| Likums | `lv-lik-<pieņemšanas datums>[-N]` | `lv-lik-2000-10-19` |
|
|
| Nodaļa | `<id>.cN` | `lv-lik-2000-10-19.c2` |
|
|
| Pants | `<id>.artN`, 28¹ → `art28s1` | `lv-lik-2000-10-19.art28s1` |
|
|
| Daļa | `<pants>.dN`, 4¹ → `d4s1` | `lv-lik-2000-10-19.art10.d4s1` |
|
|
| Punkts | `<…>.pN` (rekursīvi) | `lv-lik-2000-10-19.art2.d2.p7` |
|
|
| Pārejas noteikumi | `<id>.tp`, `<id>.tp.pN` | `lv-lik-2000-10-19.tp.p31.p1` |
|
|
| ES atsauce | `<id>.eu`, `<id>.eu.N` | `lv-lik-2000-10-19.eu.2` |
|
|
| Pielikums | `<id>.annN` | `lv-lik-2000-10-19.ann1` |
|
|
|
|
Likumiem nav numura, tāpēc ID pamatā ir Saeimas pieņemšanas datums. Vienā datumā pieņemtus likumus atšķir ar `-2`, `-3`.
|
|
|
|
## Akoma Ntoso
|
|
|
|
Shēma nav Akoma Ntoso, bet ir pārveidojama uz to bez informācijas zuduma:
|
|
|
|
| likumi-0.1 | Akoma Ntoso (OASIS LegalDocML) |
|
|
|---|---|
|
|
| `Law` | `akomaNtoso/act` |
|
|
| `Act` | `meta/identification` FRBRWork (datums, izdevējs, veids) |
|
|
| `TextVersion @asOf` | FRBRExpression (`FRBRdate`), `meta/lifecycle` |
|
|
| `TextVersion/Amendment` | `lifecycle/eventRef` + `passiveModifications` |
|
|
| `Source` | FRBRManifestation |
|
|
| `EnactingFormula` | `preamble/formula` |
|
|
| `Chapter` | `chapter` (eId `chap_N`); `kind="division"` → `part` (eId `part_A`) |
|
|
| `Article` | `article` (eId `art_N`) |
|
|
| `Part` | `paragraph` (eId `art_N__para_M`) |
|
|
| `Point` | `point` (eId `…__point_K`) |
|
|
| `TransitionalProvisions` | `hcontainer name="transitional"` |
|
|
| `Note` | `authorialNote` |
|
|
| `Annex` | `attachments/attachment` (eId `att_N`) |
|
|
| `InForceStatement`, `Adoption`, `Promulgation`, `Signatory` | `conclusions` |
|
|
|
|
ID pārveide: `.c` → `chap_`, `.art` → `art_`, `.d` → `__para_`, `.p` → `__point_`, `s1` → `_1` (piem., `art10.d4s1` → `art_10__para_4_1`). Pārveidotājs `tools/to_akn.py` vēl nav izveidots.
|
|
|
|
## Pārbaudes
|
|
|
|
`tools/validate.py`: XSD (struktūra, ID formāts, ID unikalitāte) un faila nosaukums = `@id`.
|
|
`tools/convert.py` katram failam raksta `verification/<id>.verify.json`: vienību skaits, avota un XML teksta zīmju skaits (bez atstarpēm) un saraksts ar vietām, kur konvertors pieņēma lēmumu (piem., Word numurs "41" interpretēts kā daļa 4¹, nenumurēta rindkopa pievienota iepriekšējai vienībai). Šīs vietas pārbauda cilvēks.
|
|
|
|
## Statuss
|
|
|
|
Paraugs: 1 likums ("Par sabiedrisko pakalpojumu regulatoriem", redakcija uz 2026-04-03) — 9 nodaļas, 57 panti, 248 daļas, 131 punkts, 73 redakcijas atzīmes, 21 grozījums; XSD derīgs; teksta pilnīgums 99,4 % (76 028 no 76 482 zīmēm); 15 vietas pārbaudei.
|
|
|
|
Avota Word failā daži vārdi ir salipuši (piem., "izveidesun"); konvertors tekstu nelabo.
|