refactor(order): menambahkan beberapa counting data untuk top member

This commit is contained in:
Yoga Pangestu 2025-11-05 10:50:21 +07:00
parent a44eef2c7a
commit 09e63a9463
2 changed files with 46 additions and 11 deletions

View File

@ -3,6 +3,9 @@
namespace App\Livewire\Studio\Loyalty; namespace App\Livewire\Studio\Loyalty;
use App\Livewire\Forms\Studio\Loyalty\TierForm; use App\Livewire\Forms\Studio\Loyalty\TierForm;
use App\Models\Bottle;
use App\Models\Perfume;
use App\Models\Product;
use App\Models\Tier as TierModel; use App\Models\Tier as TierModel;
use App\Traits\WithAuthorization; use App\Traits\WithAuthorization;
use App\Traits\WithCloseModal; use App\Traits\WithCloseModal;
@ -29,13 +32,13 @@ class Tier extends Component
public function mount() public function mount()
{ {
$this->tiers = TierModel::with(['memberships.user.customer.orders.items', 'memberships.user.customer.orders.payments']) $this->tiers = TierModel::with(['memberships.user.customer.orders.items'])
->withCount('memberships') ->withCount('memberships')
->orderBy('min_points', 'asc') ->orderBy('min_points', 'asc')
->get() ->get()
->map(function ($tier) { ->map(function ($tier) {
$topMembership = $tier->memberships() $topMembership = $tier->memberships()
->with(['user.customer.orders.items', 'user.customer.orders.payments']) ->with(['user.customer.orders.items'])
->orderByDesc('tier_points') ->orderByDesc('tier_points')
->first(); ->first();
@ -44,15 +47,31 @@ public function mount()
$orders = $topMembership->user->customer->orders; $orders = $topMembership->user->customer->orders;
$totalOrders = $orders->count(); $totalOrders = $orders->count();
$totalItems = $orders->flatMap(fn ($order) => $order->items)->sum('quantity');
$totalAmount = $orders->flatMap(fn ($order) => $order->payments)->sum('amount'); // Sum items
$totalPerfume = $orders->flatMap(fn ($order) => $order->items->where('orderable_type', Perfume::class))->sum('quantity');
$totalProduct = $orders->flatMap(fn ($order) => $order->items->where('orderable_type', Product::class))->sum('quantity');
$totalBottle = $orders->flatMap(fn ($order) => $order->items->where('orderable_type', Bottle::class))->sum('quantity');
// Sum total
$subtotal = $orders->sum('subtotal');
$totalDiscount = $orders->sum('discount');
$grandTotal = $orders->sum('total');
$topMemberStats = [ $topMemberStats = [
'name' => $topMembership->user->customer->name, 'name' => $topMembership->user->customer->name,
'points' => currency($topMembership->tier_points), 'points' => currency($topMembership->tier_points),
'total_orders' => currency($totalOrders), 'total_orders' => currency($totalOrders),
'total_items' => currency($totalItems), 'items' => [
'total_amount' => currency($totalAmount), 'total_perfume' => currency($totalPerfume),
'total_product' => currency($totalProduct),
'total_bottle' => currency($totalBottle),
],
'total' => [
'subtotal' => currency($subtotal, 'Rp'),
'discount' => currency($totalDiscount, 'Rp'),
'grand_total' => currency($grandTotal, 'Rp'),
],
]; ];
} }

View File

@ -57,16 +57,32 @@ class="mt-1 flex items-center justify-between bg-gradient-to-r from-emerald-400
class="mt-2 bg-white dark:bg-gray-800 rounded-lg shadow p-4 text-gray-700 dark:text-gray-300"> class="mt-2 bg-white dark:bg-gray-800 rounded-lg shadow p-4 text-gray-700 dark:text-gray-300">
<h4 class="font-semibold mb-2">Statistik Order</h4> <h4 class="font-semibold mb-2">Statistik Order</h4>
<div class="flex justify-between text-sm"> <div class="flex justify-between text-sm">
<span>Total Order:</span> <span>Order:</span>
<span>{{ $tier['top_member']['total_orders'] }}x</span> <span>{{ $tier['top_member']['total_orders'] }}x</span>
</div> </div>
<div class="flex justify-between text-sm mt-1"> <div class="flex justify-between text-sm mt-1">
<span>Total Item Yang Dibeli:</span> <span>Parfum Yang Dibeli:</span>
<span>{{ $tier['top_member']['total_items'] }}</span> <span>{{ $tier['top_member']['items']['total_perfume'] }} ml</span>
</div> </div>
<div class="flex justify-between text-sm mt-1"> <div class="flex justify-between text-sm mt-1">
<span>Total Pembayaran:</span> <span>Produk Yang Dibeli:</span>
<span>{{ $tier['top_member']['total_amount'] }}</span> <span>{{ $tier['top_member']['items']['total_product'] }} pcs</span>
</div>
<div class="flex justify-between text-sm mt-1">
<span>Botol Yang Dibeli:</span>
<span>{{ $tier['top_member']['items']['total_bottle'] }} pcs</span>
</div>
<div class="flex justify-between text-sm mt-1">
<span>Subtotal Belanja:</span>
<span>{{ $tier['top_member']['total']['subtotal'] }}</span>
</div>
<div class="flex justify-between text-sm mt-1">
<span>Diskon:</span>
<span>{{ $tier['top_member']['total']['discount'] }}</span>
</div>
<div class="flex justify-between text-sm mt-1">
<span>Total Belanja:</span>
<span>{{ $tier['top_member']['total']['grand_total'] }}</span>
</div> </div>
</div> </div>
</div> </div>