You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					280 lines
				
				7.4 KiB
			
		
		
			
		
	
	
					280 lines
				
				7.4 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace App\Models;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use App\Models\Vendor;
							 | 
						||
| 
								 | 
							
								use App\Scopes\ZoneScope;
							 | 
						||
| 
								 | 
							
								use Illuminate\Support\Str;
							 | 
						||
| 
								 | 
							
								use Illuminate\Database\Eloquent\Model;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Restaurant extends Model
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    protected $dates = ['opening_time', 'closeing_time'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected $fillable = ['food_section','status'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected $casts = [
							 | 
						||
| 
								 | 
							
								        'minimum_order' => 'float',
							 | 
						||
| 
								 | 
							
								        'comission' => 'float',
							 | 
						||
| 
								 | 
							
								        'tax' => 'float',
							 | 
						||
| 
								 | 
							
								        'delivery_charge' => 'float',
							 | 
						||
| 
								 | 
							
								        'schedule_order'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'free_delivery'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'vendor_id'=>'integer',
							 | 
						||
| 
								 | 
							
								        'status'=>'integer',
							 | 
						||
| 
								 | 
							
								        'delivery'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'take_away'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'zone_id'=>'integer',
							 | 
						||
| 
								 | 
							
								        'food_section'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'reviews_section'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'active'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'gst_status'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'pos_system'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'self_delivery_system'=>'integer',
							 | 
						||
| 
								 | 
							
								        'open'=>'integer',
							 | 
						||
| 
								 | 
							
								        'gst_code'=>'string',
							 | 
						||
| 
								 | 
							
								        'off_day'=>'string',
							 | 
						||
| 
								 | 
							
								        'gst'=>'string',
							 | 
						||
| 
								 | 
							
								        'veg'=>'integer',
							 | 
						||
| 
								 | 
							
								        'non_veg'=>'integer',
							 | 
						||
| 
								 | 
							
								        'minimum_shipping_charge'=>'float',
							 | 
						||
| 
								 | 
							
								        'per_km_shipping_charge'=>'float',
							 | 
						||
| 
								 | 
							
								        'maximum_shipping_charge'=>'float',
							 | 
						||
| 
								 | 
							
								        'cuisine_id'=>'integer',
							 | 
						||
| 
								 | 
							
								        // 'order_subscription'=>'boolean',
							 | 
						||
| 
								 | 
							
								        'order_subscription_active'=>'boolean',
							 | 
						||
| 
								 | 
							
								    ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected $appends = ['gst_status','gst_code'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * The attributes that should be hidden for arrays.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $hidden = [
							 | 
						||
| 
								 | 
							
								        'gst'
							 | 
						||
| 
								 | 
							
								    ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function transaction()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(OrderTransaction::class,'vendor_id','vendor_id');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function coupon()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(Coupon::class,'restaurant_id');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function restaurant_sub()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasOne(RestaurantSubscription::class)->where('status',1)->latest();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function restaurant_subs()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(RestaurantSubscription::class,'restaurant_id');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function restaurant_sub_trans()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasOne(SubscriptionTransaction::class)->latest();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function restaurant_sub_update_application()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasOne(RestaurantSubscription::class)->latest();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function vendor()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->belongsTo(Vendor::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function foods()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(Food::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function schedules()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(RestaurantSchedule::class)->orderBy('opening_time');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function deliverymen()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(DeliveryMan::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function orders()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(Order::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function discount()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasOne(Discount::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function zone()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->belongsTo(Zone::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function campaigns()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->belongsToMany(Campaign::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function itemCampaigns()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(ItemCampaign::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function reviews()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasManyThrough(Review::class, Food::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getScheduleOrderAttribute($value)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return (boolean)(\App\CentralLogics\Helpers::schedule_order()?$value:0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function getRatingAttribute($value)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $ratings = json_decode($value, true);
							 | 
						||
| 
								 | 
							
								        $rating5 = $ratings?$ratings[5]:0;
							 | 
						||
| 
								 | 
							
								        $rating4 = $ratings?$ratings[4]:0;
							 | 
						||
| 
								 | 
							
								        $rating3 = $ratings?$ratings[3]:0;
							 | 
						||
| 
								 | 
							
								        $rating2 = $ratings?$ratings[2]:0;
							 | 
						||
| 
								 | 
							
								        $rating1 = $ratings?$ratings[1]:0;
							 | 
						||
| 
								 | 
							
								        return [$rating5, $rating4, $rating3, $rating2, $rating1];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getGstStatusAttribute()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return (boolean)($this->gst?json_decode($this->gst, true)['status']:0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getGstCodeAttribute()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return (string)($this->gst?json_decode($this->gst, true)['code']:'');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function scopeDelivery($query)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $query->where('delivery',1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function scopeTakeaway($query)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $query->where('take_away',1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function scopeActive($query)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(!\App\CentralLogics\Helpers::commission_check()){
							 | 
						||
| 
								 | 
							
								            $query = $query->where('restaurant_model','!=','commission');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $query->where('status', 1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function scopeOpened($query)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $query->where('active', 1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function scopeWithOpen($query,$longitude,$latitude)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $query->selectRaw('*, IF(((select count(*) from `restaurant_schedule` where `restaurants`.`id` = `restaurant_schedule`.`restaurant_id` and `restaurant_schedule`.`day` = '.now()->dayOfWeek.' and `restaurant_schedule`.`opening_time` < "'.now()->format('H:i:s').'" and `restaurant_schedule`.`closing_time` >"'.now()->format('H:i:s').'") > 0), true, false) as open,ST_Distance_Sphere(point(longitude, latitude),point('.$longitude.', '.$latitude.')) as distance');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function scopeWeekday($query)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $query->where('off_day', 'not like', "%".now()->dayOfWeek."%");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected static function booted()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        static::addGlobalScope(new ZoneScope);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function scopeType($query, $type)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if($type == 'veg')
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return $query->where('veg', true);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if($type == 'non_veg')
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return $query->where('non_veg', true);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $query;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function scopeRestaurantModel($query, $type)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if($type == 'commission')
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return $query->where('restaurant_model', 'commission');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if($type == 'subscribed')
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return $query->where('restaurant_model', 'subscription');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if($type == 'unsubscribed')
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return $query->where('restaurant_model', 'unsubscribed');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $query;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function scopeCuisine($query, $cuisine_id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if($cuisine_id != 'all'){
							 | 
						||
| 
								 | 
							
								            return $query->whereHas('cuisine', function ($query) use ($cuisine_id){
							 | 
						||
| 
								 | 
							
								                $query->where('cuisine_restaurant.cuisine_id', $cuisine_id);
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								            return $query;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected static function boot()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        parent::boot();
							 | 
						||
| 
								 | 
							
								        static::created(function ($restaurant) {
							 | 
						||
| 
								 | 
							
								            $restaurant->slug = $restaurant->generateSlug($restaurant->name);
							 | 
						||
| 
								 | 
							
								            $restaurant->save();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    private function generateSlug($name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $slug = Str::slug($name);
							 | 
						||
| 
								 | 
							
								        if ($max_slug = static::where('slug', 'like',"{$slug}%")->latest('id')->value('slug')) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if($max_slug == $slug) return "{$slug}-2";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $max_slug = explode('-',$max_slug);
							 | 
						||
| 
								 | 
							
								            $count = array_pop($max_slug);
							 | 
						||
| 
								 | 
							
								            if (isset($count) && is_numeric($count)) {
							 | 
						||
| 
								 | 
							
								                $max_slug[]= ++$count;
							 | 
						||
| 
								 | 
							
								                return implode('-', $max_slug);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $slug;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function cuisine()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->belongsToMany(Cuisine::class);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function users()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->morphToMany(User::class ,'visitor_log' );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function schedule_today()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->hasMany(RestaurantSchedule::class)->orderBy('opening_time')->where('day',now()->dayOfWeek);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |