Example #1
0
 static function ImportEmployee()
 {
     // Делаем запись в таблицу отчетов импорта
     $logreport = new Logreport();
     $logreport->logreport_date = date('Y-m-d');
     $logreport->save();
     self::$logreport_id = $logreport->logreport_id;
     // Идем по файлам импорта из 1С (сотрудники.txt - Сотрудники)
     foreach (['сотрудники.txt'] as $filename) {
         self::$filename = mb_convert_encoding('imp/' . $filename, 'Windows-1251', 'UTF-8');
         if (file_exists(self::$filename)) {
             ini_set('max_execution_time', 1000);
             // 1000 seconds
             ini_set('memory_limit', 1073741824);
             // 1Gbyte Max Memory
             // Определяем показатели импорта
             self::$logreport_errors = 0;
             // Не загружено записей из-за ошибок
             self::$logreport_additions = 0;
             // Записей добавлено
             self::$logreport_amount = 0;
             // Всего записей
             $i = 0;
             $handle = @fopen(self::$filename, "r");
             if ($handle) {
                 while (($subject = fgets($handle, 4096)) !== false) {
                     $i++;
                     $pattern = '/^(.+?)\\|(Поликлиника №\\s?[1,2,3] )?(.+?)\\|(.+?)\\|/ui';
                     preg_match($pattern, $subject, $matches);
                     if ($matches[0] !== NULL) {
                         $pattern = '/(^Поликлиника №)\\s?([1,2,3])\\s?$/ui';
                         $matches[2] = preg_replace($pattern, 'Взрослая $1$2', mb_strtolower($matches[2], 'UTF-8'));
                         if ($matches[3] === 'Поликлиника профилактических осмотров') {
                             $matches[2] = $matches[3];
                         }
                         $pattern = '/^(.+) БУ "Нижневартовская городская поликлиника"$/ui';
                         $matches[3] = preg_replace($pattern, '$1', $matches[3]);
                         $employee_fio = $matches[1];
                         $location = self::AssignLocationForEmployeeImport($matches[3], $matches[2]);
                         $id_dolzh = self::AssignDolzh($matches[4]);
                         // На случай если Здание у сотрудника не определено
                         $buildsql = $location->id_build === null ? 'id_build IS NULL' : 'id_build = :id_build';
                         // Находим сотрудника в базе, если не находим создаем новую запись
                         $Employee = Employee::model()->Find('employee_fio LIKE :employee_fio and id_dolzh = :id_dolzh and id_podraz = :id_podraz and ' . $buildsql, array_merge([':employee_fio' => $employee_fio, ':id_dolzh' => $id_dolzh, ':id_podraz' => $location->id_podraz], $location->id_build === null ? [] : [':id_build' => $location->id_build]));
                         if ($Employee === null) {
                             $Employee = new Employee();
                             $Employee->attributes = ['employee_fio' => $employee_fio, 'id_dolzh' => $id_dolzh, 'id_podraz' => $location->id_podraz, 'id_build' => $location->id_build];
                             $Employeelog = new Employeelog();
                             $Employeelog->id_logreport = self::$logreport_id;
                             $Employeelog->employeelog_type = 1;
                             $Employeelog->employeelog_filename = mb_convert_encoding(self::$filename, 'UTF-8', 'Windows-1251');
                             $Employeelog->employeelog_rownum = $i;
                             $Employeelog->employeelog_message = 'Запись добавлена.';
                             $Employee->scenario = 'import1c';
                             if ($Employee->validate()) {
                                 self::$logreport_additions++;
                                 $Employee->save(false);
                             } else {
                                 $Employeelog->employeelog_type = 3;
                                 $Employeelog->employeelog_message = 'Ошибка при добавлении записи: ';
                                 foreach ($Employee->getErrors() as $fields) {
                                     $Employeelog->employeelog_message .= implode(' ', $fields) . ' ';
                                 }
                                 self::$logreport_errors++;
                             }
                             $Employeelog->employee_fio = $Employee->employee_fio;
                             $Employeelog->dolzh_name = Dolzh::model()->findbyPk($Employee->id_dolzh)->dolzh_name;
                             $Employeelog->podraz_name = Podraz::model()->findbyPk($Employee->id_podraz)->podraz_name;
                             if ($Employee->id_build !== null) {
                                 $Employeelog->build_name = Build::model()->findbyPk($Employee->id_build)->build_name;
                             }
                             $Employeelog->save(false);
                         }
                     } elseif (trim($subject) !== '') {
                         $Employeelog = new Employeelog();
                         $Employeelog->id_logreport = self::$logreport_id;
                         $Employeelog->employeelog_type = 3;
                         $Employeelog->employeelog_filename = mb_convert_encoding(self::$filename, 'UTF-8', 'Windows-1251');
                         $Employeelog->employeelog_rownum = $i;
                         $Employeelog->employeelog_message = 'Ошибка при добавлении записи: Не пройдено регулярное выражение /^(.+?)\\|(Поликлиника №\\s?[1,2,3] )?(.+?)\\|(.+?)\\|/ui';
                         $Employeelog->save(false);
                         self::$logreport_errors++;
                     }
                 }
                 fclose($handle);
             }
             $logreport->logreport_additions += self::$logreport_additions;
             $logreport->logreport_errors += self::$logreport_errors;
             $logreport->logreport_amount = $i;
             $logreport->save();
         }
     }
     echo '<BR>Подразделения:<BR>';
     ARData::Data(Podraz::model(), Podraz::model()->Test())->PrintData();
     echo '<BR>Должности:<BR>';
     ARData::Data(Dolzh::model(), Dolzh::model()->Test())->PrintData();
     echo '<BR>Сотрудники:<BR>';
     ARData::Data(Employee::model(), Employee::model()->Test())->PrintData();
     echo '<BR>Лог:<BR>';
     ARData::Data(Employeelog::model(), Employeelog::model()->Test())->PrintData();
 }
Example #2
0
 static function Data_GetDataObject($model, $criteria, $rows, $page, $sidx, $sord)
 {
     /* Расчет параметров JQgrid */
     $limit = isset($rows) ? $rows : 1;
     $start = $limit * $page - $limit;
     // do not put $limit*($page - 1)
     /* limit */
     $criteria->offset = $start;
     $criteria->limit = $limit;
     /* sort */
     if (isset($sidx) && $sidx !== '' && isset($sord) && $sord !== '') {
         $criteria->order = $sidx . ' ' . $sord;
     }
     // < Поиск
     $search = (string) filter_input(INPUT_POST, '_search');
     // $recobj - объект с данными выборки класса ARData
     if ($search === 'true') {
         $fields = ARData::Data($model, $criteria)->GetDataObjectFields();
         foreach ($fields->fields as $attr) {
             Proc::CompareCriteria($attr->fieldname, (string) filter_input(INPUT_POST, $attr->fieldname), $criteria);
         }
     }
     // Поиск <
     $recobj = ARData::Data($model, $criteria)->GetDataObject();
     if (isset($criteria->limit)) {
         $criteria->limit = -1;
     }
     if (isset($criteria->offset)) {
         $criteria->offset = -1;
     }
     $totalrec = $model->count($criteria);
     $total_pages = ceil($totalrec / $limit) > 0 ? ceil($totalrec / $limit) : 1;
     /* $response - объект данных для JQGrid */
     $response = new stdClass();
     $response->page = $page;
     $response->records = $totalrec;
     $response->total = $total_pages;
     /* Перебираем записи выборки */
     foreach ($recobj->values as $i => $row) {
         $response->rows[$i]['id'] = $row[$recobj->fields[0]->fieldname];
         // Заполняем объект данными
         foreach ($row as $k => $value) {
             $response->rows[$i]['cell'][] = $value;
         }
     }
     return $response;
 }
Example #3
0
 public function actionTest1()
 {
     $ARData = ARData::Data(Impemployee::model(), Impemployee::model()->GetImpemployeeCriteria())->GetDataObjectFields();
     $result = $ARData->fields;
     echo "<br>-----------------------------------------------------<br>";
     var_dump($result);
 }
Example #4
0
 public function actionGrid2Excel()
 {
     $model = (string) filter_input(INPUT_GET, 'model');
     // $_GET['model'] - Имя модели, которая выгружается
     $commandmethod = (string) filter_input(INPUT_GET, 'commandmethod');
     // $_GET['commandmethod'] - Имя команды (cDBCommand с запросом), который выгружается
     $collist = (string) filter_input(INPUT_GET, 'collist');
     // $_GET['collist'] - Объект Имя атрибута: Строка поиска фильтра
     if ($model === '' && $commandmethod === '') {
         throw new CHttpException(500, 'Proc/Grid2Excel(): не передан параметр model или commandmethod');
     }
     if ($collist === '') {
         throw new CHttpException(500, 'Proc/Grid2Excel(): не передан параметр collist');
     }
     if ($model !== '' && !method_exists($model, 'GetPermissions')) {
         throw new CHttpException(500, 'Не существует метод "GetPermissions" модели "' . $model . '"');
     }
     if ($model !== '' && !$model::model()->GetPermissions('view')) {
         throw new CHttpException(500, 'Нет доступа для чтения модели "' . $model . '"');
     }
     ini_set('max_execution_time', 1000);
     // 1000 seconds
     ini_set('memory_limit', 1073741824);
     // 1Gbyte Max Memory
     /* Загружаем PHPExcel */
     $objPHPExcel = new PHPExcel();
     $collist = json_decode($collist);
     /* Сотрировка атрибутов */
     $sidx = (string) filter_input(INPUT_GET, 'sidx');
     $sord = (string) filter_input(INPUT_GET, 'sord') !== '' ? (string) filter_input(INPUT_GET, 'sord') : 'ASC';
     $c = 0;
     // Для количества колонок
     if ($model !== '') {
         $methodcriteria = (string) filter_input(INPUT_GET, 'criteriamethod');
         // class_exists($model, false) - дает false, непонятно почему
         /*   if (!class_exists($model, false) || !(method_exists($model, 'model') && $model::model() instanceof CActiveRecord))
              throw new CHttpException(500, $model . ' не является классом CActiveRecord'); */
         if ($methodcriteria !== '' && !method_exists($model, $methodcriteria)) {
             throw new CHttpException(500, 'Метод ' . $methodcriteria . ' отсутствует в модели ' . $model);
         }
         $criteria = $methodcriteria === '' ? new CDbCriteria() : $model::model()->{$methodcriteria}();
         // Берем критерий из модели
         if (!$criteria instanceof CDbCriteria) {
             throw new CHttpException(500, $methodcriteria . ' модели ' . $model . ' не возвращает класс CDbCriteria');
         }
         $model = $model::model();
         if ($sidx !== '') {
             $criteria->order = $sidx . ' ' . $sord;
         }
         /* Применяем критерии поиска */
         $criteria->select = [];
         foreach ($collist as $attr => $val) {
             if ($val->value !== '') {
                 Proc::CompareCriteria($attr, $val->value, $criteria);
             }
             $criteria->select[] = $attr;
         }
         /* Границы таблицы */
         $ramka = array('borders' => array('bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'top' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'left' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN)));
         /* Жирный шрифт для шапки таблицы */
         $font = array('font' => array('bold' => true), 'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER));
         $rows = ARData::Data($model, $criteria)->GetDataObject();
         if (count((array) $rows) > 0) {
             foreach ($rows->values as $i => $row) {
                 foreach ($rows->fields as $col => $attr) {
                     if ($i == 0) {
                         // заполняем шапку таблицы
                         $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $i + 1, $attr->label);
                         $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 1)->applyFromArray($ramka);
                         $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 1)->applyFromArray($font);
                     }
                     $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $i + 2, $rows->values[$i][$attr->fieldname]);
                     $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 2)->applyFromArray($ramka);
                 }
             }
         }
         $c = count($rows->fields);
     } else {
         $command = DBCommands::$commandmethod();
         $command->order($sidx . ' ' . $sord);
         /* Применяем критерии поиска */
         foreach ($collist as $attr => $val) {
             if ($val->value !== '') {
                 Proc::CompareCommand($attr, $val->value, $command);
             }
         }
         $item = $command->select;
         if ($item !== '*') {
             $cols_arr = strchr($item, ', ') === false ? [str_replace('`', '', $item)] : explode(', ', str_replace('`', '', $command->Select));
             array_walk($cols_arr, function (&$item, &$key) {
                 $key = strrchr($item, ' ') === false ? $item : substr(strrchr($item, ' '), 1);
                 $item = $item;
             });
         }
         /* Функция, проверяет, есть ли атрибут в объекте $collist */
         $CheckInArray = function ($attr, $key) use($collist) {
             return property_exists($collist, $key);
         };
         /* Фильтруем список атрибутов критерия, и отсеиваем, если атрибута нет в $collist */
         $cols_arr = array_filter($cols_arr, function ($attr) use($collist) {
             $key = strrchr($attr, ' ') === false ? $attr : substr(strrchr($attr, ' '), 1);
             return property_exists($collist, $key);
         });
         $command->select($cols_arr);
         $recs = $command->queryAll();
         $r = 2;
         // Ряд в Excel, с которого заполняются данные, $r = 1 - ряд для названий атрибутов
         foreach ($recs as $i => $row) {
             $c = 0;
             Proc::ApplyDataValuesbyCommand($row, $collist, $objPHPExcel, $r, $c, $command, $i);
             $r++;
         }
     }
     /* Авторазмер колонок Excel */
     foreach (range(0, $c) as $col) {
         $objPHPExcel->getActiveSheet()->getColumnDimensionByColumn($col)->setAutoSize(true);
     }
     /* присваиваем имя файла от имени модели */
     $FileName = $model !== '' && method_exists($model, 'GetLabel') ? $model->GetLabel() : 'Выгрузка';
     // Устанавливаем имя листа
     $objPHPExcel->getActiveSheet()->setTitle($FileName);
     // Выбираем первый лист
     $objPHPExcel->setActiveSheetIndex(0);
     /* Формируем файл Excel */
     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
     $FileName = DIRECTORY_SEPARATOR === '/' ? $FileName : mb_convert_encoding($FileName, 'Windows-1251', 'UTF-8');
     /* Proc::SaveFileIfExists() - Функция выводит подходящее имя файла, которое еще не существует. mb_convert_encoding() - Изменяем кодировку на кодировку Windows */
     $fileroot = Proc::SaveFileIfExists('files/' . $FileName . '.xlsx');
     /* Сохраняем файл в папку "files" */
     $objWriter->save('files/' . $fileroot);
     /* Возвращаем имя файла Excel */
     if (DIRECTORY_SEPARATOR === '/') {
         echo $fileroot;
     } else {
         echo mb_convert_encoding($fileroot, 'UTF-8', 'Windows-1251');
     }
 }