Ticket::loadPurchase()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
ccs 0
cts 3
cp 0
crap 2
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: imhotek
5
 * Date: 28/11/16
6
 * Time: 21:37
7
 */
8
9
namespace ConferenceTools\Tickets\Domain\CommandHandler;
10
11
use Carnage\Cqrs\Aggregate\Identity\GeneratorInterface;
12
use Carnage\Cqrs\MessageHandler\AbstractMethodNameMessageHandler;
13
use Carnage\Cqrs\Persistence\Repository\RepositoryInterface;
14
use ConferenceTools\Tickets\Domain\Command\Ticket\AssignToDelegate;
15
use ConferenceTools\Tickets\Domain\Command\Ticket\CancelTicket;
16
use ConferenceTools\Tickets\Domain\Command\Ticket\CompletePurchase;
17
use ConferenceTools\Tickets\Domain\Command\Ticket\MakePayment;
18
use ConferenceTools\Tickets\Domain\Command\Ticket\ReserveTickets;
19
use ConferenceTools\Tickets\Domain\Command\Ticket\TimeoutPurchase;
20
use ConferenceTools\Tickets\Domain\Model\Ticket\TicketPurchase;
21
use ConferenceTools\Tickets\Domain\Service\Configuration;
22
use ConferenceTools\Tickets\Domain\ValueObject\Basket;
23
use ConferenceTools\Tickets\Domain\ValueObject\TicketReservation;
24
25
class Ticket extends AbstractMethodNameMessageHandler
26
{
27
    /**
28
     * @var GeneratorInterface
29
     */
30
    private $identityGenerator;
31
    /**
32
     * @var GeneratorInterface
33
     */
34
    private $ticketIdGenerator;
35
36
    /**
37
     * @var RepositoryInterface
38
     */
39
    private $repository;
40
    /**
41
     * @var Configuration
42
     */
43
    private $configuration;
44
45
    public function __construct(
46
        GeneratorInterface $identityGenerator,
47
        GeneratorInterface $ticketIdGenerator,
48
        RepositoryInterface $repository,
49
        Configuration $configuration
50
    ) {
51
52
        $this->identityGenerator = $identityGenerator;
53
        $this->ticketIdGenerator = $ticketIdGenerator;
54
        $this->repository = $repository;
55
        $this->configuration = $configuration;
56
    }
57
58
    /**
59
     * @TODO can we refactor the command to pass a basket directly?
60
     * @param ReserveTickets $command
61
     */
62
    protected function handleReserveTickets(ReserveTickets $command)
63
    {
64
        $tickets = [];
65
        foreach ($command->getReservationRequests() as $reservationRequest) {
66
            for ($i = 0; $i < $reservationRequest->getQuantity(); $i++) {
67
                $tickets[] = new TicketReservation($reservationRequest->getTicketType(), $this->ticketIdGenerator->generateIdentity());
68
            }
69
        }
70
71
        if (count($tickets) === 0) {
72
            throw new \RuntimeException('Must specify at least 1 ticket for purchase');
73
        }
74
75
        if ($command->hasDiscountCode()) {
76
            $basket = Basket::fromReservationsWithDiscount(
77
                $this->configuration,
78
                $command->getDiscountCode(),
79
                ...$tickets
80
            );
81
        } else {
82
            $basket = Basket::fromReservations($this->configuration, ...$tickets);
83
        }
84
        $purchase = TicketPurchase::create($this->identityGenerator->generateIdentity(), $basket);
85
86
        $this->repository->save($purchase);
87
    }
88
    
89
    protected function handleMakePayment(MakePayment $command)
90
    {
91
        $purchase = $this->loadPurchase($command->getPurchaseId());
92
        $purchase->markAsPaid($command->getPurchaserEmail());
93
        $this->repository->save($purchase);
94
    }
95
96
    protected function handleTimeoutPurchase(TimeoutPurchase $command)
97
    {
98
        $purchase = $this->loadPurchase($command->getPurchaseId());
99
        $purchase->timeoutPurchase();
100
        $this->repository->save($purchase);
101
    }
102
    
103
    protected function handleAssignToDelegate(AssignToDelegate $command)
104
    {
105
        $purchase = $this->loadPurchase($command->getPurchaseId());
106
        $purchase->assignTicketToDelegate($command->getTicketId(), $command->getDelegate());
107
        $this->repository->save($purchase);
108
    }
109
    
110
    protected function handleCompletePurchase(CompletePurchase $command)
111
    {
112
        $purchase = $this->loadPurchase($command->getPurchaseId());
113
        $purchase->completePurchase($command->getPurchaseEmail(), ...$command->getDelegateInformation());
114
        $this->repository->save($purchase);
115
    }
116
117
    protected function handleCancelTicket(CancelTicket $command)
118
    {
119
        $purchase = $this->loadPurchase($command->getPurchaseId());
120
        $purchase->cancelTicket($command->getTicketId());
121
        $this->repository->save($purchase);
122
    }
123
    
124
    /**
125
     * @param string $purchaseId
126
     * @return TicketPurchase
127
     */
128
    private function loadPurchase(string $purchaseId): TicketPurchase
129
    {
130
        $purchase = $this->repository->load($purchaseId);
131
        return $purchase;
132
    }
133
}