cashCloses = $cashCloses; $this->cashCloseIds = $cashCloses->pluck('id')->toArray(); } public function collection() { $data = collect(); // RESUMEN FINANCIERO $totalIncome = $this->cashCloses->sum('income'); $totalExit = $this->cashCloses->sum('exit'); $totalCash = $this->cashCloses->sum('income_cash'); $totalCard = $this->cashCloses->sum('income_card'); $totalTransfer = $this->cashCloses->sum('income_transfer'); $balanceFinal = $this->cashCloses->sum('initial_balance') + $totalIncome - $totalExit; $data->push(['RESUMEN FINANCIERO', '', '', '', '', '']); $data->push(['Periodo Inicio', $this->cashCloses->last()?->opened_at, '', '', '', '']); $data->push(['Periodo Fin', $this->cashCloses->first()?->closed_at, '', '', '', '']); $data->push(['Total Ventas', $totalIncome, '', '', '', '']); $data->push(['Efectivo', $totalCash, '', '', '', '']); $data->push(['Tarjeta', $totalCard, '', '', '', '']); $data->push(['Transferencia', $totalTransfer, '', '', '', '']); $data->push(['Egresos', $totalExit, '', '', '', '']); $data->push(['Balance Final', $balanceFinal, '', '', '', '']); $data->push(['', '', '', '', '', '']); // Espacios // ESTADÍSTICAS POR PAQUETE $packageStats = DB::table('sale_items') ->join('sales', 'sale_items.sale_id', '=', 'sales.id') ->join('packages', 'sale_items.package_id', '=', 'packages.id') ->whereIn('sales.cash_close_id', $this->cashCloseIds) ->select( 'packages.name as paquete', DB::raw('COUNT(*) as total_vendidos'), DB::raw('SUM(packages.price) as total_ingresos') ) ->groupBy('packages.id', 'packages.name') ->get(); $data->push(['VENTAS POR PAQUETE', '', '', '', '', '']); $data->push(['Paquete', 'Total Vendidos', 'Total Ingresos', '', '', '']); foreach ($packageStats as $stat) { $data->push([$stat->paquete, $stat->total_vendidos, $stat->total_ingresos, '', '', '']); } $data->push(['', '', '', '', '', '']); // Espacios // VENTAS DETALLADAS $detailedSales = SaleItem::whereHas('sale', function ($query) { $query->whereIn('cash_close_id', $this->cashCloseIds); }) ->with([ 'sale.client:id,name,paternal,maternal', 'sale:id,client_id,payment_method', 'simCard:id,iccid,msisdn', 'package:id,name,price' ]) ->orderBy('id', 'asc') ->get(); $data->push(['VENTAS DETALLADAS', '', '', '', '', '']); $data->push(['Nombre Comprador', 'ID SIM', 'Número Asignado', 'Paquete', 'Costo', 'Medio de Pago']); foreach ($detailedSales as $item) { $data->push([ $item->sale->client->full_name, $item->simCard->iccid, $item->simCard->msisdn, $item->package->name, $item->package->price, ucfirst($item->sale->payment_method) ]); } return $data; } public function headings(): array { return []; } public function title(): string { return 'Reporte Corte de Caja'; } public function styles(Worksheet $sheet) { return [ 1 => ['font' => ['bold' => true, 'size' => 14]], 11 => ['font' => ['bold' => true, 'size' => 14]], ]; } }