Skip to content

Commit 50db8d3

Browse files
committed
[ADD] Dashboard.
1 parent 78ceb2f commit 50db8d3

5 files changed

Lines changed: 457 additions & 2 deletions

File tree

lang/en/global.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@
395395
"total_orders" => "Total orders",
396396
"total_products" => "Total products",
397397
"total_reviews" => "Total reviews",
398+
"total_revenue" => "Total revenue",
398399
"turned_off" => "turned off",
399400
"type_attr_checkbox" => "Checkbox",
400401
"type_attr_color" => "Color",
@@ -462,4 +463,14 @@
462463
"order_not_deleted" => "Order is not deleted",
463464
"order_restored_successfully" => "Order successfully restored",
464465
"order_restore_error" => "Error restoring order",
466+
"dashboard" => "Dashboard",
467+
"dashboard_icon" => "fas fa-chart-line",
468+
"days" => "days",
469+
"recent_orders" => "Recent Orders",
470+
"revenue" => "Revenue",
471+
"sales_chart" => "Sales Chart",
472+
"this_month" => "This Month",
473+
"today" => "Today",
474+
"today_statistics" => "Today Statistics",
475+
"top_products" => "Top Products",
465476
];

lang/ru/global.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@
395395
"total_orders" => "Общее количество заказов",
396396
"total_products" => "Общее количество товаров",
397397
"total_reviews" => "Общее количество отзывов",
398+
"total_revenue" => "Общий доход",
398399
"turned_off" => "выключено",
399400
"type_attr_checkbox" => "Чекбокс",
400401
"type_attr_color" => "Палитра цветов",
@@ -462,4 +463,14 @@
462463
"order_not_deleted" => "Заказ не удален",
463464
"order_restored_successfully" => "Заказ успешно восстановлен",
464465
"order_restore_error" => "Ошибка восстановления заказа",
466+
"dashboard" => "Панель управления",
467+
"dashboard_icon" => "fas fa-chart-line",
468+
"days" => "дней",
469+
"recent_orders" => "Последние заказы",
470+
"revenue" => "Доход",
471+
"sales_chart" => "График продаж",
472+
"this_month" => "Этот месяц",
473+
"today" => "Сегодня",
474+
"today_statistics" => "Статистика за сегодня",
475+
"top_products" => "Топ товары",
465476
];

lang/uk/global.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@
395395
"total_orders" => "Загальна кількість замовлень",
396396
"total_products" => "Загальна кількість товарів",
397397
"total_reviews" => "Загальна кількість відгуків",
398+
"total_revenue" => "Загальний дохід",
398399
"turned_off" => "вимкнено",
399400
"type_attr_checkbox" => "Чекбокс",
400401
"type_attr_color" => "Палітра кольорів",
@@ -462,4 +463,14 @@
462463
"order_not_deleted" => "Замовлення не видалено",
463464
"order_restored_successfully" => "Замовлення успішно відновлено",
464465
"order_restore_error" => "Помилка відновлення замовлення",
466+
"dashboard" => "Панель управління",
467+
"dashboard_icon" => "fas fa-chart-line",
468+
"days" => "днів",
469+
"recent_orders" => "Останні замовлення",
470+
"revenue" => "Дохід",
471+
"sales_chart" => "Графік продажів",
472+
"this_month" => "Цей місяць",
473+
"today" => "Сьогодні",
474+
"today_statistics" => "Статистика за сьогодні",
475+
"top_products" => "Топ товари",
465476
];

module/sCommerceModule.php

Lines changed: 150 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@
4242

4343
$sCommerceController = new sCommerceController();
4444
Paginator::defaultView('sCommerce::partials.pagination');
45-
$get = request()->get ?? (sCommerce::config('basic.orders_on', 1) == 1 ? "orders" : "products");
45+
$get = request()->get ?? "dashboard";
4646
$iUrl = (int)request()->input('i', 0) > 0 ? '&i=' . (int)request()->input('i', 0) : '';
4747
$pUrl = (int)request()->input('page', 1) > 1 ? '&page=' . (int)request()->input('page', 1) : '';
4848
$editor = [];
4949
$tabs = [];
5050

51+
$tabs[] = 'dashboard';
52+
5153
if (sCommerce::config('basic.orders_on', 1) == 1) {
5254
$tabs[] = 'orders';
5355
}
@@ -71,7 +73,7 @@
7173
switch ($get) {
7274
/*
7375
|--------------------------------------------------------------------------
74-
| Orders
76+
| Dashboard
7577
|--------------------------------------------------------------------------
7678
*/
7779
default:
@@ -82,6 +84,152 @@
8284
}
8385
}
8486
}
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+
*/
85233
case "orders":
86234
$perpage = Cookie::get('scom_orders_page_items', 50);
87235
$dbStatuses = array_flip(sOrder::select('status')->distinct()->pluck('status')->toArray());

0 commit comments

Comments
 (0)