|
42 | 42 |
|
43 | 43 | $sCommerceController = new sCommerceController(); |
44 | 44 | Paginator::defaultView('sCommerce::partials.pagination'); |
45 | | -$get = request()->get ?? (sCommerce::config('basic.orders_on', 1) == 1 ? "orders" : "products"); |
| 45 | +$get = request()->get ?? "dashboard"; |
46 | 46 | $iUrl = (int)request()->input('i', 0) > 0 ? '&i=' . (int)request()->input('i', 0) : ''; |
47 | 47 | $pUrl = (int)request()->input('page', 1) > 1 ? '&page=' . (int)request()->input('page', 1) : ''; |
48 | 48 | $editor = []; |
49 | 49 | $tabs = []; |
50 | 50 |
|
| 51 | +$tabs[] = 'dashboard'; |
| 52 | + |
51 | 53 | if (sCommerce::config('basic.orders_on', 1) == 1) { |
52 | 54 | $tabs[] = 'orders'; |
53 | 55 | } |
|
71 | 73 | switch ($get) { |
72 | 74 | /* |
73 | 75 | |-------------------------------------------------------------------------- |
74 | | - | Orders |
| 76 | + | Dashboard |
75 | 77 | |-------------------------------------------------------------------------- |
76 | 78 | */ |
77 | 79 | default: |
|
82 | 84 | } |
83 | 85 | } |
84 | 86 | } |
| 87 | + case "dashboard": |
| 88 | + $unprocessedes = [ |
| 89 | + sOrder::ORDER_STATUS_NEW, |
| 90 | + sOrder::ORDER_STATUS_FAILED, |
| 91 | + ]; |
| 92 | + $workings = [ |
| 93 | + sOrder::ORDER_STATUS_PROCESSING, |
| 94 | + sOrder::ORDER_STATUS_CONFIRMED, |
| 95 | + sOrder::ORDER_STATUS_PACKING, |
| 96 | + sOrder::ORDER_STATUS_READY_FOR_SHIPMENT, |
| 97 | + sOrder::ORDER_STATUS_SHIPPED, |
| 98 | + sOrder::ORDER_STATUS_ON_HOLD, |
| 99 | + sOrder::ORDER_STATUS_RETURN_REQUESTED, |
| 100 | + ]; |
| 101 | + $completeds = [ |
| 102 | + sOrder::ORDER_STATUS_DELIVERED, |
| 103 | + sOrder::ORDER_STATUS_DELETED, |
| 104 | + sOrder::ORDER_STATUS_COMPLETED, |
| 105 | + sOrder::ORDER_STATUS_CANCELED, |
| 106 | + sOrder::ORDER_STATUS_RETURNED, |
| 107 | + ]; |
| 108 | + |
| 109 | + // Orders statistics |
| 110 | + $totalOrders = sOrder::count(); |
| 111 | + $newOrders = sOrder::whereIn('status', $unprocessedes)->count(); |
| 112 | + $workingOrders = sOrder::whereIn('status', $workings)->count(); |
| 113 | + $completedOrders = sOrder::whereIn('status', $completeds)->count(); |
| 114 | + |
| 115 | + // Today's statistics |
| 116 | + $todayOrders = sOrder::whereDate('created_at', today())->count(); |
| 117 | + $todayRevenue = sOrder::whereDate('created_at', today()) |
| 118 | + ->where('payment_status', sOrder::PAYMENT_STATUS_PAID) |
| 119 | + ->sum('cost'); |
| 120 | + |
| 121 | + // This month statistics |
| 122 | + $monthOrders = sOrder::whereMonth('created_at', now()->month) |
| 123 | + ->whereYear('created_at', now()->year) |
| 124 | + ->count(); |
| 125 | + $monthRevenue = sOrder::whereMonth('created_at', now()->month) |
| 126 | + ->whereYear('created_at', now()->year) |
| 127 | + ->where('payment_status', sOrder::PAYMENT_STATUS_PAID) |
| 128 | + ->sum('cost'); |
| 129 | + |
| 130 | + // Total revenue (paid orders) |
| 131 | + $totalRevenue = sOrder::where('payment_status', sOrder::PAYMENT_STATUS_PAID)->sum('cost'); |
| 132 | + |
| 133 | + // Products statistics |
| 134 | + $totalProducts = sProduct::count(); |
| 135 | + $publishedProducts = sProduct::where('published', 1)->count(); |
| 136 | + $unpublishedProducts = $totalProducts - $publishedProducts; |
| 137 | + |
| 138 | + // Payment statistics |
| 139 | + $paidOrders = sOrder::where('payment_status', sOrder::PAYMENT_STATUS_PAID)->count(); |
| 140 | + $pendingOrders = sOrder::where('payment_status', sOrder::PAYMENT_STATUS_PENDING)->count(); |
| 141 | + |
| 142 | + // Sales chart data (last 30 days) |
| 143 | + $salesChartData = []; |
| 144 | + for ($i = 29; $i >= 0; $i--) { |
| 145 | + $date = now()->subDays($i); |
| 146 | + $dayRevenue = sOrder::whereDate('created_at', $date) |
| 147 | + ->where('payment_status', sOrder::PAYMENT_STATUS_PAID) |
| 148 | + ->sum('cost'); |
| 149 | + $dayOrders = sOrder::whereDate('created_at', $date)->count(); |
| 150 | + $salesChartData[] = [ |
| 151 | + 'date' => $date->format('Y-m-d'), |
| 152 | + 'label' => $date->format('d.m'), |
| 153 | + 'revenue' => (float)$dayRevenue, |
| 154 | + 'orders' => $dayOrders, |
| 155 | + ]; |
| 156 | + } |
| 157 | + |
| 158 | + // Recent orders |
| 159 | + $recentOrders = sOrder::orderBy('created_at', 'desc')->limit(10)->get(); |
| 160 | + |
| 161 | + // Top products (by order count) - simplified version |
| 162 | + $topProductsData = []; |
| 163 | + try { |
| 164 | + $allOrders = sOrder::select('products')->get(); |
| 165 | + $productCounts = []; |
| 166 | + foreach ($allOrders as $order) { |
| 167 | + if (is_array($order->products)) { |
| 168 | + foreach ($order->products as $product) { |
| 169 | + if (isset($product['id'])) { |
| 170 | + $productId = $product['id']; |
| 171 | + $productCounts[$productId] = ($productCounts[$productId] ?? 0) + 1; |
| 172 | + } |
| 173 | + } |
| 174 | + } |
| 175 | + } |
| 176 | + arsort($productCounts); |
| 177 | + $topProductIds = array_slice(array_keys($productCounts), 0, 5, true); |
| 178 | + |
| 179 | + if (count($topProductIds) > 0) { |
| 180 | + $topProducts = sProduct::whereIn('id', $topProductIds)->get()->keyBy('id'); |
| 181 | + foreach ($topProductIds as $productId) { |
| 182 | + if (isset($topProducts[$productId])) { |
| 183 | + $product = $topProducts[$productId]; |
| 184 | + $topProductsData[] = [ |
| 185 | + 'id' => $product->id, |
| 186 | + 'title' => $product->pagetitle ?? 'N/A', |
| 187 | + 'count' => $productCounts[$productId] ?? 0, |
| 188 | + ]; |
| 189 | + } |
| 190 | + } |
| 191 | + } |
| 192 | + } catch (\Exception $e) { |
| 193 | + // If error occurs, just skip top products |
| 194 | + $topProductsData = []; |
| 195 | + } |
| 196 | + |
| 197 | + $data['totalOrders'] = $totalOrders; |
| 198 | + $data['newOrders'] = $newOrders; |
| 199 | + $data['workingOrders'] = $workingOrders; |
| 200 | + $data['completedOrders'] = $completedOrders; |
| 201 | + $data['todayOrders'] = $todayOrders; |
| 202 | + $data['todayRevenue'] = $todayRevenue; |
| 203 | + $data['monthOrders'] = $monthOrders; |
| 204 | + $data['monthRevenue'] = $monthRevenue; |
| 205 | + $data['totalRevenue'] = $totalRevenue; |
| 206 | + $data['totalProducts'] = $totalProducts; |
| 207 | + $data['publishedProducts'] = $publishedProducts; |
| 208 | + $data['unpublishedProducts'] = $unpublishedProducts; |
| 209 | + $data['paidOrders'] = $paidOrders; |
| 210 | + $data['pendingOrders'] = $pendingOrders; |
| 211 | + $data['salesChartData'] = $salesChartData; |
| 212 | + $data['recentOrders'] = $recentOrders; |
| 213 | + $data['topProducts'] = $topProductsData ?? []; |
| 214 | + $data['unprocessedes'] = $unprocessedes; |
| 215 | + $data['workings'] = $workings; |
| 216 | + $data['completeds'] = $completeds; |
| 217 | + |
| 218 | + $domains = null; |
| 219 | + if (evo()->getConfig('check_sMultisite', false)) { |
| 220 | + $domains = \Seiger\sMultisite\Models\sMultisite::all()->keyBy('key'); |
| 221 | + } |
| 222 | + $data['domains'] = $domains; |
| 223 | + |
| 224 | + $_SESSION['itemaction'] = 'Viewing Dashboard'; |
| 225 | + $_SESSION['itemname'] = __('sCommerce::global.title'); |
| 226 | + break; |
| 227 | + |
| 228 | + /* |
| 229 | + |-------------------------------------------------------------------------- |
| 230 | + | Orders |
| 231 | + |-------------------------------------------------------------------------- |
| 232 | + */ |
85 | 233 | case "orders": |
86 | 234 | $perpage = Cookie::get('scom_orders_page_items', 50); |
87 | 235 | $dbStatuses = array_flip(sOrder::select('status')->distinct()->pluck('status')->toArray()); |
|
0 commit comments