resolveInvoices(); if ($invoices === null) { return self::FAILURE; } $this->table( ['Storno-Rechnung', 'Storno-Nr.', 'Bestellung', 'Datum', 'Datei'], $invoices->map(fn (UserInvoice $invoice) => [ $invoice->id, $invoice->full_number, $invoice->shopping_order_id, $invoice->date, $invoice->dir.$invoice->filename, ]) ); if (! $this->option('force') && ! $this->confirm("Wirklich {$invoices->count()} Storno-PDF(s) neu erzeugen? Die bestehenden Dateien werden überschrieben.")) { return self::SUCCESS; } $errors = 0; foreach ($invoices as $invoice) { try { (new InvoiceRepository($invoice->shopping_order))->regenerateCancellationPDF($invoice); $this->info("Stornorechnung #{$invoice->id} ({$invoice->full_number}) neu erzeugt: ".Storage::disk('public')->path($invoice->dir.$invoice->filename)); } catch (\Throwable $e) { $errors++; $this->error("Stornorechnung #{$invoice->id}: {$e->getMessage()}"); } } return $errors > 0 ? self::FAILURE : self::SUCCESS; } /** * Löst die übergebenen IDs zu gültigen Stornorechnungen auf. * * @return Collection|null null bei Validierungsfehlern */ private function resolveInvoices(): ?Collection { $invoices = collect(); foreach ($this->argument('invoices') as $id) { if ($this->option('order')) { $order = ShoppingOrder::find((int) $id); if (! $order) { $this->error("ShoppingOrder {$id} nicht gefunden."); return null; } $invoice = $order->user_cancellation_invoice; if (! $invoice) { $this->error("Bestellung {$id} hat keine Stornorechnung."); return null; } } else { $invoice = UserInvoice::find((int) $id); if (! $invoice) { $this->error("Stornorechnung {$id} nicht gefunden."); return null; } } if (! $invoice->cancellation || $invoice->cancellation_id) { $this->error("Rechnung #{$invoice->id} ({$invoice->full_number}) ist keine Stornorechnung."); return null; } if (! $invoice->shopping_order) { $this->error("Stornorechnung #{$invoice->id} hat keine zugehörige Bestellung."); return null; } $invoices->push($invoice); } return $invoices; } }