Admin-Abos: Filterleiste und Textsuche nach PayOne-ID

Neue serverseitige, pro Admin persistente Filter auf /admin/abos:
- Status (echte Abo-Status aus UserAbo::$statusTypes, nur vorhandene Werte)
- Aktiv / Inaktiv
- Ist fuer (Berater/Kunde, is_for me/ot)
- Zahlung (Kreditkarte/PayPal ueber clearingtype cc/wlt)
- Startdatum (Monat + Jahr, optisch gruppiert; whereMonth/whereYear)
- Naechste Ausfuehrung (feste Liefertage 5/10/20/25 ueber abo_interval)
- Berater-Zuordnung (Member-Dropdown, Proportionen wie /admin/business/points)
- Reset-Button (korrigiert: bleibt auf admin_abos, Label ausserhalb des Buttons)

Layout in zwei Zeilen, damit nichts zusammengequetscht wird.

Textsuche der Tabelle: payone_userid via filterColumn suchbar gemacht
(addColumn-Spalten schliesst Yajra sonst von der globalen Suche aus).

Lang-Keys tables.month/year/all/inactive (de/en) ergaenzt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-06-12 09:54:50 +00:00
parent 4709dfde55
commit 6720d99e08
4 changed files with 167 additions and 39 deletions

View file

@ -25,24 +25,64 @@ class AboController extends Controller
public function index()
{
if (Request::get('reset') === 'filter') {
set_user_attr('filter_user_shop_id', null);
set_user_attr('filter_status', null);
set_user_attr('filter_member_id', null);
foreach (['filter_member_id', 'filter_status', 'filter_active', 'filter_is_for', 'filter_payment', 'filter_start_month', 'filter_start_year', 'filter_next_day'] as $attr) {
set_user_attr($attr, null);
}
return redirect(route('admin_sales_customers'));
return redirect(route('admin_abos'));
}
// $filter_user_shops = UserAbo::join('user_shops', 'user_shop_id', '=', 'user_shops.id')->orderBy('slug')->get()->pluck('slug', 'id')->unique()->toArray();
$filter_members = UserAbo::join('users', 'user_id', '=', 'users.id')->groupBy('user_id')->join('user_accounts', 'account_id', '=', 'user_accounts.id')->select('users.id', 'users.email', 'user_accounts.first_name', 'user_accounts.last_name')->get();
$data = [
// 'filter_user_shops' => $filter_user_shops,
'filter_members' => $filter_members,
'filter_statuses' => $this->getStatusFilterOptions(),
'filter_months' => $this->getMonthFilterOptions(),
'filter_years' => $this->getStartYearFilterOptions(),
'filter_next_days' => UserAbo::$aboDeliveryDays,
];
return view('admin.abo.index', $data);
}
/**
* @return array<int, string>
*/
private function getStatusFilterOptions(): array
{
return UserAbo::query()
->select('status')
->distinct()
->orderBy('status')
->pluck('status')
->mapWithKeys(fn ($status) => [$status => __('abo.'.(UserAbo::$statusTypes[$status] ?? $status))])
->toArray();
}
/**
* @return array<int, string>
*/
private function getMonthFilterOptions(): array
{
$months = [];
for ($month = 1; $month <= 12; $month++) {
$months[$month] = \Carbon\Carbon::create(null, $month, 1)->locale(app()->getLocale())->translatedFormat('F');
}
return $months;
}
/**
* @return array<int, int>
*/
private function getStartYearFilterOptions(): array
{
$minStart = UserAbo::whereNotNull('start_date')->min('start_date');
$fromYear = $minStart ? (int) substr($minStart, 0, 4) : (int) date('Y');
return range((int) date('Y'), $fromYear);
}
public function detail($id)
{
$data = Request::all();
@ -139,6 +179,36 @@ class AboController extends Controller
$query->where('status', '=', Request::get('filter_status'));
}
set_user_attr('filter_active', Request::get('filter_active'));
if (Request::get('filter_active') != '') {
$query->where('active', '=', (int) Request::get('filter_active'));
}
set_user_attr('filter_is_for', Request::get('filter_is_for'));
if (Request::get('filter_is_for') != '') {
$query->where('is_for', '=', Request::get('filter_is_for'));
}
set_user_attr('filter_payment', Request::get('filter_payment'));
if (Request::get('filter_payment') != '') {
$query->where('clearingtype', '=', Request::get('filter_payment'));
}
set_user_attr('filter_start_month', Request::get('filter_start_month'));
if (Request::get('filter_start_month') != '') {
$query->whereMonth('start_date', (int) Request::get('filter_start_month'));
}
set_user_attr('filter_start_year', Request::get('filter_start_year'));
if (Request::get('filter_start_year') != '') {
$query->whereYear('start_date', (int) Request::get('filter_start_year'));
}
set_user_attr('filter_next_day', Request::get('filter_next_day'));
if (Request::get('filter_next_day') != '') {
$query->where('abo_interval', '=', (int) Request::get('filter_next_day'));
}
return \DataTables::eloquent($query)
->addColumn('id', function (UserAbo $user_abo) {
return '<a href="'.route('admin_abos_detail', [$user_abo->id]).'" class="btn icon-btn btn-sm btn-primary"><span class="fa fa-edit"></span></a>';
@ -179,6 +249,11 @@ class AboController extends Controller
->addColumn('payone_userid', function (UserAbo $user_abo) {
return $user_abo->payone_userid;
})
->filterColumn('payone_userid', function ($query, $keyword) {
if ($keyword != '') {
$query->whereRaw('user_abos.payone_userid LIKE ?', ['%'.$keyword.'%']);
}
})
->orderColumn('id', 'id $1')
->orderColumn('start_date', 'start_date $1')