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

feat(production): articleId für Rezepte, TUI-Verbesserungen mit UoM-Carousel, ArticlePicker und Zutaten-Reorder

Backend:
- articleId als Pflichtfeld im Recipe-Aggregate (Domain, Application, Infrastructure)
- Liquibase-Migration 015 mit defaultValue für bestehende Daten
- Alle Tests angepasst (Unit, Integration)

Frontend:
- UoM-Carousel-Selektor in RecipeCreateScreen, AddBatchScreen, AddIngredientScreen
- ArticlePicker-Komponente mit Typeahead-Suche für Artikelauswahl
- Auto-Position bei Zutatenzugabe (kein manuelles Feld mehr)
- Automatische subRecipeId-Erkennung bei Artikelauswahl
- Zutaten-Reorder per Drag im RecipeDetailScreen (Remove + Re-Add)
- Artikelnamen statt UUIDs in der Rezept-Detailansicht
- Navigation-Context: replace()-Methode ergänzt
This commit is contained in:
Sebastian Frick 2026-02-20 01:07:32 +01:00
parent b46495e1aa
commit 6c1e6c24bc
48 changed files with 999 additions and 237 deletions

View file

@ -420,6 +420,22 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/production/batches": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["planBatch"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/inventory/storage-locations": {
parameters: {
query?: never;
@ -468,6 +484,54 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/inventory/stocks/{stockId}/batches/{batchId}/unblock": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["unblockBatch"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/inventory/stocks/{stockId}/batches/{batchId}/remove": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["removeBatch"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/inventory/stocks/{stockId}/batches/{batchId}/block": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["blockBatch"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/customers": {
parameters: {
query?: never;
@ -1171,6 +1235,7 @@ export interface components {
shelfLifeDays?: number;
outputQuantity: string;
outputUom: string;
articleId: string;
};
IngredientResponse: {
id: string;
@ -1205,6 +1270,7 @@ export interface components {
shelfLifeDays?: number | null;
outputQuantity: string;
outputUom: string;
articleId: string;
status: string;
ingredients: components["schemas"]["IngredientResponse"][];
productionSteps: components["schemas"]["ProductionStepResponse"][];
@ -1231,6 +1297,31 @@ export interface components {
subRecipeId?: string;
substitutable?: boolean;
};
PlanBatchRequest: {
recipeId: string;
plannedQuantity: string;
plannedQuantityUnit: string;
/** Format: date */
productionDate: string;
/** Format: date */
bestBeforeDate: string;
};
BatchResponse: {
id?: string;
batchNumber?: string;
recipeId?: string;
status?: string;
plannedQuantity?: string;
plannedQuantityUnit?: string;
/** Format: date */
productionDate?: string;
/** Format: date */
bestBeforeDate?: string;
/** Format: date-time */
createdAt?: string;
/** Format: date-time */
updatedAt?: string;
};
CreateStorageLocationRequest: {
name: string;
storageType: string;
@ -1276,6 +1367,13 @@ export interface components {
/** Format: date-time */
receivedAt?: string;
};
RemoveStockBatchRequest: {
quantityAmount: string;
quantityUnit: string;
};
BlockStockBatchRequest: {
reason: string;
};
CreateCustomerRequest: {
name: string;
/** @enum {string} */
@ -1383,6 +1481,7 @@ export interface components {
shelfLifeDays?: number | null;
outputQuantity: string;
outputUom: string;
articleId: string;
status: string;
/** Format: int32 */
ingredientCount: number;
@ -2388,6 +2487,30 @@ export interface operations {
};
};
};
planBatch: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["PlanBatchRequest"];
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content: {
"*/*": components["schemas"]["BatchResponse"];
};
};
};
};
listStorageLocations: {
parameters: {
query?: {
@ -2485,6 +2608,77 @@ export interface operations {
};
};
};
unblockBatch: {
parameters: {
query?: never;
header?: never;
path: {
stockId: string;
batchId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
removeBatch: {
parameters: {
query?: never;
header?: never;
path: {
stockId: string;
batchId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["RemoveStockBatchRequest"];
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
blockBatch: {
parameters: {
query?: never;
header?: never;
path: {
stockId: string;
batchId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["BlockStockBatchRequest"];
};
};
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
listCustomers: {
parameters: {
query?: {