Files

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