PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.5.2
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.5.2
1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 trunk All 48 releases
fluent-cart / app / Http / Controllers / Reports / ReportingController.php

ReportingController.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.5.2, at app/Http/Controllers/Reports/ReportingController.php

260 lines 9.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\App\Http\Controllers\Reports;
4
5 use FluentCart\Api\Resource\OrderItemResource;
6 use FluentCart\Api\Resource\OrderResource;
7 use FluentCart\Api\StoreSettings;
8 use FluentCart\App\Helpers\CurrenciesHelper;
9 use FluentCart\App\Helpers\CustomerHelper;
10 use FluentCart\App\Helpers\Status;
11 use FluentCart\App\Http\Controllers\Controller;
12 use FluentCart\App\Models\Order;
13 use FluentCart\App\Modules\ReportingModule\OrdersReport;
14 use FluentCart\App\Modules\ReportingModule\SalesReport;
15 use FluentCart\App\Services\DateTime\DateTime;
16 use FluentCart\App\Services\Report\DashBoardReportService;
17 use FluentCart\App\Services\Report\ReportHelper;
18 use FluentCart\Framework\Http\Request\Request;
19 use FluentCart\Framework\Support\Arr;
20
21 class ReportingController extends Controller
22 {
23 public function getOrderQuickStats(Request $request): array
24 {
25 $compare = true;
26 $fromRange = $request->get('day_range', '-0 days');
27 if ($fromRange == 'this_month') {
28 $fromDate = gmdate('Y-m-01 00:00:00');
29 } else if ($fromRange == 'all_time') {
30 $fromDate = false;
31 $compare = false;
32 } else {
33 $fromDate = gmdate('Y-m-d 00:00:00', strtotime($fromRange));
34 }
35
36 return [
37 'stats' => (new OrdersReport())->getOrderStats($fromDate, false, $compare),
38 'from_date' => $fromDate,
39 'to_date' => gmdate('Y-m-d 23:59:59', current_time('timestamp'))
40 ];
41 }
42
43 public function getSalesGrowth(Request $request, SalesReport $salesReport): array
44 {
45
46 $endYear = $request->get('end_date', Order::query()->max('created_at'));
47 $startYear = $request->get('start_date', Order::query()->min('created_at'));
48
49 $filters = [
50 "status" => ["column" => "status", "operator" => "in", "value" => Status::getOrderSuccessStatuses()],
51 "payment_status" => ["column" => "payment_status", "operator" => "in", "value" => Status::getTransactionSuccessStatuses()],
52 "created_at" => ["column" => "created_at", "operator" => "between", "value" => [$startYear, $endYear]]
53 ];
54
55 return [
56 'sales_data' => $salesReport->getSalesGrowth($filters)
57 ];
58 }
59
60 /**
61 * @deprecated since v1.4. Use GET reports/overview (OverviewReportController::getOverview) instead.
62 */
63 public function getReportOverview(Request $request): array
64 {
65 _deprecated_function(__METHOD__, '1.4', 'GET /fluent-cart/v2/reports/overview');
66
67 $params = $request->get('params');
68 $params["status"] = ["column" => "status", "operator" => "in", "value" => Status::getOrderSuccessStatuses()];
69 $queryParam = Arr::only($params, ['created_at', 'status', 'payment_status']);
70
71 $reportOverview = OrderResource::reportOverview($queryParam);
72
73 $ordersByPaymentMethod = OrderResource::orderSummaryByPayment($queryParam);
74
75 return [
76 '_deprecated' => 'This endpoint is deprecated since v1.4 and will be removed in a future release. Use GET /fluent-cart/v2/reports/overview instead.',
77 'data' => $reportOverview,
78 'orders_by_payment_method' => $ordersByPaymentMethod,
79 ];
80 }
81
82 public function searchRepeatCustomer(Request $request): array
83 {
84 $params = $request->get('params');
85
86 return [
87 'repeat_customers' => CustomerHelper::getRepeatCustomerBySearch($params)->paginate(Arr::get($params, 'per_page'), ['*'], 'page', Arr::get($params, 'current_page'))
88 ];
89 }
90
91 /**
92 * @deprecated since v1.4. Use GET reports/fetch-top-sold-products (DefaultReportController::getTopSoldProducts) instead.
93 */
94 public function getTopProductsSold(Request $request): array
95 {
96 _deprecated_function(__METHOD__, '1.4', 'GET /fluent-cart/v2/reports/fetch-top-sold-products');
97
98 return [
99 '_deprecated' => 'This endpoint is deprecated since v1.4 and will be removed in a future release. Use GET /fluent-cart/v2/reports/fetch-top-sold-products instead.',
100 'top_products_sold' => OrderItemResource::topProductsSold($request->get('params')),
101 ];
102 }
103
104 public function getReportMeta(Request $request): array
105 {
106
107 $startDate = $request->get('params.startDate', null);
108 $endDate = $request->get('params.endDate', null);
109
110 $data = Order::query()
111 ->select('currency')
112 ->selectRaw('COUNT(*) as order_count')
113 ->selectRaw('MIN(created_at) as min_created_at')
114 ->when($startDate && $endDate, function ($query) use ($startDate, $endDate) {
115 $query->whereBetween('created_at', [$startDate, $endDate]);
116 })
117 ->groupBy('currency')
118 ->orderBy('order_count', 'desc')
119 ->get(['currency', 'min_created_at']);
120
121 $min_created_at = $data->min('min_created_at');
122
123 if ($min_created_at < $startDate) {
124 $min_created_at = $startDate;
125 }
126
127 if (!$min_created_at) {
128 $min_created_at = (new DateTime())->format('Y-m-d H:i:s');
129 }
130
131 $currentCurrency = (new StoreSettings())->getCurrency();
132
133 $currencyWithSign = CurrenciesHelper::getCurrencyWithSign([$currentCurrency]);
134
135 return [
136 'currencies' => $currencyWithSign,
137 'min_date' => $min_created_at,
138 'storeMode' => (new StoreSettings())->get('order_mode'),
139 'first_order_date' => Order::query()->min('created_at')
140 ];
141
142 }
143
144 //Dashboard Report Controllers
145
146 public function getDashBoardSummary(Request $request)
147 {
148
149 return DashBoardReportService::getSummary();
150 }
151 public function getRecentOrders(Request $request)
152 {
153
154 return DashBoardReportService::getRecentOrders();
155 }
156
157 public function getRecentActivities(Request $request)
158 {
159
160 $groupKey = Arr::get($request->all(), 'groupKey', 'all');
161 return DashBoardReportService::getRecentActivities($groupKey);
162 }
163 public function getDashBoardStats(Request $request): array
164 {
165 $filters = [
166 'currency' => $request->get('params.currency', null),
167 'payment_status' => $request->get('params.paymentStatus', null) === 'all' ? '' : $request->get('params.paymentStatus', null),
168 ];
169 $startDate = $request->get('params.startDate', null);
170 $endDate = $request->get('params.endDate', null);
171 //
172 // $startDate = null;
173 // $endDate = null;
174
175 if (empty($startDate) && empty($endDate)) {
176 // Retrieve the first order's created_at date and set the start date
177 $firstOrder = Order::query()->orderBy('created_at', 'asc')->first();
178
179 $startDate = $firstOrder ? new DateTime($firstOrder->created_at) : null;
180
181 // Set the end date to the current date
182 $endDate = new DateTime();
183 } else {
184 $startDate = !empty($startDate) ? new DateTime($startDate) : null;
185 $endDate = !empty($endDate) ? new DateTime($endDate) : null;
186 }
187
188 if (!$startDate || !$endDate) {
189 return [
190 'dashBoardStats' => [
191 'total_orders' => [
192 'title' => __('All Orders', 'fluent-cart'),
193 'icon' => 'AllOrdersIcon',
194 'current_count' => 0,
195 'compare_count' => 0,
196 ],
197 'paid_orders' => [
198 'title' => __('Paid Orders', 'fluent-cart'),
199 'icon' => 'Money',
200 'current_count' => 0,
201 'compare_count' => 0,
202 ],
203 'total_paid_order_items' => [
204 'title' => __('Paid Order Items', 'fluent-cart'),
205 'icon' => 'OrderItemsIcon',
206 'current_count' => 0,
207 'compare_count' => 0,
208 ],
209 'total_paid_amounts' => [
210 'title' => __('Order Value (Paid)', 'fluent-cart'),
211 'icon' => 'OrderValueIcon',
212 'current_count' => 0,
213 'compare_count' => 0,
214 'is_cents' => true,
215 ],
216 ]
217 ];
218 }
219 $interval = $startDate->diff($endDate)->days;
220
221 $previousEndDate = (clone $startDate)->modify('-1 day')->endOfDay();
222 $previousStartDate = (clone $previousEndDate)->modify("-$interval days")->setTime(0, 0, 0);
223
224 $service = DashBoardReportService::make($filters)
225 ->setSelects(['id', 'total_amount', 'manual_discount_total', 'tax_total', 'shipping_total', 'total_refund', 'created_at', 'subtotal', 'coupon_discount_total', 'payment_status'])
226 ->setRange($startDate && $endDate ? $previousStartDate : null, $startDate && $endDate ? $endDate : null)
227 ->setAmountColumns(['total_amount', 'manual_discount_total', 'tax_total', 'shipping_total', 'total_refund', 'subtotal', 'coupon_discount_total']);
228
229 return $service->getDashboardStats($startDate, $endDate, $previousStartDate, $previousEndDate);
230
231 }
232
233 public function getSalesGrowthChart(Request $request): array
234 {
235 $params = ReportHelper::processParams($request->get('params'), ['orderStatus']);
236
237 $service = DashBoardReportService::make();
238
239 return [
240 'salesGrowthChart' => $service->getSalesGrowthChart($params)
241 ];
242 }
243
244 public function getCountryHeatMap(Request $request)
245 {
246
247
248 $filters = [
249 'currency' => $request->get('params.currency', null),
250 ];
251
252 $service = DashBoardReportService::make($filters)
253 ->setAmountColumns(['total_amount', 'manual_discount_total', 'tax_total', 'shipping_total', 'total_refund', 'subtotal', 'coupon_discount_total']);
254
255 return $service->getCountryHeatMap();
256
257 }
258
259 }
260