File: /home/imensosw/public_html/mpl.imenso.co/app/Models/VenueAvailability.php
<?php
namespace App\Models;
use App\Events\VenueMakesDateAvailable;
use App\Events\VenueMakesDateRangeAvailable;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class VenueAvailability extends Model
{
protected $table = 'venue_availabilities';
protected $casts = [
'availability_at' => 'datetime',
'doors_at' => 'datetime',
'curfew_at' => 'datetime',
'availability_at' => 'datetime',
];
public function genres()
{
return $this->belongsToMany(\App\Models\Genre::class, 'venue_availability_genres', 'availability_id');
}
public function venue()
{
return $this->belongsTo(\App\Models\User::class, 'venue_id');
}
public function promoters()
{
return $this->belongsToMany(\App\Models\User::class, 'venue_availability_promoters', 'availability_id', 'promoter_id');
}
public function hasPromoter(User $promoter)
{
if ($this->promoters()->where('id', $promoter->id)->get()->count() > 0) {
return true;
}
return false;
}
public function formattedDate()
{
return $this->availability_at->format('d/m/Y');
}
public static function addNew($data)
{
$format = 'd/m/Y';
$start_date = Carbon::createFromFormat($format, $data->start_date);
$format = 'd/m/Y';
$end_date = Carbon::createFromFormat($format, $data->end_date);
$group_id = Auth::user()->id.'-'.strtotime(Carbon::now());
$first_avail = '';
$last_avail = '';
$start_date_cloned = clone $start_date;
for ($date = $start_date_cloned; $date->lte($end_date); $date->addDay()) {
$avail = new self;
$avail->group_id = $group_id;
$avail->venue_id = Auth::user()->id;
$avail->min_attendees = $data->min_attendees;
$avail->capacity = $data->capacity;
$avail->multiple_rooms = $data->multiple_rooms;
$avail->hire_only = $data->hire_only;
$avail->hire_cost = $data->hire_cost;
if ($data->hire_cost != 'Price') {
$avail->hire_amount = null;
} else {
$avail->hire_amount = $data->hire_amount;
}
$avail->merchandise_charge = $data->merchandise_charge;
$avail->dressing_rooms = $data->dressing_rooms;
$avail->lighting = $data->lighting;
$avail->vinyl_decks = $data->vinyl_decks;
$avail->internal_promotion = $data->internal_promotion;
$avail->age_limit = $data->age_limit;
$avail->parking = $data->parking;
$avail->parking_details = $data->parking_details;
$avail->catering = $data->catering;
$avail->box_office = $data->box_office;
$avail->wifi = $data->wifi;
$avail->guest_list_allowance = $data->guest_list_allowance;
$avail->bio = $data->bio;
$avail->pa_included = $data->pa_included;
$avail->security_included = $data->security_included;
if ($data->security_included == 1) {
$avail->cost_per_security = null;
} else {
$avail->cost_per_security = $data->cost_per_security;
}
$avail->promoter_preference = $data->promoter_preference;
$avail->save();
if ($data->promoter_preference == 1 && $data->promoter) {
foreach ($data->promoter as $id => $promoter) {
VenueAvailabilityPromoter::addnew($id, $avail->id);
}
}
$avail->curfew_at = Carbon::parse($date->format('Y-m-d').' '.$data->curfew);
$avail->doors_at = Carbon::parse($date->format('Y-m-d').' '.$data->doors);
$avail->max_bands = $data->max_bands;
$avail->save();
if ($data->genre_preference == 1 && isset($data->genres)) {
$avail->genre_preference = 1;
$genres = explode(':', $data->genres);
foreach ($genres as $g) {
VenueAvailabilityGenre::addnew($g, $avail->id);
}
}
$date->setTime(0, 0, 0);
$avail->availability_at = $date;
$avail->save();
$start_date = $start_date->setTime(0, 0, 0);
$end_date = $end_date->setTime(0, 0, 0);
if ($date == $start_date) {
$first_avail = $avail;
} elseif ($date == $end_date) {
$last_avail = $avail;
}
if ($start_date == $end_date) {
event(new VenueMakesDateAvailable($avail));
} elseif ($first_avail && $last_avail) {
event(new VenueMakesDateRangeAvailable($first_avail, $last_avail));
}
}
}
public static function addForPencil($date)
{
$preference = VenueAvailabilityPreference::where('venue_id', Auth::user()->id)->first();
$group_id = Auth::user()->id.'-'.strtotime(Carbon::now());
$first_avail = '';
$last_avail = '';
$avail = new self;
$avail->group_id = $group_id;
$avail->venue_id = Auth::user()->id;
$avail->min_attendees = $preference->min_attendees;
$avail->capacity = $preference->capacity;
$avail->multiple_rooms = $preference->multiple_rooms;
$avail->hire_only = $preference->hire_only;
$avail->hire_cost = $preference->hire_cost;
if ($preference->hire_cost != 'Price') {
$avail->hire_amount = null;
} else {
$avail->hire_amount = $preference->hire_amount;
}
$avail->merchandise_charge = $preference->merchandise_charge;
$avail->dressing_rooms = $preference->dressing_rooms;
$avail->lighting = $preference->lighting;
$avail->vinyl_decks = $preference->vinyl_decks;
$avail->internal_promotion = $preference->internal_promotion;
$avail->age_limit = $preference->age_limit;
$avail->parking = $preference->parking;
$avail->parking_details = $preference->parking_details;
$avail->catering = $preference->catering;
$avail->box_office = $preference->box_office;
$avail->wifi = $preference->wifi;
$avail->guest_list_allowance = $preference->guest_list_allowance;
$avail->bio = $preference->bio;
$avail->pa_included = $preference->pa_included;
$avail->cost_per_security = $preference->cost_per_security;
$avail->security_included = $preference->security_included;
if ($preference->security_included == 1) {
$avail->cost_per_security = null;
} else {
$avail->cost_per_security = $preference->cost_per_security;
}
$avail->promoter_preference = $preference->promoter_preference;
$avail->save();
if ($preference->promoter_preference == 1) {
$preferencePromos = VenueAvailabilityPreferencePromoter::where('preference_id', $preference->id)->get();
foreach ($preferencePromos as $id => $promoter) {
VenueAvailabilityPromoter::addnew($promoter->promoter_id, $avail->id);
}
}
$avail->curfew_at = Carbon::parse($date->format('Y-m-d').' '.$preference->curfew);
$avail->doors_at = Carbon::parse($date->format('Y-m-d').' '.$preference->doors);
$avail->max_bands = $preference->max_bands;
$avail->save();
if ($preference->genre_preference == 1) {
$avail->genre_preference = 1;
$preferenceGenres = VenueAvailabilityPreferenceGenre::where('preference_id', $preference->id)->get();
foreach ($preferenceGenres as $g) {
VenueAvailabilityGenre::addnew($g->genre_id, $avail->id);
}
}
$date->setTime(0, 0, 0);
$avail->availability_at = $date;
$avail->save();
}
public function remove()
{
foreach ($this->genres as $g) {
DB::table('venue_availability_genres')->where('availability_id', $this->id)->delete();
}
foreach ($this->promoters as $p) {
DB::table('venue_availability_promoters')->where('availability_id', $this->id)->delete();
}
$this->delete();
}
public function firstInGroup()
{
$group_id = $this->group_id;
$avail = self::where('group_id', $group_id)->orderBy('availability_at')->first();
return $avail;
}
public function lastInGroup()
{
$group_id = $this->group_id;
$avail = self::where('group_id', $group_id)->orderByDesc('availability_at')->first();
return $avail;
}
}