Skip to content

Commit

Permalink
Implement general law using event listener (#16)
Browse files Browse the repository at this point in the history
* Implement general law using event listener
* Ensure objections only happen once
  • Loading branch information
anneschuth authored Feb 13, 2025
1 parent e39ba8e commit d2a8362
Show file tree
Hide file tree
Showing 21 changed files with 928 additions and 214 deletions.
29 changes: 27 additions & 2 deletions features/aanvragen_beoordelen.feature
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,34 @@ Feature: Aanvraag Zorgtoeslag
And de persoon dit aanvraagt
Then wordt de aanvraag toegevoegd aan handmatige beoordeling
When de beoordelaar de aanvraag afwijst met reden "Inkomen niet correct opgegeven"
And de burger bezwaar maakt met reden "Inkomen is wel correct, zie bijgevoegde jaaropgave"
Then is de status "APPEALED"
Then kan de burger in bezwaar gaan
When de burger bezwaar maakt met reden "Inkomen is wel correct, zie bijgevoegde jaaropgave"
Then is de status "OBJECTED"
When de beoordelaar het bezwaar toewijst met reden "Inkomen correct na controle jaaropgave"
Then is de status "DECIDED"
And is de aanvraag toegekend
And is het toeslagbedrag "1811.28" euro


Scenario: Burger gaat in bezwaar en krijgt geen gelijk
Given de volgende RvIG personen gegevens:
| bsn | geboortedatum | verblijfsadres | land_verblijf |
| 999993653 | 1998-01-01 | Amsterdam | NEDERLAND |
And de volgende RvIG relaties gegevens:
| bsn | partnerschap_type | partner_bsn |
| 999993653 | GEEN | null |
And de volgende RVZ verzekeringen gegevens:
| bsn | polis_status |
| 999993653 | ACTIEF |
And de volgende BELASTINGDIENST box1 gegevens:
| bsn | loon_uit_dienstbetrekking | uitkeringen_en_pensioenen | winst_uit_onderneming | resultaat_overige_werkzaamheden | eigen_woning |
| 999993653 | 20000 | 0 | 0 | 0 | 0 |
When de zorgtoeslagwet wordt uitgevoerd door TOESLAGEN
And de persoon dit aanvraagt
Then wordt de aanvraag toegevoegd aan handmatige beoordeling
When de beoordelaar de aanvraag afwijst met reden "Inkomen niet correct opgegeven"
Then kan de burger in bezwaar gaan
When de burger bezwaar maakt met reden "Inkomen is wel correct, zie bijgevoegde jaaropgave"
And de beoordelaar het bezwaar afwijst met reden "Inkomen nog steeds niet correct na controle jaaropgave"
Then is de aanvraag afgewezen
And kan de burger niet in bezwaar gaan met reden "er is al eerder bezwaar gemaakt tegen dit besluit"
6 changes: 5 additions & 1 deletion features/environment.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
from machine.logging_config import configure_logging

from eventsourcing.utils import clear_topic_cache


def before_all(context):
log_level = context.config.userdata.get('log_level', 'DEBUG')
context.loggers = configure_logging(log_level)


def before_scenario(context, scenario):
context.config.setup_logging()
context.test_data = {}
Expand All @@ -12,4 +16,4 @@ def before_scenario(context, scenario):


def after_scenario(context, scenario):
pass
clear_topic_cache()
26 changes: 20 additions & 6 deletions features/steps/steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ def step_impl(context, status):
@when('de beoordelaar de aanvraag afwijst met reden "{reason}"')
def step_impl(context, reason):
case = context.services.manager.get_case_by_id(context.case_id)
case.add_manual_decision(
case.decide(
verified_result=context.result.output,
reason=reason,
verifier_id="BEOORDELAAR",
Expand All @@ -290,18 +290,19 @@ def step_impl(context):
@when('de burger bezwaar maakt met reden "{reason}"')
def step_impl(context, reason):
case = context.services.manager.get_case_by_id(context.case_id)
case.add_appeal(reason=reason)
case.object(reason=reason)
context.services.manager.save(case)


@when('de beoordelaar het bezwaar toewijst met reden "{reason}"')
def step_impl(context, reason):
@when('de beoordelaar het bezwaar {approve} met reden "{reason}"')
def step_impl(context, approve, reason):
approve = approve.lower() == 'toewijst'
case = context.services.manager.get_case_by_id(context.case_id)
case.add_manual_decision(
case.decide(
verified_result=context.result.output,
reason=reason,
verifier_id="BEOORDELAAR",
approved=True
approved=approve
)
context.services.manager.save(case)

Expand All @@ -311,3 +312,16 @@ def step_impl(context):
case = context.services.manager.get_case_by_id(context.case_id)
assertions.assertEqual(case.status, 'DECIDED', "Expected case to be decided")
assertions.assertTrue(case.approved, "Expected case to be approved")


@then("kan de burger in bezwaar gaan")
def step_impl(context):
case = context.services.manager.get_case_by_id(context.case_id)
assertions.assertTrue(case.can_object(), "Expected case to be objectable")


@then('kan de burger niet in bezwaar gaan met reden "{reason}"')
def step_impl(context, reason):
case = context.services.manager.get_case_by_id(context.case_id)
assertions.assertFalse(case.can_object(), "Expected case not to be objectable")
assertions.assertEqual(reason, case.objection_status.get("not_possible_reason"), "Expected reasons to match")
3 changes: 3 additions & 0 deletions law/algemene_ouderdomswet/SVB-2024-01-01.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
uuid: a70a061f-7a6d-404d-81f1-b77bbc7863a7
name: AOW-uitkering
law: algemene_ouderdomswet
law_type: "FORMELE_WET"
legal_character: "BESCHIKKING"
decision_type: "TOEKENNING"
discoverable: "CITIZEN"
valid_from: 2024-01-01
service: "SVB"
Expand Down
207 changes: 207 additions & 0 deletions law/awb/bezwaar/JenV-2024-01-01.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
uuid: awb-bezwaar-basis-2024
name: Algemene wet bestuursrecht - Bezwaarmogelijkheid en Termijnen
law: awb/bezwaar
valid_from: 2024-01-01
service: "JenV"
description: >
Bepaalt of bezwaar mogelijk is tegen een besluit en wat de geldende termijnen zijn
volgens de Algemene wet bestuursrecht, met inachtneming van specifieke wetgeving.
references:
- law: "Algemene wet bestuursrecht"
article: "1:3"
url: "https://wetten.overheid.nl/BWBR0005537/2024-01-01#Hoofdstuk1_Titeldeel1.1_Artikel1:3"
- law: "Algemene wet bestuursrecht"
article: "6:7"
url: "https://wetten.overheid.nl/BWBR0005537/2024-01-01#Hoofdstuk6_Afdeling6.2_Artikel6:7"
- law: "Algemene wet bestuursrecht"
article: "7:10"
url: "https://wetten.overheid.nl/BWBR0005537/2024-01-01#Hoofdstuk7_Afdeling7.2_Artikel7:10"
- law: "Algemene wet bestuursrecht"
article: "8:1"
url: "https://wetten.overheid.nl/BWBR0005537/2024-01-01#Hoofdstuk8_Titeldeel8.1_Artikel8:1"

properties:
applies:
- name: "CASE"
aggregate: "ServiceCase"
events:
- type: "Decided"
filter:
approved: false
update:
- method: "determine_objection_status"
mapping:
possible: "$bezwaar_mogelijk"
not_possible_reason: "$reden_niet_mogelijk"
objection_period: "$bezwaartermijn"
decision_period: "$beslistermijn"
extension_period: "$verdagingstermijn"

sources:
- name: "LAW"
description: "De wet waar dit besluit op gebaseerd is"
type: "object"
temporal:
type: "point_in_time"
reference: "$calculation_date"
source_reference:
source_type: "laws"
table: "laws"
fields: [
"decision_type",
"name",
"valid_from",
"legal_character",
"bezwaartermijn_weken",
"beslistermijn_weken",
"verdagingstermijn_weken"
]
select_on:
- name: "uuid"
description: "UUID van de wet"
type: "string"
value: "$CASE.rulespec_uuid"

- name: "EVENTS"
description: "De gebeurtenissen rondom deze zaak"
type: "object"
temporal:
type: "point_in_time"
reference: "$calculation_date"
source_reference:
source_type: "events"
table: "events"
fields: [
"case_id",
"event_type"
]
select_on:
- name: "case_id"
description: "Zaak identifier"
type: "string"
value: "$CASE.id"

output:
- name: "bezwaar_mogelijk"
description: "Is bezwaar mogelijk tegen dit besluit"
type: "boolean"

- name: "reden_niet_mogelijk"
description: "Reden waarom geen bezwaar mogelijk is"
type: "string"
required: false

- name: "bezwaartermijn"
description: "Termijn voor het indienen van bezwaar (standaard artikel 6:7 Awb, tenzij anders bepaald)"
type: "number"
type_spec:
unit: "weeks"
precision: 0
min: 0

- name: "beslistermijn"
description: "Termijn voor beslissing op bezwaar (standaard artikel 7:10 lid 1 Awb, tenzij anders bepaald)"
type: "number"
type_spec:
unit: "weeks"
precision: 0
min: 0

- name: "verdagingstermijn"
description: "Mogelijke verdaging van beslistermijn (standaard artikel 7:10 lid 3 Awb, tenzij anders bepaald)"
type: "number"
type_spec:
unit: "weeks"
precision: 0
min: 0

definitions:
EXCLUDED_DECISION_TYPES:
- "ALGEMEEN_VERBINDEND_VOORSCHRIFT"
- "BELEIDSREGEL"
- "VOORBEREIDINGSBESLUIT"
- "ANDERE_HANDELING"

REQUIRED_LEGAL_CHARACTER:
- "BESCHIKKING"
- "BESLUIT_VAN_ALGEMENE_STREKKING"

DEFAULT_TERMIJN_BEZWAAR_WEKEN: 6
DEFAULT_TERMIJN_BESLISSING_WEKEN: 6
DEFAULT_TERMIJN_VERDAGING_WEKEN: 6

actions:
- output: "bezwaar_mogelijk"
operation: AND
values:
- operation: NOT_IN
subject: "$LAW.decision_type"
values: "$EXCLUDED_DECISION_TYPES"
- operation: IN
subject: "$LAW.legal_character"
values: "$REQUIRED_LEGAL_CHARACTER"
- operation: EQUALS
values:
- operation: FOREACH
subject: "$EVENTS"
combine: ADD
value:
- operation: EQUALS
subject: "$event_type"
value: "Objected"
- 0

- output: "reden_niet_mogelijk"
operation: IF
conditions:
- test:
operation: IN
subject: "$LAW.decision_type"
values: "$EXCLUDED_DECISION_TYPES"
then: "tegen dit type besluit is geen bezwaar mogelijk"
- test:
operation: NOT_IN
subject: "$LAW.legal_character"
values: "$REQUIRED_LEGAL_CHARACTER"
then: "dit is geen besluit in de zin van de AWB"
- test:
operation: NOT_EQUALS
values:
- operation: FOREACH
subject: "$EVENTS"
combine: ADD
value:
- operation: EQUALS
subject: "$event_type"
value: "Objected"
- 0
then: "er is al eerder bezwaar gemaakt tegen dit besluit"
- else: null

- output: "bezwaartermijn"
operation: IF
conditions:
- test:
subject: "$LAW.bezwaartermijn_weken"
operation: NOT_NULL
then: "$LAW.bezwaartermijn_weken"
- else: "$DEFAULT_TERMIJN_BEZWAAR_WEKEN"

- output: "beslistermijn"
operation: IF
conditions:
- test:
subject: "$LAW.beslistermijn_weken"
operation: NOT_NULL
then: "$LAW.beslistermijn_weken"
- else: "$DEFAULT_TERMIJN_BESLISSING_WEKEN"

- output: "verdagingstermijn"
operation: IF
conditions:
- test:
subject: "$LAW.verdagingstermijn_weken"
operation: NOT_NULL
then: "$LAW.verdagingstermijn_weken"
- else: "$DEFAULT_TERMIJN_VERDAGING_WEKEN"
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
uuid: 7d6e5f4c-9876-4f0f-bbbb-123456789def
name: Bijstand Gemeente Amsterdam
law: participatiewet/bijstand
law_type: "FORMELE_WET"
legal_character: "BESCHIKKING"
decision_type: "TOEKENNING"
discoverable: "CITIZEN"
valid_from: 2024-01-01
service: "GEMEENTE_AMSTERDAM"
Expand Down
3 changes: 3 additions & 0 deletions law/zorgtoeslagwet/TOESLAGEN-2024-01-01.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
uuid: f039a040-e414-484d-9116-3cd23e2fd5b2
name: Zorgtoeslag
law: zorgtoeslagwet
law_type: "FORMELE_WET"
legal_character: "BESCHIKKING"
decision_type: "TOEKENNING"
discoverable: "CITIZEN"
valid_from: 2024-01-01
service: "TOESLAGEN"
Expand Down
3 changes: 3 additions & 0 deletions law/zorgtoeslagwet/TOESLAGEN-2025-01-01.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
uuid: 4d8c7237-b930-4f0f-aaa3-624ba035e449
name: Zorgtoeslag
law: zorgtoeslagwet
law_type: "FORMELE_WET"
legal_character: "BESCHIKKING"
decision_type: "TOEKENNING"
discoverable: "CITIZEN"
valid_from: 2025-01-01
service: "TOESLAGEN"
Expand Down
Loading

0 comments on commit d2a8362

Please sign in to comment.