Files
ticketbeast/app/Concert.php
2017-11-14 12:14:34 -05:00

139 lines
3.0 KiB
PHP

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use App\Exceptions\NotEnoughTicketsException;
class Concert extends Model
{
protected $guarded = [];
protected $dates = ['date'];
public function user()
{
return $this->belongsTo(User::class);
}
public function attendeeMessages()
{
return $this->hasMany(AttendeeMessage::class);
}
public function scopePublished($query)
{
return $query->whereNotNull('published_at');
}
public function isPublished()
{
return $this->published_at !== null;
}
public function publish()
{
$this->update(['published_at' => $this->freshTimestamp()]);
$this->addTickets($this->ticket_quantity);
}
public function getFormattedDateAttribute()
{
return $this->date->format('F j, Y');
}
public function getFormattedStartTimeAttribute()
{
return $this->date->format('g:ia');
}
public function getTicketPriceInDollarsAttribute()
{
return number_format($this->ticket_price / 100, 2);
}
public function orders()
{
return Order::whereIn('id', $this->tickets()->pluck('order_id'));
}
public function hasOrderFor($customerEmail)
{
return $this->orders()->where('email', $customerEmail)->count() > 0;
}
public function ordersFor($customerEmail)
{
return $this->orders()->where('email', $customerEmail)->get();
}
public function tickets()
{
return $this->hasMany(Ticket::class);
}
public function reserveTickets($quantity, $email)
{
$tickets = $this->findTickets($quantity)->each(function ($ticket) {
$ticket->reserve();
});
return new Reservation($tickets, $email);
}
public function findTickets($quantity)
{
$tickets = $this->tickets()->available()->take($quantity)->get();
if ($tickets->count() < $quantity) {
throw new NotEnoughTicketsException;
}
return $tickets;
}
public function addTickets($quantity)
{
foreach (range(1, $quantity) as $i) {
$this->tickets()->create([]);
}
return $this;
}
public function ticketsRemaining()
{
return $this->tickets()->available()->count();
}
public function ticketsSold()
{
return $this->tickets()->sold()->count();
}
public function totalTickets()
{
return $this->tickets()->count();
}
public function percentSoldOut()
{
return number_format(($this->ticketsSold() / $this->totalTickets()) * 100, 2);
}
public function revenueInDollars()
{
return $this->orders()->sum('amount') / 100;
}
public function hasPoster()
{
return $this->poster_image_path !== null;
}
public function posterUrl()
{
return Storage::disk('public')->url($this->poster_image_path);
}
}