/**
  * @param boolean $includeRequired
  * @param boolean $includeNonRequired
  * @param $includeReadOnly
  * @return array
  */
 protected function resolveDynamicallyDerivedAttributesForActionsOrTimeTriggerData($includeRequired = false, $includeNonRequired = false, $includeReadOnly = false)
 {
     assert('is_bool($includeRequired)');
     assert('is_bool($includeNonRequired)');
     assert('is_bool($includeReadOnly)');
     $attributes = array();
     foreach ($this->model->getAttributes() as $attribute => $notUsed) {
         if (!$this->model instanceof User && $this->model->isRelation($attribute) && (!$this->model->isAttributeReadOnly($attribute) || $includeReadOnly) && $this->model->getRelationModelClassName($attribute) == 'User') {
             $attributeIsRequired = $this->model->isAttributeRequired($attribute);
             if ($includeNonRequired && !$attributeIsRequired || $includeRequired && $attributeIsRequired) {
                 $attributes[$attribute . FormModelUtil::DELIMITER . self::DYNAMIC_ATTRIBUTE_USER] = array('label' => $this->model->getAttributeLabel($attribute));
             }
         }
         if ($this->model->isRelation($attribute) && $this->model->isOwnedRelation($attribute) && $this->isRelationASingularRelation($attribute) && ($this->model->getRelationModelClassName($attribute) == 'Address' || $this->model->getRelationModelClassName($attribute) == 'Email')) {
             $relatedModel = $this->model->{$attribute};
             //Assumes only Email or Address are possible owned models here
             $zurmoRules = WorkflowRules::makeByModuleClassName('ZurmoModule');
             foreach ($relatedModel->getAttributes() as $relatedAttribute => $notUsed) {
                 if (!$relatedModel->isAttributeReadOnly($relatedAttribute) && !$relatedModel->isRelation($relatedAttribute) && $zurmoRules->attributeCanBeTriggered($relatedModel, $relatedAttribute)) {
                     $relatedAttributeIsRequired = $relatedModel->isAttributeRequired($relatedAttribute);
                     if ($includeNonRequired && !$relatedAttributeIsRequired || $includeRequired && $relatedAttributeIsRequired) {
                         $attributes[$attribute . FormModelUtil::RELATION_DELIMITER . $relatedAttribute] = array('label' => $this->model->getAttributeLabel($attribute) . ' ' . ComponentForWorkflowForm::DISPLAY_LABEL_RELATION_DIVIDER . ' ' . $relatedModel->getAttributeLabel($relatedAttribute));
                     }
                 }
             }
         }
     }
     return $attributes;
 }
 /**
  * Some relations such as a CustomField are shown as non-related nodes in the workflow wizard. For a custom field
  * this method would return true for example.  Whereas account -> opportunities would return false.
  * @param RedBeanModel $model
  * @param $relation
  * @return bool
  */
 public function relationIsUsedAsAttribute(RedBeanModel $model, $relation)
 {
     assert('is_string($relation)');
     $modelClassName = $model->getAttributeModelClassName($relation);
     $metadata = static::getMetadata();
     if (isset($metadata[$modelClassName]) && isset($metadata[$modelClassName]['relationIsUsedAsAttributes']) && in_array($relation, $metadata[$modelClassName]['relationIsUsedAsAttributes'])) {
         return true;
     }
     if (in_array($model->getRelationModelClassName($relation), array('OwnedCustomField', 'CustomField', 'OwnedMultipleValuesCustomField', 'MultipleValuesCustomField', 'CurrencyValue'))) {
         return true;
     }
     return false;
 }
 /**
  * @return array
  */
 protected function getDynamicallyDerivedAttributesData()
 {
     if (isset(self::$dynamicallyDerivedAttributesData[get_class($this->model)])) {
         return self::$dynamicallyDerivedAttributesData[get_class($this->model)];
     }
     $attributes = array();
     foreach ($this->model->getAttributes() as $attribute => $notUsed) {
         if (!$this->model instanceof User && $this->model->isRelation($attribute) && $this->model->getRelationModelClassName($attribute) == 'User') {
             $attributes[$attribute . FormModelUtil::DELIMITER . self::DYNAMIC_ATTRIBUTE_USER] = array('label' => $this->model->getAttributeLabel($attribute));
         }
     }
     self::$dynamicallyDerivedAttributesData[get_class($this->model)] = $attributes;
     return self::$dynamicallyDerivedAttributesData[get_class($this->model)];
 }
 /**
  * Make an array of message strings by RedBeanModel errors
  * @param array $errors RedBeanModel errors
  */
 public static function makeMessagesByModel(RedBeanModel $model)
 {
     $messages = array();
     foreach ($model->getErrors() as $attributeName => $errors) {
         foreach ($errors as $relationAttributeName => $errorOrRelatedError) {
             if (is_array($errorOrRelatedError)) {
                 $relationModelClassName = $model->getRelationModelClassName($attributeName);
                 foreach ($errorOrRelatedError as $relatedError) {
                     if ($relatedError != '') {
                         $messages[] = LabelUtil::makeModelAndAttributeNameCombinationLabel(get_class($model), $attributeName) . ' - ' . $relatedError;
                     }
                 }
             } elseif ($errorOrRelatedError != '') {
                 $messages[] = LabelUtil::makeModelAndAttributeNameCombinationLabel(get_class($model), $attributeName) . ' - ' . $errorOrRelatedError;
             }
         }
     }
     return $messages;
 }
 /**
  * @param RedBeanModel $model
  * @param string $relation
  * @return null|string
  * @throws NotSupportedException if the relation is not really reported as an attribute
  */
 public function getGroupByRelatedAttributeForRelationReportedAsAttribute(RedBeanModel $model, $relation)
 {
     assert('is_string($relation)');
     $modelClassName = $model->getAttributeModelClassName($relation);
     $metadata = static::getMetadata();
     if (isset($metadata[$modelClassName]) && isset($metadata[$modelClassName]['relationsReportedAsAttributes']) && in_array($relation, $metadata[$modelClassName]['relationsReportedAsAttributes'])) {
         if (isset($metadata[$modelClassName]['relationsReportedAsAttributesGroupByAttributes'][$relation])) {
             return $metadata[$modelClassName]['relationsReportedAsAttributesGroupByAttributes'][$relation];
         } else {
             return null;
         }
     }
     if (in_array($model->getRelationModelClassName($relation), array('OwnedCustomField', 'CustomField', 'OwnedMultipleValuesCustomField', 'MultipleValuesCustomField', 'CurrencyValue'))) {
         return 'value';
     }
     throw new NotSupportedException();
 }