April 2026 waren Wirtschaft Feedback
This commit is contained in:
parent
02f2a4c23e
commit
9ce711d6b2
167 changed files with 25278 additions and 8518 deletions
59
app/Http/Controllers/Admin/Inventory/LocationController.php
Normal file
59
app/Http/Controllers/Admin/Inventory/LocationController.php
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Inventory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Inventory\StoreLocationRequest;
|
||||
use App\Http\Requests\Inventory\UpdateLocationRequest;
|
||||
use App\Models\Location;
|
||||
|
||||
class LocationController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view('admin.inventory.locations.index', [
|
||||
'values' => Location::query()->orderBy('name')->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('admin.inventory.locations.form', [
|
||||
'model' => new Location(['active' => true]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(StoreLocationRequest $request)
|
||||
{
|
||||
Location::create($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.locations.index');
|
||||
}
|
||||
|
||||
public function edit(Location $location)
|
||||
{
|
||||
return view('admin.inventory.locations.form', [
|
||||
'model' => $location,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(UpdateLocationRequest $request, Location $location)
|
||||
{
|
||||
$location->update($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.locations.index');
|
||||
}
|
||||
|
||||
public function destroy(Location $location)
|
||||
{
|
||||
$location->delete();
|
||||
|
||||
\Session::flash('alert-success', __('Eintrag gelöscht'));
|
||||
|
||||
return redirect()->route('admin.inventory.locations.index');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Inventory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Inventory\StoreMaterialQualityRequest;
|
||||
use App\Http\Requests\Inventory\UpdateMaterialQualityRequest;
|
||||
use App\Models\MaterialQuality;
|
||||
|
||||
class MaterialQualityController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view('admin.inventory.material-qualities.index', [
|
||||
'values' => MaterialQuality::query()->orderBy('pos')->orderBy('name')->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('admin.inventory.material-qualities.form', [
|
||||
'model' => new MaterialQuality(['pos' => 0]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(StoreMaterialQualityRequest $request)
|
||||
{
|
||||
MaterialQuality::create($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.material-qualities.index');
|
||||
}
|
||||
|
||||
public function edit(MaterialQuality $materialQuality)
|
||||
{
|
||||
return view('admin.inventory.material-qualities.form', [
|
||||
'model' => $materialQuality,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(UpdateMaterialQualityRequest $request, MaterialQuality $materialQuality)
|
||||
{
|
||||
$materialQuality->update($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.material-qualities.index');
|
||||
}
|
||||
|
||||
public function destroy(MaterialQuality $materialQuality)
|
||||
{
|
||||
$materialQuality->delete();
|
||||
|
||||
\Session::flash('alert-success', __('Eintrag gelöscht'));
|
||||
|
||||
return redirect()->route('admin.inventory.material-qualities.index');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Inventory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Inventory\StorePackagingItemRequest;
|
||||
use App\Http\Requests\Inventory\UpdatePackagingItemRequest;
|
||||
use App\Models\PackagingItem;
|
||||
use App\Models\PackagingMaterial;
|
||||
use App\Models\Supplier;
|
||||
use App\Repositories\PackagingItemRepository;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PackagingItemController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
protected PackagingItemRepository $packagingItemRepository
|
||||
) {}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$category = $request->get('category', 'packaging');
|
||||
$isShipping = $category === 'shipping';
|
||||
|
||||
$query = PackagingItem::query()
|
||||
->with(['packagingMaterial', 'supplier'])
|
||||
->orderBy('name');
|
||||
|
||||
if ($isShipping) {
|
||||
$query->whereIn('category', ['shipping', 'label', 'shipping_office']);
|
||||
} else {
|
||||
$query->where('category', 'packaging');
|
||||
}
|
||||
|
||||
return view('admin.inventory.packaging-items.index', [
|
||||
'values' => $query->get(),
|
||||
'category' => $category,
|
||||
'pageTitle' => $isShipping ? __('Versandverpackung') : __('Produktverpackung'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function create(Request $request)
|
||||
{
|
||||
$category = $request->get('category', 'packaging');
|
||||
|
||||
return view('admin.inventory.packaging-items.form', [
|
||||
'model' => new PackagingItem(['active' => true, 'category' => $category === 'shipping' ? 'shipping' : 'packaging', 'weight_grams' => 0]),
|
||||
'packagingMaterials' => PackagingMaterial::query()->orderBy('pos')->orderBy('name')->get(),
|
||||
'suppliers' => Supplier::query()->orderBy('name')->get(),
|
||||
'category' => $category,
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(StorePackagingItemRequest $request)
|
||||
{
|
||||
$item = $this->packagingItemRepository->create($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
$category = in_array($item->category, ['shipping', 'label', 'shipping_office']) ? 'shipping' : 'packaging';
|
||||
|
||||
return redirect()->route('admin.inventory.packaging-items.index', ['category' => $category]);
|
||||
}
|
||||
|
||||
public function edit(PackagingItem $packagingItem)
|
||||
{
|
||||
$category = in_array($packagingItem->category, ['shipping', 'label', 'shipping_office']) ? 'shipping' : 'packaging';
|
||||
|
||||
return view('admin.inventory.packaging-items.form', [
|
||||
'model' => $packagingItem,
|
||||
'packagingMaterials' => PackagingMaterial::query()->orderBy('pos')->orderBy('name')->get(),
|
||||
'suppliers' => Supplier::query()->orderBy('name')->get(),
|
||||
'category' => $category,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(UpdatePackagingItemRequest $request, PackagingItem $packagingItem)
|
||||
{
|
||||
$this->packagingItemRepository->update($packagingItem, $request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
$category = in_array($packagingItem->category, ['shipping', 'label', 'shipping_office']) ? 'shipping' : 'packaging';
|
||||
|
||||
return redirect()->route('admin.inventory.packaging-items.index', ['category' => $category]);
|
||||
}
|
||||
|
||||
public function destroy(PackagingItem $packagingItem)
|
||||
{
|
||||
$category = in_array($packagingItem->category, ['shipping', 'label', 'shipping_office']) ? 'shipping' : 'packaging';
|
||||
|
||||
$packagingItem->delete();
|
||||
|
||||
\Session::flash('alert-success', __('Eintrag gelöscht'));
|
||||
|
||||
return redirect()->route('admin.inventory.packaging-items.index', ['category' => $category]);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Inventory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Inventory\StorePackagingMaterialRequest;
|
||||
use App\Http\Requests\Inventory\UpdatePackagingMaterialRequest;
|
||||
use App\Models\PackagingMaterial;
|
||||
|
||||
class PackagingMaterialController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view('admin.inventory.packaging-materials.index', [
|
||||
'values' => PackagingMaterial::query()->orderBy('pos')->orderBy('name')->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('admin.inventory.packaging-materials.form', [
|
||||
'model' => new PackagingMaterial(['pos' => 0]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(StorePackagingMaterialRequest $request)
|
||||
{
|
||||
PackagingMaterial::create($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.packaging-materials.index');
|
||||
}
|
||||
|
||||
public function edit(PackagingMaterial $packagingMaterial)
|
||||
{
|
||||
return view('admin.inventory.packaging-materials.form', [
|
||||
'model' => $packagingMaterial,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(UpdatePackagingMaterialRequest $request, PackagingMaterial $packagingMaterial)
|
||||
{
|
||||
$packagingMaterial->update($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.packaging-materials.index');
|
||||
}
|
||||
|
||||
public function destroy(PackagingMaterial $packagingMaterial)
|
||||
{
|
||||
$packagingMaterial->delete();
|
||||
|
||||
\Session::flash('alert-success', __('Eintrag gelöscht'));
|
||||
|
||||
return redirect()->route('admin.inventory.packaging-materials.index');
|
||||
}
|
||||
}
|
||||
169
app/Http/Controllers/Admin/Inventory/ProductionController.php
Normal file
169
app/Http/Controllers/Admin/Inventory/ProductionController.php
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Inventory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Inventory\StoreProductionRequest;
|
||||
use App\Models\Location;
|
||||
use App\Models\Product;
|
||||
use App\Models\Production;
|
||||
use App\Repositories\ProductionRepository;
|
||||
use App\Services\ProductionService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class ProductionController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
protected ProductionRepository $productionRepository,
|
||||
protected ProductionService $productionService
|
||||
) {}
|
||||
|
||||
public function index(): View
|
||||
{
|
||||
return view('admin.inventory.productions.index', [
|
||||
'values' => $this->productionRepository->listForIndex(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function create(): View
|
||||
{
|
||||
$defaultLocationId = Location::query()->where('name', 'like', '%öln%')->value('id')
|
||||
?? Location::query()->where('active', true)->first()?->id;
|
||||
|
||||
return view('admin.inventory.productions.create', [
|
||||
'products' => Product::query()->where('active', 1)->orderBy('name')->get(['id', 'name']),
|
||||
'locations' => Location::query()->where('active', true)->orderBy('name')->get(),
|
||||
'defaultLocationId' => $defaultLocationId,
|
||||
'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('active', 1)
|
||||
->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)->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);
|
||||
if ($locationId < 1) {
|
||||
return response()->json(['message' => __('location_id erforderlich')], 422);
|
||||
}
|
||||
|
||||
return response()->json(
|
||||
$this->productionService->buildRecipePayload($product, $locationId, max(1, $quantity))
|
||||
);
|
||||
}
|
||||
}
|
||||
234
app/Http/Controllers/Admin/Inventory/StockEntryController.php
Normal file
234
app/Http/Controllers/Admin/Inventory/StockEntryController.php
Normal file
|
|
@ -0,0 +1,234 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Inventory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Inventory\ReceiveStockEntryRequest;
|
||||
use App\Http\Requests\Inventory\StoreStockEntryRequest;
|
||||
use App\Http\Requests\Inventory\UpdateStockEntryRequest;
|
||||
use App\Models\Ingredient;
|
||||
use App\Models\Location;
|
||||
use App\Models\MaterialQuality;
|
||||
use App\Models\PackagingItem;
|
||||
use App\Models\StockEntry;
|
||||
use App\Models\Supplier;
|
||||
use App\Repositories\StockEntryRepository;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class StockEntryController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
protected StockEntryRepository $stockEntryRepository
|
||||
) {}
|
||||
|
||||
public function index(): View
|
||||
{
|
||||
return view('admin.inventory.stock-entries.index', array_merge($this->formSharedData(), [
|
||||
'values' => $this->stockEntryRepository->listForIndex(),
|
||||
]));
|
||||
}
|
||||
|
||||
public function create(): View|RedirectResponse
|
||||
{
|
||||
if (! auth()->user()->isAdmin()) {
|
||||
return redirect()->route('home');
|
||||
}
|
||||
|
||||
return view('admin.inventory.stock-entries.create', array_merge($this->formSharedData(), [
|
||||
'model' => new StockEntry([
|
||||
'ordered_at' => now()->toDateString(),
|
||||
'entry_type' => 'ingredient',
|
||||
]),
|
||||
]));
|
||||
}
|
||||
|
||||
public function store(StoreStockEntryRequest $request): RedirectResponse
|
||||
{
|
||||
if (! $request->user()->isAdmin()) {
|
||||
return redirect()->route('home');
|
||||
}
|
||||
|
||||
$data = $request->validatedPayload();
|
||||
$data['ordered_by'] = (int) auth()->id();
|
||||
|
||||
$this->stockEntryRepository->create($data);
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.stock-entries.index');
|
||||
}
|
||||
|
||||
public function show(StockEntry $stockEntry): View
|
||||
{
|
||||
$stockEntry->load([
|
||||
'ingredient',
|
||||
'packagingItem.packagingMaterial',
|
||||
'supplier',
|
||||
'location',
|
||||
'quality',
|
||||
'orderedByUser.account',
|
||||
'receivedByUser.account',
|
||||
]);
|
||||
|
||||
return view('admin.inventory.stock-entries.show', array_merge($this->formSharedData(), [
|
||||
'model' => $stockEntry,
|
||||
'materialQualities' => MaterialQuality::query()->orderBy('pos')->orderBy('name')->get(),
|
||||
]));
|
||||
}
|
||||
|
||||
public function edit(StockEntry $stockEntry): View|RedirectResponse
|
||||
{
|
||||
if (! auth()->user()->isAdmin()) {
|
||||
return redirect()->route('home');
|
||||
}
|
||||
if (! $stockEntry->isPending()) {
|
||||
\Session::flash('alert-error', __('Nur offene Bestellungen können bearbeitet werden.'));
|
||||
|
||||
return redirect()->route('admin.inventory.stock-entries.show', $stockEntry);
|
||||
}
|
||||
|
||||
$stockEntry->load(['ingredient', 'packagingItem']);
|
||||
|
||||
return view('admin.inventory.stock-entries.edit', array_merge($this->formSharedData(), [
|
||||
'model' => $stockEntry,
|
||||
]));
|
||||
}
|
||||
|
||||
public function update(UpdateStockEntryRequest $request, StockEntry $stockEntry): RedirectResponse
|
||||
{
|
||||
if (! $request->user()->isAdmin()) {
|
||||
return redirect()->route('home');
|
||||
}
|
||||
if (! $stockEntry->isPending()) {
|
||||
\Session::flash('alert-error', __('Nur offene Bestellungen können bearbeitet werden.'));
|
||||
|
||||
return redirect()->route('admin.inventory.stock-entries.show', $stockEntry);
|
||||
}
|
||||
|
||||
$this->stockEntryRepository->update($stockEntry, $request->validatedPayload());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.stock-entries.index');
|
||||
}
|
||||
|
||||
public function destroy(StockEntry $stockEntry): RedirectResponse
|
||||
{
|
||||
if (! auth()->user()->isAdmin()) {
|
||||
return redirect()->route('home');
|
||||
}
|
||||
if (! $stockEntry->isPending()) {
|
||||
\Session::flash('alert-error', __('Nur offene Bestellungen können gelöscht werden.'));
|
||||
|
||||
return redirect()->route('admin.inventory.stock-entries.index');
|
||||
}
|
||||
|
||||
$stockEntry->delete();
|
||||
|
||||
\Session::flash('alert-success', __('Eintrag gelöscht'));
|
||||
|
||||
return redirect()->route('admin.inventory.stock-entries.index');
|
||||
}
|
||||
|
||||
public function receive(ReceiveStockEntryRequest $request, StockEntry $stockEntry): RedirectResponse
|
||||
{
|
||||
if (! $stockEntry->isPending()) {
|
||||
\Session::flash('alert-error', __('Eintrag nicht mehr offen.'));
|
||||
|
||||
return redirect()->route('admin.inventory.stock-entries.show', $stockEntry);
|
||||
}
|
||||
|
||||
$data = $request->validated();
|
||||
if ($stockEntry->entry_type !== 'ingredient') {
|
||||
$data['quality_id'] = null;
|
||||
$data['best_before'] = null;
|
||||
}
|
||||
|
||||
$this->stockEntryRepository->receive($stockEntry, $data);
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.stock-entries.show', $stockEntry->fresh());
|
||||
}
|
||||
|
||||
public function searchIngredients(Request $request): JsonResponse
|
||||
{
|
||||
$term = trim((string) $request->query('q', ''));
|
||||
if (mb_strlen($term) < 1) {
|
||||
return response()->json(['results' => []]);
|
||||
}
|
||||
|
||||
$rows = Ingredient::query()
|
||||
->where('active', true)
|
||||
->where(function ($query) use ($term) {
|
||||
$query->where('name', 'like', '%'.$term.'%')
|
||||
->orWhere('inci', 'like', '%'.$term.'%');
|
||||
})
|
||||
->orderBy('name')
|
||||
->limit(30)
|
||||
->get(['id', 'name', 'inci']);
|
||||
|
||||
$results = $rows->map(function (Ingredient $i) {
|
||||
$text = $i->name;
|
||||
if ($i->inci) {
|
||||
$text .= ' ('.$i->inci.')';
|
||||
}
|
||||
|
||||
return ['id' => $i->id, 'text' => $text];
|
||||
})->values()->all();
|
||||
|
||||
return response()->json(['results' => $results]);
|
||||
}
|
||||
|
||||
public function searchPackagingItems(Request $request): JsonResponse
|
||||
{
|
||||
$term = trim((string) $request->query('q', ''));
|
||||
$entryType = $request->query('entry_type');
|
||||
|
||||
$categoryMap = [
|
||||
'packaging' => 'packaging',
|
||||
'label' => 'label',
|
||||
'shipping_office' => 'shipping_office',
|
||||
];
|
||||
|
||||
$query = PackagingItem::query()
|
||||
->where('active', true);
|
||||
|
||||
if ($entryType && isset($categoryMap[$entryType])) {
|
||||
$query->where('category', $categoryMap[$entryType]);
|
||||
}
|
||||
|
||||
if (mb_strlen($term) >= 1) {
|
||||
$query->where('name', 'like', '%'.$term.'%');
|
||||
}
|
||||
|
||||
$rows = $query->orderBy('name')->limit(30)->get(['id', 'name']);
|
||||
|
||||
$results = $rows->map(fn (PackagingItem $p) => [
|
||||
'id' => $p->id,
|
||||
'text' => $p->name,
|
||||
])->values()->all();
|
||||
|
||||
return response()->json(['results' => $results]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
protected function formSharedData(): array
|
||||
{
|
||||
return [
|
||||
'suppliers' => Supplier::query()->where('active', true)->orderBy('name')->get(),
|
||||
'locations' => Location::query()->where('active', true)->orderBy('name')->get(),
|
||||
'entryTypeLabels' => [
|
||||
'ingredient' => __('Rohstoff'),
|
||||
'packaging' => __('Verpackung'),
|
||||
'label' => __('Etikett'),
|
||||
'shipping_office' => __('Versand & Büro'),
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Inventory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Inventory\StoreSupplierCategoryRequest;
|
||||
use App\Http\Requests\Inventory\UpdateSupplierCategoryRequest;
|
||||
use App\Models\SupplierCategory;
|
||||
|
||||
class SupplierCategoryController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view('admin.inventory.supplier-categories.index', [
|
||||
'values' => SupplierCategory::query()->orderBy('pos')->orderBy('name')->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('admin.inventory.supplier-categories.form', [
|
||||
'model' => new SupplierCategory(['pos' => 0]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(StoreSupplierCategoryRequest $request)
|
||||
{
|
||||
SupplierCategory::create($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.supplier-categories.index');
|
||||
}
|
||||
|
||||
public function edit(SupplierCategory $supplierCategory)
|
||||
{
|
||||
return view('admin.inventory.supplier-categories.form', [
|
||||
'model' => $supplierCategory,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(UpdateSupplierCategoryRequest $request, SupplierCategory $supplierCategory)
|
||||
{
|
||||
$supplierCategory->update($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.supplier-categories.index');
|
||||
}
|
||||
|
||||
public function destroy(SupplierCategory $supplierCategory)
|
||||
{
|
||||
$supplierCategory->delete();
|
||||
|
||||
\Session::flash('alert-success', __('Eintrag gelöscht'));
|
||||
|
||||
return redirect()->route('admin.inventory.supplier-categories.index');
|
||||
}
|
||||
}
|
||||
74
app/Http/Controllers/Admin/Inventory/SupplierController.php
Normal file
74
app/Http/Controllers/Admin/Inventory/SupplierController.php
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin\Inventory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Inventory\StoreSupplierRequest;
|
||||
use App\Http\Requests\Inventory\UpdateSupplierRequest;
|
||||
use App\Models\Country;
|
||||
use App\Models\Supplier;
|
||||
use App\Models\SupplierCategory;
|
||||
use App\Repositories\SupplierRepository;
|
||||
|
||||
class SupplierController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
protected SupplierRepository $supplierRepository
|
||||
) {}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return view('admin.inventory.suppliers.index', [
|
||||
'values' => Supplier::query()->with(['country', 'supplierCategories'])->orderBy('name')->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$defaultCountryId = Country::where('code', 'DE')->value('id');
|
||||
|
||||
return view('admin.inventory.suppliers.form', [
|
||||
'model' => new Supplier(['active' => true, 'country_id' => $defaultCountryId]),
|
||||
'countries' => Country::query()->orderBy('de')->get(),
|
||||
'supplierCategories' => SupplierCategory::query()->orderBy('pos')->orderBy('name')->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(StoreSupplierRequest $request)
|
||||
{
|
||||
$this->supplierRepository->create($request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.suppliers.index');
|
||||
}
|
||||
|
||||
public function edit(Supplier $supplier)
|
||||
{
|
||||
$supplier->load('supplierCategories');
|
||||
|
||||
return view('admin.inventory.suppliers.form', [
|
||||
'model' => $supplier,
|
||||
'countries' => Country::query()->orderBy('de')->get(),
|
||||
'supplierCategories' => SupplierCategory::query()->orderBy('pos')->orderBy('name')->get(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(UpdateSupplierRequest $request, Supplier $supplier)
|
||||
{
|
||||
$this->supplierRepository->update($supplier, $request->validated());
|
||||
|
||||
\Session::flash('alert-save', '1');
|
||||
|
||||
return redirect()->route('admin.inventory.suppliers.index');
|
||||
}
|
||||
|
||||
public function destroy(Supplier $supplier)
|
||||
{
|
||||
$supplier->delete();
|
||||
|
||||
\Session::flash('alert-success', __('Eintrag gelöscht'));
|
||||
|
||||
return redirect()->route('admin.inventory.suppliers.index');
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue