/**
  * Показатели, переданные в форме
  *
  * @return CArrayList
  */
 public function getIndexes()
 {
     if (is_null($this->_indexes)) {
         $this->_indexes = new CArrayList();
         foreach ($this->getItems()->getItems() as $key => $item) {
             if (strpos($key, "indexes") !== false) {
                 foreach ($item as $value) {
                     $indexValue = CRatingManager::getRatingIndexValue($value);
                     if (!is_null($indexValue)) {
                         $this->_indexes->add($indexValue->getId(), $indexValue);
                     }
                 }
             }
         }
     }
     return $this->_indexes;
 }
 public function actionDeleteValue()
 {
     $value = CRatingManager::getRatingIndexValue(CRequest::getInt("id"));
     if (!is_null($value)) {
         $index = $value->parentIndex->id;
         $value->remove();
         $this->redirect("?action=edit&id=" . $index);
         return true;
     }
     $this->redirect("?action=index");
 }
 public function actionGetDataForChart()
 {
     $data = array();
     if (array_key_exists("data", $_POST)) {
         $data = $_POST["data"];
     }
     // определяем, в каких годах искать
     $years = new CArrayList();
     if (array_key_exists("years", $data)) {
         foreach ($data['years'] as $item) {
             $year = CTaxonomyManager::getYear($item);
             if (!is_null($year)) {
                 $years->add($year->getId(), $year);
             }
         }
     } else {
         $years->add(CUtils::getCurrentYear()->getId(), CUtils::getCurrentYear());
     }
     // по каким показателям показывать
     $indexes = new CArrayList();
     if (array_key_exists("indexes", $data)) {
         foreach ($data["indexes"] as $item) {
             foreach (CRatingManager::getRatingIndexesByName($item)->getItems() as $index) {
                 if ($years->hasElement($index->year_id)) {
                     $indexes->add($index->getId(), $index);
                 }
             }
         }
     } else {
         foreach ($years->getItems() as $year) {
             foreach (CRatingManager::getRatingIndexesByYear($year)->getItems() as $index) {
                 $indexes->add($index->getId(), $index);
             }
         }
     }
     // по каким людям показывать
     $persons = new CArrayList();
     if (array_key_exists("persons", $data)) {
         foreach ($data["persons"] as $item) {
             $person = CStaffManager::getPerson($item);
             if (!is_null($person)) {
                 $persons->add($person->getId(), $person);
             }
         }
     } else {
         // показывать по всем, у кого показатели есть в указанных годах
         foreach (CStaffManager::getAllPersons()->getItems() as $person) {
             foreach ($years->getItems() as $year) {
                 foreach ($person->getRatingIndexesByYear($year)->getItems() as $index) {
                     if ($indexes->hasElement($index->getId())) {
                         $persons->add($person->getId(), $person);
                     }
                 }
             }
         }
     }
     $res = array();
     // начинаем собирать инфу по людям
     // подписи к осям
     $axis = array();
     $i = 0;
     foreach ($persons->getItems() as $person) {
         $i++;
         $axis[] = $person->getName();
         //$axis[] = $i;
     }
     // все показатели, которые есть у выбранных людей (id всех показателей)
     // за все годы
     $resIndexes = array();
     foreach ($persons->getItems() as $person) {
         foreach ($years->getItems() as $year) {
             foreach ($person->getRatingIndexesByYear($year)->getItems() as $index) {
                 if ($indexes->hasElement($index->getId())) {
                     $resIndexes[$index->title] = $index->title;
                 }
             }
         }
     }
     $indicators = array();
     // данные по годам
     // данные должны возвращаться в том же порядке, в котором у нас идут люди
     foreach ($resIndexes as $key => $value) {
         foreach ($years->getItems() as $year) {
             $data = array();
             // собираем данные по каждому человеку
             foreach ($persons->getItems() as $person) {
                 $indexValue = 0;
                 foreach ($person->getRatingIndexesByYear($year)->getItems() as $index) {
                     if ($index->title == $key) {
                         $indexValue = $index->getIndexValue();
                     }
                 }
                 $data[] = $indexValue;
             }
             $indicator = array("name" => $value . " (" . $year->name . ")", "data" => $data, "stack" => $year->name);
             $indicators[] = $indicator;
         }
     }
     $res["axis"] = $axis;
     $res["series"] = $indicators;
     echo json_encode($res);
 }
 /**
  * @static
  * @return CArrayList
  */
 public static function getAllRatingIndexes()
 {
     if (!self::$_cacheIndexesInit) {
         self::$_cacheIndexesInit = true;
         foreach (CActiveRecordProvider::getAllFromTable(TABLE_RATING_INDEXES)->getItems() as $item) {
             $obj = new CRatingIndex($item);
             self::getCacheIndexes()->add($obj->getId(), $obj);
         }
     }
     return self::getCacheIndexes();
 }
 public function actionFillIndexes()
 {
     $form = new CPersonRatingAutofillForm();
     $form->setAttributes(CRequest::getArray($form::getClassName()));
     $year = CTaxonomyManager::getYear($form->year_id);
     // берем показатели указанного года
     foreach (CRatingManager::getRatingIndexesByYear($year)->getItems() as $index) {
         foreach ($form->persons as $personId) {
             $person = CStaffManager::getPerson($personId);
             if (!is_null($person)) {
                 // удаляем старые показатели
                 foreach (CActiveRecordProvider::getWithCondition(TABLE_PERSON_RATINGS, "person_id = " . $person->getId() . " and year_id = " . $year->getId())->getItems() as $item) {
                     $item->remove();
                 }
                 // если поле не многозначное, то способ вычисления лежит в показателе
                 if (!$index->isMultivalue()) {
                     if ($index->person_method != "") {
                         $v = null;
                         eval('$v = $person->' . $index->person_method . ';');
                         if (!is_null($v)) {
                             if (strtoupper(get_class($v)) == "CTERM") {
                                 if ($index->getIndexValues()->hasElement($v->getId())) {
                                     $personValue = new CPersonRatingIndex();
                                     $personValue->person_id = $person->getId();
                                     $personValue->year_id = $year->getId();
                                     $personValue->index_id = $index->getIndexValues()->getItem($v->getId())->getId();
                                     $personValue->save();
                                 }
                             }
                         }
                     }
                 } else {
                     /**
                      * Это многозначный показатель, вычисляется отдельно каждое значение
                      */
                     foreach ($index->getIndexValues()->getItems() as $indexValue) {
                         if ($indexValue->evaluate_code != "") {
                             if ($indexValue->evaluate_method == "1") {
                                 // это sql-запрос
                                 $query = $indexValue->evaluate_code;
                                 $query = str_replace("%person%", $person->getId(), $query);
                                 $query = str_replace("%year%", $year->getId(), $query);
                                 $res = mysql_query($query);
                                 if (mysql_errno() == 0) {
                                     while ($row = mysql_fetch_assoc($res)) {
                                         if (array_key_exists("res", $row)) {
                                             if ($row['res'] == "1") {
                                                 $personValue = new CPersonRatingIndex();
                                                 $personValue->person_id = $person->getId();
                                                 $personValue->year_id = $year->getId();
                                                 $personValue->index_id = $indexValue->getId();
                                                 $personValue->save();
                                             }
                                         }
                                         break;
                                     }
                                 }
                             } elseif ($indexValue->evaluate_method == "2") {
                                 // это php код
                                 $v = null;
                                 $code = $indexValue->evaluate_code;
                                 $code = str_replace("%person%", $person->getId(), $code);
                                 $code = str_replace("%year%", $year->getId(), $code);
                                 eval('$v = ' . $code . ';');
                                 if ($v === true) {
                                     $personValue = new CPersonRatingIndex();
                                     $personValue->person_id = $person->getId();
                                     $personValue->year_id = $year->getId();
                                     $personValue->index_id = $indexValue->getId();
                                     $personValue->save();
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     $this->redirect("persons.php?action=index");
 }