- Etikettgröße im Lieferschein korrekt parsen ("40#3,5" ergab 3 statt 3,5 cm)
- Produktkopie optional inkl. Kundenzuordnungen und Logo-Dateien (zweiter Kopier-Link)
- whitelabel:transfer-assignments: gezielte, wiederholbare Übertragung ohne Dubletten
- whitelabel:migrate-colors: Zuordnungen anhand der Bildfarbe auf die Farbprodukte übertragen (Dry-Run ohne --execute)
- whitelabel:report: rein lesende Bestandsprüfung (fehlende Zuordnungen, Farbwidersprüche, Dateien, Dubletten)
- Migration für attributes.value (Schema-Drift, auf Live No-op)
- Analyse/Entwicklungsplan um Gegenprüfung, systemischen Befund und neue Paketreihenfolge ergänzt
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
89 lines
3.3 KiB
PHP
89 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\Product;
|
|
use App\Models\UserWhitelabelProduct;
|
|
use App\Repositories\ProductRepository;
|
|
use Illuminate\Console\Command;
|
|
|
|
/**
|
|
* WL-00: Kundenzuordnungen (Partner-Logos) von einem White-Label-Produkt auf ein anderes übertragen.
|
|
* Wiederholbar: vorhandene Kombinationen (user_id, product_id) am Ziel werden übersprungen.
|
|
*/
|
|
class WhitelabelTransferAssignments extends Command
|
|
{
|
|
protected $signature = 'whitelabel:transfer-assignments
|
|
{source : Quellprodukt-ID}
|
|
{target : Zielprodukt-ID}
|
|
{--user= : Nur die Zuordnung dieses Partners (User-ID) übertragen}
|
|
{--dry-run : Nur anzeigen, nichts speichern}';
|
|
|
|
protected $description = 'Überträgt White-Label-Kundenzuordnungen samt Logos von einem Produkt auf ein anderes (ohne Dubletten)';
|
|
|
|
public function handle(): int
|
|
{
|
|
$source = Product::find((int) $this->argument('source'));
|
|
$target = Product::find((int) $this->argument('target'));
|
|
$userId = $this->option('user') !== null ? (int) $this->option('user') : null;
|
|
|
|
if (! $source || ! $target) {
|
|
$this->error('Quell- oder Zielprodukt nicht gefunden.');
|
|
|
|
return self::FAILURE;
|
|
}
|
|
if ($source->id === $target->id) {
|
|
$this->error('Quelle und Ziel sind identisch.');
|
|
|
|
return self::FAILURE;
|
|
}
|
|
if (! $target->whitelabel) {
|
|
$this->warn('Zielprodukt '.$target->id.' ist nicht als White-Label-Produkt gekennzeichnet.');
|
|
}
|
|
|
|
$this->line('Quelle: '.$source->id.' '.$source->name);
|
|
$this->line('Ziel: '.$target->id.' '.$target->name);
|
|
|
|
$query = UserWhitelabelProduct::query()->where('product_id', $source->id);
|
|
if ($userId !== null) {
|
|
$query->where('user_id', $userId);
|
|
}
|
|
$assignments = $query->orderBy('id')->get();
|
|
|
|
if ($assignments->isEmpty()) {
|
|
$this->warn('Keine Kundenzuordnungen am Quellprodukt gefunden.');
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
$rows = [];
|
|
foreach ($assignments as $assignment) {
|
|
$exists = UserWhitelabelProduct::query()
|
|
->where('product_id', $target->id)
|
|
->where('user_id', $assignment->user_id)
|
|
->exists();
|
|
$images = $assignment->whitelabel_images;
|
|
$missing = $images->filter(fn ($image) => ! file_exists($image->getBaseImagePath()))->count();
|
|
$rows[] = [
|
|
$assignment->id,
|
|
$assignment->user_id,
|
|
$images->count(),
|
|
$images->map(fn ($image) => json_encode($image->attributes))->join(' '),
|
|
$missing > 0 ? $missing.' Datei(en) fehlen' : 'ok',
|
|
$exists ? 'übersprungen (vorhanden)' : 'übernehmen',
|
|
];
|
|
}
|
|
$this->table(['Zuordnung', 'Partner', 'Logos', 'Varianten', 'Dateien', 'Aktion'], $rows);
|
|
|
|
if ($this->option('dry-run')) {
|
|
$this->info('Dry-run: nichts gespeichert.');
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
$result = (new ProductRepository($target))->copyWhitelabelAssignments($source, $target, $userId);
|
|
$this->info('Übernommen: '.$result['copied'].', übersprungen: '.$result['skipped'].'.');
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
}
|