From 53923bd6fc83b38011004d35b29c36b4a712da4f Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 28 Oct 2025 21:15:59 +0700 Subject: [PATCH] refactor(tier): menyesuaikan tampilan card nya, menambahkan beberapa counting data dan merubah relasi dari has one ke membership menjadi has many --- app/Livewire/Studio/Loyalty/Tier.php | 44 ++++++++++++++++--- app/Models/Tier.php | 8 ++-- .../livewire/studio/loyalty/tiers.blade.php | 41 ++++++++++++++++- 3 files changed, 80 insertions(+), 13 deletions(-) diff --git a/app/Livewire/Studio/Loyalty/Tier.php b/app/Livewire/Studio/Loyalty/Tier.php index 3c01c9f..2fd35dc 100644 --- a/app/Livewire/Studio/Loyalty/Tier.php +++ b/app/Livewire/Studio/Loyalty/Tier.php @@ -29,14 +29,42 @@ class Tier extends Component public function mount() { - $this->tiers = TierModel::orderBy('min_points', 'asc') + $this->tiers = TierModel::with(['memberships.user.customer.orders.orderItems', 'memberships.user.customer.orders.payments']) + ->withCount('memberships') + ->orderBy('min_points', 'asc') ->get() - ->map(fn ($tier) => [ - 'hash' => $tier->hash, - 'name' => $tier->name, - 'min_points' => currency($tier->min_points, ''), - 'max_points' => currency($tier->max_points, ''), - ]) + ->map(function ($tier) { + $topMembership = $tier->memberships() + ->with(['user.customer.orders.orderItems', 'user.customer.orders.payments']) + ->orderByDesc('total_points') + ->first(); + + $topMemberStats = null; + if ($topMembership && $topMembership->user && $topMembership->user->customer) { + $orders = $topMembership->user->customer->orders; + + $totalOrders = $orders->count(); + $totalItems = $orders->flatMap(fn ($order) => $order->orderItems)->sum('quantity'); + $totalAmount = $orders->flatMap(fn ($order) => $order->payments)->sum('amount'); + + $topMemberStats = [ + 'name' => $topMembership->user->customer->name, + 'points' => currency($topMembership->total_points), + 'total_orders' => currency($totalOrders), + 'total_items' => currency($totalItems), + 'total_amount' => currency($totalAmount), + ]; + } + + return [ + 'hash' => $tier->hash, + 'name' => $tier->name, + 'min_points' => currency($tier->min_points), + 'max_points' => currency($tier->max_points), + 'total_members' => currency($tier->memberships_count), + 'top_member' => $topMemberStats, + ]; + }) ->toArray(); } @@ -66,6 +94,8 @@ public function create() 'name' => $tier->name, 'min_points' => currency($tier->min_points, ''), 'max_points' => currency($tier->max_points, ''), + 'total_members' => 0, + 'top_member' => null, ]; usort($tiers, fn ($a, $b) => replaceCurrency($a['min_points']) <=> replaceCurrency($b['min_points'])); diff --git a/app/Models/Tier.php b/app/Models/Tier.php index cfceab7..7fa79b2 100644 --- a/app/Models/Tier.php +++ b/app/Models/Tier.php @@ -5,7 +5,7 @@ use Dyrynda\Database\Support\CascadeSoftDeletes; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; use Veelasky\LaravelHashId\Eloquent\HashableId; @@ -15,7 +15,7 @@ class Tier extends Model protected $guarded = ['id']; - protected $cascadeDeletes = ['membership']; + protected $cascadeDeletes = ['memberships']; protected function casts(): array { @@ -25,8 +25,8 @@ protected function casts(): array ]; } - public function membership(): HasOne + public function memberships(): HasMany { - return $this->hasOne(Membership::class); + return $this->hasMany(Membership::class); } } diff --git a/resources/views/livewire/studio/loyalty/tiers.blade.php b/resources/views/livewire/studio/loyalty/tiers.blade.php index 5fab82a..0f50dbd 100644 --- a/resources/views/livewire/studio/loyalty/tiers.blade.php +++ b/resources/views/livewire/studio/loyalty/tiers.blade.php @@ -25,7 +25,7 @@ class="hover:shadow-lg transition-shadow duration-200 bg-white dark:bg-gray-900 -
+
Min. Poin: {{ $tier['min_points'] }} @@ -34,9 +34,46 @@ class="hover:shadow-lg transition-shadow duration-200 bg-white dark:bg-gray-900 Maks. Poin: {{ $tier['max_points'] }}
+ + + +
+ Total Member: + {{ $tier['total_members'] }} +
+ + @if ($tier['top_member']) +
+ Member Dengan Poin + Tertinggi: + +
+ {{ $tier['top_member']['name'] }} + {{ $tier['top_member']['points'] }} Poin +
+ +
+

Statistik Order

+
+ Total Order: + {{ $tier['top_member']['total_orders'] }}x +
+
+ Total Item Yang Dibeli: + {{ $tier['top_member']['total_items'] }} +
+
+ Total Pembayaran: + {{ $tier['top_member']['total_amount'] }} +
+
+
+ @endif
-
+
@can('update tier')