Event::payRegistration()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 10
nc 1
nop 1
1
<?php
2
3
/**
4
 * @author    Markus Tacker <[email protected]>
5
 * @copyright 2013-2016 Verein zur Förderung der Netzkultur im Rhein-Main-Gebiet e.V. | http://netzkultur-rheinmain.de/
6
 */
7
8
namespace BCRM\BackendBundle\Service;
9
10
use BCRM\BackendBundle\Entity\Event\Registration;
11
use BCRM\BackendBundle\Entity\Event\RegistrationRepository;
12
use BCRM\BackendBundle\Entity\Event\TicketRepository;
13
use BCRM\BackendBundle\Entity\Event\UnregistrationRepository;
14
use BCRM\BackendBundle\Event\Event\TicketDeletedEvent;
15
use BCRM\BackendBundle\Event\Event\TicketMailSentEvent;
16
use BCRM\BackendBundle\Event\Payment\PaymentVerifiedEvent;
17
use BCRM\BackendBundle\Event\Payment\RegistrationPaidEvent;
18
use BCRM\BackendBundle\Service\Event\ConfirmUnregistrationCommand;
19
use BCRM\BackendBundle\Service\Event\CreateTicketCommand;
20
use BCRM\BackendBundle\Service\Event\RegisterCommand;
21
use BCRM\BackendBundle\Service\Event\SendPaymentNotificationMailCommand;
22
use BCRM\BackendBundle\Service\Event\SendTicketMailCommand;
23
use BCRM\BackendBundle\Service\Event\SendUnregistrationConfirmationMailCommand;
24
use BCRM\BackendBundle\Service\Event\UnregisterCommand;
25
use BCRM\BackendBundle\Service\Event\UnregisterTicketCommand;
26
use BCRM\BackendBundle\Service\Mail\SendTemplateMailCommand;
27
use BCRM\BackendBundle\Service\Payment\PayRegistrationCommand;
28
use LiteCQRS\Bus\CommandBus;
29
use LiteCQRS\Bus\EventMessageBus;
30
use LiteCQRS\Plugin\CRUD\Model\Commands\CreateResourceCommand;
31
use LiteCQRS\Plugin\CRUD\Model\Commands\DeleteResourceCommand;
32
use LiteCQRS\Plugin\CRUD\Model\Commands\UpdateResourceCommand;
33
use PhpOption\Option;
34
use Psr\Log\LoggerAwareInterface;
35
use Psr\Log\LoggerInterface;
36
use Symfony\Component\Routing\RouterInterface;
37
use Symfony\Component\Security\Core\Util\SecureRandom;
38
use Endroid\QrCode\QrCode;
39
40
class Event implements LoggerAwareInterface
41
{
42
    /**
43
     * @var \LiteCQRS\Bus\CommandBus
44
     */
45
    private $commandBus;
46
47
    /**
48
     * @var \Symfony\Component\Routing\RouterInterface
49
     */
50
    private $router;
51
52
    /**
53
     * @var \BCRM\BackendBundle\Entity\Event\RegistrationRepository
54
     */
55
    private $registrationRepo;
56
57
    /**
58
     * @var \LiteCQRS\Bus\EventMessageBus
59
     */
60
    private $eventMessageBus;
61
62
    /**
63
     * @var \BCRM\BackendBundle\Entity\Event\UnregistrationRepository
64
     */
65
    private $unregistrationRepo;
66
67
    /**
68
     * @var \BCRM\BackendBundle\Entity\Event\TicketRepository
69
     */
70
    private $ticketRepo;
71
72
    /**
73
     * @var LoggerInterface
74
     */
75
    private $logger;
76
77
    /**
78
     * @param CommandBus      $commandBus
79
     * @param RouterInterface $router
80
     */
81
    public function __construct(CommandBus $commandBus, EventMessageBus $eventMessageBus, RouterInterface $router, RegistrationRepository $registrationRepo, UnregistrationRepository $unregistrationRepo, TicketRepository $ticketRepo)
82
    {
83
        $this->commandBus         = $commandBus;
84
        $this->eventMessageBus    = $eventMessageBus;
85
        $this->router             = $router;
86
        $this->registrationRepo   = $registrationRepo;
87
        $this->unregistrationRepo = $unregistrationRepo;
88
        $this->ticketRepo         = $ticketRepo;
89
    }
90
91
    /**
92
     * Sets a logger instance on the object
93
     *
94
     * @param LoggerInterface $logger
95
     *
96
     * @return null
97
     */
98
    public function setLogger(LoggerInterface $logger)
99
    {
100
        $this->logger = $logger;
101
    }
102
103
104
    public function register(RegisterCommand $command)
105
    {
106
        $createRegistrationCommand        = new CreateResourceCommand();
107
        $createRegistrationCommand->class = '\BCRM\BackendBundle\Entity\Event\Registration';
108
        $createRegistrationCommand->data  = array(
109
            'event'           => $command->event,
110
            'email'           => $command->email,
111
            'name'            => $command->name,
112
            'twitter'         => $command->twitter,
113
            'saturday'        => $command->saturday,
114
            'sunday'          => $command->sunday,
115
            'food'            => $command->food,
116
            'tags'            => $command->tags,
117
            'type'            => $command->type,
118
            'participantList' => $command->participantList,
119
            'uuid'            => $command->uuid,
120
            'paymentMethod'   => $command->payment,
121
            'donation'        => (int)$command->donation
122
        );
123
        $this->commandBus->handle($createRegistrationCommand);
124
    }
125
126
    public function sendPaymentNotificationMail(SendPaymentNotificationMailCommand $command)
127
    {
128
        $updateCommand        = new UpdateResourceCommand();
129
        $updateCommand->class = '\BCRM\BackendBundle\Entity\Event\Registration';
130
        $updateCommand->id    = $command->registration->getId();
131
        $updateCommand->data  = array('paymentNotified' => new \DateTime());
132
        $this->commandBus->handle($updateCommand);
133
134
        $emailCommand               = new SendTemplateMailCommand();
135
        $emailCommand->email        = $command->registration->getEmail();
136
        $emailCommand->template     = 'RegistrationPayment';
137
        $emailCommand->templateData = array(
138
            'registration' => $command->registration,
139
            'payment_link' => rtrim($command->schemeAndHost, '/') . $this->router->generate('bcrmweb_registration_payment', array('id' => $command->registration->getUuid()))
140
        );
141
        $this->commandBus->handle($emailCommand);
142
    }
143
144
    public function createTicket(CreateTicketCommand $command)
145
    {
146
        $sr   = new SecureRandom();
147
        $code = '';
148
        $max  = 6;
149
        while (strlen($code) < $max) {
150
            $seq = preg_replace('/[^A-Z0-9]/', '', $sr->nextBytes(256));
151
            for ($i = 0; $i < strlen($seq) && strlen($code) < $max; $i++) {
152
                $code .= $seq[$i];
153
            }
154
        }
155
        $createCommand        = new CreateResourceCommand();
156
        $createCommand->class = '\BCRM\BackendBundle\Entity\Event\Ticket';
157
        $createCommand->data  = array(
158
            'event' => $command->event,
159
            'email' => $command->registration->getEmail(),
160
            'name'  => $command->registration->getName(),
161
            'day'   => $command->day,
162
            'type'  => $command->registration->getType(),
163
            'code'  => $code,
164
        );
165
        $this->commandBus->handle($createCommand);
166
    }
167
168
    public function sendTicketMail(SendTicketMailCommand $command)
169
    {
170
        $qrCode = new QrCode();
171
        $qrCode->setText(
172
            rtrim($command->schemeAndHost, '/') . $this->router->generate(
173
                'bcrmweb_event_checkin',
174
                array('id' => $command->ticket->getId(), 'code' => $command->ticket->getCode())
175
            )
176
        );
177
178
        $qrCode->setSize(300);
179
        $qrCode->setPadding(10);
180
        $qrfile = tempnam(sys_get_temp_dir(), 'qrcode-') . '.png';
181
        $qrCode->render($qrfile);
182
183
        $emailCommand               = new SendTemplateMailCommand();
184
        $emailCommand->email        = $command->ticket->getEmail();
185
        $emailCommand->template     = 'Ticket';
186
        $emailCommand->templateData = array(
187
            'ticket'      => $command->ticket,
188
            'event'       => $command->event,
189
            'cancel_link' => rtrim($command->schemeAndHost, '/') . $this->router->generate(
190
                    'bcrmweb_event_cancel_ticket',
191
                    array('id' => $command->ticket->getId(), 'code' => $command->ticket->getCode())
192
                )
193
        );
194
        $registrationOptional = $this->registrationRepo->getRegistrationForEmail($command->event, $command->ticket->getEmail());
0 ignored issues
show
Documentation introduced by
$command->event is of type object<BCRM\BackendBundle\Service\Event>, but the function expects a object<BCRM\BackendBundle\Entity\Event\Event>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
195
        if ($registrationOptional->isDefined()) {
196
            $emailCommand->templateData['registration'] = $registrationOptional->get();
197
        }
198
        $emailCommand->image        = $qrfile;
199
        $emailCommand->format       = 'text/html';
200
        $this->commandBus->handle($emailCommand);
201
202
        $event         = new TicketMailSentEvent();
203
        $event->ticket = $command->ticket;
204
        $this->eventMessageBus->publish($event);
205
    }
206
207
    public function unregister(UnregisterCommand $command)
208
    {
209
        $createUnregistrationCommand        = new CreateResourceCommand();
210
        $createUnregistrationCommand->class = '\BCRM\BackendBundle\Entity\Event\Unregistration';
211
        $createUnregistrationCommand->data  = array(
212
            'event'     => $command->event,
213
            'email'     => $command->email,
214
            'saturday'  => $command->saturday,
215
            'sunday'    => $command->sunday,
216
            'confirmed' => $command->confirmed,
217
        );
218
        $this->commandBus->handle($createUnregistrationCommand);
219
    }
220
221
    public function sendUnregistrationConfirmationMail(SendUnregistrationConfirmationMailCommand $command)
222
    {
223
        $sr                   = new SecureRandom();
224
        $key                  = sha1($sr->nextBytes(256), false);
225
        $updateCommand        = new UpdateResourceCommand();
226
        $updateCommand->class = '\BCRM\BackendBundle\Entity\Event\Unregistration';
227
        $updateCommand->id    = $command->unregistration->getId();
228
        $updateCommand->data  = array('confirmationKey' => $key);
229
        $this->commandBus->handle($updateCommand);
230
231
        $emailCommand               = new SendTemplateMailCommand();
232
        $emailCommand->email        = $command->unregistration->getEmail();
233
        $emailCommand->template     = 'UnregistrationConfirmation';
234
        $emailCommand->templateData = array(
235
            'unregistration'    => $command->unregistration,
236
            'confirmation_link' => rtrim($command->schemeAndHost, '/') . $this->router->generate('bcrm_unregistration_confirm', array('id' => $command->unregistration->getId(), 'key' => $key))
237
        );
238
        $this->commandBus->handle($emailCommand);
239
    }
240
241 View Code Duplication
    public function confirmUnregistration(ConfirmUnregistrationCommand $command)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
242
    {
243
        $updateCommand        = new UpdateResourceCommand();
244
        $updateCommand->class = '\BCRM\BackendBundle\Entity\Event\Unregistration';
245
        $updateCommand->id    = $command->unregistration->getId();
246
        $updateCommand->data  = array('confirmed' => 1);
247
        $this->commandBus->handle($updateCommand);
248
    }
249
250
    public function unregisterTicket(UnregisterTicketCommand $command)
251
    {
252
        // Create a new registration matching the unregistration
253
        $registration = $this->registrationRepo->getRegistrationForEmail($command->event, $command->unregistration->getEmail());
254
        if ($registration->isDefined()) {
255
            /** @var Registration $r */
256
            $r                = $registration->get();
257
            $registrationData = array(
258
                'event'           => $command->event,
259
                'email'           => $command->unregistration->getEmail(),
260
                'name'            => $r->getName(),
261
                'twitter'         => $r->getTwitter(),
262
                'food'            => $r->getFood(),
263
                'tags'            => $r->getTags(),
264
                'confirmed'       => 1,
265
                'saturday'        => $r->getSaturday(),
266
                'sunday'          => $r->getSunday(),
267
                'participantList' => $r->isParticipantList(),
268
                'uuid'            => $r->getUuid(),
269
                'donation'        => $r->getDonation(),
270
                'payment'         => $r->getPayment(),
271
                'paymentMethod'   => $r->getPaymentMethod(),
272
            );
273
            if ($command->unregistration->getSaturday()) {
274
                $registrationData['saturday'] = false;
275
            }
276
            if ($command->unregistration->getSunday()) {
277
                $registrationData['sunday'] = false;
278
            }
279
            $createRegistrationCommand        = new CreateResourceCommand();
280
            $createRegistrationCommand->class = '\BCRM\BackendBundle\Entity\Event\Registration';
281
            $createRegistrationCommand->data  = $registrationData;
282
            $this->commandBus->handle($createRegistrationCommand);
283
        }
284
285
        // Delete tickets
286
        foreach ($this->ticketRepo->getTicketsForEmail($command->event, $command->unregistration->getEmail()) as $ticket) {
287
            if (
288
                ($ticket->isSaturday() && $command->unregistration->getSaturday())
289
                || ($ticket->isSunday() && $command->unregistration->getSunday())
290
            ) {
291
                $deleteTicketCommand        = new DeleteResourceCommand();
292
                $deleteTicketCommand->class = '\BCRM\BackendBundle\Entity\Event\Ticket';
293
                $deleteTicketCommand->id    = $ticket->getId();
294
                $this->commandBus->handle($deleteTicketCommand);
295
296
                $event         = new TicketDeletedEvent();
297
                $event->ticket = $ticket;
298
                $this->eventMessageBus->publish($event);
299
            }
300
        }
301
302
        // Mark unregistration as processed
303
        $updateCommand        = new UpdateResourceCommand();
304
        $updateCommand->class = '\BCRM\BackendBundle\Entity\Event\Unregistration';
305
        $updateCommand->id    = $command->unregistration->getId();
306
        $updateCommand->data  = array('processed' => true);
307
        $this->commandBus->handle($updateCommand);
308
    }
309
310
    /**
311
     * Once a payment has been verified, find the registration it belongs to and mark it as paid
312
     * so the tickets can be assigned.
313
     *
314
     * @param PaymentVerifiedEvent $event
315
     */
316
    public function onPaymentVerified(PaymentVerifiedEvent $event)
317
    {
318
        $payment              = $event->payment;
319
        $registrationOptional = $this->registrationRepo->findByUuid($payment->getPayload()->get('item_number'));
320 View Code Duplication
        if ($registrationOptional->isEmpty()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
321
            Option::fromValue($this->logger)->map(function (LoggerInterface $logger) use ($payment) {
322
                $logger->alert(sprintf('No registration found with uuid "%s"', $payment->getPayload()->get('item_number')), array($payment));
323
            });
324
            return;
325
        }
326
        $registration = $registrationOptional->get();
327
328
        $command               = new PayRegistrationCommand();
329
        $command->registration = $registration;
330
        $command->payment      = $payment;
331
        $this->payRegistration($command);
332
    }
333
334
    public function payRegistration(PayRegistrationCommand $command)
335
    {
336
        $updateCommand        = new UpdateResourceCommand();
337
        $updateCommand->class = '\BCRM\BackendBundle\Entity\Event\Registration';
338
        $updateCommand->id    = $command->registration->getId();
339
        $updateCommand->data  = array('payment' => $command->payment);
340
        $this->commandBus->handle($updateCommand);
341
342
        $event               = new RegistrationPaidEvent();
343
        $event->registration = $command->registration;
344
        $event->payment      = $command->payment;
345
        $this->eventMessageBus->publish($event);
346
    }
347
}
348