@govindalohani
try
public function scopeWhereUserCanAccess(Builder $query, $periodType) {
$currentSubscriber = Auth::user()->subscriber_id;
$linkedAgenciesSubscribers = Auth::user()->subscriber->getLinkedAgencyIdsAttribute();
$subscriberIds = $linkedAgenciesSubscribers->merge($currentSubscriber);
$sidewaysSubscriberIds = Auth::user()->subscriber->getSidewaysAgenciesIdsAttribute();
$childrenCorporateIdsAndSelf = Auth::user()->subscriber->linkedChildrenCorporateIds->merge($currentSubscriber);
$query1 = $this->applyPeriodFilter($query, $periodType)
->with('subscriber')
->whereIn('properties.subscriber_id', $subscriberIds);
$query2 = $this->applyPeriodFilter(clone $query, $periodType)
->select('properties.*')
->with('subscriber')
->whereIn('properties.subscriber_id', $sidewaysSubscriberIds)
->join('presentation_property', 'presentation_property.property_id', '=', 'properties.id')
->join('presentations', 'presentations.id', '=', 'presentation_property.presentation_id')
->whereIn(DB::raw('COALESCE(properties.auction_booked_by, presentations.auction_booked_by)'), $childrenCorporateIdsAndSelf);
$properties = $query1->union($query2)->get();
return $properties;
}
public function scopeWherePast($query, $dateTime = null) {
$dateTime = $this->getUtcDateTimeString($dateTime);
return $query->whereHas('auctionDetail', function($query) use ($dateTime) {
$query->whereRaw("IF (properties.auction_type = 4, auction_end_date_time < ?, auction_date_time < ?)", [$dateTime, $dateTime]);
});
}
public function scopeWhereUpcoming($query, $dateTime = null) {
$dateTime = $this->getUtcDateTimeString($dateTime);
return $query->whereHas('auctionDetail', function($query) use ($dateTime) {
$query->whereRaw("IF (properties.auction_type = 4, auction_end_date_time >= ?, auction_date_time >= ?)", [$dateTime, $dateTime]);
});
}
private function applyPeriodFilter($query, $periodType) {
return $query->when($periodType == "past", function($query) {
return $query->wherePast();
}, function($query) {
return $query->whereUpcoming();
});
}
private function getUtcDateTimeString($dateTime) {
if ($dateTime == null) {
$dateTime = Carbon::today(Auth::user()->timezone)->startOfDay()->setTimezone('UTC')->toDateTimeString();
} else {
$dateTime = $dateTime->copy()->setTimezone('UTC')->toDateTimeString();
}
return $dateTime;
}
or
public function scopeWhereUserCanAccess(Builder $query, $periodType) {
$currentSubscriber = Auth::user()->subscriber_id;
$linkedAgenciesSubscribers = Auth::user()->subscriber->getLinkedAgencyIdsAttribute();
$sidewaysSubscriberIds = Auth::user()->subscriber->getSidewaysAgenciesIdsAttribute();
$childrenCorporateIdsAndSelf = Auth::user()->subscriber->linkedChildrenCorporateIds->merge($currentSubscriber);
$properties = $query
->when($periodType == "past", function($query) {
return $query->wherePast();
}, function($query) {
return $query->whereUpcoming();
})
->with('subscriber')
->whereIn('properties.subscriber_id', $linkedAgenciesSubscribers->merge($currentSubscriber))
->orWhereIn('properties.subscriber_id', $sidewaysSubscriberIds)
->join('presentation_property', 'presentation_property.property_id', '=', 'properties.id')
->join('presentations', 'presentations.id', '=', 'presentation_property.presentation_id')
->whereIn(DB::raw('COALESCE(properties.auction_booked_by, presentations.auction_booked_by)'), $childrenCorporateIdsAndSelf)
->select('properties.*')
->distinct()
->get();
return $properties;
}
public function scopeWherePast($query, $dateTime = null) {
$dateTime = $this->getUtcDateTimeString($dateTime);
return $query->whereHas('auctionDetail', function($query) use ($dateTime) {
$query->where(function($query) use ($dateTime) {
$query->where('properties.auction_type', 4)
->where('auction_end_date_time', '<', $dateTime);
})->orWhere(function($query) use ($dateTime) {
$query->where('properties.auction_type', '!=', 4)
->where('auction_date_time', '<', $dateTime);
});
});
}
public function scopeWhereUpcoming($query, $dateTime = null) {
$dateTime = $this->getUtcDateTimeString($dateTime);
return $query->whereHas('auctionDetail', function($query) use ($dateTime) {
$query->where(function($query) use ($dateTime) {
$query->where('properties.auction_type', 4)
->where('auction_end_date_time', '>=', $dateTime);
})->orWhere(function($query) use ($dateTime) {
$query->where('properties.auction_type', '!=', 4)
->where('auction_date_time', '>=', $dateTime);
});
});
}
private function getUtcDateTimeString($dateTime) {
if ($dateTime == null) {
$dateTime = Carbon::today(Auth::user()->timezone)->startOfDay()->setTimezone('UTC')->toDateTimeString();
} else {
$dateTime = $dateTime->copy()->setTimezone('UTC')->toDateTimeString();
}
return $dateTime;
}