85 - Storing Charge Details with Orders

This commit is contained in:
Adam Wathan
2017-03-17 12:53:42 -04:00
parent 8c8d05a353
commit 44db85bdb0
3 changed files with 11 additions and 9 deletions

View File

@@ -9,12 +9,13 @@ class Order extends Model
{ {
protected $guarded = []; protected $guarded = [];
public static function forTickets($tickets, $email, $amount) public static function forTickets($tickets, $email, $charge)
{ {
$order = self::create([ $order = self::create([
'confirmation_number' => OrderConfirmationNumber::generate(), 'confirmation_number' => OrderConfirmationNumber::generate(),
'email' => $email, 'email' => $email,
'amount' => $amount, 'amount' => $charge->amount(),
'card_last_four' => $charge->cardLastFour(),
]); ]);
$order->tickets()->saveMany($tickets); $order->tickets()->saveMany($tickets);

View File

@@ -30,9 +30,9 @@ class Reservation
public function complete($paymentGateway, $paymentToken) public function complete($paymentGateway, $paymentToken)
{ {
$paymentGateway->charge($this->totalCost(), $paymentToken); $charge = $paymentGateway->charge($this->totalCost(), $paymentToken);
return Order::forTickets($this->tickets(), $this->email(), $this->totalCost()); return Order::forTickets($this->tickets(), $this->email(), $charge);
} }
public function cancel() public function cancel()

View File

@@ -4,6 +4,7 @@ use App\Order;
use App\Ticket; use App\Ticket;
use App\Concert; use App\Concert;
use App\Reservation; use App\Reservation;
use App\Billing\Charge;
use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Foundation\Testing\DatabaseTransactions;
@@ -14,17 +15,17 @@ class OrderTest extends TestCase
use DatabaseMigrations; use DatabaseMigrations;
/** @test */ /** @test */
function creating_an_order_from_tickets_email_and_amount() function creating_an_order_from_tickets_email_and_charge()
{ {
$concert = factory(Concert::class)->create()->addTickets(5); $tickets = factory(Ticket::class, 3)->create();
$this->assertEquals(5, $concert->ticketsRemaining()); $charge = new Charge(['amount' => 3600, 'card_last_four' => '1234']);
$order = Order::forTickets($concert->findTickets(3), 'john@example.com', 3600); $order = Order::forTickets($tickets, 'john@example.com', $charge);
$this->assertEquals('john@example.com', $order->email); $this->assertEquals('john@example.com', $order->email);
$this->assertEquals(3, $order->ticketQuantity()); $this->assertEquals(3, $order->ticketQuantity());
$this->assertEquals(3600, $order->amount); $this->assertEquals(3600, $order->amount);
$this->assertEquals(2, $concert->ticketsRemaining()); $this->assertEquals('1234', $order->card_last_four);
} }
/** @test */ /** @test */