@extends('layouts.app') @section('title', 'View Reseller Ticket') @section('content') @php use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\DB; @endphp

Ticket: {{ $resellerTicket->ticket_number }}

Edit
Assigned
@if($assignments && $assignments->count() > 0)
@foreach($assignments as $index => $assignment) @endforeach
# Employee Name Phone Department Assigned By Issue Assigned At Status Notes Created At Updated At Solved by
{{ $index + 1 }} {{ $assignment->employee_name ?? 'N/A' }} {{ $assignment->employee_phone ?? 'N/A' }} @if($assignment->department_name) {{ $assignment->department_name }} @else N/A @endif {{ $assignment->assigned_by_name ?? 'N/A' }} @php $restrictedStatuses = ['upstream_issues', 'pop_issues', 'transmission_issues']; $statusLabels = [ 'upstream_issues' => 'Upstream Issues', 'pop_issues' => 'POP Issues', 'transmission_issues' => 'Transmission Issues' ]; $statusColors = [ 'upstream_issues' => '#007bff', 'pop_issues' => '#fd7e14', 'transmission_issues' => '#6f42c1' ]; @endphp @if(in_array($resellerTicket->status, $restrictedStatuses)) @php $issueLabel = $statusLabels[$resellerTicket->status] ?? ucfirst(str_replace('_', ' ', $resellerTicket->status)); $popName = $resellerTicket->isp && $resellerTicket->isp->name ? $resellerTicket->isp->name : null; $displayText = $popName ? $issueLabel . ' (' . $popName . ')' : $issueLabel; @endphp {{ $displayText }} @else N/A @endif @if($assignment->assigned_at) @php $assignedAt = \Carbon\Carbon::parse($assignment->assigned_at); $isResolvedOrClosed = in_array($resellerTicket->status, ['resolved', 'closed']); $isActive = $assignment->is_active ?? false; if ($isResolvedOrClosed && ($resellerTicket->resolved_at || $resellerTicket->closed_at)) { // For resolved/closed tickets, show duration from assigned_at to resolved/closed time $endAt = \Carbon\Carbon::parse($resellerTicket->resolved_at ?? $resellerTicket->closed_at); $diff = $assignedAt->diff($endAt); $duration = sprintf('%dd:%dh:%dm:%ds', $diff->days, $diff->h, $diff->i, $diff->s ); $isLive = false; } elseif ($isActive) { // For active assignments, calculate duration from assigned_at to now (will be updated by JavaScript) $now = now(); $diff = $assignedAt->diff($now); $duration = sprintf('%dd:%dh:%dm:%ds', $diff->days, $diff->h, $diff->i, $diff->s ); $isLive = true; } else { // For inactive assignments, show static duration from assigned_at to updated_at (when it became inactive) $updatedAt = \Carbon\Carbon::parse($assignment->updated_at); $diff = $assignedAt->diff($updatedAt); $duration = sprintf('%dd:%dh:%dm:%ds', $diff->days, $diff->h, $diff->i, $diff->s ); $isLive = false; } @endphp {{ $duration }} @else N/A @endif @php $isResolvedOrClosed = in_array($resellerTicket->status, ['resolved', 'closed']); $isActive = $assignment->is_active ?? false; @endphp @if($isResolvedOrClosed && $isActive) Solved @elseif($isActive) Active @else Inactive @endif @if($assignment->notes) {{ Str::limit($assignment->notes, 50) }} @else - @endif @if($assignment->created_at) {{ \Carbon\Carbon::parse($assignment->created_at)->format('Y-m-d H:i:s') }} @else N/A @endif @if($assignment->updated_at) {{ \Carbon\Carbon::parse($assignment->updated_at)->format('Y-m-d H:i:s') }} @else N/A @endif @php $isSolved = $resellerTicket->resolved_at || $resellerTicket->status === 'resolved' || $resellerTicket->status === 'closed'; $isActive = $assignment->is_active ?? false; // Check if this assignment was the one that solved the ticket // If ticket is solved and this assignment was active when solved, or was the last active assignment $solvedByEmployee = null; if ($isSolved) { // If this assignment is active and ticket is solved, this employee solved it if ($isActive) { $solvedByEmployee = $assignment->employee_name ?? 'N/A'; } else { // Check if this was the last active assignment before ticket was solved $resolvedAt = $resellerTicket->resolved_at ?? ($resellerTicket->closed_at ?? now()); $assignmentUpdatedAt = $assignment->updated_at ? \Carbon\Carbon::parse($assignment->updated_at) : null; // If assignment was deactivated around the time ticket was solved, this employee likely solved it if ($assignmentUpdatedAt && $assignmentUpdatedAt->diffInMinutes($resolvedAt) <= 5) { $solvedByEmployee = $assignment->employee_name ?? 'N/A'; } } } @endphp @if($solvedByEmployee) {{ $solvedByEmployee }} @else - @endif
@else
No assignment records found for this ticket.
@endif
Ticket Details

{{ $resellerTicket->subject }}


{{ $resellerTicket->description }}

@if($resellerTicket->resolution_notes)
Resolution Notes:

{{ $resellerTicket->resolution_notes }}

@endif @if($resellerTicket->notes)
Additional Notes:

{{ $resellerTicket->notes }}

@endif @if($resellerTicket->attachments && $resellerTicket->attachments->count() > 0)
Attachments ({{ $resellerTicket->attachments->count() }})
@foreach($resellerTicket->attachments as $attachment)
@if($attachment->isImage()) {{ $attachment->file_name }} @else
@endif
{{ $attachment->file_name }} {{ number_format($attachment->file_size / 1024, 2) }} KB @if($attachment->uploadedBy) {{ $attachment->uploadedBy->name }} @endif {{ $attachment->created_at->format('d M Y H:i') }}
@endforeach
@endif
@if(!isset($isReseller) || !$isReseller)
Conversations
@if($resellerTicket->conversations && $resellerTicket->conversations->count() > 0) @php $colors = ['#007bff', '#28a745', '#ffc107', '#dc3545', '#17a2b8', '#6f42c1', '#e83e8c', '#fd7e14', '#20c997', '#6c757d']; $userColorMap = []; $colorIndex = 0; @endphp @foreach($resellerTicket->conversations as $conversation) @php if (!isset($userColorMap[$conversation->user->name ?? 'N/A'])) { $userColorMap[$conversation->user->name ?? 'N/A'] = $colors[$colorIndex % count($colors)]; $colorIndex++; } $userColor = $userColorMap[$conversation->user->name ?? 'N/A']; @endphp
{{ $conversation->user->name ?? 'N/A' }} Posted On: {{ $conversation->created_at->format('d M Y h:i A') }}
{{ $conversation->comment ?? '' }}
@if($conversation->attachment)
Attachment
@endif
@endforeach @else
No conversations yet.
@endif
@endif
Client Conversations
@if($resellerTicket->resellerMessages && $resellerTicket->resellerMessages->count() > 0) @php $colors = ['#007bff', '#28a745', '#ffc107', '#dc3545', '#17a2b8', '#6f42c1', '#e83e8c', '#fd7e14', '#20c997', '#6c757d']; $userColorMap = []; $colorIndex = 0; @endphp @foreach($resellerTicket->resellerMessages->sortBy('created_at') as $message) @php $senderName = 'N/A'; $isResellerSender = false; // Check if sender is the ticket owner (reseller/client) $isResellerSender = ($message->reseller_id === $resellerTicket->user_id); // Determine sender name if ($message->reseller) { $senderName = $message->reseller->name ?? ($message->reseller->company_name ?? 'N/A'); } else { // Fallback: try to get sender from user table $senderUser = \App\Models\User::find($message->reseller_id); if ($senderUser) { $senderName = $senderUser->name ?? ($senderUser->company_name ?? 'N/A'); } } // Assign color to sender if (!isset($userColorMap[$senderName])) { $userColorMap[$senderName] = $colors[$colorIndex % count($colors)]; $colorIndex++; } $userColor = $userColorMap[$senderName]; // Determine border color and alignment based on sender type $borderColor = $isResellerSender ? '#28a745' : '#17a2b8'; $alignment = $isResellerSender ? 'flex-end' : 'flex-start'; $textAlign = $isResellerSender ? 'text-right' : 'text-left'; $borderStyle = $isResellerSender ? 'border-right: 4px solid ' . $borderColor . ';' : 'border-left: 4px solid ' . $borderColor . ';'; @endphp
@if(!$isResellerSender) @endif
{{ $senderName }} @if($isResellerSender) Client @else Support @endif {{ $message->created_at->format('d M Y h:i A') }}
@if($isResellerSender) @endif
{{ $message->message ?? '' }}
@if($message->attachment) @php $isImage = $message->isImage(); $attachmentUrl = route('reseller-tickets.messages.view', $message); $downloadUrl = route('reseller-tickets.messages.download', $message); @endphp @endif
@endforeach @else
No client conversations yet.
@endif
Ticket Information
@if($resellerTicket->resolved_at) @endif @if($resellerTicket->closed_at) @endif @php $isSolved = $resellerTicket->resolved_at || $resellerTicket->status === 'resolved' || $resellerTicket->status === 'closed'; $solvedByEmployee = null; if ($isSolved) { // Find the employee who had the active assignment when ticket was solved $resolvedAt = $resellerTicket->resolved_at ?? ($resellerTicket->closed_at ?? now()); // Find assignment that was active before resolution and deactivated around resolution time $solvedAssignment = DB::table('reseller_ticket_employee_assignments') ->where('reseller_ticket_id', $resellerTicket->id) ->where('is_active', false) ->whereNotNull('assigned_at') ->orderBy('updated_at', 'desc') ->first(); if ($solvedAssignment) { $solvedEmployee = DB::table('employees') ->where('id', $solvedAssignment->employee_id) ->first(); $solvedByEmployee = $solvedEmployee ? $solvedEmployee->name : null; } // If not found, try to find any employee who had assignment for this ticket if (!$solvedByEmployee) { $anyAssignment = DB::table('reseller_ticket_employee_assignments') ->where('reseller_ticket_id', $resellerTicket->id) ->orderBy('updated_at', 'desc') ->first(); if ($anyAssignment) { $anyEmployee = DB::table('employees') ->where('id', $anyAssignment->employee_id) ->first(); $solvedByEmployee = $anyEmployee ? $anyEmployee->name : null; } } } @endphp @if($isSolved) @endif
Ticket Number: {{ $resellerTicket->ticket_number }}
Ticket Created Duration: @php $createdAt = \Carbon\Carbon::parse($resellerTicket->created_at); $isResolvedOrClosed = in_array($resellerTicket->status, ['resolved', 'closed']); if ($isResolvedOrClosed && ($resellerTicket->resolved_at || $resellerTicket->closed_at)) { // For resolved/closed tickets, show duration from creation to resolved/closed time $endAt = \Carbon\Carbon::parse($resellerTicket->resolved_at ?? $resellerTicket->closed_at); $diff = $createdAt->diff($endAt); $duration = sprintf('%dd:%dh:%dm:%ds', $diff->days, $diff->h, $diff->i, $diff->s ); $isLive = false; } else { // For active tickets, calculate duration from creation to now (will be updated by JavaScript) $now = now(); $diff = $createdAt->diff($now); $duration = sprintf('%dd:%dh:%dm:%ds', $diff->days, $diff->h, $diff->i, $diff->s ); $isLive = true; } @endphp {{ $duration }}
Status: {{ ucfirst(str_replace('_', ' ', $resellerTicket->status)) }}
Priority: {{ ucfirst($resellerTicket->priority) }}
Category: {{ $resellerTicket->category->name ?? 'N/A' }}
Sub Category: {{ $resellerTicket->subcategory->name ?? 'N/A' }}
Reseller: @if($resellerTicket->user->reseller && $resellerTicket->user->reseller->name) {{ $resellerTicket->user->reseller->name }} @elseif($resellerTicket->user->company_name) {{ $resellerTicket->user->company_name }} @else {{ $resellerTicket->user->name ?? 'N/A' }} @endif
Name: {{ $resellerTicket->user->name ?? 'N/A' }}
Phone Number: {{ $resellerTicket->user->phone ?? 'N/A' }}
Complained Number: {{ $resellerTicket->complained_number ?? 'N/A' }}
Level: @if($resellerTicket->assignedEmployees && $resellerTicket->assignedEmployees->count() > 0) @foreach($resellerTicket->assignedEmployees as $employee) {{ $employee->name }} ({{ $employee->employee_id ?? 'N/A' }}) @endforeach @else Unassigned @endif
Created By: {{ $resellerTicket->createdBy->name ?? 'N/A' }}
Created At: {{ $resellerTicket->created_at->format('Y-m-d H:i:s') }}
Resolved At: {{ $resellerTicket->resolved_at->format('Y-m-d H:i:s') }}
Closed At: {{ $resellerTicket->closed_at->format('Y-m-d H:i:s') }}
Solved/Closed by: @if($solvedByEmployee) {{ $solvedByEmployee }} @else N/A @endif
Last Updated: {{ $resellerTicket->updated_at->format('Y-m-d H:i:s') }}
@push('scripts') @endpush @endsection