@extends('layouts.app') @section('title', 'Dashboard - ERP-PLUS') @section('page_title', 'Dashboard') @section('page_subtitle', 'Manifesto do Destinatario NF-e — visao geral do sistema.') @section('page_actions') Cadastrar empresa Consultar NSU @endsection @push('styles') @endpush @php $rawDays = max(10, (int) (\App\Models\Setting::get('xml_deadline_days') ?? 90)); @endphp @section('content') {{-- Top alert bar: critical system-wide issues --}} @php $criticalAlerts = 0; if ($companiesNoCert->isNotEmpty()) $criticalAlerts += $companiesNoCert->count(); if ($companiesNeverSynced->isNotEmpty()) $criticalAlerts += $companiesNeverSynced->count(); if ($expiredDocsCount > 0) $criticalAlerts += $expiredDocsCount; @endphp @if ($pendingCharges->isNotEmpty() && auth()->user()->role === \App\Models\User::ROLE_OPERATOR && auth()->id() !== 1)

Cobranças pendentes

Voce tem {{ $pendingCharges->count() }} cobrança(s) aguardando pagamento.
Ver todas
@foreach ($pendingCharges as $charge)
R$ {{ number_format((float) $charge->amount, 2, ',', '.') }} — {{ $charge->subscription?->plan?->name ?? 'Plano' }} @if ($charge->company) • {{ $charge->company->name }} @endif
Vencimento: {{ $charge->due_date?->format('d/m/Y') ?? '-' }}
@if ($charge->invoice_url) Pagar agora @endif
@endforeach
@endif @if ($criticalAlerts > 0 || $expiringCerts->isNotEmpty())

@if ($criticalAlerts > 0) ⚠ {{ $criticalAlerts }} {{ $criticalAlerts === 1 ? 'problema critico requer atencao' : 'problemas criticos requerem atencao' }} @else ⚠ Alertas @endif

Itens que impactam o funcionamento do sistema.
@if ($companiesNoCert->isNotEmpty())
Empresas sem certificado digital ativo
@foreach ($companiesNoCert as $c) {{ $c->name }}@if (!$loop->last), @endif @endforeach — impossivel consultar SEFAZ sem certificado.
Resolver
@endif @if ($companiesNeverSynced->isNotEmpty())
Empresas que nunca consultaram NSU
@foreach ($companiesNeverSynced as $c) {{ $c->name }}@if (!$loop->last), @endif @endforeach — nenhum documento recebido ainda.
Consultar
@endif @if ($expiredDocsCount > 0)
{{ $expiredDocsCount }} NF-e{{ $expiredDocsCount > 1 ? 's' : '' }} com prazo de {{ $rawDays }} dias vencido
Sem manifestacao conclusiva — risco fiscal para as empresas envolvidas.
Ver
@endif @if ($expiringCerts->isNotEmpty())
{{ $expiringCerts->count() }} certificado{{ $expiringCerts->count() > 1 ? 's' : '' }} vencendo em 30 dias
@foreach ($expiringCerts as $cert) {{ $cert->company->name }} ({{ $cert->valid_until->format('d/m/Y') }})@if (!$loop->last), @endif @endforeach
Renovar
@endif
@endif {{-- Info notices --}} @php $dlStart = now()->subDays($rawDays)->format('d/m/Y'); $dlEnd = now()->format('d/m/Y'); @endphp

ⓘ Periodo de consulta

Dados disponiveis de {{ $dlStart }} ate {{ $dlEnd }} (prazo configurado de {{ $rawDays }} dias).

ⓘ Disponibilidade dos XMLs

Mesmo que a NF-e conste na relacao, nao ha garantia de que o XML completo esteja disponivel para download devido a regras nacionais e estaduais da SEFAZ. O sistema disponibiliza uma ferramenta de upload manual para manter os dados atualizados.
{{-- Metric strip --}}
Total NF-es
{{ number_format($totalDocs) }}
{{ $companies->count() }} {{ $companies->count() === 1 ? 'empresa' : 'empresas' }} cadastradas
Ciencia pendente
{{ number_format($pendingCiencia) }}
{{ $pendingCiencia > 0 ? 'Aguardam manifestacao' : 'Tudo manifestado' }}
XML completo
{{ number_format($xmlDownloaded) }}
{{ $completionRate }}% dos documentos · {{ number_format($pendingXmlCount) }} pendentes
NF-es emitidas
{{ number_format($outgoingCount) }}
{{ $outgoingCount > 0 ? 'Documentos de saida' : 'Nenhuma emitida' }}
Manifestacoes
{{ number_format($manifestationsCount) }}
Eventos enviados a SEFAZ
Armazenamento
{{ $storageUsed }}
XMLs armazenados no banco
{{-- Main grid --}}
{{-- Company health --}}

Saude das empresas

Status operacional por empresa — certificado, NSU e XML.
Gerenciar
@if ($companies->isEmpty())
Nenhuma empresa cadastrada. Cadastrar agora
@else @php $healthClass = function ($company) { $cert = $company->certificates->firstWhere('is_active', true); if (! $cert) return 'metric-danger'; if ($cert->valid_until && $cert->valid_until->isPast()) return 'metric-danger'; $neverSynced = ! $company->nsuCursor || ((int) $company->nsuCursor->ult_nsu) === 0; if ($neverSynced) return 'metric-warn'; if ($cert->valid_until && $cert->valid_until->lt(now()->addDays(30))) return 'metric-warn'; return 'metric-ok'; }; $healthLabel = function ($company) { $cert = $company->certificates->firstWhere('is_active', true); if (! $cert) return 'Sem certificado'; if ($cert->valid_until && $cert->valid_until->isPast()) return 'Cert. vencido'; $neverSynced = ! $company->nsuCursor || ((int) $company->nsuCursor->ult_nsu) === 0; if ($neverSynced) return 'Nunca consultou'; if ($cert->valid_until && $cert->valid_until->lt(now()->addDays(30))) return 'Cert. expirando'; return 'OK'; }; $healthPill = function ($company) { $cert = $company->certificates->firstWhere('is_active', true); if (! $cert) return 'pill'; if ($cert->valid_until && $cert->valid_until->isPast()) return 'pill'; $neverSynced = ! $company->nsuCursor || ((int) $company->nsuCursor->ult_nsu) === 0; if ($neverSynced) return 'pill warn'; if ($cert->valid_until && $cert->valid_until->lt(now()->addDays(30))) return 'pill warn'; return 'pill ok'; }; @endphp
Empresa Saude NF-es Documentos Ultima consulta
@foreach ($companies as $company) @php $cert = $company->certificates->firstWhere('is_active', true); $companyPendingCiencia = $company->nfeDocuments()->whereDoesntHave('manifestations', fn ($q) => $q ->where('event_code', \App\Models\NfeManifestation::EVENT_CIENCIA_OPERACAO) ->whereIn('response_status_code', ['135', '136', '573']) )->count(); @endphp
{{ $company->name }}
{{ $company->cnpj }} · {{ $company->uf }}
{{ $healthLabel($company) }}
{{ number_format($company->nfe_documents_count) }}
@if ($companyPendingCiencia > 0) {{ number_format($companyPendingCiencia) }} sem ciencia @else Tudo ok @endif
{{ $company->nsuCursor?->last_query_at?->diffForHumans() ?? 'Nunca' }}
@endforeach @endif
{{-- Alerts --}}
{{-- Action items --}}

Itens de acao

O que precisa de atencao agora.
Ciencia pendente
{{ number_format($pendingCiencia) }} NF-{{ $pendingCiencia > 1 ? 'es' : 'e' }} sem ciencia da operacao
Manifestar
XML pendente de download
{{ number_format($pendingXmlCount) }} NF-{{ $pendingXmlCount > 1 ? 'es' : 'e' }} com ciencia mas sem XML completo
Baixar
Documentos de saida
{{ number_format($outgoingCount) }} NF-{{ $outgoingCount > 1 ? 'es' : 'e' }} emitidas para suas empresas
Ver
@if ($recentUploadsCount > 0)
Uploads recentes (7 dias)
{{ number_format($recentUploadsCount) }} XML{{ $recentUploadsCount > 1 ? 's' : '' }} importados manualmente
{{ $recentUploadsCount }}
@endif
Armazenamento total
{{ $storageUsed }} em XMLs de entrada e saida
{{-- Expiring certificates --}}

Certificados vencendo

Proximos 30 dias.
@if ($expiringCerts->isNotEmpty()) {{ $expiringCerts->count() }} @endif
@forelse ($expiringCerts as $cert)