<!-- Generated by scripts/build-prompts.mjs — do not edit by hand. -->
# このツールを作ってください: Verarbeitungsverzeichnis

*以下がすべて機能要件です。書かれているとおりに実装してください。書かれていない点は自分で判断し、何を前提にしたかを述べてください。*

## 出発点

**openToolbox** テンプレートを使ってください：https://github.com/m-dohmen/openToolbox。まずそのリポジトリの `AGENTS.md` を読むこと — スキーマの形、フィールド型、単一ファイルビルドを壊す禁止事項について、そこが正典です。業務固有の内容はすべて `src/domain.js` 一つに収めます。

> openToolbox skill を導入済みなら（`claude plugin install opentoolbox@opentoolbox`）、このファイルを貼るだけで足ります。テンプレートは skill が自分で取得します。

## 背景にある問題

GDPR 第 30 条により、ほぼすべての企業が処理活動の記録を備えなければなりません。しかし名に値するものを備えている企業はほとんどありません。理由は多くの場合、やる気ではなく収集にあります。答えは 12 人の手元に散らばっています。応募書類は人事、メール配信ツールは広報、防犯カメラは管理人。中央で埋めようとすれば、メールを 12 通出して 9 通返ってきます。だからこのツールは「送って回すもの」として成立する必要があります。各部門が自分の処理を申告し、保存し、送り返す。

## 最終的に何が出来ていればよいか

ダブルクリックで開ける自己完結型の HTML ファイル 1 つ。サーバーもインストールも不要です。ファイル自体がデータベースでもあり、保存するとレコードを埋め込んだ新しい HTML ファイルが書き出されます。

## レコード

1 件は **Verarbeitung**、複数は **Verarbeitungen**。

**フィールド**

| キー | ラベル | 型 | 補足 |
| --- | --- | --- | --- |
| `name` | Verarbeitungstätigkeit | text | 必須 |
| `area` | Bereich | enum | 次のいずれか：Personal · Vertrieb · Marketing · IT · Buchhaltung · Empfang |
| `contact` | Ansprechperson | text | 表ヘッダー `Kontakt` |
| `purpose` | Zweck der Verarbeitung | text | 複数行, 表ヘッダー `Zweck` |
| `subjects` | Betroffene | enum | 次のいずれか：Beschäftigte · Bewerberinnen und Bewerber · Kundinnen und Kunden · Interessenten · Lieferanten · Besucher |
| `categories` | Datenkategorien | text | 複数行, 表ヘッダー `Daten` |
| `basis` | Rechtsgrundlage | enum | 次のいずれか：Vertrag (Art. 6 I b) · Rechtliche Pflicht (Art. 6 I c) · Berechtigtes Interesse (Art. 6 I f) · Einwilligung (Art. 6 I a) · noch zu klären, 表ヘッダー `Grundlage` |
| `system` | System / Ablage | text | 表ヘッダー `System` |
| `processor` | Auftragsverarbeiter | text | 表ヘッダー `AV` |
| `thirdCountry` | Drittlandtransfer | enum | 次のいずれか：nein · ja · unklar, 表ヘッダー `Drittland` |
| `retention` | Löschfrist | text | 表ヘッダー `Frist` |
| `risk` | Risiko | enum | 次のいずれか：gering · mittel · hoch |
| `status` | Status | enum | 次のいずれか：gemeldet · in Prüfung · freigegeben · nachzubessern |
| `reviewed` | Zuletzt geprüft | date | 表ヘッダー `Geprüft` |
| `note` | Notiz | text | 複数行 |
| `age` | Tage seit Prüfung | computed | 計算値。保存はしない, 表ヘッダー `Alter` |

**表示**

- 主列：`name`
- 主列の下に置く 2 行目：`area`
- 表の列（この順）：`name`, `area`, `basis`, `subjects`, `retention`, `age`, `status`
- サイドバーの絞り込み：`area`, `status`, `risk`
- 未完了として数えなくなる条件：`r.status === 'freigegeben'`
- 赤で強調する条件：`!r.reviewed || r.reviewed < iso(-365)`

**計算フィールド**

描画のたびに算出し、レコードには絶対に書き戻しません。保存した派生値は、入力のどれかが変わった瞬間に誤りになります。

- `age` (Tage seit Prüfung):

  ```js
  const reviewed = localDateFromIso(r.reviewed)
  if (!reviewed) return ''
  /* Ganze lokale Tage über die Date.UTC-Differenz der Tageskompo-
     nenten - exakt ganzzahlig, ohne Rundungsrettung und ohne den
     Mix aus UTC-Mitternacht und Lokal-Mitternacht. */
  const now = new Date()
  return (
    (Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()) -
      Date.UTC(reviewed.getFullYear(), reviewed.getMonth(), reviewed.getDate())) /
    86400000
  )
  ```

**検証ルール**

フィールドをまたぐ条件です。入力フォーム、CSV 取り込み、AI の提案がすべて同じチェックを通るよう、一箇所で効かせてください。

- **条件** `r.basis === 'Einwilligung (Art. 6 I a)'` → **要求** `note`
  **メッセージ:** „Bei einer Einwilligung gehört in die Notiz, wie und wo sie eingeholt wird.“
- **条件** `r.thirdCountry === 'ja'` → **要求** `processor`
  **メッセージ:** „Bei einem Drittlandtransfer muss stehen, wer dort verarbeitet.“
- **条件** `r.status === 'freigegeben'` → **要求** `purpose`, `categories`, `retention`, `reviewed`
  **メッセージ:** „Freigeben lässt sich nur, was Zweck, Datenkategorien, Löschfrist und Prüfdatum hat.“
- **条件** `r.risk === 'hoch'` → **要求** `note`
  **メッセージ:** „Ein hohes Risiko braucht eine Begründung — es kann eine Folgenabschätzung auslösen.“

## ダッシュボード

絞り込み後ではなく、レコード全体を対象とするタイルです。

- 数値 1 つ：**Verarbeitungen** — 件数 · „im Verzeichnis“
- 数値 1 つ：**Prüfung überfällig** — 件数（フィルタに一致するレコードのみ）: `isOverdue(r)` · „nie oder vor über einem Jahr“
- 数値 1 つ：**Offene Fragen** — 件数（フィルタに一致するレコードのみ）: `r.basis === 'noch zu klären' || r.thirdCountry === 'unklar'` · „Rechtsgrundlage oder Drittland unklar“
- `status` の値ごとのドーナツ
- `area` の値ごとの棒。指標は 件数 — **Verarbeitungen je Bereich**
- `risk` の値ごとの棒。指標は 件数 — **Verteilung nach Risiko**

## ガイド付き入力

1 件だけ報告すればよく、ツールに不慣れな人のための短い手順です。最後の手順を確定するまで何も書き込まれません。途中でやめても何も残らないこと。

タイトル：**Eine Verarbeitung melden**

> Fünf kurze Schritte. Wenn Sie etwas nicht wissen, lassen Sie es leer — ein unvollständiger Eintrag ist besser als keiner. Gespeichert wird erst am Ende.

1. **ステップ 1** — Was und wer: フィールド：`name`, `area`, `contact`
2. **ステップ 2** — Zweck und Daten: フィールド：`purpose`, `subjects`, `categories`
3. **ステップ 3** — Rechtsgrundlage: フィールド：`basis`, `note`
4. **ステップ 4** — Wo liegt es: フィールド：`system`, `processor`, `thirdCountry`, `retention`
5. **ステップ 5** — Risiko: フィールド：`risk`
   次の場合のみ表示：`drafts.records?.subjects === 'Beschäftigte' || drafts.records?.subjects === 'Bewerberinnen und Bewerber' || drafts.records?.thirdCountry === 'ja'`
6. **ステップ 6** — Prüfen: スキーマから生成される確認画面

完了画面：「Danke — das ist aufgenommen. Bitte die Datei speichern und zurücksenden.」

## 既定値

`src/app.jsx` の `DEFAULT_SETTINGS`、`DEFAULT_COLORS`、`DEFAULT_HOME` に設定します。

- タイトル: **Verarbeitungsverzeichnis**
- サブタイトル: Art. 30 DSGVO — gemeldet von den Fachbereichen
- ファイル名: `verarbeitungsverzeichnis`
- バージョン: `1.0`
- 画面の言語: `de`
- 起動時の表示: ガイド付き入力（一覧は隠す）
- 配色: `accent` #3a5a8c · `band` #1b2333 · `flag` #b0472e · `ok` #3a7a5e · `pending` #c08a12

## スタートページ

アプリはこの文章から始まります。Markdown の小さな部分集合（見出し、箇条書き、引用、太字、斜体、インラインコード、リンク）です。そのまま使ってください：

```markdown
# Verzeichnis von Verarbeitungstätigkeiten

Nach **Art. 30 DSGVO** muss fast jedes Unternehmen eines führen. Fast keines führt eines, das den
Namen verdient — und der Grund ist selten Unwille.

Es ist die Erhebung. Die Angaben liegen bei zwölf verschiedenen Leuten: die Bewerbungsmappen bei
der Personalstelle, das Newsletter-Werkzeug im Marketing, die Videoanlage beim Hausmeister. Wer das
zentral ausfüllen will, schreibt zwölf Mails und bekommt neun Antworten.

## Was diese Demo zeigt

Diese Datei ist im **Erfassungsmodus** ausgeliefert: sie öffnet direkt im Meldeformular und zeigt
die Liste gar nicht. Gedacht ist sie zum Weiterschicken — jeder Fachbereich meldet seine eigene
Verarbeitung, speichert und schickt zurück. Die Rückläufer führt man mit *Datei abgleichen*
zusammen.

Umschalten auf das vollständige Werkzeug: **Einstellungen → Anwendung → Öffnet als**.

> Erfundene Einträge, Veranschaulichung der Struktur. Keine Rechtsberatung.
```

## サンプルデータ

初回起動時に空にならないよう、現実味のあるサンプルレコードを 10 件用意してください。上のフィールドに合わせて創作します。これは例示であってユーザーのデータではありません。本番データは **Import CSV → replace all** から入れる、と伝えてください。

## 完了条件

- `npm run build` が自己完結した `dist/index.html` を 1 つ出力する
- `npm test` が通る
- ダブルクリックで開き、サンプルレコードが表示される
- 計算フィールドに値が出て、ルールに反するレコードは保存を拒否される
- 設定・配色・スタートページが上の仕様どおりである

## 引き渡す前に

受け取る側に委ねず、自分で決めてください：`copyright` をツールの所有者に設定し、openToolbox リポジトリを指すヘッダーリンクを差し替え、相手がデータ入力だけなら `examplePrompts` を切ります。利用カウンター（設定 → セキュリティ）は引き渡し時に自分から伝えること。

---

*`examples/gdpr-processing.domain.js` から生成 — [ライブデモ](https://m-dohmen.github.io/openToolbox/demos/gdpr-processing/) の実際のソースです。再生成は `npm run prompts`。*

*デモのデータはすべて架空です。この種のツールの構造を示すものであり、法的助言でも適合性の証明でもありません。*
