Edit File: Store.php
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Cache; use Spatie\Translatable\HasTranslations; use App\Models\Setting; use App\Http\Resources\StoreResource; use DateTime; use Illuminate\Database\Eloquent\SoftDeletes; use App\Traits\Uploadable; use Str; use Carbon\Carbon; class Store extends Model { use HasFactory,Uploadable, HasTranslations; use SoftDeletes; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = ['store_id', 'refuse_reason' ,'image','iban_image' , 'bank_number' ,'name','icon','cover','lat','long','address','num_rating','rate','citc_authority_id','category','offer','offer_image','offer_amount','offer_type','offer_max','available','join_request','seen','status','special','has_contract','user_id','app_commission','commission_type','commercial_id','commercial_image','bank_name','bank_owner_name','iban_number']; protected $guarded = []; public $translatable = ['name']; protected function asJson($value) { return json_encode($value, JSON_UNESCAPED_UNICODE); } public function scopeSearch($query, $searchArray = []) { $query->where(function ($query) use ($searchArray) { if ($searchArray) { foreach ($searchArray as $key => $value) { if (str_contains($key, '_id')) { if (null != $value) { $query->Where($key, $value); } } elseif ('order' == $key) { } elseif ('created_at_min' == $key) { if (null != $value) { $query->WhereDate('created_at', '>=', $value); } } elseif ('created_at_max' == $key) { if (null != $value) { $query->WhereDate('created_at', '<=', $value); } }elseif ('name' == $key) { if (null != $value) { $query->Where('name->ar', $value) ->orWhere('name->en',$value); } } elseif('order' != $key) { $query->Where($key, 'like', '%' . $value . '%'); } } } }); return $query->orderBy('created_at', request()->searchArray && request()->searchArray['order'] ? request()->searchArray['order'] : 'DESC'); } public function getIconPathAttribute() { if ($this->parent){ return asset('assets/uploads/stores/' . $this->parent->icon); } return asset('assets/uploads/stores/' . $this->icon); } public function getCoverPathAttribute() { return asset('assets/uploads/stores/' . $this->cover); } public function getOfferPathAttribute() { return asset('assets/uploads/stores/' . $this->offer_image); } public function getCommercialImagePathAttribute() { return asset('assets/uploads/stores/' . $this->commercial_image); } public static function boot() { parent::boot(); /* creating, created, updating, updated, deleting, deleted, forceDeleted, restored */ self::deleted(function ($model) { $model->deleteFile($model->attributes['icon'], 'stores'); $model->deleteFile($model->attributes['cover'], 'stores'); }); } public function subcategories(){ return $this->belongsToMany(Category::class , 'user_categories' , 'store_id' , 'category_id'); } public function isFather() { return is_null($this->attributes['store_id']); } protected $appends = ['is_father']; public function getIsFatherAttribute() { return is_null($this->attributes['store_id']); } public function parent() { return $this->belongsTo(Store::class, 'store_id', 'id'); } public function branches() { return $this->hasMany(Store::class); } public function timings(){ return $this->hasMany(StoreTiming::class); } public function reviews(){ return $this->hasMany(Review::class,'store_id'); } public function rating(){ $reviewsCount = $this->reviews()->count(); if($reviewsCount == 0){ return number_format(0,2); } $reviews = $this->reviews; $sum = 0; foreach($reviews as $review){ $sum+=$review->rate; } return number_format(round($sum/$reviewsCount,2),2); } public function openingHours($lang = 'ar'){ $days = ['saturday','sunday','monday','tuesday','wednesday','thursday','friday']; $open_status = false; $current_day = lcfirst(date('l')); $opening_hours_arr = []; foreach($days as $day){ $timings = $this->timings()->where('day',$day)->get(); if(count($timings) == 0){ $opening_hours_arr[]=[ 'day' => trans('stores.'.$day), 'time' => trans('stores.closed'), 'status' => false, ]; }else{ $i = 0; $opening_hours_= trans('stores.'.$day).": "; foreach($timings as $timing){ $from = $lang == 'ar'? ($timing->from > 11 ? date('h:i \م',strtotime($timing->from)) : date('h:i \ص',strtotime($timing->from))) : date('h:i a',strtotime($timing->from)); $fromEN=date('h:i a',strtotime($timing->from)); $toEN=date('h:i a',strtotime($timing->to)); $to = $lang == 'ar' ? ($timing->to > 11 ? date('h:i \م',strtotime($timing->to)) : date('h:i \ص',strtotime($timing->to))) : date('h:i a',strtotime($timing->to)) ; if($day == $current_day){ $current_time = date('h:i a'); $date1 = DateTime::createFromFormat('h:i a', $current_time); $date2 = DateTime::createFromFormat('h:i a', $fromEN); $date3 = DateTime::createFromFormat('h:i a', $toEN); if ($date1 >= $date2 && $date1 <= $date3) { $open_status = true; } } if(++$i === count($timings)) { $opening_hours_arr[]=[ 'day' => trans('stores.'.$day), 'time' => $from." ".trans('stores.to')." ".$to, 'status' => $open_status, ]; }else{ $opening_hours_arr[]=[ 'day' => trans('stores.'.$day), 'time' => $from." ".trans('stores.to')." ".$to." ".trans('stores.and')." ", 'status' => $open_status, ]; } } } } return [ 'opening_hours_arr' =>$opening_hours_arr, 'open_status' =>$open_status ]; } public function todayOpeningHours($lang = 'ar'){ $day = Str::lower(Carbon::today()->format('l')); $open_status = false; $today = StoreTiming::where('day' , $day)->where('store_id' , $this->id)->first(); if(! $today){ $time = [ 'day' => trans('stores.'.$day), 'time' => trans('stores.closed'), 'status' => false, ]; return $time ; } $from = $lang == 'ar'? ($today->from > 11 ? date('h:i \م',strtotime($today->from)) : date('h:i \ص',strtotime($today->from))) : date('h:i a',strtotime($today->from)); $to = $lang == 'ar' ? ($today->to > 11 ? date('h:i \م',strtotime($today->to)) : date('h:i \ص',strtotime($today->to))) : date('h:i a',strtotime($today->to)) ; $fromEN=date('h:i a',strtotime($today->from)); $toEN=date('h:i a',strtotime($today->to)); $current_time = date('h:i a'); $date1 = DateTime::createFromFormat('h:i a', $current_time); $date2 = DateTime::createFromFormat('h:i a', $fromEN); $date3 = DateTime::createFromFormat('h:i a', $toEN); if ($date1 >= $date2 && $date1 <= $date3) { $open_status = true; } $time = [ 'day' => trans('stores.'.$day), 'time' => $from." ".trans('stores.to')." ".$to, 'status' => $open_status, ]; return $time ; } public function dayOpeningHours($date ,$time, $lang = 'ar'){ $day = Str::lower(Carbon::parse($date)->format('l')); $open_status = false; $today = StoreTiming::where('day' , $day)->where('store_id' , $this->id)->first(); if(! $today){ return false; } if ($today->is_closed == 'true') { return false; } $fromEN=date('h:i a',strtotime($today->from)); $toEN=date('h:i a',strtotime($today->to)); $timeEn=date('h:i a',strtotime($time)); $current_time = date('h:i a'); $now = DateTime::createFromFormat('h:i a' , $current_time); $date1 = DateTime::createFromFormat('h:i a', $timeEn); $date2 = DateTime::createFromFormat('h:i a', $fromEN); $date3 = DateTime::createFromFormat('h:i a', $toEN); if ($date1 >= $date2 && $date1 <= $date3) { return true; } return false; } public function storeOpeningHours() { $days = ['saturday', 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday']; $opening= []; foreach ($days as $key=>$day) { $time = $this->timings()->where('day', $day)->first(); info($this->id); info($day); info($time); if ($time) { info($time); $opening[] = [ 'id'=>$key, 'key'=>$day, 'day' => trans('stores.' . $time->day), 'from' => $time->from ? date('h:i a', strtotime($time->from)) : '', 'from_time' => $time->from ? date('H:i', strtotime($time->from)) : '', 'to' => $time->to ? date('h:i a', strtotime($time->to)) : '', 'to_time' => $time->to ? date('H:i', strtotime($time->to)) : '', 'is_closed' => $time->is_closed == 'true' ? true : false, ]; }else{ $opening[] = [ 'id' => $key, 'key' => $day, 'day' => trans('stores.' . $day), 'from' => '', 'from_time' => '', 'to' => '', 'to_time' => '', 'is_closed' => true, ]; } } return $opening; } public function menuCategories(){ return $this->hasMany(StoreMenuCategory::class); } public function menuGoogles(){ return $this->hasMany(StoreMenu::class,'store_id'); } public function products(){ return $this->hasMany(Product::class); } public function productAdditiveCategories(){ return $this->hasMany(ProductAdditiveCategory::class); } /** * Get the user that owns the Store * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user() { return $this->belongsTo(User::class, 'user_id', 'id'); } public function categories() { return $this->hasMany(UserCategory::class); } public function cachedMenusWithProducts(){ return Cache::rememberForever('store-' . $this->id, function () { return new StoreResource($this->load('menuCategories')); }); } public function orders() { return $this->hasMany(Order::class); } public function updateCacheWithProducts(){ Cache::forget('store-'.$this->id); $this->cachedMenusWithProducts(); } public function getCategory(){ if ($this->store_id){ return Category::where('slug',$this->parent->category)->first()?->name; } return Category::where('slug',$this->category)->first()?->name; } public function getSubCategory(){ if ($this->store_id){ return Category::where('id',$this->parent->subcategory_id)->first()?->name; } return Category::where('id',$this->subcategory_id)->first()?->name; } }
Back to File Manager