# Plan: Issue #18 — Set up DB migrations for members table

## Summary

Create a Nextcloud OCP migration class that sets up the `oc_mv_members` table with all columns specified in the issue and requirements section 5.2. The migration follows Nextcloud's migration framework using `\OCP\Migration\SimpleMigrationStep` and Doctrine DBAL schema. Foreign key columns for `stufe_id` and `family_id` are created as nullable integer columns (FK constraints will be added when those tables are created in issues #30 and #27 respectively).

## Implementation Steps

### Step 1: Create Migration Class

- File: `lib/Migration/Version000001Date20260407000000.php`
- Namespace: `OCA\Mitgliederverwaltung\Migration`
- Extends: `SimpleMigrationStep`
- Method: `changeSchema(IOutput $output, Closure $schemaClosure, array $options)`

### Step 2: Define Table Schema — `oc_mv_members`

Columns (from issue #18 specification):

| Column | Type | Constraints |
|--------|------|------------|
| `id` | bigint | PK, autoincrement, unsigned |
| `vorname` | string(255) | NOT NULL |
| `nachname` | string(255) | NOT NULL |
| `geburtsdatum` | date | NOT NULL |
| `geschlecht` | string(20) | nullable |
| `rolle` | string(30) | NOT NULL, default 'mitglied' |
| `stufe_id` | bigint | nullable, unsigned (FK to oc_mv_stufen, added later) |
| `eintritt` | date | NOT NULL |
| `austritt` | date | nullable |
| `status` | string(20) | NOT NULL, default 'aktiv' |
| `allergien_encrypted` | text | nullable |
| `notizen` | text | nullable |
| `zusatz_notizen` | text | nullable |
| `kv_typ` | string(20) | nullable |
| `kv_name` | string(255) | nullable |
| `family_id` | bigint | nullable, unsigned (FK to oc_mv_families, added later) |
| `frozen_fee_rate` | decimal(10,2) | nullable |
| `calendar_event_uri` | string(512) | nullable |
| `contact_vcard_uri` | string(512) | nullable |
| `created_at` | datetime | NOT NULL, default CURRENT_TIMESTAMP |
| `updated_at` | datetime | NOT NULL, default CURRENT_TIMESTAMP |
| `deleted_at` | datetime | nullable |

### Step 3: Add Indexes

- Index on `status` (frequent filtering)
- Index on `family_id` (joins)
- Index on `stufe_id` (joins)
- Index on `nachname` (sorting/searching)
- Index on `deleted_at` (soft-delete queries)
- Composite index on `status, deleted_at` (common query pattern: active non-deleted members)

### Step 4: Verify Migration Structure

- Ensure the class is properly namespaced and autoloadable via PSR-4
- Ensure the table name uses Nextcloud's table prefix convention (just use `mv_members` — Nextcloud adds `oc_` prefix)

## Acceptance Criteria Checklist

1. [ ] Migration file exists at `lib/Migration/Version000001Date20260407000000.php`
2. [ ] Class extends `SimpleMigrationStep` and implements `changeSchema`
3. [ ] Table `mv_members` is created with all 20 columns from the spec
4. [ ] Column types match the specification (string for enums, bigint for FKs, decimal for fee rate, etc.)
5. [ ] `id` is primary key, autoincrement, unsigned bigint
6. [ ] NOT NULL constraints applied to: vorname, nachname, geburtsdatum, rolle, eintritt, status, created_at, updated_at
7. [ ] Nullable columns: geschlecht, stufe_id, austritt, allergien_encrypted, notizen, zusatz_notizen, kv_typ, kv_name, family_id, frozen_fee_rate, calendar_event_uri, contact_vcard_uri, deleted_at
8. [ ] Default values set for: rolle='mitglied', status='aktiv'
9. [ ] Appropriate indexes are created
10. [ ] PHP syntax is valid (no parse errors)
11. [ ] File follows Nextcloud migration conventions (namespace, class name pattern)
12. [ ] Migration is idempotent (checks if table exists before creating)
