113 lines
3.7 KiB
PHP
113 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
use Illuminate\View\View;
|
|
|
|
class ProfileController extends Controller
|
|
{
|
|
public function index(Request $request): View
|
|
{
|
|
$user = $request->user();
|
|
$penyewaans = $user->penyewaans()
|
|
->with(['kamera', 'lensa'])
|
|
->latest()
|
|
->get();
|
|
$adminNotifications = $user->penyewaans()
|
|
->with(['kamera', 'lensa'])
|
|
->whereNotNull('admin_catatan')
|
|
->latest('updated_at')
|
|
->get();
|
|
$unreadAdminNotificationIds = $adminNotifications
|
|
->whereNull('admin_catatan_read_at')
|
|
->pluck('id')
|
|
->all();
|
|
$loginHistories = $user->loginHistories()
|
|
->latest('login_at')
|
|
->take(20)
|
|
->get();
|
|
$paidTransactions = $penyewaans
|
|
->filter(fn ($penyewaan) => filled($penyewaan->bukti_pembayaran_path))
|
|
->count();
|
|
$nextMemberLevels = [
|
|
'tanpa_member' => 'bronze',
|
|
'bronze' => 'silver',
|
|
'silver' => 'gold',
|
|
'gold' => null,
|
|
];
|
|
$upgradeTargets = [
|
|
'tanpa_member' => 10,
|
|
'bronze' => 20,
|
|
'silver' => 30,
|
|
'gold' => null,
|
|
];
|
|
$progressStarts = [
|
|
'tanpa_member' => 0,
|
|
'bronze' => 10,
|
|
'silver' => 20,
|
|
'gold' => 30,
|
|
];
|
|
$nextMemberLevel = $nextMemberLevels[$user->member_level] ?? null;
|
|
$nextUpgradeTarget = $upgradeTargets[$user->member_level] ?? null;
|
|
$progressStart = $progressStarts[$user->member_level] ?? 0;
|
|
$remainingTransactions = $nextUpgradeTarget === null
|
|
? 0
|
|
: max($nextUpgradeTarget - $paidTransactions, 0);
|
|
$upgradeProgressPercent = $nextUpgradeTarget === null
|
|
? 100
|
|
: (int) round(
|
|
min(
|
|
max($paidTransactions - $progressStart, 0) / max($nextUpgradeTarget - $progressStart, 1),
|
|
1
|
|
) * 100
|
|
);
|
|
|
|
if ($unreadAdminNotificationIds !== []) {
|
|
$user->penyewaans()
|
|
->whereIn('id', $unreadAdminNotificationIds)
|
|
->update(['admin_catatan_read_at' => now()]);
|
|
}
|
|
|
|
return view('profile', [
|
|
'user' => $user,
|
|
'penyewaans' => $penyewaans,
|
|
'adminNotifications' => $adminNotifications,
|
|
'unreadAdminNotificationCount' => count($unreadAdminNotificationIds),
|
|
'loginHistories' => $loginHistories,
|
|
'totalPenyewaan' => $penyewaans->count(),
|
|
'totalLogin' => $user->loginHistories()->count(),
|
|
'penyewaanAktif' => $penyewaans->whereIn('status', ['menunggu', 'disetujui'])->count(),
|
|
'paidTransactions' => $paidTransactions,
|
|
'nextMemberLevel' => $nextMemberLevel,
|
|
'nextUpgradeTarget' => $nextUpgradeTarget,
|
|
'remainingTransactions' => $remainingTransactions,
|
|
'progressStart' => $progressStart,
|
|
'upgradeProgressPercent' => $upgradeProgressPercent,
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request): RedirectResponse
|
|
{
|
|
$user = $request->user();
|
|
|
|
$validated = $request->validate([
|
|
'name' => ['required', 'string', 'max:100'],
|
|
'username' => [
|
|
'required',
|
|
'string',
|
|
'max:50',
|
|
Rule::unique('users', 'username')->ignore($user->id),
|
|
],
|
|
]);
|
|
|
|
$user->update($validated);
|
|
|
|
return redirect()
|
|
->route('profile')
|
|
->with('status', 'Profil berhasil diperbarui.');
|
|
}
|
|
}
|