resto_dashboard.blade.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. @extends('layouts.app')
  2. @section('page-title')| Dashboard @endsection
  3. @section('css')
  4. <link href="{!! env('APP_ASSETS') !!}css/dashboard.css" rel="stylesheet" type="text/css">
  5. @endsection
  6. @section('content')
  7. @php
  8. $resto = \App\Models\Restaurants::find(\App\Helpers\CommonMethods::getRestuarantID());
  9. $lang = $resto->default_lang;
  10. app()->setLocale($lang);
  11. if(session('app_lang') !==null){
  12. $lang = session('app_lang');
  13. app()->setLocale($lang);
  14. }
  15. $outlets = \App\Models\Outlets::whereNull('deleted_at')->where('resto_id',$resto->id)->get();
  16. $o = NULL;
  17. if(isset($outlets) && $outlets->count() > 0){
  18. foreach($outlets as $outlet){
  19. //dump($outlet->outlet_orders);
  20. $o[] = array(
  21. 'outlet_name' => $outlet->name,
  22. 'orders'=>$outlet->outlet_orders->count()
  23. );
  24. }
  25. }
  26. $totalRevenue = \App\Models\Restaurants::totalRevenue($resto->id);
  27. $last7DaysData = \App\Models\Restaurants::totalRevenueLast7Days($resto->id);
  28. $last7DaysDataCount = \App\Models\Restaurants::totalCountRevenue($resto->id);
  29. $totalOnlineOrders = \App\Models\Restaurants::totalOnlineOrders($resto->id);
  30. $totalSourceOrders = \App\Models\Restaurants::totalOrdersBySource($resto->id);
  31. $totalOnlineOrders7Days = \App\Models\Restaurants::totalOnlineOrdersLast7Days($resto->id);
  32. $totalCountOnlineOrders7Days = \App\Models\Restaurants::totalCountOnlineOrdersLast7Days($resto->id);
  33. $last7DaysData = isset($last7DaysData)?$last7DaysData:NULL;
  34. @endphp
  35. @php
  36. $restuarant1 = $resto;
  37. $resto_meta = isset($restuarant1->resto_metas)?$restuarant1->resto_metas:null;
  38. //dump($resto_meta);
  39. $resto_metas = [];
  40. $billing = [];
  41. if(isset($resto_meta)){
  42. foreach($resto_meta as $meta){
  43. if($meta->outlet_id!=""){
  44. continue;
  45. }
  46. $index_name = isset($meta->resto_meta_defs->parents)?$meta->resto_meta_defs->parents->meta_def_name:$meta->resto_meta_defs->meta_def_name;
  47. // dump($meta->resto_meta_defs);
  48. if($index_name=="BILLING_GATEWAY"){
  49. // dump($meta->resto_meta_defs->meta_def_name);
  50. // $resto_metas['BILLING_GATEWAY'][] = $meta->meta_val;
  51. $billing[] = array('id'=>$meta->meta_id,'value'=>$meta->meta_val);
  52. }
  53. $resto_metas[$index_name] = $meta->meta_val;
  54. }
  55. }
  56. $resto_metas['BILLING_GATEWAY'] = $billing;
  57. $currency = isset($resto_metas['BUSSINESS_CCY'])?$resto_metas['BUSSINESS_CCY']:"IQD";
  58. $business_type = isset($resto_metas['BUSSINESS_TYPE'])?$resto_metas['BUSSINESS_TYPE']:"Restaurants";
  59. @endphp
  60. <!-- Content Wrapper. Contains page content -->
  61. <div class="content-wrapper">
  62. <div class="container-full">
  63. <!-- Main content -->
  64. <section class="content">
  65. <div class="row ">
  66. <div class="col-md-10">
  67. <div class="m-15">
  68. <h3 class="title">{{__('label.dashboard')}}
  69. </h3>
  70. </div>
  71. </div>
  72. </div>
  73. <div class="row p-0 m-0">
  74. <div class="col-md-6 ">
  75. <select class="form-control form-select">
  76. <option value="">{{ __('label.current_month') }}</option>
  77. </select>
  78. </div>
  79. <!--<div class="col-md-6">
  80. <button class="form-control btn btn-md shadow-none ">Launch marketing activity</button>
  81. </div>-->
  82. </div>
  83. <div class="row p-5 align-items-center">
  84. <div class="col-md-6">
  85. <div class="count_div h-100 ">
  86. <div class="d-flex justify-content-between align-items-center">
  87. <div class="d-flex p-2 bd-highlight">
  88. <p class="count_title">{{__('label.total_orders')}}</p>
  89. </div>
  90. <div class="right_text_div">
  91. <a class="d-block text-decoration-none count_atag">
  92. <h3 class="count_h3 text-break">{!! isset($resto)?($resto->delivered_orders->count()):0; !!}</h3>
  93. <small class="text-secondary count_small_tag active">{{__('label.order_completed')}}</small>
  94. </a>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. <div class="col-md-6">
  100. <div class="count_div h-100 ">
  101. <div class="d-flex justify-content-between align-items-center">
  102. <div class="d-flex p-2 bd-highlight">
  103. <p class="count_title">{{__('label.average_basket_value')}}</p>
  104. </div>
  105. <div class="right_text_div">
  106. <a class="d-block text-decoration-none count_atag">
  107. <div class="d-flex justify-content-between align-items-center">
  108. <small class="iqd_small">{!! $currency !!}</small>
  109. <h3 class="count_h3 text-break">
  110. @if(isset($resto) && isset($totalRevenue) && isset($resto->delivered_orders) && $resto->delivered_orders->count() > 0)
  111. {!! number_format($totalRevenue[0]->total_price/ $resto->delivered_orders->count()) !!}
  112. @else
  113. N/A
  114. @endif
  115. </h3>
  116. </div>
  117. <small class="text-secondary count_small_tag">{{__('label.average_basket_value')}}</small>
  118. </a>
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. <div class="col-md-6">
  124. <div class="count_div h-100 ">
  125. <div class="d-flex justify-content-between align-items-center">
  126. <div class="d-flex p-2 bd-highlight">
  127. <p class="count_title">{{__('label.total_sale')}}</p>
  128. </div>
  129. <div class="right_text_div">
  130. <a class="d-block text-decoration-none count_atag">
  131. <div class="d-flex justify-content-between align-items-center">
  132. <small class="iqd_small">{!! $currency !!}</small>
  133. <h3 class="count_h3 text-break"> {!! isset($totalRevenue)?number_format($totalRevenue[0]->total_price):0 !!}</h3>
  134. </div>
  135. <small class="text-secondary count_small_tag">{{__('label.total_sale_revenue')}}</small>
  136. </a>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="col-md-6">
  142. <div class="count_div h-100 ">
  143. <div class="d-flex justify-content-between align-items-center">
  144. <div class="d-flex p-2 bd-highlight">
  145. <p class="count_title">{{__('label.average_order_rating')}}</p>
  146. </div>
  147. <div class="right_text_div">
  148. <a class="d-block text-decoration-none count_atag">
  149. <h3 class="count_h3 text-break">N/A</h3>
  150. <small class="text-secondary count_small_tag">{{__('label.average_order_rating')}}</small>
  151. </a>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. @php
  158. $order_status_orders = \App\Models\Orders::select(\DB::raw('count(id) as customer_order'))->where('resto_id',$resto->id)->where('status','Has_Delivered')->groupBy('customer_id')->get()->take(4000);
  159. $order_status_customers = \App\Models\Orders::select(\DB::raw('count(customer_id) as customer_order'))->where('resto_id',$resto->id)->where('status','Has_Delivered')->groupBy('customer_id')->get()->take(4000);
  160. $order_total_prices = \App\Models\Orders::select(\DB::raw('sum(total_price) as total_price'),\DB::raw('count(id) as order_count'))->where('resto_id',$resto->id)->where('status','Has_Delivered')->groupBy('customer_id')->get();
  161. //dump( $order_total_prices);
  162. $new_customers = 0;
  163. $returnning_customers = 0;
  164. $new_order = 0;
  165. $returnning_order = 0;
  166. $new_order_total_price = 0;
  167. $returnning_order_total_price = 0;
  168. if(isset($order_status_orders)){
  169. foreach($order_status_orders as $cus_order){
  170. if($cus_order->customer_order==1)
  171. $new_order = $new_order+1;
  172. if($cus_order->customer_order>1)
  173. $returnning_order = $returnning_order+$cus_order->customer_order;
  174. }
  175. }
  176. if(isset($order_status_customers)){
  177. foreach($order_status_customers as $cus_order){
  178. if($cus_order->customer_order==1)
  179. $new_customers = $new_customers+1;
  180. if($cus_order->customer_order>1)
  181. $returnning_customers = $returnning_customers+1;
  182. }
  183. }
  184. if(isset($order_total_prices)){
  185. foreach($order_total_prices as $cus_order){
  186. if($cus_order->order_count==1)
  187. $new_order_total_price = $new_order_total_price+$cus_order->total_price;
  188. if($cus_order->order_count>1)
  189. $returnning_order_total_price = $returnning_order_total_price+$cus_order->total_price;
  190. }
  191. }
  192. //dump($order_status_customers );
  193. $total_customers = $new_customers + $returnning_customers ;
  194. $percent_new_customer = $new_customers>0 && $total_customers > 0 ?number_format(($new_customers / $total_customers) * 100,2):0;
  195. $percent_returnning_customers = $returnning_customers > 0 && $total_customers? number_format(($returnning_customers / $total_customers) * 100,2):0;
  196. $avg_new_order_basket = $new_order_total_price > 0 && $new_order > 0?($new_order_total_price/$new_order):0;
  197. $avg_returnning_order_basket = $returnning_order_total_price > 0 && $returnning_order > 0?($returnning_order_total_price/$returnning_order):0;
  198. $avg_total_avg = $avg_new_order_basket + $avg_returnning_order_basket ;
  199. @endphp
  200. <div class="row tbl_row mt-25">
  201. <div class="col-12 mt-4 tb_row_fdiv">
  202. <h4 class="m-5 tbl_h4_title">{{__('label.new_customers_x_returning_customers')}}</h4>
  203. <div class="table-responsive">
  204. <table class="table text-center table-borderless">
  205. <thead>
  206. <tr>
  207. <th scope="col"></th>
  208. <th scope="col">{{__('label.orders')}}</th>
  209. <th scope="col">{{__('label.customers')}}</th>
  210. <th scope="col">% {{__('label.customers')}}</th>
  211. <th scope="col">{{__('label.average_basket_value')}}</th>
  212. <th scope="col">{{__('label.total_sale')}}</th>
  213. </tr>
  214. </thead>
  215. <tbody>
  216. <tr>
  217. <td>{{__('label.new')}}</td>
  218. <td>{!! $new_order !!}</td>
  219. <td>{!! $new_customers !!}</td>
  220. <td>{!! round($percent_new_customer) !!}</td>
  221. <td>{!! number_format(round($avg_new_order_basket)) !!}</td>
  222. <td>{!! number_format($new_order_total_price) !!}</td>
  223. </tr>
  224. <tr class="row_background">
  225. <td>{{__('label.returning')}}</td>
  226. <td>{!! $returnning_order !!}</td>
  227. <td>{!! $returnning_customers !!}</td>
  228. <td>{!! round($percent_returnning_customers) !!}</td>
  229. <td>{!! number_format(round($avg_returnning_order_basket)) !!}</td>
  230. <td>{!! number_format($returnning_order_total_price) !!}</td>
  231. </tr>
  232. </tbody>
  233. <tfoot>
  234. <tr>
  235. <th>{{__('label.total')}}</th>
  236. <th>{!! $new_order + $returnning_order !!}</th>
  237. <th>{!! $total_customers !!}</th>
  238. <th>100%</th>
  239. <th>{!! number_format(round($avg_total_avg)) !!}</th>
  240. <th>{!! number_format($returnning_order_total_price + $new_order_total_price) !!}</th>
  241. </tr>
  242. </tfoot>
  243. </table>
  244. </div>
  245. </div>
  246. </div>
  247. <div class="row mt-25">
  248. <div class="col-md-6">
  249. <div class="boxs">
  250. <div class="box-header with-border">
  251. <h4 class="box-title">{{__('label.total_order_by_source')}}</h4>
  252. </div>
  253. <div class="box-bodys">
  254. <div id="chart" class="h-350">
  255. </div>
  256. </div>
  257. </div>
  258. </div>
  259. <div class="col-md-6">
  260. <div class="boxs">
  261. <div class="box-header with-border2">
  262. <h4 class="box-title">{{__('label.total_orders_by_outlets')}}</h4>
  263. </div>
  264. <div class="box-bodys">
  265. <div id="yearly-comparison" class="h-350">
  266. </div>
  267. </div>
  268. </div>
  269. </div>
  270. </div>
  271. </section>
  272. <!-- /.content -->
  273. </div>
  274. </div>
  275. <!-- /.content-wrapper -->
  276. @endsection
  277. @section('js')
  278. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
  279. <script src="{!! env('APP_ASSETS') !!}vendor_components/apexcharts-bundle/dist/apexcharts.min.js"></script>
  280. <script src="{!! env('APP_ASSETS') !!}vendor_components/chartist-js-develop/chartist.js"></script>
  281. <!-- Chart Js -->
  282. <!-- Datatable Js -->
  283. <script>
  284. var resto_id = 0;
  285. $(function () {
  286. var data = '{!! $last7DaysData !!}';
  287. var order_data = '{!! $totalOnlineOrders7Days !!}';
  288. data = $.parseJSON(data);
  289. order_data = $.parseJSON(order_data);
  290. var days = [];
  291. var sale = [];
  292. $.each(data, function (i, v) {
  293. days.push(v.day_name);
  294. sale.push(v.total_price);
  295. });
  296. var order_days = [];
  297. var orders = [];
  298. $.each(order_data, function (i, v) {
  299. order_days.push(v.day_name);
  300. orders.push(v.total_orders);
  301. });
  302. $("body").on('click', '.delete-recipe', function () {
  303. var id = $(this).data('id');
  304. $.ajax({
  305. url: "{!! env('APP_URL') !!}recipe/delete/" + id,
  306. success: function (response) {
  307. location.reload();
  308. }
  309. });
  310. });
  311. // var data = ["200,500,500,600,290,12,80"];
  312. var options = {
  313. series: [{
  314. name: 'Revenue',
  315. data: sale
  316. }],
  317. chart: {
  318. height: 350,
  319. type: 'area',
  320. zoom: {
  321. enabled: false
  322. },
  323. },
  324. colors: ["#4c95dd"],
  325. dataLabels: {
  326. enabled: false
  327. },
  328. stroke: {
  329. curve: 'smooth'
  330. },
  331. xaxis: {
  332. categories: days
  333. },
  334. tooltip: {
  335. y: {
  336. formatter: function (val) {
  337. return "{!! $currency !!} " + val + " "
  338. }
  339. },
  340. },
  341. };
  342. var chart = new ApexCharts(document.querySelector("#chart3"), options);
  343. chart.render();
  344. console.log(order_data);
  345. var options = {
  346. chart: {
  347. height: 325,
  348. type: 'bar',
  349. toolbar: {
  350. show: false
  351. },
  352. },
  353. plotOptions: {
  354. bar: {
  355. horizontal: false,
  356. endingShape: 'rounded',
  357. columnWidth: '65%',
  358. },
  359. },
  360. dataLabels: {
  361. enabled: false
  362. },
  363. stroke: {
  364. show: true,
  365. width: 5,
  366. colors: ['transparent']
  367. },
  368. colors: ["#e66430"],
  369. series: [{
  370. name: 'Online Order',
  371. data: orders
  372. }],
  373. xaxis: {
  374. categories: order_days,
  375. axisBorder: {
  376. show: true,
  377. color: '#bec7e0',
  378. },
  379. axisTicks: {
  380. show: true,
  381. color: '#bec7e0',
  382. },
  383. },
  384. legend: {
  385. show: false,
  386. },
  387. fill: {
  388. opacity: 1
  389. },
  390. grid: {
  391. row: {
  392. colors: ['transparent'], // takes an array which will be repeated on columns
  393. opacity: 0.2
  394. },
  395. borderColor: '#f1f3fa'
  396. },
  397. tooltip: {
  398. y: {
  399. formatter: function (val) {
  400. return +0 + " Orders"
  401. }
  402. }
  403. }
  404. }
  405. /* var chart = new ApexCharts(
  406. document.querySelector("#yearly-comparison"),
  407. options
  408. );
  409. chart.render();
  410. */
  411. new Chartist.Bar('#yearly-comparison',
  412. {
  413. labels: [
  414. @if(isset($o))
  415. @foreach($o as $s)
  416. "{!! $s['outlet_name'] !!}",
  417. @endforeach
  418. @endif
  419. ],
  420. series: [
  421. {className: "stroke-green", meta: "OK", data: [@if(isset($o))
  422. @foreach($o as $s)
  423. {!! $s['orders'] !!},
  424. @endforeach
  425. @endif]},
  426. ]
  427. },
  428. {
  429. seriesBarDistance: 10,
  430. reverseData: true,
  431. horizontalBars: true,
  432. axisY: {
  433. offset: 70
  434. }
  435. });
  436. new Chartist.Bar('#chart',
  437. {
  438. labels: [
  439. @if(isset($totalSourceOrders))
  440. @foreach($totalSourceOrders as $s)
  441. "{!! $s['campaign_type'] !!}",
  442. @endforeach
  443. @endif
  444. ],
  445. series: [
  446. {className: "stroke-green", meta: "OK", data: [@if(isset($totalSourceOrders))
  447. @foreach($totalSourceOrders as $s)
  448. {!! $s['order_source'] !!},
  449. @endforeach
  450. @endif]},
  451. ]
  452. },
  453. {
  454. seriesBarDistance: 10,
  455. reverseData: true,
  456. horizontalBars: true,
  457. axisY: {
  458. offset: 70
  459. }
  460. });
  461. });
  462. </script>
  463. @endsection