$this->productionRepository->listForIndex(), ]); } public function create(Request $request): View { $defaultLocationId = Location::query()->where('name', 'like', '%öln%')->value('id') ?? Location::query()->where('active', true)->first()?->id; $defaultProductId = (int) $request->query('product_id') ?: null; return view('admin.inventory.productions.create', [ 'products' => Product::query()->where('active', 1)->where('is_set', false)->orderBy('name')->get(['id', 'name']), 'locations' => Location::query()->where('active', true)->orderBy('name')->get(), 'defaultLocationId' => $defaultLocationId, 'defaultProductId' => $defaultProductId, 'model' => null, ]); } public function store(StoreProductionRequest $request): RedirectResponse { $payload = $request->validatedPayload(); try { $production = $this->productionService->store( [ 'product_id' => $payload['product_id'], 'location_id' => $payload['location_id'], 'produced_at' => $payload['produced_at'], 'quantity' => $payload['quantity'], 'notes' => $payload['notes'], ], $payload['ingredient_lines'], (int) $request->user()->id ); } catch (ValidationException $e) { return redirect()->back()->withInput()->withErrors($e->errors()); } if ($production->mhd_warning) { \Session::flash('alert-warning', __('Hinweis: Mindestens eine Rohstoff-Charge hat ein kürzeres MHD als das geplante Produkt-MHD.')); } \Session::flash('alert-save', '1'); return redirect()->route('admin.inventory.productions.show', $production); } public function show(Production $production): View { $production->load([ 'product', 'location', 'producedByUser.account', 'productionIngredients.ingredient', 'productionIngredients.stockEntry', 'productionPackagings.packagingItem.packagingMaterial', ]); return view('admin.inventory.productions.show', [ 'model' => $production, ]); } public function edit(Production $production): View { $production->load([ 'product', 'location', 'productionIngredients.ingredient', 'productionIngredients.stockEntry', ]); $defaultLocationId = $production->location_id; return view('admin.inventory.productions.edit', [ 'model' => $production, 'products' => Product::query() ->where(fn ($q) => $q->where('active', 1)->where('is_set', false)) ->orWhere('id', $production->product_id) ->orderBy('name')->get(['id', 'name']), 'locations' => Location::query()->where('active', true)->orderBy('name')->get(), 'defaultLocationId' => $defaultLocationId, ]); } public function update(StoreProductionRequest $request, Production $production): RedirectResponse { $payload = $request->validatedPayload(); try { $production = $this->productionService->updateProduction( $production, [ 'product_id' => $payload['product_id'], 'location_id' => $payload['location_id'], 'produced_at' => $payload['produced_at'], 'quantity' => $payload['quantity'], 'notes' => $payload['notes'], ], $payload['ingredient_lines'], (int) $request->user()->id ); } catch (ValidationException $e) { return redirect()->back()->withInput()->withErrors($e->errors()); } if ($production->mhd_warning) { \Session::flash('alert-warning', __('Hinweis: Mindestens eine Rohstoff-Charge hat ein kürzeres MHD als das geplante Produkt-MHD.')); } \Session::flash('alert-save', '1'); return redirect()->route('admin.inventory.productions.show', $production); } public function copy(Production $production): View { $production->load([ 'product', 'productionIngredients.ingredient', 'productionIngredients.stockEntry', ]); $defaultLocationId = $production->location_id; return view('admin.inventory.productions.create', [ 'model' => $production, 'products' => Product::query()->where('active', 1)->where('is_set', false)->orderBy('name')->get(['id', 'name']), 'locations' => Location::query()->where('active', true)->orderBy('name')->get(), 'defaultLocationId' => $defaultLocationId, ]); } public function recipeJson(Request $request, Product $product): JsonResponse { $locationId = (int) $request->query('location_id', 0); $quantity = (int) $request->query('quantity', 1); $excludeProductionId = (int) $request->query('exclude_production', 0) ?: null; if ($locationId < 1) { return response()->json(['message' => __('location_id erforderlich')], 422); } return response()->json( $this->productionService->buildRecipePayload($product, $locationId, max(1, $quantity), $excludeProductionId) ); } }