NETBien.backend/app/Exports/CashCloseReportExport.php
2025-11-19 15:51:49 -06:00

115 lines
4.1 KiB
PHP

<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\WithTitle;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use App\Models\SaleItem;
use Illuminate\Support\Facades\DB;
class CashCloseReportExport implements FromCollection, WithHeadings, WithStyles, WithTitle
{
protected $cashCloses;
protected $cashCloseIds;
public function __construct($cashCloses)
{
$this->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]],
];
}
}