$entity_manager = DB::getEntityManager();
$organisationRepo = $entity_manager->getRepository('Apollo\\Entities\\OrganisationEntity');
/**
 * @var OrganisationEntity $organisation
 */
$organisation = $organisationRepo->find(1);
$userRepo = User::getRepository();
/**
 * @var UserEntity $user
 */
$user = $userRepo->find(1);
date_default_timezone_set('Europe/London');
$date = new DateTime();
for ($i = 0; $i < 1; $i++) {
    $faker = Factory::create();
    $person = new PersonEntity();
    $person->setOrganisation($organisation);
    $person->setGivenName($faker->firstName);
    $person->setMiddleName($faker->firstName);
    $person->setLastName($faker->lastName);
    $person->setIsHidden(false);
    $entity_manager->persist($person);
    $entity_manager->flush();
    $record = new RecordEntity($user);
    $record->setPerson($person);
    $entity_manager->persist($record);
    $entity_manager->flush();
    $record->setVarchar(FIELD_RECORD_NAME, 'First Record');
    $record->setVarchar(FIELD_EMAIL, $faker->email);
    $record->setVarchar(FIELD_PHONE, $faker->phoneNumber);
    $record->setMultiple(FIELD_ADDRESS, explode(', ', $faker->address));
 /**
  * Given a person, this returns formatted information about the activities of the person
  * @param PersonEntity $person
  * @return array
  */
 public static function getFormattedActivitiesOfPerson($person)
 {
     /** @var PersonEntity $person */
     $activities = $person->getActivities();
     $ret = [];
     foreach ($activities as $activity) {
         if (!$activity->isHidden()) {
             $ret[] = Activity::getFormattedShortData($activity);
         }
     }
     return $ret;
 }
 /**
  * Action parsing operations on records, such as hiding, adding, duplicating
  * @todo: Extract till you drop!!!!!
  * @todo: ^ Well that didn't work
  * @since 0.0.2 Parses
  * @since 0.0.1
  */
 public function actionRecord()
 {
     $em = DB::getEntityManager();
     $data = $this->parseRequest(['action' => null]);
     $action = strtolower($data['action']);
     $response['error'] = null;
     switch ($action) {
         case 'create':
             $data = $this->parseRequest(['given_name' => null, 'middle_name' => null, 'last_name' => null, 'record_name' => null, 'start_date' => null, 'end_date' => null]);
             if (!empty($data['given_name']) && !empty($data['last_name']) && !empty($data['record_name']) && !empty($data['start_date']) && !empty($data['end_date'])) {
                 $user = Apollo::getInstance()->getUser();
                 $person = new PersonEntity();
                 $person->setOrganisation($user->getOrganisation());
                 $person->setGivenName($data['given_name']);
                 $person->setMiddleName($data['middle_name']);
                 $person->setLastName($data['last_name']);
                 $em->persist($person);
                 $start_date = new DateTime($data['start_date']);
                 $end_date = new DateTime($data['end_date']);
                 $record = new RecordEntity($user->getEntity());
                 $record->setPerson($person);
                 $em->persist($record);
                 $record->setVarchar(FIELD_RECORD_NAME, $data['record_name']);
                 $record->setDateTime(FIELD_START_DATE, $start_date);
                 $record->setDateTime(FIELD_END_DATE, $end_date);
                 $em->flush();
                 $response['record_id'] = $record->getId();
             } else {
                 $response['error'] = $this->getJSONError(1, 'Some of the fields are empty!');
             }
             break;
         case 'add':
             $data = $this->parseRequest(['person_id' => 0, 'id' => 0, 'record_name' => null, 'start_date' => null, 'end_date' => null]);
             if (!empty($data['record_name'])) {
                 $record = new RecordEntity(Apollo::getInstance()->getUser()->getEntity());
                 /** @var PersonEntity $person */
                 $person = Person::find($data['person_id']);
                 if ($person != null) {
                     $em = DB::getEntityManager();
                     $record->setPerson($person);
                     $em->persist($record);
                     $em->flush();
                     $start_date = new DateTime($data['start_date']);
                     $end_date = new DateTime($data['end_date']);
                     $record->setVarchar(FIELD_RECORD_NAME, $data['record_name']);
                     $record->setDateTime(FIELD_START_DATE, $start_date);
                     $record->setDateTime(FIELD_END_DATE, $end_date);
                     if ($data['id'] > 0) {
                         if (($sourceRecord = Record::getValidRecordWithId($data['id'])) != null) {
                             $fields = Field::getValidFields();
                             /**
                              * @var FieldEntity $field
                              */
                             foreach ($fields as $field) {
                                 if (!in_array($field->getId(), [FIELD_RECORD_NAME, FIELD_START_DATE, FIELD_END_DATE])) {
                                     $sourceData = $sourceRecord->findOrCreateData($field->getId());
                                     /** @var DataEntity $data */
                                     $data = clone $sourceData;
                                     $data->setRecord($record);
                                     $em->persist($data);
                                 }
                             }
                         } else {
                             $response['error'] = $this->getJSONError(1, 'Source record ID is invalid.');
                         }
                     }
                     $em->flush();
                     $response['record_id'] = $record->getId();
                 } else {
                     $response['error'] = $this->getJSONError(1, 'Invalid person ID.');
                 }
             } else {
                 $response['error'] = $this->getJSONError(1, 'You must specify a name for the new record.');
             }
             break;
         case 'hide':
             $data = $this->parseRequest(['id' => 0]);
             if ($data['id'] < 0) {
                 Apollo::getInstance()->getRequest()->error(400, 'Invalid ID specified.');
             }
             /**
              * @var RecordEntity $record
              */
             $record = Record::getValidRecordWithId($data['id']);
             if ($record != null) {
                 $person = $record->getPerson();
                 if (!empty($person)) {
                     $records = $person->getRecords();
                     $count = 0;
                     foreach ($records as $current_record) {
                         if (!$current_record->isHidden()) {
                             $count++;
                         }
                     }
                     if ($count > 1) {
                         $record->setIsHidden(true);
                         $em->flush();
                     } else {
                         $response['error'] = ['id' => 1, 'description' => 'This is the only visible record for this person, hence cannot be hidden.'];
                     }
                 } else {
                     $response['error'] = $this->getJSONError(1, 'Record belongs to another organisation!');
                 }
             } else {
                 $response['error'] = $this->getJSONError(1, 'Selected record is either already hidden or does not exist.');
             }
             break;
         default:
             Apollo::getInstance()->getRequest()->error(400, 'Invalid action.');
     }
     echo json_encode($response);
 }