selectRaw(' inventories.id, inventories.name, inventories.sku, categories.name as category_name, SUM(sale_details.quantity) as total_quantity_sold, SUM(sale_details.subtotal) as total_revenue, COUNT(DISTINCT sale_details.sale_id) as times_sold, MAX(sales.created_at) as last_sale_date, inventories.created_at as added_date ') ->join('inventories', 'sale_details.inventory_id', '=', 'inventories.id') ->join('categories', 'inventories.category_id', '=', 'categories.id') ->join('sales', 'sale_details.sale_id', '=', 'sales.id') ->where('sales.status', 'completed') ->whereNull('sales.deleted_at'); // Aplicar filtro de fechas si se proporcionan ambas if ($fromDate && $toDate) { $query->whereBetween(DB::raw('DATE(sales.created_at)'), [$fromDate, $toDate]); } $result = $query ->groupBy('inventories.id', 'inventories.name', 'inventories.sku', 'categories.name', 'inventories.created_at') ->orderByDesc('total_quantity_sold') ->first(); return $result ? $result->toArray() : null; } /** * Obtener productos sin movimiento */ public function getProductsWithoutMovement(?string $fromDate = null, ?string $toDate = null) { // Obtener IDs de productos que SÍ tienen ventas $inventoriesWithSales = SaleDetail::query() ->join('sales', 'sale_details.sale_id', '=', 'sales.id') ->where('sales.status', 'completed') ->whereNull('sales.deleted_at') ->whereBetween(DB::raw('DATE(sales.created_at)'), [$fromDate, $toDate]) ->distinct() ->pluck('sale_details.inventory_id') ->toArray(); // Construir query para productos SIN ventas usando relaciones de Eloquent $query = Inventory::query() ->with(['category', 'price']) ->where('is_active', true) ->whereNotIn('id', $inventoriesWithSales) ->orderBy('created_at'); return $query->paginate(config('app.pagination', 10)); } }