resto_dashboard.blade.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  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. <link href="{!! env('APP_ASSETS') !!}vendor_components/bootstrap-daterangepicker/daterangepicker.css" rel="stylesheet">
  6. @endsection
  7. @section('content')
  8. @php
  9. $resto = \App\Models\Restaurants::find(\App\Helpers\CommonMethods::getRestuarantID());
  10. $lang = $resto->default_lang;
  11. app()->setLocale($lang);
  12. if(session('app_lang') !==null){
  13. $lang = session('app_lang');
  14. app()->setLocale($lang);
  15. }
  16. @endphp
  17. @php
  18. $restuarant1 = $resto;
  19. $resto_metas = \App\Helpers\CommonMethods::getRestoMetas($restuarant1);
  20. $currency = isset($resto_metas['BUSSINESS_CCY'])?$resto_metas['BUSSINESS_CCY']:"IQD";
  21. $business_type = isset($resto_metas['BUSSINESS_TYPE'])?$resto_metas['BUSSINESS_TYPE']:"Restaurants";
  22. @endphp
  23. <style type="text/css">
  24. .tbl_row,.tbl_h4_title{
  25. padding: 10px;
  26. }
  27. .tbl_h4_title
  28. {
  29. padding-left: 0;
  30. margin-left: 0 !important;
  31. }
  32. table {
  33. --bs-table-bg: transparent !important;
  34. }
  35. .dashboard-month-select{
  36. margin-top:8px;
  37. }
  38. @media (device-width: 854px) and (device-height: 534px) {
  39. .count_h3{
  40. font-size: 18px;
  41. }
  42. }
  43. </style>
  44. <!-- Content Wrapper. Contains page content -->
  45. <div class="content-wrapper">
  46. <div class="container-full">
  47. <!-- Main content -->
  48. <section class="content">
  49. <div class="row ">
  50. <div class="col-md-10">
  51. <div class="page-top-title">
  52. <h3 class="title m-0">{{__('label.dashboard')}}</h3>
  53. </div>
  54. </div>
  55. </div>
  56. <div class="row p-0 m-0">
  57. <div class="col-md-6 ">
  58. <div class="form-group">
  59. <label>Time frame</label>
  60. <div id="reportrange" style="background: #fff; cursor: pointer; padding: 5px 10px; border: 1px solid #ccc; width: 100%">
  61. <i class="fa fa-calendar"></i>&nbsp;
  62. <span></span> <i class="fa fa-caret-down"></i>
  63. </div>
  64. </div>
  65. </div>
  66. <!--<div class="col-md-6">
  67. <button class="form-control btn btn-md shadow-none ">Launch marketing activity</button>
  68. </div>-->
  69. </div>
  70. <div class="row m-0 align-items-center">
  71. <div class="col-md-6">
  72. <div class="count_div h-100 ">
  73. <div class="d-flex justify-content-between align-items-center">
  74. <div class="d-flex p-2 bd-highlight bd-highlight-w-50">
  75. <p class="count_title">{{__('label.total_orders')}}</p>
  76. </div>
  77. <div class="right_text_div right_text_div-w-50">
  78. <a class="d-block text-decoration-none count_atag">
  79. <h3 class="count_h3 text-break"><span rel="completed-orders">0</span></h3>
  80. <small class="text-secondary count_small_tag active">{{__('label.order_completed')}}</small>
  81. </a>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. <div class="col-md-6">
  87. <div class="count_div h-100 ">
  88. <div class="d-flex justify-content-between align-items-center">
  89. <div class="d-flex p-2 bd-highlight bd-highlight-w-50">
  90. <p class="count_title">{{__('label.average_basket_value')}}</p>
  91. </div>
  92. <div class="right_text_div right_text_div-w-50">
  93. <a class="d-block text-decoration-none count_atag">
  94. <div class="d-flex justify-content-center align-items-center">
  95. <small class="iqd_small">{!! $currency !!}</small>
  96. <h3 class="count_h3 text-break">
  97. <span rel="average_basket_value">0</span>
  98. </h3>
  99. </div>
  100. <small class="text-secondary count_small_tag">{{__('label.average_basket_value')}}</small>
  101. </a>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. <div class="col-md-6">
  107. <div class="count_div h-100 ">
  108. <div class="d-flex justify-content-between align-items-center">
  109. <div class="d-flex p-2 bd-highlight bd-highlight-w-50">
  110. <p class="count_title">{{__('label.total_sale')}}</p>
  111. </div>
  112. <div class="right_text_div right_text_div-w-50">
  113. <a class="d-block text-decoration-none count_atag">
  114. <div class="d-flex justify-content-center align-items-center">
  115. <small class="iqd_small">{!! $currency !!}</small>
  116. <h3 class="count_h3 text-break"> <span rel="total_sales">0</span></h3>
  117. </div>
  118. <small class="text-secondary count_small_tag">{{__('label.total_sale_revenue')}}</small>
  119. </a>
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. <div class="col-md-6">
  125. <div class="count_div h-100 ">
  126. <div class="d-flex justify-content-between align-items-center">
  127. <div class="d-flex p-2 bd-highlight bd-highlight-w-50">
  128. <p class="count_title">{{__('label.average_order_rating')}}</p>
  129. </div>
  130. <div class="right_text_div right_text_div-w-50">
  131. <a class="d-block text-decoration-none count_atag">
  132. <h3 class="count_h3 text-break">N/A</h3>
  133. <small class="text-secondary count_small_tag">{{__('label.average_order_rating')}}</small>
  134. </a>
  135. </div>
  136. </div>
  137. </div>
  138. </div>
  139. </div>
  140. <div class="row m-0">
  141. <div class="col-12 mt-25">
  142. <div class="tbl_row">
  143. <h4 class="m-5 tbl_h4_title">{{__('label.new_customers_x_returning_customers')}}</h4>
  144. <div class="table-responsive">
  145. <table class="table text-center table-borderless">
  146. <thead>
  147. <tr>
  148. <th scope="col"></th>
  149. <th scope="col">{{__('label.orders')}}</th>
  150. <th scope="col">{{__('label.customers')}}</th>
  151. <th scope="col">{{__('label.customers')}} %</th>
  152. <th scope="col">{{__('label.average_basket_value')}}</th>
  153. <th scope="col">{{__('label.total_sale')}}</th>
  154. </tr>
  155. </thead>
  156. <tbody>
  157. <tr>
  158. <td>{{__('label.new')}}</td>
  159. <td><span rel="new_orders">0</span></td>
  160. <td><span rel="nwe_customers">0</span></td>
  161. <td><span rel="new_customer_percentage">0</span></td>
  162. <td><span rel="new_orders_avg_basket">0</span></td>
  163. <td><span rel="new_orders_total_price">0</span></td>
  164. </tr>
  165. <tr class="row_background">
  166. <td>{{__('label.returning')}}</td>
  167. <td><span rel="old_orders">0</span></td>
  168. <td><span rel="old_customers">0</span></td>
  169. <td><span rel="old_customer_percentage">0</span></td>
  170. <td><span rel="old_orders_avg_basket">0</span></td>
  171. <td><span rel="old_orders_total_price">0</span></td>
  172. </tr>
  173. </tbody>
  174. <tfoot>
  175. {{-- <tr>--}}
  176. {{-- <th>{{__('label.total')}}</th>--}}
  177. {{-- <th><span ref="total_orders_new_old"></span></th>--}}
  178. {{-- <th><span ref="total_customers_new_old"></span></th>--}}
  179. {{-- <th>100%</th>--}}
  180. {{-- <th><span ref="total_basket_avg"></span></th>--}}
  181. {{-- <th><span ref="total_orders_price"></span></th>--}}
  182. {{-- </tr>--}}
  183. </tfoot>
  184. </table>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. <div class="row mt-25 mb-25 m-0">
  190. <div class="col-md-6">
  191. <div class="boxs">
  192. <div class="box-header with-border">
  193. <h4 class="box-title">{{__('label.total_order_by_source')}}</h4>
  194. </div>
  195. <div class="box-bodys">
  196. <div id="chart" class="h-350">
  197. </div>
  198. </div>
  199. </div>
  200. </div>
  201. <div class="col-md-6">
  202. <div class="boxs">
  203. <div class="box-header with-border2">
  204. <h4 class="box-title">{{__('label.total_orders_by_outlets')}}</h4>
  205. </div>
  206. <div class="box-bodys">
  207. <div id="yearly-comparison" class="h-350">
  208. </div>
  209. </div>
  210. </div>
  211. </div>
  212. </div>
  213. </section>
  214. <!-- /.content -->
  215. </div>
  216. </div>
  217. <!-- /.content-wrapper -->
  218. @endsection
  219. @section('js')
  220. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
  221. <script src="{!! env('APP_ASSETS') !!}vendor_components/apexcharts-bundle/dist/apexcharts.min.js"></script>
  222. <script src="{!! env('APP_ASSETS') !!}vendor_components/chartist-js-develop/chartist.js"></script>
  223. <script type="text/javascript" src="{!! env('APP_ASSETS') !!}vendor_components/bootstrap-daterangepicker/daterangepicker.min.js"></script>
  224. <!-- Chart Js -->
  225. <!-- Datatable Js -->
  226. <script>
  227. var resto_id = 0;
  228. var start = moment().subtract(29, 'days');
  229. var end = moment();
  230. $('#reportrange').daterangepicker({
  231. startDate: start,
  232. endDate: end,
  233. ranges: {
  234. 'Today': [moment(), moment()],
  235. 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
  236. 'Last 7 Days': [moment().subtract(6, 'days'), moment()],
  237. 'Last 30 Days': [moment().subtract(29, 'days'), moment()],
  238. 'This Month': [moment().startOf('month'), moment().endOf('month')],
  239. 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
  240. }
  241. }, cb);
  242. cb(start, end);
  243. function cb(start, end) {
  244. $('#reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));
  245. console.log("A new date selection was made: " + start.format('YYYY-MM-DD') + ' to ' + end.format('YYYY-MM-DD'));
  246. $.ajax({
  247. url:"{!! env('APP_URL') !!}dashboard/analytics",
  248. type:"POST",
  249. data:{
  250. start_date:start.format('YYYY-MM-DD') ,
  251. end_date:end.format('YYYY-MM-DD'),
  252. "_token":"{!! csrf_token() !!}"
  253. },
  254. success:function(response){
  255. $("span[rel=completed-orders]").html(response.total_orders);
  256. $("span[rel=total_sales]").html(response.total_sale);
  257. $("span[rel=total_sales]").html(response.total_sale);
  258. $("span[rel=average_basket_value]").html(response.average_basket_value);
  259. $("span[rel=new_orders]").html(response.orders.new_orders.value);
  260. $("span[rel=old_orders]").html(response.orders.old_orders.value);
  261. $("span[ref=total_orders_new_old]").html(parseFloat(response.orders.old_orders.value) + parseFloat(response.orders.new_orders.value));
  262. $("span[rel=nwe_customers]").html(response.customers.new_customer.value);
  263. $("span[rel=old_customers]").html(response.customers.old_customer.value);
  264. $("span[ref=total_customers_new_old]").html(parseFloat(response.customers.new_customer.value) + parseFloat(response.customers.old_customer.value));
  265. $("span[rel=new_customer_percentage]").html(response.customers.new_customer.percentage);
  266. $("span[rel=old_customer_percentage]").html(response.customers.old_customer.percentage);
  267. $("span[rel=new_orders_avg_basket]").html(response.average_basket.new);
  268. $("span[rel=old_orders_avg_basket]").html(response.average_basket.returning);
  269. $("span[ref=total_basket_avg]").html(parseFloat(response.average_basket.total_averge_basket) );
  270. $("span[rel=new_orders_total_price]").html(response.total_basket_sale.new);
  271. $("span[rel=old_orders_total_price]").html(response.total_basket_sale.returning);
  272. $("span[ref=total_orders_price]").html(parseFloat(response.total_basket_sale.total_sale) );
  273. var campaign_chart_labels = [];
  274. var campaign_chart_data = [];
  275. var outlet_chart_labels = [];
  276. var outlet_chart_data = [];
  277. var campaign_data = response.order_by_source;
  278. var outlet_data = response.order_by_outlet;
  279. if(campaign_data){
  280. $.each(campaign_data,function(i,v) {
  281. campaign_chart_labels.push(v.campaign_type);
  282. campaign_chart_data.push(v.total_campaign);
  283. })
  284. }
  285. if(outlet_data){
  286. $.each(outlet_data,function(i,v) {
  287. outlet_chart_labels.push(v.name);
  288. outlet_chart_data.push(v.orders);
  289. })
  290. }
  291. chart("#chart",campaign_chart_labels,campaign_chart_data);
  292. chart("#yearly-comparison",outlet_chart_labels,outlet_chart_data);
  293. }
  294. });
  295. }
  296. $(function () {
  297. chart("#chart");
  298. chart("#yearly-comparison");
  299. });
  300. function chart(chartCantainer,labels,seriesData){
  301. new Chartist.Bar(chartCantainer,
  302. {
  303. labels:labels,
  304. series: [
  305. {className: "stroke-green", meta: "OK", data: seriesData},
  306. ]
  307. },
  308. {
  309. seriesBarDistance: 10,
  310. reverseData: true,
  311. horizontalBars: true,
  312. axisY: {
  313. offset: 70
  314. }
  315. });
  316. // var chart = new ApexCharts(document.querySelector("#chart3"), options);
  317. // chart.render();
  318. }
  319. </script>
  320. @endsection