Files
ABSDEV/Workflow/Http/Controllers/WorkflowController.php
T
2026-10-12 14:50:13 +01:00

45 lines
2.7 KiB
PHP

<?php
namespace Modules\Workflow\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\View\View;
use Modules\Workflow\Models\WorkflowDefinition;
use Modules\Workflow\Models\WorkflowInstance;
use Modules\Workflow\Services\WorkflowManager;
final class WorkflowController extends Controller
{
public function index(): View
{
abort_unless(auth()->user()->can('workflow.view'), 403);
return view('workflow::admin.index', ['definitions' => WorkflowDefinition::with('stages')->latest()->get(), 'queue' => WorkflowInstance::with(['definition', 'stage', 'subject'])->where('status', 'active')->latest()->paginate(20), 'completed' => WorkflowInstance::where('status', 'completed')->count()]);
}
public function store(Request $request): RedirectResponse
{
abort_unless($request->user()->can('workflow.manage'), 403);
$data = $request->validate(['name' => 'required|string|max:120', 'description' => 'nullable|string', 'subject_type' => 'nullable|string|max:255']);
$definition = WorkflowDefinition::create($data + ['slug' => Str::slug($data['name']), 'is_active' => true]);
$draft = $definition->stages()->create(['name' => 'Draft', 'slug' => 'draft', 'position' => 0, 'is_initial' => true, 'due_days' => null]);
$review = $definition->stages()->create(['name' => 'Review', 'slug' => 'review', 'position' => 10, 'required_permission' => 'workflow.review', 'due_days' => 3]);
$published = $definition->stages()->create(['name' => 'Approved', 'slug' => 'approved', 'position' => 20, 'is_terminal' => true, 'allows_rejection' => false]);
$definition->transitions()->createMany([['from_stage_id' => $draft->id, 'to_stage_id' => $review->id, 'name' => 'Submit for review', 'action' => 'submit'], ['from_stage_id' => $review->id, 'to_stage_id' => $published->id, 'name' => 'Approve', 'action' => 'approve', 'required_permission' => 'workflow.review'], ['from_stage_id' => $review->id, 'to_stage_id' => $draft->id, 'name' => 'Request changes', 'action' => 'reject', 'required_permission' => 'workflow.review', 'requires_comment' => true]]);
return back()->with('success', 'Workflow created.');
}
public function transition(Request $request, WorkflowInstance $instance, WorkflowManager $manager): RedirectResponse
{
abort_unless($request->user()->can('workflow.review'), 403);
$data = $request->validate(['action' => 'required|string', 'comment' => 'nullable|string|max:2000']);
$manager->transition($instance, $data['action'], $request->user(), $data['comment'] ?? null);
return back()->with('success', 'Workflow updated.');
}
}