1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 10:39:35 +01:00
Commit graph

50 commits

Author SHA1 Message Date
Sebastian Frick
05147227d1 feat(inventory): Charge entnehmen (removeBatch) (#6) 2026-02-19 22:55:12 +01:00
Sebastian Frick
ec736cf294 feat(frontend): TUI-Screens für Rezept-Filter, Archivierung und Chargen-Einbuchung
Production: Rezeptliste mit Status-Filter (Draft/Active/Archived), Rezept
archivieren für aktive Rezepte, list() gibt RecipeSummaryDTO zurück.
Inventory: Charge einbuchen (AddBatch) mit neuem Stocks-Resource und Screens.
2026-02-19 22:54:56 +01:00
Sebastian Frick
f2003a3093 feat(production): Rezepte abfragen per ID und nach Status filtern (#31)
GET /api/recipes/{id} liefert vollständiges Rezept inkl. Zutaten und Schritte.
GET /api/recipes?status=ACTIVE liefert Summary-Liste mit ingredientCount/stepCount.
2026-02-19 22:30:55 +01:00
Sebastian Frick
6feb3a9f1c feat(inventory): Charge einbuchen (addBatch) (#5)
StockBatch als Child-Entity im Stock-Aggregat mit BatchReference
(batchId + batchType), Quantity, ExpiryDate und Status AVAILABLE.
POST /api/inventory/stocks/{stockId}/batches → 201.
2026-02-19 22:28:48 +01:00
Sebastian Frick
5224001dd7 feat(production): TUI-Screens für Zutaten verwalten + Rezept aktivieren 2026-02-19 22:05:24 +01:00
Sebastian Frick
63f51bc1a9 feat(production): TUI-Screens für Produktionsschritte verwalten
Produktionsschritte im RecipeDetailScreen anzeigen, hinzufügen und
entfernen. Neuer AddProductionStepScreen mit Formular für stepNumber,
description, durationMinutes und temperatureCelsius.
2026-02-19 22:05:24 +01:00
Sebastian Frick
1e12353b9b test(production): Tests für ActivateRecipe und ArchiveRecipe Use Cases
Domain-Tests für archive() in RecipeTest, Application-Layer-Tests
für beide Use Cases mit Mockito (Auth, NotFound, Statusübergänge).
2026-02-19 22:01:10 +01:00
Sebastian Frick
408813a5b5 feat(production): Rezept archivieren (#30) 2026-02-19 21:56:11 +01:00
Sebastian Frick
7b1c114693 refactor(test): gemeinsame AbstractIntegrationTest Base-Class
Alle 9 Integration-Test-Klassen nutzen eine gemeinsame Base-Class mit
geteiltem Spring Context (MOCK statt RANDOM_PORT), vorberechnetem
BCrypt-Hash und gemeinsamen Helper-Methoden. Eliminiert ~600 Zeilen
Duplikation und Runtime-BCrypt-Aufrufe im Test-Setup.
2026-02-19 21:37:47 +01:00
Sebastian Frick
5219c93dd1 feat(inventory): Bestandsposition anlegen (#4)
Stock-Aggregate mit MinimumLevel, MinimumShelfLife und StockDraft.
Quantity/UnitOfMeasure nach shared.common verschoben für BC-übergreifende
Nutzung. REST-Endpoint POST /api/inventory/stocks mit Duplikat-Prüfung,
Validierung und Liquibase-Migration.
2026-02-19 21:37:47 +01:00
Sebastian Frick
7079f12475 feat: Stub-Repositories für no-db Profil (Recipe, StorageLocation) 2026-02-19 21:24:43 +01:00
Sebastian Frick
a132211a74 feat(production): Rezept aktivieren (#29)
Rezepte können vom DRAFT- in den ACTIVE-Status überführt werden.
Voraussetzung: mindestens eine Zutat muss vorhanden sein.
Inkl. Use Case, REST-Endpoint POST /recipes/{id}/activate,
Domain-Tests und Error Handling.
2026-02-19 21:24:39 +01:00
Sebastian Frick
cf93b847e5 feat(production): Produktionsschritte zum Rezept verwalten + AuthorizationPort
Erweitert das Recipe-Aggregate um ProductionStep-Child-Entities (Add/Remove)
mit vollständiger DDD-Konformität. Führt AuthorizationPort-Prüfung in allen
Production Use Cases ein (analog zum usermanagement-Referenz-BC).

Fixes: Request-Validierung (Size, Min/Max), Error-Code-Konsistenz,
Defense-in-Depth für durationMinutes und temperatureCelsius.
2026-02-19 17:37:18 +01:00
Sebastian Frick
c26d72fbe7 feat: TUI-Screens für Inventar und Produktion + API-Client Typ-Migration
Neue TUI-Features:
- Inventar: Lageorte auflisten, anlegen, bearbeiten, (de-)aktivieren
- Produktion: Rezepte auflisten, anlegen, Detail-Ansicht
- Navigation erweitert (Hauptmenü, Routing)

API-Client auf generierte OpenAPI-Typen umgestellt:
- 6 neue Alias-Dateien in @effigenix/types (supplier, category, article,
  customer, inventory, production)
- api-client Re-Exports direkt von @effigenix/types statt via Resources
- Backend: @Schema(requiredProperties) auf 16 Response-Records
- Backend: OpenApiCustomizer für application-layer DTOs (UserDTO, RoleDTO)

Hinweis: Backend-Endpoints für GET /api/recipes und
GET /api/inventory/storage-locations/{id} fehlen noch (separate Issues).
2026-02-19 13:54:29 +01:00
Sebastian Frick
bee3f28b5f feat(production): Zutaten zum Rezept verwalten (#27)
Ingredient als Child Entity des Recipe Aggregates implementiert.
Folgt dem Article → SalesUnit Pattern als Full Vertical Slice.

Domain: IngredientId, Ingredient, IngredientDraft, Recipe.addIngredient/removeIngredient
Application: AddRecipeIngredient, RemoveRecipeIngredient Use Cases
Infrastructure: IngredientEntity (JPA), REST-Endpoints (POST/DELETE), Liquibase Migration
Tests: RecipeTest (9 neue), IngredientTest (11 Tests)
2026-02-19 12:53:11 +01:00
Sebastian Frick
dcaa43dc2c docs: update memory 2026-02-19 12:48:22 +01:00
Sebastian Frick
6010820944 feat(inventory): Lagerorte abfragen mit Filter nach Typ und Status (#3)
Query UseCase: ListStorageLocations mit optionalen Filtern storageType und active
GET /api/inventory/storage-locations mit STOCK_READ oder STOCK_WRITE
Tests: 10 neue Integrationstests (35 gesamt)
2026-02-19 12:42:25 +01:00
Sebastian Frick
9b9b7311d1 feat(production): Recipe Aggregate als Full Vertical Slice (#26)
Domain: Recipe Aggregate Root mit create(RecipeDraft), RecipeId, RecipeName,
RecipeType, RecipeStatus, RecipeError, RecipeRepository Interface.
Application: CreateRecipe Use Case mit Name+Version Uniqueness-Check.
Infrastructure: JPA Entity/Mapper/Repository, REST POST /api/recipes,
Liquibase Migration, ProductionErrorHttpStatusMapper, Spring Config.
Tests: 15 Unit Tests für Recipe Aggregate (75 total im Production BC).
2026-02-19 10:12:48 +01:00
Sebastian Frick
24a6869faf feat(inventory): StorageLocation bearbeiten und (de-)aktivieren (#2)
Use Cases: UpdateStorageLocation, DeactivateStorageLocation, ActivateStorageLocation
Endpoints: PUT /{id}, PATCH /{id}/deactivate, PATCH /{id}/activate
Repository: existsByNameAndIdNot für Uniqueness-Check bei Update
Tests: 14 neue Integrationstests (25 gesamt)
2026-02-19 10:12:25 +01:00
Sebastian Frick
05878b1ce9 refactor(usermanagement): implement code review findings for User Management BC
Address all 18 findings from security code review (5 critical, 7 medium, 6 low):

Domain: make User and Role immutable with wither-pattern, add status transition
guards (ACTIVE->LOCKED, LOCKED->ACTIVE, ACTIVE|LOCKED->INACTIVE, INACTIVE->ACTIVE)

Application: enforce authorization via AuthorizationPort in all use cases, add
input validation, introduce LockUserCommand/UnlockUserCommand/RemoveRoleCommand,
fix audit event on password change failure (K5), use flatMap/mapError chains

Infrastructure: JWT blacklist with TTL and scheduled cleanup, login rate limiting
(5 attempts/15min), configurable CORS, generic error messages, conditional Swagger,
seed data context restriction

Tests: unit tests for all 10 use cases, adapted domain and integration tests
2026-02-19 10:11:51 +01:00
Sebastian Frick
a1161cfbad feat(production): Quantity VO mit Catch-Weight, YieldPercentage und BatchNumber
Shared Value Objects für den Production BC implementiert (#25):
- Quantity mit Dual-Quantity/Catch-Weight Support und Arithmetik
- UnitOfMeasure Enum (kg, g, L, mL, pc, m)
- YieldPercentage (1-200) mit calculateRequiredInput()
- BatchNumber mit Format P-YYYY-MM-DD-XXX
- QuantityError sealed interface für funktionales Error Handling
- 60 Unit Tests für alle VOs
2026-02-19 09:53:56 +01:00
Sebastian Frick
c474388f32 feat(inventory): StorageLocation Aggregate implementieren (#1)
Vertikaler Slice für Story 1.1 – Lagerort anlegen:

Domain: StorageLocation Aggregate mit VOs (StorageLocationId, StorageLocationName,
StorageType, TemperatureRange), StorageLocationError (sealed interface),
Draft-Records und Repository Interface.

Application: CreateStorageLocation UseCase mit Uniqueness-Check.

Infrastructure: JPA Entity, Mapper, Repository, REST Controller
(POST /api/inventory/storage-locations), Liquibase Migration (009),
InventoryErrorHttpStatusMapper, InventoryUseCaseConfiguration.

Tests: 28 Domain-Unit-Tests, 11 Integration-Tests.

Closes #1
2026-02-19 09:51:48 +01:00
Sebastian Frick
554185a012 docs: update CLAUDE for nix gh commands 2026-02-19 09:13:52 +01:00
Sebastian Frick
e34b321517 docs: add ticket for sec findings 2026-02-19 01:13:53 +01:00
Sebastian Frick
fb735702cf docs(ddd): detaillierte Domain Models für Production, Quality und Inventory BC
- Production BC: Aggregates (Recipe, Batch, ProductionOrder) mit Invarianten, Drafts, Status-Maschinen, Domain Events und Chargen-Genealogie
- Quality BC: 9 Aggregates (TemperatureLog, CleaningPlan/Record, GoodsReceiptInspection, SampleRecord, TrainingRecord, MaintenanceRecord, QualityHold, ProcessParameter) mit HACCP-Compliance
- Inventory BC: 4 Aggregates (Stock, StockMovement, InventoryCount, StorageLocation) mit FEFO, Reservierungen mit Priorität, Vier-Augen-Prinzip bei Inventur
- Ubiquitous Language: Inventory-Sektion von 11 auf 27 Begriffe erweitert
- Alte deutsche Datei 05-qualitaets-kontext.md entfernt (ersetzt durch 05-quality-bc.md)
2026-02-19 01:13:12 +01:00
Sebastian Frick
2ace5be394 test(masterdata): Integrationstests für alle vier Masterdata-Aggregate
70 MockMvc-Integrationstests für ProductCategory, Supplier, Article
und Customer Controller. Abgedeckte Szenarien: Happy Paths, Validierung
(400), Duplikate (409), Not Found (404), Autorisierung (403/401) sowie
aggregate-spezifische Operationen (Zertifikate, Bewertungen, Verkaufs-
einheiten, Lieferadressen, Präferenzen, Rahmenverträge).

Außerdem: Manuelle Testfallbeschreibung unter backend/docs/MASTERDATA_MANUAL_TESTS.md
2026-02-19 00:33:52 +01:00
Sebastian Frick
2059718a5c chore(backend): JaCoCo Code Coverage und PIT Mutation Testing einrichten
JaCoCo läuft automatisch bei mvn verify (HTML/XML/CSV Reports).
PIT als eigenes Maven-Profil `mutation` — Scope auf Domain + Application Layer.
2026-02-18 23:59:05 +01:00
Sebastian Frick
ccd4ee534a docs: and skills 2026-02-18 23:25:12 +01:00
Sebastian Frick
e4f0665086 fix(backend): lückenloses Error-Handling und Logging im Infrastructure Layer
Stack-Traces in allen JPA-Repositories per logger.trace() bewahren, bevor
sie durch Result.failure() auf die Message reduziert werden. Security-Layer
erhält eigene Handler-Beans (ApiAuthenticationEntryPoint, ApiAccessDeniedHandler)
mit konsistentem ErrorResponse-Format statt Inline-Lambdas. JWT-Filter loggt
Validierungsfehler auf WARN statt DEBUG und fängt IllegalArgumentException.
RoleController nutzt jetzt das Exception-Pattern der anderen Controller statt
eines leeren 500-Bodys. GlobalExceptionHandler differenziert zwischen
fachlichen Domain-Fehlern (WARN) und technischen Repository-Fehlern (ERROR)
und fängt auch checked Exceptions als Catch-All.
2026-02-18 23:23:00 +01:00
Sebastian Frick
fbed3f899f fix(masterdata): MASTERDATA-Permissions und JSON-Serialisierung der REST-Responses
MASTERDATA_READ/WRITE fehlten im Permission-Enum und in den Rollen-Seed-Daten,
dadurch bekam der Admin bei allen Stammdaten-Schreiboperationen Access Denied.

Die Masterdata-Controller gaben Domain-Objekte direkt als JSON zurück, die von
Jackson nicht serialisiert werden konnten (method-style Accessors statt JavaBean-
Getter). Response-DTOs als Records eingeführt, die Domain-Objekte in flache
JSON-Strukturen mappen. Frontend-Mapping-Layer entfernt, da Backend-Responses
jetzt 1:1 die erwarteten Feldnamen liefern.
2026-02-18 22:22:19 +01:00
Sebastian Frick
3cccab1f4d fix(frontend): pnpm dev und pnpm build ohne manuelle Vorbereitung
pnpm dev:
- Internal-Packages-Pattern: packages/ zeigen auf ./src/index.ts
- tsx lädt TypeScript direkt, kein Build-Schritt vor pnpm dev nötig
- publishConfig sichert dist/ für pnpm build und Releases

pnpm build:
- @effigenix/types build ruft nicht mehr generate:types auf
  (openapi.json ist eingecheckt, kein laufendes Backend nötig)
- Veraltete Typreferenzen entfernt/korrigiert:
  SessionToken (nicht im Schema), RoleName/Permission (aus RoleDTO
  abgeleitet), ErrorResponse (als eigene Interface definiert)

docs: READMEs aktualisiert – Schnellstart prominent, Stub-Modus
dokumentiert, Korrekturen (Flyway→Liquibase, com.→de.effigenix)
2026-02-18 21:39:32 +01:00
Sebastian Frick
03b3b51a68 feat(backend): Stub-Modus bei fehlender Datenbankverbindung
Startet das Backend ohne DB (z.B. für OpenAPI-Generierung):
- DatabaseProfileInitializer prüft JDBC-Verbindung vor Context-Start
- Bei Fehler: Profil "no-db" aktiviert, Warnlog erscheint
- application-no-db.yml schließt DataSource/JPA/Liquibase aus
- JpaAuditingConfig ersetzt @EnableJpaAuditing in der Hauptklasse
- Stub-Repositories und NoOpAuditLogger für Profil "no-db"
- Alle Jpa*Repository + DatabaseAuditLogger mit @Profile("!no-db")
2026-02-18 21:39:32 +01:00
Sebastian Frick
d20fb4108a chore(types): OpenAPI-Spec update 2026-02-18 21:36:20 +01:00
Sebastian Frick
d27dbaa843 feat(cli): Stammdaten-TUI mit Master Data API-Anbindung
- Neue Screens: Kategorien, Lieferanten, Artikel, Kunden (jeweils
  Liste, Detail, Anlegen + Detailaktionen wie Bewertung, Zertifikate,
  Verkaufseinheiten, Lieferadressen, Präferenzen)
- API-Client: Resources für alle 4 Stammdaten-Aggregate implementiert
  (categories, suppliers, articles, customers) mit Mapping von
  verschachtelten Domain-VOs auf flache DTOs
- Lieferant, Artikel, Kategorie: echte HTTP-Calls gegen Backend
  (/api/suppliers, /api/articles, /api/categories, /api/customers)
- 204-No-Content-Endpoints (removeSalesUnit, removeSupplier,
  removeCertificate, removeDeliveryAddress, removeFrameContract)
  lösen Re-Fetch des Aggregats aus
- MasterdataMenu, Navigation-Erweiterung, App.tsx-Routing
2026-02-18 13:35:20 +01:00
Sebastian Frick
797f435a49 feat(masterdata): Infra-Layer für Customer Aggregate
Liquibase-Migration (007), JPA-Entities (Customer, FrameContract,
DeliveryAddress, ContractLineItem), Mapper, Repository-Adapter,
5 Request-DTOs, CustomerController (11 Endpoints), Error-Mapping
und 11 Use-Case-Beans in MasterDataUseCaseConfiguration.
2026-02-18 13:30:13 +01:00
Sebastian Frick
6ec07e7b34 feat(masterdata): Infra-Layer für Supplier Aggregate
Liquibase-Migration (006), JPA-Entities (SupplierEntity,
QualityCertificateEmbeddable), Mapper, Spring-Data-Repo,
Domain-Repo-Adapter, Request-DTOs, SupplierController
(9 Endpoints), ErrorMapper und UseCaseConfiguration erweitert.
2026-02-18 13:22:46 +01:00
Sebastian Frick
8b2fd38192 feat(masterdata): Infra-Layer für Article + ProductCategory Aggregate
Liquibase-Migration (005), JPA-Entities, Mapper, Spring-Data-Repos,
Domain-Repo-Adapter, Request-DTOs, Error-Mapper, REST-Controller
(11 Article-Endpoints, 4 Category-Endpoints) und UseCaseConfiguration
für alle 15 Use Cases. GlobalExceptionHandler erweitert.
2026-02-18 13:15:44 +01:00
Sebastian Frick
0ee7d91528 fix: audit log entity_id zu lang bei ROLE_ASSIGNED/ROLE_REMOVED
AssignRole und RemoveRole übergaben einen zusammengesetzten String
("User: uuid, Role: NAME") als entity_id-Spalte, die nur VARCHAR(36)
erlaubt. Neuer AuditLogger-Overload log(event, entityId, details, actor)
trennt UUID und Zusatzinformationen sauber.
2026-02-18 12:41:35 +01:00
Sebastian Frick
bc0043db93 fix(cli): Username im Header nach Session-Restore korrekt anzeigen 2026-02-18 12:31:20 +01:00
Sebastian Frick
169f492b76 docs(cli): remove implementation plan, add TUI user+dev guide 2026-02-18 12:28:28 +01:00
Sebastian Frick
bbe9e87c33 feat(frontend): TypeScript-Monorepo mit Terminal-UI für Effigenix ERP
Monorepo-Setup (pnpm workspaces) mit vier shared Packages und einer TUI-App:

Shared Packages:
- @effigenix/types: TypeScript-DTOs (UserDTO, RoleDTO, AuthDTO, Enums)
- @effigenix/config: API-Konfiguration und Shared Constants
- @effigenix/validation: Zod-Schemas für Username, E-Mail und Passwort
- @effigenix/api-client: axios-Client mit JWT-Handling (proaktiver + reaktiver
  Token-Refresh), AuthInterceptor, ErrorInterceptor, Resources für auth/users/roles

TUI (apps/cli, Ink 5 / React):
- Authentication: Login/Logout, Session-Restore beim Start, JWT-Refresh
- User Management: Liste, Anlage (Zod-Inline-Validation), Detailansicht,
  Passwort ändern, Sperren/Entsperren mit ConfirmDialog
- Role Management: Liste, Detailansicht, Zuweisen/Entfernen per RoleSelectList (↑↓)
- UX: SuccessDisplay (Auto-Dismiss 3 s), ConfirmDialog (J/N),
  FormInput mit Inline-Fehlern, StatusBar mit API-URL
- Layout: Fullscreen-Modus (alternate screen buffer), Header mit eingeloggtem User
- Tests: vitest + ink-testing-library (15 Tests)
2026-02-18 12:28:16 +01:00
Sebastian Frick
87123df2e4 refactor: EntityDraft-Pattern auf Customer, Article und ProductCategory anwenden
- CustomerDraft / CustomerUpdateDraft eingeführt
- ArticleDraft / ArticleUpdateDraft eingeführt
- ProductCategoryDraft / ProductCategoryUpdateDraft eingeführt
- Customer.create() nimmt jetzt CustomerDraft, gibt Result zurück
- Customer.update(CustomerUpdateDraft) ersetzt 4× updateXxx(VO)
- Article.create() nimmt jetzt ArticleDraft statt VOs
- Article.update(ArticleUpdateDraft) ersetzt rename() + changeCategory()
- ProductCategory.create() nimmt jetzt ProductCategoryDraft, gibt Result zurück
- ProductCategory.update(ProductCategoryUpdateDraft) ersetzt rename() + updateDescription()
- Use Cases bauen Draft aus Command, kein VO-Wissen im Application Layer
- CreateCustomerCommand / UpdateCustomerCommand: int → Integer für paymentDueDays
- CLAUDE.md: EntityDraft-Pattern-Dokumentation ergänzt
2026-02-18 11:56:33 +01:00
Sebastian Frick
6b341f217b refactor: konsistentes Result-basiertes Error-Handling im Master Data BC
VO-Factory-Methoden (of/create/tryEuro) für alle Value Objects eingeführt,
die intern IllegalArgumentException fangen und Result<String, T> liefern.
FrameContract.create() liefert jetzt Result statt zu werfen.

Alle 31 Use Cases auf Record-Pattern-Deconstruction umgestellt
(Failure(var err) / Success(var val) statt verbose generischer Typen).
isFailure()/unsafeGetValue() eliminiert.

Aggregate-Factorys bereinigt — VO-Null-Checks entfernt, da Validierung
jetzt in den VO-Factories liegt. ValidationFailure und CertificateNotFound
zu den Error-Interfaces hinzugefügt.

WIP: Aggregate.create() gibt teilweise kein Result mehr zurück —
wird im nächsten Schritt korrigiert.
2026-02-17 23:44:44 +01:00
Sebastian Frick
b813fcbcaa feat: implement Master Data BC domain model and application layer
Master Data BC als Supporting Domain für Artikel, Lieferanten und Kunden.
Shared Kernel um Money, Address, ContactInfo, PaymentTerms erweitert.
RepositoryError von domain.usermanagement nach shared.common migriert.
2026-02-17 22:38:32 +01:00
Sebastian Frick
22c007a768 docs: add TUI implementation plan documentation 2026-02-17 22:15:35 +01:00
Sebastian Frick
3ab2c1a57e feat: initialize frontend monorepo with pnpm workspace and types package
- Add pnpm workspace configuration with apps/ and packages/
- Create @effigenix/types package with OpenAPI type generation setup
- Add TypeScript strict mode configuration
- Configure ESLint and Prettier for code quality
- Add wrapper files for clean type exports (auth, user, role, common)
- Add custom UI types and enums
2026-02-17 22:13:18 +01:00
Sebastian Frick
c2c48a03e8 refactor: restructure repository with separate backend and frontend directories
- Move Java backend to backend/ directory
- Create frontend/ directory for TypeScript TUI and future WebUI
- Update .gitignore for Node.js and worktrees
- Update README.md with new repository structure
- Copy documentation to backend/
2026-02-17 22:08:51 +01:00
Sebastian Frick
ec9114aa0a feat: add Spring Boot ERP application with user management domain
Implement DDD-based architecture with domain, application, infrastructure,
and API layers. Includes user/role management with authentication,
RBAC permissions, audit logging, Liquibase migrations, and test suite.
2026-02-17 19:33:24 +01:00
Sebastian Frick
a1df32377b style 2026-02-17 08:28:31 +01:00
Sebastian Frick
4e448afa57 init 2026-02-17 08:25:06 +01:00