Information system for Czech electricians (ERP). UI language: Czech only. Architecture: SPA (React frontend) + REST API (Symfony backend).
| Module | Route | Description |
|---|---|---|
| Přehled | /dashboard |
Stats dashboard |
| Zákazníci | /customers |
Customer list + create form |
| Zakázky | /orders |
Order list (sortable, paginated) + create form with location |
| Zaměstnanci | /users |
User list (sortable) + edit drawer |
- Language: PHP 8.4
- Framework: Symfony 7
- API: API Platform 4 (REST only, JSON)
- ORM: Doctrine ORM
- Database: MariaDB
- Dependency management: Composer
lexik/jwt-authentication-bundle— access token (Bearer)gesdinet/jwt-refresh-token-bundle— silent refresh via HttpOnly cookie
- Resources exposed via custom DTO classes in
src/ApiResource/ - Data reading via custom State Providers (
*CollectionProvider,*ItemProvider) - Data writing via custom State Processors (
*CreateProcessor,*UpdateProcessor) - No generic Doctrine-based providers — all mapping is explicit
- Validation via Symfony Validator constraints on DTO properties
- Locale forced to
csglobally (Czech validation messages)
- No Docker
- No GraphQL
- Follow best practices: SOLID, DDD (lightweight/pragmatic), KISS, DRY
- Prefer Symfony & API Platform defaults
- Avoid overengineering
- Framework: React 18 (hooks only, no class components)
- Language: TypeScript
- Build tool: Vite
- Refine — resource/routing abstraction,
useListfor data fetching, auth provider, notification provider - MUI v5 (
@mui/material,@mui/icons-material,@mui/x-date-pickers) — UI components - Zod v4 — form validation schemas (
src/lib/schemas.ts), hand-written with Czech error messages - Orval — codegen: generates typed axios functions + Zod schemas from
/api/docs.json - dayjs — date handling, Czech locale adapter for MUI date pickers
- axios — HTTP client with JWT interceptor + silent refresh logic (
src/api.ts) - Zustand
- react-hook-form
- TanStack Query
- TanStack Table
- Forms: controlled
useState+ ZodsafeParsebefore submit — no form library - Tables: MUI
Table+TableSortLabel+TablePagination, data viauseList(Refine) - Drawers: consistent pattern — fixed header + scrollable
flex:1content + fixed footer schemaRequired(schema)utility derivesrequiredprop on inputs directly from Zod schema
- Run
npm run generate(backend must be running atlocalhost:8000) - Output:
src/generated/— typed API functions + Zod schemas - VS Code task:
Frontend: generate API types (orval)
- Keep UI simple and functional
- No unnecessary abstractions
- Prefer clarity over cleverness
- MUI theme: blue primary (
#1976D2), no shadows (borders instead), Czech date locale
- JWT authentication fully implemented
- MariaDB + Doctrine migrations running
- All 4 modules implemented and connected to backend
- No unit/integration tests yet
- No advanced permissions yet (all endpoints require
IS_AUTHENTICATED_FULLY) - No external integrations yet