From 91397602ecdec2be8b1408d72e085f38710e5874 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 12 Nov 2025 20:41:33 +0700 Subject: [PATCH] feat(membership): membuat halaman membership untuk member --- app/Livewire/Member/Membership.php | 107 ++++++++++++++++++ .../partials/member/_sidebar.blade.php | 3 + .../livewire/member/memberships.blade.php | 91 +++++++++++++++ routes/pages/member.php | 2 + 4 files changed, 203 insertions(+) create mode 100644 app/Livewire/Member/Membership.php create mode 100644 resources/views/livewire/member/memberships.blade.php diff --git a/app/Livewire/Member/Membership.php b/app/Livewire/Member/Membership.php new file mode 100644 index 0000000..034e9fb --- /dev/null +++ b/app/Livewire/Member/Membership.php @@ -0,0 +1,107 @@ +where('user_id', auth()->id())->first(); + + $monthlyTierAddition = PointRecord::where('user_id', auth()->id()) + ->where('type', PointRecordType::TIER) + ->where('is_addition', true) + ->whereYear('created_at', now()->year) + ->whereMonth('created_at', now()->month) + ->sum('change'); + + $nextTier = Tier::where('min_points', '>', $membership->tier_points) + ->orderBy('min_points', 'asc') + ->first(); + + $this->nextTierName = $nextTier ? $nextTier->name : 'Maksimal'; + + $this->currentPoints = $membership->tier_points; + + $this->nextTierPoints = $nextTier ? $nextTier->min_points : 'Maksimal'; + + $this->progress = ($membership->tier_points / $nextTier->min_points) * 100; + + $this->stats = [ + [ + 'title' => 'Poin Tier', + 'value' => currency($membership->tier_points), + 'description' => '+'.currency($monthlyTierAddition).' bulan ini', + ], + [ + 'title' => 'Tier Sekarang', + 'value' => $membership->tier->name, + 'description' => 'Terdaftar sejak '.formatDate($membership->created_at), + ], + [ + 'title' => 'Tier Selanjutnya', + 'value' => $nextTier ? $nextTier->name : 'Maksimal', + 'description' => $nextTier ? ($nextTier->min_points - $membership->tier_points).' poin lagi' : 'Anda sudah berada di tier tertinggi', + ], + [ + 'title' => 'Poin Hadiah', + 'value' => currency($membership->reward_points), + 'description' => 'Nikmati hadiah sekarang', + ], + ]; + + $this->rewards = TierReward::where('tier_id', $membership->tier_id) + ->latest() + ->get() + ->map(fn ($reward) => [ + 'name' => $reward->name, + 'value' => currency($reward->value, 'Rp'), + ]) + ->toArray(); + + $this->pointRecords = PointRecord::where('user_id', auth()->id()) + ->latest() + ->limit(10) + ->get() + ->map(fn ($record) => [ + 'date' => formatDate($record->created_at), + 'description' => $record->description, + 'change' => currency($record->change), + 'type' => $record->type->label(), + 'is_addition' => $record->is_addition, + ]) + ->toArray(); + } + + public function render() + { + return view('livewire.member.memberships', [ + 'pageTitle' => 'Membership', + ]); + } +} diff --git a/resources/views/components/partials/member/_sidebar.blade.php b/resources/views/components/partials/member/_sidebar.blade.php index 63e5c4f..4e5a9f3 100644 --- a/resources/views/components/partials/member/_sidebar.blade.php +++ b/resources/views/components/partials/member/_sidebar.blade.php @@ -12,6 +12,9 @@ class="bg-zinc-50 dark:bg-zinc-900 border-r rtl:border-r-0 rtl:border-l border-z Voucher + + Membership diff --git a/resources/views/livewire/member/memberships.blade.php b/resources/views/livewire/member/memberships.blade.php new file mode 100644 index 0000000..7cad2cc --- /dev/null +++ b/resources/views/livewire/member/memberships.blade.php @@ -0,0 +1,91 @@ + + {{ $pageTitle }} + +
+
+ @foreach ($stats as $stat) +
+
+ {{ $stat['title'] }} +
+ {{ $stat['value'] }} + {{ $stat['description'] }} +
+ @endforeach +
+ +
+

Proses ke Tier {{ $nextTierName }}

+
+
+ Sekarang: {{ $currentPoints }} poin + Target: {{ $nextTierPoints }} +
+
+
+
+ {{ $progress }} % +
+
+ +
+
+ + Redeem Hadiah + + +
+ @foreach ($rewards as $reward) +
+
+
+

{{ $reward['name'] }}

+

Seharga {{ $reward['value'] }}

+ +
+
+
+ @endforeach +
+
+
+ +
+ + Riwayat Poin + + + + + Tanggal + Keterangan + Poin + Tipe + + + + @foreach ($pointRecords as $pointRecords) + + {{ $pointRecords['date'] }} + {{ $pointRecords['description'] }} + + + {{ $pointRecords['is_addition'] ? '+' : '-' }} + {{ $pointRecords['change'] }} + + + {{ $pointRecords['type'] }} + + @endforeach + + + +
+
+
+
diff --git a/routes/pages/member.php b/routes/pages/member.php index 4006222..d71cc32 100644 --- a/routes/pages/member.php +++ b/routes/pages/member.php @@ -1,5 +1,6 @@ group(function () { Route::get('overview', Overview::class)->name('overview'); Route::get('vouchers', Voucher::class)->name('voucher'); + Route::get('memberships', Membership::class)->name('membership'); });