lumnik. / scenarios All scenarios · Français

Lotus Notes: quality complaints read through the Domino Data Service

Goal Read a Notes view without touching the database, check the view's count, and be told of a critical complaint nobody has taken on.

A valve manufacturer's quality department has tracked its customer complaints in a Lotus Notes database for twenty years. The Domino Data Service exposes it as JSON.

complaints-20261105.json
[
 {
  "@unid": "ADF73C1ECCB7805890D15213E40BE291",
  "@noteid": "8F6",
  "@position": "1",
  "@form": "Complaint",
  "@modified": "2026-09-04T17:00:00Z",
  "ComplaintNo": "RQ-26-0001",
  "Customer": "Fromagerie Vercors",
  "Product": "Vanne papillon DN80",
  "Severity": "3 - Mineure",
  "Status": "En analyse",
  "Received": "2026-09-02T17:00:00Z",
  "$7": "Attribuée",
  "Owner": "Marc Roche/QUALITE/Acme"
 },
 {
  "@unid": "FE1B06C01F04F16A7158FAC2298E43B0",
  "@noteid": "8FA",
  "@position": "2",

… 870 more lines

manifests/10-complaints.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-domino-a  connector_type: rest-generic  scopes: [quality-a]spec:  base_url: http://notes-quality  auth: { kind: basic, username: lumnik reader, password_env: SCENARIO_DOMINO_PASSWORD_A }   # a Notes user with Reader access  endpoints:    - id: open-complaints      path: /quality/complaints.nsf/api/data/collections/name/OpenComplaints      method: GET      pagination:        kind: offset        offset_param: start        limit_param: count        limit: 20        response_path: $        total_header: Content-Range          # items 0-19/57: the view's count after the slash      target:        kind: hybrid        table: ext.scenario_domino_a        unique_key: $['@unid']        promote:          - { name: complaint_no, path: $.ComplaintNo, type: text }          - { name: customer, path: $.Customer, type: text }          - { name: product, path: $.Product, type: text }          - { name: severity, path: $.Severity, type: text }          - { name: status, path: $.Status, type: text }          - { name: received, path: $.Received, type: timestamptz }          - { name: owner, path: $.Owner, type: text }          - { name: assignment, path: "$['$7']", type: text }   # the view's computed column, named by its position
manifests/20-critical-unassigned.yaml
apiVersion: apps.lumnik.io/v1kind: Processmetadata:  name: scenario-domino-critical-aspec:  scope: quality-a  on: { event: data.row.changed, table: ext.scenario_domino_a }  when:    - severity=1 - Critique    - assignment=Non attribuée  emit:    type: decision.critical-unassigned-a    message: "{complaint_no}: critical complaint from {customer} on {product}, received {received}, nobody assigned"    key: complaint_no
complaints-20261106.json
[
 {
  "@unid": "ADF73C1ECCB7805890D15213E40BE291",
  "@noteid": "8F6",
  "@position": "1",
  "@form": "Complaint",
  "@modified": "2026-09-04T17:00:00Z",
  "ComplaintNo": "RQ-26-0001",
  "Customer": "Fromagerie Vercors",
  "Product": "Vanne papillon DN80",
  "Severity": "3 - Mineure",
  "Status": "En analyse",
  "Received": "2026-09-02T17:00:00Z",
  "$7": "Attribuée",
  "Owner": "Marc Roche/QUALITE/Acme"
 },
 {
  "@unid": "FE1B06C01F04F16A7158FAC2298E43B0",
  "@noteid": "8FA",
  "@position": "2",

… 928 more lines

Limits

  • Replayed against a stand-in for the Domino Data Service written for this scenario, not a Domino server: its headers, its page past the end and its count ceiling are not verified here.
  • The view is read whole on every run: nothing from Domino says here what changed since the last read.
  • A categorized view (category rows, response documents at @position 1.2) was not replayed.
  • Session authentication (Domino's login form, the LtpaToken cookie) was not replayed: HTTP Basic only.
  • Complaints, customers and names synthetic.

Quality · Notes

The complaints live in a Notes database.

Twenty years of forms, views and @formulas.

complaints.nsf

The problem

A critical complaint arrives in the evening. It waits for the morning.

  • The Owner field is empty.
  • The view shows it to whoever opens it.

What is not changed

The Notes database stays as it is.

  • Its forms, its views, its ACL.
  • A Notes user with Reader access.

What had to be written

offset_param: start
limit_param: count
total_header: Content-Range

Domino's pagination, declared.

  • The view's count checks the read.
  • The computed column $7 says the assignment.

What was fixed

Content-Range reads as a count (#1866).

  • items 0-19/57: 57.
  • A list promoted as text no longer escapes its / (#1867).

Try it

The scenario replays locally.

Every step is published with its output.

This scenario runs on lumnik Open, free and open source.

Try lumnik Open →