Commit Graph

93 Commits

Author SHA1 Message Date
Bastian Wagner
5dae4362b2 feat(cashbox): book a catalog penalty directly as a transaction
Adds a catalog picker to the member-booking form in the cashbox (prefills
amount/note/type, stays editable) and a "Buchen" button on each penalty
catalog entry that jumps to the cashbox with that entry preselected via a
penaltyId query param. No backend changes — reuses the existing POST
/transactions flow, the catalog only supplies starting values.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-01 18:50:58 +02:00
Bastian Wagner
9664187049 altes backend entfenrt 2026-08-01 15:45:49 +02:00
Bastian Wagner
3551641a85 feat(teams): manage player active status and team-role with treasurer safeguard
Team managers (captain and above) can now deactivate/reactivate a player and
change their team-role from the player detail page. Deactivation zeroes the
open balance via an auditable adjustment transaction instead of overwriting
the balance field, and both actions are blocked if they would leave a team
without an active treasurer. Also hardens the existing PUT teams/:id/players
endpoint down to profile-only fields, fixing a typo bug and closing a gap
where any authenticated user could mutate a player's active/role/balance in
any team.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-01 15:42:09 +02:00
Bastian Wagner
2424a8c025 Merge branch 'feature/penalty-catalog-management' 2026-08-01 15:03:07 +02:00
Bastian Wagner
c7dfdd7498 fix: address penalty catalog review findings 2026-08-01 14:46:58 +02:00
Bastian Wagner
fa05e55d43 feat: manage penalty catalog in modern frontend 2026-08-01 13:32:22 +02:00
Bastian Wagner
17228a52db feat: secure penalty catalog management 2026-08-01 13:17:44 +02:00
Bastian Wagner
4c1bd49405 fixes 2026-08-01 13:17:26 +02:00
Bastian Wagner
45658e42fa docs: add penalty catalog management plan 2026-08-01 12:52:07 +02:00
Bastian Wagner
e3bff40181 Merge branch 'feature/admin-user-management' 2026-08-01 11:50:27 +02:00
Bastian Wagner
945369796e fix: refresh admin self profile state 2026-08-01 11:45:03 +02:00
Bastian Wagner
431eba86e7 fix: align admin profile request validation 2026-08-01 11:20:47 +02:00
Bastian Wagner
d962200b79 test: cover assignment failure recovery 2026-08-01 10:52:17 +02:00
Bastian Wagner
9eec6268d0 fix: lock directory during assignment changes 2026-08-01 10:44:17 +02:00
Bastian Wagner
9dc9dc3dcf fix: stabilize admin user UI state 2026-08-01 10:32:51 +02:00
Bastian Wagner
3ae0fd2000 feat: build admin user management UI 2026-08-01 10:01:25 +02:00
Bastian Wagner
1288f5fc60 fix(mail): resolve templates from __dirname so they exist in the built image
The Docker runtime image only ships dist/, but mail-config.service.ts
pointed at src/mail/mail-templates and nest-cli.json never copied the
.hbs files into dist/ either. This was silently masked before because
the return-before-sendMail bug meant the path was never touched; fixing
that bug now surfaces it as a hard crash on boot (readFileSync throwing
synchronously inside the MailerModule factory). Resolve the templates
dir from __dirname instead, which is correct in both dev (src/mail) and
the compiled image (dist/mail), and add the mail-templates .hbs files
to nest-cli.json's asset copy list so they actually land in dist/.
2026-08-01 09:27:44 +02:00
Bastian Wagner
d0ec000bff fix: harden admin frontend contracts 2026-08-01 09:26:14 +02:00
Bastian Wagner
484c7473fb feat: add admin user frontend contract 2026-08-01 09:17:57 +02:00
Bastian Wagner
78761b570b chore: untrack SDD reports 2026-08-01 00:21:26 +02:00
Bastian Wagner
bec1826bfa fix: close admin user security gaps 2026-08-01 00:19:49 +02:00
Bastian Wagner
e6acfdcac7 feat: secure admin user management 2026-07-31 23:37:54 +02:00
Bastian Wagner
8e318df94f Merge branch 'worktree-mail-versand' 2026-07-31 23:35:41 +02:00
Bastian Wagner
c80f78594e fix: register mail layout partial on handlebars singleton for real mailer wiring
The HandlebarsAdapter reads partials config from a top-level sibling of
`template` (mailerOptions.options.partials), not from
template.options.partials where it was nested. Because the mail templates
use partial blocks ({{#> layout}}...{{/layout}}), the unregistered partial
rendered silently as an unstyled fragment instead of throwing, so this went
unnoticed. A config-only fix also breaks on Windows because the adapter's
glob-based directory loader mishandles backslash path separators.

Fix registers the shared `layout` partial directly on the handlebars module
singleton in MailConfigService, bypassing the broken glob loader entirely.

Also:
- add mail-config.service.spec.ts, an integration test that drives the real
  MailerOptions + HandlebarsAdapter wiring (would have caught this bug,
  unlike the existing template-only spec which registers the partial itself)
- remove stale nestjs-i18n references from .env.example, env-example, and
  the backend README (i18n was already removed from the code)
- add missing trailing newlines to activation.hbs and reset-password.hbs

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 23:29:19 +02:00
Bastian Wagner
0a0990c6f4 feat(mail): redesign email templates with TeamWallet branding and shared layout partial 2026-07-31 22:49:40 +02:00
Bastian Wagner
ae9de39ac4 chore(mail): remove nestjs-i18n, only ever used for the two mail templates
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 22:41:01 +02:00
Bastian Wagner
4105460400 test: guard inactive directory membership 2026-07-31 22:36:18 +02:00
Bastian Wagner
81040efd8b css 2026-07-31 22:34:52 +02:00
Bastian Wagner
247aeefd4c fix(mail): remove dead return before sendMail, add firstName personalization
- Remove I18n dependency injection from MailService constructor
- Hardcode German email subject/body strings directly in the service
- Add optional firstName field to userSignUp and forgotPassword methods
- Wire firstName from user object through auth.service.ts call sites
- Add comprehensive unit tests for MailService

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-31 22:33:34 +02:00
Bastian Wagner
d738b49cbf fix: query user directory safely 2026-07-31 22:29:15 +02:00
Bastian Wagner
e722d9e26b css 2026-07-31 22:28:57 +02:00
Bastian Wagner
fb3ed10b41 docs: add mail-versand implementation plan 2026-07-31 22:22:27 +02:00
Bastian Wagner
c382234746 feat: add safe user directory query 2026-07-31 22:12:53 +02:00
Bastian Wagner
e5ba292815 scss 2026-07-31 22:12:38 +02:00
Bastian Wagner
ed5a00a577 docs: correct mail design spec after deeper env/infra investigation
.env already exists locally with valid creds (the deleted repo-root
.env was an unused duplicate), and no MailDev infra exists for the
e2e mail tests, so the plan shifts to a MailService unit test plus
one manual send instead of touching .env or standing up e2e infra.
2026-07-31 22:09:59 +02:00
Bastian Wagner
539d073de4 docs: add design spec for mail sending fix and template redesign
Captures the brainstorming outcome for fixing the broken mail dispatch,
removing the mail-only nestjs-i18n setup in favor of hardcoded German
copy, and redesigning the registration/forgot-password email templates.
2026-07-31 22:04:16 +02:00
Bastian Wagner
1d4546d483 styling 2026-07-31 22:01:09 +02:00
Bastian Wagner
bcb4207233 docs: add admin user management plan 2026-07-31 21:58:47 +02:00
Bastian Wagner
7df56110a6 chore: ignore local worktrees 2026-07-31 21:48:04 +02:00
Bastian Wagner
72b3a9dc93 files 2026-07-31 21:38:58 +02:00
Bastian Wagner
e6757ab9dc files 2026-07-31 21:25:31 +02:00
Bastian Wagner
4ef35b3755 migration 2026-07-31 21:20:16 +02:00
Bastian Wagner
6bea4f766a first commit 2026-07-31 21:02:47 +02:00