Uru-ka-gina, Uru-inim-gina of Iri-ka-gina (Sumerisch: 𒌷𒅗𒄀𒈾 URU-KA-gi.na; ca. 24e eeuw voor Christus, korte chronologie) was een heerser (ensi) van de stadstaat Lagash in Mesopotamië. Hij nam de titel van koning aan en beweerde goddelijk te zijn benoemd bij de val van zijn corrupte voorganger Lugalanda.
Hij is vooral bekend om zijn hervormingen om corruptie te bestrijden, die soms worden genoemd als het eerste voorbeeld van een wettelijke code in de geschiedenis. Hoewel de eigenlijke tekst niet is ontdekt, kan veel van de inhoud ervan vermoed worden uit andere gevonden verwijzingen ernaar. Daarin stelde hij weduwen en wezen vrij van belastingen; dwong de stad om begrafeniskosten te betalen (inclusief de rituele voedsel- en drankoffers voor de reis van de doden naar de lagere wereld); en besloten dat de rijken zilver moeten gebruiken bij de aankoop van de armen, en als de armen niet willen verkopen, kan de machtige man (de rijke man of de priester) hem niet dwingen dit te doen.
- Portabel, volledig ontkoppeld van databases.
- Semantisch geoptimaliseerd om regelingen in korte en leesbare notaties weer te geven en uit te voeren (No Code).
- Koppelbare formulieren middels Question Answer aangestuurd vanuit de rule engine.
Virtual Society heeft voor haar low code strategie een configuratie taal ontwikkelt in YAML om regelingen eenvoudig in te brengen binnen haar systeem. Het voordeel van deze taal is dat er met sterk verkorte anotaties regels uitgevoerd kunnen worden.
Virtual Society hecht veel waarde aan Low Code. No Code daarentegen kan een negatief effect hebben op de ontwikkeltijd van een systeem. Zo werkt No code bijvoorbeeld prima voor het in elkaar klikken van een user interface, daarentegen is regelgeving zeer semantisch en kan men beter tot configureren overgaan binnen een taal die geoptimaliseerd is daartoe. Zo'n taal wordt ook wel een Domain Specific Languag genoemd (DSL). DSL's zijn in dit geval efficienter dan No Code. Virtual Society kiest er eveneens voor de DSL in YAML te representeren. De reden hiervoor is dat DEV-OPS omgevingen voor zowel technische ICT infrastructuur (OPS) als infrastructure as code (DEV) (IAC) uitdrukken in YAML. De stap naar de business wordt hierdoor verkleind binnen de BUS-DEV-OPS cycle. Dit is van groot belang binnen continous delivery in de OTAP. straat. De YAML's van vitual society bevatten dan ook stuurinformate om dit voortbrenginsproces te ondersteunen.
stuurinformatie:
onderwerp: <<beknopte beschrijving>>
organisatie: <<instantie,gemeente of organisatie>>
type: <<toeslagen>>
domein: <<zorg, werk of inkomen>>
versie: <<major>>.<<minor>>>.<<revision>>
status: <<ontwikkel,test,acceptatie,productie>>
periode: <<Begindatum>> <<Einddatum>
bron: <<permalink>>
Geef hier een beknopte omschrijving van de regel
Geef hier de naam van de organisatie weer.
Geeft hier type van de uitvoering/regelgeving op.
Geef hier het werkdomein op.
Virtual Society adviseert om binnen versiebeheer in combinatie met status de volgende werkwijze aan te houden:
Ophogen na bevindingen uit de functionele en/of gebruikers acceptatie testers (FAT/GAT) binnen de acceptatie test omgeving in de OTAP straat.
Ophogen na bevindingen uit de testers binnen een Agile Team die werken aan hetzelfde probleem domein binnen de ontwikkel omgeving in de OTAP straat.
Ophogen bij een volgende (mogelijke) oplevering uit de ontwikkel omgeving binnen de OTAP straat. Herhaal hierbij de eerder genoemde werkwijze.
Geeft een indicatie van status yaml document. Ontwikkel, Test, Accpetatie, Productie
De periode van gegevens waarover het Yaml document berekeningen mag uitvoeren.
Een verwijzing naar regelgeving document waar de regels uitgelegd worden.
Middels formules kunnen berekeningen gemaakt worden rondom (situationele) classificeringen welke voortkomen uit normen en formules. Binnen de YAML worden formules geencapsuleerd binnen de volgende YAML tag:
formule:
formule:
<<classificatie>>: literale formule
formule:
<<classificatie>>:
- situatie: <<classificering>>
formule: <<literale formule>>
- situatie: <<classificering>>
formule: <<literale formule>>
YAML deelrepresentatie
stuurinformatie:
onderwerp: zorgtoeslag
organisatie: belastingdienst
type: toeslagen
domein: zorg
versie: 1.0
status: ontwikkel
jaar: 2019
bron: https://download.belastingdienst.nl/toeslagen/docs/berekening_zorgtoeslag_2019_tg0821z91fd.pdf
De zorgtoeslag is een bijdrage in de kosten van de zorgverzekering. Of en hoeveel zorgtoeslag uw klant krijgt, hangt af van:
- de standaardpremie
- de normpremie
- het (gezamenlijke) toetsingsinkomen
- het (gezamenlijke) vermogen
Heeft uw klant of zijn eventuele toeslagpartner vermogen, zoals spaargeld en beleggingen? Als het (gezamenlijke) vermogen op 1 januari 2019 hoger is dan de vrijstellingsgrens, heeft uw klant het hele jaar geen recht op zorgtoeslag. Per persoon is de vermogensvrijstelling € 30.360. Daarnaast geldt een vrijstellingsbedrag van € 84.416. Dit bedrag geldt voor uw klant en zijn eventuele toeslagpartner samen. In de tabel staat hoeveel vermogen uw klant maximaal mag hebbenop 1 januari 2019. Buitenlands vermogen telt ook mee.
situatie | maximaal vermogen |
---|---|
Alleenstaande | € 114.776 |
Aanvrager met toeslagpartner | € 145.136 |
YAML deelrepresentatie
tabellen:
- naam: maximaalvermogen
situatie, waarde:
- [ alleenstaande, 11476 ]
- [ aanvrager met toeslagpartner, 14536 ]
Uw klant heeft recht op zorgtoeslag als de standaardpremie hoger is dan de normpremie. U berekent de zorgtoeslag van uw klant in 5 stappen.
YAML deelrepresentatie
berekening:
- stap: 1
omschrijving: bepaal de standaard premie
formule: standaardpremie
- stap: 2
omschrijving: bereken het gezamenlijke toestingsinkomen
formule: toetsingsinkomen
- stap: 3
omschrijving: bereken de normpremie
formule: normpremie
- stap: 4
situatie: binnenland
omschrijving: bereken de zorgtoeslag wanneer men binnen nederland woont
formule: zorgtoeslag
- stap: 5
situatie: buitenland
omschrijving: bereken de zorgtoeslag wanner men in het buitenland woont
formule: zorgtoeslag
De standaardpremie is voor 2019 vastgesteld op € 1.609. Bij een aanvrager met een toeslagpartner wordt tweemaal de standaardpremie genomen (€ 3.218).
YAML representatie
formules:
- standaardpremie:
- situatie: alleenstaande
formule: 1609
- situatie: aanvrager_met_toeslagpartner
formule: 3218
Toetsingsinkomen aanvrager | € |
Toetsingsinkomen toeslagpartner | € |
___________ + | |
Gezamenlijk toetsingsinkomen | € |
YAML representatie
- toetsingsinkomen:
formule: toetsingsinkomen_aanvrager + toetsingsinkomen_toeslagpartner
Uw klant heeft geen recht op zorgtoeslag als het toetsingsinkomen hoger is dan: • € 29.562 (aanvrager zonder toeslagpartner) • € 37.885 (aanvrager met toeslagpartner)
YAML deelrepresentatie
- recht_op_zorgtoeslag:
- situatie: alleenstaande
formule: toetsinginkomen <= 29562
- situatie: aanvrager_met_toeslagpartner
formule: toetsinginkomen <= 37885
Let op! Woont uw klant buiten Nederland? Dan is het wereldinkomen het toetsingsinkomen.
stuurinformatie:
onderwerp: zorgtoeslag
organisatie: belastingdienst
type: toeslagen
domein: zorg
versie: 1.0
status: ontwikkel
jaar: 2019
bron: https://download.belastingdienst.nl/toeslagen/docs/berekening_zorgtoeslag_2019_tg0821z91fd.pdf
berekening:
- stap: 1
omschrijving: bepaal de standaard premie
formule: standaardpremie
- stap: 2
omschrijving: bereken het gezamenlijke toestingsinkomen
formule: toetsingsinkomen
- stap: 3
omschrijving: bereken de normpremie
formule: normpremie
- stap: 4
situatie: binnenland
omschrijving: bereken de zorgtoeslag wanneer men binnen nederland woont
formule: zorgtoeslag
- stap: 5
situatie: buitenland
omschrijving: bereken de zorgtoeslag wanner men in het buitenland woont
formule: zorgtoeslag
formules:
- standaardpremie:
- situatie: alleenstaande
formule: 1609
- situatie: aanvrager_met_toeslagpartner
formule: 3218
- maximaalvermogen:
- situatie: alleenstaande
formule: 114776
- situatie: aanvrager_met_toeslagpartner
formule: 145136
- recht_op_zorgtoeslag:
- situatie: alleenstaande
formule: toetsinginkomen <= 29562
- situatie: aanvrager_met_toeslagpartner
formule: toetsinginkomen <= 37885
- drempelinkomen:
formule: 20941
- toetsingsinkomen:
formule: toetsingsinkomen_aanvrager + toetsingsinkomen_toeslagpartner
- normpremie:
- situatie: alleenstaande
formule: min(percentage(2.005) * drempelinkomen + max(percentage(13.520) * (toetsingsinkomen - drempelinkomen),0), 1189)
- situatie: aanvrager_met_toeslagpartner
formule: min(percentage(4.315) * drempelinkomen + max(percentage(13.520) * (toetsingsinkomen - drempelinkomen),0), 2314)
- buitenland:
formule: niet(woonland,'Nederland')
- binnenland:
formule: wel(woonland,'Nederland')
- zorgtoeslag:
- situatie: binnenland
formule: round((standaardpremie - normpremie) / 12,2)
- situatie: buitenland
formule: round((standaardpremie - normpremie) * woonlandfactor / 12,2)
- woonlandfactor:
formule: lookup('woonlandfactoren',woonland,'woonland','factor')
tabellen:
- naam: maximaalvermogen
situatie, waarde:
- [ alleenstaande, 11476 ]
- [ aanvrager met toeslagpartner, 14536 ]
- naam: woonlandfactoren
woonland, factor:
- [ Finland, 0.7161 ]
- [ Frankrijk, 0.8316 ]
- [ België, 0.7392 ]
- [ Bosnië-Herzegovina, 0.0672 ]
- [ Bulgarije, 0.0735 ]
- [ Cyprus, 0.1363 ]
- [ Denemarken, 0.9951 ]
- [ Duitsland, 0.8701 ]
- [ Estland, 0.2262 ]
- [ Finland, 0.7161 ]
- [ Frankrijk, 0.8316 ]
- [ Griekenland, 0.2490 ]
- [ Hongarije, 0.1381 ]
- [ Ierland, 0.8667 ]
- [ IJsland, 0.9802 ]
- [ Italië, 0.5470 ]
- [ Kaapverdië, 0.0177 ]
- [ Kroatië, 0.1674 ]
- [ Letland, 0.0672 ]
- [ Liechtenstein, 0.9720 ]
- [ Litouwen, 0.2399 ]
- [ Luxemburg, 0.7358 ]
- [ Macedonië, 0.0565 ]
- [ Malta, 0.3574 ]
- [ Marokko, 0.0193 ]
- [ Montenegro, 0.0821 ]
- [ Noorwegen, 1.3729 ]
- [ Oostenrijk, 0.6632 ]
- [ Polen, 0.1691 ]
- [ Portugal, 0.2616 ]
- [ Roemenië, 0.0814 ]
- [ Servië, 0.0714 ]
- [ Slovenië, 0.3377 ]
- [ Slowakije, 0.2405 ]
- [ Spanje, 0.4001 ]
- [ Tsjechië, 0.2412 ]
- [ Tunesië, 0.0292 ]
- [ Turkije, 0.0874 ]
- [ Verenigd Koninkrijk, 0.7741 ]
- [ Zweden, 0.8213 ]
- [ Zwitserland, 0.8000 ]
Bovenstaande berekening bestaat uit een aantal stappen. Bij iedere stap vraagt Urukagina om variabelen die niet gevonden konden worden in het script of welke niet eerder doorgestuurd werden aan de API. De converstatie gebeurd in JSON format. De stappen uit de converstatie kunnen afgespeeld worden met bijgeleverde POSTMAN bestanden.
Hier is een screenshot van postman met de bijgeleverde bestanden:
Om een idee te geven van een conversatie hebben we de JSON's uit die conversatie geconverteerd naar YAML zodat ze leesbaar/compacter zijn voor deze readme. Er zijn twee typen conversaties:
-
Geautomatiseerd
Bij geautomatiseerde processen is het mogelijk om alles beschikbare variabelen die nodig zijn voor de berekening van te voren aan te de API door te geven. Dit reduceert round-trip time en biedt daarmee een hogere performance voor batch berekeningen. -
User Centric
Bij user centricity is het mogelijk een conversatie/assistant te bouwen en deze aan te laten sturen middels een zgn. Question Answer principe Bij iedere stap geeft de API aan welke input er verwacht wordt.
In dit voorbeeld gebruiken we de User Centric approach.
In stap 1 wordt uitsluitend als startpunt het uit te voeren YAML script meegegeven. In dit geval wordt verwezen naar een URL waar het YAML script met de berekening van de zorgtoeslag staat.
Het volgende bericht wordt naar de API service gestuurd:
Config: https://raw.githubusercontent.com/sjefvanleeuwen/virtual-society-urukagina/master/doc/test-payloads/zorgtoeslag-2019.yml
De API Server geeft als antwoord:
isError: false
message:
stacktrace:
- step:
name: '1'
description: bepaal de standaard premie
formula: standaardpremie
situation: ''
isSituational: false
exception:
parameters: []
questions:
sessionId: ''
parameters:
- name: alleenstaande
value: Situation
type: UnresolvedType
- name: aanvrager_met_toeslagpartner
value: Situation
type: UnresolvedType
De reactie bevat geen fout isError=false. Dit betekent dat het YAML script goed is uitgevoerd, onder step kan men zien dat het script is gestopt bij de eerste stap in de berekening, namelijk bij het uitvoeren van de formule standaardpremie. De API service vewacht nu een invoer van de client applicatie.
Één van de twee situaties dienen nu aangegeven te worden om de standaardpremie verder te kunnen berekenen. Er wordt gekozen voor alleenstaande.
[x] Alleenstaande [ ] Aanvrager met toeslagpartner
Het volgende bericht wordt naar de API service gestuurd:
---
Config: https://raw.githubusercontent.com/sjefvanleeuwen/virtual-society-urukagina/master/doc/test-payloads/zorgtoeslag-2019.yml
Parameters:
- Name: alleenstaande
Value: ja
De API Server geeft als antwoord (sommige data is weggelaten voor leesbaarheid):
YAML deelrepresentatie
---
isError: false
message:
stacktrace:
- step:
name: '1' ......
- step:
name: '2'
description: bereken het gezamenlijke toestingsinkomen
formula: toetsingsinkomen
situation: ''
isSituational: false
exception:
parameters:
- name: alleenstaande
value: true
type: Boolean
- name: standaardpremie
value: 1609
type: Double
questions:
sessionId: ''
parameters:
- name: toetsingsinkomen_aanvrager
value: unresolved
type: String
Het volgende bericht wordt naar de API service gestuurd:
Config: https://raw.githubusercontent.com/sjefvanleeuwen/virtual-society-urukagina/master/doc/test-payloads/zorgtoeslag-2019.yml
Parameters:
- Name: alleenstaande
Value: ja
- Name: toetsingsinkomen_aanvrager
Value: '19000'
De API Server geeft als antwoord (sommige data is weggelaten voor leesbaarheid):
YAML deelrepresentatie
isError: false
message:
stacktrace:
- step:
name: '1' ..........
exception:
- step:
name: '2'
description: bereken het gezamenlijke toestingsinkomen
formula: toetsingsinkomen
situation: ''
isSituational: false
exception:
parameters:
- name: alleenstaande
value: true
type: Boolean
- name: toetsingsinkomen_aanvrager
value: 19000
type: Double
- name: standaardpremie
value: 1609
type: Double
questions:
sessionId: ''
parameters:
- name: toetsingsinkomen_toeslagpartner
value: unresolved
type: String
Config: https://raw.githubusercontent.com/sjefvanleeuwen/virtual-society-urukagina/master/doc/test-payloads/zorgtoeslag-2019.yml
Parameters:
- Name: alleenstaande
Value: ja
- Name: toetsingsinkomen_aanvrager
Value: '19000'
- Name: toetsingsinkomen_toeslagpartner
Value: '0'
De API Server geeft als antwoord (sommige data is weggelaten voor leesbaarheid):
YAML deelrepresentatie
isError: false
message:
stacktrace:
- step:
name: '1' ..........
- step:
name: '2' ..........
- step:
name: '3'
description: bereken de normpremie
formula: normpremie
situation: ''
isSituational: false
exception:
parameters:
- name: alleenstaande
value: true
type: Boolean
- name: toetsingsinkomen_aanvrager
value: 19000
type: Double
- name: toetsingsinkomen_toeslagpartner
value: 0
type: Double
- name: standaardpremie
value: 1609
type: Double
- name: toetsingsinkomen
value: 19000
type: Double
- name: drempelinkomen
value: 20941
type: Double
- name: normpremie
value: 419.86704999999995
type: Double
questions:
sessionId: ''
parameters:
- name: woonland
value: unresolved
type: String
Config: https://raw.githubusercontent.com/sjefvanleeuwen/virtual-society-urukagina/master/doc/test-payloads/zorgtoeslag-2019.yml
Parameters:
- Name: alleenstaande
Value: ja
- Name: toetsingsinkomen_aanvrager
Value: '19000'
- Name: toetsingsinkomen_toeslagpartner
Value: '0'
- Name: woonland
Value: Nederland
Eindantwoord, volledig:
isError: false
message:
stacktrace:
- step:
name: '1'
description: bepaal de standaard premie
formula: standaardpremie
situation: ''
isSituational: false
exception:
- step:
name: '2'
description: bereken het gezamenlijke toestingsinkomen
formula: toetsingsinkomen
situation: ''
isSituational: false
exception:
- step:
name: '3'
description: bereken de normpremie
formula: normpremie
situation: ''
isSituational: false
exception:
- step:
name: '4'
description: bereken de zorgtoeslag wanneer men binnen nederland woont
formula: zorgtoeslag
situation: binnenland
isSituational: true
exception:
parameters:
- name: alleenstaande
value: true
type: Boolean
- name: toetsingsinkomen_aanvrager
value: 19000
type: Double
- name: toetsingsinkomen_toeslagpartner
value: 0
type: Double
- name: woonland
value: Nederland
type: String
- name: standaardpremie
value: 1609
type: Double
- name: toetsingsinkomen
value: 19000
type: Double
- name: drempelinkomen
value: 20941
type: Double
- name: normpremie
value: 419.86704999999995
type: Double
- name: binnenland
value: true
type: Boolean
- name: zorgtoeslag
value: 99.09
type: Double
- name: buitenland
value: false
type: Boolean
questions:
De YAML interpreter is een programma dat instructies uitvoert die zijn geschreven in een taal op hoog niveau, in dit geval dient de eerder beschreven YAML als input. De interpreter is geschreven in C# en heeft 2 doelstellingen:
- Het interpreteren van de YAML en deze direct uit te voeren.
- Het interpreteren van de YAML en een Software Development Kit (SDK) aan te bieen om de YAML te kunnen transpilen naar een andere programmeer taal.
De interpreter is in C# geschreven (Dot Net Core). Dot Net Core is een opensource versie van Microsoft .NET. C# voldoet aan de internationale ECMA standaard (ECMA 334). ECMA is een standaardorganisatie voor informatie- en communicatiesystemen. Het verwierf zijn huidige naam in 1994, toen de European Computer Manufacturers Association (ECMA) zijn naam veranderde om het wereldwijde bereik en de activiteiten van de organisatie weer te geven.
Meer informatie over ECMA-334 kan hier gevonden worden. https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-334.pdf
Under construction. Het volledige YAML script kan getranspiled worden naar een compileerbare taal. Momenteel is er een YAML naar C# regelingen transpiler. Het voordeel van een dergelijke transpiler is dat de resulterende source code uitgevoerd kan worden op een computer systeem en kan helpen bij:
- Het versnelt uitvoeren van regelgeving logica t.b.v. algoritmisch onderzoek, waaronder inputs en outputs classificering voor machine learning.
- Het genereren van RESTfull Services
- Het vereenvoudigen van business processes, waaronder workflow engines zoals BPMN.
- Het uitvoeren van Smart Contracts
Under construction.
- YamlDotNet MIT License
YamlDotNet is een .NET-bibliotheek voor YAML. YamlDotNet biedt low-level parsing en emitting van [YAML] (http://www.yaml.org/) evenals een objectmodel op hoog niveau vergelijkbaar met XmlDocument. Er is ook een serialisatiebibliotheek opgenomen waarmee objecten van en naar YAML-streams kunnen worden gelezen en geschreven.
Momenteel ondersteunt YamlDotNet [versie 1.1 van de YAML-specificatie] (http://yaml.org/spec/1.1/). - dotnet core MIT License
dotnet core is een cross platform ontwikkeltaal voor cloud-, IoT- en desktop-apps.
Retourneert de eerste gevonden resultaatwaarde vanuit de aangegeven resultaat kolomop basis van de opzoekwaarde uit de opgegeven zoekkolomn vanuit opgegeven tabel.
Voorbeeld : lookup('woonlandfactoren',woonland,'woonland','factor')
Zoekt in de tabel 'woonlandfactoren' naar de waarde die opgegeven is in de variabele woonland binnen kolom woonlaand en retourneert hierbij de waarde uit de kolom 'factor' als resultaat.
Retourneert de absolute waarde van een decimaal getal.
Retourneert de hoek waarvan de cosinus het opgegeven getal is.
Retourneert de hoek waarvan de sinus het opgegeven getal is.
Retourneert de hoek waarvan de raaklijn het opgegeven getal is.
Retourneert de hoek waarvan de raaklijn het quotiënt is van twee opgegeven getallen.
Retourneert de kleinste integraalwaarde die groter is dan of gelijk is aan het opgegeven drijvende-kommagetal met dubbele precisie.
Retourneert de cosinus van de opgegeven hoek.
Retourneert de hyperbolische cosinus van de opgegeven hoek.
Retourneert e verhoogd tot het opgegeven vermogen.
Retourneert de grootste integraalwaarde kleiner dan of gelijk aan het opgegeven drijvende-kommagetal met dubbele precisie.
Retourneert de rest die resulteert uit de deling van een opgegeven getal door een ander opgegeven getal.
Retourneert de natuurlijke (basis e) logaritme van een opgegeven getal.
Retourneert de logaritme van een opgegeven getal in een opgegeven basis.
Retourneert de 10 logaritme van een opgegeven getal.
Retourneert de grootste van twee dubbele precisie drijvende-kommagetallen.
Retourneert de kleinste van twee dubbele precisie drijvende-kommagetallen.
Retourneert een opgegeven getal verhoogd tot de opgegeven macht.
Rondt een drijvende-komma-waarde met dubbele precisie af naar de dichtstbijzijnde integraalwaarde en rondt de middelpuntwaarden naar het dichtstbijzijnde even getal af.
Rondt een drijvende-komma-waarde met dubbele precisie af op een opgegeven aantal fractionele cijfers en rondt de middelpuntwaarden af op het dichtstbijzijnde even getal.
Rondt een drijvende-komma-waarde met dubbele precisie af op een opgegeven aantal fractionele cijfers en gebruikt de opgegeven afrondingsconventie voor middelpuntwaarden.
Rondt een dubbele-precisie drijvende-kommawaarde naar het dichtstbijzijnde gehele getal af en gebruikt de opgegeven afrondingsconventie voor middelpuntwaarden.
Retourneert een geheel getal dat het teken van een drijvende-kommagetal met dubbele precisie aangeeft.
Retourneert de sinus van de opgegeven hoek.
Retourneert de hyperbolische sinus van de opgegeven hoek.
Retourneert de vierkantswortel van een opgegeven getal.
Retourneert de raaklijn van de opgegeven hoek.
Retourneert de hyperbolische tangens van de opgegeven hoek.
Berekent het integrale deel van een opgegeven drijvende-kommagetal met dubbele precisie.
Documentatie omtrent UX kun je hier terugvinden: UX Documentatie