/** * @param ISummit $summit * @param $ticket_id * @param $member_id * @return mixed */ public function reassignTicket(ISummit $summit, $ticket_id, $member_id) { $attendee_repository = $this->attendee_repository; return $this->tx_service->transaction(function () use($summit, $ticket_id, $member_id, $attendee_repository) { if (!$ticket_id) { throw new EntityValidationException('missing required param: id'); } $attendee = $attendee_repository->getByMemberAndSummit($member_id, $summit->getIdentifier()); $ticket = SummitAttendeeTicket::get_by_id('SummitAttendeeTicket', $ticket_id); $previous_owner = $ticket->Owner(); if ($attendee) { if ($attendee->Tickets()->count() > 0) { throw new EntityValidationException('This member is already assigned to another tix'); } else { $previous_owner->Tickets()->remove($ticket); $attendee->Tickets()->add($ticket); } } else { $previous_owner->Tickets()->remove($ticket); $attendee = new SummitAttendee(); $attendee->MemberID = $member_id; $attendee->SummitID = $summit->getIdentifier(); $attendee->Tickets()->add($ticket); } $attendee->write(); // if the attendee has no more tickets we delete it if ($previous_owner->Tickets()->count() == 0) { $previous_owner->delete(); } return $attendee; }); }