refactor(tier): menyesuaikan tampilan card nya, menambahkan beberapa counting data dan merubah relasi dari has one ke membership menjadi has many
This commit is contained in:
parent
f4a4a30d70
commit
53923bd6fc
@ -29,14 +29,42 @@ class Tier extends Component
|
|||||||
|
|
||||||
public function mount()
|
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()
|
->get()
|
||||||
->map(fn ($tier) => [
|
->map(function ($tier) {
|
||||||
'hash' => $tier->hash,
|
$topMembership = $tier->memberships()
|
||||||
'name' => $tier->name,
|
->with(['user.customer.orders.orderItems', 'user.customer.orders.payments'])
|
||||||
'min_points' => currency($tier->min_points, ''),
|
->orderByDesc('total_points')
|
||||||
'max_points' => currency($tier->max_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();
|
->toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,6 +94,8 @@ public function create()
|
|||||||
'name' => $tier->name,
|
'name' => $tier->name,
|
||||||
'min_points' => currency($tier->min_points, ''),
|
'min_points' => currency($tier->min_points, ''),
|
||||||
'max_points' => currency($tier->max_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']));
|
usort($tiers, fn ($a, $b) => replaceCurrency($a['min_points']) <=> replaceCurrency($b['min_points']));
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
use Dyrynda\Database\Support\CascadeSoftDeletes;
|
use Dyrynda\Database\Support\CascadeSoftDeletes;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
use Veelasky\LaravelHashId\Eloquent\HashableId;
|
use Veelasky\LaravelHashId\Eloquent\HashableId;
|
||||||
|
|
||||||
@ -15,7 +15,7 @@ class Tier extends Model
|
|||||||
|
|
||||||
protected $guarded = ['id'];
|
protected $guarded = ['id'];
|
||||||
|
|
||||||
protected $cascadeDeletes = ['membership'];
|
protected $cascadeDeletes = ['memberships'];
|
||||||
|
|
||||||
protected function casts(): array
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,7 @@ class="hover:shadow-lg transition-shadow duration-200 bg-white dark:bg-gray-900
|
|||||||
</flux:heading>
|
</flux:heading>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="space-y-1">
|
<div class="space-y-2">
|
||||||
<div class="flex justify-between text-sm">
|
<div class="flex justify-between text-sm">
|
||||||
<span class="text-gray-500 dark:text-gray-400">Min. Poin:</span>
|
<span class="text-gray-500 dark:text-gray-400">Min. Poin:</span>
|
||||||
<span class="font-medium">{{ $tier['min_points'] }}</span>
|
<span class="font-medium">{{ $tier['min_points'] }}</span>
|
||||||
@ -34,9 +34,46 @@ class="hover:shadow-lg transition-shadow duration-200 bg-white dark:bg-gray-900
|
|||||||
<span class="text-gray-500 dark:text-gray-400">Maks. Poin:</span>
|
<span class="text-gray-500 dark:text-gray-400">Maks. Poin:</span>
|
||||||
<span class="font-medium">{{ $tier['max_points'] }}</span>
|
<span class="font-medium">{{ $tier['max_points'] }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<flux:separator />
|
||||||
|
|
||||||
|
<div class="flex justify-between text-sm">
|
||||||
|
<span class="text-gray-500 dark:text-gray-400">Total Member:</span>
|
||||||
|
<span class="font-medium">{{ $tier['total_members'] }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if ($tier['top_member'])
|
||||||
|
<div class="text-sm">
|
||||||
|
<span class="text-gray-500 dark:text-gray-400 font-semibold">Member Dengan Poin
|
||||||
|
Tertinggi:</span>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="mt-1 flex items-center justify-between bg-gradient-to-r from-emerald-400 to-emerald-600 text-white rounded px-3 py-3 text-sm font-medium shadow-lg">
|
||||||
|
<span>{{ $tier['top_member']['name'] }}</span>
|
||||||
|
<span>{{ $tier['top_member']['points'] }} Poin</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
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>{{ $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>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between text-sm mt-1">
|
||||||
|
<span>Total Pembayaran:</span>
|
||||||
|
<span>{{ $tier['top_member']['total_amount'] }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex gap-2 pt-2 border-t border-gray-200 dark:border-gray-700">
|
<div class="flex gap-2 pt-2 border-gray-200 dark:border-gray-700">
|
||||||
@can('update tier')
|
@can('update tier')
|
||||||
<flux:modal.trigger name="form-modal">
|
<flux:modal.trigger name="form-modal">
|
||||||
<flux:tooltip content="Ubah">
|
<flux:tooltip content="Ubah">
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user