Impment webcron and internal scheduling methods and change settings to a key value store
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user