---
name: ultimo-rapport
description: Genereer een Crystal Reports lijst-rapport voor Ultimo vanuit een natuurlijke-taal wens (bijv. "alle bestellingen van afgelopen week bij ESKA"). Zoekt eerst het Ultimo-schema op via de wiki-MCP's, bouwt dan het rapport met ultimo/report_builder.py. Gebruik bij elke vraag om een Ultimo-rapport(je) te maken of aan te passen.
---

# Ultimo Crystal Report genereren

Bouw een Ultimo lijst-rapport uit een prompt. De pijplijn: wens parsen → schema opzoeken (MCP) → donor kiezen → spec schrijven → builder draaien → verifiëren.

## Stap 1 — Parseer de wens

Bepaal uit de prompt:
- **Klant** (bijv. ESKA) — nodig voor klantspecifieke velden via de Ultimo Customer Config MCP
- **Entiteit/hoofdtabel** (bestellingen → PurchaseOrder/Order, jobs → Job, meldingen → Report, enz.)
- **Filter/periode** ("afgelopen week" → datumveld >= CurrentDate - 7)
- **Kolommen** (expliciet genoemd, anders logische defaults: nummer, omschrijving, datum, status, bedrag)
- **Stijlreferentie** (website-URL, Word-document, voorbeeld-.rpt, of geen)

## Stap 2 — Zoek het schema op (ALTIJD, nooit uit eigen kennis)

1. `mcp__claude_ai_Ultimo_Wikipedia__search("<onderwerp>")` voor de juiste entiteit/tabel
2. `mcp__claude_ai_Ultimo_Wikipedia__lookup_table_schema("<Tabel>")` voor exacte kolomnamen (bijv. welk datumveld: CreDate, OrderDate, ...)
3. Bij klantspecifieke wensen: `mcp__claude_ai_Ultimo_Customer_Config__search_config(customer="<klant>", ...)`
4. Let op het Ultimo-veldnaamprefix per tabel (Job→Job..., PurOrder→Ord..., Equipment→Eqm...)

## Stap 3 — Kies een donor-rapport

Het rapport wordt gebouwd vanaf een **donor**: een bestaand Ultimo-rapport dat de juiste tabellen al gelinkt heeft (.rpt-bestanden in de projectmap; gitignored). Dump kandidaten met:

```
python probes/dump_report.py <donor>.rpt
```

Eisen aan de donor:
- De hoofdtabel van de wens moet erin gelinkt zijn
- **Offline beperking**: alleen velden die de donor al ergens gebruikt zijn bindbaar (anders err 509 → warning). Met een live Ultimo-DSN (bij de klant) zijn alle velden bruikbaar.
- Mist een passende donor? Vraag de gebruiker een standaard Ultimo-rapport van die entiteit aan te leveren (bijv. OrderList voor bestellingen).

## Stap 4 — Stijl bepalen (optioneel)

- **Website**: WebFetch de URL, vraag naar primaire/accent-kleuren en fonts → `accent_rgb`, `font`
- **Word-document**: lees met python-docx (kleuren/fonts uit styles)
- **Voorbeeld-.rpt**: `python probes/dump_report.py voorbeeld.rpt` (sectie-achtergrondkleuren, fonts)
- Geen referentie: laat Style-defaults staan (lichtblauwe band, zebra)

Beperking CR 2020: tekstkleur van Text-objecten is niet zetbaar — kies lichte bandkleuren met donkere tekst.

## Stap 5 — Schrijf de spec en bouw

Schrijf een JSON-spec (zie `probes/demo_spec.json` als voorbeeld) en draai:

```
python ultimo/report_builder.py <spec>.json
```

Spec-velden: `title`, `donor`, `output`, `columns` (field/label/width), `criteria` (label + `{@F1}`/`{@F2}`/`{@F3}` — Ultimo vult die runtime), `selection_formula`, `new_formulas`, `style`.

Ultimo-conventies (automatisch via donor + builder):
- Context-filter in selection formula behouden: `{<Tabel>.<Prefix>Context} = 1`
- `ReportTitle` special field in de rapportkop toont `title`
- Footer met PageNofM/PrintDate/PrintTime blijft van de donor
- Pas op met letterlijke datums; gebruik Crystal-syntax (`CurrentDate - 7`, `Date(2026, 6, 1)`)

## Stap 6 — Verifieer en itereer

1. `python probes/dump_report.py <output>.rpt` — controleer secties, kolommen, selectieformule
2. Behandel WARNINGs van de builder (niet-bindbare velden): kies een alternatief veld uit de donor of meld dat dit on-site met live DB moet
3. Met live DB: exporteer een PDF-preview (`rpt.export("preview.pdf")`)
4. Toon de gebruiker een samenvatting: kolommen, filter, stijl, openstaande punten
