Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
40 changes: 32 additions & 8 deletions docs/tutorials/admin/01-configure-case-types.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,59 @@
---
sidebar_position: 1
title: Configure case types and workflows
description: Step-by-step guide to Configure case types and workflows
description: Create a case type, define allowed statuses and transitions, attach deadlines, and link the document checklist.
---

# Configure case types and workflows

Step-by-step guide to Configure case types and workflows
A case type is the template for every case of one kind — its statuses, allowed transitions, per-status deadlines, required documents, and default participants. This tutorial creates one from scratch.

## Goal

<!-- {{TODO: write the goal}} -->
By the end you will have created a new case type, defined its status lifecycle, configured a deadline, and verified that a new case picks up the configuration.

## Prerequisites

<!-- {{TODO: list prerequisites}} -->
- Administrator role on the Nextcloud instance.
- The Procest register imported (see [Manage Procest settings](./03-admin-settings.md)).
- A clear idea of the statuses your workflow needs.

## Steps

<!-- {{TODO: numbered steps, each with one inline screenshot — see /journeydoc-add-story}} -->
1. From the Procest navigation, scroll to the configuration block and click **Case Types**. The list view opens with the *Cards / Table* toggle and an **Add Item** button. (Case types are also reachable from **Administration settings → Procest** under *Case Type Management*.)

![Case Types list](/screenshots/tutorials/admin/01-configure-case-types-01.png)

2. Click **Add Item**. The case-type dialog opens. Fill the basics — *Name* (e.g. *Vergunningaanvraag*), *Identification* (slug), *Description*, *Default confidentiality*, *Maximum lead time* (in days).

![New case type dialog](/screenshots/tutorials/admin/01-configure-case-types-02.png)

3. Open the **Statuses** tab on the dialog. Add the statuses your workflow needs (*Open*, *In behandeling*, *Wachten op aanvrager*, *Beslissen*, *Afgerond*). For each status set the *Allowed next statuses* — only those will appear in the transition dialog on a case.

![Statuses and transitions](/screenshots/tutorials/admin/01-configure-case-types-03.png)

4. Open the **Deadlines** tab. Set a per-status duration (e.g. *In behandeling: 30 days*) and the *Warning threshold* (e.g. 7 days). Cases of this type re-base their deadline countdown on each transition.

![Per-status deadlines](/screenshots/tutorials/admin/01-configure-case-types-04.png)

5. Open the **Documents** tab. Add the document types that must be present at each status — these power the document checklist on the case detail. Save the whole case type with **Save**.

![Document checklist](/screenshots/tutorials/admin/01-configure-case-types-05.png)

## Verification

<!-- {{TODO: how the user confirms it worked}} -->
You have configured the case type correctly when: it appears in the **Case Types** list with the status count you defined, creating a new case from **Cases → Add Item** and picking this case-type produces a case with the first status pre-set, and the case's deadline countdown reflects the case-type's per-status duration.

## Common issues

| Symptom | Fix |
|---|---|
<!-- {{TODO: rows}} -->
| **Add Item** opens a dialog with no form fields | The Case-type schema is not mapped — re-import configuration via [Manage Procest settings](./03-admin-settings.md). |
| Status transitions on a new case do not match what you configured | The status mapping on the case-type may have been saved before the status schema was created; reopen and save again. |
| Deadline never warns | The warning threshold is larger than the duration, or the case-type field is not mapped to the Case schema. |
| Document checklist on the case is always empty | Document types live in a separate register; confirm the *informatieobjecttype* mapping under **ZGW API Mapping** is configured. |

## Reference

<!-- {{TODO: cross-link into features/*.md}} -->
- [Case management](../../features/case-management.md) — model that case types drive.
- [Automatic actions](./02-automatic-actions.md) — task generation tied to case-type transitions.
40 changes: 32 additions & 8 deletions docs/tutorials/admin/02-automatic-actions.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,59 @@
---
sidebar_position: 2
title: Set up automatic actions
description: Step-by-step guide to Set up automatic actions
description: Create rules that fire on case events — create tasks, send notifications, transition status, kick off integrations.
---

# Set up automatic actions

Step-by-step guide to Set up automatic actions
Automatische acties (automatic actions) are the rule engine that turns case events into tasks, notifications, and follow-up transitions. A rule fires on a *trigger* (a status change, a deadline crossing, a document upload), evaluates a *condition* (always, or only when a field matches), and runs an *action* (create a task, send an email, transition the case, post to an integration).

## Goal

<!-- {{TODO: write the goal}} -->
By the end you will have created an automatic action that fires on a specific status transition and creates a task assigned to a role on the case.

## Prerequisites

<!-- {{TODO: list prerequisites}} -->
- Administrator role on the Nextcloud instance.
- At least one case type configured (see [Configure case types and workflows](./01-configure-case-types.md)).
- A clear idea of which trigger / condition / action you want to chain.

## Steps

<!-- {{TODO: numbered steps, each with one inline screenshot — see /journeydoc-add-story}} -->
1. From the Procest navigation, click **Automatische acties** (in the configuration block). The list opens with the standard Cards/Table toggle and an **Add Item** button.

![Automatic actions list](/screenshots/tutorials/admin/02-automatic-actions-01.png)

2. Click **Add Item**. The rule dialog opens with four sections — *Algemeen* (name, description, active toggle), *Trigger*, *Condition*, *Action*.

![New automatic action dialog](/screenshots/tutorials/admin/02-automatic-actions-02.png)

3. Set the **Trigger**. Pick *Status change* and select the case-type plus the source and target statuses. Other triggers include *Deadline approaching*, *Document uploaded*, *Case created*, *Case closed*.

![Configuring the trigger](/screenshots/tutorials/admin/02-automatic-actions-03.png)

4. Set the **Condition** (optional). Leave blank for "always fire" or add a field match (e.g. *Confidentiality = Public*) so the rule only fires on matching cases. Conditions support AND/OR groups.

![Conditions](/screenshots/tutorials/admin/02-automatic-actions-04.png)

5. Set the **Action**. Pick *Create task*, fill the task title, description, assignee role, and due-date offset. Save the rule with **Save**. Confirm the rule is *Active* in the list — only active rules fire.

![Action and save](/screenshots/tutorials/admin/02-automatic-actions-05.png)

## Verification

<!-- {{TODO: how the user confirms it worked}} -->
You have set up the action correctly when: triggering the configured status transition on a test case produces the new task in the case's **Tasks** sidebar tab, the task is assigned to the configured role, and the rule's *Last run* column in the **Automatische acties** list updates to the most recent fire time.

## Common issues

| Symptom | Fix |
|---|---|
<!-- {{TODO: rows}} -->
| Rule is configured but never fires | The rule's *Active* toggle is off, or the trigger case-type does not match the case-type you tested on. |
| Task is created but unassigned | The configured assignee role is not present on the case; add it to the case's Participants or update the rule to use a role that exists. |
| Action runs but no notification arrives | The notification action uses Nextcloud's mail; SMTP must be configured at the server level (the dev environment intentionally disables outgoing mail — see [PROJECT MEMORY notes on mail](../../#mail-notifications)). |
| Condition does not match what you expect | Open the rule's *Last run* details — the recorded field values clarify why the condition skipped. |

## Reference

<!-- {{TODO: cross-link into features/*.md}} -->
- [Configure case types and workflows](./01-configure-case-types.md) — defines the triggers (statuses, deadlines).
- [Case management](../../features/case-management.md) — the underlying event stream rules listen to.
41 changes: 33 additions & 8 deletions docs/tutorials/admin/03-admin-settings.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,60 @@
---
sidebar_position: 3
title: Manage Procest settings
description: Step-by-step guide to Manage Procest settings
description: Walk the Administration → Procest settings page — version, register configuration, ZGW mapping, map layers, AI features.
---

# Manage Procest settings

Step-by-step guide to Manage Procest settings
The **Administration settings → Procest** page is the single pane for everything you configure once and then forget — the version banner, the OpenRegister mapping, the ZGW API mapping, GIS map layers, and the AI-assisted processing toggles.

## Goal

<!-- {{TODO: write the goal}} -->
By the end you will have opened the Administration settings page, re-imported the Procest configuration, confirmed the register and schema mapping, and recognised the ZGW mapping table.

## Prerequisites

<!-- {{TODO: list prerequisites}} -->
- Administrator role on the Nextcloud instance.
- The OpenRegister app installed and reachable.

## Steps

<!-- {{TODO: numbered steps, each with one inline screenshot — see /journeydoc-add-story}} -->
1. Open **Administration settings → Procest** (left navigation under *Administration*). The header reads *Administration settings: Procest* and the body has five sections — *Version Information*, *Configuration*, *Case Type Management*, *Map Layers*, *ZGW API Mapping*, *AI-Assisted Processing*.

![Admin settings landing](/screenshots/tutorials/admin/03-admin-settings-01.png)

2. The **Version Information** card shows the installed version (e.g. *Procest 0.2.0*) and an **Up to date** badge. Click **Re-import configuration** to (re-)run the OpenRegister import — needed on first install and whenever a Procest release bumps the schemas. Confirm the success toast.

![Re-import configuration](/screenshots/tutorials/admin/03-admin-settings-02.png)

3. Scroll to **Configuration**. Pick the *Register* (e.g. *Procest*) from the first dropdown — the rest of the fields (*Case schema*, *Task schema*, *Status schema*, *Role schema*, *Result schema*, *Decision schema*, *Case type schema*, *Status type schema*) auto-fill from the register. Click **Save** to persist.

![Register and schema mapping](/screenshots/tutorials/admin/03-admin-settings-03.png)

4. Scroll to **ZGW API Mapping**. Each row maps an OpenRegister schema onto a Dutch ZGW API resource (*zaak*, *zaaktype*, *status*, *statustype*, *resultaat*, *resultaattype*, *rol*, *roltype*, *eigenschap*, *besluit*, *besluittype*, *informatieobjecttype*). Click **Edit** to map one; *Not configured* rows are skipped by the ZGW API endpoints.

![ZGW API mapping table](/screenshots/tutorials/admin/03-admin-settings-04.png)

5. Scroll to **Map Layers** and **AI-Assisted Processing**. Use **Add layer** / **PDOK presets** to attach WMS/WFS layers for the case-location map; the AI section toggles document classification, extraction, Q&A, summarisation, routing, and decision-support features (each runs against the configured LLM endpoint).

![Map and AI sections](/screenshots/tutorials/admin/03-admin-settings-05.png)

## Verification

<!-- {{TODO: how the user confirms it worked}} -->
You have configured Procest correctly when: *Version Information* shows *Up to date*, every dropdown under *Configuration* has a value (no empties), *Case Type Management* loads its list, and **ZGW API Mapping** has at least *zaak* / *zaaktype* / *status* / *statustype* configured.

## Common issues

| Symptom | Fix |
|---|---|
<!-- {{TODO: rows}} -->
| **Re-import configuration** errors out | Open Nextcloud → Settings → Logs and read the OpenRegister `ImportHandler` errors; usually a schema with an invalid type — fix the configuration JSON and re-run. |
| Schema dropdowns are empty | The register is not imported yet — click **Re-import configuration** first, then refresh. |
| ZGW mapping table shows only *Not configured* | Map each row by hand or via the **Reset** button to re-populate defaults. The *zaak* row is the minimum needed for the ZGW API. |
| Map layers section "No map layers configured" warning | Click **PDOK presets** to add the standard Dutch PDOK layers in one click. |
| AI features show but never respond | The AI endpoint is not configured at the server level — check the Nextcloud Assistant / LLM settings. |

## Reference

<!-- {{TODO: cross-link into features/*.md}} -->
- [Administration](../../features/administration.md) — the page this tutorial documents.
- [Admin settings](../../features/admin-settings.md) — field reference.
- [Configure case types and workflows](./01-configure-case-types.md) — the next thing to configure once settings are in place.
36 changes: 28 additions & 8 deletions docs/tutorials/user/01-first-launch.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,55 @@
---
sidebar_position: 1
title: Open Procest for the first time
description: Step-by-step guide to Open Procest for the first time
description: Open Procest, walk the navigation, and confirm the OpenRegister back end is wired up.
---

# Open Procest for the first time

Step-by-step guide to Open Procest for the first time
A first look at Procest — where the app lives, what the navigation gives you, and how to tell it is connected to OpenRegister.

## Goal

<!-- {{TODO: write the goal}} -->
By the end you will have opened the Procest app, found your way around the dashboard and left-hand navigation, and confirmed the OpenRegister-backed lists (Cases, Tasks, Bezwaren, …) load.

## Prerequisites

<!-- {{TODO: list prerequisites}} -->
- A Nextcloud account on an instance where the **Procest** app is installed and enabled.
- The **OpenRegister** app installed and enabled — Procest stores cases, tasks, decisions and case types in OpenRegister, so it is a hard dependency.
- The Procest register and its schemas imported. An admin runs this once from **Administration settings → Procest → Re-import configuration** (see [Manage Procest settings](../admin/03-admin-settings.md)).

## Steps

<!-- {{TODO: numbered steps, each with one inline screenshot — see /journeydoc-add-story}} -->
1. Open the Nextcloud app menu in the top bar and pick **Procest**. You land on the dashboard.

![Procest dashboard](/screenshots/tutorials/user/01-first-launch-01.png)

2. Read the dashboard widgets — *Cases by Status*, *Cases by Type*, *My Work*, *Deadline Alerts*, *Task Due Reminders*, *Stalled Cases*, *Case Map*. On a fresh install they read *Widget not available* until cases are created and the register is fully configured.

![Dashboard widgets](/screenshots/tutorials/user/01-first-launch-02.png)

3. Open the left-hand navigation. The top group is your day-to-day work — **Dashboard**, **My Work**, **Work Queue**, **Cases**, **Bezwaren**, **Beroepen**, **Beslissingen op bezwaar**, **Tasks**, **Map**, **Voorstellen**, **Advice**, **BAC-adviezen**, **Transfers**. Below the divider sits the configuration group — **Case Types**, **Legesverordeningen**, **Parafeerroutes**, **Automatische acties**, **Handhavingsstrategie**, and the rest of the admin entries — ending in **Settings**.

![Procest navigation](/screenshots/tutorials/user/01-first-launch-03.png)

4. Click **Cases**. The list view opens with a *Cards / Table* toggle, an **Add Item** button, and a search/actions row. An empty install shows *No items found* — expected until someone creates the first case.

![Cases list, empty state](/screenshots/tutorials/user/01-first-launch-04.png)

## Verification

<!-- {{TODO: how the user confirms it worked}} -->
You are set up correctly when: the Procest dashboard renders without an error banner, the left navigation lists the entries above, and clicking **Cases** (or any other list) shows either rows or a clean *No items found* state — not a load error.

## Common issues

| Symptom | Fix |
|---|---|
<!-- {{TODO: rows}} -->
| "OpenRegister is not installed or enabled" banner | Install and enable the OpenRegister app, then reload Procest. |
| Lists load but **Add Item** opens a dialog with no form fields | The Procest register import is incomplete — an admin re-runs **Administration settings → Procest → Re-import configuration**. |
| Procest is missing from the app menu | The app is not enabled for your account — ask an administrator to enable it (and check it is not restricted to a group you are not in). |
| Dashboard widgets all read *Widget not available* | The register is not connected — see [Manage Procest settings](../admin/03-admin-settings.md). |

## Reference

<!-- {{TODO: cross-link into features/*.md}} -->
- [Case management](../../features/case-management.md) — the data model and lifecycle behind every list.
- [Manage Procest settings](../admin/03-admin-settings.md) — register import, schema mapping, ZGW configuration.
34 changes: 26 additions & 8 deletions docs/tutorials/user/02-my-work.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,53 @@
---
sidebar_position: 2
title: Find your work in My Work
description: Step-by-step guide to Find your work in My Work
description: Use the My Work page to see everything assigned to you across cases and tasks.
---

# Find your work in My Work

Step-by-step guide to Find your work in My Work
The My Work page is the personal queue every case-handler starts the day on — every case and task assigned to you, in one list, with tabs for filtering and a "Ter parafering" panel for items waiting on your initial.

## Goal

<!-- {{TODO: write the goal}} -->
By the end you will have opened My Work, used the tabs to switch between cases and tasks, toggled completed items in and out of view, and recognised the "Ter parafering" section.

## Prerequisites

<!-- {{TODO: list prerequisites}} -->
- Completed [Open Procest for the first time](./01-first-launch.md).
- At least one case or task assigned to your user — otherwise the list is legitimately empty.

## Steps

<!-- {{TODO: numbered steps, each with one inline screenshot — see /journeydoc-add-story}} -->
1. In the Procest navigation, click **My Work**. The page header reads *My Work* with a count.

![My Work landing](/screenshots/tutorials/user/02-my-work-01.png)

2. The top row holds three tabs — **All**, **Cases**, **Tasks** — each with its own count. Click **Cases** to limit the list to cases; click **Tasks** for tasks only.

![My Work tabs](/screenshots/tutorials/user/02-my-work-02.png)

3. Toggle **Show completed** in the filter row to include items you have already finished. By default closed cases and completed tasks are hidden so the queue stays focused on what is still open.

![Show completed toggle](/screenshots/tutorials/user/02-my-work-03.png)

4. Scroll to the **Ter parafering** panel at the bottom — proposals waiting on your initial as part of the paraferingsroute (see [BW Parafering](../../features/bw-parafering.md)). Empty means there is nothing waiting on you.

![Ter parafering panel](/screenshots/tutorials/user/02-my-work-04.png)

## Verification

<!-- {{TODO: how the user confirms it worked}} -->
You are set up correctly when: the My Work page shows counts on each tab, the *Show completed* toggle changes what is listed, and the *Ter parafering* panel is present at the bottom (empty is fine).

## Common issues

| Symptom | Fix |
|---|---|
<!-- {{TODO: rows}} -->
| All tabs read `(0)` even though cases exist | The case is not assigned to your user — open the case and add yourself to a role from **Participants**. |
| *Ter parafering* shows "Geen voorstellen ter parafering" but you expect items | The paraferingsroute step has not been triggered, or your user is not on the step's role; ask an admin to check the route under **Parafeerroutes**. |
| Tabs render but never load | Hard-reload the page; if the issue persists check the browser console for OpenRegister fetch errors. |

## Reference

<!-- {{TODO: cross-link into features/*.md}} -->
- [Case management](../../features/case-management.md) — the data model behind My Work entries.
- [BW Parafering](../../features/bw-parafering.md) — how items end up in *Ter parafering*.
Loading
Loading