diff --git a/app/Concert.php b/app/Concert.php index b71ca09..dd39c94 100644 --- a/app/Concert.php +++ b/app/Concert.php @@ -34,14 +34,32 @@ class Concert extends Model return $this->hasMany(Order::class); } + public function tickets() + { + return $this->hasMany(Ticket::class); + } + public function orderTickets($email, $ticketQuantity) { $order = $this->orders()->create(['email' => $email]); + $tickets = $this->tickets()->take($ticketQuantity)->get(); - foreach (range(1, $ticketQuantity) as $i) { - $order->tickets()->create([]); + foreach ($tickets as $ticket) { + $order->tickets()->save($ticket); } return $order; } + + public function addTickets($quantity) + { + foreach (range(1, $quantity) as $i) { + $this->tickets()->create([]); + } + } + + public function ticketsRemaining() + { + return $this->tickets()->whereNull('order_id')->count(); + } } diff --git a/database/migrations/2016_11_08_210440_create_tickets_table.php b/database/migrations/2016_11_08_210440_create_tickets_table.php index a4cc2ef..383c51f 100644 --- a/database/migrations/2016_11_08_210440_create_tickets_table.php +++ b/database/migrations/2016_11_08_210440_create_tickets_table.php @@ -15,7 +15,8 @@ class CreateTicketsTable extends Migration { Schema::create('tickets', function (Blueprint $table) { $table->increments('id'); - $table->unsignedInteger('order_id'); + $table->unsignedInteger('concert_id'); + $table->unsignedInteger('order_id')->nullable(); $table->timestamps(); }); } diff --git a/tests/unit/ConcertTest.php b/tests/unit/ConcertTest.php index 9e933d8..9d1769f 100644 --- a/tests/unit/ConcertTest.php +++ b/tests/unit/ConcertTest.php @@ -64,4 +64,24 @@ class ConcertTest extends TestCase $this->assertEquals('jane@example.com', $order->email); $this->assertEquals(3, $order->tickets()->count()); } + + /** @test */ + function can_add_tickets() + { + $concert = factory(Concert::class)->create(); + + $concert->addTickets(50); + + $this->assertEquals(50, $concert->ticketsRemaining()); + } + + /** @test */ + function tickets_remaining_does_not_include_tickets_associated_with_an_order() + { + $concert = factory(Concert::class)->create(); + $concert->addTickets(50); + $concert->orderTickets('jane@example.com', 30); + + $this->assertEquals(20, $concert->ticketsRemaining()); + } }