Initial Ladill Queue release — enterprise QMS standalone app.
Deploy Ladill Queue / deploy (push) Successful in 56s

Phases 1–6: tickets, counters, displays, appointments, workflows, rules, analytics, reports, feedback, admin, device API, and Gitea deploy workflow for queue.ladill.com.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-29 20:19:52 +00:00
co-authored by Cursor
commit cca98eefd2
297 changed files with 27263 additions and 0 deletions
@@ -0,0 +1,13 @@
<x-app-layout title="New branch">
<div class="mx-auto max-w-lg">
<h1 class="text-2xl font-semibold">New branch</h1>
<form method="POST" action="{{ route('qms.branches.store') }}" class="mt-6 space-y-4 rounded-2xl border bg-white p-6 dark:border-slate-700 dark:bg-slate-900">
@csrf
<div><label class="block text-sm font-medium">Name</label><input name="name" required class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<div><label class="block text-sm font-medium">Code</label><input name="code" class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<div><label class="block text-sm font-medium">Address</label><input name="address" class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<div><label class="block text-sm font-medium">Phone</label><input name="phone" class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<button type="submit" class="btn-primary w-full">Create branch</button>
</form>
</div>
</x-app-layout>
@@ -0,0 +1,14 @@
<x-app-layout title="Edit branch">
<div class="mx-auto max-w-lg">
<h1 class="text-2xl font-semibold">Edit branch</h1>
<form method="POST" action="{{ route('qms.branches.update', $branch) }}" class="mt-6 space-y-4 rounded-2xl border bg-white p-6 dark:border-slate-700 dark:bg-slate-900">
@csrf @method('PUT')
<div><label class="block text-sm font-medium">Name</label><input name="name" value="{{ $branch->name }}" required class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<div><label class="block text-sm font-medium">Code</label><input name="code" value="{{ $branch->code }}" class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<div><label class="block text-sm font-medium">Address</label><input name="address" value="{{ $branch->address }}" class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<div><label class="block text-sm font-medium">Phone</label><input name="phone" value="{{ $branch->phone }}" class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<label class="flex items-center gap-2 text-sm"><input type="checkbox" name="is_active" value="1" @checked($branch->is_active)> Active</label>
<button type="submit" class="btn-primary w-full">Save changes</button>
</form>
</div>
</x-app-layout>
@@ -0,0 +1,31 @@
<x-app-layout title="Branches">
<div class="mb-6 flex items-center justify-between">
<h1 class="text-2xl font-semibold">Branches</h1>
@if(app(\App\Services\Qms\QmsPermissions::class)->can(app(\App\Services\Qms\OrganizationResolver::class)->memberFor(auth()->user()), 'admin.branches.manage'))
<a href="{{ route('qms.branches.create') }}" class="btn-primary">New branch</a>
@endif
</div>
@include('partials.flash')
<div class="overflow-hidden rounded-2xl border bg-white dark:border-slate-700 dark:bg-slate-900">
<table class="min-w-full divide-y divide-slate-200">
<thead class="bg-slate-50"><tr>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Name</th>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Code</th>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Departments</th>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Status</th>
<th></th>
</tr></thead>
<tbody class="divide-y divide-slate-200">
@foreach ($branches as $branch)
<tr>
<td class="px-4 py-3 text-sm font-medium">{{ $branch->name }}</td>
<td class="px-4 py-3 text-sm">{{ $branch->code ?? '—' }}</td>
<td class="px-4 py-3 text-sm">{{ $branch->departments_count }}</td>
<td class="px-4 py-3 text-sm">{{ $branch->is_active ? 'Active' : 'Inactive' }}</td>
<td class="px-4 py-3 text-right"><a href="{{ route('qms.branches.edit', $branch) }}" class="text-sm text-indigo-600">Edit</a></td>
</tr>
@endforeach
</tbody>
</table>
</div>
</x-app-layout>
@@ -0,0 +1,16 @@
<x-app-layout title="New department">
<div class="mx-auto max-w-lg">
<h1 class="text-2xl font-semibold">New department</h1>
<form method="POST" action="{{ route('qms.departments.store') }}" class="mt-6 space-y-4 rounded-2xl border bg-white p-6">
@csrf
<div><label class="block text-sm font-medium">Branch</label>
<select name="branch_id" required class="mt-1 w-full rounded-lg border-slate-300 text-sm">@foreach ($branches as $b)<option value="{{ $b->id }}">{{ $b->name }}</option>@endforeach</select>
</div>
<div><label class="block text-sm font-medium">Name</label><input name="name" required class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<div><label class="block text-sm font-medium">Type</label>
<select name="type" required class="mt-1 w-full rounded-lg border-slate-300 text-sm">@foreach ($types as $v => $l)<option value="{{ $v }}">{{ $l }}</option>@endforeach</select>
</div>
<button type="submit" class="btn-primary w-full">Create</button>
</form>
</div>
</x-app-layout>
@@ -0,0 +1,14 @@
<x-app-layout title="Edit department">
<div class="mx-auto max-w-lg">
<h1 class="text-2xl font-semibold">Edit department</h1>
<form method="POST" action="{{ route('qms.departments.update', $department) }}" class="mt-6 space-y-4 rounded-2xl border bg-white p-6">
@csrf @method('PUT')
<div><label class="block text-sm font-medium">Name</label><input name="name" value="{{ $department->name }}" required class="mt-1 w-full rounded-lg border-slate-300 text-sm"></div>
<div><label class="block text-sm font-medium">Type</label>
<select name="type" required class="mt-1 w-full rounded-lg border-slate-300 text-sm">@foreach ($types as $v => $l)<option value="{{ $v }}" @selected($department->type === $v)>{{ $l }}</option>@endforeach</select>
</div>
<label class="flex items-center gap-2 text-sm"><input type="checkbox" name="is_active" value="1" @checked($department->is_active)> Active</label>
<button type="submit" class="btn-primary w-full">Save</button>
</form>
</div>
</x-app-layout>
@@ -0,0 +1,31 @@
<x-app-layout title="Departments">
<div class="mb-6 flex items-center justify-between">
<h1 class="text-2xl font-semibold">Departments</h1>
@if(app(\App\Services\Qms\QmsPermissions::class)->can(app(\App\Services\Qms\OrganizationResolver::class)->memberFor(auth()->user()), 'admin.departments.manage'))
<a href="{{ route('qms.departments.create') }}" class="btn-primary">New department</a>
@endif
</div>
@include('partials.flash')
<div class="overflow-hidden rounded-2xl border bg-white dark:border-slate-700 dark:bg-slate-900">
<table class="min-w-full divide-y divide-slate-200">
<thead class="bg-slate-50"><tr>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Name</th>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Branch</th>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Type</th>
<th></th>
</tr></thead>
<tbody class="divide-y divide-slate-200">
@forelse ($departments as $department)
<tr>
<td class="px-4 py-3 text-sm">{{ $department->name }}</td>
<td class="px-4 py-3 text-sm">{{ $department->branch?->name }}</td>
<td class="px-4 py-3 text-sm">{{ $types[$department->type] ?? $department->type }}</td>
<td class="px-4 py-3 text-right"><a href="{{ route('qms.departments.edit', $department) }}" class="text-sm text-indigo-600">Edit</a></td>
</tr>
@empty
<tr><td colspan="4" class="px-6 py-12 text-center text-sm text-slate-500">No departments.</td></tr>
@endforelse
</tbody>
</table>
</div>
</x-app-layout>
@@ -0,0 +1,16 @@
<x-app-layout title="Add member">
<div class="mx-auto max-w-lg">
<h1 class="text-2xl font-semibold">Add team member</h1>
<form method="POST" action="{{ route('qms.members.store') }}" class="mt-6 space-y-4 rounded-2xl border bg-white p-6">
@csrf
<div><label class="block text-sm font-medium">Platform user ref (public_id)</label><input name="user_ref" required class="mt-1 w-full rounded-lg border-slate-300 text-sm font-mono"></div>
<div><label class="block text-sm font-medium">Role</label>
<select name="role" required class="mt-1 w-full rounded-lg border-slate-300 text-sm">@foreach ($roles as $v => $l)<option value="{{ $v }}">{{ $l }}</option>@endforeach</select>
</div>
<div><label class="block text-sm font-medium">Branch scope (optional)</label>
<select name="branch_id" class="mt-1 w-full rounded-lg border-slate-300 text-sm"><option value="">Organization-wide</option>@foreach ($branches as $b)<option value="{{ $b->id }}">{{ $b->name }}</option>@endforeach</select>
</div>
<button type="submit" class="btn-primary w-full">Save member</button>
</form>
</div>
</x-app-layout>
@@ -0,0 +1,33 @@
<x-app-layout title="Team">
<div class="mb-6 flex items-center justify-between">
<h1 class="text-2xl font-semibold">Team members</h1>
@if(app(\App\Services\Qms\QmsPermissions::class)->can(app(\App\Services\Qms\OrganizationResolver::class)->memberFor(auth()->user()), 'admin.members.manage'))
<a href="{{ route('qms.members.create') }}" class="btn-primary">Add member</a>
@endif
</div>
@include('partials.flash')
<div class="overflow-hidden rounded-2xl border bg-white dark:border-slate-700 dark:bg-slate-900">
<table class="min-w-full divide-y divide-slate-200">
<thead class="bg-slate-50"><tr>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">User ref</th>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Role</th>
<th class="px-4 py-3 text-left text-xs font-semibold uppercase text-slate-500">Branch</th>
<th></th>
</tr></thead>
<tbody class="divide-y divide-slate-200">
@foreach ($members as $member)
<tr>
<td class="px-4 py-3 text-sm font-mono text-xs">{{ $member->user_ref }}</td>
<td class="px-4 py-3 text-sm">{{ $roles[$member->role] ?? $member->role }}</td>
<td class="px-4 py-3 text-sm">{{ $member->branch?->name ?? 'All' }}</td>
<td class="px-4 py-3 text-right">
@if ($member->user_ref !== auth()->user()->public_id)
<form method="POST" action="{{ route('qms.members.destroy', $member) }}">@csrf @method('DELETE')<button class="text-xs text-red-600">Remove</button></form>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</x-app-layout>