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

119 commits

Author SHA1 Message Date
Sebastian Frick
8948103957 fix(production): N+1-Query in traceForward durch Level-by-Level BFS ersetzen
traceForward aus BatchTraceabilityService in BatchRepository verschoben.
Statt einer Query pro Knoten (N+1) wird jetzt eine IN(:parentIds)-Query
pro Tiefenebene ausgeführt (max. maxDepth Queries statt N).
2026-02-26 19:54:33 +01:00
Sebastian Frick
ddb674d618 feat(production): Vorwärts-Tracing für Rückruf-Szenario (US-P18)
BFS-Traversierung über Chargen-Genealogie (batch_consumptions.input_batch_id)
mit Cycle-Detection und Max-Depth-Guard. REST-Endpoint GET /{id}/trace-forward
liefert flache Liste mit Tiefenangabe für betroffene Endprodukt-Chargen.
2026-02-26 19:54:33 +01:00
Sebastian Frick
973c33d78f refactor(masterdata): Restructure masterdata domain package 2026-02-26 19:53:58 +01:00
Sebastian Frick
a214002fab fix(inventory): Review-Fixes für US-6.1 InventoryCount
- GlobalExceptionHandler und ErrorResponse nach infrastructure.shared
  extrahieren (war fälschlich in usermanagement)
- CountItem.deviation() prüft UOM-Kompatibilität
- InvalidInventoryCountId Error-Typ für null/blank ID (400 statt 404)
- saveChildren() auf UPSERT (UPDATE→INSERT) mit Orphan-Cleanup umstellen
- logger.trace → logger.warn bei DB-Fehlern
- Stocks ohne Batches in CreateInventoryCount überspringen
- AuthorizationPort Defense in Depth in alle 3 InventoryCount Use Cases
- Kombinierter DB-Index auf (storage_location_id, status)
2026-02-26 19:14:55 +01:00
Sebastian Frick
c047ca93de feat(inventory): Inventur anlegen und Zählpositionen befüllen (US-6.1)
InventoryCount-Aggregate mit CountItem-Entities, Auto-Populate aus
Stock-Daten, vollständige DDD-Schichten inkl. Edge-Case-Tests und
Jazzer-Fuzz-Test. 1909 Tests grün.
2026-02-26 12:36:30 +01:00
Sebastian Frick
600d0f9f06 feat(production): Batch bei Produktionsstart automatisch erstellen (#73)
- BatchNumber in allen ProductionOrder-Endpoints via BatchRepository auflösen
- BatchCreationFailed Error-Variante statt generischem ValidationFailure
- bestBeforeDate-Berechnung als Recipe.calculateBestBeforeDate() in die Domain verschoben
2026-02-26 12:32:04 +01:00
Sebastian Frick
26adf21162 fix(tui,seed): Seed-Batch-Nummern korrigieren und Produktionsergebnis anzeigen
Seed-Daten: BW-260223-01 → P-2026-02-23-001, LW-260222-01 → P-2026-02-22-001,
damit die Chargennummern dem BatchNumber-VO-Format entsprechen.

ProductionOrderDetailScreen: Rezeptname statt ID anzeigen, Batch-Daten
(Soll-/Ist-Menge, Ausschuss, Bemerkungen) bei verknüpfter Charge laden.
2026-02-26 08:52:00 +01:00
Sebastian Frick
417f8fcdae feat(tui): neue Backend-Features anbinden und Status-Werte korrigieren
TUI-Anbindung für Reservierung bestätigen (US-4.3), Produktionsauftrag
umterminieren und filtern (US-P17). Status-Werte CREATED→PLANNED und
IN_PRODUCTION→IN_PROGRESS korrigiert. Fehlenden GET /{id} Endpoint für
Produktionsaufträge im Backend ergänzt.
2026-02-26 08:52:00 +01:00
Sebastian Frick
8a84bf5f25 feat(test): Jazzer Fuzz-Tests für Production-Aggregate einführen
Coverage-guided Fuzz-Tests für ProductionOrder, Recipe und Batch.
Jeder Test fuzzt create() + zufällige Sequenzen aller Mutations-Methoden,
um unbehandelte Exceptions bei beliebigen Inputs aufzudecken.

- jazzer-junit 0.24.0 als Test-Dependency
- Maven-Profile: -Pfuzz (echtes Fuzzing), -Pfuzz-regression (Crash-Replay)
- Surefire: FuzzTests im Default-Lauf ausgeschlossen, reuseForks=false
- Makefile: make fuzz, make fuzz/regression, make fuzz/single
- .gitignore: .cifuzz-corpus/ ausgeschlossen
2026-02-26 08:51:44 +01:00
Sebastian Frick
74dc9a6981 fix(inventory): confirmReservation – Layering, Error-Semantik und FK-Bug
- MovementType-Ableitung via ReferenceType.toMovementType() in Domain Layer
- Doppelten Batch-Lookup in Stock.confirmReservation() eliminiert
- StockError.MovementCreationFailed statt RepositoryFailure für Domain-Fehler
- 204 No Content statt 200 OK (konsistent mit releaseReservation)
- Batches mit Menge 0 nicht mehr entfernen (FK stock_movements → stock_batches)
2026-02-25 23:13:12 +01:00
Sebastian Frick
0b6028b967 feat(inventory): Reservierung bestätigen – Material entnehmen (US-4.3)
Allokierte Mengen werden physisch aus den Chargen abgezogen,
StockMovements erzeugt und die Reservation entfernt.
MovementType wird aus ReferenceType abgeleitet
(PRODUCTION_ORDER→PRODUCTION_CONSUMPTION, SALE_ORDER→SALE).
2026-02-25 23:13:12 +01:00
Sebastian Frick
19f1cf16a1 fix(production): Review-Findings aus US-P17 beheben
RescheduleNotAllowed Error-Typ statt InvalidStatusTransition(status, status),
Null-Guard für newDate, Controller-Parameter als Enum statt String (verhindert
500 bei ungültigem Status), partielle Datumsangaben als 400 ablehnen,
ORDER BY in findAll() konsistent mit gefilterten Queries.
2026-02-25 23:01:19 +01:00
Sebastian Frick
ad33eed2f4 feat(production): Produktionsauftrag umterminieren und abfragen (US-P17)
Reschedule (PLANNED/RELEASED) mit Datumsvalidierung und List-Endpoint
mit optionaler Filterung nach Datum/Status als Full Vertical Slice.
Lasttests um neue Szenarien erweitert.
2026-02-25 23:01:19 +01:00
Sebastian Frick
d63ac899e7 feat(tui,seed): Seed-Testdaten und Bestandsbewegung-Detail verbessern
Seed-Daten SQL-File (099-seed-testdata.sql) mit realistischem Szenario
"Fleischerei & Feinkost" erstellt: 6 User, 6 Kategorien, 5 Lieferanten,
18 Artikel, 5 Kunden, 5 Lagerorte, Bestände, Rezepte, Chargen,
Produktionsaufträge und Bestandsbewegungen.

StockMovement-Detailseite: IDs durch lesbare Namen ersetzt (Lagerort,
Artikel, Benutzer) mit ausgegrautem ID dahinter, stockBatchId entfernt.
2026-02-25 22:38:22 +01:00
Sebastian Frick
6504d3a54e fix(production): cancelledReason im ProductionOrder-Aggregat persistieren
cancel() nimmt jetzt einen reason-Parameter entgegen und speichert ihn
im Aggregat, wie im DDD-Modell (04-production-bc.md) spezifiziert.
Liquibase-Migration für cancelled_reason-Spalte ergänzt.
2026-02-25 22:27:51 +01:00
Sebastian Frick
0e58cbfacf fix(infra): no-db Profil robuster machen und Stub-Beans ergänzen
DatabaseProfileInitializer setzt Autoconfigure-Exclusions programmatisch,
da application-no-db.yml bei spätem Profil-Aktivierung nicht geladen wird.
SpringUnitOfWork mit @Profile("!no-db") ausgeschlossen. Stub-Beans für
BatchNumberGenerator, BatchRepository, ProductionOrderRepository,
StockMovementRepository und UnitOfWork ergänzt. generate-openapi.sh
nutzt korrektes -Dspring-boot.run.profiles=no-db.
2026-02-25 21:47:19 +01:00
Sebastian Frick
72d59b4948 feat(production): Produktionsauftrag abschließen und stornieren (US-P16)
Complete: IN_PROGRESS → COMPLETED (nur wenn Batch COMPLETED)
Cancel: PLANNED/RELEASED → CANCELLED (nicht aus IN_PROGRESS)

Domain-, UseCase-, Integration- und Lasttests ergänzt.
2026-02-25 21:47:19 +01:00
Sebastian Frick
14b59722f7 fix(loadtest): robustere Szenarien für bedingte Requests
- InventoryScenario.recordStockMovement(): HTTP-Request mit doIf
  guards, verhindert 'No attribute mvStockId' Fehler
- ProductionScenario.productionWorkflow(): Seeded Batch-/Order-IDs
  als Fallback wenn planBatch/createProductionOrder fehlschlägt,
  stellt sicher dass startBatch/completeBatch/releaseProductionOrder
  immer feuern und Gatling-Assertions Stats sammeln können
2026-02-25 17:36:23 +01:00
Sebastian Frick
a23c5a8985 fix(inventory): Instant durch OffsetDateTime für PostgreSQL-Kompatibilität ersetzen
PostgreSQL JDBC-Treiber kann java.time.Instant nicht direkt an
TIMESTAMP WITH TIME ZONE binden. Schreibparameter werden nun via
atOffset(UTC) konvertiert, Lesezugriffe über OffsetDateTime.toInstant().
2026-02-25 17:35:31 +01:00
Sebastian Frick
d4ac8cb1b9 refactor(inventory): UnitOfWork-Pattern + JdbcClient-Migration
Letzter BC migriert: JPA/Hibernate durch JdbcClient ersetzt,
@Transactional durch UnitOfWork-Pattern in allen schreibenden Use Cases.

- 3 neue Jdbc-Repos: JdbcStorageLocationRepository, JdbcStockMovementRepository,
  JdbcStockRepository (4-Tabellen-Aggregat mit Batches, Reservations, Allocations)
- 20 Use Cases angepasst (UoW für schreibende, @Transactional entfernt für lesende)
- 15 alte JPA-Dateien gelöscht (6 Entities, 3 Mapper, 3 Adapter, 3 Spring Data Repos)
- 9 Unit-Tests mit UoW-Mock-Pattern aktualisiert
2026-02-25 17:35:31 +01:00
Sebastian Frick
c89ee359d1 fix(tui): TypeScript-Fehler durch strikte generierte OpenAPI-Typen beheben
RoleDTO auf generierten Typ umgestellt, exactOptionalPropertyTypes-Konflikte
gelöst, Null-Checks für nullable AddressResponse ergänzt und Enum-Casts
für string-basierte SalesUnit-Felder hinzugefügt.
2026-02-25 17:34:14 +01:00
Sebastian Frick
7d721f9ef0 feat(tui): Bestandsbewegungen und Produktionsaufträge anbinden
- StockMovement: API-Client, Hook, List/Detail/Record-Screens mit Typ-Filter
- ProductionOrder: list/getById/start im API-Client, List/Detail-Screens mit Freigabe- und Start-Aktion
- Inventar-Menü um Bestandsbewegungen erweitert
- Produktionsmenü zeigt jetzt Auftragsliste statt direkt Create
- OpenAPI-Typen regeneriert (StockMovementResponse, StartProductionOrderRequest, batchId in ProductionOrderResponse)
2026-02-25 12:36:42 +01:00
Sebastian Frick
0474b5fa93 fix(inventory): doppelten Liquibase-Index und veraltete Test-API korrigieren
Changeset 031 (performed_at-Index) entfernt, da bereits in 028 enthalten.
StockMovementControllerIntegrationTest an JdbcClient-basierte AbstractIntegrationTest migriert
und fehlende Article-FK durch createArticleId() behoben.
2026-02-25 12:28:49 +01:00
Sebastian Frick
46275f6d59 refactor(usermanagement,masterdata): UnitOfWork-Pattern + JdbcClient-Migration
Migriert UserManagement und MasterData BCs von JPA/Spring Data auf
JdbcClient + UnitOfWork, analog zum Production-BC. Inventory bleibt auf JPA.

- 6 neue JdbcClient-Repositories (User, Role, Article, Supplier, Customer, ProductCategory)
- 45 Use Cases: UoW für schreibende, @Transactional entfernt bei allen
- AbstractIntegrationTest + 20 Integration-Tests auf JdbcClient umgestellt
- 12 Unit-Test-Klassen mit UoW-Mock erweitert
- 34 alte JPA-Dateien gelöscht (Entities, Spring Data Repos, Adapter, Mapper)
2026-02-25 08:53:17 +01:00
Sebastian Frick
e5bc5690da refactor(production): UnitOfWork-Pattern + JdbcClient-Migration für Production-BC
Production-BC von JPA auf JdbcClient migriert und UnitOfWork-Port
eingeführt, der Transaktionen explizit steuert und bei Result.failure
zurückrollt — löst das Problem, dass @Transactional bei funktionalem
Error-Handling keinen Rollback auslöst.

- UnitOfWork-Interface (shared) + SpringUnitOfWork-Implementierung
- JdbcProductionOrderRepository, JdbcRecipeRepository, JdbcBatchRepository,
  JdbcBatchNumberGenerator ersetzen JPA-Pendants
- 17 JPA-Dateien entfernt (Entities, Mapper, Spring Data Interfaces)
- Alle Production-Use-Cases nutzen UnitOfWork statt @Transactional
- Liquibase-Changelogs H2-kompatibel gemacht (dbms-Attribute)
- Tests auf Liquibase-Schema umgestellt (ddl-auto: none)
2026-02-25 08:53:17 +01:00
Sebastian Frick
bfae3eff73 feat(production): Produktion über Auftrag starten (US-P15)
RELEASED ProductionOrder kann mit einer PLANNED Batch verknüpft und
in Produktion gestartet werden. Dabei wechselt der Order auf IN_PROGRESS
und die Batch auf IN_PRODUCTION. Neuer REST-Endpoint POST /{id}/start,
StartOrderProduction Use Case, BatchAlreadyAssigned Error, Liquibase-
Migration für batch_id FK auf production_orders.
2026-02-25 08:53:17 +01:00
Sebastian Frick
a8bbe3a951 fix(inventory): Instant.MIN/MAX, performed_at-Index, batchReference-Naming und -Validierung, Lasttest-Zeiträume
- Instant.MIN/MAX durch separate Repository-Methoden ersetzt (findAllByPerformedAtAfter/Before)
- DB-Index auf performed_at für Zeitraum-Abfragen
- Naming-Konsistenz: findAllByBatchId → findAllByBatchReference im Domain-Repository
- batchReference-Validierung (Blank-Check) mit InvalidBatchReference-Error
- Lasttest: variierende Zeiträume (7–90 Tage) statt statischem 10-Jahres-Fenster
2026-02-25 08:51:25 +01:00
Sebastian Frick
0e5d8f7025 feat(inventory): Bestandsbewegungen abfragen mit Zeitraum- und Chargen-Filter – Issue #16
Erweitert die StockMovement-Abfrage um batchReference- und from/to-Filter
mit Filter-Priorität stockId > articleId > batchReference > movementType > from/to.
Inkl. DB-Index auf batch_id, Unit-/Integrationstests und Lasttest-Szenarien.
2026-02-25 08:37:46 +01:00
Sebastian Frick
fa6c0c2d70 feat(inventory): Bestandsbewegung erfassen (StockMovement) – Issue #15
Immutables StockMovement-Aggregate als Audit-Trail für jede Bestandsveränderung.
Domain-Invarianten: positive Quantity, Reason bei WASTE/ADJUSTMENT,
ReferenceDocumentId bei INTER_BRANCH_TRANSFER, Direction-Ableitung aus MovementType.

Domain: StockMovement, MovementType (8 Typen), MovementDirection, StockMovementError
Application: RecordStockMovement, GetStockMovement, ListStockMovements
Infrastructure: JPA-Persistence, REST-Controller (POST/GET), Liquibase 028+029
Tests: ~40 Domain-Unit-Tests, 18 Application-Tests, ~27 Integrationstests
Loadtest: Gatling-Szenarien für Bestandsbewegungen (Seeding, Read, Write)
2026-02-24 23:57:01 +01:00
Sebastian Frick
85f96d685e docs: Sequenzdiagramme 2026-02-24 22:19:37 +01:00
Sebastian Frick
11fb62383b feat(loadtest): Gatling-Lasttests mit ~2500 Requests für komprimiertes Jahres-Volumen
Szenarien: Stammdaten-CRUD, Produktions-Workflow, Lagerverwaltung,
Read-Only-Zugriffe. Batch-Repository auf Summary-Projektion umgestellt,
Permissions-Changeset Merge-Konflikt aufgelöst, Unit-Enum im
JsonBodyBuilder korrigiert (KILOGRAM → KG).
2026-02-24 21:53:25 +01:00
Sebastian Frick
8a9bf849a9 test: Unit-Tests für Masterdata-Domain und Application Layer
Domain-Tests: Article, Customer, ProductCategory, Supplier
Application-Tests: ArticleUseCase, CustomerUseCase,
  ProductCategoryUseCase, SupplierUseCase, ListStorageLocations

JaCoCo: Stub-Paket von Coverage-Analyse ausgeschlossen
2026-02-24 09:50:34 +01:00
Sebastian Frick
d7fcc946e7 test: Blackbox-Integrationstests für dokumentierte Domain-Invarianten
Neue Testdateien:
- RecipeLifecycleIntegrationTest (7 Tests): Aktivierung ohne Zutaten,
  Modifikation aktiver Rezepte, Archivierung, Duplikat-Prüfungen
- RoleControllerIntegrationTest (3 Tests): GET /api/roles mit/ohne
  Berechtigung und ohne Token

Erweiterte Testdateien:
- BatchControllerIntegrationTest (+2): start/cancel von COMPLETED
- StockControllerIntegrationTest (+3): removeBatch und FEFO-Allokation
- StorageLocationControllerIntegrationTest (+2): active=false Filter
- ArticleControllerIntegrationTest (+4): updatePrice, removeSupplier,
  filterByCategory, updateArticle
- CustomerControllerIntegrationTest (+3): removeFrameContract,
  updateCustomer, duplicateLineItems
2026-02-24 09:50:34 +01:00
Sebastian Frick
11bda32ffc fix(tui): CountryPicker Error-Handling, zentrale DACH-Defaults und Validierung
DACH-Codes und Default-Country in country-defaults.ts zentralisiert statt
in jedem Screen hardcoded. API-Fetch-Fehler fallen auf DACH-Fallback zurück
statt stiller Fehlerignorierung. Country-Validierung in Pflichtfeld-Formularen
ergänzt.
2026-02-24 09:50:02 +01:00
Sebastian Frick
a77f0ec5df feat(shared): Länderauswahl mit ISO 3166-1 Mapping und CountryPicker
Backend: Country-Record (Shared Kernel), InMemoryCountryRepository mit
~249 Ländern und DACH-Priorisierung, ListCountries-UseCase,
GET /api/countries?q= Endpoint.

Frontend: CountryPicker-Komponente mit Fuzzy-Suche, DACH-Favoriten bei
leerem Query. SupplierCreate-, CustomerCreate- und AddDeliveryAddress-
Screens verwenden jetzt den CountryPicker statt Freitext. Detail-Screens
zeigen den Ländercode in der Adressanzeige.

Closes #71
2026-02-24 09:28:56 +01:00
Sebastian Frick
2811836039 fix(inventory): Aktiv/Inaktiv-Filter für Lagerorte-Liste
ListStorageLocations ignorierte active=false und gab stattdessen
alle Lagerorte zurück. Jetzt wird bei gesetztem active-Parameter
korrekt nach aktivem/inaktivem Status gefiltert.
2026-02-24 08:46:17 +01:00
Sebastian Frick
e25d4437d9 feat(tui): Stock-Suche mit Namensanzeige für Bestände
StockPicker-Komponente für Bestandssuche nach Artikel-/Lagerort-Namen.
StockBatchEntryScreen nutzt StockPicker statt manueller UUID-Eingabe.
StockListScreen mit Suchfilter [s] und Namensanzeige statt IDs.
StockDetailScreen zeigt Artikel-/Lagerort-Namen im Header.
2026-02-24 01:21:02 +01:00
Sebastian Frick
376557925a feat(tui): TUI für Produktionsauftrag-Freigabe, Bestandsreservierung und Reservierungs-Freigabe
- ProductionOrderCreateScreen: Nach Anlage Freigabe per [F] mit Statusanzeige
- StockDetailScreen: Reservierungen-Tabelle, Menü für Reservieren/Freigeben
- ReserveStockScreen: Neues Formular (Referenztyp, Referenz-ID, Menge, Einheit, Priorität)
- API-Client: release(), reserveStock(), releaseReservation() Methoden
- Hooks: releaseProductionOrder(), reserveStock(), releaseReservation()
- Types: ReservationDTO, StockBatchAllocationDTO, ReserveStockRequest exportiert
- DB: Migration 027 erweitert chk_production_order_status um RELEASED
2026-02-24 00:57:40 +01:00
Sebastian Frick
fb8387c10e feat(tui): Create-Screen für Produktionsaufträge
Types, API-Client Resource, Hook und TUI-Screen für den neuen
POST /api/production/production-orders Endpoint. Menüeintrag
im Produktionsmenü ergänzt.
2026-02-24 00:19:51 +01:00
Sebastian Frick
2938628db4 feat(inventory): Reservierung freigeben (#13)
DELETE /api/inventory/stocks/{stockId}/reservations/{reservationId}
gibt eine bestehende Reservierung frei und stellt die verfügbare
Menge wieder her. Zusätzlich Liquibase-Changeset 025 idempotent
gemacht (ON CONFLICT DO NOTHING).
2026-02-24 00:18:51 +01:00
Sebastian Frick
0b49bb2977 feat(inventory): Bestand reservieren mit FEFO-Allokation (#12)
Implementiert Story 4.1: Reservierung von Beständen mit automatischer
FEFO-Allokation (First-Expired-First-Out) über verfügbare Chargen.

Domain: Reservation-Entity, StockBatchAllocation, ReservationDraft,
FEFO-Logik in Stock.reserve(), availableQuantity() berücksichtigt
bestehende Allokationen. Neue Error-Varianten für InsufficientStock,
InvalidReferenceType, InvalidReservationPriority, ReservationNotFound.

API: POST /api/inventory/stocks/{stockId}/reservations → 201 Created.
Liquibase: reservations + stock_batch_allocations Tabellen mit FK- und
CHECK-Constraints.

Tests: 43 neue Tests (22 Domain, 10 UseCase, 11 Integration) für
FEFO-Logik, Validierung, Mengenprüfung, Auth und Edge Cases.
2026-02-24 00:18:51 +01:00
Sebastian Frick
b77b209f10 feat(production): Produktionsauftrag freigeben (US-P14, #39) 2026-02-24 00:05:41 +01:00
Sebastian Frick
ba37ff647b feat(production): Produktionsauftrag anlegen (US-P13, #38)
ProductionOrder-Aggregate mit DDD + Clean Architecture eingeführt.
Produktionsleiter können Aufträge mit Rezept, Menge, Termin und
Priorität planen. Validierung: Quantity > 0, PlannedDate nicht in
Vergangenheit, Priority (LOW/NORMAL/HIGH/URGENT), Recipe ACTIVE.
2026-02-23 23:26:08 +01:00
Sebastian Frick
5020df5d93 feat(tui): Edit-Screen für Lagerort-Bearbeitung (Name, Temperaturbereich)
StorageLocationEditScreen mit Formular für Name und Temperaturbereich.
StorageType wird als immutable angezeigt. Erreichbar über [Bearbeiten] im
DetailScreen. Vervollständigt Story 1.2 im Frontend.
2026-02-23 23:02:58 +01:00
Sebastian Frick
614f3ece30 chore: node_modules und Workspace-Sub-Lockfiles in gitignore 2026-02-23 22:42:19 +01:00
Sebastian Frick
792d5f0d97 fix(inventory): Stock-Existenz-Check bei Lagerort-Deaktivierung
DeactivateStorageLocation prüft jetzt via StockRepository ob Bestände am
Lagerort existieren bevor deaktiviert wird (Story 1.2 Akzeptanzkriterium).
5 Unit Tests und 1 Integrationstest für den neuen Check.
2026-02-23 22:40:39 +01:00
Sebastian Frick
42c9ca9d19 feat(inventory): GET Endpoint für einzelnen Lagerort (StorageLocation by ID)
GetStorageLocation Use Case mit AuthorizationPort, GET /{id} Endpoint im Controller.
6 Unit Tests und 5 Integrationstests für alle Edge Cases.
2026-02-23 22:40:30 +01:00
Sebastian Frick
df1d1dfdd3 feat: Sentry-kompatibles Error-Tracking (Bugsink) für Frontend und Backend
Frontend: @sentry/node mit instrument.ts, globale Error-Handler, 5xx-Interceptor.
Backend: sentry-spring-boot-starter-jakarta, Sentry.captureException im GlobalExceptionHandler.
Konfiguration über SENTRY_DSN Env-Variable, Bugsink via make bugsink startbar.
2026-02-23 22:40:19 +01:00
Sebastian Frick
5fe0dfc139 feat(tui): Produktionschargen und Bestandsverwaltung in TUI einbauen
Chargen: Liste mit Statusfilter, Planen, Starten, Verbrauch erfassen,
Abschließen und Stornieren. Bestände: Liste, Anlegen, Detailansicht
mit Chargen sperren/entsperren/entfernen. Types, API-Client, Hooks,
Navigation und Screens für beide Bounded Contexts vollständig ergänzt.
2026-02-23 21:22:07 +01:00
Sebastian Frick
b2b3b59ce9 feat(inventory): Bestände unter Mindestbestand ermitteln (ListStocksBelowMinimum)
GET /api/inventory/stocks/below-minimum zeigt Bestände, deren verfügbare
Menge (AVAILABLE + EXPIRING_SOON) unter dem konfigurierten Mindestbestand
liegt. DB-Prefilter via findAllWithMinimumLevel() + Domain-Filter als
Defense in Depth. StockResponse.from() nutzt nun Stock.availableQuantity()
statt duplizierter Logik.

Closes #11
2026-02-23 16:07:51 +01:00