318 lines
12 KiB
PHP
Executable File
318 lines
12 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers\Admin\Dashboard;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Expense;
|
|
use App\Models\Inventory;
|
|
use App\Models\Payroll;
|
|
use App\Models\Service;
|
|
use App\Models\Transaction;
|
|
use App\Models\User;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Contracts\View\View;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class AnalyticController extends Controller
|
|
{
|
|
public function index(): View
|
|
{
|
|
$totalIncome = Transaction::query()->barbershop()->sum('total');
|
|
$totalExpense = Expense::query()->barbershop()->sum('amount');
|
|
$totalPayroll = Payroll::query()->barbershop()->sum('total');
|
|
$totalShaving = Transaction::query()->barbershop()->count();
|
|
|
|
$topService = Service::query()
|
|
->barbershop()
|
|
->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();
|
|
|
|
$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();
|
|
|
|
$totalAsset = Inventory::query()->barbershop()->sum(DB::raw('quantity * price'));
|
|
|
|
$topBarber = User::with('biography')
|
|
->barbershop()
|
|
->barber()
|
|
->withSum('transactions', 'total')
|
|
->orderBy('transactions_sum_total', 'desc')
|
|
->first();
|
|
|
|
$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,
|
|
'totalExpense' => $totalExpense + $totalPayroll,
|
|
'totalShaving' => $totalShaving,
|
|
'topService' => $topService,
|
|
'paymentMethod' => $paymentMethod,
|
|
'incomeByBarber' => $incomeByBarber,
|
|
'transactionByBarber' => $transactionByBarber,
|
|
'totalAsset' => $totalAsset,
|
|
'topBarber' => $topBarber,
|
|
'totalUser' => $totalUser,
|
|
'totalBarber' => $totalBarber,
|
|
'topCustomersByTotal' => $topCustomersByTotal,
|
|
]);
|
|
}
|
|
|
|
public function filter(Request $request): JsonResponse
|
|
{
|
|
$startDate = $request->start_date;
|
|
$endDate = $request->end_date;
|
|
|
|
$totalIncome = Transaction::query()
|
|
->barbershop()
|
|
->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
])
|
|
->sum('total');
|
|
|
|
$totalExpense = Expense::query()
|
|
->barbershop()
|
|
->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
])
|
|
->sum('amount');
|
|
|
|
$totalPayroll = Payroll::query()
|
|
->barbershop()
|
|
->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
])
|
|
->sum('total');
|
|
|
|
$totalShaving = Transaction::query()
|
|
->barbershop()
|
|
->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
])
|
|
->count();
|
|
|
|
$topService = Service::query()
|
|
->barbershop()
|
|
->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());
|
|
});
|
|
}])
|
|
->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'))
|
|
->barbershop()
|
|
->whereBetween('created_at', [
|
|
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();
|
|
|
|
$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(),
|
|
]);
|
|
}], 'total')
|
|
->get();
|
|
|
|
$transactionByBarber = User::with('biography')
|
|
->barbershop()
|
|
->barber()
|
|
->withCount(['transactions' => function ($query) use ($startDate, $endDate) {
|
|
$query->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
]);
|
|
}])
|
|
->get();
|
|
|
|
$totalAsset = Inventory::query()
|
|
->barbershop()
|
|
->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
])
|
|
->sum(DB::raw('quantity * price'));
|
|
|
|
$topBarber = User::with('biography')
|
|
->barbershop()
|
|
->barber()
|
|
->withSum(['transactions' => function ($query) use ($startDate, $endDate) {
|
|
$query->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
]);
|
|
}], 'total')
|
|
->orderBy('transactions_sum_total', 'desc')
|
|
->first();
|
|
|
|
$totalUser = User::query()
|
|
->barbershop()
|
|
->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
])
|
|
->count();
|
|
$totalBarber = User::query()
|
|
->barbershop()
|
|
->whereBetween('created_at', [
|
|
Carbon::parse($startDate)->startOfDay(),
|
|
Carbon::parse($endDate)->endOfDay(),
|
|
])
|
|
->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',
|
|
'data' => [
|
|
'startDate' => $startDate,
|
|
'endDate' => $endDate,
|
|
'totalIncome' => $totalIncome,
|
|
'totalExpense' => $totalExpense + $totalPayroll,
|
|
'totalShaving' => $totalShaving,
|
|
'topService' => $topService,
|
|
'paymentMethod' => $paymentMethod,
|
|
'incomeByBarber' => $incomeByBarber,
|
|
'transactionByBarber' => $transactionByBarber,
|
|
'totalAsset' => $totalAsset,
|
|
'topBarber' => $topBarber,
|
|
'totalUser' => $totalUser,
|
|
'totalBarber' => $totalBarber,
|
|
'renderCustomerByTotal' => $renderCustomerByTotal,
|
|
],
|
|
], 200);
|
|
}
|
|
}
|