user()?->cannot('update', $ticket)) { throw new AuthorizationException; } $validated = $request->validate([ 'minutes' => ['required', 'integer', 'min:1', 'max:1440'], 'description' => ['nullable', 'string', 'max:1000'], ]); $minutes = (int) $validated['minutes']; $description = $validated['description'] ?? null; $loggedAt = now(); DB::transaction(function () use ($ticket, $request, $minutes, $description, $loggedAt): void { $this->updateTicketActivity($ticket, $minutes, $loggedAt); $this->storeLegacyTimeLog($ticket, $request, $minutes, $description, $loggedAt); $this->storeTicketTimeLog($ticket, $request, $minutes, $description, $loggedAt); }); return redirect() ->route('helpdesk.tickets.show', $ticket) ->with('ticket-action-updated', 'Time logged successfully.'); } private function updateTicketActivity(Ticket $ticket, int $minutes, $loggedAt): void { if (Schema::hasColumn($ticket->getTable(), 'time_spent_minutes')) { $ticket->increment('time_spent_minutes', $minutes, ['last_activity_at' => $loggedAt]); } elseif (Schema::hasColumn($ticket->getTable(), 'last_activity_at')) { $ticket->forceFill(['last_activity_at' => $loggedAt])->save(); } } private function storeLegacyTimeLog(Ticket $ticket, Request $request, int $minutes, ?string $description, $loggedAt): void { if (! Schema::hasTable('helpdesk_time_logs')) { return; } DB::table('helpdesk_time_logs')->insert([ 'ticket_id' => $ticket->getKey(), 'user_id' => $request->user()->getKey(), 'minutes' => $minutes, 'description' => $description, 'logged_at' => $loggedAt, 'created_at' => $loggedAt, 'updated_at' => $loggedAt, ]); } private function storeTicketTimeLog(Ticket $ticket, Request $request, int $minutes, ?string $description, $loggedAt): void { if (! Schema::hasTable('helpdesk_ticket_time_logs')) { return; } $payload = [ 'ticket_id' => $ticket->getKey(), 'user_id' => $request->user()->getKey(), 'minutes' => $minutes, 'description' => $description, 'created_at' => $loggedAt, 'updated_at' => $loggedAt, ]; $optional = [ 'started_at' => $loggedAt->copy()->subMinutes($minutes), 'ended_at' => $loggedAt, 'logged_at' => $loggedAt, 'duration_seconds' => $minutes * 60, 'seconds' => $minutes * 60, ]; foreach ($optional as $column => $value) { if (Schema::hasColumn('helpdesk_ticket_time_logs', $column)) { $payload[$column] = $value; } } DB::table('helpdesk_ticket_time_logs')->insert($payload); } }