MOON
Server: Apache
System: Linux e2e-78-16.ssdcloudindia.net 3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021 x86_64
User: imensosw (1005)
PHP: 8.0.30
Disabled: exec,passthru,shell_exec,system
Upload Files
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;
    }
}