mivita/app/Console/Commands/AboExternDoneOrder.php
Kevin f6faad9ae7 Abo: extern-erledigt für gelöschte Abos + Lieferhistorie-Umzug (Ticket Kunz Mai-Punkte)
- AboExternalCompletionService: Bestellungen gelöschter/ersetzter Abos können
  nachträglich extern erledigt werden (Punkte + Status 8 + Versandstatus);
  das gelöschte Abo wird dabei nicht reaktiviert
- IncentiveTracker::trackSalesVolume: Abo-Zuordnung inkl. gelöschter Abos
  (withTrashed) - nachgebuchte Umsätze bereits getrackter Abos zählen weiter
- Neue Wartungs-Commands: abo:extern-done {shopping_order_id} und
  abo:move-orders {from_abo} {to_abo} (--dry-run, Guards: gleicher Kunde)
- Latent datumsabhängigen Alt-Test in AboExternalCompletionTest repariert
  (Buchung nutzt date(), nicht Carbon::setTestNow)

Fall Kunz (dev/2026-08-12-intensiv-tickets): Dannenhauers gelieferte, aber am
17.06. beim Nachtragen vergessene Mai-Order 53274 → abo:extern-done (+54 P);
Bockhackers Lieferhistorie von gelöschtem Abo 197 → 496 umgehängt (Zähler 4).
Bockhackers 24 P existieren bereits (Juni-Buchung der Mai-Lieferung).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 12:06:29 +00:00

45 lines
1.4 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\ShoppingOrder;
use App\Services\AboExternalCompletionService;
use Illuminate\Console\Command;
/**
* Wartungs-Command: eine angehaltene Abo-Bestellung als "extern erledigt" markieren
* (Punkte gutschreiben, Lieferung zaehlt, Bestellung bleibt unbezahlt).
*
* Entspricht dem Admin-Button "extern erledigt", funktioniert aber auch fuer
* Bestellungen geloeschter/ersetzter Abos, die im UI nicht mehr erreichbar sind.
*/
class AboExternDoneOrder extends Command
{
protected $signature = 'abo:extern-done {shopping_order_id : ID der Abo-Bestellung}';
protected $description = 'Angehaltene Abo-Bestellung als extern erledigt markieren (Punkte + Lieferzähler, auch bei gelöschtem Abo)';
public function handle(AboExternalCompletionService $service): int
{
$order = ShoppingOrder::find($this->argument('shopping_order_id'));
if (! $order) {
$this->error('Bestellung nicht gefunden.');
return self::FAILURE;
}
$result = $service->complete($order);
if (! $result['success']) {
$this->error($result['message']);
return self::FAILURE;
}
$this->info("Bestellung {$order->id} extern erledigt: {$result['message']}");
$this->info("Punkte: {$order->points} | Netto: {$order->subtotal} | Berater: ".($order->member_id ?? $order->auth_user_id));
return self::SUCCESS;
}
}