chore: update document approval workflow and bug fixes
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
<?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.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user