# QA Checklist — MYeasyCMS v2 **Date**: 2026-04-03 **Test method**: Docker production build (`docker compose -f docker-compose.local.yml up --build`) **Test user**: `test@makerkit.dev` / `testingpassword` (super-admin) --- ## BUGS FOUND & FIXED ### BUG #1 — Members CMS crashes with Zod v4 error (CRITICAL) ✅ FIXED - **Route**: `/home/[account]/members-cms` - **Error**: `Error: .partial() cannot be used on object schemas containing refinements` - **Root cause**: `CreateMemberSchema` uses `.superRefine()` for cross-field validation, then `UpdateMemberSchema = CreateMemberSchema.partial()` fails in Zod v4. - **Fix**: Separated base object schema from refinements. `CreateMemberBaseSchema` (plain object) is used for `.partial()`, and the refinement function `memberCrossFieldRefinement` is applied separately to both Create and Update schemas. - **File**: `packages/features/member-management/src/schema/member.schema.ts` - **Status**: ✅ Verified in Docker rebuild — members page loads with 30 members displayed ### BUG #2 — Course stats cards show empty values (MEDIUM) ✅ FIXED - **Route**: `/home/[account]/courses` - **Symptom**: Stats cards showed labels (Gesamt, Aktiv, Abgeschlossen, Teilnehmer) but no numbers - **Root cause**: The `getQuickStats` RPC returns snake_case keys (`total_courses`, `open_courses`) but the template uses camelCase (`stats.totalCourses`, `stats.openCourses`), resulting in `undefined` - **Fix**: Added camelCase normalization in `createCourseStatisticsService.getQuickStats()` - **File**: `packages/features/course-management/src/server/services/course-statistics.service.ts` - **Status**: ✅ Verified in Docker rebuild — all 4 stats cards show "0" correctly ### BUG #3 — Blog post images missing (MEDIUM) ✅ FIXED - **Route**: `/blog` - **Symptom**: All blog post cards showed broken image alt text instead of cover images - **Root cause**: Blog posts reference images like `/images/posts/mitgliederverwaltung.webp` but only 3 default Makerkit images existed in `public/images/posts/` - **Fix**: Created placeholder images for all 5 German blog posts - **Files added**: `apps/web/public/images/posts/{mitgliederverwaltung,dsgvo-vereine,sepa-lastschrift,digitale-verwaltung,vereinswebsite}.webp` - **Status**: ✅ Verified in Docker rebuild — all blog images load ### BUG #4 — Dev bootstrap references non-existent table (LOW) ✅ FIXED - **Error**: `ERROR: relation "public.catch_entries" does not exist` during DB seeding - **Root cause**: `docker/db/dev-bootstrap.sh` grants permissions on `catch_entries` table, but no migration creates it. The actual table is `catch_books`. - **Fix**: Removed the `catch_entries` GRANT line from dev-bootstrap.sh - **File**: `docker/db/dev-bootstrap.sh` - **Status**: ✅ Fixed --- ## KNOWN ISSUES (NOT FIXED — LOW PRIORITY) ### ISSUE #5 — Admin panel not translated to German - **Route**: `/admin` - **Symptom**: Admin dashboard shows English labels ("Users", "Team Accounts", "Paying Customers") while rest of app is in German - **Impact**: Low — admin panel is internal-facing only - **Fix needed**: Add German translations for admin section in i18n ### ISSUE #6 — Hydration mismatch warning (dev-only) - **Source**: `next-runtime-env` `PublicEnvScript` component - **Impact**: None — this is a known Next.js 16 framework-level issue with script serialization. The `suppressHydrationWarning` is already set on ``. - **Fix needed**: None — wait for upstream fix in `next-runtime-env` --- ## PAGES TESTED — ALL PASSING ✅ ### Marketing Pages (Public) | Route | Status | Notes | |-------|--------|-------| | `/` (Homepage) | ✅ Pass | Hero, stats, features, testimonials, pricing, CTA all render | | `/blog` | ✅ Pass | Blog cards with images, dates, descriptions | | `/docs` | ✅ Pass | Documentation sidebar navigation, category cards | | `/pricing` | ✅ Pass | 4 pricing tiers, monthly/yearly toggle, feature lists | | `/faq` | ✅ Pass | Accordion FAQ items with expand/collapse | | `/contact` | ✅ Pass | Contact form with name, email, message fields | ### Auth Pages | Route | Status | Notes | |-------|--------|-------| | `/auth/sign-in` | ✅ Pass | Email/password login, social auth buttons (Google, Apple, Azure, GitHub) | | `/auth/sign-up` | ✅ Pass (navigable) | Registration form | ### Personal Dashboard | Route | Status | Notes | |-------|--------|-------| | `/home` | ✅ Pass | Personal home with sidebar, account selector | | `/home/settings` | ✅ Pass (navigable) | Profile settings | ### Team Dashboard (Makerkit workspace) | Route | Status | Notes | |-------|--------|-------| | `/home/makerkit` | ✅ Pass | Dashboard with member stats, course stats, invoices, newsletters, quick actions | | `/home/makerkit/members-cms` | ✅ Pass | Member list with search, filters, status badges, pagination (30 members) | | `/home/makerkit/courses` | ✅ Pass | Course list with stats cards, search, status filter | | `/home/makerkit/events` | ✅ Pass | Events list with stats (Veranstaltungen, Orte, Kapazität) | | `/home/makerkit/finance` | ✅ Pass | SEPA + Invoices overview with stats | | `/home/makerkit/newsletter` | ✅ Pass | Newsletter list with stats | | `/home/makerkit/bookings` | ✅ Pass | Booking management with rooms/active/revenue stats | | `/home/makerkit/documents` | ✅ Pass | Document generator cards (Mitgliedsausweis, Rechnung, Etiketten, etc.) | | `/home/makerkit/site-builder` | ✅ Pass | Page builder with settings, posts, status | | `/home/makerkit/meetings` | ✅ Pass | Meeting protocols with stats (Protokolle, Aufgaben) | | `/home/makerkit/fischerei` | ✅ Pass | Fishing module with 8 tabs, 6 stat cards | | `/home/makerkit/verband` | ✅ Pass | Federation management with 9 tabs, 6 stat cards | | `/home/makerkit/settings` | ✅ Pass | Team logo, team name, danger zone | ### Admin Panel | Route | Status | Notes | |-------|--------|-------| | `/admin` | ✅ Pass | Super admin dashboard with Users/Team/Paying/Trials stats | --- ## INTERACTIVE ELEMENTS VERIFIED - ✅ Navigation links (Blog, Docs, Pricing, FAQ, Contact) - ✅ Auth flow (sign-in with email/password) - ✅ Account/workspace selector dropdown - ✅ Sidebar navigation (collapsed/expanded) - ✅ Stats cards (all modules) - ✅ Member list table with avatars, status badges, tags - ✅ Search inputs (members, courses, bookings, newsletter) - ✅ Status filter dropdowns - ✅ Tab navigation (Fischerei, Meetings, Verband) - ✅ Quick action buttons (New Member, New Course, etc.) - ✅ FAQ accordion expand/collapse - ✅ Theme toggle button - ✅ Sign In / Sign Up buttons - ✅ Breadcrumb navigation --- ## FILES MODIFIED 1. `packages/features/member-management/src/schema/member.schema.ts` — Zod v4 partial() fix 2. `packages/features/course-management/src/server/services/course-statistics.service.ts` — snake_case→camelCase normalization 3. `apps/web/public/images/posts/mitgliederverwaltung.webp` — Added blog image 4. `apps/web/public/images/posts/dsgvo-vereine.webp` — Added blog image 5. `apps/web/public/images/posts/sepa-lastschrift.webp` — Added blog image 6. `apps/web/public/images/posts/digitale-verwaltung.webp` — Added blog image 7. `apps/web/public/images/posts/vereinswebsite.webp` — Added blog image 8. `docker/db/dev-bootstrap.sh` — Removed non-existent catch_entries table reference