示例#1
0
 static function ImportDo()
 {
     // Делаем запись в таблицу отчетов импорта
     $logreport = new Logreport();
     $logreport->logreport_date = date('Y-m-d');
     $logreport->save();
     self::$logreport_id = $logreport->logreport_id;
     // Идем по файлам импорта из 1С (os.xls - Основные средства, mat.xls - Материалы)
     foreach (['os.xls', 'mat.xls'] as $filename) {
         self::$filename = dirname($_SERVER['SCRIPT_FILENAME']) . '/imp/' . $filename;
         self::$os = self::$filename === dirname($_SERVER['SCRIPT_FILENAME']) . '/imp/os.xls' ? true : false;
         var_dump(self::$filename);
         var_dump(file_exists(self::$filename));
         if (file_exists(self::$filename)) {
             ini_set('max_execution_time', 1000);
             // 1000 seconds
             ini_set('memory_limit', 1073741824);
             // 1Gbyte Max Memory
             $chunkSize = 1000;
             //размер считываемых строк за раз
             $startRow = self::$os ? self::$os_start : self::$mat_start;
             //начинаем читать с определенной строки
             $exit = false;
             //флаг выхода
             $empty_value = 0;
             //счетчик пустых знаений
             // Загружаем данные из файла Excel
             require_once Yii::app()->basePath . '/extensions/PHPExcel/Classes/PHPExcel/IOFactory.php';
             $objReader = PHPExcel_IOFactory::createReaderForFile(self::$filename);
             $objReader->setReadDataOnly(true);
             $chunkFilter = new chunkReadFilter();
             $objReader->setReadFilter($chunkFilter);
             // Грузим правила импорта для сотрудников
             self::$employeewords = ARData::Data(Importemployee::model())->GetDataObject();
             // Определяем показатели импорта
             self::$logreport_errors = 0;
             // Не загружено записей из-за ошибок
             self::$logreport_updates = 0;
             // Записей изменено
             self::$logreport_additions = 0;
             // Записей добавлено
             self::$logreport_missed = 0;
             // Записей пропущено (исключены из обработки)
             self::$logreport_amount = 0;
             // Всего записей
             while (!$exit) {
                 // Инициализируем переменные
                 //  $row = $sheetData[self::$rownum_xls];
                 $chunkFilter->setRows($startRow, $chunkSize);
                 //устанавливаем знаечние фильтра
                 $objPHPExcel = $objReader->load(self::$filename);
                 //открываем файл
                 $objPHPExcel->setActiveSheetIndex(0);
                 //устанавливаем индекс активной страницы
                 $objWorksheet = $objPHPExcel->getActiveSheet();
                 //делаем активной нужную страницу
                 // Идем по данных excel
                 for ($i = $startRow; $i < $startRow + $chunkSize; $i++) {
                     //внутренний цикл по строкам
                     self::$rownum_xls = $i;
                     $value = trim(htmlspecialchars($objWorksheet->getCellByColumnAndRow(0, $i)->getValue()));
                     //получаем первое знаение в строке
                     if (empty($value)) {
                         //проверяем значение на пустоту
                         $empty_value++;
                     }
                     if ($empty_value == 1) {
                         //после трех пустых значений, завершаем обработку файла, думая, что это конец
                         $exit = true;
                         break;
                     }
                     /* Манипуляции с данными каким Вам угодно способом, в PHPExcel их превеликое множество */
                     $row = $objWorksheet->rangeToArray('A' . $i . ':Q' . $i, null, true, true, true);
                     $row = $row[key($row)];
                     $material = new Material();
                     $employee = new Employee();
                     $mattraffic = new Mattraffic();
                     $matlog = new Matlog();
                     $employeelog = new Employeelog();
                     $traflog = new Traflog();
                     $MaterialDo = false;
                     $EmployeeDo = false;
                     $MattrafficDo = false;
                     // Применяем значения атрубутов Материальной ценности
                     $MaterialDo = self::MaterialDo($material, $matlog, $row);
                     if ($MaterialDo) {
                         // Применяем значения атрубутов Сотрудника
                         $EmployeeDo = self::EmployeeDo($employee, $employeelog, $row);
                         if ($EmployeeDo) {
                             // Применяем значения атрубутов "Операции над материальной ценностью"
                             $MattrafficDo = self::MattrafficDo($mattraffic, $traflog, $row, $material, $employee->employee_id);
                         }
                     }
                     // Начинаем транзакцию
                     $transaction = Yii::app()->db->beginTransaction();
                     try {
                         // $matlog->matlog_type !== 5 - Если Запись не изменилась не пишем в лог
                         if ($matlog->matlog_type !== 5 && ($MaterialDo || count($material->getErrors()) > 0)) {
                             $matlog->save(false);
                         }
                         if ($MaterialDo) {
                             // $employeelog->employeelog_type !== 5 - Если Запись не изменилась не пишем в лог
                             if ($employeelog->employeelog_type !== 5 && ($EmployeeDo || count($employee->getErrors()) > 0)) {
                                 $employeelog->save(false);
                             }
                             if ($EmployeeDo) {
                                 if ($MattrafficDo || count($mattraffic->getErrors()) > 0) {
                                     if ($matlog->IsNewRecord) {
                                         $matlog->material_number = $material->material_number;
                                         // Иначе пишется предыдущее значение количества материальной ценности
                                         $matlog->save(false);
                                     }
                                     if ($employeelog->IsNewRecord) {
                                         $employeelog->save(false);
                                     }
                                     $traflog->id_matlog = $matlog->matlog_id;
                                     $traflog->id_employeelog = $employeelog->employeelog_id;
                                     $traflog->save(false);
                                 }
                                 if ($MattrafficDo) {
                                     $material->save(false);
                                     $employee->save(false);
                                     $mattraffic->id_material = $material->material_id;
                                     $mattraffic->id_mol = $employee->employee_id;
                                     $mattraffic->save(false);
                                     // Применяем значения атрубутов, если материальная ценность списна
                                     self::WriteOffDo($material, $matlog, $mattraffic, $traflog, $row);
                                 }
                             }
                         }
                         $transaction->commit();
                     } catch (Exception $e) {
                         $transaction->rollback();
                         throw new CException($e->getMessage() . ' $rownum_xls = ' . self::$rownum_xls . '; $filename = ' . self::$filename);
                     }
                 }
                 $objPHPExcel->disconnectWorksheets();
                 //чистим
                 unset($objPHPExcel);
                 //память
                 $startRow += $chunkSize;
                 //переходим на следующий шаг цикла, увеличивая строку, с которой будем читать файл
             }
             $logreport->logreport_additions += self::$logreport_additions;
             $logreport->logreport_updates += self::$logreport_updates;
             $logreport->logreport_errors += self::$logreport_errors;
             $logreport->logreport_missed += self::$logreport_missed;
             $logreport->logreport_amount += self::$rownum_xls - (self::$os ? self::$os_start : self::$mat_start);
             $logreport->save();
         }
     }
     ARData::Data(Traflog::model(), Traflog::model()->Test())->PrintData();
     echo '<BR>';
     ARData::Data(Matlog::model(), Matlog::model()->Test())->PrintData();
     echo '<BR>';
     ARData::Data(Employeelog::model(), Employeelog::model()->Test())->PrintData();
     echo '<BR>';
     ARData::Data(Material::model(), Material::model()->Test())->PrintData();
     echo '<BR> Акты списания';
     ARData::Data(Writeoffakt::model(), Writeoffakt::model()->Test())->PrintData();
 }
示例#2
0
 public function actionGetLogreport()
 {
     $logreportid = (string) filter_input(INPUT_GET, 'logreportid');
     if ($logreportid === '') {
         throw new CHttpException(500, 'Fregat/Fregat/GetLogreport((): не передан параметр logreportid');
     }
     ini_set('max_execution_time', 1000);
     // 1000 seconds
     ini_set('memory_limit', 1073741824);
     // 1Gbyte Max Memory
     /* Загружаем PHPExcel */
     $objPHPExcel = new PHPExcel();
     /* Границы таблицы */
     $ramka = array('borders' => array('allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN)));
     /* Жирный шрифт для шапки таблицы */
     $font = array('font' => array('bold' => true), 'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER));
     $rows = ARData::Data(Logreport::model(), Logreport::model()->GetLogreportCriteria($logreportid))->GetDataObject();
     $itog = $objPHPExcel->getActiveSheet();
     $itog->setTitle('Итоги');
     $matsheet = $objPHPExcel->createSheet(1);
     $matsheet->setTitle('Материальные ценности');
     $empsheet = $objPHPExcel->createSheet(2);
     $empsheet->setTitle('Сотрудники');
     $trafsheet = $objPHPExcel->createSheet(3);
     $trafsheet->setTitle('Операции над мат. ценностями');
     $itog->setCellValueByColumnAndRow(0, 1, 'Отчет импорта №' . $logreportid);
     $itog->setCellValueByColumnAndRow(0, 2, 'Дата: ' . date('d.m.Y', strtotime($rows->values[0]['logreport_date'])));
     $itog->getStyle('A2')->applyFromArray(array('font' => array('italic' => true, 'size' => 12)));
     $itog->setCellValueByColumnAndRow(0, 4, Logreport::model()->getAttributeLabel('logreport_amount'));
     $itog->setCellValueByColumnAndRow(1, 4, Logreport::model()->getAttributeLabel('logreport_additions'));
     $itog->setCellValueByColumnAndRow(2, 4, Logreport::model()->getAttributeLabel('logreport_updates'));
     $itog->setCellValueByColumnAndRow(3, 4, Logreport::model()->getAttributeLabel('logreport_errors'));
     $itog->setCellValueByColumnAndRow(4, 4, Logreport::model()->getAttributeLabel('logreport_missed'));
     $itog->setCellValueByColumnAndRow(0, 5, $rows->values[0]['logreport_amount']);
     $itog->setCellValueByColumnAndRow(1, 5, $rows->values[0]['logreport_additions']);
     $itog->setCellValueByColumnAndRow(2, 5, $rows->values[0]['logreport_updates']);
     $itog->setCellValueByColumnAndRow(3, 5, $rows->values[0]['logreport_errors']);
     $itog->setCellValueByColumnAndRow(4, 5, $rows->values[0]['logreport_missed']);
     $itog->getStyle('A4:E5')->applyFromArray($ramka);
     $itog->getStyle('A4:E4')->applyFromArray($font);
     $itog->getStyle('A1')->applyFromArray(array('font' => array('bold' => true, 'size' => 14), 'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER)));
     $itog->mergeCells('A1:E1');
     $c = count($rows->fields);
     /* Авторазмер колонок Excel */
     foreach (range(0, $c) as $col) {
         $itog->getColumnDimensionByColumn($col)->setAutoSize(true);
     }
     //      ----------------  Материальные ценности ------------------------------------------
     $rows = ARData::Data(Matlog::model(), Matlog::model()->GetMatlogCriteria($logreportid))->GetDataObject();
     $this->ExcelApplyValues($matsheet, $rows, ['date' => ['material_release'], 'string' => ['material_1c', 'material_inv', 'material_serial'], 'case' => ['material_tip' => [1 => 'Основное средство', 2 => 'Материал']]]);
     // ----------------------- Сотрудники -------------------------------
     $rows = ARData::Data(Employeelog::model(), Employeelog::model()->GetEmployeelogCriteria($logreportid))->GetDataObject();
     $this->ExcelApplyValues($empsheet, $rows);
     // ---------------------- Операции над материальными ценностями -------------------------------------------
     $rows = ARData::Data(Traflog::model(), Traflog::model()->GetTraflogCriteria($logreportid))->GetDataObject();
     $this->ExcelApplyValues($trafsheet, $rows, ['string' => ['material_1c', 'material_inv']]);
     /* присваиваем имя файла от имени модели */
     $FileName = 'Отчет импорта в систему Фрегат';
     // Устанавливаем имя листа
     //  $itog->setTitle($FileName);
     // Выбираем первый лист
     $objPHPExcel->setActiveSheetIndex(0);
     /* Формируем файл Excel */
     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
     /* Proc::SaveFileIfExists() - Функция выводит подходящее имя файла, которое еще не существует. mb_convert_encoding() - Изменяем кодировку на кодировку Windows */
     $FileName = DIRECTORY_SEPARATOR === '/' ? $FileName : mb_convert_encoding($FileName, 'Windows-1251', 'UTF-8');
     $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');
     }
 }