NETBien.backend/app/Http/Controllers/Netbien/CashCloseController.php

127 lines
4.0 KiB
PHP

<?php
namespace App\Http\Controllers\Netbien;
use App\Http\Controllers\Controller;
use App\Models\CashClose;
use App\Models\Sale;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Notsoweb\ApiResponse\Enums\ApiResponse;
/**
*
*/
class CashCloseController extends Controller
{
public function index(Request $request)
{
$query = CashClose::with('user:id,name')->withCount('sales');
if ($request->has('status')) {
$query->where('status', $request->status);
}
if ($request->has('date')) {
$query->whereDate('close_date', $request->date);
}
$cashCloses = $query->orderBy('id', 'asc')
->paginate(config('app.pagination'));
return ApiResponse::OK->response([
'cash_closes' => $cashCloses,
]);
}
public function closeCashClose($id)
{
$today = now()->format('Y-m-d');
$cashClose = CashClose::findOrFail($id);
$totalSales = Sale::where('cash_close_id', $id)->sum('total_amount');
$paymentMethods = Sale::where('cash_close_id', $id)
->select('payment_method', DB::raw('SUM(total_amount) as total'))
->groupBy('payment_method')
->get();
$cashClose->update([
'income' => $totalSales,
'balance' => $totalSales - $cashClose->exit,
'status' => 'closed',
'close_date' => $today,
]);
return ApiResponse::OK->response([
'message' => 'Corte de caja cerrado exitosamente.',
'data' => $cashClose,
]);
}
public function report($id)
{
// Información del corte de caja
$cashClose = CashClose::with('user:id,name')
->withCount('sales')
->findOrFail($id);
// Estadísticas por paquete (Total de Paquetes Vendidos por Tipo)
$packageStats = DB::table('sale_items')
->join('sales', 'sale_items.sale_id', '=', 'sales.id')
->join('packages', 'sale_items.package_id', '=', 'packages.id')
->where('sales.cash_close_id', $id)
->select(
'packages.name as paquete',
DB::raw('COUNT(*) as total_vendidos')
)
->groupBy('packages.id', 'packages.name')
->get();
// Estadísticas por duración (Total de Ventas por Duración)
$durationStats = DB::table('sale_items')
->join('sales', 'sale_items.sale_id', '=', 'sales.id')
->join('packages', 'sale_items.package_id', '=', 'packages.id')
->where('sales.cash_close_id', $id)
->select(
'packages.period as duracion_dias',
DB::raw('COUNT(DISTINCT sales.id) as total_ventas')
)
->groupBy('packages.period')
->orderBy('packages.period', 'asc')
->get();
// Reporte detallado de ventas
$detailedSales = SaleItem::whereHas('sale', function($query) use ($id) {
$query->where('cash_close_id', $id);
})
->with([
'sale.client:id,name,paternal,maternal',
'sale:id,client_id,payment_method',
'simCard:id,iccid,msisdn',
'package:id,name,price'
])
->orderBy('id', 'asc')
->paginate(config('app.pagination'))
->through(function($item) {
return [
'nombre_comprador' => $item->sale->client->full_name,
'id_sim' => $item->simCard->iccid,
'numero_asignado' => $item->simCard->msisdn,
'paquete' => $item->package->name,
'costo' => $item->package->price,
'medio_pago' => $item->sale->payment_method
];
});
return ApiResponse::OK->response([
'cash_close' => $cashClose,
'ventas_paquete' => $packageStats,
'ventas_duracion' => $durationStats,
'ventas_detalladas' => $detailedSales,
]);
}
}