From 48f3a53343aa008dcf4e4dc958b6dbc94ceec541 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sat, 21 Dec 2024 14:59:11 +0700 Subject: [PATCH] feat(analitik) : membuat fitur analitik untuk barber --- .../Admin/Dashboard/AnalyticController.php | 129 +++++++- .../assets/admin/js/chart/income-by-barber.js | 1 + public/assets/admin/js/filter.js | 48 ++- .../pages/admin/dashboard/analytic.blade.php | 290 +++++++++++------- .../admin/_customer-by-total.blade.php | 8 + .../views/partials/admin/_sidebar.blade.php | 4 +- routes/web.php | 7 +- 7 files changed, 350 insertions(+), 137 deletions(-) create mode 100644 resources/views/partials/admin/_customer-by-total.blade.php diff --git a/app/Http/Controllers/Admin/Dashboard/AnalyticController.php b/app/Http/Controllers/Admin/Dashboard/AnalyticController.php index b44f5d0..d331c5f 100644 --- a/app/Http/Controllers/Admin/Dashboard/AnalyticController.php +++ b/app/Http/Controllers/Admin/Dashboard/AnalyticController.php @@ -24,14 +24,28 @@ public function index(): View $totalPayroll = Payroll::query()->barbershop()->sum('total'); $totalShaving = Transaction::query()->barbershop()->count(); - $topService = Service::query()->barbershop()->withCount('transactions')->get(); - - $paymentMethod = Transaction::select('payment_method', DB::raw('SUM(total) as total_amount')) + $topService = Service::query() ->barbershop() - ->groupBy('payment_method') + ->withCount(['transactions' => function ($query) { + $query->when(auth()->user()->role_id === 5, function ($query) { + $query->where('user_id', auth()->id()); + }); + }]) + ->when(auth()->user()->role_id === 5, function ($query) { + $query->whereHas('transactions', function ($query) { + $query->where('user_id', auth()->id()); + }); + }) ->get(); - $incomeByBarber = User::with('biography')->barbershop()->barber()->withSum('transactions', 'total')->get(); + $paymentMethod = Transaction::query() + ->select('payment_method', DB::raw('SUM(total) as total_amount')) + ->barbershop() + ->when(auth()->user()->role_id === 5, function ($query) { + $query->where('user_id', auth()->id()); + }) + ->groupBy('payment_method') + ->get(); $transactionByBarber = User::with('biography')->barbershop()->barber()->withCount('transactions')->get(); @@ -47,6 +61,43 @@ public function index(): View $totalUser = User::query()->barbershop()->count(); $totalBarber = User::query()->barbershop()->barber()->count(); + $topCustomersByTotal = Transaction::groupBy('customer_id') + ->select( + 'customer_id', + DB::raw('SUM(total) as total_transaction'), + DB::raw('COUNT(*) as transaction_count') + ) + ->orderBy('total_transaction', 'desc') + ->when(auth()->user()->role_id === 5, function ($query) { + return $query->where('user_id', auth()->id()); + }) + ->limit(5) + ->get(); + + $incomeByBarber = User::with('biography') + ->barbershop() + ->barber() + ->withSum(['transactions' => function ($query) { + $query->when(auth()->user()->role_id === 5, function ($query) { + return $query->where('user_id', auth()->id()); + }); + }], 'total') + ->orderBy('transactions_sum_total', 'desc') + ->withCount(['transactions' => function ($query) { + $query->when(auth()->user()->role_id === 5, function ($query) { + return $query->where('user_id', auth()->id()); + }); + }]); + if (in_array(auth()->user()->role_id, [1, 2, 3])) { + $incomeByBarber = $incomeByBarber->get(); + } elseif (auth()->user()->role_id === 5) { + $incomeByBarber = $incomeByBarber->find(auth()->id()); + $incomeByBarber = (object) [ + 'transactions_sum_total' => formatToRupiah($incomeByBarber->transactions_sum_total), + 'transactions_count' => $incomeByBarber->transactions_count, + ]; + } + return view('pages.admin.dashboard.analytic', [ 'pageTitle' => 'Analitik', 'totalIncome' => $totalIncome, @@ -60,6 +111,7 @@ public function index(): View 'topBarber' => $topBarber, 'totalUser' => $totalUser, 'totalBarber' => $totalBarber, + 'topCustomersByTotal' => $topCustomersByTotal, ]); } @@ -106,8 +158,20 @@ public function filter(Request $request): JsonResponse $query->whereBetween('created_at', [ Carbon::parse($startDate)->startOfDay(), Carbon::parse($endDate)->endOfDay(), - ]); + ]) + ->when(auth()->user()->role_id === 5, function ($query) { + $query->where('user_id', auth()->id()); + }); }]) + ->when(auth()->user()->role_id === 5, function ($query) { + $query->whereHas('transactions', function ($query) { + $query->where('user_id', auth()->id()); + }); + }) + ->whereBetween('created_at', [ + Carbon::parse($startDate)->startOfDay(), + Carbon::parse($endDate)->endOfDay(), + ]) ->get(); $paymentMethod = Transaction::select('payment_method', DB::raw('SUM(total) as total_amount')) @@ -116,6 +180,9 @@ public function filter(Request $request): JsonResponse Carbon::parse($startDate)->startOfDay(), Carbon::parse($endDate)->endOfDay(), ]) + ->when(auth()->user()->role_id === 5, function ($query) { + return $query->where('user_id', auth()->id()); + }) ->groupBy('payment_method') ->get(); @@ -177,6 +244,55 @@ public function filter(Request $request): JsonResponse ->barber() ->count(); + $topCustomersByTotal = Transaction::groupBy('customer_id') + ->select( + 'customer_id', + DB::raw('SUM(total) as total_transaction'), + DB::raw('COUNT(*) as transaction_count') + ) + ->whereBetween('created_at', [ + Carbon::parse($startDate)->startOfDay(), + Carbon::parse($endDate)->endOfDay(), + ]) + ->orderBy('total_transaction', 'desc') + ->when(auth()->user()->role_id === 5, function ($query) { + return $query->where('user_id', auth()->id()); + }) + ->limit(5) + ->get(); + + $renderCustomerByTotal = view('partials.admin._customer-by-total', compact('topCustomersByTotal'))->render(); + + $incomeByBarber = User::with('biography') + ->barbershop() + ->barber() + ->withSum(['transactions' => function ($query) use ($startDate, $endDate) { + $query->whereBetween('created_at', [ + Carbon::parse($startDate)->startOfDay(), + Carbon::parse($endDate)->endOfDay(), + ])->when(auth()->user()->role_id === 5, function ($query) { + $query->where('user_id', auth()->id()); + }); + }], 'total') + ->orderBy('transactions_sum_total', 'desc') + ->withCount(['transactions' => function ($query) use ($startDate, $endDate) { + $query->whereBetween('created_at', [ + Carbon::parse($startDate)->startOfDay(), + Carbon::parse($endDate)->endOfDay(), + ])->when(auth()->user()->role_id === 5, function ($query) { + $query->where('user_id', auth()->id()); + }); + }]); + if (in_array(auth()->user()->role_id, [1, 2, 3])) { + $incomeByBarber = $incomeByBarber->get(); + } elseif (auth()->user()->role_id === 5) { + $incomeByBarber = $incomeByBarber->find(auth()->id()); + $incomeByBarber = [ + 'transactions_sum_total' => formatToRupiah($incomeByBarber->transactions_sum_total ?? 0), + 'transactions_count' => $incomeByBarber->transactions_count, + ]; + } + return response()->json([ 'status' => true, 'message' => 'Data Successfully Retrieved', @@ -194,6 +310,7 @@ public function filter(Request $request): JsonResponse 'topBarber' => $topBarber, 'totalUser' => $totalUser, 'totalBarber' => $totalBarber, + 'renderCustomerByTotal' => $renderCustomerByTotal, ], ], 200); } diff --git a/public/assets/admin/js/chart/income-by-barber.js b/public/assets/admin/js/chart/income-by-barber.js index 24ddb0c..6a21299 100644 --- a/public/assets/admin/js/chart/income-by-barber.js +++ b/public/assets/admin/js/chart/income-by-barber.js @@ -3,6 +3,7 @@ let incomeByBarberCtx = document.getElementById('incomeByBarberChart').getContex let incomeByBarberLabels = incomeByBarber.map(incomeByBarber => incomeByBarber.biography.full_name); let incomeByBarberData = incomeByBarber.map(incomeByBarber => incomeByBarber.transactions_sum_total); +console.log(incomeByBarberLabels, incomeByBarberData) let incomeByBarberBackgroundColors = incomeByBarberData.map(() => getRandomColor()); let incomeByBarberBorderColors = incomeByBarberBackgroundColors.map(color => color.replace('0.2', '1')); diff --git a/public/assets/admin/js/filter.js b/public/assets/admin/js/filter.js index b4fce94..fafe376 100644 --- a/public/assets/admin/js/filter.js +++ b/public/assets/admin/js/filter.js @@ -30,15 +30,25 @@ $(document).ready(function () { $("#top-barber-name").text(response.data.topBarber.biography.full_name || "-deleted-"); $("#top-barber-total").text(formatToRupiah(response.data.topBarber.transactions_sum_total)); + if (userRole === 5) { + $("#top-customers-by-total").empty(); + $("#top-customers-by-total").html(response.data.renderCustomerByTotal); + + $("#total-transaction").text(response.data.incomeByBarber.transactions_count); + $("#total-income").text(response.data.incomeByBarber.transactions_sum_total); + } + // income expense let totalIncome = response.data.totalIncome; let totalExpense = response.data.totalExpense; - incomeExpenseChart.data.datasets[0].data = [ - totalIncome, - totalExpense, - ]; - incomeExpenseChart.update(); + if (userRole !== 5) { + incomeExpenseChart.data.datasets[0].data = [ + totalIncome, + totalExpense, + ]; + incomeExpenseChart.update(); + } // top service let topService = response.data.topService; @@ -70,22 +80,26 @@ $(document).ready(function () { paymentMethodChart.update(); // income by barber - let updatedIncomeByBarber = response.data.incomeByBarber; - let updatedLabels = updatedIncomeByBarber.map(item => item.biography.full_name); - let updatedData = updatedIncomeByBarber.map(item => item.transactions_sum_total); + if (userRole !== 5) { + let updatedIncomeByBarber = response.data.incomeByBarber; + let updatedLabels = updatedIncomeByBarber.map(item => item.biography.full_name); + let updatedData = updatedIncomeByBarber.map(item => item.transactions_sum_total); - incomeByBarberChart.data.labels = updatedLabels; - incomeByBarberChart.data.datasets[0].data = updatedData; - incomeByBarberChart.update(); + incomeByBarberChart.data.labels = updatedLabels; + incomeByBarberChart.data.datasets[0].data = updatedData; + incomeByBarberChart.update(); + } // transaction by barber - let transactionByBarber = response.data.transactionByBarber; - let transactionByBarberLabels = transactionByBarber.map(item => item.biography.full_name); - let transactionByBarberData = transactionByBarber.map(item => item.transactions_count); + if (userRole !== 5) { + let transactionByBarber = response.data.transactionByBarber; + let transactionByBarberLabels = transactionByBarber.map(item => item.biography.full_name); + let transactionByBarberData = transactionByBarber.map(item => item.transactions_count); - transactionByBarberChart.data.labels = transactionByBarberLabels; - transactionByBarberChart.data.datasets[0].data = transactionByBarberData; - transactionByBarberChart.update(); + transactionByBarberChart.data.labels = transactionByBarberLabels; + transactionByBarberChart.data.datasets[0].data = transactionByBarberData; + transactionByBarberChart.update(); + } }, error: function (xhr) { }, }); diff --git a/resources/views/pages/admin/dashboard/analytic.blade.php b/resources/views/pages/admin/dashboard/analytic.blade.php index 88b7472..1b40418 100644 --- a/resources/views/pages/admin/dashboard/analytic.blade.php +++ b/resources/views/pages/admin/dashboard/analytic.blade.php @@ -19,101 +19,104 @@
-
-
-
- Total Aset -
-

{{ formatToRupiah($totalAsset) }}

-
-
-
-
-
-
-
-
    -
  • -
    -
    - - - - -
    -
    -
    -
    {{ $totalBarber }}
    - - - Barber - -
    -
  • -
  • -
    -
    - - - - -
    -
    -
    -
    {{ $totalUser }}
    - - - Semua - -
    -
  • -
-
-
- @if ($topBarber && $topBarber->transactions_sum_total) -
-
- Top Barber -

- {{ $topBarber->biography->full_name ?? '-deleted-' }} -

- {{ formatToRupiah($topBarber->transactions_sum_total ?? 0) }} -
- mobile with coin + @if (auth()->user()->role_id !== 5) +
+
+
+ Total Aset +
+

{{ formatToRupiah($totalAsset) }}

+
+
- @endif -
-
-
-
-
Grafik Keuangan
+
+
+
    +
  • +
    +
    + + + + +
    +
    +
    +
    {{ $totalBarber }}
    + + + Barber + +
    +
  • +
  • +
    +
    + + + + +
    +
    +
    +
    {{ $totalUser }}
    + + + Semua + +
    +
  • +
+
-
-
-
-
-

Keuntungan : {{ formatToRupiah($totalIncome - $totalExpense) }}

-
- + @if ($topBarber && $topBarber->transactions_sum_total) +
+
+ Top Barber +

+ {{ $topBarber->biography->full_name ?? '-deleted-' }} +

+ {{ formatToRupiah($topBarber->transactions_sum_total ?? 0) }} +
+ mobile with coin +
+
+
+ @endif +
+
+
+
+
Grafik Keuangan
+
+
+
+
+
+

Keuntungan : {{ formatToRupiah($totalIncome - $totalExpense) }} +

+
+ +
-
+ @endif
@@ -150,42 +153,107 @@ class="feather feather-user-minus font-success">
-
-
-
-
Pendapatan By Barber
-
-
-
-
-
-
- + @if (auth()->user()->role_id !== 5) +
+
+
+
Pendapatan By Barber
+
+
+
+
+
+
+ +
-
-
-
-
-
Transaksi By Barber
-
-
-
-
-
-
- +
+
+
+
Transaksi By Barber
+
+
+
+
+
+
+ +
-
+ @else +
+
+
+
+
Top Pelanggan
+
+
+
+
+ + + + + + + + + + + @foreach ($topCustomersByTotal as $item) + + + + + + + @endforeach + +
NamaKontakJumlah TransaksiTotal Transakski
{{ $item->customer->name ?? '--deleted--' }}{{ $item->customer->contact_number ?? '-' }}{{ $item->transaction_count }}{{ formatToRupiah($item->total_transaction) }}
+
+
+
+
+
+
+
+
+
Pendapatan Barber
+
+
+
+
+ + + + + + + + + + + + + +
Jumlah TransaksiTotal Transakski
{{ $incomeByBarber->transactions_count }} + {{ $incomeByBarber->transactions_sum_total }} +
+
+
+
+
+ @endif
@endsection @@ -196,12 +264,16 @@ class="feather feather-user-minus font-success"> @section('afterScripts') diff --git a/resources/views/partials/admin/_customer-by-total.blade.php b/resources/views/partials/admin/_customer-by-total.blade.php new file mode 100644 index 0000000..a67f410 --- /dev/null +++ b/resources/views/partials/admin/_customer-by-total.blade.php @@ -0,0 +1,8 @@ +@foreach ($topCustomersByTotal as $item) + + {{ $item->customer->name ?? '--deleted--' }} + {{ $item->customer->contact_number ?? '-' }} + {{ $item->transaction_count }} + {{ formatToRupiah($item->total_transaction) }} + +@endforeach diff --git a/resources/views/partials/admin/_sidebar.blade.php b/resources/views/partials/admin/_sidebar.blade.php index 3d72e86..48b0915 100644 --- a/resources/views/partials/admin/_sidebar.blade.php +++ b/resources/views/partials/admin/_sidebar.blade.php @@ -49,7 +49,7 @@ Ringkasan - @if (in_array(auth()->user()->role_id, [1, 2, 3])) + @if (auth()->user()->role_id !== 4) + @endif + @if (in_array(auth()->user()->role_id, [1, 2, 3]))