Warenwirtschaft: AP-21 INCI-Erweiterungen

- Lagerort-Stammdaten Raum/Regal/Fach (storage_rooms/shelves/slots) mit CRUD
  auf Einstellungen -> Allgemein (SettingCrudController-Kinder, ein gemeinsamer
  StoreStorageSegmentRequest, generische Partials setting-list-card/-segment-form)
- Ingredient: alt_name (Handelsname), Lagerort-FKs + storageLabel(),
  scopeUsedInActiveRecipes()
- INCI-Formular: Lieferanten-Repeater mit Shop-URL je Lieferant (leer = Mail),
  Alternativname, drei Lagerort-Dropdowns
- INCI-Liste: Filter "nur aktive (in Rezeptur aktiver Produkte)" + Spalte
  Alternativer Name
- Rohstoffbestand-Detail: Bestellweg pro INCI-Lieferant (Pivot-URL statt
  order_method-Fallback), Kopf zeigt Alternativname + Lagerort
- Hinweise-Doku fortgeschrieben inkl. Chargen-Format-Entscheid ttmmjj (AP-24)

Tests: StorageSettingsTest, IngredientActiveRecipeFilterTest,
IngredientOrderFieldsTest (Repeater-Format), RawMaterialStockTest erweitert
(volle Suite 170 gruen, 613 Assertions)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-06 11:36:28 +00:00
parent 8c90d95c69
commit d05df498d3
34 changed files with 1091 additions and 45 deletions

View file

@ -5,6 +5,9 @@ namespace App\Http\Controllers\Admin\Inventory;
use App\Http\Controllers\Controller;
use App\Models\DeliveryTime;
use App\Models\DisposalReason;
use App\Models\StorageRoom;
use App\Models\StorageShelf;
use App\Models\StorageSlot;
use App\Models\TaxRate;
use Illuminate\Contracts\View\View;
@ -16,6 +19,9 @@ class GeneralSettingController extends Controller
'taxRates' => TaxRate::query()->orderBy('pos')->orderBy('percent')->get(),
'deliveryTimes' => DeliveryTime::query()->orderBy('pos')->orderBy('label')->get(),
'disposalReasons' => DisposalReason::query()->orderBy('pos')->orderBy('label')->get(),
'storageRooms' => StorageRoom::query()->orderBy('pos')->orderBy('label')->get(),
'storageShelves' => StorageShelf::query()->orderBy('pos')->orderBy('label')->get(),
'storageSlots' => StorageSlot::query()->orderBy('pos')->orderBy('label')->get(),
]);
}
}