/** * @param $data * @param IMessageSenderService $sender_service * @return mixed */ public function addRSVP($data, IMessageSenderService $sender_service) { $rsvp_repository = $this->rsvp_repository; $attendee_repository = $this->attendee_repository; $summitevent_repository = $this->summitevent_repository; return $this->tx_manager->transaction(function () use($data, $attendee_repository, $rsvp_repository, $summitevent_repository, $sender_service) { $member_id = intval($data['member_id']); $summit_id = intval($data['summit_id']); $event_id = intval($data['event_id']); $seat_type = $data['seat_type']; if (empty($seat_type)) { throw new EntityValidationException("invalid seat type!"); } $event = $summitevent_repository->getById($event_id); $summit_attendee = $attendee_repository->getByMemberAndSummit(intval($member_id), intval($summit_id)); if (is_null($summit_attendee)) { throw new EntityValidationException(sprintf("there is no any attendee for member %s and summit %s", $member_id, $summit_id)); } if (!$event) { throw new NotFoundEntityException('Event', ''); } if (!$event->RSVPTemplate()) { throw new EntityValidationException('RSVPTemplate not set'); } // add to schedule the RSVP event if (!$summit_attendee->isScheduled($event_id)) { $summit_attendee->addToSchedule($event); } $old_rsvp = $rsvp_repository->getByEventAndAttendee($event_id, $summit_attendee->getIdentifier()); if (!is_null($old_rsvp)) { throw new EntityValidationException(sprintf("attendee %s already submitted an rsvp for event %s on summit %s", $summit_attendee->getIdentifier(), $event_id, $summit_id)); } $rsvp = new RSVP(); $rsvp->EventID = $event_id; $rsvp->SubmittedByID = $summit_attendee->getIdentifier(); $rsvp->SeatType = $event->getCurrentRSVPSubmissionSeatType(); if (!$event->couldAddSeatType($rsvp->SeatType)) { throw new EntityValidationException(sprintf("you reach the limit of rsvp items for current event %s ( regular seats %s - wait list seats %s)", $event_id, $event->getCurrentSeatsCountByType(IRSVP::SeatTypeRegular), $event->getCurrentSeatsCountByType(IRSVP::SeatTypeWaitList))); } foreach ($event->RSVPTemplate()->getQuestions() as $q) { $question_name = $q->name(); if ($q instanceof RSVPDropDownQuestionTemplate) { $question_name = $q->IsMultiSelect ? $q->name() . '[]' : $question_name; } else { if ($q instanceof RSVPCheckBoxListQuestionTemplate) { $question_name = $q->name() . '[]'; } } if (isset($data[$question_name])) { if (!$rsvp || !($answer = $rsvp->findAnswerByQuestion($q))) { $answer = new RSVPAnswer(); } $answer_value = $data[$question_name]; if (is_array($answer_value)) { $answer_value = str_replace('{comma}', ',', $answer_value); $answer->Value = implode(',', $answer_value); } else { $answer->Value = $answer_value; } $answer->QuestionID = $q->getIdentifier(); $answer->write(); $rsvp->addAnswer($answer); } } if (!is_null($sender_service)) { $rsvp->BeenEmailed = true; $sender_service->send(['Event' => $event, 'Attendee' => $summit_attendee]); } $rsvp->write(); return $rsvp; }); }