457 Commits

Author SHA1 Message Date
Matthias Hochmeister
c1de8bd163 fix(dienstgrad): add ASB→Abschnittssachbearbeiter, remove non-existent ranks (FA/FF/BOI/BAM variants), sync DB constraint, TS types, and display map 2026-04-15 19:26:21 +02:00
Matthias Hochmeister
eb2342684e feat(bestellungen): add optional "Für Mitglied" field, auto-populated from internal request submitter 2026-04-15 18:17:54 +02:00
Matthias Hochmeister
67fd0878ce fix(sync): add Sachbearbeiter to dienstgrad constraint; add catalog browser dialog for external order position 2026-04-15 18:05:39 +02:00
Matthias Hochmeister
9586822a32 fix(sync): scrape AusbildungenListEdit instead of KursteilnehmerListEdit, add selectAlleAnzeige, fix column detection; handle Sachbearbeiter dienstgrad and ignore placeholder handles 2026-04-15 17:40:08 +02:00
Matthias Hochmeister
55b2fc1cf4 fix(sync): switch to full member list scrape so all FDISK members are synced, not just known accounts 2026-04-15 14:44:39 +02:00
Matthias Hochmeister
719b7bfcdb feat(sync): sync all FDISK members, auto-creating dashboard accounts for users not yet logged in 2026-04-15 14:36:57 +02:00
Matthias Hochmeister
dab4a45b79 fix(shop): don't load assigned items until a user is explicitly selected 2026-04-15 14:21:30 +02:00
Matthias Hochmeister
c3fcbd1467 fix(bestellungen): use status label as button text, all progress buttons blue, keep red for reject only 2026-04-15 14:03:54 +02:00
Matthias Hochmeister
6ff531f79c refactor(mitglieder): split member profile into Stammdaten/Ausrüstung/Qualifikationen tabs with sub-tabs per qualification type 2026-04-15 13:55:16 +02:00
Matthias Hochmeister
50dbf6e9fd fix(multi): FDISK sync, order UX, Ausbildungen display, untracked items
FDISK sync:
- fix(sync): strip 'KFZ-Führerschein / ' prefix from license class select option text before whitelist validation
- fix(sync): fix navigateAndGetTableRows to pick date column with most matches (prevents sidebar tables from hijacking dateColIdx for Beförderungen)
- fix(sync): input.value fallback now falls through to textContent when value is empty
- feat(sync): expand Ausbildungen to capture Kursnummer, Kurz, Kurs (full name), Erfolgscode from FDISK table; add migration 086

External orders (Bestellungen):
- fix(bestellungen): allow erhalten_menge editing in lieferung_pruefen status (resolves deadlock preventing order completion)
- fix(bestellungen): show cost/received warnings for bestellt/teillieferung/lieferung_pruefen, not just when abgeschlossen is next
- feat(bestellungen): rename status labels to Eingereicht, Genehmigt, Teilweise geliefert, Vollständig geliefert
- fix(bestellungen): remove duplicate Bestelldatum from PDF export
- feat(bestellungen): add catalog item autocomplete to creation form (auto-fills bezeichnung + artikelnummer)

Internal orders (Ausruestungsanfrage):
- fix(ausruestung): untracked items with zuweisung_typ='keine' now appear in Nicht-zugewiesen tab (frontend filter was too strict)
- feat(ausruestung): load user-specific personal items when ordering for another user
- feat(ausruestung): auto-set ist_ersatz=true for items from personal equipment list; add toggle for catalog/free-text items
- feat(ausruestung): load item eigenschaften when personal item with artikel_id is checked

Ausbildungen display:
- feat(mitglieder): show kursname (full), kurs_kurzbezeichnung chip, erfolgscode chip (color-coded) per Ausbildung entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 13:22:04 +02:00
Matthias Hochmeister
916aa488d2 change label 2026-04-15 11:18:25 +02:00
Matthias Hochmeister
4c01683c10 fix(ausruestung): show untracked assignments, item traits in order wizard, receipt
gate for completion, PDF phone + last-row line
2026-04-15 10:58:51 +02:00
Matthias Hochmeister
279cc03b6b feat(ausruestung): catalog-driven item tracking, im_haus in overview, order quantity override, fix stale queries 2026-04-15 10:20:36 +02:00
Matthias Hochmeister
633a75cb0b feat(ausruestungsanfrage): add personal item tracking, catalog enforcement, and detail pages 2026-04-14 16:49:20 +02:00
Matthias Hochmeister
e6b6639fe9 fix(buchhaltung): format transaction IDs as YYYY/NR and deduplicate dashboard widgets 2026-04-14 15:00:38 +02:00
Matthias Hochmeister
a94d486a42 fix(buchhaltung): prevent form reset on query refetch during transaction edit 2026-04-14 14:46:34 +02:00
Matthias Hochmeister
7392bfc29f feat(buchhaltung): replace transaction dialog with dedicated form page, enforce full field validation before booking 2026-04-14 14:41:30 +02:00
Matthias Hochmeister
967cad5922 feat(buchhaltung): add edit support for pending transactions 2026-04-14 13:46:07 +02:00
Matthias Hochmeister
f403c73334 fix(buchhaltung): clean up tab labels, remove badge indicator, add session notification for pending transactions 2026-04-14 13:35:40 +02:00
Matthias Hochmeister
3a8f166121 refactor(buchhaltung): simplify transaction workflow to two states, reorder tabs, guard booking, add overview divider 2026-04-14 13:16:45 +02:00
Matthias Hochmeister
588d8e81db widget icon rework, widget grouping rework 2026-04-14 10:53:03 +02:00
Matthias Hochmeister
4fbea8af81 feat: widget icons, dark theme tables, breadcrumb removal, bookkeeping rework, personal equipment pages, PDF/order improvements 2026-04-14 10:35:40 +02:00
Matthias Hochmeister
4c4fb01e68 fix: correct table name ausbildung (not ausbildungen) in fdisk and purge handlers
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 20:18:41 +02:00
Matthias Hochmeister
25d418539e fix(migration): make trigger creation idempotent with DROP IF EXISTS
Previous failed runs committed the CREATE TABLE/TRIGGER DDL outside a
transaction (pool.query BEGIN/ROLLBACK is not connection-pinned), leaving
the trigger in place. Re-runs then fail with 'already exists'.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 20:15:29 +02:00
Matthias Hochmeister
67adc4f5aa fix(migration): add required label+sort_order columns to permissions INSERT
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 20:06:06 +02:00
Matthias Hochmeister
bb95a66ffe fix(migration): fix feature_groups column names (label, sort_order not name/maintenance_mode)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 20:04:10 +02:00
Matthias Hochmeister
1ad328edd3 fix(migration): use correct column name authentik_group in group_permissions seed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 20:01:20 +02:00
Matthias Hochmeister
1215e9ea70 feat: personal equipment tracking, order assignment, purge fix, widget consolidation
- Migration 084: new persoenliche_ausruestung table with catalog link, user
  assignment, soft delete; adds zuweisung_typ/ausruestung_id/persoenlich_id
  columns to ausruestung_anfrage_positionen; seeds feature group + 5 permissions

- Fix user data purge: table was shop_anfragen, renamed to ausruestung_anfragen
  in mig 046 — caused full transaction rollback. Also keep mitglieder_profile
  row but NULL FDISK-synced fields (dienstgrad, geburtsdatum, etc.) instead of
  deleting the profile

- Personal equipment CRUD: backend service/controller/routes at
  /api/persoenliche-ausruestung; frontend page with DataTable, user filter,
  catalog Autocomplete, FAB create dialog; widget in Status group; sidebar
  entry (Checkroom icon); card in MitgliedDetail Tab 0

- Ausruestungsanfrage item assignment: when a request reaches erledigt,
  auto-opens ItemAssignmentDialog listing all delivered positions; each item
  can be assigned as general equipment (vehicle/storage), personal item (user,
  prefilled with requester), or not tracked; POST /requests/:id/assign backend

- StatCard refactored to use WidgetCard as outer shell for consistent header
  styling across all dashboard widget templates

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 19:19:35 +02:00
Matthias Hochmeister
b477e5dbe0 feat: user data purge, breadcrumbs, first-login dialog, widget consolidation, bookkeeping cascade
- Admin can purge all personal data for a user (POST /api/admin/users/:userId/purge-data)
  while keeping the account; clears profile, notifications, bookings, ical tokens, preferences
- Add isNewUser flag to auth callback response; first-login dialog prompts for Standesbuchnummer
- Add PageBreadcrumbs component and apply to 18 sub-pages across the app
- Cascade budget_typ changes from parent pot to all children recursively, converting amounts
  (detailliert→einfach: sum into budget_gesamt; einfach→detailliert: zero all for redistribution)
- Migrate NextcloudTalkWidget to use shared WidgetCard template for consistent header styling

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 16:15:28 +02:00
Matthias Hochmeister
a0b3c0ec5c fix(dashboard): fix group/widget state loss due to partial preference saves and stale closures 2026-04-13 15:28:20 +02:00
Matthias Hochmeister
b275d4baa5 feat(dashboard): make widget groups reorderable via drag-and-drop 2026-04-13 15:15:50 +02:00
Matthias Hochmeister
dd5cd71fd1 feat(dashboard,admin): widget group customization and FDISK data purge 2026-04-13 15:06:34 +02:00
Matthias Hochmeister
f4690cf185 feat(frontend): visual design overhaul — Inter font, softer cards/shadows, red-themed profile banner, modern typography hierarchy, and refreshed color palette 2026-04-13 11:07:28 +02:00
Matthias Hochmeister
43ce1f930c feat(frontend): implement unified design system with 17 reusable template components, skeleton loading states, and golden-ratio-based layouts 2026-04-13 10:43:27 +02:00
Matthias Hochmeister
5acfd7cc4f feat(buchhaltung): add transfers, bank statements, Haushaltsplan, and PDF export 2026-03-30 17:05:18 +02:00
Matthias Hochmeister
2eb59e9ff1 feat(buchhaltung): add audit trail UI to konto detail transaction table 2026-03-30 16:03:58 +02:00
Matthias Hochmeister
d833b3c224 feat(buchhaltung): recurring job, budget alerts, audit endpoint, konto-typen CRUD 2026-03-30 15:04:06 +02:00
Matthias Hochmeister
bbbfc8eaaa fix(buchhaltung): remove budget utilization bars from accounts overview 2026-03-30 14:44:06 +02:00
Matthias Hochmeister
f27e3134ca fix(buchhaltung): respect budget_typ in konten manage table and pod detail subaccounts view 2026-03-30 14:37:04 +02:00
Matthias Hochmeister
293848c710 fix(buchhaltung): use theme-aware color for category header rows in dark mode 2026-03-30 14:22:56 +02:00
Matthias Hochmeister
fcfee85efd fix(buchhaltung): show budget-typ label in pod settings view mode 2026-03-30 14:20:57 +02:00
Matthias Hochmeister
b21abce9e3 feat(buchhaltung): budget types, erstattungen, recurring tab move, overview dividers, order completion guard 2026-03-30 14:07:04 +02:00
Matthias Hochmeister
13aa4be599 feat(buchhaltung): add categories, recurring tx scheduling, sub-pot budget validation, and UX polish 2026-03-30 12:56:33 +02:00
Matthias Hochmeister
86cb175aeb feat(buchhaltung): move collapse arrows to row end, always-visible filters, summary row, sortable transactions, account manage page 2026-03-30 11:59:05 +02:00
Matthias Hochmeister
4e42d4077a fix: hard-delete konten instead of soft-deactivate, convert kontonummer to INTEGER with arithmetic sub-account derivation 2026-03-30 11:25:48 +02:00
Matthias Hochmeister
e4f1d8864a refactor: change kontonummer to INTEGER, derive sub-account number as parent + suffix (arithmetic) 2026-03-30 11:23:07 +02:00
Matthias Hochmeister
5f25d644f4 feat: add Buchhaltung data reset (Transaktionen, Konten, Bankkonten) to admin DataManagementTab 2026-03-30 11:16:57 +02:00
Matthias Hochmeister
333b94f64e fix: read error message from ApiError.message instead of err.response in konto mutation onError 2026-03-30 11:11:17 +02:00
Matthias Hochmeister
75b07d6afc fix: use fahrzeuge_mit_pruefstatus view in notification job to resolve missing naechste_pruefung_tage column 2026-03-30 11:08:25 +02:00
Matthias Hochmeister
b7015ace84 fix: return 409 on duplicate kontonummer, show server error in snackbar, block save when sub-account suffix is empty 2026-03-30 11:03:53 +02:00