invoiceFactory = $invoiceFactory; $this->invoiceRepository = $invoiceRepository; $this->ticketRepository = $ticketRepository; $this->sponsorTicketRepository = $sponsorTicketRepository; } public function addTicketToSponsor(SponsorTicket $sponsorTicket, Ticket $ticket) { $invoice = $this->invoiceFactory->createInvoiceFromSponsorTicket($sponsorTicket); try { $this->invoiceRepository->startTransaction(); $this->invoiceRepository->save($invoice); $this->ticketRepository->save($ticket); $sponsorTicket->setUsedInvitations($sponsorTicket->getUsedInvitations()+1); $this->sponsorTicketRepository->save($sponsorTicket); $this->invoiceRepository->commit(); } catch (Exception $e) { $this->invoiceRepository->rollback(); } } public function removeTicketFromSponsor(SponsorTicket $sponsorTicket, Ticket $ticket) { $invoice = $this->invoiceFactory->createInvoiceFromSponsorTicket($sponsorTicket); if ($invoice->getReference() !== $ticket->getReference()) { throw new \RuntimeException(sprintf('Erreur: le ticket n\'est pas rattaché à ce token')); } try { $this->ticketRepository->startTransaction(); $this->ticketRepository->delete($ticket); $sponsorTicket->setUsedInvitations($sponsorTicket->getUsedInvitations()-1); $this->sponsorTicketRepository->save($sponsorTicket); $this->ticketRepository->commit(); } catch (Exception $e) { $this->ticketRepository->rollback(); } } public function doesTicketBelongsToSponsor(SponsorTicket $sponsorTicket, Ticket $ticket) { $invoice = $this->invoiceFactory->createInvoiceFromSponsorTicket($sponsorTicket); return ($ticket->getReference() === $invoice->getReference()); } public function getRegisteredTickets(SponsorTicket $sponsorTicket) { $invoice = $this->invoiceFactory->createInvoiceFromSponsorTicket($sponsorTicket); return $this->ticketRepository->getByReference($invoice->getReference()); } }