Skip to content

Commit 4f9e24d

Browse files
committed
Normalize ticket statuses and fix ticket creation
- Add STATUS_NEW constant and normalize all status constants to lowercase with underscores - Create ALL_STATUSES, STATUS_LABELS constants for centralized status management - Add helper methods: getStatusValidationRule(), getPriorityValidationRule(), getStatusLabel(), getStatusOptions() - Fix TicketCreate Livewire component to generate ticket numbers and use proper validation - Update all controllers and services to use Ticket model constants instead of hardcoded strings - Make created_by nullable to support portal-created tickets - Add migration to normalize existing ticket status data in database - Update blade templates to use model constants for status comparisons
1 parent 8195d68 commit 4f9e24d

35 files changed

+296
-131
lines changed

app/Domains/Client/Controllers/ClientPortalController.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
use App\Domains\Financial\Models\Invoice;
1111
use App\Domains\Financial\Models\Payment;
1212
use App\Domains\Security\Services\DigitalSignatureService;
13+
use App\Domains\Ticket\Models\Ticket;
14+
use App\Domains\Ticket\Repositories\TicketRepository;
1315
use App\Http\Controllers\Controller;
1416
use Illuminate\Http\Request;
1517
use Illuminate\Support\Facades\Log;
@@ -26,9 +28,14 @@ class ClientPortalController extends Controller
2628

2729
protected DigitalSignatureService $signatureService;
2830

29-
public function __construct(DigitalSignatureService $signatureService)
30-
{
31+
protected TicketRepository $ticketRepository;
32+
33+
public function __construct(
34+
DigitalSignatureService $signatureService,
35+
TicketRepository $ticketRepository
36+
) {
3137
$this->signatureService = $signatureService;
38+
$this->ticketRepository = $ticketRepository;
3239
$this->middleware('guest:client')->only(['showLogin', 'login']);
3340
$this->middleware('auth:client')->except(['showLogin', 'login']);
3441
}
@@ -983,16 +990,19 @@ public function storeTicket(Request $request)
983990
'has_client' => $contact->client ? true : false,
984991
]);
985992

993+
$ticketNumber = $this->ticketRepository->getNextTicketNumber($contact->company_id);
994+
986995
$ticket = $contact->client->tickets()->create([
996+
'number' => $ticketNumber,
987997
'subject' => $request->subject,
988998
'details' => $request->details,
989999
'priority' => $request->priority,
9901000
'category' => $request->category,
991-
'status' => 'Open',
1001+
'status' => Ticket::STATUS_OPEN,
9921002
'contact_id' => $contact->id,
9931003
'company_id' => $contact->company_id,
994-
'source' => 'Portal',
995-
'created_by' => $contact->id, // Use the contact ID who created the ticket
1004+
'source' => Ticket::SOURCE_PORTAL,
1005+
'created_by' => null, // Portal tickets don't have a user creator
9961006
]);
9971007

9981008
\Log::info('Ticket created successfully', ['ticket_id' => $ticket->id]);

app/Domains/Ticket/Controllers/AssignmentController.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace App\Domains\Ticket\Controllers;
44

5+
use App\Domains\Core\Models\User;
56
use App\Domains\Ticket\Models\Ticket;
67
use App\Domains\Ticket\Models\TicketWatcher;
78
use App\Http\Controllers\Controller;
8-
use App\Domains\Core\Models\User;
99
use Illuminate\Http\Request;
1010
use Illuminate\Support\Facades\DB;
1111
use Illuminate\Support\Facades\Validator;
@@ -82,8 +82,8 @@ public function index(Request $request)
8282
->orderBy('name')
8383
->get();
8484

85-
$statuses = ['new', 'open', 'in_progress', 'pending', 'resolved', 'closed'];
86-
$priorities = ['Low', 'Medium', 'High', 'Critical'];
85+
$statuses = Ticket::getAvailableStatuses();
86+
$priorities = Ticket::getAvailablePriorities();
8787

8888
// Get assignment statistics
8989
$stats = $this->getAssignmentStats();
@@ -477,8 +477,8 @@ public function getWorkloadReport(Request $request)
477477
return [
478478
'assignee' => $assignee ? $assignee->name : 'Unassigned',
479479
'total_tickets' => $tickets->count(),
480-
'open_tickets' => $tickets->whereIn('status', ['new', 'open', 'in_progress'])->count(),
481-
'closed_tickets' => $tickets->where('status', 'closed')->count(),
480+
'open_tickets' => $tickets->whereIn('status', [Ticket::STATUS_NEW, Ticket::STATUS_OPEN, Ticket::STATUS_IN_PROGRESS])->count(),
481+
'closed_tickets' => $tickets->where('status', Ticket::STATUS_CLOSED)->count(),
482482
'avg_resolution_time' => $this->calculateAvgResolutionTime($tickets),
483483
'priority_breakdown' => $tickets->groupBy('priority')->map->count(),
484484
'status_breakdown' => $tickets->groupBy('status')->map->count(),
@@ -508,11 +508,11 @@ public function getTeamOverview(Request $request)
508508
->withCount([
509509
'assignedTickets',
510510
'assignedTickets as open_tickets_count' => function ($q) {
511-
$q->whereIn('status', ['new', 'open', 'in_progress']);
511+
$q->whereIn('status', [Ticket::STATUS_NEW, Ticket::STATUS_OPEN, Ticket::STATUS_IN_PROGRESS]);
512512
},
513513
'assignedTickets as overdue_tickets_count' => function ($q) {
514514
$q->where('due_date', '<', now())
515-
->whereNotIn('status', ['closed', 'resolved']);
515+
->whereNotIn('status', [Ticket::STATUS_CLOSED, Ticket::STATUS_RESOLVED]);
516516
},
517517
])
518518
->get();
@@ -720,7 +720,7 @@ private function getTeamMemberIds(): array
720720
*/
721721
private function calculateAvgResolutionTime($tickets)
722722
{
723-
$resolvedTickets = $tickets->whereIn('status', ['resolved', 'closed'])
723+
$resolvedTickets = $tickets->whereIn('status', [Ticket::STATUS_RESOLVED, Ticket::STATUS_CLOSED])
724724
->filter(function ($ticket) {
725725
return $ticket->resolved_at;
726726
});

app/Domains/Ticket/Controllers/CalendarController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace App\Domains\Ticket\Controllers;
44

5+
use App\Domains\Core\Models\User;
56
use App\Domains\Ticket\Models\Ticket;
67
use App\Domains\Ticket\Models\TicketCalendarEvent;
78
use App\Http\Controllers\Controller;
8-
use App\Domains\Core\Models\User;
99
use Carbon\Carbon;
1010
use Illuminate\Http\Request;
1111
use Illuminate\Support\Facades\Validator;

app/Domains/Ticket/Controllers/PriorityQueueController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace App\Domains\Ticket\Controllers;
44

5+
use App\Domains\Core\Models\User;
56
use App\Domains\Ticket\Models\Ticket;
67
use App\Domains\Ticket\Models\TicketPriorityQueue;
78
use App\Http\Controllers\Controller;
8-
use App\Domains\Core\Models\User;
99
use Illuminate\Http\Request;
1010
use Illuminate\Support\Facades\DB;
1111
use Illuminate\Support\Facades\Validator;

app/Domains/Ticket/Controllers/RecurringTicketController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
namespace App\Domains\Ticket\Controllers;
44

5+
use App\Domains\Client\Models\Client;
6+
use App\Domains\Core\Models\User;
57
use App\Domains\Ticket\Models\RecurringTicket;
68
use App\Domains\Ticket\Models\TicketTemplate;
79
use App\Http\Controllers\Controller;
8-
use App\Domains\Client\Models\Client;
9-
use App\Domains\Core\Models\User;
1010
use Carbon\Carbon;
1111
use Illuminate\Http\Request;
1212
use Illuminate\Support\Facades\Validator;

app/Domains/Ticket/Controllers/TemplateController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace App\Domains\Ticket\Controllers;
44

5+
use App\Domains\Core\Models\User;
56
use App\Domains\Ticket\Models\TicketTemplate;
67
use App\Http\Controllers\Controller;
7-
use App\Domains\Core\Models\User;
88
use Illuminate\Http\Request;
99
use Illuminate\Support\Facades\Validator;
1010
use Illuminate\Validation\Rule;

app/Domains/Ticket/Controllers/TicketController.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
namespace App\Domains\Ticket\Controllers;
44

5+
use App\Domains\Client\Models\Client;
56
use App\Domains\Core\Controllers\Traits\UsesSelectedClient;
7+
use App\Domains\Core\Models\User;
68
use App\Domains\Ticket\Models\Ticket;
79
use App\Domains\Ticket\Models\TicketWatcher;
810
use App\Domains\Ticket\Repositories\TicketRepository;
911
use App\Domains\Ticket\Requests\UpdateTicketRequest;
1012
use App\Domains\Ticket\Services\TicketQueryService;
1113
use App\Http\Controllers\Controller;
1214
use App\Http\Requests\StoreTicketRequest;
13-
use App\Domains\Client\Models\Client;
14-
use App\Domains\Core\Models\User;
1515
use App\Traits\FiltersClientsByAssignment;
1616
use Illuminate\Http\Request;
1717
use Illuminate\Support\Facades\DB;
@@ -83,8 +83,8 @@ public function create(Request $request)
8383
$selectedClient = null;
8484
}
8585

86-
$priorities = ['Low', 'Medium', 'High', 'Critical'];
87-
$statuses = ['new', 'open', 'in_progress', 'pending', 'resolved', 'closed'];
86+
$priorities = Ticket::getAvailablePriorities();
87+
$statuses = Ticket::getAvailableStatuses();
8888

8989
return view('tickets.create', compact(
9090
'clients', 'assignees', 'selectedClient', 'priorities', 'statuses'
@@ -108,7 +108,7 @@ public function store(StoreTicketRequest $request)
108108
'subject' => $request->subject,
109109
'details' => $request->details,
110110
'priority' => $request->priority,
111-
'status' => $request->status ?? 'new',
111+
'status' => $request->status ?? Ticket::STATUS_NEW,
112112
'assigned_to' => $request->assigned_to,
113113
'created_by' => $user->id,
114114
'scheduled_at' => $request->scheduled_at,
@@ -246,8 +246,8 @@ public function edit(Ticket $ticket)
246246
->orderBy('name')
247247
->get();
248248

249-
$priorities = ['Low', 'Medium', 'High', 'Critical'];
250-
$statuses = ['new', 'open', 'in_progress', 'pending', 'resolved', 'closed'];
249+
$priorities = Ticket::getAvailablePriorities();
250+
$statuses = Ticket::getAvailableStatuses();
251251

252252
return view('tickets.edit', compact('ticket', 'clients', 'assignees', 'priorities', 'statuses'));
253253
}

app/Domains/Ticket/Controllers/TicketQueueController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public function analytics(Request $request)
138138
$metrics = [
139139
'total_tickets' => Ticket::where('company_id', $companyId)->count(),
140140
'open_tickets' => Ticket::where('company_id', $companyId)
141-
->whereIn('status', ['open', 'in_progress'])->count(),
141+
->whereIn('status', [Ticket::STATUS_OPEN, Ticket::STATUS_IN_PROGRESS])->count(),
142142
'avg_resolution_time' => Ticket::where('company_id', $companyId)
143143
->whereNotNull('resolved_at')
144144
->selectRaw('AVG(EXTRACT(EPOCH FROM (resolved_at - created_at)) / 3600) as avg_hours')

app/Domains/Ticket/Controllers/TicketSearchController.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace App\Domains\Ticket\Controllers;
44

5+
use App\Domains\Core\Models\User;
56
use App\Domains\Ticket\Models\Ticket;
67
use App\Http\Controllers\Controller;
7-
use App\Domains\Core\Models\User;
88
use Illuminate\Http\Request;
99
use Illuminate\Support\Facades\Cache;
1010

@@ -28,13 +28,13 @@ public function search(Request $request)
2828
$ticketsQuery->where('id', '!=', $exclude);
2929
}
3030

31-
$ticketsQuery->where(function ($q) use ($query) {
32-
$q->whereRaw('CAST(number AS TEXT) LIKE ?', ["%{$query}%"])
33-
->orWhere('subject', 'like', "%{$query}%")
34-
->orWhereHas('client', function ($cq) use ($query) {
35-
$cq->where('name', 'like', "%{$query}%");
36-
});
37-
});
31+
$ticketsQuery->where(function ($q) use ($query) {
32+
$q->whereRaw('CAST(number AS TEXT) LIKE ?', ["%{$query}%"])
33+
->orWhere('subject', 'like', "%{$query}%")
34+
->orWhereHas('client', function ($cq) use ($query) {
35+
$cq->where('name', 'like', "%{$query}%");
36+
});
37+
});
3838

3939
$tickets = $ticketsQuery->orderBy('number', 'desc')
4040
->limit(10)

app/Domains/Ticket/Controllers/TicketStatusController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
namespace App\Domains\Ticket\Controllers;
44

5+
use App\Domains\Core\Models\User;
56
use App\Domains\Ticket\Models\Ticket;
67
use App\Domains\Ticket\Models\TicketAssignment;
78
use App\Domains\Ticket\Models\TicketComment;
89
use App\Domains\Ticket\Models\TicketWatcher;
910
use App\Domains\Ticket\Requests\AssignTicketRequest;
1011
use App\Http\Controllers\Controller;
11-
use App\Domains\Core\Models\User;
1212
use Illuminate\Http\Request;
1313
use Illuminate\Support\Facades\Log;
1414
use Illuminate\Support\Facades\Validator;

0 commit comments

Comments
 (0)