fix login auto detect menu link, and partial update tchnician role dealer
This commit is contained in:
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Privilege;
|
||||
use App\Models\User;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
||||
@@ -50,11 +51,39 @@ class LoginController extends Controller
|
||||
*/
|
||||
protected function authenticated(Request $request, $user)
|
||||
{
|
||||
$user = Privilege::where('menu_id', 10)->where('role_id', Auth::user()->role_id)->where('view', 1)->first();
|
||||
// Get user's role_id
|
||||
$roleId = Auth::user()->role_id;
|
||||
|
||||
if (!$roleId) {
|
||||
// User has no role, redirect to default
|
||||
return redirect(RouteServiceProvider::HOME);
|
||||
}
|
||||
|
||||
if ($user != null) {
|
||||
return redirect()->route('dashboard');
|
||||
}else{
|
||||
// Check if user has access to adminarea menu
|
||||
if (!User::roleCanAccessMenu($roleId, 'adminarea')) {
|
||||
// User doesn't have admin area access, redirect to default home
|
||||
return redirect(RouteServiceProvider::HOME);
|
||||
}
|
||||
|
||||
// User has admin area access, get first accessible menu (excluding adminarea and mechanicarea)
|
||||
$firstMenu = Privilege::join('menus', 'privileges.menu_id', '=', 'menus.id')
|
||||
->where('privileges.role_id', $roleId)
|
||||
->where('privileges.view', 1)
|
||||
->whereNotIn('menus.link', ['adminarea', 'mechanicarea'])
|
||||
->select('menus.*', 'privileges.view', 'privileges.create', 'privileges.update', 'privileges.delete')
|
||||
->orderBy('menus.id')
|
||||
->first();
|
||||
|
||||
if (!$firstMenu) {
|
||||
// User has no accessible menus (excluding adminarea/mechanicarea), redirect to default
|
||||
return redirect(RouteServiceProvider::HOME);
|
||||
}
|
||||
|
||||
try {
|
||||
// Try to redirect to the first accessible menu
|
||||
return redirect()->route($firstMenu->link);
|
||||
} catch (\Exception $e) {
|
||||
// Route doesn't exist, fallback to default home
|
||||
return redirect(RouteServiceProvider::HOME);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,11 +5,14 @@ namespace App\Http\Controllers\Reports;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Menu;
|
||||
use App\Models\Role;
|
||||
use App\Services\TechnicianReportService;
|
||||
use App\Exports\TechnicianReportExport;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Illuminate\Support\Facades\DB; // Added DB facade
|
||||
use App\Models\Dealer; // Added Dealer model
|
||||
|
||||
class ReportTechniciansController extends Controller
|
||||
{
|
||||
@@ -34,18 +37,66 @@ class ReportTechniciansController extends Controller
|
||||
public function getDealers()
|
||||
{
|
||||
try {
|
||||
// Get current authenticated user
|
||||
$user = auth()->user();
|
||||
|
||||
if (!$user) {
|
||||
Log::info('Controller: No authenticated user found');
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'User tidak terautentikasi'
|
||||
], 401);
|
||||
}
|
||||
|
||||
Log::info('Controller: Getting dealers for user:', [
|
||||
'user_id' => $user->id,
|
||||
'user_name' => $user->name,
|
||||
'user_role_id' => $user->role_id,
|
||||
'user_dealer_id' => $user->dealer_id
|
||||
]);
|
||||
|
||||
$dealers = $this->technicianReportService->getDealers();
|
||||
// Default ke "Semua Dealer" (tidak ada dealer yang terselect)
|
||||
$defaultDealer = $this->technicianReportService->getDefaultDealer();
|
||||
|
||||
Log::info('Controller: Service returned dealers:', [
|
||||
'dealers_count' => $dealers->count(),
|
||||
'dealers' => $dealers->toArray(),
|
||||
'default_dealer' => $defaultDealer ? $defaultDealer->toArray() : null,
|
||||
'default_dealer_id' => $defaultDealer ? $defaultDealer->id : null
|
||||
]);
|
||||
|
||||
// Check if default dealer exists in dealers list
|
||||
if ($defaultDealer && $dealers->count() > 0) {
|
||||
$defaultDealerExists = $dealers->contains('id', $defaultDealer->id);
|
||||
Log::info('Controller: Default dealer validation:', [
|
||||
'default_dealer_id' => $defaultDealer->id,
|
||||
'default_dealer_exists_in_list' => $defaultDealerExists,
|
||||
'available_dealer_ids' => $dealers->pluck('id')->toArray()
|
||||
]);
|
||||
|
||||
// If default dealer doesn't exist in list, use first dealer from list
|
||||
if (!$defaultDealerExists) {
|
||||
Log::info('Controller: Default dealer not in list, using first dealer from list');
|
||||
$defaultDealer = $dealers->first();
|
||||
Log::info('Controller: New default dealer:', $defaultDealer ? $defaultDealer->toArray() : null);
|
||||
}
|
||||
} else if ($defaultDealer === null && $dealers->count() > 0) {
|
||||
// Admin without default dealer - no need to set default
|
||||
Log::info('Controller: Admin without default dealer, no default will be set');
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => $dealers,
|
||||
'default_dealer' => null
|
||||
'default_dealer' => $defaultDealer ? $defaultDealer->id : null
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error getting dealers: ' . $e->getMessage());
|
||||
Log::error('Controller: Error getting dealers: ' . $e->getMessage(), [
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Gagal mengambil data dealer'
|
||||
'message' => 'Gagal mengambil data dealer: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
@@ -60,10 +111,23 @@ class ReportTechniciansController extends Controller
|
||||
$startDate = $request->input('start_date');
|
||||
$endDate = $request->input('end_date');
|
||||
|
||||
// Get current authenticated user
|
||||
$user = auth()->user();
|
||||
|
||||
if (!$user) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'User tidak terautentikasi'
|
||||
], 401);
|
||||
}
|
||||
|
||||
Log::info('Requesting technician report data:', [
|
||||
'dealer_id' => $dealerId,
|
||||
'start_date' => $startDate,
|
||||
'end_date' => $endDate
|
||||
'end_date' => $endDate,
|
||||
'user_id' => $user->id,
|
||||
'user_role_id' => $user->role_id,
|
||||
'user_dealer_id' => $user->dealer_id
|
||||
]);
|
||||
|
||||
$reportData = $this->technicianReportService->getTechnicianReportData(
|
||||
@@ -116,10 +180,22 @@ class ReportTechniciansController extends Controller
|
||||
$startDate = $request->input('start_date');
|
||||
$endDate = $request->input('end_date');
|
||||
|
||||
// Get current authenticated user
|
||||
$user = auth()->user();
|
||||
|
||||
if (!$user) {
|
||||
return response()->json([
|
||||
'error' => 'User tidak terautentikasi'
|
||||
], 401);
|
||||
}
|
||||
|
||||
Log::info('Requesting technician report data for DataTable:', [
|
||||
'dealer_id' => $dealerId,
|
||||
'start_date' => $startDate,
|
||||
'end_date' => $endDate
|
||||
'end_date' => $endDate,
|
||||
'user_id' => $user->id,
|
||||
'user_role_id' => $user->role_id,
|
||||
'user_dealer_id' => $user->dealer_id
|
||||
]);
|
||||
|
||||
$reportData = $this->technicianReportService->getTechnicianReportDataForDataTable(
|
||||
@@ -153,12 +229,87 @@ class ReportTechniciansController extends Controller
|
||||
$startDate = $request->input('start_date');
|
||||
$endDate = $request->input('end_date');
|
||||
|
||||
// Get current authenticated user
|
||||
$user = auth()->user();
|
||||
|
||||
if (!$user) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'User tidak terautentikasi'
|
||||
], 401);
|
||||
}
|
||||
|
||||
Log::info('Exporting technician report', [
|
||||
'dealer_id' => $dealerId,
|
||||
'start_date' => $startDate,
|
||||
'end_date' => $endDate
|
||||
'end_date' => $endDate,
|
||||
'user_id' => $user->id,
|
||||
'user_role_id' => $user->role_id,
|
||||
'user_dealer_id' => $user->dealer_id
|
||||
]);
|
||||
|
||||
// Validate dealer access for export
|
||||
if ($dealerId) {
|
||||
// User is trying to export specific dealer
|
||||
if ($user->dealer_id) {
|
||||
// User has specific dealer_id, check if they can access the requested dealer
|
||||
if ($user->dealer_id != $dealerId) {
|
||||
if ($user->role_id) {
|
||||
$role = \App\Models\Role::with('dealers')->find($user->role_id);
|
||||
if (!$role || !$role->hasDealer($dealerId)) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Anda tidak memiliki akses untuk export data dealer ini'
|
||||
], 403);
|
||||
}
|
||||
} else {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Anda tidak memiliki akses untuk export data dealer ini'
|
||||
], 403);
|
||||
}
|
||||
}
|
||||
} else if ($user->role_id) {
|
||||
// User has role, check if they can access the requested dealer
|
||||
$role = \App\Models\Role::with('dealers')->find($user->role_id);
|
||||
if (!$role || !$role->hasDealer($dealerId)) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Anda tidak memiliki akses untuk export data dealer ini'
|
||||
], 403);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// User is trying to export "Semua Dealer" - check if they have permission
|
||||
if ($user->role_id) {
|
||||
$role = \App\Models\Role::with('dealers')->find($user->role_id);
|
||||
if ($role) {
|
||||
// Check if role is admin type
|
||||
$technicianReportService = new \App\Services\TechnicianReportService();
|
||||
if ($technicianReportService->isAdminRole($role)) {
|
||||
// Admin can export all dealers
|
||||
Log::info('Admin user exporting all dealers');
|
||||
} else {
|
||||
// Non-admin with pivot dealers - can only export pivot dealers
|
||||
if ($role->dealers->count() > 0) {
|
||||
Log::info('User with pivot dealers exporting pivot dealers only');
|
||||
} else {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Anda tidak memiliki akses untuk export data semua dealer'
|
||||
], 403);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if ($user->dealer_id) {
|
||||
// User with specific dealer_id cannot export all dealers
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Anda hanya dapat export data dealer Anda sendiri'
|
||||
], 403);
|
||||
}
|
||||
}
|
||||
|
||||
return Excel::download(new TechnicianReportExport($dealerId, $startDate, $endDate), 'laporan_teknisi_' . date('Y-m-d') . '.xlsx');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
@@ -175,5 +326,4 @@ class ReportTechniciansController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Models\Menu;
|
||||
use App\Models\Privilege;
|
||||
use App\Models\Role;
|
||||
use App\Models\User;
|
||||
use App\Models\Dealer;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
@@ -14,10 +15,11 @@ class RolePrivilegeController extends Controller
|
||||
public function index() {
|
||||
$menu = Menu::where('link', 'roleprivileges.index')->first();
|
||||
abort_if(Gate::denies('view', $menu), 403, 'Unauthorized User');
|
||||
$roles = Role::all();
|
||||
$roles = Role::with('dealers')->get();
|
||||
$menus = Menu::all();
|
||||
$users = User::all();
|
||||
return view('back.roleprivileges', compact('roles', 'users', 'menus'));
|
||||
$dealers = Dealer::all();
|
||||
return view('back.roleprivileges', compact('roles', 'users', 'menus', 'dealers'));
|
||||
}
|
||||
|
||||
public function store(Request $request) {
|
||||
@@ -117,4 +119,36 @@ class RolePrivilegeController extends Controller
|
||||
User::where('role_id', $id)->update(['role_id' => 0]);
|
||||
return redirect()->back()->with('success', 'Berhasil Hapus Role');
|
||||
}
|
||||
|
||||
public function assignDealer(Request $request, $id) {
|
||||
$menu = Menu::where('link', 'roleprivileges.index')->first();
|
||||
abort_if(Gate::denies('create', $menu), 403, 'Unauthorized User');
|
||||
|
||||
$request->validate([
|
||||
'dealers' => 'required|array',
|
||||
'dealers.*' => 'exists:dealers,id'
|
||||
]);
|
||||
|
||||
$role = Role::findOrFail($id);
|
||||
|
||||
// Sync dealers (this will replace existing assignments)
|
||||
$role->dealers()->sync($request->dealers);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Berhasil assign dealer ke role'
|
||||
]);
|
||||
}
|
||||
|
||||
public function getAssignedDealers($id) {
|
||||
$menu = Menu::where('link', 'roleprivileges.index')->first();
|
||||
abort_if(Gate::denies('view', $menu), 403, 'Unauthorized User');
|
||||
|
||||
$role = Role::findOrFail($id);
|
||||
$assignedDealers = $role->dealers()->pluck('dealers.id')->toArray();
|
||||
|
||||
return response()->json([
|
||||
'assignedDealers' => $assignedDealers
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user