@php $nf0 = fn ($v) => number_format((float) $v, 0, ',', '.'); @endphp {{-- Kennzahlen: links der Katalog, rechts was er uns bringt --}}

Artikel im Katalog

{{ $nf0($kennzahlen['gesamt']) }}

Stand {{ $kennzahlen['stand'] ? \Carbon\Carbon::parse($kennzahlen['stand'])->format('d.m.Y H:i') : '–' }}

bei uns bekannt

{{ $nf0($kennzahlen['bekannt']) }}

{{ $nf0($kennzahlen['per_ean']) }} über EAN · {{ $nf0($kennzahlen['per_nr']) }} über Lief.-Nr. @if($kennzahlen['manuell'] > 0) · {{ $nf0($kennzahlen['manuell']) }} von Hand @endif

fehlt noch in der Wawi

{{ $nf0($kennzahlen['offen']) }}

wird beim nächsten Lauf angelegt @if($kennzahlen['abgelehnt'] > 0) · {{ $nf0($kennzahlen['abgelehnt']) }} ausgenommen @endif

Felder zum Anreichern

{{ $nf0($potenzial['werte']) }}

@if($potenzial['ok']) in {{ $nf0($potenzial['artikel']) }} Artikeln, die wir führen @else {{ $potenzial['message'] }} @endif

@if($potenzial['ok'] && $potenzial['werte'] > 0)

Was der Katalog füllen kann

@foreach($potenzial['felder'] as $feld => $anzahl) {{ $feld }} {{ $nf0($anzahl) }} @endforeach

In der Anreicherungsdatei steht ausschließlich, was bei uns leer ist. Gepflegte Felder kommen nicht vor – der Import kann also nichts überschreiben. Preise sind bewusst nicht dabei: der Wert aus dem Portal ist der Listenpreis, nicht unser EK.

@endif {{-- Werkzeugleiste --}}
@csrf
Anlegen – Vorschau Ergänzen – Vorschau
@php $ohneRecht = collect($rechte)->filter(fn ($r) => ! $r['darf']); @endphp @if($ohneRecht->isNotEmpty())

Schreibrecht fehlt noch

{{ $ohneRecht->pluck('name')->implode(' und ') }} {{ $ohneRecht->count() > 1 ? 'erlauben' : 'erlaubt' }} der Suite bisher nur Lesen. Zum Anlegen und Ergänzen fehlt das Recht items.write.

Dafür muss die App in JTL-Wawi neu registriert und dort genehmigt werden (Admin → JTL-Verbindung). Bis dahin rechnen Vorschau und Exporte normal – geschrieben wird nichts.

Erteilt: @foreach($ohneRecht as $r){{ implode(', ', $r['scopes']) ?: 'keine' }}@if(!$loop->last) · @endif @endforeach

@endif {{-- Schreiben über die JTL-API --}}

In die Warenwirtschaft schreiben

Läuft automatisch — täglich 03:20 holt die Suite den Katalog und legt alles an, was in der Wawi fehlt (Varianten und Bilder inbegriffen). Entschieden wird in JTL, nicht hier. @if(config('extrade.automatik.ohne_eol', true)) Auslaufartikel bleiben außen vor. @endif @if($automatik)
Zuletzt {{ \Carbon\Carbon::parse($automatik['zeitpunkt'])->format('d.m.Y H:i') }}: {{ implode(' · ', $automatik['zeilen']) }} @endif

Die Knöpfe hier daneben sind nur für den Fall, dass es sofort passieren soll.

Angelegt und ergänzt wird über die JTL-REST-API (POST /items, PATCH /items/{id}, POST /items/{id}/suppliers) – nicht mehr über die Ameise. Der Artikel bekommt dabei ExTrade als Lieferant mit dessen Artikelnummer; ein EK-Preis wird bewusst nicht gesetzt, solange wir keine echten Einkaufspreise geliefert bekommen. Die Artikelnummer folgt der neuen Systematik (WG–Hersteller–Produkt–Nikotin–Inhalt–Prüfziffer). Ein zweiter Lauf legt nichts doppelt an.

@csrf
@if($lauf)
@if($lauf['laeuft'] ?? false)

Lauf „{{ $lauf['was'] }}“ läuft seit {{ $lauf['start'] }} ({{ $ziele[$lauf['ziel']]['name'] ?? $lauf['ziel'] }}). Seite später neu laden.

@else

Letzter Lauf: {{ $lauf['was'] }} in {{ $ziele[$lauf['ziel']]['name'] ?? $lauf['ziel'] }}, beendet {{ $lauf['ende'] ?? '–' }} – {{ $lauf['ergebnis'] ?? '' }}

@if($lauf['meldungen'] ?? [])
    @foreach(array_slice($lauf['meldungen'], 0, 8) as $m)
  • {{ $m }}
  • @endforeach
@endif @endif
@endif

Was die API nicht kann: Hersteller und Warengruppen nur lesen – was in JTL fehlt, muss dort angelegt werden (die Vorschau listet es auf). Und Inhalt/Maßeinheit (z. B. 10 ml) steht im REST-Vertrag überhaupt nicht; dieses Feld bleibt beim CSV-Weg oder der Pflege in der Wawi.

Kontroll-Exporte (dieselben Daten als CSV, ohne zu schreiben): Anlage · Anreicherung

{{-- Liste --}}
@forelse($treffer as $a) @empty @endforelse
Artikel Hersteller Kategorie Inhalt Nikotin Bestand Listenpreis bei uns

{{ $a->name }}

{{ $a->source_number }} @if($a->ean) · EAN {{ $a->ean }} @endif @if($a->eol) · Auslauf @endif @if($a->coming_soon) · in Kürze @endif

{{ $a->manufacturer ?: '–' }} {{ $a->category ?: '–' }} {{ $a->volume_ml ? rtrim(rtrim(number_format($a->volume_ml, 2, ',', ''), '0'), ',') . ' ml' : '–' }} {{ $a->nicotine_mg !== null ? rtrim(rtrim(number_format($a->nicotine_mg, 2, ',', ''), '0'), ',') . ' mg' : '–' }} {{ $nf0($a->stock) }} {{ $a->price_net_list !== null ? number_format($a->price_net_list, 2, ',', '.') . ' €' : '–' }} @if($a->sku)
@csrf

{{ ['ean' => 'über EAN', 'liefnr' => 'über Lief.-Nr.', 'manuell' => 'von Hand', 'angelegt' => 'von uns angelegt'][$a->matched_by] ?? $a->matched_by }}

@else {{-- Noch nicht in der Wawi: der nächste Lauf legt ihn an. --}} wird angelegt @if($a->decision === 'ablehnen') · ausgenommen @endif @endif
Keine Artikel zu diesen Filtern. @if($kennzahlen['gesamt'] === 0) Der Katalog ist noch leer – „Katalog aktualisieren“ holt ihn beim Lieferanten. @endif
{{ $treffer->links() }}