{{-- New-Unity ERP | app/Modules/Sales/Resources/Views/dashboard/index.blade.php | v1.0 | 20/07/2026 --}} {{-- v1.0 — Dashboard de ventas role-based: vista gerencial y vista personal del vendedor. --}} @extends('layouts.vertical', ['pageTitle' => __('sales.dashboard.title')]) @section('page-title')

{{ __('sales.dashboard.title') }} {{ $isManager ? __('sales.dashboard.team_overview') : __('sales.dashboard.my_performance') }}

{{-- Period selector --}}
{{-- Seller filter (managers only) --}} @if($isManager) {{-- Toggle view --}}
@endif
{{ __('sales.dashboard.full_report') }}
@endsection @section('content') {{-- ── KPI Row ── --}}
{{ __('sales.dashboard.pipeline_value') }}
${{ number_format($pipelineValue, 0) }}
{{ $activeOpps->count() }} {{ __('sales.dashboard.active_opportunities') }}
{{ __('sales.dashboard.won_this_period') }}
${{ number_format($wonValue, 0) }}
{{ $wonCount }} {{ __('sales.dashboard.deals_closed') }}
{{ __('sales.dashboard.at_risk') }}
{{ $atRisk->count() }}
{{ __('sales.dashboard.conversion_rate') }}
{{ $conversionRate }}%
{{ $newCustomers }} {{ __('sales.dashboard.new_customers') }}
{{-- ── Pipeline + Team/Personal ── --}}
{{-- Pipeline by stage --}}

{{ __('sales.dashboard.pipeline_by_stage') }}

@php $maxValue = collect($pipeline)->max('value') ?: 1; @endphp @foreach($pipeline as $key => $stage) @if(!in_array($key, ['won','lost']))
{{ $stage['label'] }} {{ $stage['count'] }} · ${{ number_format($stage['value'], 0) }}
@endif @endforeach
{{ __('sales.dashboard.won') }}: ${{ number_format($pipeline['won']['value'] ?? 0, 0) }} {{ __('sales.dashboard.lost') }}: {{ $pipeline['lost']['count'] ?? 0 }}
@if($isManager && !$sellerId) {{-- Team leaderboard --}}

{{ __('sales.dashboard.team_performance') }}

@forelse($teamStats as $i => $ts) @empty @endforelse
# {{ __('sales.dashboard.seller') }} {{ __('sales.dashboard.pipeline') }} {{ __('sales.dashboard.won') }} {{ __('sales.dashboard.opps') }} {{ __('sales.dashboard.done_today') }} {{ __('sales.dashboard.overdue') }}
{{ $i + 1 }}
{{ strtoupper(substr($ts['seller']->name, 0, 2)) }}
{{ $ts['seller']->name }}
${{ number_format($ts['pipeline_value'], 0) }} ${{ number_format($ts['won_value'], 0) }} {{ $ts['opp_count'] }} {{ $ts['activities_done'] }} {{ $ts['overdue'] }} {{ __('sales.dashboard.view') }}
{{ __('sales.dashboard.no_sellers') }}
@else {{-- Personal view: my opportunities --}}

{{ __('sales.dashboard.my_opportunities') }}

@forelse($myOpps as $opp) @php $riskColor = match($opp->risk) { 'high'=>'danger', 'medium'=>'warning', default=>'success' }; $riskLabel = match($opp->risk) { 'high'=>__('sales.dashboard.risk_high'), 'medium'=>__('sales.dashboard.risk_medium'), default=>__('sales.dashboard.risk_low') }; @endphp @empty @endforelse
{{ __('sales.dashboard.opportunity') }} {{ __('sales.dashboard.customer') }} {{ __('sales.dashboard.stage') }} {{ __('sales.dashboard.value') }} {{ __('sales.dashboard.risk') }}
{{ $opp->title }}
{{ $opp->opportunity_number }}
{{ $opp->customer->commercial_name ?? '—' }} {{ $opp->stage_label }} ${{ number_format($opp->estimated_value, 0) }} {{ $riskLabel }} {{ __('sales.dashboard.open') }}
{{ __('sales.dashboard.no_active_opportunities') }}
@endif
{{-- ── Activities + Alerts ── --}}
{{-- Today's activities --}}

{{ __('sales.dashboard.todays_activities') }} {{ $todayActivities->count() }}

@forelse($todayActivities->sortBy('scheduled_at') as $act) @php $tc = match($act->type_color) {'primary'=>'0d6efd','info'=>'0dcaf0','warning'=>'ffc107','success'=>'28a745','dark'=>'212529',default=>'6c757d'}; @endphp
{{ $act->title }}
{{ $act->scheduled_at->format('H:i') }} @if($act->opportunity) · {{ $act->opportunity->opportunity_number }} @endif @if($isManager) · {{ $act->assignedTo->name ?? '' }} @endif
@if(in_array($act->status, ['pending','in_progress'])) @else {{ __('sales.dashboard.done') }} @endif
@empty
{{ __('sales.dashboard.no_activities_today') }}
@endforelse
{{-- Alerts --}}

{{ __('sales.dashboard.alerts_title') }}

{{-- At risk --}}
{{ $atRisk->count() }} {{ __('sales.dashboard.at_risk_short') }}
@forelse($atRisk->take(3) as $opp)
· {{ $opp->opportunity_number }} — {{ Str::limit($opp->title, 28) }}
@empty
{{ __('sales.dashboard.all_clear') }}
@endforelse @if($atRisk->count() > 3) + {{ $atRisk->count() - 3 }} {{ __('sales.dashboard.more') }} @endif
{{-- Overdue activities --}}
{{ $overdueActivities->count() }} {{ __('sales.dashboard.overdue_activities') }}
@forelse($overdueActivities->take(3) as $act)
· {{ $act->title }} ({{ $act->scheduled_at->diffForHumans() }})
@empty
{{ __('sales.dashboard.no_overdue') }}
@endforelse @if($overdueActivities->count() > 3) + {{ $overdueActivities->count() - 3 }} {{ __('sales.dashboard.more') }} @endif
{{-- Pending activities --}}
{{ $pendingActivities->count() }} {{ __('sales.dashboard.pending') }}
{{ __('sales.dashboard.pending_desc') }}
{{ __('sales.dashboard.view_all_arrow') }}
{{-- Expiring quotes --}}
{{ $newCustomers }} {{ __('sales.dashboard.new_customers') }}
{{ __('sales.dashboard.new_customers_added') }}
{{ __('sales.dashboard.view_customers') }}
{{-- Modal: Drill-down --}} @endsection @section('scripts') @endsection