Impment webcron and internal scheduling methods and change settings to a key value store

This commit is contained in:
2025-12-03 14:23:03 +01:00
parent e37a14993d
commit 53acdb40b7
12 changed files with 222 additions and 90 deletions
+53 -18
View File
@@ -7,21 +7,22 @@
use Inertia\Inertia;
use App\Models\Invoice;
use App\Models\LineItem;
use App\Models\Setting;
use App\Mail\Reminder;
use App\Support\ApiDataTransformer;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Barryvdh\DomPDF\Facade\Pdf;
use tbQuar\Facades\Quar;
use horstoeko\zugferdlaravel\Facades\ZugferdLaravel;
// use horstoeko\zugferd\codelists\ZugferdInvoiceType;
use horstoeko\zugferd\codelists\ZugferdUnitCodes;
use horstoeko\zugferd\codelists\ZugferdVatCategoryCodes;
use horstoeko\zugferd\codelists\ZugferdVatTypeCodes;
use horstoeko\zugferd\codelists\ZugferdDocumentType;
use App\Models\LineItem;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Support\ApiDataTransformer;
use DateTime;
use tbQuar\Facades\Quar;
use App\Mail\Reminder;
use Illuminate\Support\Facades\Mail;
class InvoiceController extends Controller
@@ -48,7 +49,7 @@ public function summaryAll()
public function summaryThisYear()
{
$dt = new DateTime('first day of january this year');
$dt = new DateTime('first day of january this year');
$invoices = Invoice::select()
->where('invoice_date', '>=', $dt->format('Y-m-d'))
->orderBy('invoice_date', 'asc')
@@ -62,7 +63,7 @@ public function summaryThisYear()
public function summaryBeforeThisYear()
{
$dt = new DateTime('first day of january this year');
$dt = new DateTime('first day of january this year');
$invoices = Invoice::select()
->where('invoice_date', '<', $dt->format('Y-m-d'))
->orderBy('invoice_date', 'asc')
@@ -691,19 +692,53 @@ public function remind(Request $request, int $id)
*/
protected function generateInvoiceNumber()
{
$settings = \App\Models\Setting::firstOrCreate([]);
$lastInvoice = Invoice::orderByRaw("CAST(SUBSTRING(nr, 4) AS UNSIGNED) DESC")
->first();
// Key/value Einstellungen
$format = Setting::where('key', 'invoice.number_format')->value('value') ?? 'RE-{number}';
$start = (int) (Setting::where('key', 'invoice.number_start')->value('value') ?? 1);
if ($lastInvoice) {
$lastNumber = (int) str_replace('RE-', '', $lastInvoice->nr);
$newNumber = $lastNumber + 1;
} else {
$newNumber = $settings->invoice_number_start;
// prefix / suffix aus dem Format ableiten (erwartet genau ein {number})
$parts = explode('{number}', $format);
$prefix = $parts[0] ?? '';
$suffix = $parts[1] ?? '';
// Query: nur Rechnungen mit Prefix (falls vorhanden) - reduziert Datensatz
$query = \App\Models\Invoice::query();
if ($prefix !== '') {
$query->where('nr', 'like', $prefix . '%');
}
// optional: further restrict by suffix if known
if ($suffix !== '') {
$query->where('nr', 'like', '%' . $suffix);
}
return str_replace('{number}', $newNumber, $settings->invoice_number_format);
// Hole die Nummern (nur Spalte 'nr') — bei großen Datenmengen ggf. limit/stream verwenden
$numbers = $query->pluck('nr')->toArray();
$max = 0;
foreach ($numbers as $nr) {
// Entferne Prefix/Suffix falls vorhanden
if ($prefix !== '' && str_starts_with($nr, $prefix)) {
$nrCore = substr($nr, strlen($prefix));
} else {
$nrCore = $nr;
}
if ($suffix !== '' && str_ends_with($nrCore, $suffix)) {
$nrCore = substr($nrCore, 0, -strlen($suffix));
}
// Extrahiere erste Ziffernfolge (handhabt auch führende Nullen)
if (preg_match('/\d+/', $nrCore, $m)) {
$val = intval($m[0]);
if ($val > $max) $max = $val;
}
}
$newNumber = $max > 0 ? $max + 1 : $start;
// Setze neue Nummer ins Format (bei Bedarf Padding hier ergänzen)
return str_replace('{number}', (string)$newNumber, $format);
}
/**
* Generate a GiroCode for the invoice