technicianReportService = $technicianReportService; } public function index(Request $request) { $menu = Menu::where('link','reports.technician.index')->first(); abort_if(!Gate::allows('view', $menu), 403); return view('reports.technician'); } /** * Get dealers for filter dropdown */ 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(); $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' => $defaultDealer ? $defaultDealer->id : null ]); } catch (\Exception $e) { Log::error('Controller: Error getting dealers: ' . $e->getMessage(), [ 'trace' => $e->getTraceAsString() ]); return response()->json([ 'status' => 'error', 'message' => 'Gagal mengambil data dealer: ' . $e->getMessage() ], 500); } } /** * Get technician report data for DataTable */ public function getData(Request $request) { try { $dealerId = $request->input('dealer_id'); $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, 'user_id' => $user->id, 'user_role_id' => $user->role_id, 'user_dealer_id' => $user->dealer_id ]); $reportData = $this->technicianReportService->getTechnicianReportData( $dealerId, $startDate, $endDate ); Log::info('Technician report data response:', [ 'data_count' => count($reportData['data']), 'mechanics_count' => $reportData['mechanics']->count(), 'works_count' => $reportData['works']->count(), 'mechanics' => $reportData['mechanics']->map(function($mechanic) { return [ 'id' => $mechanic->id, 'name' => $mechanic->name, 'role_id' => $mechanic->role_id ]; }) ]); return response()->json([ 'status' => 'success', 'data' => $reportData['data'], 'mechanics' => $reportData['mechanics'], 'works' => $reportData['works'] ]); } catch (\Exception $e) { Log::error('Error getting technician report data: ' . $e->getMessage(), [ 'dealer_id' => $request->input('dealer_id'), 'start_date' => $request->input('start_date'), 'end_date' => $request->input('end_date'), 'trace' => $e->getTraceAsString() ]); return response()->json([ 'status' => 'error', 'message' => 'Gagal mengambil data laporan teknisi: ' . $e->getMessage() ], 500); } } /** * Get technician report data for Yajra DataTable */ public function getDataTable(Request $request) { try { $dealerId = $request->input('dealer_id'); $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, 'user_id' => $user->id, 'user_role_id' => $user->role_id, 'user_dealer_id' => $user->dealer_id ]); $reportData = $this->technicianReportService->getTechnicianReportDataForDataTable( $dealerId, $startDate, $endDate ); return $reportData; } catch (\Exception $e) { Log::error('Error getting technician report data for DataTable: ' . $e->getMessage(), [ 'dealer_id' => $request->input('dealer_id'), 'start_date' => $request->input('start_date'), 'end_date' => $request->input('end_date'), 'trace' => $e->getTraceAsString() ]); return response()->json([ 'error' => 'Gagal mengambil data laporan teknisi: ' . $e->getMessage() ], 500); } } /** * Export technician report to Excel */ public function export(Request $request) { try { $dealerId = $request->input('dealer_id'); $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, '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) { Log::error('Error exporting technician report: ' . $e->getMessage(), [ 'dealer_id' => $request->input('dealer_id'), 'start_date' => $request->input('start_date'), 'end_date' => $request->input('end_date') ]); return response()->json([ 'status' => 'error', 'message' => 'Gagal export laporan: ' . $e->getMessage() ], 500); } } }