@extends('dashboard.body.main') @section('container')
{{-- Encabezado & Filtro de Fechas --}}

Reportes & Analítica de Ventas

Métricas financieras, costos, márgenes netos y rendimiento de caja en tiempo real.

{{-- Filtros de Fechas, Cajero y Exportación --}}
{{-- Selector de Cajero --}}
@if($filter == 'custom') @endif
{{-- Filtro de período rápido --}} {{-- Botón Exportar CSV --}} Exportar
{{-- 4 Tarjetas KPI Financieras Avanzadas --}}
Ventas Brutas Totales

${{ number_format($totalSales, 0, ',', '.') }}

{{ $salesCount }} tickets emitidos
Costo Mercadería (COGS)

${{ number_format($totalCost, 0, ',', '.') }}

Costo base de adquisición
Utilidad Neta (Ganancia)

${{ number_format($netProfit, 0, ',', '.') }}

Margen Neto: {{ $totalSales > 0 ? round(($netProfit / $totalSales) * 100, 1) : 0 }}%
Ticket Promedio

${{ number_format($averageTicket, 0, ',', '.') }}

Consumo medio por compra
{{-- Desglose por Método de Pago & Ventas por Categoría --}}
Métodos de Recaudación
Efectivo Caja física
${{ number_format($paymentCash, 0, ',', '.') }}
Tarjeta / Débito Terminales transbanco
${{ number_format($paymentCard, 0, ',', '.') }}
Transferencias Conciliación bancaria
${{ number_format($paymentDue, 0, ',', '.') }}
Productos Comunes Ventas sin código de barras
${{ number_format($totalCommonSales, 0, ',', '.') }}
{{-- Rendimiento de Categorías en Supermercado --}}
Ventas por Departamento / Categoría
@forelse($salesByCategory as $cat) @php $percentage = $totalSales > 0 ? round(($cat->total_sales / $totalSales) * 100, 1) : 0; @endphp
{{ $cat->category_name }} ${{ number_format($cat->total_sales, 0, ',', '.') }} ({{ $percentage }}%)
@empty
No se registran ventas para categorizar todavía.
@endforelse
{{-- Top Productos & Alertas de Reabastecimiento Crítico --}}
Productos Más Vendidos en el Período
@forelse($topProducts as $item) @empty @endforelse
Ranking Producto Unidades Vendidas Recaudación ($)
#{{ $loop->iteration }} {{ $item->product->product_name ?? 'Producto eliminado' }} {{ $item->total_qty }} uds ${{ number_format($item->total_revenue, 0, ',', '.') }}
Sin transacciones registradas en el período.
Alertas de Stock Crítico (Reabastecer)
@forelse($criticalStockProducts as $p)
@if($p->product_image) @else @endif
{{ $p->product_name }} {{ $p->product_code }}
{{ $p->product_store == 0 ? 'Agotado' : $p->product_store . ' uds' }}
@empty
Todo el inventario está sobre los niveles mínimos.
@endforelse
{{-- Top Productos Comunes (sin código de barras) --}} @if($topCommonProducts->count() > 0)
Productos Comunes Más Vendidos (Sin Código)
@foreach($topCommonProducts as $item) @endforeach
Ranking Producto Unidades Vendidas Recaudación ($)
#{{ $loop->iteration }} {{ $item->custom_product_name }} {{ $item->total_qty }} uds ${{ number_format($item->total_revenue, 0, ',', '.') }}
@endif {{-- Tabla de Historial de Ventas Recientes --}}
Transacciones de Venta en el Período
@forelse($orders as $order) @empty @endforelse
Factura / N° Ticket Fecha y Hora Cliente Cajero Método de Pago Monto Cobrado Estado Ticket
#{{ $order->invoice_no }} {{ Carbon\Carbon::parse($order->order_date)->format('d/m/Y') }} {{ $order->created_at ? $order->created_at->format('H:i') : '' }} {{ $order->customer->name ?? 'Cliente General' }} {{ $order->user->name ?? 'Sistema' }} {{ $order->payment_status == 'HandCash' ? 'Efectivo' : ($order->payment_status == 'Tarjeta' ? 'Tarjeta' : ($order->payment_status == 'Transferencia' ? 'Transferencia' : $order->payment_status)) }} ${{ number_format($order->total, 0, ',', '.') }} Pagado
No se registran transacciones de venta en los filtros seleccionados.
{{ $orders->links() }}
{{-- Tabla de Auditoría de Cierres de Caja --}}
Auditoría de Cierres & Arqueos de Caja
@forelse($cashShifts as $shift) @php $expectedTotalCash = $shift->opening_balance + $shift->expected_cash; @endphp @empty @endforelse
ID Turno Cajero Apertura Cierre Monto Inicial Venta Efectivo Venta Tarjeta Venta Transf. Esperado Contado Real Diferencia Estado Reporte
#{{ str_pad($shift->id, 6, '0', STR_PAD_LEFT) }} {{ $shift->user->name }} {{ $shift->opened_at->format('d/m/Y H:i') }} {{ $shift->closed_at ? $shift->closed_at->format('d/m/Y H:i') : '-' }} ${{ number_format($shift->opening_balance, 0, ',', '.') }} ${{ number_format($shift->expected_cash, 0, ',', '.') }} ${{ number_format($shift->expected_card, 0, ',', '.') }} ${{ number_format($shift->expected_transfer, 0, ',', '.') }} ${{ number_format($expectedTotalCash, 0, ',', '.') }} ${{ number_format($shift->actual_cash, 0, ',', '.') }} @if($shift->discrepancy > 0)+@endif${{ number_format($shift->discrepancy, 0, ',', '.') }} @if($shift->status === 'open') Abierta @else Cerrada @endif @if($shift->status === 'closed') Imprimir Z @else - @endif
No se registran arqueos o cierres de caja en el período.
{{ $cashShifts->links() }}
@endsection