Multi-Warehouse
Mehrlagerverwaltung mit Click & Collect und Abholsystem
Überblick
Das Plugin BronnMultiWarehouse erweitert Shopware 6 um vollständige Mehrlagerverwaltung mit Click & Collect und integriertem Abholsystem.
Standard-Shopware kennt nur einen globalen Produktbestand. Dieses Plugin führt eigene Lager-Entities ein und verknüpft Lagerbestände pro Artikel. Kunden sehen auf der Produktseite, in welcher Filiale ihr Produkt verfügbar ist. Im Warenkorb wählen sie ihre Abholfiliale. Der Shopbetreiber markiert Bestellungen als abholbereit, der Kunde wird per E-Mail benachrichtigt.
Aktuelle Version: 2.2.0
Systemvoraussetzungen
Installation
php bin/console cache:clearKonfiguration
Die Plugin-Konfiguration befindet sich unter Erweiterungen > Meine Erweiterungen > BronnMultiWarehouse > Konfiguration.
Allgemeine Einstellungen:
Warenkorb & Bestellung:
Click & Collect:
Architektur
Datenbank (5 Tabellen):
| Tabelle | Zweck |
|---|---|
| bronn_warehouse | Lager mit Name, Code, Priorität, Adresse, Pickup-Flag, Öffnungszeiten |
| bronn_warehouse_translation | Übersetzbare Felder (Name, Beschreibung) |
| bronn_warehouse_stock | Bestand pro Produkt und Lager (min: 0) |
| bronn_warehouse_sales_channel | M:N Zuordnung Lager ↔ Verkaufskanal |
| bronn_warehouse_order | Zuordnung Lager ↔ Bestellposition |
Entity-Extensions:
Custom Fields (Order):
| Feld | Typ | Zweck |
|---|---|---|
| bronn_pickup_order | bool | Bestellung ist Abholbestellung |
| bronn_pickup_status | string | "pending" oder "ready" |
| bronn_pickup_warehouse_id | string | UUID der Abholfiliale |
| bronn_pickup_warehouse_name | string | Name der Abholfiliale |
Services & Controller
WarehouseStockService:
WarehouseCartProcessor (Priority 4400):
PickupController (Admin API):
ClickAndCollectController (Storefront):
Event-Subscriber
| Subscriber | Event | Funktion |
|---|---|---|
| OrderPlacedSubscriber | CheckoutOrderPlacedEvent | Allokation + Bestandsabzug + Pickup-Custom-Fields setzen |
| WarehouseStockSyncSubscriber | bronn_warehouse_stock.written/deleted, bronn_warehouse.written | product.stock = Summe aktiver Lager |
| ProductPageSubscriber | ProductPageLoadedEvent | PDP mit Lagerbestand anreichern |
| CartPageSubscriber | Cart/Confirm Page Events | Click & Collect Daten bereitstellen |
Bestandssynchronisation
product.stock wird automatisch aktualisiert bei:
SQL-Abfrage:
SELECT COALESCE(SUM(ws.stock), 0)
FROM bronn_warehouse_stock ws
INNER JOIN bronn_warehouse w ON ws.warehouse_id = w.id
WHERE ws.product_id = UNHEX(:productId)
AND w.active = 1Besonderheit: Beim Update eines Stock-Eintrags (nur stock-Feld geändert) ist die productId nicht im DAL-Event-Payload. Der Subscriber löst die productId per DB-Lookup über die Stock-Entry-ID auf.
Allokationsstrategien
Priority (Standard):
Füllt Bestellmenge vom höchstpriorisierten Lager (niedrigster Prioritätswert) auf. Cascade zum nächsten bei Unterbestand.
Equal Distribution:
Verteilt gleichmäßig über alle Lager mit Bestand. baseShare = floor(qty / warehouseCount), Remainder auf erste Lager. Fallback auf Priority bei Unterbestand.
Abholsystem (Pickup)
Workflow:
ClickAndCollectController speichert bronnClickAndCollect in Cart ExtensionOrderPlacedSubscriber.setPickupCustomFields() setzt Custom Fieldssw-order-detail-general OverridePickupController.markReady() → setzt Status auf "ready" → dispatched PickupReadyEventPickupReadyEvent:
E-Mail-Templates (via Migration):
Admin-UI
Modul: bronn-warehouse unter Kataloge > Lagerverwaltung
Extensions:
Storefront-Templates
| Template | Block | Funktion |
|---|---|---|
| buy-widget.html.twig | buy_widget_buy_form | Bestandsanzeige pro Lager auf PDP |
| cart/index.html.twig | page_checkout_cart_add_product_and_shipping | Click & Collect Filialauswahl |
| confirm/index.html.twig | page_checkout_confirm_shipping | Ausgewählte Filiale + Abholhinweis |