303 lines
13 KiB
PHP
303 lines
13 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\UserCredit;
|
|
use App\Models\UserCreditItem;
|
|
use App\Repositories\CreditRepository;
|
|
use App\Services\Credit;
|
|
use App\Services\HTMLHelper;
|
|
use App\Services\Payment;
|
|
use App\Services\Util;
|
|
use App\User;
|
|
use Carbon;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Request;
|
|
|
|
class PaymentCreditController extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware('admin');
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
$this->setFilterVars();
|
|
$data = [
|
|
'filter_months' => HTMLHelper::getTransMonths(),
|
|
'filter_years' => HTMLHelper::getYearRange(2022),
|
|
'user_credit_items' => $this->makeUserCreditItems(),
|
|
];
|
|
|
|
return view('admin.payment.credit', $data);
|
|
}
|
|
|
|
public function store()
|
|
{
|
|
$data = Request::all();
|
|
if (isset($data['action']) && $data['action'] === 'add-user-credit') {
|
|
if (! isset($data['member_id']) || ! $user = User::find($data['member_id'])) {
|
|
\Session()->flash('alert-error', 'Vertriebspartner nicht gefunden');
|
|
|
|
return back();
|
|
}
|
|
if (! isset($data['credit'])) {
|
|
\Session()->flash('alert-error', 'Bitte Betrag eingeben');
|
|
|
|
return back();
|
|
}
|
|
if (! isset($data['message'])) {
|
|
\Session()->flash('alert-error', 'Bitte Betreff eingeben');
|
|
|
|
return back();
|
|
}
|
|
|
|
$credit = Util::reFormatNumber($data['credit']);
|
|
$credit = number_format($credit, 2, '.', '');
|
|
Payment::addUserCreditMargin($user, $credit, 3, $data['message']);
|
|
\Session()->flash('alert-success', 'Guthaben hinzugefügt');
|
|
}
|
|
|
|
return redirect(route('admin_payments_credit'));
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$data = Request::all();
|
|
if (isset($data['action'])) {
|
|
if ($data['action'] === 'create_credit') {
|
|
if (! isset($data['userid'])) {
|
|
abort(404);
|
|
}
|
|
$user = User::findOrFail($data['userid']);
|
|
$credit_repo = new CreditRepository($user);
|
|
$credit_repo->create($data);
|
|
\Session()->flash('alert-success', 'Gutschrift erstellt');
|
|
|
|
return redirect($data['back']);
|
|
}
|
|
if ($data['action'] === 'user-credit-status') {
|
|
$UserCredit = UserCredit::findOrFail($data['id']);
|
|
$UserCredit->status = $data['status'];
|
|
$UserCredit->save();
|
|
\Session()->flash('alert-success', 'Status gespeichert');
|
|
|
|
return back();
|
|
}
|
|
}
|
|
}
|
|
|
|
private function setFilterVars()
|
|
{
|
|
if (! session('credit_filter_month')) {
|
|
session(['credit_filter_month' => intval(date('m'))]);
|
|
}
|
|
if (! session('credit_filter_year')) {
|
|
session(['credit_filter_year' => intval(date('Y'))]);
|
|
}
|
|
if (Request::get('credit_filter_name')) {
|
|
session(['credit_filter_name' => Request::get('credit_filter_name')]);
|
|
} else {
|
|
session(['credit_filter_name' => '']);
|
|
}
|
|
if (Request::get('credit_filter_month')) {
|
|
session(['credit_filter_month' => Request::get('credit_filter_month')]);
|
|
}
|
|
if (Request::get('credit_filter_year')) {
|
|
session(['credit_filter_year' => Request::get('credit_filter_year')]);
|
|
}
|
|
}
|
|
|
|
private function makeUserCreditItems()
|
|
{
|
|
$ret = [];
|
|
$UserCreditItems = UserCreditItem::wherePaid(false)->get();
|
|
foreach ($UserCreditItems as $userCreditItem) {
|
|
if (isset($ret[$userCreditItem->user_id])) {
|
|
$ret[$userCreditItem->user_id]['sum'] += $userCreditItem->credit;
|
|
$ret[$userCreditItem->user_id]['entries'][$userCreditItem->id] = $userCreditItem;
|
|
} else {
|
|
if (! isset($userCreditItem->user)) {
|
|
/* gelöschte User nicht anzeigen
|
|
$user = User::withTrashed()->with(['account' => fn($q) => $q->withTrashed()])->where('id', $userCreditItem->user_id)->first();
|
|
$ret[$userCreditItem->user_id] = [
|
|
'user_id' => $userCreditItem->user_id,
|
|
'm_account' => $user ? $user->account->m_account : "gelöscht",
|
|
'first_name' => $user ? $user->account->first_name : "gelöscht",
|
|
'last_name' => $user ? $user->account->last_name : "gelöscht",
|
|
'email' => $user ? $user->email : "gelöscht",
|
|
'sum' => $userCreditItem->credit,
|
|
'entries' => [$userCreditItem->id => $userCreditItem],
|
|
];
|
|
*/
|
|
} else {
|
|
$ret[$userCreditItem->user_id] = [
|
|
'user_id' => $userCreditItem->user_id,
|
|
'm_account' => $userCreditItem->user->account->m_account,
|
|
'first_name' => $userCreditItem->user->account->first_name,
|
|
'last_name' => $userCreditItem->user->account->last_name,
|
|
'email' => $userCreditItem->user->email,
|
|
'sum' => $userCreditItem->credit,
|
|
'entries' => [$userCreditItem->id => $userCreditItem],
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
public function delete($id, $del)
|
|
{
|
|
|
|
if ($del === 'user_credit_item') {
|
|
$UserCreditItem = UserCreditItem::findOrFail($id);
|
|
if ($deleteTime = $UserCreditItem->deleteTime()) {
|
|
$UserCreditItem->delete();
|
|
\Session()->flash('alert-success', 'Guthaben ist gelöscht');
|
|
} else {
|
|
\Session()->flash('alert-error', 'Guthaben kann nicht gelöscht werden');
|
|
}
|
|
}
|
|
|
|
return redirect(route('admin_payments_credit'));
|
|
}
|
|
|
|
private function initSearch($archive = false, $request = true)
|
|
{
|
|
|
|
$this->setFilterVars();
|
|
|
|
$date_start = Carbon::parse('01.'.Request::get('credit_filter_month').'.'.Request::get('credit_filter_year'))->format('Y-m-d');
|
|
$date_end = Carbon::parse('01.'.Request::get('credit_filter_month').'.'.Request::get('credit_filter_year'))->endOfMonth()->format('Y-m-d');
|
|
$query = UserCredit::with('user', 'user.account')->select('user_credits.*')
|
|
->whereBetween('date', [$date_start, $date_end]);
|
|
|
|
if (Request::get('credit_filter_name')) {
|
|
$query->whereHas('user.account', function ($query) {
|
|
return $query->where('first_name', 'LIKE', '%'.Request::get('credit_filter_name').'%')
|
|
->orWhere('last_name', 'LIKE', '%'.Request::get('credit_filter_name').'%');
|
|
});
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
public function stats(): JsonResponse
|
|
{
|
|
$this->setFilterVars();
|
|
|
|
$month = Request::get('credit_filter_month', session('credit_filter_month'));
|
|
$year = Request::get('credit_filter_year', session('credit_filter_year'));
|
|
$name = Request::get('credit_filter_name', '');
|
|
|
|
$dateStart = Carbon::parse('01.'.$month.'.'.$year)->format('Y-m-d');
|
|
$dateEnd = Carbon::parse('01.'.$month.'.'.$year)->endOfMonth()->format('Y-m-d');
|
|
|
|
$baseQuery = UserCredit::query()
|
|
->whereBetween('date', [$dateStart, $dateEnd]);
|
|
|
|
if ($name) {
|
|
$baseQuery->whereHas('user.account', function ($query) use ($name) {
|
|
$query->where('first_name', 'LIKE', '%'.$name.'%')
|
|
->orWhere('last_name', 'LIKE', '%'.$name.'%');
|
|
});
|
|
}
|
|
|
|
$count = (clone $baseQuery)->count();
|
|
$total = (clone $baseQuery)->sum('total');
|
|
|
|
return response()->json([
|
|
'count' => $count,
|
|
'total' => number_format((float) $total, 2, ',', '.'),
|
|
]);
|
|
}
|
|
|
|
public function datatable()
|
|
{
|
|
|
|
$query = $this->initSearch();
|
|
|
|
return \DataTables::eloquent($query)
|
|
|
|
->addColumn('user.account.first_name', function (UserCredit $UserCredit) {
|
|
return isset($UserCredit->user->account) ? $UserCredit->user->account->first_name : 'gelöscht';
|
|
})
|
|
->addColumn('user.account.last_name', function (UserCredit $UserCredit) {
|
|
return isset($UserCredit->user->account) ? $UserCredit->user->account->last_name : 'gelöscht';
|
|
})
|
|
->addColumn('user.email', function (UserCredit $UserCredit) {
|
|
return isset($UserCredit->user) ? $UserCredit->user->email : 'gelöscht';
|
|
})
|
|
->addColumn('view', function (UserCredit $UserCredit) {
|
|
$ret = '';
|
|
if ($UserCredit->isCredit()) {
|
|
// Deutsches Original (ausgefüllter Button)
|
|
$ret .= '<a href="'.route('storage_file', [$UserCredit->id, 'credit', 'download']).'" class="btn btn-primary btn-xs mb-2 mr-1" title="Gutschrift DE"><i class="fa fa-download"></i></a> ';
|
|
$ret .= '<a href="'.route('storage_file', [$UserCredit->id, 'credit', 'stream']).'" target="_blank" class="btn btn-warning btn-xs mb-2 mr-1" title="Vorschau DE"><i class="fa fa-eye"></i></a>';
|
|
|
|
// Lokalisierte Versionen (outline Buttons)
|
|
$availableLocales = $UserCredit->getAvailableLocales();
|
|
foreach ($availableLocales as $locale) {
|
|
$ret .= ' <a href="'.route('storage_file', [$UserCredit->id, 'credit', 'download', $locale]).'" class="btn btn-outline-primary btn-xs mb-2 mr-1" title="Gutschrift '.strtoupper($locale).'"><i class="fa fa-download"></i> '.strtoupper($locale).'</a>';
|
|
$ret .= ' <a href="'.route('storage_file', [$UserCredit->id, 'credit', 'stream', $locale]).'" class="btn btn-outline-warning btn-xs mb-2 mr-1" title="Gutschrift '.strtoupper($locale).'"><i class="fa fa-eye"></i> '.strtoupper($locale).'</a>';
|
|
}
|
|
$ret .= '<br>';
|
|
|
|
$ret .= '<a href="'.route('storage_file', [$UserCredit->id, 'credit_detail', 'html']).'" target="_blank" class="btn btn-secondary btn-xs mb-2 mr-1"><i class="fa fa-eye"></i></a> ';
|
|
$ret .= '<a href="'.route('storage_file', [$UserCredit->id, 'credit_detail', 'pdf']).'" target="_blank" class="btn btn-secondary btn-xs mb-2 mr-1"><i class="fa fa-file-pdf" style="min-width:13.5px"></i></a> ';
|
|
} else {
|
|
$ret = '-';
|
|
}
|
|
|
|
return $ret;
|
|
})
|
|
|
|
->addColumn('total', function (UserCredit $UserCredit) {
|
|
return '<span class="no-line-break">'.$UserCredit->getFormattedTotal().' €</span>';
|
|
})
|
|
->addColumn('credits', function (UserCredit $UserCredit) {
|
|
$ret = '';
|
|
if ($UserCredit->user_credit_items) {
|
|
foreach ($UserCredit->user_credit_items as $user_credit_item) {
|
|
$ret .= nl2br($user_credit_item->getTransMessage()).' / '.$user_credit_item->created_at->format('d.m.Y').'<br>';
|
|
}
|
|
}
|
|
|
|
return $ret;
|
|
})
|
|
->addColumn('status', function (UserCredit $UserCredit) {
|
|
return '<a href="#" data-toggle="modal" data-target="#modals-load-content" data-modal="modal-lg"
|
|
data-id="'.$UserCredit->id.'" data-route="'.route('modal_load').'" data-action="user-credit-status" data-view="">
|
|
<span class="badge badge-pill badge-'.$UserCredit->getStatusColor().'">'.$UserCredit->getStatusType().' <span class="ion ion-md-cash"></span></span>
|
|
</a>';
|
|
})
|
|
->filterColumn('user.account.first_name', function ($query, $keyword) {
|
|
if ($keyword != '') {
|
|
$query->whereHas('user.account', function ($query) use ($keyword) {
|
|
return $query->where('first_name', 'LIKE', '%'.$keyword.'%');
|
|
});
|
|
}
|
|
})
|
|
->filterColumn('user.account.last_name', function ($query, $keyword) {
|
|
if ($keyword != '') {
|
|
$query->whereHas('user.account', function ($query) use ($keyword) {
|
|
return $query->where('last_name', 'LIKE', '%'.$keyword.'%');
|
|
});
|
|
}
|
|
})
|
|
->filterColumn('user.email', function ($query, $keyword) {
|
|
if ($keyword != '') {
|
|
$query->whereHas('user', function ($query) use ($keyword) {
|
|
return $query->where('email', 'LIKE', '%'.$keyword.'%');
|
|
});
|
|
}
|
|
})
|
|
->orderColumn('id', 'id $1')
|
|
->orderColumn('status', 'status $1')
|
|
->orderColumn('total', 'total $1')
|
|
->rawColumns(['total', 'credits', 'status', 'view'])
|
|
->make(true);
|
|
}
|
|
}
|