with(['modules', 'tasks', 'updates' => function($q) { $q->latest(); }, 'proposal']) ->firstOrFail(); // Recalculate progress dynamically $project->recalculateProgress(); // Strict Admin Check: ONLY logged-in admin users can edit/manage $isAdminMode = Auth::check(); // Client PIN Verification Check: Admins are auto-verified, clients need PIN verification in session $isVerified = $isAdminMode || session()->get('project_access_' . $project->id, false); return view('projects.show', compact('project', 'isAdminMode', 'isVerified')); } /** * Verify client access code (PIN). */ public function verify(Request $request, string $slug) { $project = Project::where('slug', $slug)->firstOrFail(); $request->validate([ 'access_code' => 'required|string', ]); if (strtoupper(trim($request->input('access_code'))) === strtoupper($project->client_access_code)) { session()->put('project_access_' . $project->id, true); return back()->with('success', 'Erişim doğrulandı.'); } return back()->withErrors(['access_code' => 'Geçersiz müşteri takip şifresi.']); } /** * Web Manager Action: Update Module Status (Bekliyor / Devam Ediyor / Tamamlandı) */ public function updateModuleStatus(Request $request, string $slug) { if (!Auth::check()) { if ($request->wantsJson() || $request->ajax()) { return response()->json(['success' => false, 'message' => 'Bu işlem için yönetici girişi yapmanız gerekmektedir.'], 403); } return back()->withErrors(['error' => 'Yetkisiz erişim.']); } $project = Project::where('slug', $slug)->firstOrFail(); $request->validate([ 'module_id' => 'required|exists:project_modules,id', 'status' => 'required|in:pending,in_progress,completed', ]); $module = ProjectModule::where('id', $request->input('module_id')) ->where('project_id', $project->id) ->firstOrFail(); $module->update(['status' => $request->input('status')]); $newProgress = $project->recalculateProgress(); if ($request->wantsJson() || $request->ajax()) { return response()->json([ 'success' => true, 'message' => "'{$module->title}' modül durumu güncellendi.", 'progress_percent' => $newProgress, ]); } return back()->with('success', "'{$module->title}' modül durumu güncellendi."); } /** * Web Manager Action: Update Task Status (Kanban Move) */ public function updateTaskStatus(Request $request, string $slug) { if (!Auth::check()) { if ($request->wantsJson() || $request->ajax()) { return response()->json(['success' => false, 'message' => 'Bu işlem için yönetici girişi yapmanız gerekmektedir.'], 403); } return back()->withErrors(['error' => 'Yetkisiz erişim.']); } $project = Project::where('slug', $slug)->firstOrFail(); $request->validate([ 'task_id' => 'required|exists:project_tasks,id', 'status' => 'required|in:todo,in_progress,review,done', ]); $task = ProjectTask::where('id', $request->input('task_id')) ->where('project_id', $project->id) ->firstOrFail(); $task->update(['status' => $request->input('status')]); $newProgress = $project->recalculateProgress(); if ($request->wantsJson() || $request->ajax()) { return response()->json([ 'success' => true, 'message' => "'{$task->title}' görev durumu güncellendi.", 'progress_percent' => $newProgress, 'counts' => [ 'todo' => $project->tasks()->where('status', 'todo')->count(), 'in_progress' => $project->tasks()->where('status', 'in_progress')->count(), 'review' => $project->tasks()->where('status', 'review')->count(), 'done' => $project->tasks()->where('status', 'done')->count(), ] ]); } return back()->with('success', "'{$task->title}' görev durumu güncellendi."); } /** * Web Manager Action: Add New Task */ public function addTask(Request $request, string $slug) { if (!Auth::check()) { return back()->withErrors(['error' => 'Yetkisiz erişim.']); } $project = Project::where('slug', $slug)->firstOrFail(); $request->validate([ 'title' => 'required|string|max:255', 'description' => 'nullable|string|max:2000', 'status' => 'required|in:todo,in_progress,review,done', 'priority' => 'required|in:low,medium,high,urgent', 'assigned_person' => 'nullable|string|max:255', 'project_module_id' => 'nullable|exists:project_modules,id', ]); $task = ProjectTask::create([ 'project_id' => $project->id, 'project_module_id' => $request->input('project_module_id'), 'title' => $request->input('title'), 'description' => $request->input('description'), 'status' => $request->input('status'), 'priority' => $request->input('priority'), 'assigned_person' => $request->input('assigned_person'), ]); $project->recalculateProgress(); return back()->with('success', "'{$task->title}' görevi panoya eklendi."); } /** * Web Manager Action: Delete Task */ public function deleteTask(Request $request, string $slug) { if (!Auth::check()) { if ($request->wantsJson() || $request->ajax()) { return response()->json(['success' => false, 'message' => 'Yetkisiz erişim.'], 403); } return back()->withErrors(['error' => 'Yetkisiz erişim.']); } $project = Project::where('slug', $slug)->firstOrFail(); $request->validate([ 'task_id' => 'required|exists:project_tasks,id', ]); $task = ProjectTask::where('id', $request->input('task_id')) ->where('project_id', $project->id) ->firstOrFail(); $taskName = $task->title; $task->delete(); $project->recalculateProgress(); return back()->with('success', "'{$taskName}' görevi silindi."); } /** * Web Manager Action: Add Live Progress Update / Announcement */ public function addUpdate(Request $request, string $slug) { if (!Auth::check()) { return back()->withErrors(['error' => 'Yetkisiz erişim.']); } $project = Project::where('slug', $slug)->firstOrFail(); $request->validate([ 'title' => 'required|string|max:255', 'content' => 'required|string|max:5000', ]); ProjectUpdate::create([ 'project_id' => $project->id, 'user_id' => Auth::id(), 'title' => $request->input('title'), 'content' => $request->input('content'), 'progress_percent_at_update' => $project->progress_percent, 'is_public' => true, ]); return back()->with('success', 'Yeni ilerleme duyurusu yayınlandı.'); } /** * Web Manager Action: Delete Live Progress Update / Announcement */ public function deleteUpdate(Request $request, string $slug) { if (!Auth::check()) { if ($request->wantsJson() || $request->ajax()) { return response()->json(['success' => false, 'message' => 'Yetkisiz erişim.'], 403); } return back()->withErrors(['error' => 'Yetkisiz erişim.']); } $project = Project::where('slug', $slug)->firstOrFail(); $request->validate([ 'update_id' => 'required|exists:project_updates,id', ]); $update = ProjectUpdate::where('id', $request->input('update_id')) ->where('project_id', $project->id) ->firstOrFail(); $update->delete(); if ($request->wantsJson() || $request->ajax()) { return response()->json([ 'success' => true, 'message' => 'Duyuru başarıyla silindi.', ]); } return back()->with('success', 'Duyuru başarıyla silindi.'); } /** * Web Manager Action: Recalculate Progress % */ public function recalculate(Request $request, string $slug) { if (!Auth::check()) { return back()->withErrors(['error' => 'Yetkisiz erişim.']); } $project = Project::where('slug', $slug)->firstOrFail(); $pct = $project->recalculateProgress(); return back()->with('success', "Proje ilerleme yüzdesi yeniden hesaplandı: %{$pct}"); } }