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 @@