Gate ticket handoff as Pro; reorder settings cards.
Deploy Ladill Queue / deploy (push) Successful in 1m19s
Deploy Ladill Queue / deploy (push) Successful in 1m19s
Transfer between queues requires Pro (console UI, API, and plans copy). Branches & team now sits after Organization on the settings page.
This commit is contained in:
@@ -5,8 +5,10 @@ namespace App\Http\Controllers\Api;
|
||||
use App\Http\Controllers\Api\Concerns\ScopesApiToAccount;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Counter;
|
||||
use App\Models\Organization;
|
||||
use App\Models\ServiceQueue;
|
||||
use App\Models\Ticket;
|
||||
use App\Services\Qms\PlanService;
|
||||
use App\Services\Qms\QueueEngine;
|
||||
use App\Services\Qms\TicketPresenter;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -18,6 +20,7 @@ class ConsoleApiController extends Controller
|
||||
|
||||
public function __construct(
|
||||
protected QueueEngine $engine,
|
||||
protected PlanService $plans,
|
||||
) {}
|
||||
|
||||
public function show(Request $request, Counter $counter): JsonResponse
|
||||
@@ -25,6 +28,8 @@ class ConsoleApiController extends Controller
|
||||
$this->authorizeAbility($request, 'console.use');
|
||||
$this->authorizeOwner($request, $counter);
|
||||
$owner = $this->ownerRef($request);
|
||||
$organization = $this->organization($request);
|
||||
$canTransfer = $this->plans->hasFeature($organization, 'transfer');
|
||||
|
||||
$counter->load(['serviceQueues', 'branch']);
|
||||
|
||||
@@ -42,12 +47,14 @@ class ConsoleApiController extends Controller
|
||||
)];
|
||||
});
|
||||
|
||||
$allQueues = ServiceQueue::owned($owner)
|
||||
->where('organization_id', $counter->organization_id)
|
||||
->where('branch_id', $counter->branch_id)
|
||||
->where('is_active', true)
|
||||
->orderBy('name')
|
||||
->get(['uuid', 'name', 'prefix']);
|
||||
$allQueues = $canTransfer
|
||||
? ServiceQueue::owned($owner)
|
||||
->where('organization_id', $counter->organization_id)
|
||||
->where('branch_id', $counter->branch_id)
|
||||
->where('is_active', true)
|
||||
->orderBy('name')
|
||||
->get(['uuid', 'name', 'prefix'])
|
||||
: collect();
|
||||
|
||||
return response()->json([
|
||||
'data' => [
|
||||
@@ -65,6 +72,7 @@ class ConsoleApiController extends Controller
|
||||
]),
|
||||
'waiting_by_queue' => $waitingByQueue,
|
||||
'transfer_queues' => $allQueues,
|
||||
'can_transfer' => $canTransfer,
|
||||
],
|
||||
]);
|
||||
}
|
||||
@@ -137,6 +145,12 @@ class ConsoleApiController extends Controller
|
||||
?string $reason,
|
||||
string $actor,
|
||||
): Ticket {
|
||||
$organization = Organization::query()->findOrFail($counter->organization_id);
|
||||
abort_unless(
|
||||
$this->plans->hasFeature($organization, 'transfer'),
|
||||
403,
|
||||
'Handing off tickets between queues requires Queue Pro.',
|
||||
);
|
||||
abort_if($toQueueUuid === '', 422, 'to_queue_uuid is required for transfer.');
|
||||
|
||||
$toQueue = ServiceQueue::where('uuid', $toQueueUuid)->firstOrFail();
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Http\Controllers\Api\Concerns\ScopesApiToAccount;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\ServiceQueue;
|
||||
use App\Models\Ticket;
|
||||
use App\Services\Qms\PlanService;
|
||||
use App\Services\Qms\QueueEngine;
|
||||
use App\Services\Qms\TicketPresenter;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -17,6 +18,7 @@ class TicketController extends Controller
|
||||
|
||||
public function __construct(
|
||||
protected QueueEngine $engine,
|
||||
protected PlanService $plans,
|
||||
) {}
|
||||
|
||||
public function index(Request $request): JsonResponse
|
||||
@@ -108,6 +110,11 @@ class TicketController extends Controller
|
||||
]);
|
||||
|
||||
if ($validated['action'] === 'transfer') {
|
||||
abort_unless(
|
||||
$this->plans->hasFeature($this->organization($request), 'transfer'),
|
||||
403,
|
||||
'Handing off tickets between queues requires Queue Pro.',
|
||||
);
|
||||
$toQueue = ServiceQueue::where('uuid', $validated['to_queue_id'])->firstOrFail();
|
||||
$this->authorizeOwner($request, $toQueue);
|
||||
$result = $this->engine->transfer($ticket, $toQueue, null, $validated['reason'] ?? null, $actor);
|
||||
|
||||
@@ -7,7 +7,7 @@ use App\Http\Controllers\Qms\Concerns\ScopesToAccount;
|
||||
use App\Models\Counter;
|
||||
use App\Models\ServiceQueue;
|
||||
use App\Models\Ticket;
|
||||
use App\Services\Qms\OrganizationResolver;
|
||||
use App\Services\Qms\PlanService;
|
||||
use App\Services\Qms\QueueEngine;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
@@ -19,6 +19,7 @@ class ConsoleController extends Controller
|
||||
|
||||
public function __construct(
|
||||
protected QueueEngine $engine,
|
||||
protected PlanService $plans,
|
||||
) {}
|
||||
|
||||
public function show(Request $request, Counter $counter): View
|
||||
@@ -26,6 +27,7 @@ class ConsoleController extends Controller
|
||||
$this->authorizeAbility($request, 'console.use');
|
||||
$this->authorizeOwner($request, $counter);
|
||||
$owner = $this->ownerRef($request);
|
||||
$organization = $this->organization($request);
|
||||
|
||||
$counter->load(['serviceQueues', 'branch']);
|
||||
$queues = $counter->serviceQueues;
|
||||
@@ -41,14 +43,24 @@ class ConsoleController extends Controller
|
||||
return [$queue->id => $this->engine->waitingTickets($queue, 10)];
|
||||
});
|
||||
|
||||
$allQueues = ServiceQueue::owned($owner)
|
||||
->where('organization_id', $counter->organization_id)
|
||||
->where('branch_id', $counter->branch_id)
|
||||
->where('is_active', true)
|
||||
->orderBy('name')
|
||||
->get();
|
||||
$canTransfer = $this->plans->hasFeature($organization, 'transfer');
|
||||
$allQueues = $canTransfer
|
||||
? ServiceQueue::owned($owner)
|
||||
->where('organization_id', $counter->organization_id)
|
||||
->where('branch_id', $counter->branch_id)
|
||||
->where('is_active', true)
|
||||
->orderBy('name')
|
||||
->get()
|
||||
: collect();
|
||||
|
||||
return view('qms.console.show', compact('counter', 'queues', 'currentTicket', 'waitingByQueue', 'allQueues'));
|
||||
return view('qms.console.show', compact(
|
||||
'counter',
|
||||
'queues',
|
||||
'currentTicket',
|
||||
'waitingByQueue',
|
||||
'allQueues',
|
||||
'canTransfer',
|
||||
));
|
||||
}
|
||||
|
||||
public function action(Request $request, Counter $counter): RedirectResponse
|
||||
@@ -65,6 +77,12 @@ class ConsoleController extends Controller
|
||||
'reason' => ['nullable', 'string', 'max:500'],
|
||||
]);
|
||||
|
||||
if ($validated['action'] === 'transfer' && ! $this->plans->hasFeature($this->organization($request), 'transfer')) {
|
||||
return redirect()
|
||||
->route('qms.pro.index')
|
||||
->with('error', 'Handing off tickets between queues requires Queue Pro.');
|
||||
}
|
||||
|
||||
try {
|
||||
$message = match ($validated['action']) {
|
||||
'call_next' => $this->handleCallNext($counter, (int) $validated['queue_id'], $actor),
|
||||
|
||||
Reference in New Issue
Block a user