115 lines
4.1 KiB
PHP
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]],
|
|
];
|
|
}
|
|
}
|