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;
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\Traits\WithAuthorization;
use App\Traits\WithCloseModal;
@ -29,13 +32,13 @@ class Tier extends Component
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')
->orderBy('min_points', 'asc')
->get()
->map(function ($tier) {
$topMembership = $tier->memberships()
->with(['user.customer.orders.items', 'user.customer.orders.payments'])
->with(['user.customer.orders.items'])
->orderByDesc('tier_points')
->first();
@ -44,15 +47,31 @@ public function mount()
$orders = $topMembership->user->customer->orders;
$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 = [
'name' => $topMembership->user->customer->name,
'points' => currency($topMembership->tier_points),
'total_orders' => currency($totalOrders),
'total_items' => currency($totalItems),
'total_amount' => currency($totalAmount),
'items' => [
'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">
<h4 class="font-semibold mb-2">Statistik Order</h4>
<div class="flex justify-between text-sm">
<span>Total Order:</span>
<span>Order:</span>
<span>{{ $tier['top_member']['total_orders'] }}x</span>
</div>
<div class="flex justify-between text-sm mt-1">
<span>Total Item Yang Dibeli:</span>
<span>{{ $tier['top_member']['total_items'] }}</span>
<span>Parfum Yang Dibeli:</span>
<span>{{ $tier['top_member']['items']['total_perfume'] }} ml</span>
</div>
<div class="flex justify-between text-sm mt-1">
<span>Total Pembayaran:</span>
<span>{{ $tier['top_member']['total_amount'] }}</span>
<span>Produk Yang Dibeli:</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>