@extends('layouts.app') @section('title', 'Reseller Mapping Details') @section('page-title', 'Reseller Mapping Details') @push('styles') body { background-color: #f8f9fa; } .container-fluid { background-color: #f8f9fa; min-height: 100vh; padding: 20px; } .card { border: none; border-radius: 15px; box-shadow: 0 5px 15px rgba(0,0,0,0.08); margin-bottom: 2rem; } .card-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 15px 15px 0 0; border: none; padding: 1.5rem; } .card-title { font-weight: 600; margin: 0; font-size: 1.3rem; } .card-body { padding: 2rem; } .info-item { display: flex; justify-content: space-between; align-items: center; padding: 0.75rem 0; border-bottom: 1px solid #e9ecef; } .info-item:last-child { border-bottom: none; } .info-label { font-weight: 600; color: #495057; min-width: 150px; } .info-value { color: #6c757d; text-align: right; flex: 1; } .breadcrumb { background: none; padding: 0; margin-bottom: 1.5rem; } .breadcrumb-item a { color: #667eea; text-decoration: none; } .breadcrumb-item a:hover { text-decoration: underline; } .breadcrumb-item.active { color: #6c757d; } .btn-action { border-radius: 8px; padding: 0.5rem 1rem; font-weight: 500; transition: all 0.3s ease; } .btn-action:hover { transform: translateY(-1px); } .network-diagram { background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); border: 2px solid #dee2e6; border-radius: 15px; padding: 40px; min-height: 600px; position: relative; overflow: hidden; } .network-diagram::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient(circle at 20% 30%, rgba(102, 126, 234, 0.1) 0%, transparent 50%), radial-gradient(circle at 80% 70%, rgba(118, 75, 162, 0.1) 0%, transparent 50%); pointer-events: none; } .diagram-container { position: relative; z-index: 1; } .connection-line { position: absolute; background: linear-gradient(to bottom, #667eea, #764ba2); width: 3px; opacity: 0.6; z-index: 0; transition: opacity 0.3s ease; } .connection-line:hover { opacity: 1; width: 4px; } .node { background: white; border: 3px solid #007bff; border-radius: 15px; padding: 20px; margin: 15px; display: inline-block; box-shadow: 0 8px 16px rgba(0,0,0,0.1); min-width: 180px; text-align: center; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); position: relative; z-index: 2; cursor: pointer; } .node:hover { transform: translateY(-5px) scale(1.05); box-shadow: 0 12px 24px rgba(0,0,0,0.2); border-width: 4px; } .node.reseller { border-color: #28a745; background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%); box-shadow: 0 8px 16px rgba(40, 167, 69, 0.2); } .node.reseller:hover { box-shadow: 0 12px 24px rgba(40, 167, 69, 0.3); } .node.reseller i { color: #28a745; animation: pulse 2s infinite; } .node.site { border-color: #007bff; background: linear-gradient(135deg, #d1ecf1 0%, #bee5eb 100%); box-shadow: 0 8px 16px rgba(0, 123, 255, 0.2); } .node.site:hover { box-shadow: 0 12px 24px rgba(0, 123, 255, 0.3); } .node.site i { color: #007bff; } .node.device { border-color: #ffc107; background: linear-gradient(135deg, #fff3cd 0%, #ffeaa7 100%); box-shadow: 0 8px 16px rgba(255, 193, 7, 0.2); } .node.device:hover { box-shadow: 0 12px 24px rgba(255, 193, 7, 0.3); } .node.device i { color: #ffc107; } .node.interface { border-color: #6c757d; background: linear-gradient(135deg, #e9ecef 0%, #dee2e6 100%); font-size: 0.85rem; padding: 10px 15px; min-width: 140px; margin: 8px auto; border-width: 2px; } .node.interface:hover { transform: translateY(-3px) scale(1.03); } .node-icon { font-size: 2.5rem; margin-bottom: 10px; display: block; } .node-title { font-weight: 700; font-size: 1.1rem; margin-bottom: 8px; color: #212529; } .node-subtitle { font-size: 0.9rem; color: #6c757d; margin-top: 5px; } .connection-arrow { color: #667eea; font-size: 2rem; margin: 15px 0; animation: bounce 2s infinite; display: block; } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } .device-group { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-top: 20px; position: relative; } .device-wrapper { position: relative; display: flex; flex-direction: column; align-items: center; } .interface-group { display: flex; flex-direction: column; gap: 8px; margin-top: 15px; width: 100%; } .status-indicator { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: 5px; animation: blink 2s infinite; } .status-indicator.up { background-color: #28a745; box-shadow: 0 0 8px rgba(40, 167, 69, 0.6); } .status-indicator.down { background-color: #dc3545; box-shadow: 0 0 8px rgba(220, 53, 69, 0.6); } .status-indicator.inactive { background-color: #6c757d; } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .empty-state { text-align: center; padding: 60px 20px; color: #6c757d; } .empty-state i { font-size: 4rem; margin-bottom: 20px; opacity: 0.5; } .empty-state p { font-size: 1.1rem; margin-top: 10px; } .stat-card { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 12px; padding: 25px; margin-bottom: 15px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.2s; } .stat-card:hover { transform: translateY(-3px); box-shadow: 0 6px 12px rgba(0,0,0,0.15); } .stat-card h3 { font-size: 2.8rem; margin: 0; font-weight: bold; } .stat-card p { margin: 8px 0 0 0; opacity: 0.95; font-size: 0.95rem; } .report-section { background: white; border-radius: 8px; padding: 20px; margin-top: 20px; } .info-card { border-left: 4px solid #007bff; background: #f8f9fa; padding: 15px; border-radius: 4px; margin-bottom: 15px; } .chart-container { position: relative; height: 300px; margin-top: 20px; } #siteMap { height: 300px; width: 100%; border-radius: 8px; border: 1px solid #dee2e6; } .detail-badge { font-size: 0.85rem; padding: 5px 10px; border-radius: 20px; } .timeline-item { border-left: 3px solid #007bff; padding-left: 20px; margin-bottom: 20px; position: relative; } .timeline-item::before { content: ''; position: absolute; left: -8px; top: 5px; width: 13px; height: 13px; border-radius: 50%; background: #007bff; } @endpush @section('content')
@if($ispResellerMapping->user) {{ $ispResellerMapping->user->name }} @else {{ $ispResellerMapping->reseller_name ?? 'Reseller #' . $ispResellerMapping->reseller_id }} @endif

Reseller Mapping Report & Network Diagram

Edit Back

{{ $stats['total_devices'] }}

Total Devices

{{ $stats['total_interfaces'] }}

Total Interfaces

{{ $stats['active_interfaces'] }}

Active Interfaces

{{ $stats['total_links'] }}

Network Links

Network Topology Diagram
Reseller
@if($ispResellerMapping->user) {{ $ispResellerMapping->user->name }} @if($ispResellerMapping->user->company_name)
{{ $ispResellerMapping->user->company_name }} @endif @else {{ $ispResellerMapping->reseller_name ?? 'N/A' }} @endif
@if($ispResellerMapping->site)
Site
{{ $ispResellerMapping->site->site_name }}
{{ $ispResellerMapping->site->site_type }} @if($ispResellerMapping->site->address)
{{ strlen($ispResellerMapping->site->address) > 40 ? substr($ispResellerMapping->site->address, 0, 40) . '...' : $ispResellerMapping->site->address }} @endif
@if($devices->count() > 0)
@foreach($devices as $device)
{{ $device->device_name ?? 'Device #' . $device->device_id }}
{{ $device->device_type ?? 'N/A' }} @if($device->ip_address)
{{ $device->ip_address }} @endif
@if($device->interfaces->count() > 0)
@foreach($device->interfaces as $interface)
{{ $interface->interface_name ?? 'Interface' }}
{{ ucfirst($interface->status) }}
@if($interface->ip_address) {{ $interface->ip_address }} @endif
@endforeach
@endif
@endforeach
@else

No devices found for this site

@endif @else

No site assigned to this reseller mapping

@endif
@if($ispResellerMapping->site && ($ispResellerMapping->site->latitude && $ispResellerMapping->site->longitude))
Network Topology on Google Map
Site Location: {{ $ispResellerMapping->site->site_name }}
Lat: {{ $ispResellerMapping->site->latitude }}, Lng: {{ $ispResellerMapping->site->longitude }}
Fiber Routes: {{ $fiberRoutes->count() }} route(s) connected
@elseif($ispResellerMapping->site)
Network Topology on Google Map
Site location coordinates are not available. Please add latitude and longitude to the site to view it on the map.
@endif
Reseller Information
Mapping ID: #{{ $ispResellerMapping->reseller_id }}
Reseller: @if($ispResellerMapping->user) {{ $ispResellerMapping->user->name }} @if($ispResellerMapping->user->company_name)
{{ $ispResellerMapping->user->company_name }} @endif @if($ispResellerMapping->user->email)
{{ $ispResellerMapping->user->email }} @endif @if($ispResellerMapping->user->phone)
{{ $ispResellerMapping->user->phone }} @endif @else {{ $ispResellerMapping->reseller_name ?? '-' }} @endif
Site: @if($ispResellerMapping->site) {{ $ispResellerMapping->site->site_name }}
Type: {{ $ispResellerMapping->site->site_type }} @if($ispResellerMapping->site->address)
{{ $ispResellerMapping->site->address }} @endif @else Not assigned @endif
@if($ispResellerMapping->contact_info)
Contact Info: {{ $ispResellerMapping->contact_info }}
@endif
Created At: {{ $ispResellerMapping->created_at->format('M d, Y h:i A') }}
Last Updated: {{ $ispResellerMapping->updated_at->format('M d, Y h:i A') }}
Network Statistics Report
Total Devices: {{ $stats['total_devices'] }}
Total Interfaces: {{ $stats['total_interfaces'] }}
Active Interfaces: {{ $stats['active_interfaces'] }}
Inactive Interfaces: {{ $stats['total_interfaces'] - $stats['active_interfaces'] }}
Network Links: {{ $stats['total_links'] }}
@if($stats['total_capacity_mbps'] > 0)
Total Capacity: {{ number_format($stats['total_capacity_mbps'], 2) }} Mbps
@endif @if($stats['total_interfaces'] > 0)
Interface Status Distribution
Active: {{ $stats['active_interfaces'] }}
Inactive: {{ $stats['total_interfaces'] - $stats['active_interfaces'] }}
@endif
@if($devices->count() > 0)
Devices & Interfaces Details
@foreach($devices as $device) @endforeach
Device Type IP Address MAC Address Interfaces Status
{{ $device->device_name ?? 'Device #' . $device->device_id }} {{ $device->device_type ?? '-' }} {{ $device->ip_address ?? '-' }} {{ $device->mac_address ?? '-' }} @if($device->interfaces->count() > 0) @foreach($device->interfaces as $interface) {{ $interface->interface_name }} ({{ $interface->status }}) @endforeach @else No interfaces @endif @if($device->interfaces->count() > 0) @php $activeCount = $device->interfaces->where('status', 'up')->count(); $totalCount = $device->interfaces->count(); @endphp {{ $activeCount }}/{{ $totalCount }} Active @else N/A @endif
@endif @if($links->count() > 0)
Network Links ({{ $links->count() }})
@foreach($links as $link) @endforeach
From Device From Interface To Device To Interface Capacity Status
{{ $link->fromInterface->device->device_name ?? 'Device #' . $link->fromInterface->device_id }} {{ $link->fromInterface->interface_name ?? '-' }} {{ $link->toInterface->device->device_name ?? 'Device #' . $link->toInterface->device_id }} {{ $link->toInterface->interface_name ?? '-' }} {{ $link->capacity_mbps ? number_format($link->capacity_mbps, 2) . ' Mbps' : '-' }} {{ ucfirst($link->status ?? 'Unknown') }}
@endif @if($fiberRoutes->count() > 0)
Fiber Routes ({{ $fiberRoutes->count() }})
@foreach($fiberRoutes as $route) @endforeach
Route Name Start Site End Site Length (km) Status
{{ $route->route_name ?? 'Route #' . $route->route_id }} {{ $route->startSite->site_name ?? '-' }} {{ $route->endSite->site_name ?? '-' }} {{ $route->length_km ? number_format($route->length_km, 2) . ' km' : '-' }} {{ ucfirst($route->status ?? 'Unknown') }}
@endif
@push('scripts') @endpush @endsection