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, 'payment_methods' => $paymentMethods, '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 = DB::table('sales') ->join('clients', 'sales.client_id', '=', 'clients.id') ->join('sale_items', 'sales.id', '=', 'sale_items.sale_id') ->join('packages', 'sale_items.package_id', '=', 'packages.id') ->join('sim_cards', 'sale_items.sim_card_id', '=', 'sim_cards.id') ->where('sales.cash_close_id', $id) ->select( DB::raw("CONCAT(clients.name, ' ', clients.paternal, ' ', clients.maternal) as nombre_comprador"), 'sim_cards.iccid as id_sim', 'sim_cards.msisdn as numero_asignado', 'packages.name as paquete', 'packages.price as costo', 'sales.payment_method as medio_pago' ) ->orderBy('sales.id', 'desc') ->get(); return ApiResponse::OK->response([ 'cash_close' => $cashClose, 'ventas por paquete' => $packageStats, 'ventas por duracion' => $durationStats, 'ventas detalladas' => $detailedSales, ]); } }