public function fetchAll()
 {
     $this->buildStart();
     $this->build();
     $this->buildStat();
     $results = array();
     while ($data = $this->stat->fetch()) {
         $eventHistory = new EventHistoryModel();
         $eventHistory->setFromDataBaseRow($data);
         $results[] = $eventHistory;
     }
     return $results;
 }
 protected function run()
 {
     $eventHistoryRepo = new EventHistoryRepository();
     $stat = $this->app['db']->prepare("SELECT * FROM event_history");
     $stat->execute();
     $count = 0;
     while ($data = $stat->fetch()) {
         $eventHistory = new EventHistoryModel();
         $eventHistory->setFromDataBaseRow($data);
         $eventHistoryRepo->ensureChangedFlagsAreSet($eventHistory);
         ++$count;
     }
     return array('result' => 'ok', 'count' => $count);
 }
 public function applyChangeToFutureEvents()
 {
     $startDiff = $this->initalEvent->getStartAtInUTC()->diff($this->initialEventJustBeforeLastChange->getStartAtInUTC());
     $endDiff = $this->initalEvent->getEndAtInUTC()->diff($this->initialEventJustBeforeLastChange->getEndAtInUTC());
     foreach ($this->futureEvents as $futureEvent) {
         $this->futureEventsProposedChanges[$futureEvent->getSlug()] = new EventInRecurSetProposedChangesModel();
         if (($this->initalEventLastChange->getCountryIdChanged() || $this->initalEventLastChange->getVenueIdChanged() || $this->initalEventLastChange->getAreaIdChanged()) && ($this->initalEvent->getCountryId() != $futureEvent->getCountryId() || $this->initalEvent->getAreaId() != $futureEvent->getAreaId() || $this->initalEvent->getVenueId() != $futureEvent->getVenueId())) {
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setCountryAreaVenueIdChangePossible(true);
             if ($this->initialEventJustBeforeLastChange->getCountryId() != $futureEvent->getCountryId() || $this->initialEventJustBeforeLastChange->getAreaId() != $futureEvent->getAreaId() || $this->initialEventJustBeforeLastChange->getVenueId() != $futureEvent->getVenueId()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setCountryAreaVenueIdChangeSelected(true);
             }
         }
         if ($this->initalEventLastChange->getSummaryChanged()) {
             $summary = $this->initalEvent->getSummary();
             // change month title
             $currentMonthLong = $this->initalEvent->getStartAtInUTC()->format('F');
             $currentMonthShort = $this->initalEvent->getStartAtInUTC()->format('M');
             if (stripos($summary, $currentMonthLong) !== false) {
                 $summary = str_ireplace($currentMonthLong, $futureEvent->getStartAtInUTC()->format('F'), $summary);
             } else {
                 if (stripos($summary, $currentMonthShort) !== false) {
                     $summary = str_ireplace($currentMonthShort, $futureEvent->getStartAtInUTC()->format('M'), $summary);
                 }
             }
             if ($summary != $futureEvent->getSummary()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setSummary($summary);
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setSummaryChangePossible(true);
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setSummaryChangeSelected(true);
             }
         }
         if ($this->initalEventLastChange->getDescriptionChanged() && $this->initalEvent->getDescription() != $futureEvent->getDescription()) {
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setDescriptionChangePossible(true);
             if ($this->initialEventJustBeforeLastChange->getDescription() == $futureEvent->getDescription()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setDescriptionChangeSelected(true);
             }
         }
         if ($this->initalEventLastChange->getUrlChanged() && $this->initalEvent->getUrl() != $futureEvent->getUrl()) {
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setUrlChangePossible(true);
             if ($this->initialEventJustBeforeLastChange->getUrl() == $futureEvent->getUrl()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setUrlChangeSelected(true);
             }
         }
         if ($this->initalEventLastChange->getTicketUrlChanged() && $this->initalEvent->getTicketUrl() != $futureEvent->getTicketUrl()) {
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setTicketUrlChangePossible(true);
             if ($this->initialEventJustBeforeLastChange->getTicketUrl() == $futureEvent->getTicketUrl()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setTicketUrlChangeSelected(true);
             }
         }
         if ($this->initalEventLastChange->getTimezoneChanged() && $this->initalEvent->getTimezone() != $futureEvent->getTimezone()) {
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setTimezoneChangePossible(true);
             if ($this->initialEventJustBeforeLastChange->getTimezone() == $futureEvent->getTimezone()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setTimezoneChangeSelected(true);
             }
         }
         if ($this->initalEventLastChange->getIsPhysicalChanged() && $this->initalEvent->getIsPhysical() != $futureEvent->getIsPhysical()) {
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setIsPhysicalChangePossible(true);
             if ($this->initialEventJustBeforeLastChange->getIsPhysical() == $futureEvent->getIsPhysical()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setIsPhysicalChangeSelected(true);
             }
         }
         if ($this->initalEventLastChange->getIsVirtualChanged() && $this->initalEvent->getIsVirtual() != $futureEvent->getIsVirtual()) {
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setIsVirtualChangePossible(true);
             if ($this->initialEventJustBeforeLastChange->getIsVirtual() == $futureEvent->getIsVirtual()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setIsVirtualChangeSelected(true);
             }
         }
         if ($this->initalEventLastChange->getIsCancelledChanged() && $this->initalEvent->getIsCancelled() != $futureEvent->getIsCancelled()) {
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setIsCancelledChangePossible(true);
             if ($this->initialEventJustBeforeLastChange->getIsCancelled() == $futureEvent->getIsCancelled()) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setIsCancelledChangeSelected(true);
             }
         }
         if ($startDiff->y != 0 || $startDiff->m != 0 || $startDiff->d != 0 || $startDiff->h != 0 || $startDiff->i != 0 || $startDiff->s != 0 || ($endDiff->y != 0 || $endDiff->m != 0 || $endDiff->d != 0 || $endDiff->h != 0 || $endDiff->i != 0 || $endDiff->s != 0)) {
             $start = clone $futureEvent->getStartAtInUTC();
             $start->sub($startDiff);
             $end = clone $futureEvent->getEndAtInUTC();
             $end->sub($endDiff);
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setStartEndAtChangePossible(true);
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setStartEndAtChangeSelected(true);
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setStartAt($start);
             $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setEndAt($end);
         }
         foreach ($this->customFields as $customField) {
             if ($this->initalEventLastChange->hasCustomField($customField) && $this->initalEvent->getCustomField($customField) != $futureEvent->getCustomField($customField)) {
                 $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setCustomFieldChangePossible($customField, true);
                 if ($this->initialEventJustBeforeLastChange->getCustomField($customField) == $futureEvent->getCustomField($customField)) {
                     $this->futureEventsProposedChanges[$futureEvent->getSlug()]->setCustomFieldChangeSelected($customField, true);
                 }
             }
         }
     }
 }
 function testSetChangedFlagsFromLastCancel()
 {
     $lastHistory = new EventHistoryModel();
     $lastHistory->setFromDataBaseRow(array('event_id' => 1, 'summary' => 'New Event', 'description' => '', 'user_account_id' => 1, 'created_at' => '2014-02-01 10:00:00', 'start_at' => '2014-02-03 10:00:00', 'end_at' => '2014-02-03 15:00:00', 'is_deleted' => 0, 'is_cancelled' => 0, 'country_id' => '', 'timezone' => '', 'venue_id' => 45, 'url' => '', 'ticket_url' => '', 'is_virtual' => 0, 'is_physical' => 0, 'area_id' => '', 'summary_changed' => 0, 'description_changed' => 0, 'start_at_changed' => 0, 'end_at_changed' => 0, 'is_deleted_changed' => 0, 'country_id_changed' => 0, 'timezone_changed' => 0, 'venue_id_changed' => 0, 'url_changed' => 0, 'is_virtual_changed' => 0, 'is_physical_changed' => 0, 'area_id_changed' => 0, 'custom_fields' => null, 'custom_fields_changed' => null));
     $eventHistory = new EventHistoryModel();
     $eventHistory->setFromDataBaseRow(array('event_id' => 1, 'summary' => 'New Event', 'description' => '', 'user_account_id' => 1, 'created_at' => '2014-02-01 10:00:00', 'start_at' => '2014-02-03 10:00:00', 'end_at' => '2014-02-03 15:00:00', 'is_deleted' => 0, 'is_cancelled' => 1, 'country_id' => '', 'timezone' => '', 'venue_id' => 45, 'url' => '', 'ticket_url' => '', 'is_virtual' => 0, 'is_physical' => 0, 'area_id' => '', 'summary_changed' => 0, 'description_changed' => 0, 'start_at_changed' => 0, 'end_at_changed' => 0, 'is_deleted_changed' => 0, 'country_id_changed' => 0, 'timezone_changed' => 0, 'venue_id_changed' => 0, 'url_changed' => 0, 'is_virtual_changed' => 0, 'is_physical_changed' => 0, 'area_id_changed' => 0, 'custom_fields' => null, 'custom_fields_changed' => null));
     $eventHistory->setChangedFlagsFromLast($lastHistory);
     $this->assertEquals(false, $eventHistory->getSummaryChanged());
     $this->assertEquals(false, $eventHistory->getDescriptionChanged());
     $this->assertEquals(false, $eventHistory->getStartAtChanged());
     $this->assertEquals(false, $eventHistory->getEndAtChanged());
     $this->assertEquals(false, $eventHistory->getIsDeletedChanged());
     $this->assertEquals(true, $eventHistory->getIsCancelledChanged());
     $this->assertEquals(false, $eventHistory->getCountryIdChanged());
     $this->assertEquals(false, $eventHistory->getTimezoneChanged());
     $this->assertEquals(false, $eventHistory->getVenueIdChanged());
     $this->assertEquals(false, $eventHistory->getUrlChanged());
     $this->assertEquals(false, $eventHistory->getTicketUrlChanged());
     $this->assertEquals(false, $eventHistory->getIsVirtualChanged());
     $this->assertEquals(false, $eventHistory->getIsPhysicalChanged());
     $this->assertEquals(false, $eventHistory->getAreaIdChanged());
     $this->assertEquals(false, $eventHistory->getIsNew());
 }
 function testChangCustomField1()
 {
     TimeSource::mock(2014, 1, 1, 9, 0, 0);
     $customFieldDefinition1 = new EventCustomFieldDefinitionModel();
     $customFieldDefinition1->setId(1);
     $customFieldDefinition1->setExtensionId('org.openacalendar');
     $customFieldDefinition1->setType('TextSingleLine');
     $customFieldDefinition1->setKey('cats');
     $customFieldDefinition1->setLabel('cats');
     $eventSet = new EventRecurSetModel();
     $eventSet->setTimeZoneName('Europe/London');
     $eventSet->setCustomFields(array($customFieldDefinition1));
     $initialEvent = new EventModel();
     $initialEvent->setSlug(1);
     $initialEvent->setCustomField($customFieldDefinition1, "Dogs go miaow");
     // this is the inital wrong value
     $initialEvent->setStartAt(getUTCDateTime(2014, 1, 7, 19, 0, 0));
     $initialEvent->setEndAt(getUTCDateTime(2014, 1, 7, 21, 0, 0));
     $eventSet->setInitialEventJustBeforeLastChange($initialEvent);
     $initialEventEdited = clone $initialEvent;
     $initialEventEdited->setCustomField($customFieldDefinition1, "Dogs go woof");
     // this is the later corrected value
     $eventSet->setInitalEvent($initialEventEdited);
     $futureEvent1 = new EventModel();
     $futureEvent1->setSlug(2);
     $futureEvent1->setCustomField($customFieldDefinition1, "Dogs go miaow");
     // this is the earlier wrong value that we will want to overwrite
     $futureEvent1->setStartAt(getUTCDateTime(2014, 1, 14, 19, 0, 0));
     $futureEvent1->setEndAt(getUTCDateTime(2014, 1, 14, 21, 0, 0));
     $futureEvent2 = new EventModel();
     $futureEvent2->setSlug(3);
     $futureEvent2->setCustomField($customFieldDefinition1, "Dogs go woof");
     // this value has already been corrected
     $futureEvent2->setStartAt(getUTCDateTime(2014, 1, 21, 19, 0, 0));
     $futureEvent2->setEndAt(getUTCDateTime(2014, 1, 21, 21, 0, 0));
     $futureEvent3 = new EventModel();
     $futureEvent3->setSlug(4);
     $futureEvent3->setCustomField($customFieldDefinition1, "Dogs go miaowwwwwwww");
     // this value has already been edited. Possible to overwrite but not recommended
     $futureEvent3->setStartAt(getUTCDateTime(2014, 1, 21, 19, 0, 0));
     $futureEvent3->setEndAt(getUTCDateTime(2014, 1, 21, 21, 0, 0));
     $eventSet->setFutureEvents(array($futureEvent1, $futureEvent2, $futureEvent3));
     $eventHistory = new \models\EventHistoryModel();
     $eventHistory->setFromDataBaseRow(array('event_id' => null, 'summary' => null, 'description' => null, 'start_at' => null, 'end_at' => null, 'created_at' => null, 'is_deleted' => null, 'is_cancelled' => null, 'country_id' => null, 'timezone' => null, 'venue_id' => null, 'url' => null, 'ticket_url' => null, 'is_virtual' => null, 'is_physical' => null, 'area_id' => null, 'user_account_id' => null, 'summary_changed' => '-1', 'description_changed' => '-1', 'start_at_changed' => '-1', 'end_at_changed' => '-1', 'is_deleted_changed' => '-1', 'country_id_changed' => '-1', 'timezone_changed' => '-1', 'venue_id_changed' => '-1', 'url_changed' => '-1', 'is_virtual_changed' => '-1', 'is_physical_changed' => '-1', 'area_id_changed' => '-1', 'is_new' => '-1', 'custom_fields' => json_encode(array('1' => 'Dogs go woof')), 'custom_fields_changed' => json_encode(array('1' => 1))));
     $eventSet->setInitalEventLastChange($eventHistory);
     ## Detect !!!
     $eventSet->applyChangeToFutureEvents();
     ## Test Changes Picked Up
     $proposedChanges1 = $eventSet->getFutureEventsProposedChangesForEventSlug($futureEvent1->getSlug());
     $this->assertEquals(false, $proposedChanges1->getSummaryChangePossible());
     $this->assertEquals(false, $proposedChanges1->getSummaryChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getDescriptionChangePossible());
     $this->assertEquals(false, $proposedChanges1->getDescriptionChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getTimezoneChangePossible());
     $this->assertEquals(false, $proposedChanges1->getTimezoneChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getCountryAreaVenueIdChangePossible());
     $this->assertEquals(false, $proposedChanges1->getCountryAreaVenueIdChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getUrlChangePossible());
     $this->assertEquals(false, $proposedChanges1->getUrlChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getIsVirtualChangePossible());
     $this->assertEquals(false, $proposedChanges1->getIsVirtualChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getIsPhysicalChangePossible());
     $this->assertEquals(false, $proposedChanges1->getIsPhysicalChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getStartEndAtChangePossible());
     $this->assertEquals(false, $proposedChanges1->getStartEndAtChangeSelected());
     $this->assertEquals(true, $proposedChanges1->getCustomFieldChangePossible($customFieldDefinition1));
     $this->assertEquals(true, $proposedChanges1->getCustomFieldChangeSelected($customFieldDefinition1));
     $proposedChanges2 = $eventSet->getFutureEventsProposedChangesForEventSlug($futureEvent2->getSlug());
     $this->assertEquals(false, $proposedChanges2->getSummaryChangePossible());
     $this->assertEquals(false, $proposedChanges2->getSummaryChangeSelected());
     $this->assertEquals(false, $proposedChanges2->getDescriptionChangePossible());
     $this->assertEquals(false, $proposedChanges2->getDescriptionChangeSelected());
     $this->assertEquals(false, $proposedChanges2->getTimezoneChangePossible());
     $this->assertEquals(false, $proposedChanges2->getTimezoneChangeSelected());
     $this->assertEquals(false, $proposedChanges2->getCountryAreaVenueIdChangePossible());
     $this->assertEquals(false, $proposedChanges2->getCountryAreaVenueIdChangeSelected());
     $this->assertEquals(false, $proposedChanges2->getUrlChangePossible());
     $this->assertEquals(false, $proposedChanges2->getUrlChangeSelected());
     $this->assertEquals(false, $proposedChanges2->getIsVirtualChangePossible());
     $this->assertEquals(false, $proposedChanges2->getIsVirtualChangeSelected());
     $this->assertEquals(false, $proposedChanges2->getIsPhysicalChangePossible());
     $this->assertEquals(false, $proposedChanges2->getIsPhysicalChangeSelected());
     $this->assertEquals(false, $proposedChanges2->getStartEndAtChangePossible());
     $this->assertEquals(false, $proposedChanges2->getStartEndAtChangeSelected());
     $this->assertEquals(false, $proposedChanges2->isAnyChangesPossible());
     $this->assertEquals(false, $proposedChanges2->getCustomFieldChangePossible($customFieldDefinition1));
     $this->assertEquals(false, $proposedChanges2->getCustomFieldChangeSelected($customFieldDefinition1));
     $proposedChanges3 = $eventSet->getFutureEventsProposedChangesForEventSlug($futureEvent3->getSlug());
     $this->assertEquals(false, $proposedChanges3->getSummaryChangePossible());
     $this->assertEquals(false, $proposedChanges3->getSummaryChangeSelected());
     $this->assertEquals(false, $proposedChanges3->getDescriptionChangePossible());
     $this->assertEquals(false, $proposedChanges3->getDescriptionChangeSelected());
     $this->assertEquals(false, $proposedChanges3->getTimezoneChangePossible());
     $this->assertEquals(false, $proposedChanges3->getTimezoneChangeSelected());
     $this->assertEquals(false, $proposedChanges3->getCountryAreaVenueIdChangePossible());
     $this->assertEquals(false, $proposedChanges3->getCountryAreaVenueIdChangeSelected());
     $this->assertEquals(false, $proposedChanges3->getUrlChangePossible());
     $this->assertEquals(false, $proposedChanges3->getUrlChangeSelected());
     $this->assertEquals(false, $proposedChanges3->getIsVirtualChangePossible());
     $this->assertEquals(false, $proposedChanges3->getIsVirtualChangeSelected());
     $this->assertEquals(false, $proposedChanges3->getIsPhysicalChangePossible());
     $this->assertEquals(false, $proposedChanges3->getIsPhysicalChangeSelected());
     $this->assertEquals(false, $proposedChanges3->getStartEndAtChangePossible());
     $this->assertEquals(false, $proposedChanges3->getStartEndAtChangeSelected());
     $this->assertEquals(true, $proposedChanges3->isAnyChangesPossible());
     $this->assertEquals(true, $proposedChanges3->getCustomFieldChangePossible($customFieldDefinition1));
     $this->assertEquals(false, $proposedChanges3->getCustomFieldChangeSelected($customFieldDefinition1));
     ## Now Set to don't update and run and test
     $proposedChanges1->setCustomFieldChangeSelected($customFieldDefinition1, false);
     $this->assertEquals(false, $proposedChanges1->applyToEvent($futureEvent1, $initialEventEdited));
     $this->assertEquals("Dogs go miaow", $futureEvent1->getCustomField($customFieldDefinition1));
     ## Now Set to do update and run and test
     $proposedChanges1->setCustomFieldChangeSelected($customFieldDefinition1, true);
     $this->assertEquals(true, $proposedChanges1->applyToEvent($futureEvent1, $initialEventEdited));
     $this->assertEquals("Dogs go woof", $futureEvent1->getCustomField($customFieldDefinition1));
 }
 public function loadByEventAndlastEditByUser(EventModel $event, UserAccountModel $user)
 {
     global $DB;
     $stat = $DB->prepare("SELECT event_history.* FROM event_history " . " WHERE event_history.event_id = :id AND event_history.user_account_id = :user " . " ORDER BY event_history.created_at DESc");
     $stat->execute(array('id' => $event->getId(), 'user' => $user->getId()));
     if ($stat->rowCount() > 0) {
         $event = new EventHistoryModel();
         $event->setFromDataBaseRow($stat->fetch());
         return $event;
     }
 }
 public function loadEventJustBeforeEdit(EventModel $event, EventHistoryModel $eventHistory)
 {
     global $DB;
     $eventOut = clone $event;
     /**
      * At moment the last edit has all state, changed or not.
      * 
      * In future we may only store state in event_history for changed fields to save space.
      * 
      * When we do that, we'll have to iterate back over multiple event_histories until we have all fields.
      */
     $stat = $DB->prepare("SELECT event_history.* FROM event_history " . "WHERE event_history.event_id = :id AND event_history.created_at < :cat " . "ORDER BY event_history.created_at DESC LIMIT 1");
     $stat->execute(array('id' => $event->getId(), 'cat' => date("Y-m-d H:i:s", $eventHistory->getCreatedAtTimeStamp())));
     if ($stat->rowCount() > 0) {
         $eventHistoryToApply = new EventHistoryModel();
         $eventHistoryToApply->setFromDataBaseRow($stat->fetch());
         $eventOut->setFromHistory($eventHistoryToApply);
     }
     return $eventOut;
 }
 public function fetchAll()
 {
     global $DB, $app;
     $results = array();
     /////////////////////////// Events History
     if ($this->historyRepositoryBuilderConfig->getIncludeEventHistory()) {
         $where = array();
         $joins = array();
         $params = array();
         if ($this->historyRepositoryBuilderConfig->getEvent()) {
             $where[] = 'event_information.id=:event';
             $params['event'] = $this->historyRepositoryBuilderConfig->getEvent()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getGroup()) {
             // We use a seperate table here so if event is in 2 groups and we select events in 1 group that isn't the main group only,
             // the normal event_in_group table still shows the main group.
             $joins[] = " JOIN event_in_group AS event_in_group_select ON event_in_group_select.event_id = event_information.id " . "AND event_in_group_select.removed_at IS NULL AND event_in_group_select.group_id = :group_id ";
             $params['group_id'] = $this->historyRepositoryBuilderConfig->getGroup()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getSite()) {
             $where[] = 'event_information.site_id =:site';
             $params['site'] = $this->historyRepositoryBuilderConfig->getSite()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getVenue()) {
             $where[] = 'event_information.venue_id = :venue';
             $params['venue'] = $this->historyRepositoryBuilderConfig->getVenue()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getSince()) {
             $where[] = ' event_history.created_at >= :since ';
             $params['since'] = $this->historyRepositoryBuilderConfig->getSince()->format("Y-m-d H:i:s");
         }
         if ($this->historyRepositoryBuilderConfig->getNotUser()) {
             $where[] = 'event_history.user_account_id != :userid ';
             $params['userid'] = $this->historyRepositoryBuilderConfig->getNotUser()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getApi2app()) {
             $where[] = 'event_history.api2_application_id  = :api2app';
             $params['api2app'] = $this->historyRepositoryBuilderConfig->getApi2app()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getArea()) {
             $areaids = array($this->historyRepositoryBuilderConfig->getArea()->getId());
             $this->statAreas = $DB->prepare("SELECT area_id FROM cached_area_has_parent WHERE has_parent_area_id=:id");
             $this->statAreas->execute(array('id' => $this->historyRepositoryBuilderConfig->getArea()->getId()));
             while ($d = $this->statAreas->fetch()) {
                 $areaids[] = $d['area_id'];
             }
             $joins[] = " LEFT JOIN venue_information ON  event_information.venue_id = venue_information.id ";
             $where[] = ' (event_information.area_id IN (' . implode(",", $areaids) . ')  OR venue_information.area_id IN (' . implode(",", $areaids) . ') ) ';
         }
         if ($this->historyRepositoryBuilderConfig->getVenueVirtualOnly()) {
             // we check both on an OR, that way we get both
             // a) events that were not virtual and became virtual, we get their full history
             // b) events that were virtual and now aren't, we get some of their history
             $where[] = " ( event_information.is_virtual = '1' OR event_history.is_virtual = '1' )";
         }
         $sql = "SELECT event_history.*, group_information.title AS group_title,  group_information.id AS group_id,  event_information.slug AS event_slug, user_account_information.username AS user_account_username FROM event_history " . " LEFT JOIN user_account_information ON user_account_information.id = event_history.user_account_id " . " LEFT JOIN event_information ON event_information.id = event_history.event_id " . " LEFT JOIN event_in_group ON event_in_group.event_id = event_information.id AND event_in_group.removed_at IS NULL AND event_in_group.is_main_group = '1' " . " LEFT JOIN group_information ON group_information.id = event_in_group.group_id " . implode(" ", $joins) . ($where ? " WHERE " . implode(" AND ", $where) : "") . " ORDER BY event_history.created_at DESC LIMIT " . $this->historyRepositoryBuilderConfig->getLimit();
         //var_dump($sql); var_dump($params);
         $stat = $DB->prepare($sql);
         $stat->execute($params);
         while ($data = $stat->fetch()) {
             $eventHistory = new EventHistoryModel();
             $eventHistory->setFromDataBaseRow($data);
             $results[] = $eventHistory;
         }
     }
     /////////////////////////// Group History
     if ($this->historyRepositoryBuilderConfig->getIncludeGroupHistory()) {
         $where = array();
         $params = array();
         if ($this->historyRepositoryBuilderConfig->getEvent() && $this->historyRepositoryBuilderConfig->getEvent()->getGroupId()) {
             $where[] = 'group_information.id=:group';
             $params['group'] = $this->historyRepositoryBuilderConfig->getEvent()->getGroupId();
         } else {
             if ($this->historyRepositoryBuilderConfig->getGroup()) {
                 $where[] = 'group_information.id =:group';
                 $params['group'] = $this->historyRepositoryBuilderConfig->getGroup()->getId();
             }
         }
         if ($this->historyRepositoryBuilderConfig->getSite()) {
             $where[] = 'group_information.site_id =:site';
             $params['site'] = $this->historyRepositoryBuilderConfig->getSite()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getSince()) {
             $where[] = ' group_history.created_at >= :since ';
             $params['since'] = $this->historyRepositoryBuilderConfig->getSince()->format("Y-m-d H:i:s");
         }
         if ($this->historyRepositoryBuilderConfig->getNotUser()) {
             $where[] = 'group_history.user_account_id != :userid ';
             $params['userid'] = $this->historyRepositoryBuilderConfig->getNotUser()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getApi2app()) {
             $where[] = 'group_history.api2_application_id  = :api2app';
             $params['api2app'] = $this->historyRepositoryBuilderConfig->getApi2app()->getId();
         }
         $sql = "SELECT group_history.*, group_information.slug AS group_slug, user_account_information.username AS user_account_username FROM group_history " . " LEFT JOIN user_account_information ON user_account_information.id = group_history.user_account_id " . " LEFT JOIN group_information ON group_information.id = group_history.group_id " . ($where ? " WHERE " . implode(" AND ", $where) : "") . " ORDER BY group_history.created_at DESC LIMIT " . $this->historyRepositoryBuilderConfig->getLimit();
         //var_dump($sql); var_dump($params);
         $stat = $DB->prepare($sql);
         $stat->execute($params);
         while ($data = $stat->fetch()) {
             $groupHistory = new GroupHistoryModel();
             $groupHistory->setFromDataBaseRow($data);
             $results[] = $groupHistory;
         }
     }
     /////////////////////////// Venue History
     if ($this->historyRepositoryBuilderConfig->getIncludeVenueHistory()) {
         $where = array();
         $params = array();
         if ($this->historyRepositoryBuilderConfig->getEvent() && $this->historyRepositoryBuilderConfig->getEvent()->getVenueId()) {
             $where[] = 'venue_information.id=:venue';
             $params['venue'] = $this->historyRepositoryBuilderConfig->getEvent()->getVenueId();
         } else {
             if ($this->historyRepositoryBuilderConfig->getVenue()) {
                 $where[] = 'venue_information.id=:venue';
                 $params['venue'] = $this->historyRepositoryBuilderConfig->getVenue()->getId();
             }
         }
         if ($this->historyRepositoryBuilderConfig->getSite()) {
             $where[] = 'venue_information.site_id =:site';
             $params['site'] = $this->historyRepositoryBuilderConfig->getSite()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getSince()) {
             $where[] = ' venue_history.created_at >= :since ';
             $params['since'] = $this->historyRepositoryBuilderConfig->getSince()->format("Y-m-d H:i:s");
         }
         if ($this->historyRepositoryBuilderConfig->getNotUser()) {
             $where[] = 'venue_history.user_account_id != :userid ';
             $params['userid'] = $this->historyRepositoryBuilderConfig->getNotUser()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getApi2app()) {
             $where[] = 'venue_history.api2_application_id  = :api2app';
             $params['api2app'] = $this->historyRepositoryBuilderConfig->getApi2app()->getId();
         }
         $sql = "SELECT venue_history.*, venue_information.slug AS venue_slug, user_account_information.username AS user_account_username FROM venue_history " . " LEFT JOIN user_account_information ON user_account_information.id = venue_history.user_account_id " . " LEFT JOIN venue_information ON venue_information.id = venue_history.venue_id " . ($where ? " WHERE " . implode(" AND ", $where) : "") . " ORDER BY venue_history.created_at DESC LIMIT " . $this->historyRepositoryBuilderConfig->getLimit();
         //var_dump($sql); var_dump($params);
         $stat = $DB->prepare($sql);
         $stat->execute($params);
         while ($data = $stat->fetch()) {
             $venueHistory = new VenueHistoryModel();
             $venueHistory->setFromDataBaseRow($data);
             $results[] = $venueHistory;
         }
     }
     /////////////////////////// Area History
     if ($this->historyRepositoryBuilderConfig->getIncludeAreaHistory()) {
         $where = array();
         $params = array();
         $joins = array();
         if ($this->historyRepositoryBuilderConfig->getArea()) {
             // Will this produce dupes? No evidence so far but there was a note in EventRepositoryBuilder that said so.
             $joins[] = " LEFT JOIN cached_area_has_parent ON cached_area_has_parent.area_id = area_information.id ";
             $where[] = ' (area_information.id =:area OR cached_area_has_parent.has_parent_area_id =:area )';
             $params['area'] = $this->historyRepositoryBuilderConfig->getArea()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getSite()) {
             $where[] = 'area_information.site_id =:site';
             $params['site'] = $this->historyRepositoryBuilderConfig->getSite()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getSince()) {
             $where[] = ' area_history.created_at >= :since ';
             $params['since'] = $this->historyRepositoryBuilderConfig->getSince()->format("Y-m-d H:i:s");
         }
         if ($this->historyRepositoryBuilderConfig->getNotUser()) {
             $where[] = 'area_history.user_account_id != :userid ';
             $params['userid'] = $this->historyRepositoryBuilderConfig->getNotUser()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getApi2app()) {
             $where[] = 'area_history.api2_application_id  = :api2app';
             $params['api2app'] = $this->historyRepositoryBuilderConfig->getApi2app()->getId();
         }
         $sql = "SELECT area_history.*, area_information.slug AS area_slug, user_account_information.username AS user_account_username FROM area_history " . " LEFT JOIN user_account_information ON user_account_information.id = area_history.user_account_id " . " LEFT JOIN area_information ON area_information.id = area_history.area_id " . implode(" ", $joins) . ($where ? " WHERE " . implode(" AND ", $where) : "") . " ORDER BY area_history.created_at DESC LIMIT " . $this->historyRepositoryBuilderConfig->getLimit();
         //var_dump($sql); var_dump($params);
         $stat = $DB->prepare($sql);
         $stat->execute($params);
         while ($data = $stat->fetch()) {
             $areaHistory = new AreaHistoryModel();
             $areaHistory->setFromDataBaseRow($data);
             $results[] = $areaHistory;
         }
     }
     /////////////////////////// Tags History
     if ($this->historyRepositoryBuilderConfig->getIncludeTagHistory()) {
         $where = array();
         $params = array();
         if ($this->historyRepositoryBuilderConfig->getSite()) {
             $where[] = 'tag_information.site_id =:site';
             $params['site'] = $this->historyRepositoryBuilderConfig->getSite()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getSince()) {
             $where[] = ' tag_history.created_at >= :since ';
             $params['since'] = $this->historyRepositoryBuilderConfig->getSince()->format("Y-m-d H:i:s");
         }
         if ($this->historyRepositoryBuilderConfig->getNotUser()) {
             $where[] = 'tag_history.user_account_id != :userid ';
             $params['userid'] = $this->historyRepositoryBuilderConfig->getNotUser()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getApi2app()) {
             $where[] = 'tag_history.api2_application_id  = :api2app';
             $params['api2app'] = $this->historyRepositoryBuilderConfig->getApi2app()->getId();
         }
         $sql = "SELECT tag_history.*, tag_information.slug AS tag_slug, user_account_information.username AS user_account_username FROM tag_history " . " LEFT JOIN user_account_information ON user_account_information.id = tag_history.user_account_id " . " LEFT JOIN tag_information ON tag_information.id = tag_history.tag_id " . ($where ? " WHERE " . implode(" AND ", $where) : "") . " ORDER BY tag_history.created_at DESC LIMIT " . $this->historyRepositoryBuilderConfig->getLimit();
         //var_dump($sql); var_dump($params);
         $stat = $DB->prepare($sql);
         $stat->execute($params);
         while ($data = $stat->fetch()) {
             $tagHistory = new TagHistoryModel();
             $tagHistory->setFromDataBaseRow($data);
             $results[] = $tagHistory;
         }
     }
     /////////////////////////// Import URL History
     if ($this->historyRepositoryBuilderConfig->getIncludeImportURLHistory()) {
         $where = array();
         $params = array();
         if ($this->historyRepositoryBuilderConfig->getSite()) {
             $where[] = 'import_url_information.site_id =:site';
             $params['site'] = $this->historyRepositoryBuilderConfig->getSite()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getGroup()) {
             $where[] = 'import_url_information.group_id =:group';
             $params['group'] = $this->historyRepositoryBuilderConfig->getGroup()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getSince()) {
             $where[] = ' import_url_history.created_at >= :since ';
             $params['since'] = $this->historyRepositoryBuilderConfig->getSince()->format("Y-m-d H:i:s");
         }
         if ($this->historyRepositoryBuilderConfig->getNotUser()) {
             $where[] = 'import_url_history.user_account_id != :userid ';
             $params['userid'] = $this->historyRepositoryBuilderConfig->getNotUser()->getId();
         }
         if ($this->historyRepositoryBuilderConfig->getApi2app()) {
             $where[] = 'import_url_history.api2_application_id  = :api2app';
             $params['api2app'] = $this->historyRepositoryBuilderConfig->getApi2app()->getId();
         }
         $sql = "SELECT import_url_history.*, import_url_information.slug AS import_url_slug, " . "user_account_information.username AS user_account_username " . " FROM import_url_history " . " LEFT JOIN user_account_information ON user_account_information.id = import_url_history.user_account_id " . " LEFT JOIN import_url_information ON import_url_information.id = import_url_history.import_url_id " . ($where ? " WHERE " . implode(" AND ", $where) : "") . " ORDER BY import_url_history.created_at DESC LIMIT " . $this->historyRepositoryBuilderConfig->getLimit();
         //var_dump($sql); var_dump($params);
         $stat = $DB->prepare($sql);
         $stat->execute($params);
         while ($data = $stat->fetch()) {
             $tagHistory = new ImportURLHistoryModel();
             $tagHistory->setFromDataBaseRow($data);
             $results[] = $tagHistory;
         }
     }
     ////////////////////// Others!
     foreach ($app['extensions']->getExtensions() as $ext) {
         $results = array_merge($results, $ext->getHistoryRepositoryBuilderData($this->historyRepositoryBuilderConfig));
     }
     ////////////////////// Finally sort & truncate
     $usort = function ($a, $b) {
         if ($a->getCreatedAtTimeStamp() == $b->getCreatedAtTimeStamp()) {
             return 0;
         } else {
             if ($a->getCreatedAtTimeStamp() > $b->getCreatedAtTimeStamp()) {
                 return -1;
             } else {
                 return 1;
             }
         }
     };
     usort($results, $usort);
     array_slice($results, 0, $this->historyRepositoryBuilderConfig->getLimit());
     return $results;
 }
 public function getSummary()
 {
     $txt = '';
     if ($this->eventHistoryModel->getIsNew()) {
         $txt .= "New! \n";
     }
     if ($this->eventHistoryModel->isAnyChangeFlagsUnknown()) {
         $txt .= $this->eventHistoryModel->getDescription();
     } else {
         if ($this->eventHistoryModel->getSummaryChanged()) {
             $txt .= "Summary Changed. \n";
         }
         if ($this->eventHistoryModel->getDescriptionChanged()) {
             $txt .= "Description Changed. \n";
         }
         if ($this->eventHistoryModel->getUrlChanged()) {
             $txt .= "URL Changed. \n";
         }
         if ($this->eventHistoryModel->getStartAtChanged()) {
             $txt .= "Start Changed. \n";
         }
         if ($this->eventHistoryModel->getEndAtChanged()) {
             $txt .= "End Changed. \n";
         }
         if ($this->eventHistoryModel->getCountryIdChanged()) {
             $txt .= "Country Changed.\n";
         }
         if ($this->eventHistoryModel->getTimezoneChanged()) {
             $txt .= "Timezone Changed. \n";
         }
         if ($this->eventHistoryModel->getAreaIdChanged()) {
             $txt .= "Area Changed. \n";
         }
         if ($this->eventHistoryModel->getVenueIdChanged()) {
             $txt .= "Venue Changed. \n";
         }
         if ($this->eventHistoryModel->getIsVirtualChanged()) {
             $txt .= "Is Virtual Changed. \n";
         }
         if ($this->eventHistoryModel->getIsPhysicalChanged()) {
             $txt .= "Is Physical Changed.\n";
         }
         if ($this->eventHistoryModel->getIsDeletedChanged()) {
             $txt .= 'Deleted Changed: ' . ($this->eventHistoryModel->getIsDeleted() ? "Deleted" : "Restored") . "\n";
         }
         if ($this->eventHistoryModel->getIsCancelledChanged()) {
             $txt .= 'cancelled Changed: ' . ($this->eventHistoryModel->getIsCancelled() ? "Cancelled" : "Restored") . "\n";
         }
     }
     return $txt;
 }
 function testChangeStartEnd1()
 {
     TimeSource::mock(2014, 1, 1, 9, 0, 0);
     $eventSet = new EventRecurSetModel();
     $eventSet->setTimeZoneName('Europe/London');
     $initialEvent = new EventModel();
     $initialEvent->setSlug(1);
     $initialEvent->setSummary("Party");
     $initialEvent->setStartAt(getUTCDateTime(2014, 1, 7, 19, 0, 0));
     $initialEvent->setEndAt(getUTCDateTime(2014, 1, 7, 21, 0, 0));
     $eventSet->setInitialEventJustBeforeLastChange($initialEvent);
     $initialEventEdited = clone $initialEvent;
     $initialEventEdited->setStartAt(getUTCDateTime(2014, 1, 7, 20, 0, 0));
     $initialEventEdited->setEndAt(getUTCDateTime(2014, 1, 7, 23, 0, 0));
     $eventSet->setInitalEvent($initialEventEdited);
     $futureEvent1 = new EventModel();
     $futureEvent1->setSlug(2);
     $futureEvent1->setSummary("Party");
     $futureEvent1->setStartAt(getUTCDateTime(2014, 1, 14, 19, 0, 0));
     $futureEvent1->setEndAt(getUTCDateTime(2014, 1, 14, 21, 0, 0));
     $eventSet->setFutureEvents(array($futureEvent1));
     $eventHistory = new \models\EventHistoryModel();
     $eventHistory->setFromDataBaseRow(array('event_id' => null, 'summary' => null, 'description' => null, 'start_at' => null, 'end_at' => null, 'created_at' => null, 'is_deleted' => null, 'is_cancelled' => null, 'country_id' => null, 'timezone' => null, 'venue_id' => null, 'url' => null, 'ticket_url' => null, 'is_virtual' => null, 'is_physical' => null, 'area_id' => null, 'user_account_id' => null, 'summary_changed' => '-1', 'description_changed' => '-1', 'start_at_changed' => '1', 'end_at_changed' => '1', 'is_deleted_changed' => '-1', 'country_id_changed' => '-1', 'timezone_changed' => '-1', 'venue_id_changed' => '-1', 'url_changed' => '-1', 'is_virtual_changed' => '-1', 'is_physical_changed' => '-1', 'area_id_changed' => '-1', 'is_new' => '-1', 'custom_fields' => null, 'custom_fields_changed' => null));
     $eventSet->setInitalEventLastChange($eventHistory);
     ## Detect !!!
     $eventSet->applyChangeToFutureEvents();
     ## Test Changes Picked Up
     $proposedChanges1 = $eventSet->getFutureEventsProposedChangesForEventSlug($futureEvent1->getSlug());
     $this->assertEquals(false, $proposedChanges1->getSummaryChangePossible());
     $this->assertEquals(false, $proposedChanges1->getSummaryChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getDescriptionChangePossible());
     $this->assertEquals(false, $proposedChanges1->getDescriptionChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getTimezoneChangePossible());
     $this->assertEquals(false, $proposedChanges1->getTimezoneChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getCountryAreaVenueIdChangePossible());
     $this->assertEquals(false, $proposedChanges1->getCountryAreaVenueIdChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getUrlChangePossible());
     $this->assertEquals(false, $proposedChanges1->getUrlChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getIsVirtualChangePossible());
     $this->assertEquals(false, $proposedChanges1->getIsVirtualChangeSelected());
     $this->assertEquals(false, $proposedChanges1->getIsPhysicalChangePossible());
     $this->assertEquals(false, $proposedChanges1->getIsPhysicalChangeSelected());
     $this->assertEquals(true, $proposedChanges1->getStartEndAtChangePossible());
     $this->assertEquals(true, $proposedChanges1->getStartEndAtChangeSelected());
     $this->assertEquals(true, $proposedChanges1->isAnyChangesPossible());
     ## Now Set to don't update and run and test
     $proposedChanges1->setStartEndAtChangeSelected(false);
     $this->assertEquals(false, $proposedChanges1->applyToEvent($futureEvent1, $initialEventEdited));
     $this->assertEquals(getUTCDateTime(2014, 1, 14, 19, 0, 0)->getTimestamp(), $futureEvent1->getStartAtInUTC()->getTimestamp());
     $this->assertEquals(getUTCDateTime(2014, 1, 14, 21, 0, 0)->getTimestamp(), $futureEvent1->getEndAtInUTC()->getTimestamp());
     ## Now Set to do update and run and test
     $proposedChanges1->setStartEndAtChangeSelected(true);
     $this->assertEquals(true, $proposedChanges1->applyToEvent($futureEvent1, $initialEventEdited));
     $this->assertEquals(getUTCDateTime(2014, 1, 14, 20, 0, 0)->getTimestamp(), $futureEvent1->getStartAtInUTC()->getTimestamp());
     $this->assertEquals(getUTCDateTime(2014, 1, 14, 23, 0, 0)->getTimestamp(), $futureEvent1->getEndAtInUTC()->getTimestamp());
 }
 function testIntegration1()
 {
     \TimeSource::mock(2014, 1, 1, 12, 0, 0);
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     ## Create Event
     \TimeSource::mock(2014, 1, 1, 13, 0, 0);
     $event = new EventModel();
     $event->setSummary("test");
     $event->setDescription("test test");
     $event->setStartAt(getUTCDateTime(2014, 9, 1, 1, 1, 1));
     $event->setEndAt(getUTCDateTime(2014, 9, 1, 1, 1, 1));
     $eventRepo = new EventRepository();
     $eventRepo->create($event, $site, $user);
     ## Edit event
     \TimeSource::mock(2014, 1, 1, 14, 0, 0);
     $event = $eventRepo->loadBySlug($site, $event->getSlug());
     $event->setDescription("testy 123");
     $eventRepo->edit($event, $user);
     # delete event
     \TimeSource::mock(2014, 1, 1, 15, 0, 0);
     $eventRepo->delete($event, $user);
     ## Now save changed flags on these .....
     $eventHistoryRepo = new EventHistoryRepository();
     $stat = $this->app['db']->prepare("SELECT * FROM event_history");
     $stat->execute();
     while ($data = $stat->fetch()) {
         $eventHistory = new EventHistoryModel();
         $eventHistory->setFromDataBaseRow($data);
         $eventHistoryRepo->ensureChangedFlagsAreSet($eventHistory);
     }
     ## Now load and check
     $historyRepo = new HistoryRepositoryBuilder();
     $historyRepo->setSite($site);
     $historyRepo->setIncludeEventHistory(true);
     $histories = $historyRepo->fetchAll();
     $this->assertEquals(3, count($histories));
     #the delete
     $this->assertEquals(FALSE, $histories[0]->getSummaryChanged());
     $this->assertEquals(false, $histories[0]->getDescriptionChanged());
     $this->assertEquals(true, $histories[0]->getIsDeletedChanged());
     #the edit
     $this->assertEquals(FALSE, $histories[1]->getSummaryChanged());
     $this->assertEquals(true, $histories[1]->getDescriptionChanged());
     $this->assertEquals(false, $histories[1]->getIsDeletedChanged());
     #the create
     $this->assertEquals(true, $histories[2]->getSummaryChanged());
     $this->assertEquals(true, $histories[2]->getDescriptionChanged());
     $this->assertEquals(false, $histories[2]->getIsDeletedChanged());
     ## Now load history at a certain point; this is to test rollback!
     $history = $eventHistoryRepo->loadByEventAndtimeStamp($event, getUTCDateTime(2014, 1, 1, 15, 0, 0)->getTimestamp());
     $this->assertEquals("test", $history->getSummary());
     $this->assertEquals("testy 123", $history->getDescription());
 }
 public function testAddCustomFieldThenCreateEventWithContent()
 {
     TimeSource::mock(2014, 5, 1, 7, 0, 0);
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $customFieldDefinition1 = new EventCustomFieldDefinitionModel();
     $customFieldDefinition1->setSiteId($site->getId());
     $customFieldDefinition1->setExtensionId('org.openacalendar');
     $customFieldDefinition1->setType('TextSingleLine');
     $customFieldDefinition1->setKey('cats');
     $customFieldDefinition1->setLabel('cats');
     $customFieldDefinition2 = new EventCustomFieldDefinitionModel();
     $customFieldDefinition2->setSiteId($site->getId());
     $customFieldDefinition2->setExtensionId('org.openacalendar');
     $customFieldDefinition2->setType('TextSingleLine');
     $customFieldDefinition2->setKey('dogs');
     $customFieldDefinition2->setLabel('dogs');
     $ecfRepo = new EventCustomFieldDefinitionRepository();
     $ecfRepo->create($customFieldDefinition1, $user);
     $ecfRepo->create($customFieldDefinition2, $user);
     $event = new EventModel();
     $event->setSummary("test");
     $event->setDescription("test test");
     $event->setStartAt(getUTCDateTime(2014, 5, 10, 19, 0, 0));
     $event->setEndAt(getUTCDateTime(2014, 5, 10, 21, 0, 0));
     $event->setUrl("http://www.info.com");
     $event->setTicketUrl("http://www.tickets.com");
     $event->setCustomField($customFieldDefinition1, "CATS");
     // CREATE WITH
     TimeSource::mock(2014, 5, 1, 7, 1, 0);
     $eventRepository = new EventRepository();
     $eventRepository->create($event, $site, $user);
     $event = $eventRepository->loadByID($event->getId());
     $this->assertEquals(true, $event->hasCustomField($customFieldDefinition1));
     $this->assertEquals(false, $event->hasCustomField($customFieldDefinition2));
     $this->assertFalse($event->getIsDeleted());
     // LET's CHECK HISTORY
     $eventHistoryRepo = new EventHistoryRepository();
     $stat = $this->app['db']->prepare("SELECT * FROM event_history");
     $stat->execute();
     while ($data = $stat->fetch()) {
         $eventHistory = new EventHistoryModel();
         $eventHistory->setFromDataBaseRow($data);
         $eventHistoryRepo->ensureChangedFlagsAreSet($eventHistory);
     }
     $eventHistoryRepoBuilder = new EventHistoryRepositoryBuilder();
     $eventHistoryRepoBuilder->setEvent($event);
     $histories = $eventHistoryRepoBuilder->fetchAll();
     $this->assertEquals(1, count($histories));
     $historyCreate = $histories[0];
     $this->assertTrue($historyCreate->getCustomFieldChangedKnown($customFieldDefinition1));
     $this->assertTrue($historyCreate->getCustomFieldChanged($customFieldDefinition1));
     $this->assertFalse($historyCreate->getCustomFieldChanged($customFieldDefinition2));
 }