111 lines
3.6 KiB
PHP
111 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace Modules\TimelineScheduling\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use Inertia\Inertia;
|
|
use Modules\ProjectManagement\Models\Project;
|
|
use Modules\ProjectManagement\Models\Task;
|
|
use Modules\TimelineScheduling\Models\Milestone;
|
|
use Modules\TimelineScheduling\Models\TaskDependency;
|
|
use Modules\TimelineScheduling\Services\GanttDataTransformer;
|
|
|
|
class ScheduleController extends Controller
|
|
{
|
|
public function __construct(
|
|
private GanttDataTransformer $ganttTransformer,
|
|
) {}
|
|
|
|
// --- Gantt view for a project ---
|
|
public function gantt(Project $project)
|
|
{
|
|
$ganttData = $this->ganttTransformer->transform($project->id);
|
|
$milestones = Milestone::where('project_id', $project->id)->orderBy('target_date')->get();
|
|
$tasks = Task::where('project_id', $project->id)->select('id', 'ulid', 'name')->get();
|
|
|
|
return Inertia::render('TimelineScheduling::Schedule/Gantt', [
|
|
'project' => $project->only('id', 'ulid', 'name', 'code'),
|
|
'ganttData' => $ganttData,
|
|
'milestones' => $milestones,
|
|
'tasks' => $tasks,
|
|
]);
|
|
}
|
|
|
|
// --- API: Gantt JSON data ---
|
|
public function ganttData(Project $project)
|
|
{
|
|
return response()->json($this->ganttTransformer->transform($project->id));
|
|
}
|
|
|
|
// --- Update task schedule (drag-and-drop) ---
|
|
public function updateSchedule(Request $request, Project $project, Task $task)
|
|
{
|
|
$validated = $request->validate([
|
|
'start_date' => 'required|date',
|
|
'end_date' => 'required|date|after_or_equal:start_date',
|
|
]);
|
|
|
|
$task->update($validated);
|
|
|
|
return response()->json(['success' => true]);
|
|
}
|
|
|
|
// --- Dependencies ---
|
|
public function storeDependency(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'task_id' => 'required|string',
|
|
'predecessor_id' => 'required|string|different:task_id',
|
|
'dependency_type' => 'required|in:FS,FF,SS,SF',
|
|
'lag_days' => 'nullable|integer',
|
|
]);
|
|
|
|
$taskId = Task::resolveUlidToId($validated['task_id']);
|
|
$predecessorId = Task::resolveUlidToId($validated['predecessor_id']);
|
|
|
|
TaskDependency::updateOrCreate(
|
|
['task_id' => $taskId, 'predecessor_id' => $predecessorId],
|
|
['dependency_type' => $validated['dependency_type'], 'lag_days' => $validated['lag_days'] ?? 0],
|
|
);
|
|
|
|
return back()->with('success', 'Dependency added.');
|
|
}
|
|
|
|
public function destroyDependency(TaskDependency $dependency)
|
|
{
|
|
$dependency->delete();
|
|
return back()->with('success', 'Dependency removed.');
|
|
}
|
|
|
|
// --- Milestones ---
|
|
public function storeMilestone(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'project_id' => 'required|string',
|
|
'name' => 'required|string|max:255',
|
|
'description' => 'nullable|string',
|
|
'target_date' => 'required|date',
|
|
'is_critical' => 'nullable|boolean',
|
|
]);
|
|
|
|
$validated['project_id'] = Project::resolveUlidToId($validated['project_id']);
|
|
|
|
Milestone::create($validated);
|
|
|
|
return back()->with('success', 'Milestone created.');
|
|
}
|
|
|
|
public function achieveMilestone(Milestone $milestone)
|
|
{
|
|
$milestone->update(['achieved_date' => now()->toDateString()]);
|
|
return back()->with('success', 'Milestone marked as achieved.');
|
|
}
|
|
|
|
public function destroyMilestone(Milestone $milestone)
|
|
{
|
|
$milestone->delete();
|
|
return back()->with('success', 'Milestone deleted.');
|
|
}
|
|
}
|