/**
  * @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;
     });
 }