@extends('layouts.admin')
@section('title', 'Reports')
@section('content')
@php
$tabs = ['growth' => 'Growth', 'marketplace' => 'Marketplace', 'transport' => 'Transport', 'revenue' => 'Revenue', 'quality' => 'Quality', 'content' => 'Content', 'health' => 'Data health'];
$range = ['from' => $from->toDateString(), 'to' => $to->toDateString()];
$pct = fn ($v) => $v === null ? '—' : $v.'%';
$hours = fn ($v) => $v === null ? '—' : round($v, 1).' h';
$empty = '
| No data in this period. |
';
@endphp
@foreach ($tabs as $k => $l)
- {{ $l }}
@endforeach
@switch($tab)
@case('growth')
New users
{{ indian_number($growth['newUsers']) }}
| Role | Active | Pending |
@foreach ($growth['byRole'] as $r)| {{ $r->name }} | {{ $r->active }} | {{ $r->pending }} |
@endforeach
@forelse ($growth['byDistrict'] as $r)| {{ $r->district }} | {{ $r->n }} |
@empty{!! $empty !!}@endforelse
@forelse ($growth['byLanguage'] as $r)| {{ $r->language }} | {{ $r->n }} |
@empty{!! $empty !!}@endforelse
@break
@case('marketplace')
Published in period
{{ indian_number($marketplace['stats']['published']) }}
Enquiry rate (O2, target ≥ 40%)
{{ $pct($marketplace['stats']['enquiry_rate']) }}
Average time to first enquiry
{{ $hours($marketplace['firstEnquiryHours']) }}
| Marketplace | Created | Live | Sold | Expired | Enquiries |
@forelse ($marketplace['byType'] as $r)| {{ $r->name }} | {{ $r->total }} | {{ $r->published }} | {{ $r->sold }} | {{ $r->expired }} | {{ $r->enquiries }} |
@empty{!! $empty !!}@endforelse
| Category | Listings | Enquiries |
@forelse ($marketplace['topCategories'] as $r)| {{ $r->name }} | {{ $r->n }} | {{ $r->enquiries }} |
@empty{!! $empty !!}@endforelse
@break
@case('transport')
Confirmed
{{ $transport['stats']['confirmed'] }}
Completed
{{ $transport['stats']['completed'] }}
Completion (≥ 90%)
{{ $pct($transport['stats']['completion_rate']) }}
On-time pickup (≥ 85%)
{{ $pct($transport['stats']['on_time_rate']) }}
@forelse ($transport['byStatus'] as $sid => $n)| @include('partials.status', ['status' => $sid]) | {{ $n }} |
@empty{!! $empty !!}@endforelse
| Vehicle | Bookings | Avg ₹/km |
@forelse ($transport['byVehicle'] as $r)| {{ $r->vehicle }} | {{ $r->n }} | {{ $r->per_km ? inr($r->per_km, true) : '—' }} |
@empty{!! $empty !!}@endforelse
@forelse ($transport['routes'] as $r)| {{ $r->route }} | {{ $r->n }} |
@empty{!! $empty !!}@endforelse
@forelse ($transport['cancelReasons'] as $r)| {{ $r->label }} | {{ $r->n }} |
@empty{!! $empty !!}@endforelse
@break
@case('revenue')
Transport service fees (O6)
{{ inr($revenue['serviceFees']) }}
completed bookings in period
Cash still to collect
{{ inr($revenue['outstanding']->amount) }}
{{ $revenue['outstanding']->n }} delivered bookings unpaid (all time)
| Method | Payments | Amount |
@forelse ($revenue['byMethod'] as $r)| {{ $r->name }} | {{ $r->n }} | {{ inr($r->amount) }} |
@empty{!! $empty !!}@endforelse
@break
@case('quality')
Average rating (O5, ≥ 4.2)
{{ $quality['trust']['rating'] ?? '—' }}
{{ $quality['trust']['ratings'] }} ratings
Complaints per 100 bookings (≤ 2)
{{ $quality['trust']['complaints_per_100'] ?? '—' }}
Listing moderation turnaround
{{ $hours($quality['moderationHours']) }}
@forelse ($quality['ratings'] as $r)| {{ humanize($r->reviewable_type) }} | {{ round($r->avg, 2) }} ★ ({{ $r->n }}) |
@empty{!! $empty !!}@endforelse
@forelse ($quality['reports'] as $r)| {{ $r->label }} | {{ $r->n }} |
@empty{!! $empty !!}@endforelse
| Category | Tickets | 1st reply |
@forelse ($quality['tickets'] as $r)| {{ $r->label }} | {{ $r->n }} | {{ $hours($r->first_response_h) }} |
@empty{!! $empty !!}@endforelse
@break
@case('content')
Crop alerts in period
{{ $content['alerts'] }}
| Type | Language | Published | Total |
@forelse ($content['articles'] as $r)| {{ $r->type }} | {{ $r->language }} | {{ $r->published }} | {{ $r->total }} |
@empty{!! $empty !!}@endforelse
Crop Guide views need app analytics events; the database does not record article views.
@break
@case('health')
Each check should read 0. Anything else points to a bug in the app or an import; ask engineering to look.
@foreach ($health as [$label, $n])
| {{ $label }} | @if ($n === 0)0@else{{ $n }}@endif |
@endforeach
@break
@endswitch
@endsection