mirror of
https://github.com/nothingworksinc/ticketbeast.git
synced 2026-01-26 03:04:05 +00:00
139 lines
3.0 KiB
PHP
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);
|
|
}
|
|
}
|