Browse Source

first commit

root 1 year atrás
commit
7aa2303043
100 changed files with 10649 additions and 0 deletions
  1. 136 0
      1
  2. 3 0
      1.php
  3. 66 0
      README.md
  4. BIN
      app.zip
  5. 32 0
      app/Console/Kernel.php
  6. 39 0
      app/Events/OrderNotification.php
  7. 41 0
      app/Exceptions/Handler.php
  8. 16 0
      app/Exports/CustomerExport.php
  9. 116 0
      app/Exports/ItemSalesExport.php
  10. 151 0
      app/Exports/OrderHistoryExport.php
  11. 16 0
      app/Exports/PaymentLinksExport.php
  12. 294 0
      app/Helpers/CommonMethods.php
  13. 177 0
      app/Helpers/CommonMethods.php_09-05
  14. 133 0
      app/Helpers/CommonMethods.php_1
  15. 94 0
      app/Http/Controllers/AdminUser.php
  16. 40 0
      app/Http/Controllers/Auth/ConfirmPasswordController.php
  17. 22 0
      app/Http/Controllers/Auth/ForgotPasswordController.php
  18. 98 0
      app/Http/Controllers/Auth/LoginController.php
  19. 73 0
      app/Http/Controllers/Auth/RegisterController.php
  20. 30 0
      app/Http/Controllers/Auth/ResetPasswordController.php
  21. 42 0
      app/Http/Controllers/Auth/VerificationController.php
  22. 106 0
      app/Http/Controllers/Blog.php
  23. 10 0
      app/Http/Controllers/BranchFeature.php
  24. 10 0
      app/Http/Controllers/BranchHour.php
  25. 101 0
      app/Http/Controllers/BusinessBioLink.php
  26. 136 0
      app/Http/Controllers/Category.php
  27. 113 0
      app/Http/Controllers/Category.php_1
  28. 10 0
      app/Http/Controllers/City.php
  29. 13 0
      app/Http/Controllers/Controller.php
  30. 187 0
      app/Http/Controllers/DMCity.php
  31. 157 0
      app/Http/Controllers/Discount.php
  32. 164 0
      app/Http/Controllers/ExtraOption.php
  33. 11 0
      app/Http/Controllers/ExtraOptionItem.php
  34. 575 0
      app/Http/Controllers/HomeController.php
  35. 302 0
      app/Http/Controllers/HomeController.php_2
  36. 45 0
      app/Http/Controllers/Loyalty.php
  37. 10 0
      app/Http/Controllers/MapRecipeCategory.php
  38. 1266 0
      app/Http/Controllers/Order.php
  39. 656 0
      app/Http/Controllers/Order.php_1
  40. 10 0
      app/Http/Controllers/OrderHist.php
  41. 471 0
      app/Http/Controllers/Outlet.php
  42. 415 0
      app/Http/Controllers/Outlet.php_1
  43. 76 0
      app/Http/Controllers/PaymentLink.php
  44. 22 0
      app/Http/Controllers/Photo.php
  45. 187 0
      app/Http/Controllers/PlaceManagement.php
  46. 690 0
      app/Http/Controllers/Recipe.php
  47. 430 0
      app/Http/Controllers/Recipe.php_1
  48. 481 0
      app/Http/Controllers/Recipe.php_bk
  49. 526 0
      app/Http/Controllers/Restaurant.php
  50. 68 0
      app/Http/Controllers/RestoTable.php
  51. 327 0
      app/Http/Controllers/RestoUser.php
  52. 24 0
      app/Http/Controllers/ShopMenu.php
  53. 70 0
      app/Http/Controllers/SpecialOffer.php
  54. 98 0
      app/Http/Controllers/StaticsReport.php
  55. 140 0
      app/Http/Controllers/Translation.php
  56. 194 0
      app/Http/Controllers/Waiter.php
  57. 70 0
      app/Http/Kernel.php
  58. 25 0
      app/Http/Middleware/AdminMiddleware.php
  59. 21 0
      app/Http/Middleware/Authenticate.php
  60. 57 0
      app/Http/Middleware/CheckRequestMethod.php
  61. 17 0
      app/Http/Middleware/EncryptCookies.php
  62. 17 0
      app/Http/Middleware/PreventRequestsDuringMaintenance.php
  63. 32 0
      app/Http/Middleware/RedirectIfAuthenticated.php
  64. 19 0
      app/Http/Middleware/TrimStrings.php
  65. 20 0
      app/Http/Middleware/TrustHosts.php
  66. 28 0
      app/Http/Middleware/TrustProxies.php
  67. 22 0
      app/Http/Middleware/ValidateSignature.php
  68. 17 0
      app/Http/Middleware/VerifyCsrfToken.php
  69. 62 0
      app/Jobs/SendOrderNotifications.php
  70. 53 0
      app/Jobs/SendOrderPusherNotification.php
  71. 15 0
      app/Models/AdminUsers.php
  72. 25 0
      app/Models/ApiTokens.php
  73. 11 0
      app/Models/Blogs.php
  74. 10 0
      app/Models/BranchDeliveryAreas.php
  75. 11 0
      app/Models/BranchFeatures.php
  76. 11 0
      app/Models/BranchHours.php
  77. 11 0
      app/Models/BusinessBioLinks.php
  78. 14 0
      app/Models/BusinessBioMetaLinks.php
  79. 66 0
      app/Models/Categories.php
  80. 15 0
      app/Models/Cities.php
  81. 11 0
      app/Models/ClothOptions.php
  82. 10 0
      app/Models/Colors.php
  83. 11 0
      app/Models/Countries.php
  84. 11 0
      app/Models/CustomerAddresses.php
  85. 12 0
      app/Models/CustomerLoyaltyHistories.php
  86. 23 0
      app/Models/Customers.php
  87. 19 0
      app/Models/DMCities.php
  88. 11 0
      app/Models/DiscountItems.php
  89. 11 0
      app/Models/DiscountOutlets.php
  90. 16 0
      app/Models/DiscountWithOrder.php
  91. 26 0
      app/Models/Discounts.php
  92. 15 0
      app/Models/ExtraOptionItems.php
  93. 15 0
      app/Models/ExtraOptions.php
  94. 11 0
      app/Models/Loyalties.php
  95. 12 0
      app/Models/LoyaltiesWithOrders.php
  96. 22 0
      app/Models/MapRecipeCategories.php
  97. 10 0
      app/Models/ModelLanguageItems.php
  98. 24 0
      app/Models/OrderActivities.php
  99. 10 0
      app/Models/OrderHists.php
  100. 0 0
      app/Models/OrderItems.php

+ 136 - 0
1

@@ -0,0 +1,136 @@
+@extends('layouts.app')
+@section('css')
+    <link href="{!! env('APP_ASSETS') !!}css/dashboard.css" rel="stylesheet" type="text/css">
+    @endsection
+@php
+    $current_page = strtolower(Route::currentRouteName());
+@endphp
+
+    @section('content')
+    <div class="content-wrapper">
+        <div class="container-full">
+             <section class="content">
+                <div class="row">
+                    <div class="col-6"><h3 style="margin-left: 10px">Blogs
+					</h3></div>
+                    @if(\Illuminate\Support\Facades\Auth::user()->role=="administrator" || \Illuminate\Support\Facades\Auth::user()->role=="admin_user" )
+					<div class="col-6 text-end"><a href="{!! env('APP_URL') !!}blog/new" class="btn btn-sm btn-danger float-right"><i class="glyphicon glyphicon-plus"></i> Add New </a></div>
+                   @endif
+                </div>
+
+                <div class="row">
+        <div class="col-xl-12">
+            <div class="card mb-4">
+
+                <div class="card-body">
+                    @if(\Illuminate\Support\Facades\Auth::user()->role=="administrator" || \Illuminate\Support\Facades\Auth::user()->role=="admin_user" )
+                    <div class="table-responsive">
+                        <table class="table table-stripped" id="dataTable" width="100%" cellspacing="0">
+                            <thead>
+                            <tr class="text-uppercase">
+                                <th width="60%">{!! strtoupper($current_page) !!}</th>
+                                <th width="10%">Is Published</th>
+                                <th width="10%">created At</th>
+
+                                <th  width="10%">Action</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            @if(isset($blogs) && $blogs->count() > 0)
+								@foreach($blogs as $blog)
+								<tr>
+									<td><span class="fw-bold">{!! $blog->title !!}</span><br />
+										<span class="text-muted"><small>{!! strip_tags(\Illuminate\Support\Str::substr($blog->content,0,150)) !!}</small></span>
+									</td>
+									<td>{!! $blog->is_published !!}</td>
+									<td>{!! \Carbon\Carbon::parse($blog->created_at)->format('d F, Y H:i') !!}</td>
+									<td>
+									<a href="{!! env('APP_URL') !!}blog/edit/{!! $blog->id !!}" class="btn btn-sm btn-primary"  data-toggle="tooltip" data-placement="top" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>
+                                    <a href="javascript:;" data-id="{!! $blog->id !!}" class="btn btn-sm btn-danger delete-blog"  data-toggle="tooltip" data-placement="top" title="Delete"><i class="glyphicon glyphicon-trash"></i></a>
+									</td>
+								</tr>
+								@endforeach
+								@endif
+
+                            </tbody>
+                        </table>
+                    </div>
+                    @else
+                            <div class="p-3 text-white bg-danger text-center">You are not authorized for this page</div>
+                    @endif
+                </div>
+            </div>
+        </div>
+    </div>
+
+             </section>
+         </div>
+     </div>
+
+     @endsection
+
+
+
+@section('js')
+<script src="{!! env("APP_ASSETS") !!}js/dataTables.editor.min.js"></script>
+    <script>
+        var resto_id = 0;
+
+
+
+        $(function () {
+
+
+
+
+			$("body").on("click",".close-modal",function(){
+
+				$("#create-translation").modal('hide');
+
+			});
+
+			$("body").on("click",".delete-blog",function(){
+				var _id = $(this).data('id');
+
+
+swal({
+  title: " Confirm?",
+  text: "Do you want delete?",
+  type: "error",
+  showCancelButton: true,
+  confirmButtonClass: "btn-danger",
+  confirmButtonText: " Confirm, delete it!",
+  cancelButtonText: "No, cancel please!",
+  closeOnConfirm: true,
+  closeOnCancel: true
+},
+function(isConfirm) {
+  if (isConfirm) {
+    $.ajax({
+		url:"{!! env('APP_URL') !!}blog/delete/"+_id,
+		success:function(){
+			location.reload();
+		}
+	});
+  }
+});
+
+			});
+
+            $('#dataTable').DataTable({
+                "bSort": true,
+                "searching": true,
+                "paging": true,
+                "info": true,
+
+                language: {
+                    paginate: {
+                        next: '<img src="{!! env("APP_ASSETS") !!}images/icons/next.png">', // or '→'
+                        previous: '<img src="{!! env("APP_ASSETS") !!}images/icons/preivew.png">' // or '←'
+                    }
+                },
+
+            });
+        })
+    </script>
+    @endsection

+ 3 - 0
1.php

@@ -0,0 +1,3 @@
+<?php
+phpinfo();
+?>

+ 66 - 0
README.md

@@ -0,0 +1,66 @@
+<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
+
+<p align="center">
+<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
+<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
+<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
+<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
+</p>
+
+## About Laravel
+
+Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
+
+- [Simple, fast routing engine](https://laravel.com/docs/routing).
+- [Powerful dependency injection container](https://laravel.com/docs/container).
+- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
+- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
+- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
+- [Robust background job processing](https://laravel.com/docs/queues).
+- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
+
+Laravel is accessible, powerful, and provides tools required for large, robust applications.
+
+## Learning Laravel
+
+Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
+
+You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
+
+If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
+
+## Laravel Sponsors
+
+We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
+
+### Premium Partners
+
+- **[Vehikl](https://vehikl.com/)**
+- **[Tighten Co.](https://tighten.co)**
+- **[WebReinvent](https://webreinvent.com/)**
+- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
+- **[64 Robots](https://64robots.com)**
+- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
+- **[Cyber-Duck](https://cyber-duck.co.uk)**
+- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
+- **[Jump24](https://jump24.co.uk)**
+- **[Redberry](https://redberry.international/laravel/)**
+- **[Active Logic](https://activelogic.com)**
+- **[byte5](https://byte5.de)**
+- **[OP.GG](https://op.gg)**
+
+## Contributing
+
+Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
+
+## Code of Conduct
+
+In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
+
+## Security Vulnerabilities
+
+If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
+
+## License
+
+The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).

BIN
app.zip


+ 32 - 0
app/Console/Kernel.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Console;
+
+use Illuminate\Console\Scheduling\Schedule;
+use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
+
+class Kernel extends ConsoleKernel
+{
+    /**
+     * Define the application's command schedule.
+     *
+     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
+     * @return void
+     */
+    protected function schedule(Schedule $schedule)
+    {
+        // $schedule->command('inspire')->hourly();
+    }
+
+    /**
+     * Register the commands for the application.
+     *
+     * @return void
+     */
+    protected function commands()
+    {
+        $this->load(__DIR__.'/Commands');
+
+        require base_path('routes/console.php');
+    }
+}

+ 39 - 0
app/Events/OrderNotification.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Events;
+
+use Illuminate\Broadcasting\PrivateChannel;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+
+class OrderNotification implements ShouldBroadcast
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+
+    public $resto_id;
+
+    public $message;
+
+    /**
+     * Create a new event instance.
+     *
+     * @return void
+     */
+    public function __construct($resto_id)
+    {
+        $this->resto_id = $resto_id;
+        $this->message  = "New Order is placed";
+    }
+
+    /**
+     * Get the channels the event should broadcast on.
+     *
+     * @return Channel|array
+     */
+    public function broadcastOn()
+    {
+        return new PrivateChannel('meem-order-production');
+    }
+}

+ 41 - 0
app/Exceptions/Handler.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Exceptions;
+
+use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+use Throwable;
+
+class Handler extends ExceptionHandler
+{
+    /**
+     * A list of the exception types that are not reported.
+     *
+     * @var array<int, class-string<Throwable>>
+     */
+    protected $dontReport = [
+        //
+    ];
+
+    /**
+     * A list of the inputs that are never flashed for validation exceptions.
+     *
+     * @var array<int, string>
+     */
+    protected $dontFlash = [
+        'current_password',
+        'password',
+        'password_confirmation',
+    ];
+
+    /**
+     * Register the exception handling callbacks for the application.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        $this->reportable(function (Throwable $e) {
+            //
+        });
+    }
+}

+ 16 - 0
app/Exports/CustomerExport.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Exports;
+
+use Maatwebsite\Excel\Concerns\FromCollection;
+
+class CustomerExport implements FromCollection
+{
+    /**
+    * @return \Illuminate\Support\Collection
+    */
+    public function collection()
+    {
+        //
+    }
+}

+ 116 - 0
app/Exports/ItemSalesExport.php

@@ -0,0 +1,116 @@
+<?php
+
+namespace App\Exports;
+
+use App\Helpers\CommonMethods;
+use App\Models\Recipes;
+use App\Models\StaticReports;
+use Illuminate\Database\Query\Builder;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Maatwebsite\Excel\Concerns\FromCollection;
+use Maatwebsite\Excel\Concerns\ShouldAutoSize;
+use Maatwebsite\Excel\Concerns\WithHeadings;
+
+class ItemSalesExport implements FromCollection, WithHeadings, ShouldAutoSize
+{
+    /**
+    * @return \Illuminate\Support\Collection
+    */
+    private $data = null;
+    private $logo = "";
+
+    public function __construct($data){
+        $this->data = $data;
+    }
+    public function collection()
+    {
+        $start_date = $this->data['start_date'];
+        $end_date = $this->data['end_date'];
+        $file_name = $this->data['file_name'];
+        $resto_id = CommonMethods::getRestuarantID();
+      //  dd($start_date,$end_date);
+        $items = Recipes::select('name','arabic_name','price')->withCount('items_sales')->whereHas('items_sales',function($q) use ($start_date,$end_date){
+            $q->whereBetween(DB::raw('DATE(created_at)'),[$start_date,$end_date]);
+        })->where('resto_id',$resto_id)->orderBy('items_sales_count','DESC')->get();
+       // dd($items);
+
+//        $status = 'Initial';
+//        $items = DB::table('tb_dm_order_items')->select(DB::raw('count(recipe_id) as recipe_count'),'recipe_id')
+//            ->whereIn('order_id',function($query) use($start_date,$end_date,$resto_id,$status){
+//                $query->select('id')->from('tb_dm_orders')
+//                    ->whereBetween(DB::raw('DATE(created_at)'),[$start_date,$end_date])
+//                    ->where('resto_id',$resto_id)
+//               ->where('status','!=',"'".$status."'");
+//            })->groupBy('recipe_id')->orderBy('recipe_count','DESC');
+//        Log::info("Query: ".$items->toSql());
+//        Log::info("Binding: ".json_encode($items->getBindings()));
+//
+//        $items = $items->get();
+        //$query = \DB::getQueryLog();
+        //dd(($query));
+
+
+
+        $item_sales = [];
+
+      //  dd($items[0]->items_sales_count);
+        if(isset($items) && $items->count() > 0){
+
+            foreach($items as $k=>$item){
+
+                if($item->items_sales_count > 0){
+
+                    Log::info("Quantity: ".json_encode($item->items_sales));
+                 //   dump($item);
+
+
+                $item_sales[] = array(
+                    //'id'=>$item->id,
+                    'name'=> $item->name,
+                    'arabic_name'=>$item->arabic_name,
+                    'price'=>$item->price,
+                    'item_sale_orders'=>$item->items_sales_count,
+                    'item_sold_quantity'=> $item->items_sales->sum('qty'),
+                    'item_sold_amount'=>number_format($item->items_sales->sum('price')),
+
+            );
+                }
+            }
+
+        }
+     //   dd($item_sales);
+
+        $r_item_sales = array(
+            'file_name'=>$file_name.'.xlsx',
+            'report_type'=>'items',
+            'start_date'=>$start_date,
+            'end_date'=>$end_date,
+            'is_data_found'=>count($item_sales) > 0?"Yes":"No",
+            'status'=>'active',
+            'searched_by'=>Auth::id(),
+            'resto_id'=>$resto_id
+        );
+
+        $r = StaticReports::where('start_date',$start_date)->whereNull('deleted_at')->where('end_date',$end_date)->where('report_type','items')->where('resto_id',$resto_id)->first();
+        if(!$r){
+            $report = StaticReports::insert($r_item_sales);
+        }
+
+        return collect($item_sales);
+
+    }
+     public function headings(): array
+     {
+         return [
+             'Item Name',
+             'Item Arabic Name',
+             'Item Price',
+             'Item Total Orders',
+             'Item Total Sold Quantity',
+             'Item Total Sold Amount'
+
+         ];
+     }
+}

+ 151 - 0
app/Exports/OrderHistoryExport.php

@@ -0,0 +1,151 @@
+<?php
+
+namespace App\Exports;
+use App\Helpers\CommonMethods;
+use App\Models\Orders;
+
+use App\Models\StaticReports;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\Auth;
+use Maatwebsite\Excel\Concerns\FromCollection;
+use Maatwebsite\Excel\Concerns\ShouldAutoSize;
+use Maatwebsite\Excel\Concerns\WithColumnFormatting;
+use Maatwebsite\Excel\Concerns\WithHeadings;
+use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
+use PhpOffice\PhpSpreadsheet\Style\Style;
+
+class OrderHistoryExport implements FromCollection, WithHeadings,ShouldAutoSize,WithColumnFormatting
+{
+    /**
+    * @return \Illuminate\Support\Collection
+    */
+    private $data = null;
+    private $logo = "";
+
+    public function __construct($data){
+        $this->data = $data;
+    }
+    public function collection()
+    {
+        $start_date = $this->data['start_date'];
+        $end_date = $this->data['end_date'];
+        $file_name = $this->data['file_name'];
+        $resto_id = CommonMethods::getRestuarantID();
+        $orders = Orders::with(['restaurants','order_with_discounts','customers'])
+            ->whereBetween('created_at',[$start_date,$end_date])->where('status','!=','Initial')
+            ->where('resto_id',$resto_id)
+            ->get();
+
+        $order_history = [];
+        $status['Has_Delivered'] = 'Delivered';
+        $status['Placed'] = 'Placed';
+        $status['Accepted'] = 'Accepted';
+        $status['Cancelled'] = "Cancelled";
+        $status['Close'] = "Close";
+        $status['Rejected_by_User'] = "Rejected By User";
+
+        if(isset($orders) && $orders->count() > 0 ){
+            foreach($orders as $order){
+                $discount = isset($order->order_with_discounts)?$order->order_with_discounts->discounted_amount:0;
+                $devliery_discount = isset($order->order_with_discounts)?$order->order_with_discounts->delivery_discount_value:0;
+
+                $address = $order->selected_area_formatted;
+                $lat = $lng = "";
+
+                if(empty($address)){
+
+                    $address = isset($order->customers) && isset($order->customers->main_address)?$order->customers->main_address->address:"";
+
+                    if(empty($address)){
+                        $address = $order->order_instructions;
+                    }
+                }
+
+                if($this->logo==""){
+                    $this->logo = $order->restaurants->photos->file_name;
+                }
+                $orderStatus = null;
+                if (array_key_exists(ucwords($order->status), $status)){
+                    $orderStatus = $status[ucwords($order->status)];
+                }else{
+                    $orderStatus=ucwords($order->status);
+                }
+
+                $order_history[] = array(
+                    'business_name'=>isset($order->restaurants)?$order->restaurants->name:"",
+                    'outlet_name'=>isset($order->outlet)?$order->outlet->name:"",
+                    'order_id'=>str_pad($order->id,6,0,STR_PAD_LEFT),
+                    'placed_at' => Carbon::parse($order->created_at)->format('l, d M Y'),
+                    'order_status'=>$orderStatus,
+                    'order_sub_total'=>number_format($order->total_price),
+                    'discount'=> number_format($discount),
+                    'delivery_fee'=>$order->delivery_fee,
+                    'tax'=>0,
+                    'order_total'=>($order->total_price - $discount) + ($order->delivery_fee - $devliery_discount),
+                    'channel'=>$order->campaign_type!=""?$order->campaign_type:"Direct",
+                    'delivery_date'=> $order->order_deliver_time,
+                    'payment_mode'=>strtolower($order->payment_mode)=="cod"?"Cash on Delivery":"Card",
+                    'customer_name'=>$order->customer_name,
+                    'mobile_number'=>isset($order->customers) && isset($order->customers->users)?'+'.$order->customers->users->email:"",
+                    'address'=> $address,
+                    'latitude'=>'',
+                    'longitude'=>''
+                );
+
+
+            }
+        }
+       // dd($order_history[0]);
+
+        $r_order = array(
+            'file_name'=>$file_name.'.xlsx',
+            'report_type'=>'orders',
+            'start_date'=>$start_date,
+            'end_date'=>$end_date,
+            'is_data_found'=>count($order_history) > 0?"Yes":"No",
+            'status'=>'active',
+            'searched_by'=>Auth::id(),
+            'resto_id'=>$resto_id
+        );
+
+        $r = StaticReports::where('start_date',$start_date)->whereNull('deleted_at')->where('end_date',$end_date)->where('report_type','orders')->where('resto_id',$resto_id)->first();
+        if(!$r){
+            $report = StaticReports::insert($r_order);
+        }
+
+        return collect($order_history);
+    }
+
+    public function headings(): array
+    {
+        return [
+            'Business Name',
+            'Outlet Name',
+            'Order_ID',
+            'Placed at',
+            'Order Status',
+            'Order Sub Total',
+            'Discount',
+            'Delivery Fee',
+            'Tax',
+            'Order Total',
+            'Channel',
+            'Delivery Date',
+            'Payment Mode',
+            'Customer Name',
+            'Mobile Number',
+            'Address',
+            'Latitude',
+            'Longitude'
+        ];
+    }
+
+    public function columnFormats(): array
+    {
+        return [
+            'N' => NumberFormat::FORMAT_TEXT
+        ];
+    }
+
+
+}

+ 16 - 0
app/Exports/PaymentLinksExport.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Exports;
+
+use Maatwebsite\Excel\Concerns\FromCollection;
+
+class PaymentLinksExport implements FromCollection
+{
+    /**
+    * @return \Illuminate\Support\Collection
+    */
+    public function collection()
+    {
+        //
+    }
+}

+ 294 - 0
app/Helpers/CommonMethods.php

@@ -0,0 +1,294 @@
+<?php
+namespace App\Helpers;
+use App\Companies;
+use App\Models\Restaurants;
+use http\Cookie;
+use Illuminate\Support\Facades\Crypt;
+use Str;
+use App\ApiTokens;
+use Aws\S3\S3Client;
+use Illuminate\Support\Facades\Auth;
+
+Class CommonMethods {
+
+    public static function formatDate($date=""){
+        if(empty($date))
+            $date = now();
+        return date('d, M Y',strtotime($date));
+    }
+
+    public static function formatDateTime($date=""){
+        if(empty($date))
+            $date = now();
+        return date('Y-m-d h:i a',strtotime($date));
+    }
+
+    public static function input_string_sanitize($string){
+        return htmlentities($string, ENT_QUOTES, 'UTF-8', false);
+    }
+
+    public static function format_report_number($id){
+        return str_pad($id,6,0, STR_PAD_LEFT);
+    }
+
+    public static function generateRandomString($length = 8) {
+        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!%$#*&^(){}[]';
+        $charactersLength = strlen($characters);
+        $randomString = '';
+        for ($i = 0; $i < $length; $i++) {
+            $randomString .= $characters[rand(0, $charactersLength - 1)];
+        }
+        return $randomString;
+    }
+
+    public static function generate_user_name($restaurants){
+        return Str::slug(strtolower(($restaurants).'-'.rand(1000,9999).'-'.substr(str_shuffle($restaurants),0,3)));
+    }
+
+    public static function encrypt($id){
+        return Crypt::encryptString($id);
+    }
+
+    public static function decrypt($string){
+        return Crypt::decryptString($string);
+    }
+
+    public static function fileSize($bytes){
+        $kb = 1024;
+        $mb = $kb * 1024;
+        $gb = $mb * 1024;
+        $tb = $gb * 1024;
+        if (($bytes >= 0) && ($bytes < $kb)) {
+            return $bytes . ' B';
+        } elseif (($bytes >= $kb) && ($bytes < $mb)) {
+            return ceil($bytes / $kb) . ' KB';
+        } elseif (($bytes >= $mb) && ($bytes < $gb)) {
+            return ceil($bytes / $mb) . ' MB';
+        } elseif (($bytes >= $gb) && ($bytes < $tb)) {
+            return ceil($bytes / $gb) . ' GB';
+        } elseif ($bytes >= $tb) {
+            return ceil($bytes / $tb) . ' TB';
+        } else {
+            return $bytes . ' B';
+        }
+
+    }
+
+
+    public static  function generateRequestID($user_id){
+        return date('Ymdhis').'-'.$user_id;
+    }
+
+    public static  function authenticate_token($token){
+        $user = ApiTokens::where('api_token',$token)->first();
+
+        if($user->users->is_active=="0" || $user->users->is_active==0){
+            //dd($user->users->is_active);
+
+            $response = [
+                'type' => 'error',
+                'message' =>  'Account is inative, contact to administrator!',
+                'code' =>'X003'
+            ];
+            echo json_encode($response);
+            exit;
+        }
+
+
+        return $user;
+    }
+
+    public static function sendResponse($result, $message)
+    {
+        $response = [
+            'type' => "success",
+            'data'    => $result,
+            'message' => $message,
+        ];
+
+
+        return response()->json($response, 200,[],JSON_UNESCAPED_UNICODE);
+    }
+    public static function sendError($error, $errorMessages = [], $code = 404)
+    {
+        $response = [
+            'type' => 'error',
+            'message' => $error,
+            'code' =>$code
+        ];
+
+
+        if(!empty($errorMessages)){
+            $response['data'] = $errorMessages;
+        }
+
+
+        return response()->json($response, 400);
+    }
+
+
+    public static function idFormat($restoId,$id){
+        return str_pad($restoId,4,0, STR_PAD_LEFT).'-'.str_pad($id,6,0, STR_PAD_LEFT);
+    }
+
+    public static function idFormatItem($restoId,$order_id,$id){
+        return str_pad($restoId,4,0, STR_PAD_LEFT).'-'.str_pad($order_id,6,0, STR_PAD_LEFT).'-'.str_pad($id,6,0, STR_PAD_LEFT);
+    }
+     public static function uploadFileToAWSCDN($budketName, $restoID ,$restoName ,$sourceFile,$fileName ){
+        $s3 = new S3Client([
+            'version' => 'latest',
+            'region'  => env('AWS_DEFAULT_REGION')
+        ]);
+        $bucket = $budketName;
+
+        $image = "";
+        try {
+            // Upload data.
+            $result = $s3->putObject([
+                'Bucket' => $bucket,
+                'Key'    =>  env('BUCKET_FOLDER')."/".$restoID.'-'.\Illuminate\Support\Str::slug($restoName)."/".$fileName ,
+                'SourceFile' => $sourceFile,
+                'Body'   => 'Hello, world!',
+                'ACL'    => 'public-read'
+            ]);
+
+
+
+
+            // Print the URL to the object.
+            $image = $result['ObjectURL'];
+            $result = array('type'=>'success','url'=>$image);
+            return $result;
+        } catch (S3Exception $e) {
+            $result = array('type'=>'error','message'=>$e->getMessage());
+
+            return $result;
+        }
+    }
+
+     public static function getRestuarantID(){
+       // return 110;
+        if(Auth::user()->role=='administrator')
+            return Auth::id();
+        else if(Auth::user()->role=='restaurant')
+            return Auth::user()->restaurants->id;
+        else if(Auth::user()->role=='admin_user')
+			return Auth::user()->admin_users->id;
+			else
+            return Auth::user()->resto_users->resto_id;
+
+    }
+
+    public static function changeImageLinkAWStoImgix($aws_image_link,$imgix, $width,$height,$quality){
+
+        return str_replace(env('AWS_URL_API'),$imgix,$aws_image_link).'?fm=webp&h='.$width.'&w='.$height.'&q='.$quality.'&fit=center&crop=center';
+    }
+
+    public static function getRestoMetas(Restaurants $restaurants){
+
+
+      //  $resto_metas = \Illuminate\Support\Facades\Cookie::get($restaurants->resto_unique_name.'_resto_metas');
+      //  if(!isset($resto_metas)){
+        if(1){
+
+
+        $resto_meta = isset($restaurants->resto_metas)?$restaurants->resto_metas:null;
+
+        //dump($resto_meta);
+        $resto_metas = [];
+        $billing = [];
+        if(isset($resto_meta)){
+            foreach($resto_meta as $meta){
+                if($meta->outlet_id!=""){
+
+                    continue;
+                }
+                $index_name = isset($meta->resto_meta_defs->parents)?$meta->resto_meta_defs->parents->meta_def_name:$meta->resto_meta_defs->meta_def_name;
+
+
+                //  dump($meta->resto_meta_defs);
+                if($index_name=="BILLING_GATEWAY"){
+                    //     dump($meta->resto_meta_defs->meta_def_name);
+                    // $resto_metas['BILLING_GATEWAY'][] = $meta->meta_val;
+                    $billing[] = array('id'=>$meta->meta_id,'value'=>$meta->meta_val);
+                }
+                $resto_metas[$index_name] = $meta->meta_val;
+            }
+        }
+        $resto_metas['BILLING_GATEWAY'] = $billing;
+        //\Illuminate\Support\Facades\Cookie::queue($restaurants->resto_unique_name.'_resto_metas',json_encode($resto_metas),'3600');
+
+        return $resto_metas;
+        }else{
+            $resto_metas = json_decode($resto_metas,true);
+
+            return $resto_metas;
+        }
+    }
+    public static function getIPBasedInfo($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
+        $output = NULL;
+        if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
+            $ip = $_SERVER["REMOTE_ADDR"];
+            if ($deep_detect) {
+                if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
+                    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
+                if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
+                    $ip = $_SERVER['HTTP_CLIENT_IP'];
+            }
+        }
+        $purpose    = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
+        $support    = array("country", "countrycode", "state", "region", "city", "location", "address");
+        $continents = array(
+            "AF" => "Africa",
+            "AN" => "Antarctica",
+            "AS" => "Asia",
+            "EU" => "Europe",
+            "OC" => "Australia (Oceania)",
+            "NA" => "North America",
+            "SA" => "South America"
+        );
+        if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
+            $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
+            if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
+                switch ($purpose) {
+                    case "location":
+                        $output = array(
+                            "city"           => @$ipdat->geoplugin_city,
+                            "state"          => @$ipdat->geoplugin_regionName,
+                            "country"        => @$ipdat->geoplugin_countryName,
+                            "country_code"   => @$ipdat->geoplugin_countryCode,
+                            "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
+                            "continent_code" => @$ipdat->geoplugin_continentCode,
+
+                            'currency'          => @$ipdat->geoplugin_currencyCode
+                        );
+                        break;
+                    case "address":
+                        $address = array($ipdat->geoplugin_countryName);
+                        if (@strlen($ipdat->geoplugin_regionName) >= 1)
+                            $address[] = $ipdat->geoplugin_regionName;
+                        if (@strlen($ipdat->geoplugin_city) >= 1)
+                            $address[] = $ipdat->geoplugin_city;
+                        $output = implode(", ", array_reverse($address));
+                        break;
+                    case "city":
+                        $output = @$ipdat->geoplugin_city;
+                        break;
+                    case "state":
+                        $output = @$ipdat->geoplugin_regionName;
+                        break;
+                    case "region":
+                        $output = @$ipdat->geoplugin_regionName;
+                        break;
+                    case "country":
+                        $output = @$ipdat->geoplugin_countryName;
+                        break;
+                    case "countrycode":
+                        $output = @$ipdat->geoplugin_countryCode;
+                        break;
+                }
+            }
+        }
+        return $output;
+    }
+}

+ 177 - 0
app/Helpers/CommonMethods.php_09-05

@@ -0,0 +1,177 @@
+<?php
+namespace App\Helpers;
+use App\Companies;
+use Illuminate\Support\Facades\Crypt;
+use Str;
+use App\ApiTokens;
+use Aws\S3\S3Client;
+use Illuminate\Support\Facades\Auth;
+
+Class CommonMethods {
+
+    public static function formatDate($date=""){
+        if(empty($date))
+            $date = now();
+        return date('d, M Y',strtotime($date));
+    }
+
+    public static function formatDateTime($date=""){
+        if(empty($date))
+            $date = now();
+        return date('Y-m-d h:i a',strtotime($date));
+    }
+
+    public static function input_string_sanitize($string){
+        return htmlentities($string, ENT_QUOTES, 'UTF-8', false);
+    }
+
+    public static function format_report_number($id){
+        return str_pad($id,6,0, STR_PAD_LEFT);
+    }
+
+    public static function generateRandomString($length = 8) {
+        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!%$#*&^(){}[]';
+        $charactersLength = strlen($characters);
+        $randomString = '';
+        for ($i = 0; $i < $length; $i++) {
+            $randomString .= $characters[rand(0, $charactersLength - 1)];
+        }
+        return $randomString;
+    }
+
+    public static function generate_user_name($restaurants){
+        return Str::slug(strtolower(($restaurants).'-'.rand(1000,9999).'-'.substr(str_shuffle($restaurants),0,3)));
+    }
+
+    public static function encrypt($id){
+        return Crypt::encryptString($id);
+    }
+
+    public static function decrypt($string){
+        return Crypt::decryptString($string);
+    }
+
+    public static function fileSize($bytes){
+        $kb = 1024;
+        $mb = $kb * 1024;
+        $gb = $mb * 1024;
+        $tb = $gb * 1024;
+        if (($bytes >= 0) && ($bytes < $kb)) {
+            return $bytes . ' B';
+        } elseif (($bytes >= $kb) && ($bytes < $mb)) {
+            return ceil($bytes / $kb) . ' KB';
+        } elseif (($bytes >= $mb) && ($bytes < $gb)) {
+            return ceil($bytes / $mb) . ' MB';
+        } elseif (($bytes >= $gb) && ($bytes < $tb)) {
+            return ceil($bytes / $gb) . ' GB';
+        } elseif ($bytes >= $tb) {
+            return ceil($bytes / $tb) . ' TB';
+        } else {
+            return $bytes . ' B';
+        }
+
+    }
+
+
+    public static  function generateRequestID($user_id){
+        return date('Ymdhis').'-'.$user_id;
+    }
+
+    public static  function authenticate_token($token){
+        $user = ApiTokens::where('api_token',$token)->first();
+
+        if($user->users->is_active=="0" || $user->users->is_active==0){
+            //dd($user->users->is_active);
+
+            $response = [
+                'type' => 'error',
+                'message' =>  'Account is inative, contact to administrator!',
+                'code' =>'X003'
+            ];
+            echo json_encode($response);
+            exit;
+        }
+
+
+        return $user;
+    }
+
+    public static function sendResponse($result, $message)
+    {
+        $response = [
+            'type' => "success",
+            'data'    => $result,
+            'message' => $message,
+        ];
+
+
+        return response()->json($response, 200,[],JSON_UNESCAPED_UNICODE);
+    }
+    public static function sendError($error, $errorMessages = [], $code = 404)
+    {
+        $response = [
+            'type' => 'error',
+            'message' => $error,
+            'code' =>$code
+        ];
+
+
+        if(!empty($errorMessages)){
+            $response['data'] = $errorMessages;
+        }
+
+
+        return response()->json($response, 400);
+    }
+
+
+    public static function idFormat($restoId,$id){
+        return str_pad($restoId,4,0, STR_PAD_LEFT).'-'.str_pad($id,6,0, STR_PAD_LEFT);
+    }
+
+    public static function idFormatItem($restoId,$order_id,$id){
+        return str_pad($restoId,4,0, STR_PAD_LEFT).'-'.str_pad($order_id,6,0, STR_PAD_LEFT).'-'.str_pad($id,6,0, STR_PAD_LEFT);
+    }
+     public static function uploadFileToAWSCDN($budketName, $restoID ,$restoName ,$sourceFile,$fileName ){
+        $s3 = new S3Client([
+            'version' => 'latest',
+            'region'  => env('AWS_DEFAULT_REGION')
+        ]);
+        $bucket = $budketName;
+
+        $image = "";
+        try {
+            // Upload data.
+            $result = $s3->putObject([
+                'Bucket' => $bucket,
+                'Key'    =>  env('BUCKET_FOLDER')."/".$restoID.'-'.\Illuminate\Support\Str::slug($restoName)."/".$fileName ,
+                'SourceFile' => $sourceFile,
+                'Body'   => 'Hello, world!',
+                'ACL'    => 'public-read'
+            ]);
+
+            
+
+
+            // Print the URL to the object.
+            $image = $result['ObjectURL'];
+            $result = array('type'=>'success','url'=>$image);
+            return $result;
+        } catch (S3Exception $e) {
+            $result = array('type'=>'error','message'=>$e->getMessage());
+
+            return $result;
+        }
+    }
+
+     public static function getRestuarantID(){
+       // return 110;
+        if(Auth::user()->role=='administrator')
+            return Auth::id();
+        else if(Auth::user()->role=='restaurant')
+            return Auth::user()->restaurants->id;
+        else
+            return Auth::user()->resto_users->resto_id;
+
+    }
+}

+ 133 - 0
app/Helpers/CommonMethods.php_1

@@ -0,0 +1,133 @@
+<?php
+namespace App\Helpers;
+use App\Companies;
+use Illuminate\Support\Facades\Crypt;
+use Str;
+use App\ApiTokens;
+
+Class CommonMethods {
+
+    public static function formatDate($date=""){
+        if(empty($date))
+            $date = now();
+        return date('d, M Y',strtotime($date));
+    }
+
+    public static function formatDateTime($date=""){
+        if(empty($date))
+            $date = now();
+        return date('Y-m-d h:i a',strtotime($date));
+    }
+
+    public static function input_string_sanitize($string){
+        return htmlentities($string, ENT_QUOTES, 'UTF-8', false);
+    }
+
+    public static function format_report_number($id){
+        return str_pad($id,6,0, STR_PAD_LEFT);
+    }
+
+    public static function generateRandomString($length = 8) {
+        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!%$#*&^(){}[]';
+        $charactersLength = strlen($characters);
+        $randomString = '';
+        for ($i = 0; $i < $length; $i++) {
+            $randomString .= $characters[rand(0, $charactersLength - 1)];
+        }
+        return $randomString;
+    }
+
+    public static function generate_user_name($restaurants){
+        return Str::slug(strtolower(($restaurants).'-'.rand(1000,9999).'-'.substr(str_shuffle($restaurants),0,3)));
+    }
+
+    public static function encrypt($id){
+        return Crypt::encryptString($id);
+    }
+
+    public static function decrypt($string){
+        return Crypt::decryptString($string);
+    }
+
+    public static function fileSize($bytes){
+        $kb = 1024;
+        $mb = $kb * 1024;
+        $gb = $mb * 1024;
+        $tb = $gb * 1024;
+        if (($bytes >= 0) && ($bytes < $kb)) {
+            return $bytes . ' B';
+        } elseif (($bytes >= $kb) && ($bytes < $mb)) {
+            return ceil($bytes / $kb) . ' KB';
+        } elseif (($bytes >= $mb) && ($bytes < $gb)) {
+            return ceil($bytes / $mb) . ' MB';
+        } elseif (($bytes >= $gb) && ($bytes < $tb)) {
+            return ceil($bytes / $gb) . ' GB';
+        } elseif ($bytes >= $tb) {
+            return ceil($bytes / $tb) . ' TB';
+        } else {
+            return $bytes . ' B';
+        }
+
+    }
+
+
+    public static  function generateRequestID($user_id){
+        return date('Ymdhis').'-'.$user_id;
+    }
+
+    public static  function authenticate_token($token){
+        $user = ApiTokens::where('api_token',$token)->first();
+
+        if($user->users->is_active=="0" || $user->users->is_active==0){
+            //dd($user->users->is_active);
+
+            $response = [
+                'type' => 'error',
+                'message' =>  'Account is inative, contact to administrator!',
+                'code' =>'X003'
+            ];
+            echo json_encode($response);
+            exit;
+        }
+
+
+        return $user;
+    }
+
+    public static function sendResponse($result, $message)
+    {
+        $response = [
+            'type' => "success",
+            'data'    => $result,
+            'message' => $message,
+        ];
+
+
+        return response()->json($response, 200,[],JSON_UNESCAPED_UNICODE);
+    }
+    public static function sendError($error, $errorMessages = [], $code = 404)
+    {
+        $response = [
+            'type' => 'error',
+            'message' => $error,
+            'code' =>$code
+        ];
+
+
+        if(!empty($errorMessages)){
+            $response['data'] = $errorMessages;
+        }
+
+
+        return response()->json($response, 400);
+    }
+
+
+    public static function idFormat($restoId,$id){
+        return str_pad($restoId,4,0, STR_PAD_LEFT).'-'.str_pad($id,6,0, STR_PAD_LEFT);
+    }
+
+    public static function idFormatItem($restoId,$order_id,$id){
+        return str_pad($restoId,4,0, STR_PAD_LEFT).'-'.str_pad($order_id,6,0, STR_PAD_LEFT).'-'.str_pad($id,6,0, STR_PAD_LEFT);
+    }
+}

+ 94 - 0
app/Http/Controllers/AdminUser.php

@@ -0,0 +1,94 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use \App\Models\AdminUsers;
+use \App\Models\User;
+use Illuminate\Support\Str;
+use Illuminate\Support\Facades\Storage;
+use File;
+use App\Helpers\CommonMethods;
+use Image;
+use Hash;
+use \App\Models\SendEmail;
+class AdminUser extends Controller
+{
+    //
+	public function users(){
+		$admin_users = AdminUsers::whereNull('deleted_at')->get();
+		return view('admin-users.users',['users'=>$admin_users]);
+	}
+	public function new_user(){
+		return view("admin-users.admin_user_form");
+	}
+
+	public function edit_user($id){
+		$admin_user= AdminUsers::find($id);
+		return view("admin_users.admin_user_form",['admin_user'=>$admin_user]);
+	}
+
+	public function save_user(Request $request){
+
+		$id = $request->id;
+		$password = CommonMethods::generateRandomString();
+		$new_user = false;
+		if($id==""){
+			$new_user = true;
+			$user = new User();
+         $username = CommonMethods::generate_user_name($request->first_name.' '.$request->last_name);
+
+
+            $user->name = $request->first_name.' '.$request->last_name;
+            $user->username = $username;
+            $user->password = Hash::make($password);
+            if(!empty($request->email))
+            $user->email = $request->email;
+            $user->is_active = 1;
+            $user->role='admin_user';
+            $user->save();
+
+            $user_id = $user->id;
+
+			 $param = array(
+                            'email'=>$request->email,
+                            'name' => $request->first_name.' '.$request->last_name,
+                            'username' => $username,
+                            'password' => $password
+
+                      );
+
+        SendEmail::sendAdminUserCredentials($param);
+
+			$admin_user = new AdminUsers();
+			$admin_user->user_id = $user_id;
+		}
+
+		else
+			$admin_user = AdminUsers::find($id);
+
+		$admin_user->first_name = $request->first_name;
+		$admin_user->last_name = ($request->last_name);
+
+		$admin_user->mobile_number = $request->mobile_number;
+
+		$admin_user->address = $request->address;
+		$url = "";
+
+                $admin_user->save();
+
+				$id = $admin_user->id;
+		if($id > 0){
+			 echo json_encode(array('type' => 'success', 'message'=>"admin_user's data is saved successfully."));
+		}else{
+			echo json_encode(array('type' => 'error', 'message'=>"admin_user's data is not saved, check info again."));
+		}
+
+	}
+
+	public function delete_user($id){
+		$admin_user = AdminUsers::find($id);
+		$admin_user->deleted_at = date('Y-m-d H:i:s');
+		$admin_user->save();
+	}
+}

+ 40 - 0
app/Http/Controllers/Auth/ConfirmPasswordController.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Foundation\Auth\ConfirmsPasswords;
+
+class ConfirmPasswordController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Confirm Password Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller is responsible for handling password confirmations and
+    | uses a simple trait to include the behavior. You're free to explore
+    | this trait and override any functions that require customization.
+    |
+    */
+
+    use ConfirmsPasswords;
+
+    /**
+     * Where to redirect users when the intended url fails.
+     *
+     * @var string
+     */
+    protected $redirectTo = RouteServiceProvider::HOME;
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('auth');
+    }
+}

+ 22 - 0
app/Http/Controllers/Auth/ForgotPasswordController.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
+
+class ForgotPasswordController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller is responsible for handling password reset emails and
+    | includes a trait which assists in sending these notifications from
+    | your application to your users. Feel free to explore this trait.
+    |
+    */
+
+    use SendsPasswordResetEmails;
+}

+ 98 - 0
app/Http/Controllers/Auth/LoginController.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Foundation\Auth\AuthenticatesUsers;
+Use Redirect;
+use Auth;
+use App\Models\User;
+use Hash;
+use Illuminate\Http\Request;
+use Validator;
+
+class LoginController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Login Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller handles authenticating users for the application and
+    | redirecting them to your home screen. The controller uses a trait
+    | to conveniently provide its functionality to your applications.
+    |
+    */
+
+    use AuthenticatesUsers;
+
+    /**
+     * Where to redirect users after login.
+     *
+     * @var string
+     */
+    protected $redirectTo = RouteServiceProvider::HOME;
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest')->except('logout');
+    }
+    public function postLogin(Request $request)
+    {
+        //    dd($request->all());
+
+        $validator = Validator::make($request->all(), [
+            'username' => 'required',
+            'password' => 'required|min:8',
+        ]);
+
+        if ($validator->fails()) {
+
+            Redirect::to('/')
+                ->withErrors($validator)
+                ->withInput()->send();
+
+        } else {
+            $credentials = $request->only('username', 'password');
+            //dd($credentials);
+
+            $password = Hash::make($credentials['password']);
+
+            $user = User::where('username', $credentials['username'])
+                //  ->where('password', $password)
+                // ->where('role','restaurant')
+                ->where('is_active', 1)
+                ->first();
+
+            if ($user && Hash::check($credentials['password'], $user->password)) {
+
+                Auth::loginUsingId($user->user_id);
+                // -- OR -- //
+                Auth::login($user, true);
+
+
+                if($user->role=="admin_user")
+                    return redirect()->intended('/blogs');
+
+                if($user->role=="resto_user"){
+                    if($user->resto_users->role=="staff")
+                        return redirect()->intended('/orders');
+                }
+
+                return redirect()->intended('/dashboard');
+
+
+            } else {
+                return redirect()->intended('/')->withErrors([$this->username() => 'You have entered an invalid username or password']);
+            }
+            //
+
+        }
+    }
+}

+ 73 - 0
app/Http/Controllers/Auth/RegisterController.php

@@ -0,0 +1,73 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use App\Models\User;
+use Illuminate\Foundation\Auth\RegistersUsers;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Validator;
+
+class RegisterController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Register Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller handles the registration of new users as well as their
+    | validation and creation. By default this controller uses a trait to
+    | provide this functionality without requiring any additional code.
+    |
+    */
+
+    use RegistersUsers;
+
+    /**
+     * Where to redirect users after registration.
+     *
+     * @var string
+     */
+    protected $redirectTo = RouteServiceProvider::HOME;
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest');
+    }
+
+    /**
+     * Get a validator for an incoming registration request.
+     *
+     * @param  array  $data
+     * @return \Illuminate\Contracts\Validation\Validator
+     */
+    protected function validator(array $data)
+    {
+        return Validator::make($data, [
+            'name' => ['required', 'string', 'max:255'],
+            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
+            'password' => ['required', 'string', 'min:8', 'confirmed'],
+        ]);
+    }
+
+    /**
+     * Create a new user instance after a valid registration.
+     *
+     * @param  array  $data
+     * @return \App\Models\User
+     */
+    protected function create(array $data)
+    {
+        return User::create([
+            'name' => $data['name'],
+            'email' => $data['email'],
+            'password' => Hash::make($data['password']),
+        ]);
+    }
+}

+ 30 - 0
app/Http/Controllers/Auth/ResetPasswordController.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Foundation\Auth\ResetsPasswords;
+
+class ResetPasswordController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller is responsible for handling password reset requests
+    | and uses a simple trait to include this behavior. You're free to
+    | explore this trait and override any methods you wish to tweak.
+    |
+    */
+
+    use ResetsPasswords;
+
+    /**
+     * Where to redirect users after resetting their password.
+     *
+     * @var string
+     */
+    protected $redirectTo = RouteServiceProvider::HOME;
+}

+ 42 - 0
app/Http/Controllers/Auth/VerificationController.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use App\Providers\RouteServiceProvider;
+use Illuminate\Foundation\Auth\VerifiesEmails;
+
+class VerificationController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Email Verification Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller is responsible for handling email verification for any
+    | user that recently registered with the application. Emails may also
+    | be re-sent if the user didn't receive the original email message.
+    |
+    */
+
+    use VerifiesEmails;
+
+    /**
+     * Where to redirect users after verification.
+     *
+     * @var string
+     */
+    protected $redirectTo = RouteServiceProvider::HOME;
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('auth');
+        $this->middleware('signed')->only('verify');
+        $this->middleware('throttle:6,1')->only('verify', 'resend');
+    }
+}

+ 106 - 0
app/Http/Controllers/Blog.php

@@ -0,0 +1,106 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use \App\Models\Blogs;
+use Illuminate\Support\Str;
+use Illuminate\Support\Facades\Storage;
+use File;
+use App\Helpers\CommonMethods;
+use Nette\Utils\Image;
+class Blog extends Controller
+{
+    //
+	public function blogs(){
+		$blogs = Blogs::whereNull('deleted_at')->where('rec_purpose','blogs')->get();
+		return view('blogs.blogs',['blogs'=>$blogs]);
+	}
+	public function new_blog(){
+		return view("blogs.blog_form");
+	}
+
+	public function edit_blog($id){
+		$blog= Blogs::find($id);
+		return view("blogs.blog_form",['blog'=>$blog]);
+	}
+
+	public function save_blog(Request $request){
+
+		$id = $request->id;
+
+		if($id=="")
+			$blog = new Blogs();
+		else
+			$blog = Blogs::find($id);
+
+		$blog->title = $request->title;
+		$blog->slug = Str::slug($request->title);
+
+		$blog->content = $request->content;
+        $blog->rec_purpose = $request->rec_purpose;
+		$blog->short_description = $request->short_description;
+		$blog->is_published = isset($request->is_published)?"Yes":"No";
+
+		$url = "";
+
+
+			if($request->hasFile('media')){
+                    $media = $request->file('media');
+				//dd($media);
+
+				 $file_name = Str::slug($request->name)."-blog".'-'.time();
+                    $extension = $media->getClientOriginalExtension();
+
+
+
+
+                    Storage::disk('logo')->put($file_name.'.'.$extension,  File::get($media));
+
+                    $destinationPath = public_path('/uploads/logo/');
+
+
+                    $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                   /* $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(85, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+                    $file = public_path('/uploads/logo/'.$file_name.'.'.$extension);
+                    $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',time(), 'blog',$file,$file_name);
+				$url = isset($result) && isset($result['url'])?$result['url']:"";
+				$blog->media = $url;
+			}
+
+
+				$blog->save();
+
+				$id = $blog->id;
+		if($id > 0){
+			 echo json_encode(array('type' => 'success', 'message'=>"Blog's data is saved successfully."));
+		}else{
+			echo json_encode(array('type' => 'error', 'message'=>"Blog's data is not saved, check info again."));
+		}
+
+	}
+
+	public function delete_blog($id){
+		$blog = Blogs::find($id);
+		$blog->deleted_at = date('Y-m-d H:i:s');
+		$blog->save();
+	}
+
+    // -------- DOCS ----------------------------------
+
+    public function docs(){
+        $blogs = Blogs::whereNull('deleted_at')->where('rec_purpose','docs')->get();
+        return view('blogs.blogs',['blogs'=>$blogs]);
+    }
+
+}

+ 10 - 0
app/Http/Controllers/BranchFeature.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class BranchFeature extends Controller
+{
+    //
+}

+ 10 - 0
app/Http/Controllers/BranchHour.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class BranchHour extends Controller
+{
+    //
+}

+ 101 - 0
app/Http/Controllers/BusinessBioLink.php

@@ -0,0 +1,101 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Helpers\CommonMethods;
+use App\Models\BusinessBioLinks;
+use App\Models\BusinessBioMetaLinks;
+use App\Models\Restaurants;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
+use Image;
+use File;
+
+class BusinessBioLink extends Controller
+{
+    //
+    public function index(){
+        $resto_id = CommonMethods::getRestuarantID();
+        $businessLinks = BusinessBioMetaLinks::with('business_links')->where('resto_id',$resto_id)->first();
+        return view('bio-link.bio-links',['businessLinks'=>$businessLinks]);
+    }
+
+    public function save_bio_link(Request  $request){
+        $social_media_type = $request->social_media_type;
+        $social_media_link = $request->social_media_link;
+        $social_label = $request->social_label;
+            $resto_id = CommonMethods::getRestuarantID();
+        if(count($social_media_type) > 0 && count($social_media_link) > 0){
+            $businessMeta = BusinessBioMetaLinks::where('resto_id',$resto_id)->first();
+            if(!isset($businessMeta))
+            $businessMeta = new BusinessBioMetaLinks();
+
+            $businessMeta->resto_id = $resto_id;
+            $backgroundImage = "";
+
+            if($request->hasFile('background_image')) {
+                $resto = Restaurants::find($resto_id);
+                $bg_image = $request->file('background_image');
+
+                $file_name = "social-bg-image".'-'.time().'-'.$resto_id.'-'.rand(1000,9999);
+                $extension = $bg_image->getClientOriginalExtension();
+
+
+                $allow_extensions = ['jpg','jpeg'];
+
+                if(!in_array(strtolower($extension),$allow_extensions)){
+                    return response()->json(array('type' => 'error', 'message' => "Only jpg, jpeg extensions are allowed."),200);
+                    exit;
+                }
+
+                Storage::disk('logo')->put($file_name.'.'.$extension,  File::get($bg_image));
+
+                $destinationPath = public_path('/uploads/logo/');
+
+
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                /* $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(85, null, function ($constraint) {
+                     $constraint->aspectRatio();
+                 });
+
+                 $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+                $file = public_path('/uploads/logo/'.$file_name.'.'.$extension);
+                $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$resto_id, \Illuminate\Support\Str::slug($resto->name),$file,$file_name);
+
+                $backgroundImage =  $result['url'];
+
+                $businessMeta->background_image = $backgroundImage;
+            }
+
+
+            $businessMeta->save();
+
+            $meta_id = $businessMeta->id;
+            BusinessBioLinks::where('resto_id',$resto_id)->delete();
+            foreach($social_media_type as $k=>$value){
+                if(!empty($social_media_link[$k])){
+                $socialLink = new BusinessBioLinks();
+                $socialLink->resto_id = $resto_id;
+                $socialLink->bio_link_meta_id = $meta_id;
+                $socialLink->social_type = $value;
+                $socialLink->social_link = $social_media_link[$k];
+                $socialLink->social_label = $social_label[$k];
+                $socialLink->status = 1;
+
+                $socialLink->save();
+                }
+            }
+
+            return response()->json(array('type'=>'success','message'=>'Links are saved'),200);
+        }
+        return response()->json(array('type'=>'error','message'=>'No Links are found with request'),200);
+    }
+}

+ 136 - 0
app/Http/Controllers/Category.php

@@ -0,0 +1,136 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Categories;
+use App\Models\Photos;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Storage;
+use App\Helpers\CommonMethods;
+use Str;
+use File;
+use Image;
+
+class Category extends Controller
+{
+    //
+
+    public function categories(){
+             $resto_id = CommonMethods::getRestuarantID();
+             $categories = Categories::whereNull('deleted_at')->whereIn('resto_id',[$resto_id])->orderBy('display_order','ASC')->get();
+
+        $data = [
+            'categories' => $categories
+        ];
+        return view('categories.categories',$data);
+    }
+
+    public function new_category(){
+
+        return view('categories.category_form');
+    }
+
+    public function save(Request $request)
+    {
+        //  dd($request->all());
+
+        $id = $request->id;
+        if(empty($id)){
+            $category = new Categories();
+            $category->unique_id = \Illuminate\Support\Str::uuid();
+        }
+
+        else
+            $category = Categories::find($id);
+
+        $category->name = $request->name;
+        $category->arabic_name = $request->arabic_name;
+        $category->is_active =1;
+        $category->resto_id = CommonMethods::getRestuarantID();
+        $category->parent_id = $request->parent_id;
+        $category->save();
+
+        $id = $category->id;
+        if($request->hasFile('main_image')){
+            $logo = $request->file('main_image');
+
+
+
+            $file_name = "category-".Str::slug($request->name)."-main_image".'-'.time();
+            $extension = $logo->getClientOriginalExtension();
+
+
+
+            Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+            $destinationPath = public_path('/uploads/main_image');
+            $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(500, null, function ($constraint) {
+                $constraint->aspectRatio();
+            });
+
+
+
+             $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+			$file = public_path('/uploads/main_image/'.$file_name.'.'.$extension);
+                    $result = CommonMethods::uploadFileToAWSCDN('meemapp-order','resto-'.CommonMethods::getRestuarantID(), 'category',$file,$file_name);
+
+
+
+
+            $main_image = Photos::where('category_id',$id)->where('photo_type','main_image')->first();
+            if(!$main_image)
+                $main_image = new Photos();
+
+
+			 $main_image->file_name = $result['url'];
+              $main_image->aws_cdn = $result['url'];
+            $main_image->category_id = $id;
+            $main_image->photo_type = 'main_image';
+            $main_image->resto_id =  CommonMethods::getRestuarantID();;
+
+            $main_image->save();
+
+            //$resto->text =
+        }
+
+
+        if($id > 0)
+            echo json_encode(array('type' => 'success', 'message'=>"Category is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Category is not saved successfully."));
+    }
+
+    public function delete($id){
+        //$id = CommonMethods::decrypt($id);
+        $category = Categories::find($id);
+        $category->deleted_at = date('Y-m-d H:i:s');
+        $category->save();
+
+
+    }
+    public function edit($id){
+
+        $category = Categories::find($id);
+
+        $data = [
+            'category' => $category,
+        ];
+
+
+        return view('categories.category_form',$data);
+    }
+
+	public function update_display_orders(Request $request){
+dd($request->all());
+        $ids = $request->ids;
+        $u = Auth::user()->role=="restaurant"?Auth::user()->restaurants->id:0;
+
+        foreach($ids as $k=>$id){
+            $c = Categories::whereNull('deleted_at')->where('resto_id',$u)->where('id',$id['id'])->update(['display_order'=>$id['position']]);
+        }
+
+
+    }
+}

+ 113 - 0
app/Http/Controllers/Category.php_1

@@ -0,0 +1,113 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Categories;
+use App\Photos;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Storage;
+use Str;
+use File;
+use Image;
+
+class Category extends Controller
+{
+    //
+
+    public function categories(){
+        if( Auth::user()->role=="restaurant")
+            $categories = Categories::whereNull('deleted_at')->whereIn('resto_id',[0,Auth::user()->restaurants->id])->orderBy('name','ASC')->get();
+            else
+        $categories = Categories::whereNull('deleted_at')->orderBy('name','ASC')->get();
+        $data = [
+            'categories' => $categories
+        ];
+        return view('categories.categories',$data);
+    }
+
+    public function new_category(){
+
+        return view('categories.category_form');
+    }
+
+    public function save(Request $request)
+    {
+        //  dd($request->all());
+
+        $id = $request->id;
+        if(empty($id))
+            $category = new Categories();
+        else
+            $category = Categories::find($id);
+
+        $category->name = $request->name;
+        $category->arabic_name = $request->arabic_name;
+        $category->is_active =1;
+        $category->resto_id = Auth::user()->role=="restaurant"?Auth::user()->restaurants->id:0;
+        $category->save();
+
+        $id = $category->id;
+        if($request->hasFile('main_image')){
+            $logo = $request->file('main_image');
+
+
+
+            $file_name = "category-".Str::slug($request->name)."-main_image".'-'.time();
+            $extension = $logo->getClientOriginalExtension();
+
+
+
+            Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+            $destinationPath = public_path('/uploads/main_image');
+            $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(100, null, function ($constraint) {
+                $constraint->aspectRatio();
+            });
+
+            $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);
+
+
+
+            $main_image = Photos::where('category_id',$id)->where('photo_type','main_image')->first();
+            if(!$main_image)
+                $main_image = new Photos();
+
+
+            $main_image->file_name = $file_name.'.'.$extension;
+            $main_image->category_id = $id;
+            $main_image->photo_type = 'main_image';
+            $main_image->resto_id =  Auth::user()->restaurants->id;;
+
+            $main_image->save();
+
+            //$resto->text =
+        }
+
+
+        if($id > 0)
+            echo json_encode(array('type' => 'success', 'message'=>"Category is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Category is not saved successfully."));
+    }
+
+    public function delete($id){
+        //$id = CommonMethods::decrypt($id);
+        $category = Categories::find($id);
+        $category->deleted_at = date('Y-m-d H:i:s');
+        $category->save();
+
+
+    }
+    public function edit($id){
+
+        $category = Categories::find($id);
+
+        $data = [
+            'category' => $category,
+        ];
+
+
+        return view('categories.category_form',$data);
+    }
+}

+ 10 - 0
app/Http/Controllers/City.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class City extends Controller
+{
+    //
+}

+ 13 - 0
app/Http/Controllers/Controller.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Routing\Controller as BaseController;
+
+class Controller extends BaseController
+{
+    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
+}

+ 187 - 0
app/Http/Controllers/DMCity.php

@@ -0,0 +1,187 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Countries;
+use App\Models\DMCities;
+use App\Models\PlaceCategories;
+use App\Models\PlaceCategoriesMapped;
+use App\Models\PlaceDeliveryPrices;
+use App\Models\RestoCategoriesMapped;
+use App\Models\RestoSMSs;
+use Illuminate\Http\Request;
+
+class DMCity extends Controller
+{
+    //
+
+    public function places(){
+        $c = request()->get('country');
+        $country_id = isset($c) && !empty($c)?request()->get('country'):"2";
+
+
+        $country_name = Countries::where('id',$country_id)->first();
+        $cities = DMCities::where('country_id',$country_id)->whereNull('deleted_at')->get();
+
+        $d = [
+            'cities' => $cities,
+            'country_id' =>$country_id,
+            'country_name' => $country_name->country_name
+        ];
+        return view('places.places',$d);
+    }
+
+    public function new_place(){
+        $countries = Countries::where('active',1)->get();
+        $categories = PlaceCategories::whereNull('deleted_at')->get();
+
+        $data = [
+            'countries' => $countries,
+            'categories' =>$categories
+        ];
+        return view('places.place',$data);
+    }
+
+
+    public function edit_place($id){
+        $countries = Countries::where('active',1)->get();
+        $categories = PlaceCategories::whereNull('deleted_at')->get();
+        $place = DMCities::find($id);
+        $data = [
+            'countries' => $countries,
+            'place' => $place,
+            'categories' =>$categories
+        ];
+        return view('places.place',$data);
+    }
+
+    public function save_place(Request $request){
+        $id = $request->id;
+        $mapped = "";
+        if(empty($id)){
+            $place = new DMCities();
+            $mapped = new PlaceCategoriesMapped();
+        }
+
+        else{
+            $place = DMCities::find($id);
+            $mapped = PlaceCategoriesMapped::where('place_id',$id)->first();
+
+        }
+
+
+        $place->country_id = $request->country_id;
+        $place->city_id = $request->city_id;
+        $place->place_name = $request->place_name;
+        $place->category_id = $request->category_id;
+        $place->is_active = isset($request->is_active)?1:0;
+
+        $place->save();
+
+        $id = $place->id;
+        if(isset($mapped)){
+            $mapped->category_id = $request->category_id;
+            $mapped->place_id = $id;
+            $mapped->country_id = $request->country_id;
+            $mapped->city_id = $request->city_id;
+            $mapped->save();
+        }else{
+            $mapped = new PlaceCategoriesMapped();
+            $mapped->category_id = $request->category_id;
+            $mapped->country_id = $request->country_id;
+            $mapped->city_id = $request->city_id;
+            $mapped->place_id = $id;
+
+            $mapped->save();
+        }
+
+        if($id > 0)
+            echo json_encode(array('type' => 'success', 'message'=>"Place's data is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Place's data is not saved, check info again."));
+    }
+
+    public function delete_place($id){
+        $place = DMCities::find($id);
+
+        $place->deleted_at = date('Y-m-d H:i:s');
+
+        $place->save();
+    }
+    public function save_country(Request $request){
+        $id = $request->id;
+        $name = $request->country_name;
+        if(empty($id))
+        $country = new Countries();
+        else
+            $country = Countries::find($id);
+
+        $country->country_name = $name;
+        $country->country_code = $request->country_code;
+        $country->active = 1;
+
+        $country->save();
+    }
+
+    public function get_cities($code){
+        $cities = DMCities::where('country_id',$code)->groupBy('city')->get(['id','city']);
+
+       echo json_encode($cities);
+    }
+
+    public function get_places($name){
+        $places = DMCities::where('city',$name)->get(['city_unique_id','city_name','category']);
+
+        echo json_encode($places);
+    }
+
+    public function save_delivery_fee(Request $request){
+        $category_id = $request->category_id;
+        $category_unique_id = $request->category_unique_id;
+        $resto_id = $request->resto_id;
+        $minimum_delivery_fee = $request->minimum_delivery_fee;
+
+
+        $delivery_fee = $request->delivery_fee;
+
+        $places = $request->places;
+
+        $resto_category = RestoCategoriesMapped::where('resto_id',$resto_id)->where('category_id',$category_id)->first();
+
+        if(empty($resto_category))
+            $resto_category = new RestoCategoriesMapped();
+
+        $resto_category->category_id = $category_id;
+        $resto_category->resto_id = $resto_id;
+        $resto_category->delivery_fee = $minimum_delivery_fee;
+
+
+        $resto_category->save();
+
+        $id = $resto_category->id;
+
+
+        foreach($delivery_fee as $k=>$fee){
+
+            if($fee || $fee=="0"){
+                $place_delivery = PlaceDeliveryPrices::where('category_unique_id',$category_unique_id)->where('place_unique_id',$places[$k])->where('resto_id',$resto_id)->first();
+
+                if(!isset($place_delivery))
+                $place_delivery = new PlaceDeliveryPrices();
+
+                $place_delivery->category_unique_id =$category_unique_id;
+                $place_delivery->place_unique_id = $places[$k];
+                $place_delivery->resto_id = $resto_id;
+                $place_delivery->delivery_price = $fee;
+
+                $place_delivery->save();
+
+            }
+        }
+
+        if($id > 0)
+            echo json_encode(array('type' => 'success', 'message'=>"Delivery's data is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Delivery's data is not saved, check info again."));
+    }
+}

+ 157 - 0
app/Http/Controllers/Discount.php

@@ -0,0 +1,157 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Helpers\CommonMethods;
+
+use App\Models\User;
+use App\Models\Discounts;
+use App\Models\DiscountOutlets;
+use App\Models\DiscountItems;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
+use File;
+use DB;
+
+class Discount extends Controller
+{
+    public function discounts(){
+        return view('discounts.discounts');
+    }
+
+    public function edit_discount($id){
+        $discount = Discounts::where('unique_key',$id)->first();
+        return view('discounts.discount-form',['discount'=>$discount]);
+    }
+
+    public function discount(){
+        return view('discounts.discount-form');
+    }
+
+    public function save_discount(Request $request){
+   //     dd($request->all());
+
+            $data = $request->except(['id', '_token','selected_outlets']);
+            $outlets = $request->outlets;
+
+            $order_type = implode(',',$request->order_type);
+            $selected_outlets = $request->selected_outlets;
+            $selected_items = $request->discount_item;
+
+			$data['order_type'] = $order_type;
+			$data['order_applicable'] = isset($request->order_applicable)?"Yes":"No";
+            $data['is_discount_at_delivery'] = isset($request->is_discount_at_delivery)?"Yes":"No";
+            $data['start_datetime'] = isset($request->start_date) && !empty($request->start_date)?$request->start_date. ' '.(isset($request->start_time) && !empty($request->start_time)?Carbon::parse($request->start_time)->format('H:i'):"00:00"):"";
+            if($request->expire_on_date=="expire_on_date"){
+
+           $data['expire_on_date'] = null;
+                $data['end_date'] = isset($request->end_date) && !empty($request->end_date)?$request->end_date:null;;
+            $data['end_datetime'] = isset($request->end_date) && !empty($request->end_date)?$request->end_date. ' '.(isset($request->end_time) && !empty($request->end_time)?Carbon::parse($request->end_time)->format('H:i'):"00:00"):"";
+    }
+            else{
+                $data['end_datetime'] =  null;
+                $data['end_date'] = null;;
+            }
+
+           // dd($data);
+        if($data['is_discount_at_delivery']=="No"){
+                $data['discount_at_delivery'] = null;
+                $data['delivery_discount_type'] = null;
+            }
+
+           // $data['selected_outlets']=$selected_outlets;
+            $data['resto_id'] = CommonMethods::getRestuarantID();;
+
+            $id = $request->id;
+            if(empty($id)){
+                 $discount = new Discounts();
+				$data['unique_key'] = Str::uuid();
+				$data['discount_item']=isset($selected_items) && count($selected_items) > 0?implode(',',$selected_items ):"";
+
+			//	dd($data);
+               $discount->insert($data);
+               $id = DB::getPdo()->lastInsertId();;
+            }
+           else{
+                $discount = Discounts::find($id);
+                $id =$discount->update($data);
+
+           }
+
+
+            if($id > 0){
+                if($outlets=="all_outlets")
+                   DiscountOutlets::where('discount_id',$id)->delete();
+                else{
+                  if(isset($selected_outlets)){
+                         DiscountOutlets::where('discount_id',$id)->delete();
+
+                                foreach($selected_outlets as $outlet){
+                                 $dc = new DiscountOutlets();
+
+                                $dc->resto_id = \App\Helpers\CommonMethods::getRestuarantID();
+                                $dc->outlet_id =    $outlet;
+                                $dc->discount_id = $id;
+
+                                $dc->save();
+
+                                }
+
+
+
+                    }
+                }
+
+
+            if($outlets=="all_items")
+                   DiscountItems::where('discount_id',$id)->delete();
+                else{
+                  if(isset($selected_items)){
+                         DiscountItems::where('discount_id',$id)->delete();
+
+                                foreach($selected_items as $item){
+                                 $di = new DiscountItems();
+
+                                $di->resto_id = \App\Helpers\CommonMethods::getRestuarantID();
+                                $di->item_id =    $item;
+                                $di->discount_id = $id;
+
+                                $di->save();
+
+                                }
+
+
+
+                    }
+                }
+
+
+
+                echo json_encode(array('type'=>'success','message'=>'Discount saved!.'));
+            }
+            else
+                echo json_encode(array('type'=>'error','message'=>'Data is not saved!.'));
+    }
+
+    public function delete_discount($id){
+        $discount = Discounts::where('unique_key',$id)->first();
+        $discount->deleted_at = date('Y-m-d H:i:s');
+        $discount->is_active = 0;
+        $discount->save();
+    }
+
+	public function update_status_discount(Request $request){
+		$id = $request->id;
+		$status = $request->status;
+
+		   $discount = Discounts::where('unique_key',$id)->first();
+        $discount->is_active =$status;
+        $discount->save();
+
+	}
+
+}

+ 164 - 0
app/Http/Controllers/ExtraOption.php

@@ -0,0 +1,164 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\ExtraOptionItems;
+use App\Models\ExtraOptions;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+
+class ExtraOption extends Controller
+{
+    //
+
+    public function save(Request $request)
+    {
+
+        $extra_option = new ExtraOptions();
+
+        $name = $request->option;
+
+        $ex = ExtraOptions::where('name',$name)->where('resto_id',$request->resto_id)->whereNull('deleted_at')->where('recipe_id',$request->recipe_id)->first();
+
+        if(isset($ex)){
+            echo json_encode(array('type' => 'error', 'message'=>$name." is already exist with, try with different"));
+            exit;
+        }
+
+
+        $extra_option->name = $request->option;
+		 $extra_option->name_arabic = $request->arabic_option;
+        $extra_option->price = $request->price;
+        $extra_option->resto_id = $request->resto_id;
+        $extra_option->recipe_id = $request->recipe_id;
+        $extra_option->save();
+        $extra_option_id = $extra_option->id;
+        $items = isset($request->item_name)?$request->item_name:[];
+        $prices = isset($request->item_price)?$request->item_price:[];
+        $item_type = isset($request->item_type)?$request->item_type:[];
+        if (count($items) > 0) {
+            foreach ($items as $k => $item) {
+                $new_item = new ExtraOptionItems();
+                $new_item->extra_option_id = $extra_option_id;
+                $new_item->name = $item;
+                $new_item->price = $prices[$k];
+                $new_item->item_type = $item_type[$k];
+                $new_item->save();
+            }
+        }
+
+        echo json_encode(array('type' => 'success', 'message'=>"Extra Options's data is saved successfully."));
+    }
+
+    public function load_items($id){
+        $items = ExtraOptionItems::with('childern')->where('extra_option_id',$id)->whereNull('deleted_at')->where('parent_id',0)->get()->toArray();
+        return response()->json(['data'=>$items]);
+    }
+
+    public function load_option($id){
+        $option = ExtraOptions::find($id)->toArray();
+        return response()->json(['data'=>$option]);
+    }
+
+    public function update(Request $request){
+       $id = $request->id;
+       $option =ExtraOptions::find($id);
+
+       $option->name = $request->option;
+		$option->name_arabic = $request->arabic_option;
+       $option->price = $request->price;
+
+       $option->save();
+    }
+
+    public function update_item(Request $request){
+        $id = $request->id;
+        $item =ExtraOptionItems::find($id);
+        $item->item_type = $request->item_type;
+        $item->name = $request->option;
+		$item->name_arabic = $request->name_arabic;
+        $item->price = $request->price;
+
+        $item->save();
+    }
+
+    public function delete_option($id){
+        $option =ExtraOptions::find($id);
+
+
+        $option->deleted_at = Carbon::now();
+
+        $option->save();
+    }
+
+    public function delete_item_option($id){
+        $item =ExtraOptionItems::find($id);
+
+
+        $item->deleted_at = Carbon::now();
+
+        $item->save();
+    }
+    public function load_item($id){
+        $option = ExtraOptionItems::find($id)->toArray();
+        return response()->json(['data'=>$option]);
+    }
+
+    public function add_new_items(Request $request){
+        $extra_option_id = $request->extra_option_id;
+        $parent_id = $request->parent_id;
+        $items = isset($request->item_name)?$request->item_name:[];
+		$items_ar = isset($request->item_name_arabic)?$request->item_name_arabic:[];
+
+        $prices = isset($request->item_price)?$request->item_price:[];
+        $item_type = isset($request->item_type)?$request->item_type:[];
+        if (count($items) > 0) {
+            foreach ($items as $k => $item) {
+                $new_item = new ExtraOptionItems();
+                $new_item->extra_option_id = $extra_option_id;
+                $new_item->name = $item;
+				$new_item->name_arabic = $items_ar[$k];
+                $new_item->parent_id = !empty($parent_id)?$parent_id:0;
+                $new_item->price = $prices[$k];
+                $new_item->item_type = $item_type[$k];
+                $new_item->save();
+            }
+        }
+
+        echo json_encode(array('type' => 'success', 'message'=>"Extra Options's data is saved successfully."));
+    }
+
+    public function update_mandatory_item(Request $request){
+        $id = $request->id;
+        $option =ExtraOptions::find($id);
+
+        $items = (isset($option->extra_option_items) && $option->extra_option_items->count() > 0)?$option->extra_option_items->count():0;
+
+        if($items==0){
+            echo json_encode(array('type' => 'error', 'message'=>"No item found with this extra option."));
+            exit;
+        }
+
+        //if($items<$request->mandatory_amount){
+       //     echo json_encode(array('type' => 'error', 'message'=>"Your number is exceed total number of items (".$items.")."));
+      //      exit;
+      //  }
+
+
+        $option->is_mandatory = 1;
+        $option->mandatory_amount = $request->mandatory_amount;
+
+        $option->save();
+
+        echo json_encode(array('type' => 'success', 'message'=>"Mandatory option is added,"));
+        exit;
+    }
+
+    public function remove_mandatory_item($id){
+        $option =ExtraOptions::find($id);
+        $option->is_mandatory = NULL;
+        $option->mandatory_amount = NULL;
+
+        $option->save();
+    }
+}

+ 11 - 0
app/Http/Controllers/ExtraOptionItem.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class ExtraOptionItem extends Controller
+{
+    //
+
+}

+ 575 - 0
app/Http/Controllers/HomeController.php

@@ -0,0 +1,575 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\DMCities;
+use App\Models\OrderActivities;
+use App\Models\Orders;
+use App\Models\Outlets;
+use App\Restaurants;
+use App\User;
+use App\RestoUsers;
+use App\SendEmail;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Str;
+use Session;
+use Auth;
+use File;
+use Image;
+use Brian2694\Toastr\Facades\Toastr;
+use Illuminate\Support\Facades\Redis;
+use App\Helpers\CommonMethods;
+class HomeController extends Controller
+{
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+       // $this->middleware('auth');
+    }
+
+    public function marketings(){
+
+        return view('marketing.marketings');
+    }
+
+	public function change_lang($lang){
+		session(['app_lang' => $lang]);
+	}
+
+	public function reset_customer(){
+		return view('customers.customers');
+	}
+
+    public function getOrderActivities($id){
+        $status_array = ["Placed","Accepted","On_Road","Has_Delivered"];
+        $orderActivities = OrderActivities::where('order_id',$id)->get();
+
+        $new_array = [];
+        foreach($orderActivities as $status){
+            $new_array[$status->status] = array('id'=>$status->id,'description'=>$status->status.' found');
+        }
+        $final_array = [];
+        foreach($status_array as $status){
+            if(isset($new_array[$status])){
+                $final_array[$status] = $new_array[$status];
+            }else{
+                $final_array[$status] = array('id'=>0,'description'=>$status. ' not found in activities');
+            }
+        }
+
+
+        dump($final_array);
+    }
+
+    public function getDashboardAnalytics(Request $request){
+
+        $s = $request->start_date;
+        $e = $request->end_date;
+
+        // $s = "2023-08-16";
+        // $e = "2023-09-14";
+        $start_date = Carbon::parse($s)->format('Y-m-d');
+        if($s==$e)
+            $start_date = Carbon::parse($s)->subDay()->format('Y-m-d');
+
+        $end_date = Carbon::parse($e)->format('Y-m-d');
+        $resto_id = CommonMethods::getRestuarantID();
+        $orders = Orders::whereNull('deleted_at')->where('resto_id',$resto_id)->where('status','Has_Delivered')->whereBetween('created_at',[$start_date,$end_date])->count();
+        // dd($orders);
+        $total_revenue = DB::table('tb_dm_orders')
+            ->select(DB::raw('(sum(total_price)) as total_price '))
+            ->where('resto_id' , $resto_id)
+            ->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])
+            ->whereNull('deleted_at')->first();
+
+        $total_price = isset($total_revenue)?$total_revenue->total_price:0;
+
+        $old_customer = \App\Models\Orders::select(\DB::raw('count(count(customer_id)) OVER() as customer_order'))->where('resto_id',$resto_id)->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])->groupBy('customer_id')->having(\DB::raw('count(customer_id)'),'>',1)->first();
+        $old_customer = isset($old_customer)?($old_customer->customer_order):0;
+
+
+
+        $new_customer = \App\Models\Orders::select(\DB::raw('count(customer_id) as customer_order'))->where('resto_id',$resto_id)->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])->groupBy('customer_id')->having(\DB::raw('count(customer_id)'),'=',1)->get()->toArray();
+        $new_customer = array_sum(array_column($new_customer, 'customer_order'));
+
+        $old_orders = \App\Models\Orders::select(\DB::raw('count(id) as customer_order'))->where('resto_id',$resto_id)->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])->groupBy('customer_id')->having(\DB::raw('count(id)'),'>',1)->get()->toArray();
+        $old_orders = array_sum(array_column($old_orders, 'customer_order'));
+
+        $new_order = \App\Models\Orders::select(\DB::raw('count(id) as customer_order'))->where('resto_id',$resto_id)->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])->groupBy('customer_id')->having(\DB::raw('count(id)'),'=',1)->get()->toArray();
+        //dd($new_order);
+
+        $new_order = array_sum(array_column($new_order, 'customer_order'));
+
+//        $order_status_customers = \App\Models\Orders::select(\DB::raw('count(customer_id) as customer_order'))
+//            ->whereBetween('created_at',[$start_date,$end_date])
+//            ->where('customer_order' ,'>',1)
+//            ->where('resto_id',$resto_id)->where('status','Has_Delivered')->groupBy('customer_id')->get()->take(2);
+
+
+        $average_new_order = \App\Models\Orders::select(\DB::raw('sum(sum(total_price)) OVER() as total_price'))->where('resto_id',$resto_id)->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])->groupBy('customer_id')->having(\DB::raw('count(id)'),'=',1)->first();
+
+        // dd($average_new_order);
+
+        $average_new_order = isset($average_new_order)?$average_new_order->total_price:0;
+
+
+        $average_old_order = \App\Models\Orders::select(\DB::raw('sum(sum(total_price)) OVER() as total_price'))->where('resto_id',$resto_id)->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])->groupBy('customer_id')->having(\DB::raw('count(id)'),'>',1)->first();
+
+        $average_old_order = isset($average_old_order)?$average_old_order->total_price:0;
+
+        $campaign_data = \App\Models\Orders::select(\DB::raw('count(campaign_type) as total_campaign'),'campaign_type')->where('resto_id',$resto_id)->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])->groupBy('campaign_type')->having('total_campaign','>',0)->get();
+
+        $outlet_data = \App\Models\Orders::with('outlet')->select(\DB::raw('count(outlet_id) as total_outlet_orders'),'outlet_id')->where('resto_id',$resto_id)->where('status','Has_Delivered')
+            ->whereBetween('created_at',[$start_date,$end_date])->groupBy('outlet_id')->having('total_outlet_orders','>',0)->get();
+
+        $outlet_data_array = [];
+
+        if($outlet_data){
+            foreach($outlet_data as $d){
+                $outlet_data_array[$d->outlet_id] = array('outlet_name'=>$d->outlet->name,'orders'=>$d->total_outlet_orders);
+            }
+        }
+
+        $outlets = Outlets::where('resto_id',$resto_id)->whereNull('deleted_at')->get();
+        $outlets_array = [];
+        if($outlets){
+            foreach($outlets as $outlet){
+                if(isset($outlet_data_array[$outlet->id]))
+                    $outlets_array[] = array('name'=>$outlet->name,'orders'=>$outlet_data_array[$outlet->id]['orders']);
+                else
+                    $outlets_array[] = array('name'=>$outlet->name,'orders'=>0);
+            }
+        }
+
+        // dd($average_old_order,$average_new_order);
+
+
+        $total_customers = $old_customer + $new_customer;
+        $total_orders = $old_orders + $new_order;
+        $dasboard_data = array(
+            'total_orders'=>number_format($orders),
+            'total_sale'=>number_format($total_price),
+            'order_rating'=>'N/A',
+            'average_basket_value'=>$orders > 0 && $total_price > 0?number_format( round($total_price / $orders,2)):"N/A",
+            'customers'=>array(
+                'new_customer'=>array('value'=>$new_customer,'percentage'=>(round($new_customer / ($total_customers?$total_customers:1),2)*100).'%'),
+                'old_customer'=>array('value'=>$old_customer,'percentage'=>(round($old_customer / ($total_customers?$total_customers:1),2)*100).'%'),
+            ),
+            'orders'=>array(
+                'new_orders'=>array('value'=>$new_order,'percentage'=>number_format(round($new_order / ($total_orders > 0?$total_orders:1),2)*100).'%'),
+                'old_orders'=>array('value'=>$old_orders,'percentage'=>number_format(round($old_orders / ($total_orders > 0?$total_orders:1),2)*100).'%'),
+            ),
+            'average_basket'=>array(
+                'new'=>$new_order > 0?number_format(round($average_new_order/$new_order,2)):0,
+
+                'returning'=>$old_orders > 0?number_format(round($average_old_order/$old_orders,2)):0,
+                'total_averge_basket'=>round(($new_order > 0?($average_new_order/$new_order):0) + ($old_orders > 0?$average_old_order/$old_orders:0),2),
+            ),
+
+            'total_basket_sale'=>array(
+                'new'=>$new_order > 0?number_format(round($average_new_order,2)):0,
+                'returning'=>$old_orders > 0?number_format(round($average_old_order,2)):0,
+                'total_sale'=> round(($new_order > 0?$average_new_order:0)+($old_orders > 0?$average_old_order:0),2)
+            ),
+            'order_by_source'=>$campaign_data,
+            'order_by_outlet'=>$outlets_array
+
+        );
+
+        return response()->json($dasboard_data,200);
+
+    }
+
+	public function reset_phone_customer(Request $request){
+		$user = User::where('email',$request->mobile_number)->first();
+		if(isset($user)){
+			$existing_email = $user->email;
+			$existing_email = $existing_email.'-reset-at-'.date('y-m-d H:i:s');
+			$user->email = $existing_email;
+			$user->save();
+			echo json_encode(array('type'=>'success','message'=>$request->mobile_number. ' is reset.'));
+		}else{
+			echo json_encode(array('type'=>'error','message'=>$request->mobile_number. ' not found in db, use correct number with country code'));
+		}
+	}
+
+	public function reset_update_password(Request $request){
+		$user_id = $request->user_id;
+
+		$user = User::find($user_id);
+
+		$username = $user->username;
+
+		$password = $request->password;
+
+		$user->password = Hash::make($password);
+		$user->is_reset_password_sent = "Changed";
+        $result = $user->save();
+
+		if($result){
+			Auth::loginUsingId($user_id);
+			return response()->json(array('type'=>'success','message'=>'Password reset successfully.'));
+		}
+	}
+
+	public function reset_password(Request $request){
+		$user_id = $request->get('u');
+		$user = User::where('id',$user_id)->where('is_reset_password_sent','Yes')->first();;
+
+		return view('reset-password',['user'=>$user]);
+	}
+
+	public function send_reset_link(Request $request){
+		$email = $request->email;
+
+		$user_id = "";
+
+		$user = User::where('username',$email)->first();
+
+		if(isset($user))
+			$user_id = $user->id;
+
+		if(!isset($user)){
+			$user = RestoUsers::whereNull('deleted_at')->where('email',$email)->first();
+
+			$user_id = isset($user->user_id)?$user->user_id:"";
+		}
+
+
+
+
+
+		if(!isset($user) && empty($user_id))
+			return response()->json(['type'=>'error','message'=>'No user found against this <strong>'.$request->email.'</strong>']);
+
+		$u = User::where('id',$user_id)->update(['is_reset_password_sent'=>'Yes']);
+
+		 $param = array(
+                            'email'=>$request->email,
+                            'name' => $user->first_name,
+                           	'link'=> env('APP_URL').'reset/my/password?q='.md5(time()).'&u='.$user->user_id.'&action=reset'
+                      );
+
+        SendEmail::SendRestPasswordLink($param);
+
+		return response()->json(['type'=>'success','message'=>'Reset link sent to <strong>'.$request->email.'</strong>']);
+	}
+
+    public function send_mail(){
+        $logo = 'https://meemappaws.imgix.net/meemcdn/31-titanium-store/titanium-store-logo-1669151471?fm=webp&h=500&w=500&trim=color&q=100&fit=center&crop=center';
+
+        $imageData = base64_encode(file_get_contents($logo));
+        $logo = 'data:image/png;base64,'.$imageData;
+         $param = array(
+                            'email'=>$_GET['email'],
+
+                            'shop_name' => 'Titanium Store',
+                            'order_message' => 'You have New order placed OrderID: 217 ,  kindly login to  https://admin.meemorder.io to serve customer.',
+                            'logo' => $logo
+
+                      );
+
+
+        SendEmail::sendOrderNotification($param);
+
+        exit;
+        $param = array(
+                            'email'=>$_GET['email'],
+                            'name' => 'Mujtaba Ahmad',
+                            'shop_name' => 'NB Flowers',
+                            'role' => 'Manager',
+                            'access_level' => 'selected-outlets',
+                            'selected_outlets' => 'Outlet1, Outlet2',
+                            //'link' => 'https://dashboard.chatfood.io/invite/36eaa3c8403efe29d775db4423a62bb0?utm_medium=email&utm_source=mailgun&utm_campaign=user_invitation',
+                            'link' => '#'
+                      );
+
+        SendEmail::SendInvitationLink($param);
+    }
+
+    public function test_redis(){
+        Redis::set("user:mujtaba","It is testing code");
+
+        dd(Redis::get('user:mujtaba'));
+    }
+
+    public function create_link(Request $request){
+        $campaign_name = $request->campaign_name;
+        $campaign_date = $request->campaign_date;
+        $campaign_type = $request->campaign_type;
+        $site_url = $request->site_url;
+
+        $link = '?a='.$campaign_type.'&c='.Str::slug($campaign_name).'&cd='.$campaign_date;
+
+        return $site_url.($link);
+
+    }
+
+    public function make_slug(){
+        $resto = Restaurants::all();
+
+        foreach($resto as $r){
+            $rr = Restaurants::find($r->id);
+
+            $rr->resto_unique_name = Str::slug($r->name);
+            $rr->save();
+        }
+    }
+
+    /**
+     * Show the application dashboard.
+     *
+     * @return \Illuminate\Contracts\Support\Renderable
+     */
+    public function index()
+    {
+        return view('auth.login');
+    }
+
+    public function dashboard(){
+
+
+
+
+        if(Auth::user()->role=="administrator")
+        return view('dashboards.admin_dashboard');
+        return view('dashboards.resto_dashboard');
+    }
+
+    public function getLogout()
+    {
+        Session::flush();
+        Auth::logout();
+
+        return redirect('/');
+    }
+
+    public function change_password(){
+        return view('password');
+    }
+
+    public function update_password(Request $request){
+        $old_password = $request->old_password;
+
+        $new_password = $request->password;
+        $confirm_password = $request->confirm_password;
+        $user = Auth::user();
+        if ($user && Hash::check($old_password, $user->password)) {
+
+            if($new_password==$confirm_password){
+
+                $u = User::find($user->id);
+                $u->password = Hash::make($new_password);
+                $u->save();
+
+                echo json_encode(array('type'=>'success','message'=>'Password changed successfully.'));
+
+
+            }else{
+                echo json_encode(array('type'=>'error','message'=>'new password and confirm password are not matched.'));
+                exit;
+            }
+
+        }else{
+            echo json_encode(array('type'=>'error','message'=>'Old password is incorrect, enter correct password.'));
+            exit;
+        }
+    }
+
+    public function download_image(Request $request){
+        $data = $request->data;
+        $resto = $request->resto;
+
+        $data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));
+        file_put_contents(public_path('/uploads/qrcode/qrcode.png'), $data);
+
+        $this->image_recreate(public_path('/uploads/qrcode/qrcode.png'),public_path('/uploads/qrcode/'.$resto.'-qrcode.png'));
+
+        echo env('APP_PUBLIC_URL').'uploads/qrcode/'.$resto.'-qrcode.png';
+    }
+
+
+    public function image_recreate($sourceFile,$destinationFile){
+        $orig_filename = $sourceFile;
+        $new_filename = $orig_filename;
+
+        list($orig_w, $orig_h) = getimagesize($orig_filename);
+
+        $orig_img = imagecreatefromstring(file_get_contents($orig_filename));
+
+        $output_w = 2200;
+        $output_h = 2200;
+
+// determine scale based on the longest edge
+        if ($orig_h > $orig_w) {
+            $scale = $output_h/$orig_h;
+        } else {
+            $scale = $output_w/$orig_w;
+        }
+
+        $scale = $scale-0.1;
+
+        // calc new image dimensions
+        $new_w =  ($orig_w * $scale);
+        $new_h =  ($orig_h * $scale);
+
+
+
+// determine offset coords so that new image is centered
+        $offest_x = (($output_w - $new_w) / 2);
+        $offest_y = (($output_h - $new_h) / 2);
+
+        // create new image and fill with background colour
+        $new_img = imagecreatetruecolor($output_w, $output_h);
+        $bgcolor = imagecolorallocate($new_img, 255, 255, 255); // red
+        imagefill($new_img, 0, 0, $bgcolor); // fill background colour
+
+        // copy and resize original image into center of new image
+        imagecopyresampled($new_img, $orig_img, $offest_x, $offest_y, 0, 0, $new_w, $new_h, $orig_w, $orig_h);
+
+        //save it
+        imagejpeg($new_img, $destinationFile, 80);
+
+    }
+
+    public function resizeMainRecipeImages(){
+        $path = public_path('uploads/main_image');
+
+        ini_set('max_execution_time', '300');
+
+        $files = File::allfiles($path);
+
+
+
+        foreach($files as $file){
+
+           $pth = ($file->getRealPath());
+            $file_name = $file->getFileName();
+            echo "Main Image: ".$file_name."<br />";
+            $destinationPath = public_path('/uploads/main_image/');
+            if($file->getExtension()!="jfif") {
+                $img = Image::make($destinationPath . '/' . $file_name)->resize(85, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name);
+            }
+        }
+    }
+
+
+
+    public function resizeLogo(){
+        $path = public_path('uploads/logo');
+
+        ini_set('max_execution_time', '300');
+
+        $files = File::allfiles($path);
+
+
+
+        foreach($files as $file){
+
+            $pth = ($file->getRealPath());
+            $file_name = $file->getFileName();
+            echo "Main Image: ".$file_name."<br />";
+            $destinationPath = public_path('/uploads/logo/');
+            if($file->getExtension()!="jfif") {
+                $img = Image::make($destinationPath . '/' . $file_name)->resize(50, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name);
+            }
+        }
+    }
+
+
+    public function resizeGalleryRecipeImages(){
+        $path = public_path('uploads/resto-gallery');
+
+
+
+        $files = File::allfiles($path);
+
+
+
+        foreach($files as $file){
+
+            $pth = ($file->getRealPath());
+            $file_name = $file->getFileName();
+            echo "Gallery: ".$file_name."<br />";
+            $destinationPath = public_path('/uploads/resto-gallery/');
+            if($file->getExtension()!="jfif"){
+                $img = Image::make($destinationPath . '/' . $file_name)->resize(800, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name);
+            }
+
+        }
+    }
+
+
+    public function resizeGalleryRecipeImagesToGallery(){
+        $path = public_path('uploads/resto-gallery');
+
+
+
+        $files = File::allfiles($path);
+
+
+
+        foreach($files as $file){
+
+            $pth = ($file->getRealPath());
+            $file_name = $file->getFileName();
+            echo "Gallery: ".$file_name."<br />";
+            $destinationPath = public_path('/uploads/resto-gallery/');
+            if($file->getExtension()!="jfif"){
+                $img = Image::make($destinationPath . '/' . $file_name)->resize(800, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/gallery-resized/' . $file_name);
+            }
+
+        }
+    }
+
+    public function load_json(){
+        $jsonString = file_get_contents("https://api.chatfood.io/api/v1/businesses/ceeba7a3-5dd4-48a7-9a07-96111efab2e4/areas");
+
+        $data = json_decode($jsonString, true);
+      //  dd($data);
+
+        foreach($data as $city){
+            foreach($city as $cc){
+               // dump($cc);
+                $c = new DMCities();
+
+                $c->city_name = $cc['name'];
+                $c->city_unique_id = $cc['id'];
+
+                $c->save();
+            }
+           /* */
+        }
+    }
+}

+ 302 - 0
app/Http/Controllers/HomeController.php_2

@@ -0,0 +1,302 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\DMCities;
+use App\Restaurants;
+use App\User;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Str;
+use Session;
+use Auth;
+use File;
+use Image;
+use Brian2694\Toastr\Facades\Toastr;
+use Illuminate\Support\Facades\Redis;
+class HomeController extends Controller
+{
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('auth');
+    }
+
+    public function marketings(){
+
+        return view('marketing.marketings');
+    }
+
+    public function test_redis(){
+        Redis::set("user:mujtaba","It is testing code");
+
+        dd(Redis::get('user:mujtaba'));
+    }
+
+    public function create_link(Request $request){
+        $campaign_name = $request->campaign_name;
+        $campaign_date = $request->campaign_date;
+        $campaign_type = $request->campaign_type;
+        $site_url = $request->site_url;
+
+        $link = '?a='.$campaign_type.'&c='.Str::slug($campaign_name).'&cd='.$campaign_date;
+
+        return $site_url.($link);
+
+    }
+
+    public function make_slug(){
+        $resto = Restaurants::all();
+
+        foreach($resto as $r){
+            $rr = Restaurants::find($r->id);
+
+            $rr->resto_unique_name = Str::slug($r->name);
+            $rr->save();
+        }
+    }
+
+    /**
+     * Show the application dashboard.
+     *
+     * @return \Illuminate\Contracts\Support\Renderable
+     */
+    public function index()
+    {
+        return view('auth.login');
+    }
+
+    public function dashboard(){
+
+
+
+        if(Auth::user()->role=="administrator")
+        return view('dashboards.admin_dashboard');
+        return view('dashboards.resto_dashboard');
+    }
+
+    public function getLogout()
+    {
+        Session::flush();
+        Auth::logout();
+
+        return redirect('/');
+    }
+
+    public function change_password(){
+        return view('password');
+    }
+
+    public function update_password(Request $request){
+        $old_password = $request->old_password;
+
+        $new_password = $request->password;
+        $confirm_password = $request->confirm_password;
+        $user = Auth::user();
+        if ($user && Hash::check($old_password, $user->password)) {
+
+            if($new_password==$confirm_password){
+
+                $u = User::find($user->id);
+                $u->password = Hash::make($new_password);
+                $u->save();
+
+                echo json_encode(array('type'=>'success','message'=>'Password changed successfully.'));
+
+
+            }else{
+                echo json_encode(array('type'=>'error','message'=>'new password and confirm password are not matched.'));
+                exit;
+            }
+
+        }else{
+            echo json_encode(array('type'=>'error','message'=>'Old password is incorrect, enter correct password.'));
+            exit;
+        }
+    }
+
+    public function download_image(Request $request){
+        $data = $request->data;
+
+        $data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));
+        file_put_contents(public_path('/uploads/qrcode/qrcode.png'), $data);
+
+        $this->image_recreate(public_path('/uploads/qrcode/qrcode.png'));
+
+        echo env('APP_PUBLIC_URL').'uploads/qrcode/qrcode.png';
+    }
+
+
+    public function image_recreate($sourceFile){
+        $orig_filename = $sourceFile;
+        $new_filename = $orig_filename;
+
+        list($orig_w, $orig_h) = getimagesize($orig_filename);
+
+        $orig_img = imagecreatefromstring(file_get_contents($orig_filename));
+
+        $output_w = 2200;
+        $output_h = 2200;
+
+// determine scale based on the longest edge
+        if ($orig_h > $orig_w) {
+            $scale = $output_h/$orig_h;
+        } else {
+            $scale = $output_w/$orig_w;
+        }
+
+        $scale = $scale-0.1;
+
+        // calc new image dimensions
+        $new_w =  ($orig_w * $scale);
+        $new_h =  ($orig_h * $scale);
+
+
+
+// determine offset coords so that new image is centered
+        $offest_x = (($output_w - $new_w) / 2);
+        $offest_y = (($output_h - $new_h) / 2);
+
+        // create new image and fill with background colour
+        $new_img = imagecreatetruecolor($output_w, $output_h);
+        $bgcolor = imagecolorallocate($new_img, 255, 255, 255); // red
+        imagefill($new_img, 0, 0, $bgcolor); // fill background colour
+
+        // copy and resize original image into center of new image
+        imagecopyresampled($new_img, $orig_img, $offest_x, $offest_y, 0, 0, $new_w, $new_h, $orig_w, $orig_h);
+
+        //save it
+        imagejpeg($new_img, $new_filename, 80);
+
+    }
+
+    public function resizeMainRecipeImages(){
+        $path = public_path('uploads/main_image');
+
+        ini_set('max_execution_time', '300');
+
+        $files = File::allfiles($path);
+
+
+
+        foreach($files as $file){
+
+           $pth = ($file->getRealPath());
+            $file_name = $file->getFileName();
+            echo "Main Image: ".$file_name."<br />";
+            $destinationPath = public_path('/uploads/main_image/');
+            if($file->getExtension()!="jfif") {
+                $img = Image::make($destinationPath . '/' . $file_name)->resize(85, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name);
+            }
+        }
+    }
+
+
+
+    public function resizeLogo(){
+        $path = public_path('uploads/logo');
+
+        ini_set('max_execution_time', '300');
+
+        $files = File::allfiles($path);
+
+
+
+        foreach($files as $file){
+
+            $pth = ($file->getRealPath());
+            $file_name = $file->getFileName();
+            echo "Main Image: ".$file_name."<br />";
+            $destinationPath = public_path('/uploads/logo/');
+            if($file->getExtension()!="jfif") {
+                $img = Image::make($destinationPath . '/' . $file_name)->resize(50, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name);
+            }
+        }
+    }
+
+
+    public function resizeGalleryRecipeImages(){
+        $path = public_path('uploads/resto-gallery');
+
+
+
+        $files = File::allfiles($path);
+
+
+
+        foreach($files as $file){
+
+            $pth = ($file->getRealPath());
+            $file_name = $file->getFileName();
+            echo "Gallery: ".$file_name."<br />";
+            $destinationPath = public_path('/uploads/resto-gallery/');
+            if($file->getExtension()!="jfif"){
+                $img = Image::make($destinationPath . '/' . $file_name)->resize(800, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name);
+            }
+
+        }
+    }
+
+
+    public function resizeGalleryRecipeImagesToGallery(){
+        $path = public_path('uploads/resto-gallery');
+
+
+
+        $files = File::allfiles($path);
+
+
+
+        foreach($files as $file){
+
+            $pth = ($file->getRealPath());
+            $file_name = $file->getFileName();
+            echo "Gallery: ".$file_name."<br />";
+            $destinationPath = public_path('/uploads/resto-gallery/');
+            if($file->getExtension()!="jfif"){
+                $img = Image::make($destinationPath . '/' . $file_name)->resize(800, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/gallery-resized/' . $file_name);
+            }
+
+        }
+    }
+
+    public function load_json(){
+        $jsonString = file_get_contents("https://api.chatfood.io/api/v1/businesses/ceeba7a3-5dd4-48a7-9a07-96111efab2e4/areas");
+
+        $data = json_decode($jsonString, true);
+      //  dd($data);
+
+        foreach($data as $city){
+            foreach($city as $cc){
+               // dump($cc);
+                $c = new DMCities();
+
+                $c->city_name = $cc['name'];
+                $c->city_unique_id = $cc['id'];
+
+                $c->save();
+            }
+           /* */
+        }
+    }
+}

+ 45 - 0
app/Http/Controllers/Loyalty.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use App\Helpers\CommonMethods;
+use App\Models\Loyalties;
+use Illuminate\Support\Str;
+
+class Loyalty extends Controller
+{
+    public function loyalties(){
+
+        $loyalty = Loyalties::where('resto_id',CommonMethods::getRestuarantID())->first();
+
+        return view('loyalties.loyalties',['loyalty'=>$loyalty]);
+    }
+
+    public function save_loyalty(Request  $request){
+        $id = $request->id;
+
+        if(empty($id)){
+            $loyalty = new Loyalties();
+            $loyalty->unique_id = Str::uuid();
+            $loyalty->resto_id  = CommonMethods::getRestuarantID();
+
+        }else{
+            $loyalty = Loyalties::find($id);
+            $loyalty->active = isset($request->active)?"Yes":"No";
+        }
+
+        $loyalty->cash_back = $request->cash_back;
+        $loyalty->redeemable_percent = $request->redeemable_percent;
+        $loyalty->maximum_redeemable_amt = $request->maximum_redeemable_amt;
+        $loyalty->expiry_date = Carbon::now()->addDays(90)->format('Y-m-d');
+
+        $loyalty->save();
+
+
+        echo json_encode(array('type'=>'success','message'=>'Loyalty data is saved'));
+
+
+    }
+}

+ 10 - 0
app/Http/Controllers/MapRecipeCategory.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class MapRecipeCategory extends Controller
+{
+    //
+}

File diff suppressed because it is too large
+ 1266 - 0
app/Http/Controllers/Order.php


+ 656 - 0
app/Http/Controllers/Order.php_1

@@ -0,0 +1,656 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Helpers\CommonMethods;
+use App\OrderActivities;
+use App\OrderNotifications;
+use App\Orders;
+use App\Outlets;
+use App\Restaurants;
+use App\RestoSMSs;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Artisan;
+use Illuminate\Support\Facades\Auth;
+use Pusher\Pusher;
+use Log;
+use Illuminate\Support\Facades\Http;
+use DB;
+
+class Order extends Controller
+{
+
+    public function orders(){
+
+        //$recent_till = Carbon::now()->subDays(2);;
+
+
+
+        $orders = Orders::where('resto_id',Auth::user()->restaurants->id)->whereIN('status' ,['Placed','Send_to_Kitchen','On_Road','Accepted'])->orderBy('created_at','DESC')->paginate(10);
+       // $orders = Auth::user()->restaurants->orders;
+        $data = [
+            'orders' => $orders
+        ];
+        return view('orders.orders',$data);
+    }
+
+    public function all_status_count(){
+        $orders = Orders::select(DB::raw(' count(status) as status_count'),'status')->where('resto_id',Auth::user()->restaurants->id)->whereIN('status' ,['Placed','Send_to_Kitchen','On_Road','Accepted'])->groupBy('status')->get();
+
+        $order_statuses = ['Placed','Send_to_Kitchen','On_Road','Accepted'];
+        $a = [];
+        foreach($orders as $order){
+
+
+                $status[$order->status] = array('status_count'=>$order->status_count,'status'=>$order->status);
+
+
+
+
+
+        }
+        $aa = [];
+       foreach($order_statuses as $st){
+
+
+           if(isset($status[$st]))
+               $aa[] = $status[$st];
+           else{
+
+               $aa[] = array('status_count'=>0,'status'=>$st);
+           }
+
+       }
+
+
+        return response()->json($aa);
+    }
+
+    public function load_live_order($status){
+
+       $exitCode = Artisan::call('cache:clear');
+        $exitCode = Artisan::call('route:clear');
+        $exitCode = Artisan::call('view:clear');
+       // $exitCode = Artisan::call('config:cache');
+       // $exitCode = Artisan::call('config:clear');
+        $s = ['Placed','Send_to_Kitchen','On_Road','Accepted'];
+        if($status=="new")
+            $s = ['Placed'];
+        if($status=="kitchen")
+            $s = ['Accepted','Send_to_Kitchen'];
+
+        if($status=="route")
+            $s = ['On_Road'];
+        $orders = Orders::where('resto_id',Auth::user()->restaurants->id)->whereIN('status' ,$s)->orderBy('created_at','DESC')->get();
+
+        $liveOrders = NULL;
+        if(isset($orders) && $orders->count() > 0){
+            foreach($orders as $order){
+                $status = "";
+                $bg="";
+                $box_bg="";
+                $remaining_min = 0;
+                $order_delivery_time = !empty($order->delivery_preparation_time)?$order->delivery_preparation_time:0;
+                $created_at = $order->created_at;
+               // dump("Delivery Time : ".$order_delivery_time);
+                $till_to =  strtotime("+".$order_delivery_time.' minutes',strtotime($order->updated_at));
+             //  dump("Till To : ".date('H:i',$till_to));
+                $updated_at = Carbon::parse(date('Y-m-d H:i',$till_to));
+                $now = Carbon::now();
+
+            //    dump("Update time: ".$updated_at);
+
+                $diff = $updated_at->diffInMinutes($now);
+                $order_placed_diff = Carbon::parse($created_at)->diffInMinutes($now);
+             //   dump($order_placed_diff);
+
+            //    dump("Difference: ".$diff);
+
+               if($diff <=$order_delivery_time )
+                $remaining_min = $diff;
+
+              // dump("Remain_min ".$remaining_min);
+                if($order->status=="Placed"){
+                    $status = "New";
+                    $bg="blu-bg";
+                    $box_bg="bg-danger";
+                    $bg_color="#0ED0DF";
+                }
+
+
+                if($order->status=="Accepted" || $order->status=="Send_to_Kitchen"){
+                    $status = "In Prep";
+                    $bg="org-bg";
+                    $bg_color="orange";
+                }
+
+
+                if($order->status=="On_Road"){
+                    $status = "In Route";
+                    $bg = "blu-bg";
+                    $bg_color="#0ED0DF";
+                }
+
+
+
+                $liveOrders[] = array(
+                    'id' => $order->id,
+                    'order_ref' => $order->order_ref,
+                    'campaign_type' => !empty($order->campaign_type) && $order->order_type!="dining"?ucwords($order->campaign_type):"Direct",
+                    'status' => $status,
+                    'bg'=>$bg,
+                    'box_bg'=>$box_bg,
+                    'bg_color'=> $bg_color,
+                    'remaining_min'=>$remaining_min,
+                    'remaining_min_milliseconds'=>strtotime($order->created_at),
+                    'created_at' => Carbon::createFromTimeStamp(strtotime($order->created_at))->diffForHumans(),
+                    'current_time'=>Carbon::now()->format('H:i'),
+                    'updated_at'=> $updated_at->format('H:i'),
+                    'placed_min'=>$order_placed_diff
+                );
+            }
+        }
+        if(isset($liveOrders))
+            return response()->json(array('type'=>'success','orders'=>$liveOrders));
+        else
+            echo json_encode(array('type'=>'error','message'=>'No order found'));
+    }
+
+    public function get_detail_json($id){
+        $order = Orders::find($id);
+
+        $recipes = NULL;
+
+        
+            if(empty($order->selected_area_formatted) && $order->order_type=="delivery"){
+              //  dump($order->selected_area);
+                 $url = "https://maps.googleapis.com/maps/api/geocode/json?address=".urlencode($order->selected_area)."&key=AIzaSyBFh6fzq8G7dgWLfz8kccvTlmPCSI_uWXQ";
+
+                            $curl = curl_init();
+
+                                curl_setopt_array($curl, array(
+                                  CURLOPT_URL => $url,
+                                  CURLOPT_RETURNTRANSFER => true,
+                                  CURLOPT_ENCODING => '',
+                                  CURLOPT_MAXREDIRS => 10,
+                                  CURLOPT_TIMEOUT => 0,
+                                  CURLOPT_FOLLOWLOCATION => true,
+                                  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+                                  CURLOPT_CUSTOMREQUEST => 'GET',
+                                ));
+
+                                $response = curl_exec($curl);
+
+                                curl_close($curl);
+                                //echo $response;
+                                $result = (json_decode($response));
+                                $formatted_address = isset($result->results[0])?$result->results[0]->formatted_address:"";
+
+                                $order->selected_area_formatted = $formatted_address;
+                                $order->save();
+
+        }
+
+        
+
+        
+
+                                        $country_code = Auth::user()->restaurants->countries->country_code;
+
+        
+
+
+                                        $new_phone = $order->customers->users->email;
+                                        if(isset($order->customers)){
+                                            $pos = strpos($order->customers->users->email,  (string)$country_code);
+                                          
+                                            if ($pos !== false) {
+                                                $new_phone = substr_replace($order->customers->users->email, '', $pos, strlen(env('COUNTRY_CODE')));
+
+                                            }
+                                        }
+
+
+        if(isset($order->orderItems) && $order->orderItems->count() > 0){
+            $extra_price = 0;
+            $recipes = [];$ex = [];
+            foreach($order->orderItems as $item){ 
+                $ex= NULL;
+                $recipe  = $item->recipes;
+
+                $cate_name = "";
+                $categories = isset($recipe->categories)?$recipe->categories->pluck('category_id'):NULL;
+                if($categories){
+
+                    $categories = \App\Categories::whereIn('id',$categories)->pluck('name')->toArray();
+                    $cate_name = $categories[0];
+
+
+                }
+                $extra_options = NULL;
+
+                $opt = [];
+                if(!empty($item->extra_options)){
+                    $ss_item = [];
+                    $extra_options = json_decode($item->extra_options);
+                        $extra_options_array = (json_decode($item->extra_options,true));
+
+                        if(isset($extra_options_array['sub_items']) && count($extra_options_array['sub_items']) > 0){
+                            $extra_sub_options = $extra_options_array['sub_items'];
+                            foreach($extra_sub_options as $k=>$s){
+                                $itm = \App\ExtraOptionItems::find($s['id']);
+                                $ss_item[$k] = array('id'=>$itm->id,'name'=>$itm->name);
+                            }
+
+
+                        }
+
+
+                    //$opt = "<ul>";
+                        if(isset($extra_options)){
+                    foreach($extra_options as $option){
+
+//dump($option);
+                        if(isset($option->id)){
+                        $itm = \App\ExtraOptionItems::find($option->id);
+                        if(isset($itm)){
+
+                            $ex[] = array('id'=>$option->id,'price'=>$option->price,'name'=>$itm->name,'sub_items'=>isset($ss_item[$option->id])?$ss_item:null);
+                            
+                           // dump($ex);
+
+                            $opt[] = $itm->name;
+                            //  $opt.="<li>".$itm->name.' <span class="ml-2 badge badge-danger">'.($itm->price).'</span>';
+                            $extra_price = $extra_price+$option->price;
+
+                            if(isset($option->sub_items)){
+
+                                foreach($option->sub_items as $sub){
+
+                                    $itm = \App\ExtraOptionItems::find($sub->sub_item_id);
+
+
+                                    $extra_price = $extra_price+$sub->price;
+                                }
+
+                            }
+                            //$opt.="</li>";
+                        }
+                    }
+                    }
+                }
+                    // $opt.="</ul>";
+                }
+
+                if(isset($extra_options->color_size)){
+                    $ex = array('color'=>$extra_options->color_size->color,'size'=>$extra_options->color_size->size);
+                }
+                $recipes[] = array(
+                    'recipe_name'=>isset($item->recipes)?$item->recipes->name:"",
+                    'recipe_image'  => isset($item->recipes->main_images)?$item->recipes->main_images->file_name:"",
+                    'quantity'=>$item->qty,
+                    'item_price'=>$item->price,
+                    'total_price'=>($item->qty*$item->price),
+                    'extra_options'=>$ex
+                );
+            }
+        }
+        $status = "";
+        $bg="";
+        $next_action="";
+        $next_status="";
+        $bg_color="";
+        if($order->status=="Placed"){
+            $status = "New";
+            $bg="bg-danger";
+            $box_bg="bg-danger";
+            $next_action='Accepted';
+            $next_status="Accepted";
+        }
+
+
+        if($order->status=="Accepted" || $order->status=="Send_to_Kitchen"){
+            $status = "In Prep";
+            $bg="org-bg";
+            $next_action='On Road';
+            $next_status="On_Road";
+              $bg_color="orange";
+        }
+
+
+        if($order->status=="On_Road"){
+            $status = "In Route";
+            $bg = "blu-bg";
+            $bg_color="#0ED0DF";
+            $next_action='Delivered';
+            $next_status="Has_Delivered";
+        }
+        $address = "";
+        $delivery_notes = "";
+        if(isset($order->customers) && isset($order->customers->customer_addresses)){
+            $address .= isset($order->customers->customer_addresses[0])?ucwords($order->customers->customer_addresses[0]->label):NULL;
+            $address.= isset($order->customers->customer_addresses[0])?", ".$order->customers->customer_addresses[0]->area:NULL;
+            $address.= isset($order->customers->customer_addresses[0])?",".$order->customers->customer_addresses[0]->address:NULL;
+        }
+
+        if(isset($order->customers) && isset($order->customers->customer_addresses)){
+            $delivery_notes .= isset($order->customers->customer_addresses[0])?$order->customers->customer_addresses[0]->instructions:NULL;
+
+        }
+
+        $outlet = Outlets::find($order->outlet_id);
+
+
+
+        $order = array(
+            'order_ref' => str_pad($order->order_ref,6,0,STR_PAD_LEFT),
+            'brand_name' => Auth::user()->restaurants->name,
+            'outlet_name' => isset($outlet)?$outlet->name:"None",
+            'order_type' => $order->order_type=="dining"?"Dine in":ucwords($order->order_type),
+            'delivery_at' => !empty($order->order_deliver_time)?$order->order_deliver_time:date('d/m/y',strtotime($order->created_at))." - ASAP",
+            'customer'  =>$order->customer_name,
+            'delivery_fee' => $order->delivery_fee,
+            'phone' => $new_phone,
+            'channel' => !empty($order->campaign_type) && $order->order_type!="dining"?ucwords($order->campaign_type):"Direct",
+            'order_placed' =>\Carbon\Carbon::createFromTimeStamp(strtotime($order->created_at))->diffForHumans(),
+            'payment' => $order->payment_mode=="COD"?"Cash":"Card",
+            'status'=>$status,
+            'bg'=>$bg,
+            'total_price' => $order->total_price,
+            'recipes'=>$recipes,
+            'next_action'=>$next_action,
+            'next_status' =>$next_status,
+            'address'=>$address,
+            
+            'for_table'=>$order->for_table,
+            'formatted_address'=>$order->selected_area_formatted,
+            'order_instructions'=>$order->order_instructions,
+            'delivery_notes' => $order->order_type=="delivery"?$delivery_notes:$order->order_instructions,
+            'bg_color'=> $bg_color,
+            'recipient_name' => isset($order->recipients)?$order->recipients->recipient_name:null,
+            'recipient_phone' => isset($order->recipients)?$order->recipients->recipient_phone:null,
+            'greeting_message' => isset($order->recipients)?$order->recipients->greeting_message:null,
+
+
+        );
+
+                                        echo json_encode($order);
+    }
+
+    public function show($id){
+        $order = Orders::find($id);
+        $activities = OrderActivities::where('order_id',$id)->pluck('status')->toArray();
+       // dd($activities);
+       $data = [
+           'order' => $order,
+           'activities' =>$activities
+       ];
+       return view('orders.show',$data);
+    }
+
+    public function update_status(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+
+        $order = Orders::find($id);
+        if($status=="Accepted"){
+            $order->preparation_time = !empty($request->preparation_time)?$request->preparation_time:"";
+            $order->delivery_preparation_time = !empty($request->preperation_delivery)?$request->preperation_delivery:"";
+        }
+
+        $order->status = $status;
+
+        $order->save();
+
+
+        if(strtolower($status)=="accepted" || strtolower($status)=="rejected" || strtolower($status)=="rejected_by_user"){
+            $url = env('QRCODE_HOST_ORDER')."track/order?order=".$id."&ref=".$order->order_ref;
+            if(strtolower($status)=="accepted"){
+                $message =env('ORDER_ACCEPTED_MESSAGE').' '.$url;
+                $message = "Dear Customer, Your Order #".$order->order_ref." is accepted , kindly track your order at ".$url." ";
+
+                $restuarant = Restaurants::find($order->resto_id);
+                 if($restuarant->default_lang=="ar"){
+                    $message = "عزيزي العميل طلبك {{1}} تم {{2}} ، لتتبع طلبك افتح الرابط {{3}}"; 
+                    $message = str_replace(["{{1}}",'{{2}}','{{3}}'],["#".$order->order_ref,'قبوله',$url],$message);
+                   // echo $message;
+                }
+            }
+            else{
+                $message = env('ORDER_CANCELLED_MESSAGE');
+                $message = "Dear Customer, Your Order #".$order->order_ref." is rejected , kindly track your order at ".$url." ";
+
+                $restuarant = Restaurants::find($order->resto_id);
+                 if($restuarant->default_lang=="ar"){
+                    $message = "عزيزي العميل طلبك {{1}} تم {{2}} ، لتتبع طلبك افتح الرابط {{3}}"; 
+                    $message = str_replace(["{{1}}",'{{2}}','{{3}}'],["#".$order->order_ref,'رفضه',$url],$message);
+                   // echo $message;
+                }
+            }
+
+            $mobile_number = isset($order->customers)?$order->customers->users->email:NULL;
+            //$mobile_number = "923459635387"; 
+
+            if(isset($mobile_number)){
+                $sms = new RestoSMSs();
+                $sms->resto_id = $order->resto_id;
+                $sms->msg = $message;
+                $sms->msg_purpose = "TRACK_ORDER_SMS";
+                $sms->msisdn = $mobile_number;
+                $sms->status = 1;
+
+                $sms->save();
+
+                $sms_id = $sms->id; 
+                $usrname = 'meem_food_order';
+
+                if(env('OTP_TEST_IN_DEV')=="1"){//ALWAYS ZERO IN PROD
+                    $usrname = 'meem_food_order1';
+                }
+
+                 $data = [
+                    'usrname'=>$usrname,
+                    'pwd'=>'meem@kkew#9',
+                    'msisdn' => $mobile_number,
+                    'smstxt' => $message,
+                    'pricepoint'=>1,
+                    'jsonstr'=>'Future'
+                ];
+                 Log::info('TRACK_ORDER_SMS Data: '.json_encode($data));
+
+
+                if(env('OTP_DONT_SEND_REQ')=="0"){//IN PROD THIS SHOULD BE 0 IN PROD
+                    $wsdlurl = env('WHATSAPP_OPT_API');
+
+                    $response = Http::acceptJson()->post($wsdlurl,$data);
+
+
+
+                    $response = $response->json();
+                    $response = json_encode($response);
+                    Log::info('TRACK_ORDER_SMS Response: '.$response);
+
+                    $sms = RestoSMSs::find($sms_id);
+                    $sms->otp_req = json_encode($data);
+
+                    $resp = json_decode($response);
+                    $sms->otp_req_status = strtoupper($resp->status)=="ACCEPTED"?"SUCCESS":"FAIL";
+
+
+
+                    $sms->otp_res = $response;
+                    
+
+                    $sms->save();
+                    
+                }
+
+
+            }
+
+            
+        }
+
+        OrderActivities::add_order_activity($id,$status);
+
+
+
+
+        $options = array(
+            'cluster' => env('PUSHER_APP_CLUSTER'),
+            'encrypted' => true
+        );
+        $pusher = new Pusher(
+            env('PUSHER_APP_KEY'),
+            env('PUSHER_APP_SECRET'),
+            env('PUSHER_APP_ID'),
+            $options
+        );
+
+
+        $data['order_id'] = $id;
+        $data['order_ref'] = $order->order_ref;
+        $data['customer_id'] = $order->customer_id;
+        $data['status'] = $status;
+        $data['order_resto_id'] = $order->resto_id;
+        $data['notification_for'] ="update-order-status";
+
+
+
+        $pusher->trigger(env('PUHER_APP_CHANNEL'), 'App\\Events\\OrderNotification', $data);
+    
+    }
+
+
+    public function update_instruction(Request $request){
+
+        $id = $request->id;
+        $txt = $request->text;
+
+        $order = Orders::find($id);
+
+        $order->order_instructions = $txt;
+
+        $order->save();
+
+    }
+
+    public function ajax_order(){
+        $offset = request()->get('start');
+        $limit = request()->get('length');
+        $draw = request()->get('draw');
+      //  $offset = ($offset-1) * $limit;
+        $orders = Orders::where('resto_id',Auth::user()->restaurants->id)->orderBy('created_at','DESC')->offset($offset)->limit($limit)->get();
+        $custom_status['Placed'] = ['Accepted'=>'Accepted','Rejected'=>'Rejected', 'Rejected_by_User'=>'Rejected by User'];
+        $custom_status['Send_to_Kitchen'] = ['On_Road'=>'On the Way','Rejected'=>'Rejected', 'Rejected_by_User'=>'Rejected by User'];
+        $custom_status['On_Road'] = ['Has_Delivered'=>'Delivered','Rejected'=>'Rejected', 'Rejected_by_User'=>'Rejected by User'];
+        $custom_statuses = ['Rejected_by_User'=>'Rejected by User','Accepted'=>'Accepted','Rejected'=>'Rejected','Placed'=>'Placed','Send_to_Kitchen'=>'Send to Kitchen','On_Road'=>'On the Way', 'Has_Delivered'=>'Delivered','Served'=>"Served","Cancelled_by_Customer"=>"Cancelled"];
+
+        $custom_status['Accepted'] = ['On_Road'=>'On the Way','Rejected'=>'Rejected', 'Rejected_by_User'=>'Rejected by User'];
+
+        $data = NULL;
+
+        foreach($orders as $order){
+            $data[] = [
+                        $order->order_ref,
+                        CommonMethods::formatDateTime($order->created_at),
+                        $order->customer_name,
+                        isset($order->customers)?(str_replace(env('COUNTRY_CODE'),'',$order->customers->users->email)):"",
+                        isset($order->customers) && isset($order->customers->customer_addresses[0])?$order->customers->customer_addresses[0]->address:"",
+                        number_format($order->total_price+$order->delivery_fee),
+                        isset($custom_statuses[$order->status])?$custom_statuses[$order->status]:"",
+                NULL
+            ];
+        }
+
+        return response()->json(array('data'=>$data));
+    }
+
+    public function print_order($id){
+        $order = Orders::find($id);
+        $data = [
+            'order' => $order
+        ];
+        return view('orders.print-order',$data);
+
+    }
+
+    public function order_history(){
+
+        //$recent_till = Carbon::now()->subDays(2);;
+
+
+
+        $orders = Orders::where('resto_id',Auth::user()->restaurants->id)->whereIN('status' ,['Rejected_by_User','Rejected','Has_Delivered','Close'])->orderBy('created_at','DESC')->paginate(50);
+        // $orders = Auth::user()->restaurants->orders;
+        $data = [
+            'orders' => $orders
+        ];
+        return view('orders.orders-history',$data);
+    }
+
+
+     function send_message($mobile_number,$message,$sms_id){
+        dd('ETST'); 
+
+        // $mobile_number = '9647834000012';
+        $usrname = 'meem_food_order';
+        //OTP_TEST_IN_DEV0,DISABLE_OTP=0,CONSIDER_OTP_ALWAYS_TRUE=0 in prod to make it live
+        if(env('OTP_TEST_IN_DEV')=="1"){//ALWAYS ZERO IN PROD
+            $usrname = 'meem_food_order1';
+        }
+
+        $data = [
+            'usrname'=>$usrname,
+            'pwd'=>'meem@kkew#9',
+            'msisdn' => $mobile_number,
+            'smstxt' => $message,
+            'pricepoint'=>1,
+            'jsonstr'=>'Future'
+        ];
+        dd($data);
+        // $wsdlurl = 'https://taiftec.com/blkdlr/bulk/sendmt';
+        $wsdlurl="";//Uncomment in prod
+        
+        Log::info('SMS Data: '.json_encode($data));
+
+        if(env('OTP_DONT_SEND_REQ')=="0"){//IN PROD THIS SHOULD BE 0 IN PROD
+            $wsdlurl = env('SMS_OPT_API');
+
+            $response = Http::acceptJson()->post($wsdlurl,$data);
+
+
+            $response = $response->json();
+            $response = json_encode($response);
+            Log::info('SMS Response: '.$response);
+
+            $sms = RestoSMSs::find($sms_id);
+            $sms->otp_req = json_encode($data);
+            $sms->otp_res = $response;
+
+            $sms->save();
+            
+        }
+
+
+        if(env('OTP_CONSIDER_ALWAYS_TRUE')=="1"){//IN PROD THIS SHOULD BE 0 IN PROD
+            $a = [
+                "reqid" => "20210611025322000469",
+                "mtid" => "18",
+                "errcode" => 1,
+                "status" => "ACCEPTED"];
+            $response = json_encode($a);
+            $access_token = Session::get('access_token');
+            $sms_url = env('RESTO_API_URL').'update/sms';
+            Http::post($sms_url,['sms_id'=>$sms_id,'req'=>json_encode($data),'resp'=>$response]);
+            return $response;
+        }
+
+        // dd($response->json());
+
+
+    }
+
+
+}

+ 10 - 0
app/Http/Controllers/OrderHist.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class OrderHist extends Controller
+{
+    //
+}

+ 471 - 0
app/Http/Controllers/Outlet.php

@@ -0,0 +1,471 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\BranchDeliveryAreas;
+use App\Models\BranchFeatures;
+use App\Models\BranchHours;
+use App\Helpers\CommonMethods;
+use App\Models\Outlets;
+use App\Models\Restaurants;
+use App\Models\Photos;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Storage;
+use Str;
+use File;
+use Image;
+use App\Models\RestoMetaDefs;
+use App\Models\RestoMetas;
+
+class Outlet extends Controller
+{
+    //
+
+    public function outlets(){
+          $resto_id = CommonMethods::getRestuarantID();
+      //  $resto = Restaurants::find($this->resto_id);
+        $outlets = Outlets::whereNull('deleted_at')->where('resto_id',$resto_id)->get();
+
+        return view('outlets.outlets',['outlets'=>$outlets]);
+    }
+
+    public function outlet_form(){
+        return view('outlets.new-outlets',['outlet'=>NULL]);
+    }
+
+    public function outlet_edit($unique_key){
+        $outlet = Outlets::where('unique_key',$unique_key)->first();
+
+        return view('outlets.new-outlets',['outlet'=>$outlet]);
+    }
+
+    public function outlet_address(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+
+        return view('outlets.outlet-address',['outlet'=>$outlet]);
+    }
+      public function outlet_delivery_area(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $areas = BranchDeliveryAreas::where('branch_id',$outlet->id)->whereNull('deleted_at')->get();
+        //dd($areas);
+        return view('outlets.outlet-delivery-area',['outlet'=>$outlet,'areas'=>$areas]);
+    }
+
+    public function edit_area($id){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $area = BranchDeliveryAreas::find($id);
+        $areas = BranchDeliveryAreas::where('branch_id',$outlet->id)->whereNull('deleted_at')->get();
+        return view('outlets.outlet-delivery-area',['outlet'=>$outlet,'area'=>$area,'areas'=>$areas]);
+    }
+
+    public function outlet_delivery_area_listing(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+
+        $areas = BranchDeliveryAreas::where('branch_id',$outlet->id)->whereNull('deleted_at')->get();
+
+        return view('outlets.outlet-delivery-area-listing',['outlet'=>$outlet,'areas'=>$areas]);
+    }
+
+    public function outlet_delivery(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $features = isset($outlet->delivery_feature)?$outlet->delivery_feature:NULL;
+        //$hours = isset($outlet->delivery_hours_feature)?$outlet->delivery_hours_feature:NULL;
+        return view('outlets.outlet-delivery',['outlet'=>$outlet,'features'=>$features]);
+    }
+    public function outlet_ordering_mode(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+
+        return view('outlets.outlet-ordering-mode',['outlet'=>$outlet]);
+    }
+
+    public function outlet_pickup(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $features = isset($outlet->pickup_feature)?$outlet->pickup_feature:NULL;
+        return view('outlets.outlet-pickup',['outlet'=>$outlet,'features'=>$features]);
+    }
+
+    public function outlet_dining(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $features = isset($outlet->contactless_dining_feature)?$outlet->contactless_dining_feature:NULL;
+        return view('outlets.outlet-contactless-dining',['outlet'=>$outlet,'features'=>$features]);
+    }
+
+    public function update_feature_status_1(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+        $type = $request->type;
+        $offDate = isset($request->offDate)?$request->offDate:"";
+
+        $outlet = Outlets::find($id);
+        if($type=="delivery"){
+          $outlet->is_delivery = $status;
+            if($status==0)
+                $outlet->outlet_delivery_off_date=$offDate;
+            else
+                $outlet->outlet_delivery_off_date=null;
+        }
+
+        if($type=="pickup"){
+          $outlet->is_pickup = $status;
+            if($status==0)
+                $outlet->outlet_pickup_off_date=$offDate;
+            else
+                $outlet->outlet_pickup_off_date=null;
+        }
+
+        if($type=="dine-in"){
+          $outlet->is_contactless_dining = $status;
+        }
+
+        $result = $outlet->save();
+
+
+    }
+
+     public function save_outlet(Request $request){
+
+
+        $name = $request->outlet_name;
+        $outlet_arabic_name = $request->outlet_arabic_name;
+        $time_zone = $request->time_zone;
+        $email = $request->email;
+        $phone = $request->phone;
+
+        $id = $request->id;
+
+        $resto_id = CommonMethods::getRestuarantID();
+        $resto = Restaurants::find($resto_id);
+
+        $restaurants =$resto;
+        $branch_id = 0;
+
+        if(empty($id)){
+            $outlet= new Outlets(); $outlet->unique_key = \Illuminate\Support\Str::uuid();
+        }else{
+            $outlet = Outlets::find($id);
+        }
+
+
+        $outlet->resto_id = $restaurants->id;
+        $outlet->time_zone = $time_zone;
+        $outlet->outlet_arabic_name = $outlet_arabic_name;
+        $outlet->name = $name;
+		 $outlet->whatsapp_number = $request->whatsapp_number;
+        $outlet->email = $email;
+        $outlet->country_id = $request->country_id;
+        $outlet->phone_number = $phone;
+            $outlet->vat = $request->vat;
+            $outlet->vat_type = $request->vat_type;
+
+        $outlet->resto_id = $restaurants->id;
+
+        $outlet->save();
+
+        $branch_id = $outlet->id;
+
+
+
+        if($branch_id > 0){
+            if($request->hasFile('image')){
+                $logo = $request->file('image');
+
+
+
+
+                $file_name = Str::slug($request->name)."-branch-main-image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('logo')->put($file_name.'.'.$extension,  File::get($logo));
+                $file = public_path('uploads/logo/'.$file_name.'.'.$extension);
+//uploadFileToAWSCDN($budketName, $restoID ,$restoName ,$sourceFile,$fileName )
+
+                $destinationPath = public_path('/uploads/logo/');
+
+
+               /* $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(800, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/' . $file_name.'.'.$extension);*/
+
+                $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$restaurants->id, $restaurants->resto_unique_name,$file,$file_name);
+
+
+
+
+                /* dd($buckets);
+                 $path = Storage::disk('s3')->put("meemcdn/".$file_name.'.'.$extension,  File::get($logo));
+                 dd($path);*/
+
+
+
+
+
+                /* $destinationPath = public_path('/uploads/logo/');
+
+
+                 $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                     $constraint->aspectRatio();
+                 });
+
+                 $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                 $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(85, null, function ($constraint) {
+                     $constraint->aspectRatio();
+                 });
+
+                 $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+
+                if($result['type']=="success"){
+                    $logo = Photos::where('resto_id',$restaurants->id)->where('branch_id',$branch_id)->where('photo_type','branch')->first();
+
+                    if(!$logo)
+                        $logo = new Photos();
+
+
+                    $logo->file_name = $result['url'];
+                    $logo->aws_cdn = $result['url'];
+                    $logo->resto_id = $restaurants->id;
+                    $logo->branch_id = $branch_id;
+                    $logo->photo_type = 'branch';
+
+
+                    $r = $logo->save();
+
+                    File::delete($file);
+                }
+
+
+                //$resto->text =
+            }
+
+            $resto_metas = isset($request->resto_meta) && count($request->resto_meta) > 0?$request->resto_meta:[];
+                    //dump($resto_metas);
+                    $resto_meta_value = isset($request->resto_meta_value) && count($request->resto_meta_value) > 0?$request->resto_meta_value:[];
+
+                    if(count($resto_metas) >  0){
+                        RestoMetas::where('bussiness_id',$resto->id)->where('for_role',Auth::user()->role)->where('outlet_id',$branch_id)->delete();
+                        foreach($resto_metas as $meta){
+
+                            $rm = RestoMetaDefs::find($meta);
+                         //   dump($rm);
+                                $r = new RestoMetas();
+                                $r->meta_def_id = $meta;
+                                $r->bussiness_id = $resto->id;
+                                $r->outlet_id =  $branch_id;
+                                $r->meta_val = isset($resto_meta_value[$meta])?$resto_meta_value[$meta]:(isset($rm)?$rm->meta_def_name:"");
+                                $r->for_role = Auth::user()->role;
+                                $r->status = 1;
+
+                                $r->save();
+                        }
+                    }
+            echo json_encode(array('type' => 'success', 'message'=>"Outlet's data is saved successfully.",'unique_key'=>$outlet->unique_key));
+        }else{
+            echo json_encode(array('type' => 'error', 'message'=>"Outlet's data is not saved, check info again."));
+        }
+
+
+
+
+
+
+    }
+
+    public function update_outlet(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+
+        $outlet = Outlets::find($id);
+        $outlet->active = $status;
+
+        $outlet->save();
+
+    }
+
+    public function save_address(Request $request){
+        $unique_id  = $request->unique_id;
+
+        $address    = $request->address;
+        $area       = $request->area;
+        $outlet     = Outlets::where('unique_key',$unique_id)->first();
+        $outlet->latitude = $request->lat;
+        $outlet->longitude = $request->lng;
+        if(isset($outlet)){
+            $outlet->address = $address;
+			$outlet->address_arabic = $request->address_arabic;
+            $outlet->place = $area;
+
+            $result = $outlet->save();
+
+            if($result)
+                echo json_encode(array('type' => 'success', 'message'=>"Outlet's address is saved successfully."));
+            else
+                echo json_encode(array('type' => 'error', 'message'=>"Outlet's address is not saved, check info again."));
+        }else{
+            echo json_encode(array('type' => 'error', 'message'=>"Outlet key is invalid."));
+        }
+
+
+    }
+
+    public function save_branch_feature(Request $request){
+
+       $payment_method = isset($request->payment_methods)?implode(',',$request->payment_methods):NULL;
+       $feature_type = $request->feature_type;
+       $preparation_time = $request->preparation_time;
+       $preparation_delivery_time = $request->preperation_delivery;
+       $time_from = $request->time_from;
+	   $time_to = $request->time_to;
+	   $estimated_time_type = $request->estimated_time_type;
+
+		$estimated_time = $time_from.' - '.$time_to.':'.$estimated_time_type;
+
+        $is_open = $request->is_open;
+       $id = $request->id;
+
+       $feature = BranchFeatures::where('branch_id',$id)->where('feature_type',$feature_type)->first();
+       if(!isset($feature))
+       $feature = new BranchFeatures();
+
+       $feature->payment_methods = $payment_method;
+        $feature->feature_type = $feature_type;
+        $feature->preparation_timing = $preparation_time;
+        $feature->preparation_delivery_time = $preparation_delivery_time;
+		$feature->preparation_delivery_type = $request->preparation_delivery_type;
+        $feature->estimated_time = $estimated_time;
+        $feature->slot_length = $request->slot_length;
+		//$feature->estimated_time_type = $request->estimated_time_type;
+        $feature->branch_id = $id;
+
+        $feature->save();
+
+        $start_time = $request->start_time;
+        $end_time = $request->end_time;
+
+        if(isset($start_time)){
+            $time = BranchHours::where('branch_id',$id)->where('hours_for',$feature_type)->delete();
+            foreach($start_time as $k=>$s){
+
+
+
+               // $time = BranchHours::where('day_name',$k)->where('branch_id',$id)->where('hours_for',$feature_type)->first();
+
+               // if(!isset($time))
+                foreach($s as $a=>$v){
+                    $time = new BranchHours();
+
+
+                    $time->day_name = $k;
+                    $time->branch_id = $id;
+                    $time->hours_for = $feature_type;
+                    $time->start_time = isset($is_open[strtolower($k)])? date('H:i',strtotime($v)):NULL;
+                    $time->end_time = isset($is_open[strtolower($k)])?date('H:i',strtotime($end_time[$k][$a])):NULL;
+                    $time->status = isset($is_open[strtolower($k)])?"open":"close";
+                    $result = $time->save();
+                    //$time->status = 'open';
+                }
+
+
+
+                //$result = $time->save();
+
+            }
+        }
+
+
+
+        if($result)
+            echo json_encode(array('type' => 'success', 'message'=>"Outlet's ".$feature_type." is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Outlet's ".$feature_type." is not saved, check info again."));
+
+
+    }
+
+    public function update_feature_status(Request $request){
+        $id = $request->outletId;
+        $status = $request->is_active=="true"?1:0;
+        $feature = $request->feature;
+
+        $outlet = Outlets::find($id);
+        $outlet->$feature = $status;
+
+        $result = $outlet->save();
+
+
+    }
+
+    public function delete_outlet ($id){
+        $outlet = Outlets::where('unique_key',$id)->first();
+
+        $outlet->deleted_at =date('Y-m-d H:i:s');
+        $outlet->save();
+    }
+
+    public function delete_area ($id){
+        $outlet = BranchDeliveryAreas::find($id);
+
+        $outlet->deleted_at =date('Y-m-d H:i:s');
+        $outlet->save();
+    }
+
+    public function save_outlet_area(Request $request){
+        $id = $request->id;
+        $coordinates    = $request->coordinates;
+        $area_name      = $request->area_name;
+        $min_price      = $request->min_basket;
+        $delivery_fee   = $request->delivery_fee;
+        $unique_id      = $request->unique_id;
+        $center_radius  = $request->center_radius;
+
+        $outlet         = Outlets::where('unique_key',$unique_id)->first();
+        $outlet_id      = $outlet->id;
+            if($id==0)
+           $area = new BranchDeliveryAreas();
+            else
+                $area = BranchDeliveryAreas::find($id);
+
+           $area->branch_id = $outlet_id;
+           $area->lat_lag = $coordinates;
+          // $area->center_radius = $center_radius;
+           $area->area_name = $area_name;
+           $area->delivery_fee = $delivery_fee;
+            $area->min_price = $min_price;
+            $result = $area->save();
+
+
+        if($result)
+            echo json_encode(array('type' => 'success', 'message'=>"Area's information is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Outlet's information is not saved, check info again."));
+    }
+
+    public function update_area_status(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+
+        $outlet = BranchDeliveryAreas::find($id);
+        $outlet->status = $status;
+
+        $outlet->save();
+    }
+
+    public function outlet_digital_menu(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+
+        return view('outlets.outlet-digital-menu',['outlet'=>$outlet]);
+    }
+
+    public function pause_orders(){
+              $resto_id = CommonMethods::getRestuarantID();
+      //  $resto = Restaurants::find($this->resto_id);
+         $outlets = Outlets::whereNull('deleted_at')->where('resto_id',$resto_id)->get();
+
+        return view('outlets.outlets-pause-orders',['outlets'=>$outlets]);
+    }
+}

+ 415 - 0
app/Http/Controllers/Outlet.php_1

@@ -0,0 +1,415 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\BranchDeliveryAreas;
+use App\BranchFeatures;
+use App\BranchHours;
+use App\Helpers\CommonMethods;
+use App\Outlets;
+use App\Photos;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Storage;
+use Str;
+use File;
+use Image;
+
+class Outlet extends Controller
+{
+    //
+
+    public function outlets(){
+        $outlets = Outlets::whereNull('deleted_at')->where('resto_id',Auth::user()->restaurants->id)->get();
+
+        return view('outlets.outlets',['outlets'=>$outlets]);
+    }
+
+    public function outlet_form(){
+        return view('outlets.new-outlets',['outlet'=>NULL]);
+    }
+
+    public function outlet_edit($unique_key){
+        $outlet = Outlets::where('unique_key',$unique_key)->first();
+
+        return view('outlets.new-outlets',['outlet'=>$outlet]);
+    }
+
+    public function outlet_address(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+
+        return view('outlets.outlet-address',['outlet'=>$outlet]);
+    }
+      public function outlet_delivery_area(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $areas = BranchDeliveryAreas::where('branch_id',$outlet->id)->whereNull('deleted_at')->get();
+        //dd($areas);
+        return view('outlets.outlet-delivery-area',['outlet'=>$outlet,'areas'=>$areas]);
+    }
+
+    public function edit_area($id){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $area = BranchDeliveryAreas::find($id);
+        $areas = BranchDeliveryAreas::where('branch_id',$outlet->id)->whereNull('deleted_at')->get();
+        return view('outlets.outlet-delivery-area',['outlet'=>$outlet,'area'=>$area,'areas'=>$areas]);
+    }
+
+    public function outlet_delivery_area_listing(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+
+        $areas = BranchDeliveryAreas::where('branch_id',$outlet->id)->whereNull('deleted_at')->get();
+
+        return view('outlets.outlet-delivery-area-listing',['outlet'=>$outlet,'areas'=>$areas]);
+    }
+
+    public function outlet_delivery(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $features = isset($outlet->delivery_feature)?$outlet->delivery_feature:NULL;
+        //$hours = isset($outlet->delivery_hours_feature)?$outlet->delivery_hours_feature:NULL;
+        return view('outlets.outlet-delivery',['outlet'=>$outlet,'features'=>$features]);
+    }
+    public function outlet_ordering_mode(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+
+        return view('outlets.outlet-ordering-mode',['outlet'=>$outlet]);
+    }
+
+    public function outlet_pickup(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $features = isset($outlet->pickup_feature)?$outlet->pickup_feature:NULL;
+        return view('outlets.outlet-pickup',['outlet'=>$outlet,'features'=>$features]);
+    }
+
+    public function outlet_dining(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        $features = isset($outlet->contactless_dining_feature)?$outlet->contactless_dining_feature:NULL;
+        return view('outlets.outlet-contactless-dining',['outlet'=>$outlet,'features'=>$features]);
+    }
+
+    public function update_feature_status_1(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+        $type = $request->type;
+
+        $outlet = Outlets::find($id);
+        if($type=="delivery"){
+          $outlet->is_delivery = $status;  
+        }
+        
+        if($type=="pickup"){
+          $outlet->is_pickup = $status;  
+        }
+
+        if($type=="dine-in"){ 
+          $outlet->is_contactless_dining = $status;  
+        }
+        $result = $outlet->save();
+
+
+    }
+
+    public function save_outlet(Request $request){
+
+
+        $name = $request->outlet_name;
+        $time_zone = $request->timezone;
+        $email = $request->email;
+        $phone = $request->phone;
+
+        $id = $request->id;
+
+        $restaurants =Auth::user()->restaurants;
+        $branch_id = 0;
+
+        if(empty($id)){
+            $outlet= new Outlets(); $outlet->unique_key = \Illuminate\Support\Str::uuid();
+        }else{
+            $outlet = Outlets::find($id);
+        }
+
+
+        $outlet->resto_id = $restaurants->id;
+        $outlet->time_zone = $time_zone;
+        $outlet->name = $name;
+        $outlet->email = $email;
+        $outlet->phone_number = $phone;
+
+        $outlet->resto_id = $restaurants->id;
+
+        $outlet->save();
+
+        $branch_id = $outlet->id;
+
+       
+
+        if($branch_id > 0){
+            if($request->hasFile('image')){
+                $logo = $request->file('image');
+
+
+
+
+                $file_name = Str::slug($request->name)."-branch-main-image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('logo')->put($file_name.'.'.$extension,  File::get($logo));
+                $file = public_path('uploads/logo/'.$file_name.'.'.$extension);
+//uploadFileToAWSCDN($budketName, $restoID ,$restoName ,$sourceFile,$fileName )
+
+                $destinationPath = public_path('/uploads/logo/');
+
+
+               /* $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(800, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/' . $file_name.'.'.$extension);*/
+
+                $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$restaurants->id, $restaurants->resto_unique_name,$file,$file_name);
+
+
+
+
+                /* dd($buckets);
+                 $path = Storage::disk('s3')->put("meemcdn/".$file_name.'.'.$extension,  File::get($logo));
+                 dd($path);*/
+
+
+
+
+
+                /* $destinationPath = public_path('/uploads/logo/');
+
+
+                 $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                     $constraint->aspectRatio();
+                 });
+
+                 $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                 $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(85, null, function ($constraint) {
+                     $constraint->aspectRatio();
+                 });
+
+                 $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+
+                if($result['type']=="success"){
+                    $logo = Photos::where('resto_id',$restaurants->id)->where('branch_id',$branch_id)->where('photo_type','branch')->first();
+
+                    if(!$logo)
+                        $logo = new Photos();
+
+
+                    $logo->file_name = $result['url'];
+                    $logo->aws_cdn = $result['url'];
+                    $logo->resto_id = $restaurants->id;
+                    $logo->branch_id = $branch_id;
+                    $logo->photo_type = 'branch';
+
+
+                    $r = $logo->save();
+                 
+                    File::delete($file);
+                }
+
+
+                //$resto->text =
+            }
+            echo json_encode(array('type' => 'success', 'message'=>"Outlet's data is saved successfully.",'unique_key'=>$outlet->unique_key));
+        }else{
+            echo json_encode(array('type' => 'error', 'message'=>"Outlet's data is not saved, check info again."));
+        }
+
+
+
+
+
+
+    }
+
+    public function update_outlet(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+
+        $outlet = Outlets::find($id);
+        $outlet->active = $status;
+
+        $outlet->save();
+
+    }
+
+    public function save_address(Request $request){
+        $unique_id  = $request->unique_id;
+
+        $address    = $request->address;
+        $area       = $request->area;
+        $outlet     = Outlets::where('unique_key',$unique_id)->first();
+        $outlet->latitude = $request->lat;
+        $outlet->longitude = $request->lng;
+        if(isset($outlet)){
+            $outlet->address = $address;
+            $outlet->place = $area;
+
+            $result = $outlet->save();
+
+            if($result)
+                echo json_encode(array('type' => 'success', 'message'=>"Outlet's address is saved successfully."));
+            else
+                echo json_encode(array('type' => 'error', 'message'=>"Outlet's address is not saved, check info again."));
+        }else{
+            echo json_encode(array('type' => 'error', 'message'=>"Outlet key is invalid."));
+        }
+
+
+    }
+
+    public function save_branch_feature(Request $request){
+
+       $payment_method = isset($request->payment_methods)?implode(',',$request->payment_methods):NULL;
+       $feature_type = $request->feature_type;
+       $preparation_time = $request->preparation_time;
+       $preparation_delivery_time = $request->preperation_delivery;
+       $estimated_time = $request->estimated_time;
+       
+        $is_open = $request->is_open;
+       $id = $request->id;
+
+       $feature = BranchFeatures::where('branch_id',$id)->where('feature_type',$feature_type)->first();
+       if(!isset($feature))
+       $feature = new BranchFeatures();
+
+       $feature->payment_methods = $payment_method;
+        $feature->feature_type = $feature_type;
+        $feature->preparation_timing = $preparation_time;
+        $feature->preparation_delivery_time = $preparation_delivery_time;
+        $feature->estimated_time = $estimated_time;
+        $feature->branch_id = $id;
+
+        $feature->save();
+
+        $start_time = $request->start_time;
+        $end_time = $request->end_time;
+
+        if(isset($start_time)){
+            $time = BranchHours::where('branch_id',$id)->where('hours_for',$feature_type)->delete();
+            foreach($start_time as $k=>$s){
+
+
+
+               // $time = BranchHours::where('day_name',$k)->where('branch_id',$id)->where('hours_for',$feature_type)->first();
+
+               // if(!isset($time))
+                foreach($s as $a=>$v){
+                    $time = new BranchHours();
+
+
+                    $time->day_name = $k;
+                    $time->branch_id = $id;
+                    $time->hours_for = $feature_type;
+                    $time->start_time = isset($is_open[strtolower($k)])? date('H:i',strtotime($v)):NULL;
+                    $time->end_time = isset($is_open[strtolower($k)])?date('H:i',strtotime($end_time[$k][$a])):NULL;
+                    $time->status = isset($is_open[strtolower($k)])?"open":"close";
+                    $result = $time->save();
+                    //$time->status = 'open';
+                }
+
+
+
+                //$result = $time->save();
+
+            }
+        }
+
+
+
+        if($result)
+            echo json_encode(array('type' => 'success', 'message'=>"Outlet's ".$feature_type." is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Outlet's ".$feature_type." is not saved, check info again."));
+
+
+    }
+
+    public function update_feature_status(Request $request){
+        $id = $request->outletId;
+        $status = $request->is_active=="true"?1:0;
+        $feature = $request->feature;
+
+        $outlet = Outlets::find($id);
+        $outlet->$feature = $status;
+
+        $result = $outlet->save();
+
+
+    }
+
+    public function delete_outlet ($id){
+        $outlet = Outlets::where('unique_key',$id)->first();
+
+        $outlet->deleted_at =date('Y-m-d H:i:s');
+        $outlet->save();
+    }
+
+    public function delete_area ($id){
+        $outlet = BranchDeliveryAreas::find($id);
+
+        $outlet->deleted_at =date('Y-m-d H:i:s');
+        $outlet->save();
+    }
+
+    public function save_outlet_area(Request $request){
+        $id = $request->id;
+        $coordinates    = $request->coordinates;
+        $area_name      = $request->area_name;
+        $min_price      = $request->min_basket;
+        $delivery_fee   = $request->delivery_fee;
+        $unique_id      = $request->unique_id;
+        $center_radius  = $request->center_radius;
+
+        $outlet         = Outlets::where('unique_key',$unique_id)->first();
+        $outlet_id      = $outlet->id;
+            if($id==0)
+           $area = new BranchDeliveryAreas();
+            else
+                $area = BranchDeliveryAreas::find($id);
+
+           $area->branch_id = $outlet_id;
+           $area->lat_lag = $coordinates;
+          // $area->center_radius = $center_radius;
+           $area->area_name = $area_name;
+           $area->delivery_fee = $delivery_fee;
+            $area->min_price = $min_price;
+            $result = $area->save();
+
+
+        if($result)
+            echo json_encode(array('type' => 'success', 'message'=>"Area's information is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Outlet's information is not saved, check info again."));
+    }
+
+    public function update_area_status(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+
+        $outlet = BranchDeliveryAreas::find($id);
+        $outlet->status = $status;
+
+        $outlet->save();
+    }
+
+    public function outlet_digital_menu(){
+        $outlet = Outlets::where('unique_key',request()->get('o'))->first();
+        
+        return view('outlets.outlet-digital-menu',['outlet'=>$outlet]);
+    }
+
+    public function pause_orders(){
+         $outlets = Outlets::whereNull('deleted_at')->where('resto_id',Auth::user()->restaurants->id)->get();
+
+        return view('outlets.outlets-pause-orders',['outlets'=>$outlets]);
+    }
+}

+ 76 - 0
app/Http/Controllers/PaymentLink.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Helpers\CommonMethods;
+use App\Models\Outlets;
+use App\Models\PaymentLinks;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Str;
+
+class PaymentLink extends Controller
+{
+    //
+    public function payment_links(){
+        $resto_id = CommonMethods::getRestuarantID();
+
+        $payment_links = PaymentLinks::whereNull('deleted_at')->where('resto_id',$resto_id)->orderBy('created_at','DESC')->paginate(50);
+
+        return view('payment-links.index',['payment_links'=>$payment_links]);
+    }
+
+    public function save_payment_links(Request  $request){
+        $id = $request->id;
+        $resto_id = CommonMethods::getRestuarantID();
+        if(empty($id)){
+            $payment_link = new PaymentLinks();
+            $payment_link->resto_id = $resto_id;
+            $payment_link->unique_id = "PL-".$resto_id.'-'.rand(1000000,9999999);
+            $payment_link->status = 'active';
+        }
+
+        else
+            $payment_link = PaymentLinks::find($id);
+
+        $payment_link->number_of_uses = $request->number_of_uses;
+        $payment_link->amount = $request->amount;
+        $payment_link->outlet_id = $request->outlet_id;
+        $payment_link->purpose_payment = $request->purpose_payment;
+        $payment_link->payment_message = $request->payment_message;
+
+        $payment_link->save();
+
+        $id = $payment_link->id;
+
+        if($id > 0){
+            echo json_encode(array('type'=>'success','message'=>'Payment Link saved!.','id'=>$payment_link->unique_id));
+            exit;
+        }else{
+            echo json_encode(array('type'=>'error','message'=>'Payment Link is saved!.'));
+            exit;
+        }
+
+
+    }
+
+    public function delete_payment_link($id){
+        $payment_link = PaymentLinks::find($id);
+
+        $payment_link->deleted_at = Carbon::now()->format('Y-m-d H:i:s');
+        $payment_link->save();
+    }
+
+    public function new_payment(){
+        $resto_id = CommonMethods::getRestuarantID();
+        $outlets = Outlets::whereNull('deleted_at')->where('active',1)->where('resto_id',$resto_id)->get();
+
+        return view('payment-links.payment-links-form',['outlets'=>$outlets]);
+    }
+
+    public function view_payment($unique_id){
+        $payment_link = PaymentLinks::withCount('payments')->where('unique_id',$unique_id)->first();
+
+        return view('payment-links.payment-links-view',['payment_link'=>$payment_link]);
+    }
+}

+ 22 - 0
app/Http/Controllers/Photo.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Photos;
+use Illuminate\Http\Request;
+use File;
+
+class Photo extends Controller
+{
+    //
+
+    public function delete_image($id){
+        $media = Photos::find($id);
+        $file_name = $media->file_name;
+
+        $media->delete();
+        $type = $_GET['type'];
+
+        File::delete( public_path('/uploads/'.$type.'-gallery/'.$file_name));
+    }
+}

+ 187 - 0
app/Http/Controllers/PlaceManagement.php

@@ -0,0 +1,187 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Cities;
+use App\Models\Countries;
+use App\Models\PlaceDeliveryPrices;
+use App\Models\PlaceCategories;
+use App\Models\RestoCategoriesMapped;
+use Illuminate\Http\Request;
+use Illuminate\Support\Str;
+
+class PlaceManagement extends Controller
+{
+    //
+
+    public function countries(){
+        $countries = Countries::whereNull('deleted_at')->get();
+
+        return view('system-management.place-management.counteries',['countries'=>$countries]);
+    }
+
+    public function edit_country($id){
+        $country = Countries::find($id);
+        return $country->toJson();
+    }
+    public function delete_country($id){
+        $country = Countries::find($id);
+        $country->deleted_at = date('Y-m-d H:i:s');
+
+        $country->save();
+    }
+
+    public function update_status(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+        $country = Countries::find($id);
+        $country->active = $status;
+
+        $country->save();
+    }
+
+    //********************** PLACE CATEGORIES ******************
+
+    public function categories(){
+        $categories = PlaceCategories::whereNull('deleted_at')->get();
+
+        return view('system-management.place-management.categories',['categories'=>$categories]);
+    }
+
+    public function edit_category($id){
+        $category = PlaceCategories::find($id);
+        return $category->toJson();
+    }
+    public function delete_category($id){
+        $category = PlaceCategories::find($id);
+        $category->deleted_at = date('Y-m-d H:i:s');
+
+        $category->save();
+    }
+
+    public function update_status_category(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+        $category = PlaceCategories::find($id);
+        $category->active = $status;
+
+        $category->save();
+    }
+
+    public function save_place_category(Request $request){
+        $id = $request->id;
+
+        if(empty($id)){
+            $category = new PlaceCategories();
+            $category->category_unique_id = Str::uuid();
+        }
+
+        else
+            $category = PlaceCategories::find($id);
+
+        $category->category_title = $request->category_title;
+
+
+
+        $category->save();
+
+        $id = $category->id;
+        if($id > 0)
+            echo json_encode(array('type' => 'success', 'message'=>"Category's data is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Category's data is not saved, check info again."));
+    }
+
+    //---------------------- CITIES -/////////////////////////////
+
+    public function cities(){
+        $countries = Countries::whereNull('deleted_at')->get();
+        $c = request()->get('country');
+        $country_id = isset($c) && !empty($c)?request()->get('country'):"2";
+
+        $cities = Cities::whereNull('deleted_at')->where('country_id',$country_id)->get();
+
+        return view('system-management.place-management.cities',['cities'=>$cities,'countries'=>$countries,'country_id'=>$country_id]);
+    }
+
+    public function edit_city($id){
+        $city = Cities::find($id);
+        return $city->toJson();
+    }
+    public function delete_city($id){
+        $city = Cities::find($id);
+        $city->deleted_at = date('Y-m-d H:i:s');
+
+        $city->save();
+    }
+
+    public function update_status_city(Request $request){
+        $id = $request->id;
+        $status = $request->status;
+        $city = Cities::find($id);
+        $city->is_active = $status;
+
+        $city->save();
+    }
+
+    public function save_city(Request $request){
+        $id = $request->id;
+
+        if(empty($id)){
+            $city = new Cities();
+            $city->city_unique_id = Str::uuid();
+        }
+
+        else
+            $city = Cities::find($id);
+
+
+        $city->name = $request->city_name;
+        $city->country_id = $request->country_id;
+
+        $city->is_active = 1;
+
+        $city->save();
+
+        $id = $city->id;
+        if($id > 0)
+            echo json_encode(array('type' => 'success', 'message'=>"City's data is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"City's data is not saved, check info again."));
+    }
+
+    //////////////////////////////////////////////////////////////////////////////////////
+    /// //************************************************************************//
+
+    public function getCityByCountryID($country_id){
+
+        $cities = Cities::whereNull('deleted_at')->where('is_active',1)->where('country_id',$country_id)->get();
+
+        echo json_encode($cities);
+    }
+
+    public function save_resto_category(Request $request){
+        $resto_id = $request->resto_id;
+        $price =$request->price;
+        $category = $request->categories;
+
+        RestoCategoriesMapped::where('resto_id',$resto_id)->delete();
+
+        foreach($category as $k=>$p){
+            $map = new RestoCategoriesMapped();
+
+            $map->category_id = $p;
+            $map->resto_id = $resto_id;
+            $map->default_price = $price[$k];
+
+            $map->save();
+        }
+    }
+
+    public function delete_saved_delivery_fee($id){
+        $delivery = PlaceDeliveryPrices::find($id);
+
+        $delivery->delete();
+    }
+
+}

+ 690 - 0
app/Http/Controllers/Recipe.php

@@ -0,0 +1,690 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Categories;
+use App\Models\MapRecipeCategories;
+use App\Models\Photos;
+use App\Models\Recipes;
+use App\Models\Restaurants;
+use App\Models\VariationData;
+use App\Models\VariationTypes;
+use Brian2694\Toastr\Facades\Toastr;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Storage;
+use Ramsey\Uuid\Uuid;
+use App\Models\ClothOptions;
+use Str;
+use File;
+use Illuminate\Support\Facades\Hash;
+use Image;
+use App\Models\ProductFAQs;
+
+use App\Helpers\CommonMethods;
+
+class Recipe extends Controller
+{
+    public function update_inventory_option(Request $request){
+        $id = $request->recipe_id;
+        $recipe = Recipes::find($id);
+
+        $recipe->inventory_options = $request->inventory_option;
+        $recipe->save();
+    }
+    public function inventory(){
+              $resto_id = CommonMethods::getRestuarantID();
+                $resto = Restaurants::find($resto_id);
+         $recipes = $resto->recipes();;
+         $data = [
+            'recipes' => $recipes->get()
+        ];
+        return view('recipes.inventory',$data);
+    }
+
+
+    //
+    public function recipes(){
+
+        Toastr::success('Post added successfully :)','Success');
+        $resto_id = CommonMethods::getRestuarantID();
+                $resto = Restaurants::find($resto_id);
+        // $recipes = $resto->recipes();;
+        $categories  = Categories::where('resto_id',$resto_id)->with(['categories_has_recipes'=>function($q){ $q->orderBy('tb_dm_recipe_categories_map.display_order','ASC'); }])->whereNull('deleted_at')->get();
+
+
+        //dd($categories[0]->items);
+        $data = [
+            'categories' => $categories
+        ];
+        return view('recipes.recipes',$data);
+    }
+
+    public function new_recipe(){
+        $resto_id = CommonMethods::getRestuarantID();
+
+            $categories = Categories::whereNull('deleted_at')->where('is_active',1)->whereIn('resto_id',[$resto_id])->get();
+
+
+
+        $data = [
+         'categories' => $categories
+     ];
+        return view('recipes.recipe_form',$data);
+    }
+
+    public function editnew($id){
+        $resto_id = CommonMethods::getRestuarantID();
+
+            $categories = Categories::whereNull('deleted_at')->where('is_active',1)->whereIn('resto_id',[$resto_id])->get();
+
+
+        $recipe = Recipes::find($id);
+        $data = [
+            'categories' => $categories,
+            'recipe' =>$recipe
+        ];
+        return view('recipes.recipe_form_new',$data);
+    }
+	public function edit($id){
+        $resto_id = CommonMethods::getRestuarantID();
+
+        $categories = Categories::whereNull('deleted_at')->where('is_active',1)->whereIn('resto_id',[$resto_id])->get();
+        $variant_types = VariationTypes::where('resto_id',$resto_id)->where('status','active')->whereNull('deleted_at')->get();
+
+        $recipe = Recipes::find($id);
+        $data = [
+            'categories' => $categories,
+            'recipe' =>$recipe,
+            'variant_types'=>$variant_types
+        ];
+        return view('recipes.recipe_form',$data);
+    }
+
+    public function get_variation_attributes(Request $request){
+       $variations = $request->variations;
+        $variations = VariationTypes::with('attributes')->whereIn('id',$variations)->get();
+       return response()->json($variations);
+
+
+    }
+
+ public function save(Request $request){
+    $resto_id = CommonMethods::getRestuarantID();
+                $resto = Restaurants::find($resto_id);
+
+
+        $id = $request->id;
+	 $colorOption = "";
+
+        if(empty($id)){
+            $recipe = new Recipes();
+            $recipe->unique_shared_key = Str::uuid();
+        }
+
+        else{
+			$recipe = Recipes::find($id);
+			if($request->business_type=="ClothsStore"){
+				$colorOption = $recipe->color_option;
+
+			if($colorOption!=$request->color_option)
+				$option = ClothOptions::where('resto_id',$resto_id)->where('product_id',$id)->where('type',$colorOption)->update(['deleted_at'=>date('Y-m-d H:i:s')]);
+			}
+
+
+		}
+
+
+        $recipe->name = $request->name;
+        $recipe->arabic_name = $request->arabic_name;
+        $recipe->status = '1';
+
+
+        $recipe->resto_id = $resto_id;
+        $recipe->price = $request->price;
+        $recipe->show_recipe_main_price = isset($request->show_recipe_main_price)?1:0;
+        $recipe->short_description = $request->short_description;
+	 	$recipe->short_description_arabic = $request->short_description_arabic;
+        $recipe->is_customized = isset($request->is_customized)?1:0;
+        $recipe->status = isset($request->status)?1:0;
+        $recipe->allow_pre_order = isset($request->allow_pre_order)?"Yes":"No";
+	    if($request->business_type=="ClothsStore")
+	    $recipe->color_option = $request->color_option;
+
+
+        $recipe->save();
+
+        $recipe_id = $recipe->id;
+
+        if($recipe_id > 0){
+
+            $categories = $request->category;
+            //dd($categories);
+            MapRecipeCategories::where('recipe_id',$recipe_id)->delete();
+
+            if(count($categories) > 0){
+                foreach($categories as $category){
+                    $m_c = new MapRecipeCategories();
+                    $m_c->category_id = $category;
+                    $m_c->recipe_id =  $recipe_id;
+                    $m_c->resto_id =   $resto_id;;
+                    $m_c->save();
+                }
+
+
+            }
+
+
+            if($request->hasFile('main_image')){
+                $logo = $request->file('main_image');
+
+
+
+                $file_name = Str::slug($request->name)."-main_image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+                $destinationPath = public_path('/uploads/main_image/');
+
+
+                /*$img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });*/
+
+               // $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+                $file = public_path('uploads/main_image/'.$file_name.'.'.$extension);
+                $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$resto_id, $resto->resto_unique_name,$file,$file_name);
+/*
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(200, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+
+
+                $main_image = Photos::where('recipe_id',$recipe_id)->where('photo_type','main_image')->first();
+                if(!$main_image)
+                    $main_image = new Photos();
+
+
+                $main_image->file_name = $result['url'];
+                $main_image->aws_cdn = $result['url'];
+                $main_image->recipe_id = $recipe_id;
+                $main_image->photo_type = 'main_image';
+                $main_image->resto_id =  $resto_id;;;
+
+                $main_image->save();
+                 File::delete(  $file);
+
+                //$resto->text =
+            }
+        if($request->business_type=="ClothsStore"){
+
+
+
+			$color_image = ($request->color_image);
+			if($request->hasFile('color_image'))
+                $color_image = $request->file('color_image');
+
+
+                $colors  = !empty($request->color)?$request->color:NULL;
+                $sizes   = !empty($request->size)?$request->size:NULL;
+
+                if(isset($colors) && count($colors) > 0){
+					// $option = ClothOptions::where('resto_id',$resto_id)->where('product_id',$recipe_id)->delete();
+                    foreach($colors as $color){
+						$img_url = NULL;
+
+						if(isset($color_image[$color])){
+							// $color_image = $request->file($request->color_image);
+							//dump($color_image[$color]);
+							$file = $color_image[$color];
+							$file_name = "color-image-main_image".'-'.time();
+							$extension = $file->getClientOriginalExtension();
+
+
+
+							Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($file));
+
+							$destinationPath = public_path('/uploads/main_image/');
+
+
+							/*$img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+								$constraint->aspectRatio();
+							});*/
+
+						   // $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+							$file = public_path('uploads/main_image/'.$file_name.'.'.$extension);
+							$result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$resto_id, $resto->resto_unique_name,$file,$file_name);
+							$img_url = $result['url'];
+
+						}
+
+                      $options = new ClothOptions();
+                      $options->resto_id =  $resto_id;
+                      $options->product_id = $recipe_id;
+                      $options->name = $color;
+                      $options->type=$request->color_option;
+					  $options->img_url = $img_url;
+                      $options->save();
+                    }
+
+
+
+
+                }
+
+                if(isset($sizes) && count($sizes) > 0){
+					$option = ClothOptions::where('resto_id',$resto_id)->where('product_id',$recipe_id)->where('type','size')->delete();
+                    foreach($sizes as $size){
+                      $options = new ClothOptions();
+                      $options->resto_id =  $resto_id;
+                      $options->product_id = $recipe_id;
+                      $options->name = $size;
+                      $options->type="size";
+
+                      $options->save();
+                    }
+
+
+
+
+                }
+            }
+
+            echo json_encode(array('type' => 'success', 'message'=>"Item is saved successfully."));
+        }
+
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Item is not saved successfully."));
+
+
+
+    }
+   /* public function save(Request $request){
+        $id = $request->id;
+
+        if(empty($id)){
+            $recipe = new Recipes();
+            $recipe->unique_shared_key = Str::uuid();
+        }
+
+        else
+            $recipe = Recipes::find($id);
+
+        $recipe->name = $request->name;
+        $recipe->status = '1';
+
+
+        $recipe->resto_id = Auth::user()->restaurants->id;
+        $recipe->price = $request->price;
+        $recipe->short_description = $request->short_description;
+        $recipe->is_customized = isset($request->is_customized)?1:0;
+        $recipe->status = isset($request->status)?1:0;
+
+
+        $recipe->save();
+
+        $recipe_id = $recipe->id;
+
+        if($recipe_id > 0){
+
+            $categories = $request->category;
+            //dd($categories);
+            MapRecipeCategories::where('recipe_id',$recipe_id)->delete();
+
+            if(count($categories) > 0){
+                foreach($categories as $category){
+                    $m_c = new MapRecipeCategories();
+                    $m_c->category_id = $category;
+                    $m_c->recipe_id =  $recipe_id;
+                    $m_c->resto_id =   Auth::user()->restaurants->id;;
+                    $m_c->save();
+                }
+
+
+            }
+
+
+            if($request->hasFile('main_image')){
+                $logo = $request->file('main_image');
+
+
+
+                $file_name = Str::slug($request->name)."-main_image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+                $destinationPath = public_path('/uploads/main_image/');
+
+
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(200, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);
+
+
+                $main_image = Photos::where('recipe_id',$recipe_id)->where('photo_type','main_image')->first();
+                if(!$main_image)
+                    $main_image = new Photos();
+
+
+                $main_image->file_name = $file_name.'.'.$extension;
+                $main_image->recipe_id = $recipe_id;
+                $main_image->photo_type = 'main_image';
+                $main_image->resto_id =  Auth::user()->restaurants->id;;;
+
+                $main_image->save();
+
+                //$resto->text =
+            }
+
+
+            echo json_encode(array('type' => 'success', 'message'=>"Recipe's data is saved successfully."));
+        }
+
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Recipe's data is not saved successfully."));
+
+
+
+    }*/
+
+    public function delete($id){
+        $recipe = Recipes::find($id);
+        $recipe->deleted_at = date('Y-m-d H:i:s');
+        $recipe->save();
+    }
+
+    public function upload_gallery(Request $request){
+
+        $resto_id = CommonMethods::getRestuarantID();
+                $resto = Restaurants::find($resto_id);
+        $files =  $request->file('files');;
+
+        $recipe_id = $request->recipe_id;
+
+
+
+        if(isset($files) && count($files) > 0){
+
+            foreach($files as $file){
+                $photo = new Photos();
+                $extension = $file->getClientOriginalExtension();
+                $original_name = $file->getClientOriginalName();
+                // $original_name = str_replace(' ', '-', $original_name);
+                $extension_array = ['jpg', 'jpeg', 'bmp', 'png'];
+                $image_array = ['jpg', 'jpeg', 'bmp', 'png'];
+                if (in_array($extension, $extension_array)) {
+                    $file_name = 'recipe-gallery-'.$recipe_id. '-' . time().rand(1000,9999) . '.' . $extension;
+
+
+
+                    $destinationPath = public_path('/uploads/resto-gallery/');
+                    $file->move($destinationPath, $file_name);
+                    $file = public_path('uploads/resto-gallery/'.$file_name);
+                     $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$resto->id, $resto->resto_unique_name,$file,$file_name);
+
+                   /* $img = Image::make($destinationPath . '/' . $file_name)->resize(1400, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/' . $file_name);
+
+                    $img = Image::make($destinationPath . '/' . $file_name)->resize(85, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/thumbnails/' . $file_name);
+*/
+                    // dd($request->file('attachment'));
+
+
+                    $photo->recipe_id = $recipe_id;
+                     $photo->file_name = $result['url'];
+                    $photo->aws_cdn = $result['url'];
+                    $photo->photo_type = "gallery";
+                    $photo->resto_id =  $resto->id;;;
+                    $photo->save();
+
+
+                }
+            }
+        }
+    }
+
+    public function show($id){
+        $recipe = Recipes::find($id);
+        $categories = isset($recipe->categories)?$recipe->categories->pluck('category_id'):NULL;
+        if($categories){
+
+            $categories = Categories::whereIn('id',$categories)->pluck('name')->toArray();
+            $categories = implode(', ',$categories);
+
+        }
+        $data = [
+            'recipe' => $recipe,
+            'categories' => $categories
+        ];
+
+        return view('recipes.show',$data);
+    }
+
+    public function remove_main_image(Request $request){
+        $id = $request->id;
+
+        $photo = Photos::where('recipe_id',$id)->where('photo_type','main_image')->first();
+
+        $photo->delete();
+    }
+
+     public function exclude_outlet(Request $request){
+        $is_exclude = $request->is_exclude;
+        $outlet_id = $request->outlet_id;
+        $recipe_id = $request->recipe_id;
+
+        $recipe = Recipes::find($recipe_id);
+
+        $exclude_outlets = $recipe->exclude_outlets;
+
+
+
+
+        if(empty($exclude_outlets)){
+            $o = explode(',',$exclude_outlets);
+            $o[$outlet_id] = $outlet_id;
+         //   dump($o);
+            $recipe->exclude_outlets = $outlet_id;
+        }else{
+            $o = explode(',',$exclude_outlets);
+            if($is_exclude=="true"){
+
+                $key = array_search($outlet_id, $o);
+
+                unset($o[$key]);
+
+            }
+            else
+            $o[] =  $outlet_id;
+            $o = array_unique($o);
+             $recipe->exclude_outlets = implode(',',$o);
+        }
+
+
+        $recipe->save();
+    }
+
+	public function save_faq(Request $request){
+
+		$id = $request->id;
+
+		if(empty($id))
+			$faq = new ProductFAQs();
+		else
+			$faq = ProductFAQs::find($id);
+
+		$faq->product_id = $request->product_id;
+		$faq->question = $request->question;
+		$faq->answer = $request->answer;
+
+		$faq->save();
+
+		$faq_id = $faq->id;
+
+		if($faq_id > 0)
+			echo json_encode(array('type' => 'success', 'message'=>"FAQ's data is saved successfully."));
+		else
+			echo json_encode(array('type' => 'error', 'message'=>"FAQ's data is not saved."));
+	}
+
+	public function delete_faq(Request $request){
+		$faq = ProductFAQs::find($request->id);
+		$faq->deleted_at = date('Y-m-d H:i:s');
+
+		$faq->save();
+	}
+
+	public function delete_color_image(Request $request){
+		$id = $request->id;
+		$c = ClothOptions::find($id);
+		$c->deleted_at = date('Y-m-s H:i:s');
+		$c->save();
+
+	}
+
+    public function update_recipe_orders(Request $request){
+        $id = $request->ids;
+
+
+        foreach($id as $i){
+           $item_category_id = explode('-',$i['id']);
+           $display_order = $i['position'];
+
+           $item_id = $item_category_id[0];
+           $category_id = $item_category_id[1];
+           // dump('itemID: '.$item_id.' CategoryID: '.$category_id.' Order: '.$display_order);
+           $item_category = MapRecipeCategories::where('recipe_id',$item_id)->where('category_id',$category_id)->first();
+           $item_category->display_order = $display_order;
+           $item_category->save();
+
+
+        }
+    }
+
+    public function save_variation_data(Request  $request){
+        $product_id = $request->product_id;
+        $resto_id = CommonMethods::getRestuarantID();
+        $data = $request->all();
+        $variant_type = $request->variant_type;
+        $id = $request->id;
+
+
+
+        $keys = [];
+
+        $variant_id = 0;
+        $i=0;
+        foreach($data as $k=>$d){
+            if(is_array($d)){
+
+                $keys[] = $k;
+
+            }
+        }
+        if(isset($keys[0])){
+        $first_data = ($data[$keys[0]]);
+        //dd($first_data);
+        $i=0;
+        foreach($first_data as $k=>$fd){
+            $rows = null;
+
+            foreach($keys as $key){
+                if(isset($data[$key][$k]) && !empty($data[$key][$k])){
+                if($key=="variant_type")
+                    $variant_id = $data[$key][$k];
+
+                if($key!="image")
+                $rows[$key]=isset($data[$key][$k])?$data[$key][$k]:null;
+                else{
+                    if(isset($data[$key][$k])){
+                        $image = ($data[$key][$k]);
+                        $file_name = "variation-image".'-resto-'.$resto_id.'-'.time();
+                        $extension = $image->getClientOriginalExtension();
+
+                        Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($image));
+
+                        $destinationPath = public_path('/uploads/main_image/');
+
+                        $file = public_path('uploads/main_image/'.$file_name.'.'.$extension);
+                        $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$resto_id, '',$file,$file_name);
+                        $rows[$key]= isset($result) && count($result) > 0 && $result['type']=="success"?$result['url']:"";
+
+
+
+                    }
+                }
+
+
+            }
+
+
+            }
+
+            if(isset($rows['variation_price']) && isset($rows['variation_quantity'])){
+
+                if(empty($id))
+                    $variation_data = new VariationData();
+                else
+                    $variation_data = VariationData::find($id);
+
+
+                $variation_data->variation_ids = json_encode($variant_type);
+                $variation_data->resto_id = $resto_id;
+                $variation_data->product_id = $product_id;
+                $variation_data->variations = json_encode($rows);
+
+                $variation_data->save();
+
+                $i++;
+            }
+
+
+        }
+        if($i>0)
+            return response()->json(array('type'=>'success','message'=>$i.' variants are saved with this item'));
+    }
+        return response()->json(array('type'=>'error','message'=>'No variants is saved with this item'));
+        ;
+
+    }
+
+    public function delete_variation($id){
+        $variation = VariationData::find($id)->update(['deleted_at'=>Carbon::now()->format('Y-m-d H:i:s')]);
+
+    }
+
+    public function getVaraitionDataBasedOnID($id){
+        $variation = VariationData::find($id);
+        $variation_type = json_decode($variation->variation_ids);
+        $variations = json_decode($variation->variations);
+
+        return response()->json(array('variation_type'=>$variation_type,'variations'=>$variations));
+    }
+
+
+}

+ 430 - 0
app/Http/Controllers/Recipe.php_1

@@ -0,0 +1,430 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Categories;
+use App\MapRecipeCategories;
+use App\Photos;
+use App\Recipes;
+use App\Restaurants;
+use Brian2694\Toastr\Facades\Toastr;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Storage;
+use Ramsey\Uuid\Uuid;
+use App\ClothOptions;
+use Str;
+use File;
+use Illuminate\Support\Facades\Hash;
+use Image;
+
+use App\Helpers\CommonMethods;
+
+class Recipe extends Controller
+{
+    public function inventory(){
+         $recipes = Auth::user()->restaurants->recipes();;
+         $data = [
+            'recipes' => $recipes->get()
+        ];
+        return view('recipes.inventory',$data);
+    }
+
+
+    //
+    public function recipes(){
+        Toastr::success('Post added successfully :)','Success');
+        $recipes = Auth::user()->restaurants->recipes;
+        $data = [
+            'recipes' => $recipes
+        ];
+        return view('recipes.recipes',$data);
+    }
+
+    public function new_recipe(){
+        if( Auth::user()->role=="restaurant")
+            $categories = Categories::whereNull('deleted_at')->where('is_active',1)->whereIn('resto_id',[0,Auth::user()->restaurants->id])->get();
+        else
+            $categories = Categories::where('is_active',1)->whereNull('deleted_at')->get();
+
+        $data = [
+         'categories' => $categories
+     ];
+        return view('recipes.recipe_form',$data);
+    }
+
+    public function edit($id){
+        if( Auth::user()->role=="restaurant")
+            $categories = Categories::whereNull('deleted_at')->where('is_active',1)->whereIn('resto_id',[0,Auth::user()->restaurants->id])->get();
+        else
+            $categories = Categories::where('is_active',1)->whereNull('deleted_at')->get();
+
+        $recipe = Recipes::find($id);
+        $data = [
+            'categories' => $categories,
+            'recipe' =>$recipe
+        ];
+        return view('recipes.recipe_form',$data);
+    }
+
+ public function save(Request $request){
+        $id = $request->id;
+
+        if(empty($id)){
+            $recipe = new Recipes();
+            $recipe->unique_shared_key = Str::uuid(); 
+        }
+
+        else
+            $recipe = Recipes::find($id);
+
+        $recipe->name = $request->name;
+        $recipe->arabic_name = $request->arabic_name;
+        $recipe->status = '1';
+
+
+        $recipe->resto_id = Auth::user()->restaurants->id;
+        $recipe->price = $request->price;
+        $recipe->show_recipe_main_price = isset($request->show_recipe_main_price)?1:0;
+        $recipe->short_description = $request->short_description;
+        $recipe->is_customized = isset($request->is_customized)?1:0;
+        $recipe->status = isset($request->status)?1:0;
+
+
+        $recipe->save();
+
+        $recipe_id = $recipe->id;
+
+        if($recipe_id > 0){
+
+            $categories = $request->category;
+            //dd($categories);
+            MapRecipeCategories::where('recipe_id',$recipe_id)->delete();
+
+            if(count($categories) > 0){
+                foreach($categories as $category){
+                    $m_c = new MapRecipeCategories();
+                    $m_c->category_id = $category;
+                    $m_c->recipe_id =  $recipe_id;
+                    $m_c->resto_id =   Auth::user()->restaurants->id;;
+                    $m_c->save();
+                }
+
+
+            }
+
+
+            if($request->hasFile('main_image')){
+                $logo = $request->file('main_image');
+
+
+
+                $file_name = Str::slug($request->name)."-main_image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+                $destinationPath = public_path('/uploads/main_image/');
+
+
+                /*$img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });*/
+
+               // $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+                $file = public_path('uploads/main_image/'.$file_name.'.'.$extension);
+                $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',Auth::user()->restaurants->id, Auth::user()->restaurants->resto_unique_name,$file,$file_name);
+/*
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(200, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+
+
+                $main_image = Photos::where('recipe_id',$recipe_id)->where('photo_type','main_image')->first();
+                if(!$main_image)
+                    $main_image = new Photos();
+
+
+                $main_image->file_name = $result['url'];
+                $main_image->aws_cdn = $result['url'];
+                $main_image->recipe_id = $recipe_id;
+                $main_image->photo_type = 'main_image';
+                $main_image->resto_id =  Auth::user()->restaurants->id;;;
+
+                $main_image->save();
+
+                //$resto->text =
+            }
+        if($request->business_type=="ClothsStore"){
+
+                $option = ClothOptions::where('resto_id',Auth::user()->restaurants->id)->where('product_id',$recipe_id)->delete();
+                $colors  = !empty($request->color)?$request->color:NULL;
+                $sizes   = !empty($request->size)?$request->size:NULL; 
+
+                if(isset($colors) && count($colors) > 0){
+                    foreach($colors as $color){
+                      $options = new ClothOptions(); 
+                      $options->resto_id =  Auth::user()->restaurants->id;
+                      $options->product_id = $recipe_id;
+                      $options->name = $color;
+                      $options->type="color";
+
+                      $options->save();
+                    }
+                    
+
+
+
+                }
+
+                if(isset($sizes) && count($sizes) > 0){
+                    foreach($sizes as $size){
+                      $options = new ClothOptions(); 
+                      $options->resto_id =  Auth::user()->restaurants->id;
+                      $options->product_id = $recipe_id;
+                      $options->name = $size;
+                      $options->type="size";
+
+                      $options->save();
+                    }
+                    
+
+
+
+                }
+            }
+
+            echo json_encode(array('type' => 'success', 'message'=>"Recipe's data is saved successfully."));
+        }
+
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Recipe's data is not saved successfully."));
+
+
+
+    }
+   /* public function save(Request $request){
+        $id = $request->id;
+
+        if(empty($id)){
+            $recipe = new Recipes();
+            $recipe->unique_shared_key = Str::uuid();
+        }
+
+        else
+            $recipe = Recipes::find($id);
+
+        $recipe->name = $request->name;
+        $recipe->status = '1';
+
+
+        $recipe->resto_id = Auth::user()->restaurants->id;
+        $recipe->price = $request->price;
+        $recipe->short_description = $request->short_description;
+        $recipe->is_customized = isset($request->is_customized)?1:0;
+        $recipe->status = isset($request->status)?1:0;
+
+
+        $recipe->save();
+
+        $recipe_id = $recipe->id;
+
+        if($recipe_id > 0){
+
+            $categories = $request->category;
+            //dd($categories);
+            MapRecipeCategories::where('recipe_id',$recipe_id)->delete();
+
+            if(count($categories) > 0){
+                foreach($categories as $category){
+                    $m_c = new MapRecipeCategories();
+                    $m_c->category_id = $category;
+                    $m_c->recipe_id =  $recipe_id;
+                    $m_c->resto_id =   Auth::user()->restaurants->id;;
+                    $m_c->save();
+                }
+
+
+            }
+
+
+            if($request->hasFile('main_image')){
+                $logo = $request->file('main_image');
+
+
+
+                $file_name = Str::slug($request->name)."-main_image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+                $destinationPath = public_path('/uploads/main_image/');
+
+
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(200, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);
+
+
+                $main_image = Photos::where('recipe_id',$recipe_id)->where('photo_type','main_image')->first();
+                if(!$main_image)
+                    $main_image = new Photos();
+
+
+                $main_image->file_name = $file_name.'.'.$extension;
+                $main_image->recipe_id = $recipe_id;
+                $main_image->photo_type = 'main_image';
+                $main_image->resto_id =  Auth::user()->restaurants->id;;;
+
+                $main_image->save();
+
+                //$resto->text =
+            }
+
+
+            echo json_encode(array('type' => 'success', 'message'=>"Recipe's data is saved successfully."));
+        }
+
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Recipe's data is not saved successfully."));
+
+
+
+    }*/
+
+    public function delete($id){
+        $recipe = Recipes::find($id);
+        $recipe->deleted_at = date('Y-m-d H:i:s');
+        $recipe->save();
+    }
+
+    public function upload_gallery(Request $request){
+        $files =  $request->file('files');;
+
+        $recipe_id = $request->recipe_id;
+
+
+
+        if(isset($files) && count($files) > 0){
+
+            foreach($files as $file){
+                $photo = new Photos();
+                $extension = $file->getClientOriginalExtension();
+                $original_name = $file->getClientOriginalName();
+                // $original_name = str_replace(' ', '-', $original_name);
+                $extension_array = ['jpg', 'jpeg', 'bmp', 'png'];
+                $image_array = ['jpg', 'jpeg', 'bmp', 'png'];
+                if (in_array($extension, $extension_array)) {
+                    $file_name = 'recipe-gallery-'.$recipe_id. '-' . time().rand(1000,9999) . '.' . $extension;
+
+
+
+                    $destinationPath = public_path('/uploads/resto-gallery/');
+                    $file->move($destinationPath, $file_name);
+                    $file = public_path('uploads/resto-gallery/'.$file_name);
+                     $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',Auth::user()->restaurants->id, Auth::user()->restaurants->resto_unique_name,$file,$file_name);
+
+                   /* $img = Image::make($destinationPath . '/' . $file_name)->resize(1400, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/' . $file_name);
+
+                    $img = Image::make($destinationPath . '/' . $file_name)->resize(85, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/thumbnails/' . $file_name);
+*/
+                    // dd($request->file('attachment'));
+
+
+                    $photo->recipe_id = $recipe_id;
+                     $photo->file_name = $result['url'];
+                    $photo->aws_cdn = $result['url'];
+                    $photo->photo_type = "gallery";
+                    $photo->resto_id =  Auth::user()->restaurants->id;;;
+                    $photo->save();
+
+
+                }
+            }
+        }
+    }
+
+    public function show($id){
+        $recipe = Recipes::find($id);
+        $categories = isset($recipe->categories)?$recipe->categories->pluck('category_id'):NULL;
+        if($categories){
+
+            $categories = Categories::whereIn('id',$categories)->pluck('name')->toArray();
+            $categories = implode(', ',$categories);
+
+        }
+        $data = [
+            'recipe' => $recipe,
+            'categories' => $categories
+        ];
+
+        return view('recipes.show',$data);
+    }
+
+    public function remove_main_image(Request $request){
+        $id = $request->id;
+
+        $photo = Photos::where('recipe_id',$id)->where('photo_type','main_image')->first();
+
+        $photo->delete();
+    }
+
+     public function exclude_outlet(Request $request){
+        $is_exclude = $request->is_exclude;
+        $outlet_id = $request->outlet_id;
+        $recipe_id = $request->recipe_id;
+
+        $recipe = Recipes::find($recipe_id);
+
+        $exclude_outlets = $recipe->exclude_outlets;
+       
+
+
+
+        if(empty($exclude_outlets)){
+            $o = explode(',',$exclude_outlets);
+            $o[$outlet_id] = $outlet_id;
+         //   dump($o);
+            $recipe->exclude_outlets = $outlet_id;
+        }else{
+            $o = explode(',',$exclude_outlets);
+            if($is_exclude=="true"){
+               
+                $key = array_search($outlet_id, $o);
+
+                unset($o[$key]);
+                
+            }
+            else
+            $o[] =  $outlet_id;
+            $o = array_unique($o);
+             $recipe->exclude_outlets = implode(',',$o);
+        }
+      
+
+        $recipe->save();
+    }
+}

+ 481 - 0
app/Http/Controllers/Recipe.php_bk

@@ -0,0 +1,481 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Categories;
+use App\MapRecipeCategories;
+use App\Photos;
+use App\Recipes;
+use App\Restaurants;
+use Brian2694\Toastr\Facades\Toastr;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Storage;
+use Ramsey\Uuid\Uuid;
+use App\ClothOptions;
+use Str;
+use File;
+use Illuminate\Support\Facades\Hash;
+use Image;
+use App\ProductFAQs;
+
+use App\Helpers\CommonMethods;
+
+class Recipe extends Controller
+{
+    public function inventory(){
+              $resto_id = CommonMethods::getRestuarantID();
+                $resto = Restaurants::find($resto_id);
+         $recipes = $resto->recipes();;
+         $data = [
+            'recipes' => $recipes->get()
+        ];
+        return view('recipes.inventory',$data);
+    }
+
+
+    //
+    public function recipes(){
+        Toastr::success('Post added successfully :)','Success');
+        $resto_id = CommonMethods::getRestuarantID();
+                $resto = Restaurants::find($resto_id);
+         $recipes = $resto->recipes();;
+
+        $data = [
+            'recipes' => $recipes->get()
+        ];
+        return view('recipes.recipes',$data);
+    }
+
+    public function new_recipe(){
+        $resto_id = CommonMethods::getRestuarantID();
+        
+            $categories = Categories::whereNull('deleted_at')->where('is_active',1)->whereIn('resto_id',[$resto_id])->get();
+        
+
+        $data = [
+         'categories' => $categories
+     ];
+        return view('recipes.recipe_form',$data);
+    }
+
+    public function edit($id){
+        $resto_id = CommonMethods::getRestuarantID();
+          
+            $categories = Categories::whereNull('deleted_at')->where('is_active',1)->whereIn('resto_id',[$resto_id])->get();
+      
+        $recipe = Recipes::find($id);
+        $data = [
+            'categories' => $categories,
+            'recipe' =>$recipe
+        ];
+        return view('recipes.recipe_form',$data);
+    }
+
+ public function save(Request $request){
+    $resto_id = CommonMethods::getRestuarantID();
+                $resto = Restaurants::find($resto_id);
+      
+       
+        $id = $request->id;
+
+        if(empty($id)){
+            $recipe = new Recipes();
+            $recipe->unique_shared_key = Str::uuid(); 
+        }
+
+        else
+            $recipe = Recipes::find($id);
+
+        $recipe->name = $request->name;
+        $recipe->arabic_name = $request->arabic_name;
+        $recipe->status = '1';
+
+
+        $recipe->resto_id = $resto_id;
+        $recipe->price = $request->price;
+        $recipe->show_recipe_main_price = isset($request->show_recipe_main_price)?1:0;
+        $recipe->short_description = $request->short_description;
+	 	$recipe->short_description_arabic = $request->short_description_arabic;
+        $recipe->is_customized = isset($request->is_customized)?1:0;
+        $recipe->status = isset($request->status)?1:0;
+
+
+        $recipe->save();
+
+        $recipe_id = $recipe->id;
+
+        if($recipe_id > 0){
+
+            $categories = $request->category;
+            //dd($categories);
+            MapRecipeCategories::where('recipe_id',$recipe_id)->delete();
+
+            if(count($categories) > 0){
+                foreach($categories as $category){
+                    $m_c = new MapRecipeCategories();
+                    $m_c->category_id = $category;
+                    $m_c->recipe_id =  $recipe_id;
+                    $m_c->resto_id =   $resto_id;;
+                    $m_c->save();
+                }
+
+
+            }
+
+
+            if($request->hasFile('main_image')){
+                $logo = $request->file('main_image');
+
+
+
+                $file_name = Str::slug($request->name)."-main_image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+                $destinationPath = public_path('/uploads/main_image/');
+
+
+                /*$img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });*/
+
+               // $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+                $file = public_path('uploads/main_image/'.$file_name.'.'.$extension);
+                $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$resto_id, $resto->resto_unique_name,$file,$file_name);
+/*
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(200, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+
+
+                $main_image = Photos::where('recipe_id',$recipe_id)->where('photo_type','main_image')->first();
+                if(!$main_image)
+                    $main_image = new Photos();
+
+
+                $main_image->file_name = $result['url'];
+                $main_image->aws_cdn = $result['url'];
+                $main_image->recipe_id = $recipe_id;
+                $main_image->photo_type = 'main_image';
+                $main_image->resto_id =  $resto_id;;;
+
+                $main_image->save();
+                 File::delete(  $file);
+
+                //$resto->text =
+            }
+        if($request->business_type=="ClothsStore"){
+			$color_image = ($request->color_image);
+
+                $option = ClothOptions::where('resto_id',$resto_id)->where('product_id',$recipe_id)->delete();
+                $colors  = !empty($request->color)?$request->color:NULL;
+                $sizes   = !empty($request->size)?$request->size:NULL; 
+
+                if(isset($colors) && count($colors) > 0){
+					
+                    foreach($colors as $color){
+						
+						if(isset($color_image[$color])){
+							dump('found');
+						}
+						
+                      $options = new ClothOptions(); 
+                      $options->resto_id =  $resto_id;
+                      $options->product_id = $recipe_id;
+                      $options->name = $color;
+                      $options->type="color";
+
+                      $options->save();
+                    }
+                    
+
+
+
+                }
+
+                if(isset($sizes) && count($sizes) > 0){
+                    foreach($sizes as $size){
+                      $options = new ClothOptions(); 
+                      $options->resto_id =  $resto_id;
+                      $options->product_id = $recipe_id;
+                      $options->name = $size;
+                      $options->type="size";
+
+                      $options->save();
+                    }
+                    
+
+
+
+                }
+            }
+
+            echo json_encode(array('type' => 'success', 'message'=>"Item is saved successfully."));
+        }
+
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Item is not saved successfully."));
+
+
+
+    }
+   /* public function save(Request $request){
+        $id = $request->id;
+
+        if(empty($id)){
+            $recipe = new Recipes();
+            $recipe->unique_shared_key = Str::uuid();
+        }
+
+        else
+            $recipe = Recipes::find($id);
+
+        $recipe->name = $request->name;
+        $recipe->status = '1';
+
+
+        $recipe->resto_id = Auth::user()->restaurants->id;
+        $recipe->price = $request->price;
+        $recipe->short_description = $request->short_description;
+        $recipe->is_customized = isset($request->is_customized)?1:0;
+        $recipe->status = isset($request->status)?1:0;
+
+
+        $recipe->save();
+
+        $recipe_id = $recipe->id;
+
+        if($recipe_id > 0){
+
+            $categories = $request->category;
+            //dd($categories);
+            MapRecipeCategories::where('recipe_id',$recipe_id)->delete();
+
+            if(count($categories) > 0){
+                foreach($categories as $category){
+                    $m_c = new MapRecipeCategories();
+                    $m_c->category_id = $category;
+                    $m_c->recipe_id =  $recipe_id;
+                    $m_c->resto_id =   Auth::user()->restaurants->id;;
+                    $m_c->save();
+                }
+
+
+            }
+
+
+            if($request->hasFile('main_image')){
+                $logo = $request->file('main_image');
+
+
+
+                $file_name = Str::slug($request->name)."-main_image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('main_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+                $destinationPath = public_path('/uploads/main_image/');
+
+
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(200, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);
+
+
+                $main_image = Photos::where('recipe_id',$recipe_id)->where('photo_type','main_image')->first();
+                if(!$main_image)
+                    $main_image = new Photos();
+
+
+                $main_image->file_name = $file_name.'.'.$extension;
+                $main_image->recipe_id = $recipe_id;
+                $main_image->photo_type = 'main_image';
+                $main_image->resto_id =  Auth::user()->restaurants->id;;;
+
+                $main_image->save();
+
+                //$resto->text =
+            }
+
+
+            echo json_encode(array('type' => 'success', 'message'=>"Recipe's data is saved successfully."));
+        }
+
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Recipe's data is not saved successfully."));
+
+
+
+    }*/
+
+    public function delete($id){
+        $recipe = Recipes::find($id);
+        $recipe->deleted_at = date('Y-m-d H:i:s');
+        $recipe->save();
+    }
+
+    public function upload_gallery(Request $request){
+
+        $resto_id = CommonMethods::getRestuarantID();
+                $resto = Restaurants::find($resto_id);
+        $files =  $request->file('files');;
+
+        $recipe_id = $request->recipe_id;
+
+
+
+        if(isset($files) && count($files) > 0){
+
+            foreach($files as $file){
+                $photo = new Photos();
+                $extension = $file->getClientOriginalExtension();
+                $original_name = $file->getClientOriginalName();
+                // $original_name = str_replace(' ', '-', $original_name);
+                $extension_array = ['jpg', 'jpeg', 'bmp', 'png'];
+                $image_array = ['jpg', 'jpeg', 'bmp', 'png'];
+                if (in_array($extension, $extension_array)) {
+                    $file_name = 'recipe-gallery-'.$recipe_id. '-' . time().rand(1000,9999) . '.' . $extension;
+
+
+
+                    $destinationPath = public_path('/uploads/resto-gallery/');
+                    $file->move($destinationPath, $file_name);
+                    $file = public_path('uploads/resto-gallery/'.$file_name);
+                     $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$resto->id, $resto->resto_unique_name,$file,$file_name);
+
+                   /* $img = Image::make($destinationPath . '/' . $file_name)->resize(1400, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/' . $file_name);
+
+                    $img = Image::make($destinationPath . '/' . $file_name)->resize(85, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/thumbnails/' . $file_name);
+*/
+                    // dd($request->file('attachment'));
+
+
+                    $photo->recipe_id = $recipe_id;
+                     $photo->file_name = $result['url'];
+                    $photo->aws_cdn = $result['url'];
+                    $photo->photo_type = "gallery";
+                    $photo->resto_id =  $resto->id;;;
+                    $photo->save();
+
+
+                }
+            }
+        }
+    }
+
+    public function show($id){
+        $recipe = Recipes::find($id);
+        $categories = isset($recipe->categories)?$recipe->categories->pluck('category_id'):NULL;
+        if($categories){
+
+            $categories = Categories::whereIn('id',$categories)->pluck('name')->toArray();
+            $categories = implode(', ',$categories);
+
+        }
+        $data = [
+            'recipe' => $recipe,
+            'categories' => $categories
+        ];
+
+        return view('recipes.show',$data);
+    }
+
+    public function remove_main_image(Request $request){
+        $id = $request->id;
+
+        $photo = Photos::where('recipe_id',$id)->where('photo_type','main_image')->first();
+
+        $photo->delete();
+    }
+
+     public function exclude_outlet(Request $request){
+        $is_exclude = $request->is_exclude;
+        $outlet_id = $request->outlet_id;
+        $recipe_id = $request->recipe_id;
+
+        $recipe = Recipes::find($recipe_id);
+
+        $exclude_outlets = $recipe->exclude_outlets;
+       
+
+
+
+        if(empty($exclude_outlets)){
+            $o = explode(',',$exclude_outlets);
+            $o[$outlet_id] = $outlet_id;
+         //   dump($o);
+            $recipe->exclude_outlets = $outlet_id;
+        }else{
+            $o = explode(',',$exclude_outlets);
+            if($is_exclude=="true"){
+               
+                $key = array_search($outlet_id, $o);
+
+                unset($o[$key]);
+                
+            }
+            else
+            $o[] =  $outlet_id;
+            $o = array_unique($o);
+             $recipe->exclude_outlets = implode(',',$o);
+        }
+      
+
+        $recipe->save();
+    }
+	
+	public function save_faq(Request $request){
+		
+		$id = $request->id;
+		
+		if(empty($id))
+			$faq = new ProductFAQs();
+		else
+			$faq = ProductFAQs::find($id);
+		
+		$faq->product_id = $request->product_id;
+		$faq->question = $request->question;
+		$faq->answer = $request->answer;
+		
+		$faq->save();
+		
+		$faq_id = $faq->id;
+		
+		if($faq_id > 0)
+			echo json_encode(array('type' => 'success', 'message'=>"FAQ's data is saved successfully."));
+		else
+			echo json_encode(array('type' => 'error', 'message'=>"FAQ's data is not saved."));
+	}
+	
+	public function delete_faq(Request $request){
+		$faq = ProductFAQs::find($request->id);
+		$faq->deleted_at = date('Y-m-d H:i:s');
+		
+		$faq->save();
+	}
+}

+ 526 - 0
app/Http/Controllers/Restaurant.php

@@ -0,0 +1,526 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Categories;
+use App\Models\Cities;
+use App\Models\RestoMetaDefs;
+use App\Models\RestoMetas;
+use App\Helpers\CommonMethods;
+use App\Models\OrderNotifications;
+use App\Models\Photos;
+use App\Models\Restaurants;
+use Brian2694\Toastr\Facades\Toastr;
+use Illuminate\Http\Request;
+use App\Models\User;
+use App\Models\TimeZones;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cookie;
+use Illuminate\Support\Facades\Hash;
+use Str;
+use Illuminate\Support\Facades\Storage;
+use File;
+use Image;
+use Validator;
+use Redis;
+class Restaurant extends Controller
+{
+    //
+
+    public function restaurants(){
+
+        $restaurants = Restaurants::whereNull('deleted_at')->get();
+
+        $data = [
+            'restaurants'=>$restaurants
+        ];
+        return view('restaurants.restaurants',$data);
+    }
+
+    public function new_restaurant(){
+        $cities = Cities::where('is_active',1)->get();
+        $timezones = TimeZones::all();
+        $data = [
+            'cities' => $cities,
+            'time_zones' => $timezones
+        ];
+        return view('restaurants.restaurant_form',$data);
+    }
+
+    public function save(Request $request){
+        $n = isset($request->allow_email_notifications)?"Yes":"No";
+
+
+        $id = $request->id;
+
+        if(empty($id)){
+            $resto = new Restaurants();
+            $user = new User();
+
+             $data = [
+                'resto_unique_name' => \Illuminate\Support\Str::slug($request->name)
+            ];
+
+            $validator = Validator::make($data, [
+                'resto_unique_name' => 'unique:restaurants'
+            ]);
+            if ($validator->fails()) {
+
+                $error = $validator->errors()->all();
+                $error[0] = "Business name already taken, try with different name";
+                echo json_encode(array('type' => 'error', 'message' => $error));
+                exit;
+            }
+
+            $user->name = $request->name;
+            $user->username = CommonMethods::generate_user_name($request->name);
+            $user->password = Hash::make('12345678');
+            if(!empty($request->email))
+            $user->email = $request->email;
+            $user->is_active = 1;
+            $user->role='restaurant';
+           $user->save();
+
+            $resto->unique_shared_key = Hash::make(Str::slug($request->name));
+
+            $resto->unique_shared_key =Str::uuid();;
+            $resto->user_id = $user->id;
+        }
+
+        else{
+            $cookie = Cookie::forget('resto_metas');
+            Cookie::queue(
+                Cookie::forget('resto_metas')
+            );
+            $resto = Restaurants::find($id);
+        }
+
+
+        if(Auth::User()->role=="administrator"){
+            if(!isset($request->active) && !empty($id)){
+                $u = User::find($resto->user_id);
+                $u->is_active = 0;
+                $u->save();
+            }else{
+                if($resto->users->is_active==0){
+                    $u = User::find($resto->user_id);
+                    $u->is_active = 1;
+                    $u->save();
+                }
+            }
+        }
+        if(empty($id)) {
+            $resto->resto_unique_name = \Illuminate\Support\Str::slug($request->name);
+        }
+
+        $resto->name = $request->name;
+        $resto->whatsapp_numbers = $request->whatsapp_numbers;
+        $resto->arabic_name = $request->arabic_name;
+         if(Auth::User()->role=="restaurant") {
+        $resto->short_description = $request->short_description;
+        $resto->description = $request->description;
+        $resto->address = $request->address;
+        $resto->detail_address = $request->detail_address;
+        $resto->default_color = $request->default_color;
+        $resto->whatsapp_number_notification = $request->whatsapp_number_notification;
+
+             $resto->sp_phone_number = $request->sp_phone_number;
+             $resto->sp_whatsapp_number = $request->sp_whatsapp_number;
+             $resto->social_insta = $request->social_insta;
+             $resto->social_fb = $request->social_fb;
+             $resto->social_tiktok = $request->social_tiktok;
+             $resto->social_geo_location = $request->social_geo_location;
+             $resto->social_site = $request->social_site;
+
+
+        $resto->notification_email = $request->notification_email;
+
+        $resto->time_zone = $request->time_zone;
+        $resto->phone_number = $request->phone_number;
+        }
+
+        $resto->opening_timing = $request->opening_timing;
+        $resto->closing_timing = $request->closing_timing;
+        $resto->delivery_time_range = $request->delivery_time_range;
+        $resto->min_basket_price = $request->min_basket_price;
+        if(Auth::User()->role=="administrator") {
+            $resto->outlet_countries = !empty($request->outlet_countries)?implode(',',$request->outlet_countries):NULL;
+        $resto->city = $request->city;
+		$resto->default_lang = $request->default_lang;
+		$resto->domain_name = $request->domain_name;
+
+
+        $resto->country_id = $request->country_id;
+         $resto->active = isset($request->active)?1:0;
+         $resto->allow_whatsapp_notifications = isset($request->allow_whatsapp_notifications)?1:0;
+            $resto->allow_email_notifications = isset($request->allow_email_notifications)?"Yes":"No";;
+            $resto->allow_whatsapp_notifications_to_customera = isset($request->allow_whatsapp_notifications_to_customera)?"Yes":"No";;
+      }
+		if(isset($request->multiple_langs) && count($request->multiple_langs) > 0)
+		$resto->multiple_langs = isset($request->multiple_langs) && count($request->multiple_langs) > 0?implode(',',$request->multiple_langs):NULL;//;$request->multiple_langs;
+        $resto->latitude = $request->latitude;
+        $resto->longitude = $request->longitude;
+
+        $resto->has_order = isset($request->has_order)?1:0;
+        $resto->has_desserts = isset($request->has_desserts)?1:0;
+
+        $resto->save();
+
+        $id = $resto->id;
+        if($id > 0){
+
+                if($request->hasFile('logo')){
+                    $logo = $request->file('logo');
+
+//                    $validator = Validator::make($request->all(), [
+//                        'logo' => 'mimes:jpeg,jpg, JPG, JPEG |max:2048',
+//                    ]);
+//                    if ($validator->fails()) {
+//
+//                        $error = $validator->errors()->all();
+//                       // $error[0] = "Business name already taken, try with different name";
+//                        echo json_encode(array('type' => 'error', 'message' => $error));
+//                        exit;
+//                    }
+
+
+
+
+
+                    $file_name = Str::slug($request->name)."-logo".'-'.time();
+                    $extension = $logo->getClientOriginalExtension();
+
+
+                    $allow_extensions = ['jpg','jpeg'];
+
+
+
+                    if(!in_array(strtolower($extension),$allow_extensions)){
+                        echo json_encode(array('type' => 'error', 'message' => "Only jpg, jpeg extensions are allowed."));
+                        exit;
+                    }
+
+
+                    Storage::disk('logo')->put($file_name.'.'.$extension,  File::get($logo));
+
+                    $destinationPath = public_path('/uploads/logo/');
+
+
+                    $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                   /* $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(85, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+                    $file = public_path('/uploads/logo/'.$file_name.'.'.$extension);
+                    $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$id, \Illuminate\Support\Str::slug($request->name),$file,$file_name);
+
+
+
+                    $logo = Photos::where('resto_id',$id)->where('photo_type','logo')->first();
+                    if(!$logo)
+                    $logo = new Photos();
+
+
+                    //$logo->file_name = $file_name.'.'.$extension;
+                    //$logo->resto_id = $id;
+                   // $logo->photo_type = 'logo';
+
+                   //
+
+                 $logo->file_name = $result['url'];
+                $logo->aws_cdn = $result['url'];
+                $logo->resto_id = $id;
+                $logo->photo_type = 'logo';
+                $logo->save();
+
+                    //$resto->text =
+                }
+
+            if($request->hasFile('pwa_logo')){
+                $pwalogo = $request->file('pwa_logo');
+
+                    $validator = Validator::make($request->all(), [
+                        'pwa_logo' => 'max:20',
+                    ]);
+                    if ($validator->fails()) {
+
+                        $error = $validator->errors()->all();
+                       // $error[0] = "Business name already taken, try with different name";
+                        echo json_encode(array('type' => 'error', 'message' => $error));
+                        exit;
+                    }
+
+
+
+
+
+                $file_name = Str::slug($request->name)."-pwalogo".'-'.time();
+                $extension = $pwalogo->getClientOriginalExtension();
+
+
+                $allow_extensions = ['jpg','jpeg','png'];
+
+
+
+                if(!in_array(strtolower($extension),$allow_extensions)){
+                    echo json_encode(array('type' => 'error', 'message' => "Only jpg, jpeg and png extensions are allowed."));
+                    exit;
+                }
+
+
+                Storage::disk('logo')->put($file_name.'.'.$extension,  File::get($pwalogo));
+
+                $destinationPath = public_path('/uploads/logo/');
+
+
+                $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(1400, null, function ($constraint) {
+                    $constraint->aspectRatio();
+                });
+
+                $img->save($destinationPath . '/' . $file_name.'.'.$extension);
+
+                /* $img = Image::make($destinationPath . '/' . $file_name.'.'.$extension)->resize(85, null, function ($constraint) {
+                     $constraint->aspectRatio();
+                 });
+
+                 $img->save($destinationPath . '/thumbnails/' . $file_name.'.'.$extension);*/
+
+                $file = public_path('/uploads/logo/'.$file_name.'.'.$extension);
+                $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$id, \Illuminate\Support\Str::slug($request->name),$file,$file_name);
+
+
+
+                $logo = Photos::where('resto_id',$id)->where('photo_type','logo-pwa')->first();
+                if(!$logo)
+                    $logo = new Photos();
+
+
+                //$logo->file_name = $file_name.'.'.$extension;
+                //$logo->resto_id = $id;
+                // $logo->photo_type = 'logo';
+
+                //
+
+                $logo->file_name = $result['url'];
+                $logo->aws_cdn = $result['url'];
+                $logo->resto_id = $id;
+                $logo->photo_type = 'logo-pwa';
+                $logo->save();
+
+                //$resto->text =
+            }
+
+            if($request->hasFile('home_image')){
+                $logo = $request->file('home_image');
+
+
+
+                $file_name = Str::slug($request->name)."-home-image".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                $r = Storage::disk('home_image')->put($file_name.'.'.$extension,  File::get($logo));
+
+
+                $file = public_path('uploads/home_image/'.$file_name.'.'.$extension);
+                  $result = CommonMethods::uploadFileToAWSCDN('meemapp-order',$id, \Illuminate\Support\Str::slug($request->name),$file,$file_name);
+
+                $logo = Photos::where('resto_id',$id)->where('photo_type','home_image')->first();
+                if(!$logo)
+                    $logo = new Photos();
+
+
+                $logo->file_name = $result['url'];
+                $logo->aws_cdn = $result['url'];
+                $logo->resto_id = $id;
+                $logo->photo_type = 'home_image';
+
+                $logo->save();
+                 File::delete(  $file);
+
+                //$resto->text =
+            }
+
+                    $resto_metas = isset($request->resto_meta) && count($request->resto_meta) > 0?$request->resto_meta:[];
+                  //  dump($resto_metas);
+                    $resto_meta_value = isset($request->resto_meta_value) && count($request->resto_meta_value) > 0?$request->resto_meta_value:[];
+			//dump($resto_metas);
+
+                    if(count($resto_metas) >  0){
+                        RestoMetas::where('bussiness_id',$resto->id)->where('for_role',Auth::user()->role)->delete();
+                        foreach($resto_metas as $meta){
+                            $rm = RestoMetaDefs::find($meta);
+
+                            if(isset($rm)){
+                                $r = new RestoMetas();
+                                $r->meta_def_id = $meta;
+                                $r->bussiness_id = $resto->id;
+                                $r->meta_val = isset($resto_meta_value[$meta])?$resto_meta_value[$meta]:$rm->meta_def_name;
+                                 $r->for_role = Auth::user()->role;
+                                $r->status = 1;
+
+                                $r->save();
+                            }
+
+                        }
+                    }
+
+
+
+//             $keys = Redis::keys('*');
+//
+//           /*  $key_id =
+//        dump(Auth::id().': '.Redis::get(str_replace('meem_orders_','',"resto_pakistan_".Auth::id()))); */
+//            foreach($keys as $k){
+//                //
+//
+//                if(str_contains($k,"_".Auth::id())){
+//
+//                   Redis::del(str_replace('prod_meem_orders_','',$k));
+//                }
+//
+//                //dump($k.': '.Redis::get(str_replace('meem_orders_','',$k)));
+//            }
+          //dump($req_method);
+
+
+            echo json_encode(array('type' => 'success', 'message'=>"Restaurant's data is saved successfully."));
+            exit;
+        }else{
+            echo json_encode(array('type' => 'error', 'message'=>"Restaurant's data is not saved, check info again."));
+        }
+
+
+
+
+    }
+
+    public function show($id){
+        $id = CommonMethods::decrypt($id);
+        $restaurant = Restaurants::find($id);
+        $data = [
+            'restaurant' => $restaurant
+            ];
+        return view('restaurants.show',$data);
+    }
+
+    public function edit($id){
+        $id = CommonMethods::decrypt($id);
+        $restaurant = Restaurants::find($id);
+        $cities = Cities::where('is_active',1)->get();
+         $timezones = TimeZones::all();
+       // dd($timezones);
+        $data = [
+            'restaurant' => $restaurant,
+            'cities' => $cities,
+            'time_zones' => $timezones
+        ];
+
+
+		if(Auth::User()->role=="administrator"){
+        	return view('restaurants.restaurant_form',$data);
+		}else{
+            $cookie = Cookie::forget('resto_metas');
+            Cookie::queue(
+                Cookie::forget('resto_metas')
+            );
+			return view('restaurants.restaurant_form_marchent',$data);
+		}
+    }
+
+    public function delete($id){
+        //$id = CommonMethods::decrypt($id);
+        $restaurant = Restaurants::find($id);
+        $restaurant->deleted_at = date('Y-m-d H:i:s');
+         $u = User::find($restaurant->user_id);
+        $u->is_active = 0;
+        $u->save();
+        $restaurant->save();
+
+
+    }
+
+    public function generate_credentials($id){
+        $resto = Restaurants::find($id);
+        return response()->json(['username'=>$resto->users->username,'password'=>CommonMethods::generateRandomString()]);
+    }
+
+    public function update_password(Request $request){
+        $resto = Restaurants::find($request->resto_id);
+        $u = User::find($resto->user_id);
+        $u->password = Hash::make($request->password);
+        $u->save();
+    }
+
+    public function upload_gallery(Request $request){
+        $files =  $request->file('files');;
+
+        $resto_id = $request->resto_id;
+
+
+
+        if(isset($files) && count($files) > 0){
+
+            foreach($files as $file){
+                $photo = new Photos();
+                $extension = $file->getClientOriginalExtension();
+                $original_name = $file->getClientOriginalName();
+                // $original_name = str_replace(' ', '-', $original_name);
+                $extension_array = ['jpg', 'jpeg', 'bmp', 'png'];
+                $image_array = ['jpg', 'jpeg', 'bmp', 'png'];
+                if (in_array($extension, $extension_array)) {
+                    $file_name = 'resto-gallery-'.$resto_id. '-' . time().rand(1000,9999) . '.' . $extension;
+
+
+
+                    $destinationPath = public_path('/uploads/resto-gallery/');
+                    $file->move($destinationPath, $file_name);
+
+                    $img = Image::make($destinationPath . '/' . $file_name)->resize(1400, 1400, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/' . $file_name);
+
+                    $img = Image::make($destinationPath . '/' . $file_name)->resize(85, null, function ($constraint) {
+                        $constraint->aspectRatio();
+                    });
+
+                    $img->save($destinationPath . '/thumbnails/' . $file_name);
+                    // dd($request->file('attachment'));
+
+
+                    $photo->resto_id = $resto_id;
+                    $photo->file_name = $file_name;
+                    $photo->photo_type = "gallery";
+
+                    $photo->save();
+
+
+                }
+            }
+        }
+    }
+
+
+    public function read_notifications(){
+        $id = Auth::user()->restaurants->id;
+        $notification = OrderNotifications::where('status','unread')->where('resto_id',$id)->update(['status'=>'read']);
+        dd($notification);
+    }
+
+    public function rules()
+    {
+        return [
+            'image' => 'required|mimes:jpeg,jpg|size:2048'
+        ];
+    }
+}

+ 68 - 0
app/Http/Controllers/RestoTable.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use App\Models\RestoTables;
+use Auth;
+
+class RestoTable extends Controller
+{
+    //
+    public function restoTables(){
+
+            $tables = RestoTables::whereNull('deleted_at')->where('resto_id',Auth::user()->restaurants->id)->orderBy('name','ASC')->get();
+
+        $data = [
+            'tables' => $tables
+        ];
+        return view('tables.tables',$data);
+    }
+
+    public function new_table(){
+
+        return view('tables.table_form');
+    }
+
+    public function save(Request $request)
+    {
+        //  dd($request->all());
+
+        $id = $request->id;
+        if(empty($id))
+            $table = new RestoTables();
+        else
+            $table = RestoTables::find($id);
+
+        $table->name = $request->name;
+        $table->is_active =1;
+        $table->resto_id = Auth::user()->role=="restaurant"?Auth::user()->restaurants->id:0;
+        $table->save();
+
+        $id = $table->id;
+        if($id > 0)
+            echo json_encode(array('type' => 'success', 'message'=>"Table is saved successfully."));
+        else
+            echo json_encode(array('type' => 'error', 'message'=>"Table is not saved successfully."));
+    }
+
+    public function delete($id){
+        //$id = CommonMethods::decrypt($id);
+        $table = RestoTables::find($id);
+        $table->deleted_at = date('Y-m-d H:i:s');
+        $table->save();
+
+
+    }
+    public function edit($id){
+
+        $table = RestoTables::find($id);
+
+        $data = [
+            'table' => $table,
+        ];
+
+
+        return view('tables.table_form',$data);
+    }
+}

+ 327 - 0
app/Http/Controllers/RestoUser.php

@@ -0,0 +1,327 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use App\Models\RestoUsers;
+use App\Models\RestoUserInvites;
+use Illuminate\Support\Facades\Auth;
+use App\Models\Outlets;
+use App\Models\User;
+use App\Models\SendEmail;
+use Illuminate\Support\Facades\Hash;
+use App\Helpers\CommonMethods;
+use Str;
+use App\Models\Restaurants;
+
+class RestoUser extends Controller
+{
+    //
+    public function users(){
+        $users = RestoUsers::whereNull('deleted_at')->where('resto_id',Auth::user()->restaurants->id)->get();
+        $invited_users = RestoUserInvites::whereNull('deleted_at')->where('invite_type','pending')->where('resto_id',Auth::user()->restaurants->id)->get();
+
+        return view('users.users',['users'=>$users,'invited_users'=>$invited_users]);
+    }
+
+    public function invite(){
+        $outlets = Outlets::whereNull('deleted_at')->where('resto_id',Auth::user()->restaurants->id)->get();
+        return view('users.invite',['outlets'=>$outlets]);
+    }
+
+    public function send_invitation(Request $request){
+
+        $emails = $request->emails;
+        $role = $request->role;
+        $selected_outlets = $request->selected_outlets;
+        $resto_id = Auth::user()->restaurants->id;
+        $role_based_access = $request->role_based_access;
+
+        $emails = explode(',', $emails);
+        $existing_email = [];
+        $new = false;
+        foreach($emails as $email){
+            $invite = RestoUserInvites::where('email',$email)->whereNull('deleted_at')->where('resto_id',$resto_id)->first();
+            if(isset($invite)){
+                $existing_email[] = $email;
+            }else{
+                $new = true;
+                $in = new RestoUserInvites();
+
+                $uuid = Str::uuid();
+
+                $in->email = $email;
+                $in->resto_id = $resto_id;
+                $in->unique_key = $uuid;
+                $in->role = $role;
+                $in->access_level = $role_based_access;
+                $in->selected_outlets = $selected_outlets;
+                $in->invite_type = 'pending';
+
+                $in->save();
+
+                $id = $in->id;
+
+                if($id > 0){
+                    $param = array(
+                        'email'=>$email,
+                        'name' => '',
+                        'shop_name' => Auth::user()->restaurants->name,
+                        'role' => $role,
+                        'access_level' => $role_based_access,
+                        'selected_outlets' =>  $selected_outlets,
+                        'link' => env('APP_URL').'user/invite/'.$uuid
+                    );
+
+                    SendEmail::SendInvitationLink($param);
+                }
+            }
+
+
+
+        }
+
+        if($new){
+
+            $message = "Invitation sent successfully.";
+            if(count($existing_email) > 0)
+                $message .=', '.implode(', ' , $existing_email).' already in database.';
+            $array = array(
+                'type'=>"success",
+                'message'=>$message
+            );
+            echo json_encode($array);
+        }else{
+            $message = "Invitation is not sent";
+            if(count($existing_email) > 0){
+                $message.=", ".implode(",",$existing_email).' are already in database';
+            }
+            $array = array(
+                'type'=>"error",
+                'message'=>$message
+            );
+            echo json_encode($array);
+        }
+
+    }
+
+    public function create_user($id){
+
+        $invite = RestoUserInvites::where('unique_key',$id)->where('invite_type','pending')->first();
+        $resto = NULL;
+
+        if(isset($invite)){
+
+            $resto = Restaurants::find($invite->resto_id);
+
+        }
+
+
+        return view('users.create',['user'=>$invite,'resto'=>$resto]);
+    }
+
+    public function save_user(Request $request){
+
+
+
+        $invite_id = $request->invite_id;
+        $invite = RestoUserInvites::where('unique_key',$invite_id)->where('invite_type','pending')->first();
+        $first_name = $request->first_name;
+        $last_name = $request->last_name;
+        $mobile_number = $request->country_code.''.$request->mobile_number;
+        $email = $request->email;
+        $password = $request->password;
+
+        $e_user = User::where('email',$email)->first();
+
+        if(isset($e_user)){
+            $response = array(
+                'type'=>'error',
+                'message' => 'Email already found! try other email address'
+            );
+            echo json_encode($response);
+            exit();
+        }
+
+        $user = new User();
+        $username = CommonMethods::generate_user_name($request->first_name.' '.$request->last_name);
+
+        $user->name = $request->first_name.' '.$request->last_name;
+        $user->username = $username;
+        $user->password = Hash::make($password);
+        if(!empty($request->email))
+            $user->email = $request->email;
+        $user->is_active = 1;
+        $user->role='resto_user';
+        $user->save();
+
+        $user_id = $user->id;
+
+
+        $resto_user = new RestoUsers();
+
+        $resto_user->user_id = $user_id;
+        $resto_user->resto_id = $invite->resto_id;
+        $resto_user->unique_key = Str::uuid();
+        $resto_user->first_name = $first_name;
+        $resto_user->last_name = $last_name;
+
+        $resto_user->email = $email;
+        $resto_user->mobile_number = $mobile_number;
+        $resto_user->is_active = 1;
+
+
+        $resto_user->role=$invite->role;
+        $resto_user->access_level=$invite->access_level;
+        $resto_user->selected_outlets=$invite->selected_outlets;
+        $resto_user->save();
+        $id = $resto_user->id;
+
+        if($id > 0){
+            $invite->invite_type = 'completed';
+            $invite->save();
+
+            $shop = Restaurants::find($invite->resto_id);
+
+            $param  = array(
+                'email'=>$email,
+                'name' => $first_name.' '.$last_name,
+                'shop_name' => $shop->name,
+                'username' => $username,
+                'password' => $password
+
+            );
+
+            SendEmail::sendRestoUserCredentials($param);
+
+
+
+
+            Auth::loginUsingId($user_id);
+
+            $response = array(
+                'type'=>'success',
+                'message' => 'Your profile is created',
+                'role'=>$resto_user->role
+            );
+            echo json_encode($response);
+        }else{
+
+            $response = array(
+                'type'=>'error',
+                'message' => 'Your profile is not created, try again'
+            );
+            echo json_encode($response);
+        }
+
+
+
+
+    }
+
+    public function delete_invitation($id){
+        $invite = RestoUserInvites::where('unique_key',$id)->where('invite_type','pending')->first();
+        $invite->deleted_at = date('Y-m-d H:i:s');
+        $invite->save();
+    }
+
+    public function delete_saved_user($id){
+        $invite = RestoUsers::where('id',$id)->first();
+        $invite->deleted_at = date('Y-m-d H:i:s');
+        $invite->save();
+    }
+
+    public function user_profile($id){
+        $user = RestoUsers::where('unique_key',$id)->first();
+        $outlets = Outlets::whereNull('deleted_at')->where('resto_id',Auth::user()->restaurants->id)->get();
+        return view('users.profile',['user'=>$user,'outlets'=>$outlets]);
+    }
+
+    public function save_changes(Request $request){
+        $user = $request->user;
+
+        $resto_user = RestoUsers::where('unique_key',$user)->first();
+
+
+        $role = $request->role;
+        $selected_outlets = $request->selected_outlets;
+        $resto_id = Auth::user()->restaurants->id;
+        $role_based_access = $request->role_based_access;
+
+
+        $resto_user->role               = $role;
+        $resto_user->access_level       = $role_based_access;
+        $resto_user->selected_outlets   = $selected_outlets ;
+
+        $resto_user->save();
+
+        $id = $resto_user->id;
+
+        if($id > 0){
+
+
+            $response = array(
+                'type'=>'success',
+                'message' => 'Your profile is updated'
+            );
+            echo json_encode($response);
+        }else{
+
+            $response = array(
+                'type'=>'error',
+                'message' => 'Your profile is not updated, try again'
+            );
+            echo json_encode($response);
+        }
+
+    }
+
+    public function generate_credentials($id){
+        $user = RestoUsers::find($id);
+        return response()->json(['username'=>$user->users->username,'password'=>CommonMethods::generateRandomString()]);
+    }
+
+    public function update_password(Request $request){
+        $user = RestoUsers::find($request->user_id);
+        $u = User::find($user->user_id);
+        $password = Hash::make($request->password);
+
+        $param  = array(
+            'email'=>$user->email,
+            'name' => $user->first_name.' '.$user->last_name,
+            'shop_name' => Auth::user()->restaurants->name,
+            'username' => $u->username,
+            'password' => $request->password
+
+        );
+        // dd($param);
+        SendEmail::sendRestoUserCredentials($param);
+
+
+        $u->password = $password;
+        $u->save();
+    }
+
+    public function get_invitation_link($unique_key){
+        $invite = RestoUserInvites::where('unique_key',$unique_key)->where('invite_type','pending')->first();
+        $param = array(
+            'email'=>$invite->email,
+            'name' => '',
+            'shop_name' => Auth::user()->restaurants->name,
+            'role' => $invite->role,
+            'access_level' => $invite->access_level,
+            'selected_outlets' => $invite->selected_outlets ,
+            'link' => env('APP_URL').'user/invite/'.$invite->unique_key
+        );
+        //dd($param);
+        try{
+            SendEmail::SendInvitationLink($param);
+            return response()->json(['type'=>"success",'message'=>"Invitation link sent successfully at ".$invite->email]);
+
+        }catch(Exception $e){
+            return response()->json(['type'=>"error",'message'=>"Invitation link is not  successfully "]);
+        }
+
+
+    }
+}

+ 24 - 0
app/Http/Controllers/ShopMenu.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Helpers\CommonMethods;
+use App\Models\ShopMenus;
+use Illuminate\Http\Request;
+
+class ShopMenu extends Controller
+{
+    //
+    public function menus(){
+        $resto_id = CommonMethods::getRestuarantID();
+        $menus = ShopMenus::whereNull('deleted_at')->where('resto_id',$resto_id)->get();
+
+        return view('shop-menu.menus',['menus'=>$menus]);
+    }
+
+    public function menu_edit($id){
+        $menu = ShopMenus::where('unique_key',$id)->first();
+
+        return view('shop-menu.menu-form',['menu'=>$menu]);
+    }
+}

+ 70 - 0
app/Http/Controllers/SpecialOffer.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\SpecialOffers;
+use Illuminate\Http\Request;
+
+class SpecialOffer extends Controller
+{
+    //
+
+    public function save_offers(Request $request){
+
+        $id = $request->id;
+
+        if(empty($id))
+            $offer = new SpecialOffers();
+        else
+            $offer = SpecialOffers::find($id);
+        $offer->resto_id = $request->resto_id;
+        $offer->offer_title = $request->offer_title;
+        $offer->offer_text = $request->offer_text;
+        $offer->offer_discount = $request->offer_discount;
+
+        $offer->is_active = 1;
+
+        $offer->save();
+
+        $id = $offer->id;
+
+        if($id > 0)
+        {
+            echo json_encode(array('type' => 'success', 'message'=>"Special Offer's data is saved successfully."));
+            exit;
+        }else{
+            echo json_encode(array('type' => 'error', 'message'=>"Special Offer's data is saved successfully."));
+            exit;
+        }
+
+
+
+    }
+
+    public function activate_offers(Request $request){
+        $id = $request->id;
+        $o = SpecialOffers::where('resto_id',$request->resto_id)->update(['is_active'=>0]);
+        $offer = SpecialOffers::find($id);
+        $offer->is_active = 1;
+
+        $offer->save();
+    }
+
+    public function edit_special_offer($id){
+
+
+        $offer = SpecialOffers::find($id);
+
+        echo $offer->toJSON();
+    }
+
+    public function delete_special_offer($id){
+
+
+        $offer = SpecialOffers::find($id);
+        $offer->deleted_at = date('Y-m-d H:i:s');
+        $offer->save();
+    }
+
+
+}

+ 98 - 0
app/Http/Controllers/StaticsReport.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Exports\ItemSalesExport;
+use App\Exports\OrderHistoryExport;
+use App\Helpers\CommonMethods;
+use App\Models\Orders;
+use App\Models\Recipes;
+use App\Models\StaticReports;
+use Carbon\Carbon;
+use   Illuminate\Http\Request;
+use Excel;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Str;
+
+class StaticsReport extends Controller
+{
+    public function download_order_history(Request $request){
+
+        $start_date = $request->start_date;
+        $end_date =  $request->end_date;
+        $file_name = Str::uuid();
+        $dates = ['start_date'=>$start_date,'end_date'=>$end_date,'file_name'=>$file_name];
+        Excel::store(new OrderHistoryExport($dates),$request->restoName.'/orders/'.$file_name.'.xlsx','report_files');
+
+
+
+    }
+
+    public function static_reports(){
+        $resto_id = CommonMethods::getRestuarantID();
+        $reports = StaticReports::with(['users'])->whereNull('deleted_at')->where('status','active')->where('resto_id',$resto_id)->orderBy('created_at','DESC')->get();
+        $static_reports = [];
+
+        if(isset($reports)&& $reports->count() > 0) {
+            foreach($reports as $report){
+                $static_reports[$report->report_type][] = array(
+                    'id' => $report->id,
+                    'file_name'=> $report->file_name,
+                    'searched_by'=>$report->users->name,
+                    'start_date'=>Carbon::parse($report->start_date)->format('d M Y'),
+                    'end_date'=>Carbon::parse($report->end_date)->format('d M Y'),
+                    'created_at'=>Carbon::parse($report->created_at)->format('d M Y, H:i'),
+                    'data_found'=>$report->is_data_found
+                );
+            }
+        }
+
+        return view('reports.reports',['reports'=>$static_reports]);
+    }
+
+    public function load_report_data(Request $request){
+        $type = $request->type;
+        $resto_id = $request->restoId;
+
+        $reports = StaticReports::with(['users'])
+            ->where('status','active')->where('resto_id',$resto_id)->where('order_type',$type)->get();
+
+        $static_reports = [];
+
+        if(isset($reports)&& $reports->count() > 0) {
+            foreach($reports as $report){
+                $static_reports[] = array(
+                    'file_name'=> $report->file_name,
+                    'searched_by'=>$report->users->name,
+                    'start_date'=>Carbon::parse($report->start_date)->format('d M Y'),
+                    'end_date'=>Carbon::parse($report->end_date)->format('d M Y'),
+                    'created_at'=>Carbon::parse($report->created_at)->format('d M Y, H:i'),
+                    'data_found'=>$report->is_data_found
+                );
+            }
+        }
+
+        return response()->json($static_reports);
+    }
+
+    public function getItemSaleCounts(Request $request){
+        $start_date = $request->start_date;
+        $end_date =  $request->end_date;
+
+        $restoName = $request->restoName;
+       // $start_date = $request->start_date;
+       // $end_date =  $request->end_date;
+        $file_name = Str::uuid();
+        $dates = ['start_date'=>$start_date,'end_date'=>$end_date,'file_name'=>$file_name];
+        Excel::store(new ItemSalesExport($dates),$restoName.'/items-sale/'.$file_name.'.xlsx','report_files');
+
+
+
+    }
+    public function delete_report($id){
+        $report = StaticReports::find($id);
+
+        $report->deleted_at = Carbon::now()->format('Y-m-d H:i:s');
+        $report->save();
+    }
+}

+ 140 - 0
app/Http/Controllers/Translation.php

@@ -0,0 +1,140 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Translations;
+use Illuminate\Http\Request;
+use Str;
+use File;
+use Storage;
+use Carbon\Carbon;
+use Response;
+class Translation extends Controller
+{
+   public function translations(){
+	   $translations = Translations::where('status',1)->where('context','admin')->get();
+	   $t = [];
+	   if(isset($translations)){
+		   foreach($translations as $translation){
+			   $t[$translation->item_key][$translation->lang_id] = $translation->item_val;
+		   }
+	   }
+	   $translations = $t;
+	  // dd($translations);
+	   return view("translations.translations",['translations'=>$translations,'translation_for'=>'admin']);
+   }
+
+	 public function translations_frontend(){
+	   $translations = Translations::where('status',1)->where('context','meem_fe_customer')->get();
+	   $t = [];
+	   if(isset($translations)){
+		   foreach($translations as $translation){
+			   $t[$translation->item_key][$translation->lang_id] = $translation->item_val;
+		   }
+	   }
+	   $translations = $t;
+	  // dd($translations);
+	   return view("translations.translations",['translations'=>$translations,'translation_for'=>'frontend']);
+   }
+
+	public function save_translation(Request $request){
+
+
+		$id = $request->id;
+
+		if(empty($id)){
+			$translation = new Translations();
+			$translation->item_key = str_replace('-','_',Str::slug($request->item_key));
+
+			$translation->item_val = $request->item_en;
+			$translation->lang_id = 'en';
+
+			if($request->type=="frontend"){
+
+				$translation->context = 'meem_fe_customer';
+				$translation->context_value = 'meem_react';
+			}
+			if($request->type=="admin"){
+				$translation->context = 'admin';
+				$translation->context_value = 'admin-label';
+			}
+
+			$translation->save();
+
+
+			$translation = new Translations();
+			$translation->item_key = str_replace('-','_',Str::slug($request->item_key));
+
+			$translation->item_val = $request->item_ar;
+			$translation->lang_id = 'ar';
+
+			if($request->type=="frontend"){
+
+				$translation->context = 'meem_fe_customer';
+				$translation->context_value = 'meem_react';
+			}
+			if($request->type=="admin"){
+				$translation->context = 'admin';
+				$translation->context_value = 'admin-label';
+			}
+
+			$translation->save();
+
+			return response()->json(array('type' => 'success', 'message'=>"Data is saved successfully."),200);
+
+
+		}else{
+			//dd($request->all());
+			$translation = Translations::where('item_key',$id)->where('lang_id','en')->first();
+
+			$translation->item_val = $request->item_en;;
+			$translation->save();
+
+			$translation = Translations::where('item_key',$id)->where('lang_id','ar')->first();
+
+			$translation->item_val = $request->item_ar;;
+			$translation->save();
+
+			return response()->json(array('type' => 'success', 'message'=>"Data is saved successfully."),200);
+		}
+
+
+	}
+
+	public function download_translation_file($type,$for){
+		//echo $for;
+		if($for=="frontend")
+		$translations = Translations::where('status',1)->where('lang_id',$type)->where('context','meem_fe_customer')->get();
+		if($for=="admin")
+		$translations = Translations::where('status',1)->where('lang_id',$type)->where('context','admin')->get();
+
+		$t = [];
+	   if(isset($translations)){
+		   foreach($translations as $translation){
+			   $t[$translation->item_key] = $translation->item_val;
+		   }
+	   }
+
+		if($for=="admin"){
+			rename('/var/www/admin.dukany.io/resources/lang/'.$type.'/label.php', '/var/www/admin.dukany.io/resources/lang/'.$type.'/label-'.Carbon::now()->format('Ymd').'.php');
+
+		File::put('resources/lang/'.$type.'/label.php',"<?php return ".var_export($t,true)."; ?>");
+		}
+
+
+
+		if($for=="frontend"){
+			$time  = time();
+			 File::put('resources/lang/'.$type.'/label.json',json_encode($t,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
+			 rename('/var/www/admin.dukany.io/resources/lang/'.$type.'/label.json', '/var/www/admin.dukany.io/public/uploads/label-'.$type.'-'.$time.'.json');
+			//echo env('APP_URL').'uploads/label-'.$type;
+			 $headers = array(
+              'Content-Type: application/json',
+            );
+//return download(public_path('uploads/label-'.$type.'.json'));
+         return response()->download(public_path('uploads/label-'.$type.'-'.$time.'.json'), 'label-'.$type.'-'.$time.'.json', $headers);
+		}
+
+
+	}
+}

+ 194 - 0
app/Http/Controllers/Waiter.php

@@ -0,0 +1,194 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Helpers\CommonMethods;
+use App\Models\Photos;
+use App\Models\RestoTables;
+use App\Models\User;
+use App\Models\Waiters;
+use App\Models\WaiterTables;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
+use File;
+
+class Waiter extends Controller
+{
+    //
+    public function waiters(){
+        $waiters = Auth::user()->restaurants->waiters;
+        $data = [
+            'waiters' => $waiters
+        ];
+
+        return view('waiters.waiters',$data);
+    }
+
+    public function new_waiter(){
+
+        $tables = RestoTables::whereNull('deleted_at')->where('resto_id',Auth::user()->restaurants->id)->where('is_active',1)->doesnthave('waiter_tables')->get();
+
+        $data = ['tables'=>$tables];
+
+        return view('waiters.waiter_form',$data);
+    }
+
+    public function save(Request $request){
+        //  dd($request->all());
+
+        $id = $request->id;
+
+        if(empty($id)){
+            $waiter = new Waiters();
+            $user = new User();
+
+            $user->name = $request->name;
+            $user->username = CommonMethods::generate_user_name($request->name);
+            $user->password = Hash::make('12345678');
+            if(!empty($request->email))
+                $user->email = $request->email;
+            $user->is_active = 1;
+            $user->role='waiter';
+            $user->save();
+
+
+            $waiter->user_id = $user->id;
+        }else
+            $waiter = Waiters::find($id);
+
+        if(!isset($request->is_active) && !empty($id)){
+            //dd('TEST');
+            if(!empty($id)) {
+            $u = User::find($waiter->user_id);
+            $u->is_active = 0;
+            $u->save();
+            }
+        }else{
+
+                if ($waiter->users->is_active == 0) {
+                    $u = User::find($waiter->user_id);
+                    $u->is_active = 1;
+                    $u->save();
+                }
+
+        }
+
+
+
+        $waiter->name = $request->name;
+        $waiter->resto_id = Auth::user()->restaurants->id;
+
+        $waiter->address = $request->address;
+
+
+        $waiter->phone = $request->phone;
+
+        $waiter->is_active = isset($request->is_active)?1:0;
+
+        $waiter->save();
+
+        $id = $waiter->id;
+        if($id > 0){
+
+            if($request->hasFile('profile')){
+                $logo = $request->file('profile');
+
+
+
+                $file_name = Str::slug($request->name)."-profile".'-'.time();
+                $extension = $logo->getClientOriginalExtension();
+
+
+
+                Storage::disk('profile')->put($file_name.'.'.$extension,  File::get($logo));
+                $logo = Photos::where('waiter_id',$id)->where('photo_type','profile')->first();
+                if(!$logo)
+                    $logo = new Photos();
+
+
+                $logo->file_name = $file_name.'.'.$extension;
+                $logo->waiter_id = $id;
+                $logo->photo_type = 'profile';
+
+                $logo->save();
+
+                //$resto->text =
+            }
+
+            $table_id = isset($request->table_id)?$request->table_id:"";
+
+            if(!empty($table_id)){
+                $w_t = WaiterTables::where('table_id',$table_id)->first();
+
+                if(!isset($wt))
+                    $w_t = new  WaiterTables();
+                $w_t->waiter_id = $id;
+                $w_t->table_id = $table_id;
+
+                $w_t->save();
+            }
+
+
+
+
+            echo json_encode(array('type' => 'success', 'message'=>"Waiter's data is saved successfully."));
+            exit;
+        }else{
+            echo json_encode(array('type' => 'error', 'message'=>"Waiter's data is not saved, check info again."));
+        }
+
+
+
+
+    }
+
+    public function show($id){
+
+        $waiter = Waiters::find($id);
+        $data = [
+            'waiter' => $waiter,
+
+        ];
+        return view('waiters.show',$data);
+    }
+
+    public function edit($id){
+
+        $waiter = Waiters::find($id);
+        $tables = RestoTables::whereNull('deleted_at')->where('resto_id',Auth::user()->restaurants->id)->where('is_active',1)->doesnthave('waiter_tables')->get();
+
+        $data = [
+            'waiter' => $waiter,
+            'tables'=>$tables
+        ];
+
+
+        return view('waiters.waiter_form',$data);
+    }
+
+    public function delete($id){
+        //$id = CommonMethods::decrypt($id);
+        $waiter = Waiters::find($id);
+        $waiter->deleted_at = date('Y-m-d H:i:s');
+        $waiter->save();
+
+
+    }
+
+    public function generate_credentials($id){
+        $waiter = Waiters::find($id);
+        return response()->json(['username'=>$waiter->users->username,'password'=>CommonMethods::generateRandomString()]);
+    }
+
+    public function update_password(Request $request){
+
+        $waiter = Waiters::find($request->waiter_id);
+
+        $u = User::find($waiter->user_id);
+        $u->password = Hash::make($request->password);
+        $u->save();
+    }
+}

+ 70 - 0
app/Http/Kernel.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace App\Http;
+
+use App\Http\Middleware\AdminMiddleware;
+use Illuminate\Foundation\Http\Kernel as HttpKernel;
+
+class Kernel extends HttpKernel
+{
+    /**
+     * The application's global HTTP middleware stack.
+     *
+     * These middleware are run during every request to your application.
+     *
+     * @var array<int, class-string|string>
+     */
+    protected $middleware = [
+        // \App\Http\Middleware\TrustHosts::class,
+        \App\Http\Middleware\TrustProxies::class,
+        \Illuminate\Http\Middleware\HandleCors::class,
+        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
+        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
+        \App\Http\Middleware\TrimStrings::class,
+        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
+    ];
+
+    /**
+     * The application's route middleware groups.
+     *
+     * @var array<string, array<int, class-string|string>>
+     */
+    protected $middlewareGroups = [
+        'web' => [
+            \App\Http\Middleware\EncryptCookies::class,
+            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+            \Illuminate\Session\Middleware\StartSession::class,
+            // \Illuminate\Session\Middleware\AuthenticateSession::class,
+            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+            \App\Http\Middleware\VerifyCsrfToken::class,
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+
+        'api' => [
+            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
+            'throttle:api',
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+    ];
+
+    /**
+     * The application's route middleware.
+     *
+     * These middleware may be assigned to groups or used individually.
+     *
+     * @var array<string, class-string|string>
+     */
+    protected $routeMiddleware = [
+        'auth' => \App\Http\Middleware\Authenticate::class,
+        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
+        'can' => \Illuminate\Auth\Middleware\Authorize::class,
+        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
+        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
+        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
+        'admin.routes'=>AdminMiddleware::class,
+        'check.request'=>\App\Http\Middleware\CheckRequestMethod::class,
+    ];
+}

+ 25 - 0
app/Http/Middleware/AdminMiddleware.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Support\Facades\Auth;
+
+class AdminMiddleware
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+
+        if (Auth::user()->role !== "administrator" && Auth::user()->role !== "admin_user" ) {
+            abort(403, 'Unauthorized action.');
+        }
+        return $next($request);
+    }
+}

+ 21 - 0
app/Http/Middleware/Authenticate.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Auth\Middleware\Authenticate as Middleware;
+
+class Authenticate extends Middleware
+{
+    /**
+     * Get the path the user should be redirected to when they are not authenticated.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return string|null
+     */
+    protected function redirectTo($request)
+    {
+        if (! $request->expectsJson()) {
+            return route('login');
+        }
+    }
+}

+ 57 - 0
app/Http/Middleware/CheckRequestMethod.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Helpers\CommonMethods;
+use Closure;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Redis;
+
+class CheckRequestMethod
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
+     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
+     */
+    public function handle(Request $request, Closure $next)
+    {
+        $response = $next($request);
+
+      //  dump('in middleware');
+       // $resto_metas = CommonMethods::getRestoMetas($resto);
+      //  dd($resto_metas);
+
+
+
+
+        $req_method = $request->getMethod();
+
+
+
+        if($req_method=="POST"){
+            $keys = Redis::keys('*');
+            $resto = \App\Models\Restaurants::find(\App\Helpers\CommonMethods::getRestuarantID());
+            $resto_id = $resto->user_id;
+            //dd($resto_id);
+            /*  $key_id =
+         dump(Auth::id().': '.Redis::get(str_replace('meem_orders_','',"resto_pakistan_".Auth::id()))); */
+            foreach($keys as $k){
+                //
+
+                if(str_contains($k,"_".$resto_id)){
+
+                    Redis::del(str_replace('prod_meem_orders_','',$k));
+                }
+
+                //dump($k.': '.Redis::get(str_replace('meem_orders_','',$k)));
+            }
+            //dump($req_method);
+        }
+
+
+        return $response;
+    }
+}

+ 17 - 0
app/Http/Middleware/EncryptCookies.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
+
+class EncryptCookies extends Middleware
+{
+    /**
+     * The names of the cookies that should not be encrypted.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        //
+    ];
+}

+ 17 - 0
app/Http/Middleware/PreventRequestsDuringMaintenance.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
+
+class PreventRequestsDuringMaintenance extends Middleware
+{
+    /**
+     * The URIs that should be reachable while maintenance mode is enabled.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        //
+    ];
+}

+ 32 - 0
app/Http/Middleware/RedirectIfAuthenticated.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Providers\RouteServiceProvider;
+use Closure;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+
+class RedirectIfAuthenticated
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
+     * @param  string|null  ...$guards
+     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
+     */
+    public function handle(Request $request, Closure $next, ...$guards)
+    {
+        $guards = empty($guards) ? [null] : $guards;
+
+        foreach ($guards as $guard) {
+            if (Auth::guard($guard)->check()) {
+                return redirect(RouteServiceProvider::HOME);
+            }
+        }
+
+        return $next($request);
+    }
+}

+ 19 - 0
app/Http/Middleware/TrimStrings.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
+
+class TrimStrings extends Middleware
+{
+    /**
+     * The names of the attributes that should not be trimmed.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        'current_password',
+        'password',
+        'password_confirmation',
+    ];
+}

+ 20 - 0
app/Http/Middleware/TrustHosts.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Http\Middleware\TrustHosts as Middleware;
+
+class TrustHosts extends Middleware
+{
+    /**
+     * Get the host patterns that should be trusted.
+     *
+     * @return array<int, string|null>
+     */
+    public function hosts()
+    {
+        return [
+            $this->allSubdomainsOfApplicationUrl(),
+        ];
+    }
+}

+ 28 - 0
app/Http/Middleware/TrustProxies.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Http\Middleware\TrustProxies as Middleware;
+use Illuminate\Http\Request;
+
+class TrustProxies extends Middleware
+{
+    /**
+     * The trusted proxies for this application.
+     *
+     * @var array<int, string>|string|null
+     */
+    protected $proxies;
+
+    /**
+     * The headers that should be used to detect proxies.
+     *
+     * @var int
+     */
+    protected $headers =
+        Request::HEADER_X_FORWARDED_FOR |
+        Request::HEADER_X_FORWARDED_HOST |
+        Request::HEADER_X_FORWARDED_PORT |
+        Request::HEADER_X_FORWARDED_PROTO |
+        Request::HEADER_X_FORWARDED_AWS_ELB;
+}

+ 22 - 0
app/Http/Middleware/ValidateSignature.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Routing\Middleware\ValidateSignature as Middleware;
+
+class ValidateSignature extends Middleware
+{
+    /**
+     * The names of the query string parameters that should be ignored.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        // 'fbclid',
+        // 'utm_campaign',
+        // 'utm_content',
+        // 'utm_medium',
+        // 'utm_source',
+        // 'utm_term',
+    ];
+}

+ 17 - 0
app/Http/Middleware/VerifyCsrfToken.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
+
+class VerifyCsrfToken extends Middleware
+{
+    /**
+     * The URIs that should be excluded from CSRF verification.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        '/liveorders'
+    ];
+}

+ 62 - 0
app/Jobs/SendOrderNotifications.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Models\RestoSMSs;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Facades\Http;
+use Illuminate\Support\Facades\Log;
+
+class SendOrderNotifications implements ShouldQueue
+{
+    
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+    private $params;
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct($params)
+    {
+        $this->params = $params;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        //
+        $url = $this->params['url'];
+        $message_data = $this->params['message_data'];
+        $sms_id = $this->params['sms_id'];
+        $response = Http::acceptJson()->post($url,$message_data);
+
+
+
+        $response = $response->json();
+        $response = json_encode($response);
+        Log::info('TRACK_ORDER_SMS Response: '.$response);
+        Log::info('Job Started: '.$sms_id);
+
+        $sms = RestoSMSs::find($sms_id);
+        $sms->otp_req = json_encode($message_data);
+
+        $resp = json_decode($response);
+        $sms->otp_req_status = strtoupper($resp->status)=="ACCEPTED"?"SUCCESS":"FAIL";
+
+
+
+        $sms->otp_res = $response;
+
+
+        $sms->save();
+    }
+}

+ 53 - 0
app/Jobs/SendOrderPusherNotification.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\Jobs;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Pusher\Pusher;
+
+class SendOrderPusherNotification implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+    private $pusherData;
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct($pusherData)
+    {
+        $this->pusherData = $pusherData;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        //
+
+        $options = array(
+            'cluster' => env('PUSHER_APP_CLUSTER'),
+            'encrypted' => true
+        );
+        $pusher = new Pusher(
+            env('PUSHER_APP_KEY'),
+            env('PUSHER_APP_SECRET'),
+            env('PUSHER_APP_ID'),
+            $options
+        );
+
+
+
+
+
+
+        $pusher->trigger(env('PUHER_APP_CHANNEL'), 'App\\Events\\OrderNotification', $this->pusherData);
+    }
+}

+ 15 - 0
app/Models/AdminUsers.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class AdminUsers extends Model
+{
+   protected $table = "tb_dm_admin_users";
+   protected $guarded = [];
+
+	public function users(){
+        return $this->belongsTo('App\Models\User','user_id','id');
+    }
+}

+ 25 - 0
app/Models/ApiTokens.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Str;
+
+class ApiTokens extends Model
+{
+    //
+    public function generateToken($user_id)
+    {
+        $this->user_id = $user_id;
+        $this->api_token = Str::random(60);
+        $this->save();
+
+        return $this->api_token;
+    }
+
+    public function users(){
+        return $this->belongsTo('App\User','user_id','id');
+    }
+
+
+}

+ 11 - 0
app/Models/Blogs.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Blogs extends Model
+{
+   protected $table = "tb_dm_blogs";
+   protected $guarded = [];
+}

+ 10 - 0
app/Models/BranchDeliveryAreas.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class BranchDeliveryAreas extends Model
+{
+    protected $table = "tb_dm_branch_delivery_area";
+}

+ 11 - 0
app/Models/BranchFeatures.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class BranchFeatures extends Model
+{
+    //
+    protected $table = "tb_dm_resto_branch_features";
+}

+ 11 - 0
app/Models/BranchHours.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class BranchHours extends Model
+{
+    //
+    protected $table="tb_branch_business_hours";
+}

+ 11 - 0
app/Models/BusinessBioLinks.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class BusinessBioLinks extends Model
+{
+    use HasFactory;
+}

+ 14 - 0
app/Models/BusinessBioMetaLinks.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class BusinessBioMetaLinks extends Model
+{
+    use HasFactory;
+    public function business_links(){
+        return $this->hasMany('App\Models\BusinessBioLinks','resto_id','resto_id')->whereNull('deleted_at');
+    }
+}

+ 66 - 0
app/Models/Categories.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use DB;
+
+class Categories extends Model
+{
+    //
+    protected $table = "tb_dm_recipe_categories";
+
+    public function recipes(){
+        return $this->hasMany('App\Models\MapRecipeCategories','category_id','id');
+    }
+
+
+
+    public function categories_has_recipes(){
+        $a= $this->belongsToMany('App\Models\Recipes','tb_dm_recipe_categories_map','category_id',
+        'recipe_id')->whereNull('deleted_at');
+
+        return $a;
+    }
+
+    public function main_images(){
+        return $this->hasOne('App\Models\Photos','category_id','id')->where('photo_type','main_image');
+    }
+
+    public static function getCategoriesHasRecipes($resto_id){
+        $query = "    SELECT category.* FROM `tb_dm_recipe_categories_map` as category_map
+                      INNER JOIN tb_dm_recipe recipe on recipe.id = category_map.recipe_id
+                      INNER JOIN tb_dm_recipe_categories category on category.id = category_map.category_id
+                      where category_map.resto_id=".$resto_id." and recipe.deleted_at IS NULL group by category_map.category_id";
+
+        $query = "    SELECT category.*,p.file_name as main_images FROM `tb_dm_recipe_categories_map` as category_map
+                      INNER JOIN tb_dm_recipe recipe on recipe.id = category_map.recipe_id
+                      INNER JOIN tb_dm_recipe_categories category on category.id = category_map.category_id
+					            INNER JOIN photos p on category.id = p.category_id
+                      where  category_map.resto_id=".$resto_id." and recipe.deleted_at IS NULL  and p.photo_type='main_image' group by category_map.category_id,p.file_name";
+
+
+        $categories = DB::select($query);
+        return $categories;
+    }
+
+
+    public static function getRecipeByCategoriesResto($resto_id,$category_id){
+        $query = "    SELECT recipe.*,p.file_name as main_images FROM `tb_dm_recipe_categories_map` as category_map
+                      INNER JOIN tb_dm_recipe recipe on recipe.id = category_map.recipe_id
+                      INNER JOIN tb_dm_recipe_categories category on category.id = category_map.category_id
+					  INNER JOIN photos p on p.recipe_id = recipe.id
+                      where recipe.deleted_at is NULL and category_map.resto_id=".$resto_id." AND p.photo_type='main_image' and category_map.category_id=".$category_id." AND recipe.status = 1 group by category_map.recipe_id,p.file_name";
+
+        $recipes = DB::select($query);
+        return $recipes;
+    }
+
+    public function parent_category(){
+        return $this->hasOne('App\Models\Categories','id','parent_id');
+    }
+
+    public function childern(){
+        return $this->hasMany('App\Models\Categories','parent_id','id')->whereNull('deleted_at');
+    }
+}

+ 15 - 0
app/Models/Cities.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Cities extends Model
+{
+    //
+    protected $table = "tb_dm_cities";
+
+    public function countries(){
+        return $this->belongsTo('App\Models\Countries','country_id','id');
+    }
+}

+ 11 - 0
app/Models/ClothOptions.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ClothOptions extends Model
+{
+    //
+    protected $table = "tb_dm_cloth_extra_options";
+}

+ 10 - 0
app/Models/Colors.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Colors extends Model
+{
+    //
+}

+ 11 - 0
app/Models/Countries.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Countries extends Model
+{
+    //
+    protected $table = "tb_dm_countries";
+}

+ 11 - 0
app/Models/CustomerAddresses.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class CustomerAddresses extends Model
+{
+    //
+    protected $table = "tb_dm_customer_addresses";
+}

+ 12 - 0
app/Models/CustomerLoyaltyHistories.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class CustomerLoyaltyHistories extends Model
+{
+	protected $table= "customer_loyalty_history";
+
+}

+ 23 - 0
app/Models/Customers.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Customers extends Model
+{
+    //
+    protected $table = "tb_dm_customers";
+
+    public function customer_addresses(){
+        return $this->hasMany('App\Models\CustomerAddresses','customer_id','id')->where('is_set',1)->whereNull('deleted_at');
+    }
+
+    public function main_address(){
+        return $this->hasOne('App\Models\CustomerAddresses','customer_id','id')->where('is_set',1)->whereNull('deleted_at')->where('is_set',1);
+    }
+
+    public function users(){
+        return $this->belongsTo('App\Models\User','user_id','id');
+    }
+}

+ 19 - 0
app/Models/DMCities.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class DMCities extends Model
+{
+    //
+    protected $table = "tb_dm_places";
+
+    public function cities(){
+        return $this->belongsTo('App\Cities','city_id','id');
+    }
+
+    public function categories(){
+        return $this->belongsTo('App\PlaceCategories','category_id','id');
+    }
+}

+ 11 - 0
app/Models/DiscountItems.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class DiscountItems extends Model
+{
+   protected $table = "tb_dm_item_discount_mapping";
+   protected $guarded = [];
+}

+ 11 - 0
app/Models/DiscountOutlets.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class DiscountOutlets extends Model
+{
+   protected $table = "tb_dm_outlet_discount_mapping";
+   protected $guarded = [];
+}

+ 16 - 0
app/Models/DiscountWithOrder.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class DiscountWithOrder extends Model
+{
+   protected $table = "tb_dm_order_with_discount";
+   protected $guarded = [];
+
+   public function discounts(){
+       $a =  $this->belongsTo('App\Models\Discounts','discount_id','id');
+      return $a;
+   }
+}

+ 26 - 0
app/Models/Discounts.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Discounts extends Model
+{
+   protected $table = "tb_dm_discounts";
+   protected $guarded = [];
+
+
+
+   public function discount_outlets(){
+       return $this->hasMany('App\Models\DiscountOutlets','discount_id','id')->orderBy('created_at','DESC');
+   }
+
+   public function discount_items(){
+       return $this->hasMany('App\Models\DiscountItems','discount_id','id')->orderBy('created_at','DESC');
+   }
+
+   public function getDiscountNamesAttribute(){
+       return $this->attributes['discount_names'] = array('ar'=>$this->discount_name_arabic,'en'=>$this->discount_name);
+   }
+
+}

+ 15 - 0
app/Models/ExtraOptionItems.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ExtraOptionItems extends Model
+{
+    //
+    protected $table = "tb_dm_extra_option_items";
+
+    public function childern() {
+        return $this->hasMany('App\Models\ExtraOptionItems', 'parent_id','id');
+    }
+}

+ 15 - 0
app/Models/ExtraOptions.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ExtraOptions extends Model
+{
+    //
+    protected $table = "tb_dm_extra_options";
+
+    public function extra_option_items(){
+        return $this->hasMany('App\Models\ExtraOptionItems','extra_option_id','id')->whereNull('deleted_at')->where('parent_id',0);
+    }
+}

+ 11 - 0
app/Models/Loyalties.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Loyalties extends Model
+{
+    use HasFactory;
+}

+ 12 - 0
app/Models/LoyaltiesWithOrders.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class LoyaltyWithOrders extends Model
+{
+	protected $table= "loyalty_with_orders";
+
+}

+ 22 - 0
app/Models/MapRecipeCategories.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class MapRecipeCategories extends Model
+{
+    //
+    protected $table = "tb_dm_recipe_categories_map";
+
+    public static function getRecipeCategory($recipe_id){
+        $mapping  = MapRecipeCategories::where('recipe_id',$recipe_id)
+                            ->pluck('category_id')->toArray();
+
+        return $mapping;
+    }
+
+    public function mapped_recipes(){
+        return $this->belongsTo('App\Models\Recipes','recipe_id','id');
+    }
+}

+ 10 - 0
app/Models/ModelLanguageItems.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ModelLanguageItems extends Model
+{
+   protected $table = "tb_all_lang_vals";
+}

+ 24 - 0
app/Models/OrderActivities.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Auth;
+
+class OrderActivities extends Model
+{
+    //
+    protected $table = "tb_dm_order_activities";
+
+    public static function add_order_activity($order_id,$status){
+        $order = new OrderActivities();
+
+        $order->order_id = $order_id;
+        $order->status = $status;
+        $order->muser = Auth::user()->id;
+
+        $order->save();
+    }
+
+
+}

+ 10 - 0
app/Models/OrderHists.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class OrderHists extends Model
+{
+    //
+}

+ 0 - 0
app/Models/OrderItems.php


Some files were not shown because too many files changed in this diff