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, ]); } }