feat: Juleica number and expiry date for members with calendar reminder #160

Closed
opened 2026-04-09 22:14:12 +02:00 by shahondin1624 · 0 comments
Owner

User Story

As a Vereinsadministrator,
I want to store a Juleica card number and its expiry date for each member, and receive a calendar reminder 2 months before expiry,
So that I can track which members hold a valid Juleica and ensure renewals happen on time.

Description

The Juleica (Jugendleiter/in-Card) is a standardised ID for youth group leaders in Germany. Members may optionally hold one. This story adds two new optional fields to the Member entity — juleica_nummer (string) and juleica_ablaufdatum (date) — and integrates them into the full data lifecycle: UI, import, export, and calendar sync.

Acceptance Criteria

Data Model

  • The Member entity has two new optional fields: juleica_nummer (varchar, nullable) and juleica_ablaufdatum (date, nullable).
  • A new database migration adds both columns to mv_members.

UI

  • The MemberDetail / MemberForm shows a "Juleica" section with fields for "Juleica-Nummer" and "Ablaufdatum".
  • Both fields are optional — a member can have neither, only the number, or both.
  • If an Ablaufdatum is set and is in the past, it is displayed with a visual warning (e.g. red text or badge "abgelaufen").
  • If an Ablaufdatum is within the next 2 months, it is displayed with an orange/yellow warning ("laeuft bald ab").

Import / Export

  • The per-entity CSV export for Mitglieder includes "Juleica-Nummer" and "Juleica-Ablaufdatum" columns.
  • The per-entity CSV import auto-maps these German headers to the new fields.
  • ZIP bundle export/import includes the new fields.
  • Migration mode (content-based matching) handles the new fields correctly.

Calendar Reminder

  • When a member has a juleica_ablaufdatum, a calendar event/reminder is created 2 months before the expiry date.
  • The calendar event title follows the pattern: "Juleica-Erneuerung: {Vorname} {Nachname}".
  • When the Ablaufdatum is updated, the old reminder is removed and a new one is created.
  • When the Ablaufdatum is cleared, the reminder is removed.

Audit

  • Changes to juleica_nummer and juleica_ablaufdatum are tracked in the audit log.

Out of Scope

  • Juleica number format validation (no standard format enforced)
  • Integration with the official Juleica API

Notes

  • The calendar sync should follow the existing CalendarSyncService pattern used for birthday reminders.
  • The EntityExportService column registry and EntityImportService field definitions must be updated for the new fields.
## User Story **As a** Vereinsadministrator, **I want to** store a Juleica card number and its expiry date for each member, and receive a calendar reminder 2 months before expiry, **So that** I can track which members hold a valid Juleica and ensure renewals happen on time. ## Description The Juleica (Jugendleiter/in-Card) is a standardised ID for youth group leaders in Germany. Members may optionally hold one. This story adds two new optional fields to the Member entity — `juleica_nummer` (string) and `juleica_ablaufdatum` (date) — and integrates them into the full data lifecycle: UI, import, export, and calendar sync. ## Acceptance Criteria ### Data Model - [ ] The Member entity has two new optional fields: `juleica_nummer` (varchar, nullable) and `juleica_ablaufdatum` (date, nullable). - [ ] A new database migration adds both columns to `mv_members`. ### UI - [ ] The MemberDetail / MemberForm shows a "Juleica" section with fields for "Juleica-Nummer" and "Ablaufdatum". - [ ] Both fields are optional — a member can have neither, only the number, or both. - [ ] If an Ablaufdatum is set and is in the past, it is displayed with a visual warning (e.g. red text or badge "abgelaufen"). - [ ] If an Ablaufdatum is within the next 2 months, it is displayed with an orange/yellow warning ("laeuft bald ab"). ### Import / Export - [ ] The per-entity CSV export for Mitglieder includes "Juleica-Nummer" and "Juleica-Ablaufdatum" columns. - [ ] The per-entity CSV import auto-maps these German headers to the new fields. - [ ] ZIP bundle export/import includes the new fields. - [ ] Migration mode (content-based matching) handles the new fields correctly. ### Calendar Reminder - [ ] When a member has a `juleica_ablaufdatum`, a calendar event/reminder is created 2 months before the expiry date. - [ ] The calendar event title follows the pattern: "Juleica-Erneuerung: {Vorname} {Nachname}". - [ ] When the Ablaufdatum is updated, the old reminder is removed and a new one is created. - [ ] When the Ablaufdatum is cleared, the reminder is removed. ### Audit - [ ] Changes to `juleica_nummer` and `juleica_ablaufdatum` are tracked in the audit log. ## Out of Scope - Juleica number format validation (no standard format enforced) - Integration with the official Juleica API ## Notes - The calendar sync should follow the existing `CalendarSyncService` pattern used for birthday reminders. - The EntityExportService column registry and EntityImportService field definitions must be updated for the new fields.
shahondin1624 added the backendfrontendenhancementdatabaseintegration labels 2026-04-09 22:14:12 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: shahondin1624/Mitgliederverwaltung#160