Warenwirtschaft: AP-00 bis AP-08 + aktualisierter Entwicklungsplan

Umsetzung der Warenwirtschafts-/Produktmanagement-Erweiterung gemaess
Entwicklungsplan V4.0:

- AP-00: Regressionsbasis fuer 5.1-Features (ProductPhase51Test)
- AP-01: URL-Bugfixes B1/B2 (suppliers/packaging-items, breitere url-Spalten)
- AP-04/04.1: iPad-taugliche, vereinheitlichte Tabellen-Aktionen
- AP-05: Einstellungen "Allgemein" mit UST-Saetzen (tax_rates) und
  Lieferzeit-Vorlagen (delivery_times, inkl. Tage-Feld)
- AP-06: Lieferanten um Bestellweg, Bestell-Mail/-URL und Lieferzeit erweitert
- AP-07/07.1: INCI um Lieferanten-Mehrfachwahl, UST und Lieferzeit erweitert;
  Lieferanten-Detailansicht im Modal mit pflegbaren INCI-/Verpackungslisten
- AP-08: Einkauf um UST-Snapshot, Netto/Brutto-Automatik und Duplizieren erweitert

Entwicklungsplan aktualisiert: alle Klaerungspunkte (§5) vom Kunden beantwortet
und in die jeweiligen APs eingearbeitet (AP-02/03/09/13/15), neues AP-18
(Hinweise-Doku unter Einstellungen) ergaenzt. Naechster Schritt eindeutig
markiert: AP-09 (Produktion auf Hersteller-Rezeptur, kein Fallback, Warnung).
This commit is contained in:
Kevin Adametz 2026-06-02 16:30:42 +00:00
parent ca3eb663fe
commit 78679e0c55
67 changed files with 3523 additions and 101 deletions

View file

@ -2,9 +2,12 @@
namespace App\Http\Controllers;
use App\Http\Requests\StoreIngredientRequest;
use App\Models\DeliveryTime;
use App\Models\Ingredient;
use App\Models\ProductIngredient;
use Request;
use App\Models\Supplier;
use App\Models\TaxRate;
class IngredientController extends Controller
{
@ -29,40 +32,35 @@ class IngredientController extends Controller
$model = new Ingredient;
$model->active = true;
} else {
$model = Ingredient::findOrFail($id);
$model = Ingredient::with('suppliers')->findOrFail($id);
}
$data = [
'model' => $model,
// 'trans' => array_keys(config('localization.supportedLocales')),
'taxRates' => TaxRate::query()->active()->orderBy('pos')->orderBy('name')->get(),
'deliveryTimes' => DeliveryTime::query()->active()->orderBy('pos')->orderBy('label')->get(),
'suppliers' => Supplier::query()->where('active', true)->orderBy('name')->get(),
];
return view('admin.ingredient.edit', $data);
}
public function store()
public function store(StoreIngredientRequest $request)
{
$data = $request->validated();
$data['default_factor'] = $data['default_factor'] ?? 1.10;
$data = Request::all();
$data['active'] = isset($data['active']) ? true : false;
if (isset($data['default_factor']) && $data['default_factor'] !== '') {
$data['default_factor'] = reFormatNumber($data['default_factor']) ?: 1.10;
}
if (isset($data['min_stock_alert']) && $data['min_stock_alert'] === '') {
$data['min_stock_alert'] = null;
} elseif (isset($data['min_stock_alert']) && $data['min_stock_alert'] !== null) {
$data['min_stock_alert'] = reFormatNumber($data['min_stock_alert']);
}
if (empty($data['material_quality_id'])) {
$data['material_quality_id'] = null;
}
if ($data['id'] === 'new') {
$supplierIds = $request->input('supplier_ids', []);
unset($data['supplier_ids']);
if ($request->input('id') === 'new') {
$model = Ingredient::create($data);
} else {
$model = Ingredient::find($data['id']);
$model = Ingredient::findOrFail($request->input('id'));
$model->fill($data)->save();
}
$model->suppliers()->sync($supplierIds);
\Session()->flash('alert-save', '1');
return redirect(route('admin_product_ingredients'));