/**
  * Implement this method in the task subclass to
  * execute via the TaskRunner
  */
 public function run($request)
 {
     set_time_limit(0);
     $summit_id = intval($request->getVar('summit_id'));
     if (empty($summit_id)) {
         throw new InvalidArgumentException('missing summit_id param!');
     }
     $summit_external_id = intval($request->getVar('summit_external_id'));
     if (empty($summit_external_id)) {
         throw new InvalidArgumentException('missing summit_external_id param!');
     }
     // get ticket types ...
     $summit = Summit::get()->byID($summit_id);
     if (is_null($summit)) {
         throw new InvalidArgumentException("non existent summit!");
     }
     $summit->ExternalEventId = $summit_external_id;
     $summit->write();
     Summit::seedBasicEventTypes($summit_id);
     Summit::seedSummitTypes($summit_id);
     $client = new GuzzleHttp\Client();
     $query = array('token' => EVENTBRITE_PERSONAL_OAUTH2_TOKEN);
     $response = $client->get(sprintf("https://www.eventbriteapi.com/v3/events/%s/ticket_classes/", $summit_external_id), array('query' => $query));
     if ($response->getStatusCode() !== 200) {
         throw new Exception('invalid status code!');
     }
     $content_type = $response->getHeader('content-type');
     if (empty($content_type)) {
         throw new Exception('invalid content type!');
     }
     if ($content_type !== 'application/json') {
         throw new Exception('invalid content type!');
     }
     $json = $response->getBody()->getContents();
     $ticket_types = json_decode($json, true);
     $ticket_types = $ticket_types['ticket_classes'];
     foreach ($ticket_types as $t) {
         $new_ticket = new SummitTicketType();
         $new_ticket->ExternalId = $t["id"];
         if (SummitTicketType::get()->filter(array('SummitID' => $summit_id, 'ExternalId' => $new_ticket->ExternalId))->count() > 0) {
             continue;
         }
         $new_ticket->Name = $t["name"];
         $new_ticket->Description = $t["description"];
         $new_ticket->SummitID = $summit_id;
         $new_ticket->write();
     }
 }
 function __construct($controller, $name)
 {
     $fields = new FieldList(array($t1 = new TextField('ExternalOrderId', 'Eventbrite Order #'), $checkbox = new CheckboxField('SharedContactInfo', 'Allow to share contact info?')));
     $t1->setAttribute('placeholder', 'Enter your Eventbrite order #');
     $t1->addExtraClass('event-brite-order-number');
     $attendees = Session::get('attendees');
     if (count($attendees) > 0) {
         $t1->setValue(Session::get('ExternalOrderId'));
         $t1->setReadonly(true);
         $checkbox->setValue(intval(Session::get('SharedContactInfo')) === 1);
         $fields->add(new LiteralField('ctrl1', 'Current Order has following registered attendees, please select one:'));
         $options = array();
         foreach ($attendees as $attendee) {
             $ticket_external_id = intval($attendee['ticket_class_id']);
             $ticket_type = SummitTicketType::get()->filter('ExternalId', $ticket_external_id)->first();
             if (is_null($ticket_type)) {
                 continue;
             }
             $options[$attendee['id']] = $attendee['profile']['name'] . ' (' . $ticket_type->Name . ')';
         }
         $attendees_ctrl = new OptionSetField('SelectedAttendee', '', $options);
         $fields->add($attendees_ctrl);
         $validator = new RequiredFields(array('ExternalOrderId'));
         // Create action
         $actions = new FieldList($btn_clear = new FormAction('clearSummitAttendeeInfo', 'Clear'), $btn = new FormAction('saveSummitAttendeeInfo', 'Done'));
         $btn->addExtraClass('btn btn-default active');
         $btn_clear->addExtraClass('btn btn-danger active');
     } else {
         $validator = new RequiredFields(array('ExternalOrderId'));
         // Create action
         $actions = new FieldList($btn = new FormAction('saveSummitAttendeeInfo', 'Get Order'));
         $btn->addExtraClass('btn btn-default active');
     }
     parent::__construct($controller, $name, $fields, $actions, $validator);
 }
 protected function validate()
 {
     $valid = parent::validate();
     if (!$valid->valid()) {
         return $valid;
     }
     $summit_id = isset($_REQUEST['SummitID']) ? $_REQUEST['SummitID'] : $this->SummitID;
     $summit = Summit::get()->byID($summit_id);
     if (!$summit) {
         return $valid->error('Invalid Summit!');
     }
     $count = intval(SummitTicketType::get()->filter(array('SummitID' => $summit->ID, 'Name' => trim($this->Name), 'ID:ExactMatch:not' => $this->ID))->count());
     if ($count > 0) {
         return $valid->error(sprintf('Summit Ticket Type "%s" already exists!. please set another one', $this->Name));
     }
     return $valid;
 }
 public function getCMSFields()
 {
     $f = new FieldList($rootTab = new TabSet("Root", $tabMain = new Tab('Main')));
     $f->addFieldToTab('Root.Main', new HiddenField('OwnerID', 'OwnerID'));
     $f->addFieldsToTab('Root.Main', new TextField('ExternalOrderId', '#Order'));
     $f->addFieldsToTab('Root.Main', new TextField('ExternalAttendeeId', '#Attendee'));
     $f->addFieldsToTab('Root.Main', $date = new DatetimeField('TicketBoughtDate', 'Bought Date'));
     $date->getDateField()->setConfig('showcalendar', true);
     $f->addFieldsToTab('Root.Main', $date = new DatetimeField('TicketChangedDate', 'Changed Date'));
     $date->getDateField()->setConfig('showcalendar', true);
     $summit_id = $_REQUEST['SummitID'];
     if (empty($summit_id)) {
         $summit_id = $this->Owner()->exists() ? $this->Owner()->SummitID : Summit::get_active()->ID;
     }
     $f->addFieldsToTab('Root.Main', $ddl = new DropdownField('TicketTypeID', 'Ticket Type', SummitTicketType::get()->filter('SummitID', $summit_id)->map("ID", "Name")));
     return $f;
 }
 public function getCMSFields()
 {
     $f = new FieldList($rootTab = new TabSet("Root", $tabMain = new Tab('Main')));
     $f->addFieldToTab('Root.Main', new HiddenField('SummitID', 'SummitID'));
     $f->addFieldsToTab('Root.Main', new CheckboxField('SharedContactInfo', 'Allow Shared Contact Info?'));
     $f->addFieldsToTab('Root.Main', new CheckboxField('SummitHallCheckedIn', 'Is SummitHall checked In?'));
     $f->addFieldsToTab('Root.Main', $checked_in_date = new DatetimeField('SummitHallCheckedInDate', 'SummitHall checked In Date'));
     $checked_in_date->getDateField()->setConfig('showcalendar', true);
     $checked_in_date->setConfig('dateformat', 'dd/MM/yyyy');
     $f->addFieldsToTab('Root.Main', $ticket_bought_date = new DatetimeField('TicketBoughtDate', 'Ticket Bought Date'));
     $ticket_bought_date->getDateField()->setConfig('showcalendar', true);
     $ticket_bought_date->setConfig('dateformat', 'dd/MM/yyyy');
     $f->addFieldsToTab('Root.Main', new TextField('ExternalOrderId', 'Eventbrite Order ID'));
     $summit_id = isset($_REQUEST['SummitID']) ? $_REQUEST['SummitID'] : $this->SummitID;
     $ticket_types = SummitTicketType::get()->filter('SummitID', $summit_id)->map('ID', 'Name');
     $f->addFieldsToTab('Root.Main', $ddl_ticket = new DropdownField('TicketTypeID', 'TicketType', $ticket_types));
     $ddl_ticket->setEmptyString('-- Select One --');
     $f->addFieldsToTab('Root.Main', new MemberAutoCompleteField('Member', 'Member'));
     if ($this->ID > 0) {
         // schedule
         $config = GridFieldConfig_RelationEditor::create();
         $config->removeComponentsByType('GridFieldAddNewButton');
         $config->getComponentByType('GridFieldAddExistingAutocompleter')->setSearchList($this->getAllowedSchedule());
         $config->addComponent(new GridFieldAjaxRefresh(1000, false));
         $detailFormFields = new FieldList();
         $detailFormFields->push(new CheckBoxField('ManyMany[IsCheckedIn]', 'Is Checked In?'));
         $config->getComponentByType('GridFieldDetailForm')->setFields($detailFormFields);
         $gridField = new GridField('Schedule', 'Schedule', $this->Schedule(), $config);
         $f->addFieldToTab('Root.Schedule', $gridField);
     }
     return $f;
 }
 /**
  * @param ISummit $summit
  * @param int $eb_attendee_id
  * @param int $member_id
  * @return ISummitAttendee
  */
 public function matchEventbriteAttendee(ISummit $summit, $eb_attendee_id, $member_id)
 {
     $attendee_repository = $this->attendee_repository;
     $eventbrite_attendee_repository = new SapphireEventbriteAttendeeRepository();
     $member_repository = $this->member_repository;
     return $this->tx_service->transaction(function () use($summit, $eb_attendee_id, $member_id, $attendee_repository, $eventbrite_attendee_repository, $member_repository) {
         $eb_attendee = $eventbrite_attendee_repository->getByAttendeeId($eb_attendee_id);
         if (is_null($eb_attendee)) {
             throw new NotFoundEntityException('Attendee', sprintf(' id %s', $eb_attendee_id));
         }
         $member = $member_repository->getById($member_id);
         if (is_null($member)) {
             throw new NotFoundEntityException('Member', sprintf(' id %s', $member_id));
         }
         $attendee = $attendee_repository->getByMemberAndSummit($member_id, $summit->getIdentifier());
         if (!$attendee) {
             $attendee = new SummitAttendee();
             $attendee->MemberID = $member_id;
             $attendee->SummitID = $summit->getIdentifier();
             $attendee->write();
         }
         list($eb_attendees, $count) = $eventbrite_attendee_repository->getByEmail($eb_attendee->Email);
         foreach ($eb_attendees as $eb_ticket) {
             $attendee_ticket = SummitAttendeeTicket::get()->where("ExternalAttendeeId = " . $eb_ticket->ExternalAttendeeId)->first();
             if (!$attendee_ticket) {
                 $attendee_ticket = new SummitAttendeeTicket();
                 $ticket_type = SummitTicketType::get()->where("ExternalId = " . $eb_ticket->ExternalTicketClassId)->first();
                 $external_event = EventbriteEvent::get()->where("ID = " . $eb_ticket->EventbriteOrderId)->first();
                 $attendee_ticket->ExternalOrderId = $external_event->ExternalOrderId;
                 $attendee_ticket->ExternalAttendeeId = $eb_ticket->ExternalAttendeeId;
                 $attendee_ticket->TicketTypeID = $ticket_type ? $ticket_type->ID : 0;
             }
             $attendee_ticket->OwnerID = $attendee->ID;
             $attendee_ticket->write();
         }
         return $attendee;
     });
 }