{{-- Filial- und Zentrallagerbestellung sind derselbe Vorgang auf zwei Geltungsbereichen. Sie bleiben getrennte Seiten - dahinter liegen zwei Tabellen, zwei Rechenlaeufe und ganz andere Steuerelemente (Filter, Senden je Filiale, Skip, Riccardo-Weg gegen eine Liste mit einem Knopf). Eine Seite mit "wenn Zentrallager"-Abzweigungen waere unuebersichtlicher als zwei klare. Was fehlte, war nur der Weg dazwischen (07.09.2026). --}}
Filialen Zentrallager 94
@php $nf0 = fn ($v) => number_format((float) $v, 0, ',', '.'); $nf2 = fn ($v) => number_format((float) $v, 2, ',', '.'); $bestellbar = $vorschlaege->where('order_quantity', '>', 0); $ohneBestand = $vorschlaege->where('order_quantity', '<=', 0); /* * Der Sendeknopf und die Bestaetigungsfrage gelten NUR fuer ExTrade - der * geht ueber die API. Seit auch Niko im Zentrallauf steckt (08.09.2026), * waere `$bestellbar` dafuer die falsche Zahl: sie enthaelt beide * Lieferanten, und man wuerde "467 Positionen an ExTrade uebertragen" * bestaetigen, obwohl nur 432 dorthin gehen. */ $extradeBeleg = $belege->firstWhere('supplier_id', $extradeId); $extradeBestellbar = $extradeBeleg['bestellbar'] ?? collect(); // Dringlichkeit analog Filial-Maske: Ausverkauft / unter Sicherheitsbestand / Nachbestellen. $dringlichkeit = function ($v) { if ($v->current_stock <= 0) return 'out'; if ($v->current_stock <= $v->safety_stock) return 'critical'; return 'reorder'; }; @endphp @if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif {{-- Kennzahlen --}}

Positionen

{{ $nf0($statistik['positionen']) }}

Stück gesamt

{{ $nf0($statistik['stueck']) }}

Lieferant ohne Bestand

{{ $nf0($statistik['gedeckelt']) }}

Bestand unbekannt

{{ $nf0($statistik['unbekannt']) }}

{{-- Werkzeugleiste: Status links, Sammelexport rechts --}}
Online-API {{ $online->isConfigured() ? 'verbunden' : 'fehlt' }} Historie {{ $historieTage }} Tage{{ $historieBis ? ' (Stand ' . \Illuminate\Support\Carbon::parse($historieBis)->format('d.m.') . ')' : '' }} @if($stand) Lauf vom {{ \Illuminate\Support\Carbon::parse($stand)->format('d.m.Y') }} @endif
@if($bestellbar->isNotEmpty())
Bestellung ExTrade – CSV @if($gesendet) ✓ Versendet {{ $gesendet->sent_at?->format('H:i') }} Uhr ({{ $nf0($gesendet->positions) }} Pos.) @elseif($apiBereit)
@csrf
@else @endif
@endif

Bestellt wird wöchentlich ({{ $bestelltag }}), Zielreichweite {{ $zielTage }} Tage. Bedarfsbasis: Onlineshop-Endkunden (Kassenbelege und Filialbestellungen herausgerechnet – Filialen bestellen ExTrade direkt). Rechenlauf jeden Dienstag 05:30, manuell per php artisan replenishment:central.

{{-- EIN BELEG JE LIEFERANT. ExTrade geht ueber die API, Niko ueber zwei Dateien - der Unterschied steckt allein im Knopf am Kopf. Die Liste darunter ist dieselbe, damit man beide Belege gleich liest (Vorgabe 08.09.2026). --}} @foreach($belege as $beleg) @php $bestellbarB = $beleg['bestellbar']; $istNiko = $beleg['supplier_id'] === $nikoId; [$rand, $kopfBg, $kopfText] = $istNiko ? ['border-teal-300', 'bg-teal-50', 'text-teal-800'] : ['border-blue-300', 'bg-blue-50', 'text-blue-800']; @endphp @if($bestellbarB->isNotEmpty())

{{ $beleg['name'] }}

@if($istNiko) Zwei Dateien: Bestellung an Niko und Lieferantenbestellung für die Online-Wawi @else Bestellung {{ $bestelltag }} · Empfänger: {{ $zentrallager ?: 'Lager 94' }} @endif

{{ $bestellbarB->count() }} Positionen · {{ $nf0($bestellbarB->sum('order_quantity')) }} Stück

@if($beleg['gesendet']) ✓ {{ $beleg['gesendet']->sent_at?->format('H:i') }} Uhr @elseif($istNiko) Bestellen … @else CSV @endif Intern
@include('partials.positionsliste', [ 'gruppen' => app(\App\Services\Replenishment\ArticleGrouping::class)->gruppiere($bestellbarB), 'menge' => fn ($z) => (float) $z->order_quantity, 'spalten' => [ ['kopf' => 'Artikel', 'typ' => 'text', 'klasse' => 'text-left', 'wert' => fn ($z) => '

' . e($z->article_name) . '

' . '

' . e($z->article_sku) . '

'], ['kopf' => 'Bestand 94', 'typ' => 'zahl', 'wert' => fn ($z) => '' . number_format((float) $z->current_stock, 0, ',', '.') . ''], ['kopf' => 'Meldebestand', 'typ' => 'zahl', 'wert' => fn ($z) => '' . number_format((float) $z->reorder_point, 0, ',', '.') . ''], ['kopf' => 'Bestellmenge', 'typ' => 'zahl', 'wert' => fn ($z) => '' . number_format((float) $z->order_quantity, 0, ',', '.') . ''], ['kopf' => 'Detail', 'typ' => 'text', 'wert' => fn ($z) => 'Detail'], ], ])
@endif {{-- Nicht lieferbar - je Lieferant, sonst stuenden Niko-Positionen unter der Ueberschrift "ExTrade meldet keinen Bestand". --}} @if($beleg['ohneBestand']->isNotEmpty())
@foreach($beleg['ohneBestand'] as $v) @endforeach

{{ $v->article_name }}

{{ $v->article_sku }}

Bestand {{ $nf0($v->current_stock) }} Ø/Tag {{ $nf2($v->avg_daily_demand) }} {{ $v->failure_reason ?: 'Lieferant ohne Bestand' }} Detail
@endif @endforeach @if(! $stand)
Noch kein Rechenlauf erfolgt. Die Berechnung läuft automatisch jeden Dienstag 05:30 – manuell per php artisan replenishment:central.
@elseif($bestellbar->isEmpty() && $ohneBestand->isEmpty())
Aktuell keine geplante Zentrallager-Bestellung – kein Artikel hat den Meldebestand erreicht.
@endif