mastercut/app/Http/Controllers/Admin/Dashboard/AnalyticController.php

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);
}
}