/**
  * Returns an array of all the fields of the record
  * @param RecordEntity $record
  * @param $is_essential
  * @return array
  */
 public static function getFormattedFields($record, $is_essential)
 {
     $fieldsData = [];
     $fieldRepo = Field::getRepository();
     $fields = $fieldRepo->findBy(['is_essential' => $is_essential, 'is_hidden' => false, 'organisation' => Apollo::getInstance()->getUser()->getOrganisationId()]);
     foreach ($fields as $field) {
         $fieldData = self::getFormattedField($record, $field);
         $fieldsData[] = $fieldData;
     }
     return $fieldsData;
 }
 /**
  * Returns the data field or creates it if it does not exist
  *
  * @param int $field_id
  * @return DataEntity
  * @since 0.0.7 Now takes into account the type of the field
  * @since 0.0.6
  */
 public function findOrCreateData($field_id)
 {
     /**
      * @var FieldEntity $field
      */
     $field = Field::getRepository()->find($field_id);
     $data = Data::getRepository()->findOneBy(['record' => $this->getId(), 'field' => $field_id]);
     if ($data == null) {
         $data = new DataEntity();
         $data->setRecord($this);
         $data->setField($field);
         $data->setUpdatedBy(Apollo::getInstance()->getConsole()->getEntity());
         if ($field->hasDefault()) {
             if ($field->isMultiple()) {
                 $data->setLongText(serialize([0]));
             } else {
                 $data->setInt(0);
             }
             $data->setIsDefault(true);
         } else {
             if ($field->isMultiple()) {
                 $value = [''];
                 $data->setLongText(serialize($value));
             }
         }
         DB::getEntityManager()->persist($data);
         DB::getEntityManager()->flush();
     }
     return $data;
 }
 /**
  * Parses filters and applies them to the return values
  *
  * @todo: Include non-recent records too
  * @todo: extract. extract. extract. (this function is ~190 lines long!)
  * @param PersonEntity[] $people
  * @param $states
  * @return mixed[]
  */
 private function applyFilters($people, $states = null)
 {
     $filteredPeople = [];
     $fieldRepository = Field::getRepository();
     if ($states == null) {
         $filteredPeople = $people;
     } else {
         for ($i = 0; $i < count($people); $i++) {
             $add = false;
             $person = $people[$i];
             $record = Person::getMostRecentRecord($person);
             for ($k = 0; $k < count($states); $k++) {
                 $state = $states[$k];
                 /** @var FieldEntity $field */
                 $fieldID = intval($state['field']);
                 $field = $fieldRepository->find($fieldID);
                 $relation = intval($state['relation']);
                 switch ($field->getType()) {
                     case 2:
                         $value = !empty($state['value']) ? $state['value'] : '';
                         if ($field->hasDefault()) {
                             if ($field->isAllowOther()) {
                                 $data = $record->findOrCreateData($fieldID);
                                 if ($relation != 2 && $data->isDefault()) {
                                     $value = intval($value);
                                     $recordValue = $record->findInt($fieldID);
                                     switch ($relation) {
                                         case 1:
                                             $add = $recordValue != $value;
                                             break;
                                         default:
                                             $add = $recordValue == $value;
                                     }
                                 } elseif ($relation == 2 && !$data->isDefault()) {
                                     $recordValue = $data->getVarchar();
                                     $add = empty($value) || strpos(strtolower($recordValue), strtolower($value)) !== false;
                                 } else {
                                     $add = false;
                                 }
                             } elseif ($field->isMultiple()) {
                                 $value = intval($value);
                                 $recordValues = $record->findMultiple($fieldID);
                                 switch ($relation) {
                                     case 1:
                                         $add = !in_array($value, $recordValues);
                                         break;
                                     default:
                                         $add = in_array($value, $recordValues);
                                 }
                             } else {
                                 $value = intval($value);
                                 $recordValue = $record->findInt($fieldID);
                                 switch ($relation) {
                                     case 1:
                                         $add = $recordValue != $value;
                                         break;
                                     default:
                                         $add = $recordValue == $value;
                                 }
                             }
                         } elseif ($field->isMultiple()) {
                             $recordValues = $record->findMultiple($fieldID);
                             switch ($relation) {
                                 case 1:
                                     $contains = false;
                                     foreach ($recordValues as $recordValue) {
                                         if (empty($value) || strpos(strtolower($recordValue), strtolower($value)) !== false) {
                                             $contains = true;
                                             break;
                                         }
                                     }
                                     $add = !(empty($value) || $contains);
                                     break;
                                 case 2:
                                     $empty = true;
                                     foreach ($recordValues as $recordValue) {
                                         if (!empty($recordValue)) {
                                             $empty = false;
                                             break;
                                         }
                                     }
                                     $add = $empty;
                                     break;
                                 case 3:
                                     $empty = true;
                                     foreach ($recordValues as $recordValue) {
                                         if (!empty($recordValue)) {
                                             $empty = false;
                                             break;
                                         }
                                     }
                                     $add = !$empty;
                                     break;
                                 default:
                                     $contains = false;
                                     foreach ($recordValues as $recordValue) {
                                         if (empty($value) || strpos(strtolower($recordValue), strtolower($value)) !== false) {
                                             $contains = true;
                                             break;
                                         }
                                     }
                                     $add = empty($value) || $contains;
                             }
                         } else {
                             $recordValue = $record->findVarchar($fieldID);
                             switch ($relation) {
                                 case 1:
                                     $add = !(empty($value) || strpos(strtolower($recordValue), strtolower($value)) !== false);
                                     break;
                                 case 2:
                                     $add = $recordValue == $value;
                                     break;
                                 case 3:
                                     $add = $recordValue != $value;
                                     break;
                                 case 4:
                                     $add = empty($recordValue);
                                     break;
                                 case 5:
                                     $add = !empty($recordValue);
                                     break;
                                 default:
                                     $add = empty($value) || strpos(strtolower($recordValue), strtolower($value)) !== false;
                             }
                         }
                         break;
                     case 3:
                         $value = new DateTime($state['value']);
                         $recordValue = $record->findDateTime($fieldID);
                         switch ($relation) {
                             case 1:
                                 $add = $recordValue != $value;
                                 break;
                             case 2:
                                 $add = $recordValue < $value;
                                 break;
                             case 3:
                                 $add = $recordValue > $value;
                                 break;
                             default:
                                 $add = $recordValue == $value;
                         }
                         break;
                     case 4:
                         $value = $state['value'];
                         $recordValue = $record->findLongText($fieldID);
                         switch ($relation) {
                             case 1:
                                 $add = !(empty($value) || strpos(strtolower($recordValue), strtolower($value)) !== false);
                                 break;
                             case 2:
                                 $add = empty($recordValue);
                                 break;
                             case 3:
                                 $add = !empty($recordValue);
                                 break;
                             default:
                                 $add = empty($value) || strpos(strtolower($recordValue), strtolower($value)) !== false;
                         }
                         break;
                     default:
                         $value = intval($state['value']);
                         $recordValue = $record->findInt($fieldID);
                         switch ($relation) {
                             case 1:
                                 $add = $recordValue != $value;
                                 break;
                             case 2:
                                 $add = $recordValue < $value;
                                 break;
                             case 3:
                                 $add = $recordValue > $value;
                                 break;
                             default:
                                 $add = $recordValue == $value;
                         }
                 }
                 if (!$add) {
                     break;
                 }
             }
             if ($add) {
                 $filteredPeople[] = $person;
             }
         }
     }
     return $filteredPeople;
 }