<?php

include_once("c_client.php");
class c_page_cab_client_personals_upload_from_excel extends c_page_cab_client
{
  public $h1='Загрузка списка сотрудников из Excel' ;

 function block_main()
 { $this->page_title() ;
   if (!$this->cmd_exec_result['no_default_panel']) $this->panel_upload_promt() ;
 }

 function panel_upload_promt()
 {
     ?><div id="panel_upload_promt"><form action="" method="POST" enctype="multipart/form-data"><input type="hidden" name="cmd" value="upload_file">
      <p>Загрузите список сотрудников, используя заранее подготовленный файл Excel. <a href="<?echo _PATH_TO_EXT?>/aspmo_client/docs/demo_persons2.xls">Образец файла</a><p>
      <p><strong>Внимание!</strong><p>
      <ul class="info"><li>Записи из файла будут добавлены к существующим записям базы</li>
          <li>При совпадении номера водительского удостоверения записи в базе будут обновлены.</li>
      </ul>
      <div class=comment>Размер файла не более 1М, формат файла - Excel XLS.</div>

      <div class=buttons><input name="upload_file[]" type="file" size="50"><input type="submit" value="Загрузить файл" class=button_green>&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name=read_only value="1"> Не добавлять записи в базу, только показать</div>
     </form></div><?
 }

    function CMD_upload_file()
     { damp_array($_POST)  ;
       if (_sizeof($_FILES))
       { $recs_files=conver_FILES_to_recs($_FILES['upload_file']) ;
         //damp_array($recs_files,1,-1) ;
         if (_sizeof($recs_files[0]))
           { if ($recs_files[0]['type']=='application/vnd.ms-excel' or 1)
             { ob_start() ;
               ?><h2>Загружаем данные из файла "<?echo $recs_files[0]['name']?>"</h2><?
               if ($_POST['read_only']) {?><strong>Только чтение загруженного файла</strong><?}

                 $recs=$this->upload_personal_from_excel($recs_files[0]['tmp_name']) ;
                 $res['Загружено из файла XLS']=_sizeof($recs) ;

                 if ($_POST['read_only']) print_2x_arr($recs) ;
                 else                     { $result=$this->adding_personal_from_array($recs) ;
                                            $res['Добавлено записей в базу']=$result[0] ;
                                            $res['Обновлено записей в базе']=$result[1] ;
                                            $res['Заблокировано обновление']=$result[2] ;
                                            $res['Ошибка при добавлении']=$result[3] ;

                                          }
                 echo '<br><strong>Загрузка завершена</strong><br>'  ;
                 damp_array($res,1,-1) ;
                 reboot_engine() ;

               $text=ob_get_clean() ;
               LOGS()->reg_log('Загрузка списка водителей из XLS',$text) ;
               echo $text ;
               return(array('type'=>'success','no_default_panel'=>1)) ;
             }
             else return(array('type'=>'error','code'=>'failed_type','text'=>'Неверный тип файла. Загрузите файл в формате Excel.')) ;
           }
         else return(array('type'=>'error','code'=>'not_uploaded_file','text'=>'Не был выбран файл')) ;
       }
       else return(array('type'=>'error','code'=>'not_uploaded_file','text'=>'Не был выбран файл')) ;
     }

      //==========================================================================================================================================================================
      // ЗАГРУЗКА ВОДИТЕЛЕЙ ИЗ EXCEL
      //==========================================================================================================================================================================

      function upload_personal_from_excel($tmp_file_name)
      { $file_name=_DIR_TO_ROOT.'/tmp/drivers_'.rand(1,100).'.xls' ;  $recs = array();
        move_uploaded_file($tmp_file_name,$file_name) ;
        set_include_path(_DIR_TO_ROOT.'/AddOns/PHPExcel/');
        include_once 'PHPExcel/IOFactory.php';
        $objPHPExcel = PHPExcel_IOFactory::load($file_name);
        $objPHPExcel->setActiveSheetIndex(0);
        $aSheet = $objPHPExcel->getActiveSheet();
        if (is_object($aSheet))
        {   $rowIterator = $objPHPExcel->getActiveSheet()->getRowIterator();
            $line=1 ; $arr_row_names=array() ;
            foreach($rowIterator as $row)
            { $cellIterator = $row->getCellIterator();
              $cur_row=$row->getRowIndex() ;
              $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
              $rec=array() ; $col=1 ; $_name=array() ;
              foreach ($cellIterator as $cell)
                { $value=$cell->getCalculatedValue();
                  if ($cur_row==1) $arr_row_names[$cell->getColumn()]=str_replace("\n",'',$value) ;  // первая строка - заголовки
                  else
                  { $res_arr[$cur_row][$arr_row_names[$cell->getColumn()]]=$value ;
                    $col_name=trim($arr_row_names[$cell->getColumn()]);
                    switch($col_name)
                    { case 'UID':              if ($value) $rec['uid']=$value ;  break ;
                      case 'ФИО':              if ($value) $rec['obj_name']=$value ;  break ;
                      case 'Фамилия':          if ($value) $rec['name1']=$value ;  break ;
                      case 'Имя':              if ($value) $rec['name2']=$value ;  break ;
                      case 'Отчество':         if ($value) $rec['name3']=$value ;  break ;
                      case 'Таб.№':            if ($value) $rec['tab_number']=$value ;  break ;
                      case 'Пропуск':          if ($value) $rec['propusk']=$value ;  break ;
                      case 'Права':            if ($value) $rec['driving']=$value ;  break ;
                      case 'Должность':        if ($value) $rec['_working_name']=$value ;  break ;
                      case 'Компания':
                      case 'Организация':      if ($value) $rec['_org_name']=$value ;  break ;
                      case 'Подразделение':    if ($value) $rec['_otdel_name']=$value ;  break ;
                      //case 'Подразделение1':
                      //case 'Подразделение2':
                      //case 'Подразделение3':
                      //case 'Подразделение4':
                      //case 'Подразделение5':
                      //case 'Подразделение6':   if ($value) $rec['_otdels_names'][]=$value ;  break ;
                      case 'Дата рождения':
                      case 'ДатаРожд':         list($rec['dr'],$rec['age'])=$this->get_dr_age($cell->getFormattedValue()) ;break ;
                      case 'Пол':              $rec['pol']=($value=='мужской' or $value=='Мужской' or $value=="M")? 0:1 ;break ;
                    }
                  }
                  $col++ ;
                }
             if (!$rec['obj_name']) $rec['obj_name']=$rec['name1'].' '.$rec['name2'].' '.$rec['name3'] ;
             if (!$rec['propusk']) $rec['propusk']=$rec['uid'];
             if (!$rec['tab_number']) $rec['tab_number']=$rec['uid'];

             if ($line>1 and $rec['uid']) $recs[]=$rec ;
             $line++ ;
            }
        }
        return($recs) ;
     }

    function adding_personal_from_array(&$recs)
       {  $cnt_update=0 ; $cnt_adding=0 ;
          $arr_org_names=execSQL_row('select pkey,obj_name from '.PERSONAL()->table_name.' where clss=207 and parent=1') ;
          $arr_work_names=execSQL_row('select id,obj_name from obj_site_list where clss=20 and parent='._IL('IL_works')->list_id) ;
          $_arr_otdel_names=execSQL('select pkey,parent,obj_name from '.PERSONAL()->table_name.' where clss=208 and parent!=1 and pkey!=1') ;

          $arr_otdel_names=group_by_field('parent',$_arr_otdel_names,'pkey','obj_name') ;
          //damp_array($arr_org_names,1,-1) ; damp_array($arr_otdel_names,1,-1) ; damp_array($arr_work_names,1,-1) ;
          if (_sizeof($recs)) foreach($recs as $indx=>$rec)
           { $org_id=0 ; $otdel_id=0 ; $work_id=0 ;  // damp_array($rec) ;
             // проверяем организацию
             if ($rec['_org_name'])
             {   if (_sizeof($arr_org_names) and in_array($rec['_org_name'],$arr_org_names)) $org_id=array_search($rec['_org_name'],$arr_org_names) ;
                 else
                 { echo 'Добавляем новую организацию - "<strong>'.$rec['_org_name'].'</strong>"<br>' ;
                   $org_id=adding_rec_to_table(PERSONAL()->table_name,array('clss'=>207,'parent'=>1,'obj_name'=>$rec['_org_name'],'client_id'=>MEMBER()->id)) ;
                   $arr_org_names[$org_id]=$rec['_org_name'] ;
                   //LOGS()->reg_log('Изменение структуры каталога сотрудников','Добавление новой организации - "'.$rec['_org_name'].'", id='.$org_id) ;
                 }
             }
             //echo '$org_id='.$org_id.'<br>';
             // проверяем отдел
             if ($rec['_otdel_name'])
             {   if (_sizeof($arr_otdel_names[$org_id]) and in_array($rec['_otdel_name'],$arr_otdel_names[$org_id])) $otdel_id=array_search($rec['_otdel_name'],$arr_otdel_names[$org_id]) ;
                 else
                   { echo 'Добавляем новый отдел - "<strong>'.$rec['_otdel_name'].'</strong>"<br>' ;
                     $otdel_id=adding_rec_to_table(PERSONAL()->table_name,array('clss'=>208,'parent'=>$org_id,'obj_name'=>$rec['_otdel_name'],'client_id'=>MEMBER()->id)) ;
                     $arr_otdel_names[$org_id][$otdel_id]=$rec['_otdel_name'] ;
                     //LOGS()->reg_log('Изменение структуры каталога сотрудников','Добавление нового отдела - "'.$rec['_otdel_name'].'", id='.$otdel_id) ;
                   }
             }
             if (_sizeof($rec['_otdels_names']))
             {   $parent_otdel=$org_id ; //damp_array($rec['_otdels_names']) ;
                 foreach($rec['_otdels_names'] as $i=>$otdel_name) if ($otdel_name)
                 {
                    if (_sizeof($arr_otdel_names[$org_id]) and in_array($otdel_name,$arr_otdel_names[$org_id]))
                    {   $otdel_id=array_search($otdel_name,$arr_otdel_names[$org_id]) ;
                        //echo 'Отдел "<strong>'.$otdel_name.'</strong>" уже добавлен<br>' ;
                    }
                    else
                    { echo 'Добавляем новый отдел - "<strong>'.$otdel_name.'</strong>"<br>' ;
                      $otdel_id=adding_rec_to_table(PERSONAL()->table_name,array('clss'=>208,'parent'=>$parent_otdel,'obj_name'=>$otdel_name)) ;
                      $arr_otdel_names[$org_id][$otdel_id]=$otdel_name ;
                      $parent_otdel=$otdel_id ;
                    }
                 }
                 unset($rec['_otdels_names']) ;
             }

             //echo '$otdel_id='.$otdel_id.'<br>';
             // проверяем должность
             // проверяем организацию
             if (trim($rec['_working_name'])!="") $rec['working']=_IL('IL_works')->get_id_of_value(trim($rec['_working_name']),array('append_value_is_not_found'=>1)) ;
             
             unset($rec['_working_name'],$rec['_otdel_name'],$rec['_org_name']) ;
             $id_exsist=execSQL_value('select pkey from '.PERSONAL()->table_name.' where uid="'.$rec['uid'].'"') ;
             if ($id_exsist) { $res=update_rec_in_table(PERSONAL()->table_name,$rec,'pkey='.$id_exsist) ; $cnt_update++ ;
                               $recs[$indx]['id']=$id_exsist ;
                             }
             else            { $rec['clss']=211 ;
                               $rec['parent']=($otdel_id)? $otdel_id:$org_id ;
                               $rec['client_id']=MEMBER()->id ;
                               $recs[$indx]['id']=adding_rec_to_table(PERSONAL()->table_name,$rec) ;
                               echo 'Добавляем нового сотрудника - "<strong>'.$rec['obj_name'].'</strong>"<br>' ;
                               $cnt_adding++ ;
                             }
           }

           //damp_array($arr_org_names,1,-1) ; damp_array($arr_otdel_names,1,-1) ; damp_array($arr_work_names,1,-1) ;

          return(array($cnt_update,$cnt_adding)) ;
       }

      // дата идет в формате 01/01/10, переводим в формат обычной даты
      function get_dr_age($str_data)
      {  $str_data=str_replace(array('/','-'),'.',$str_data) ;
         $arr=explode('.',$str_data) ;
         $dr='' ; $age=0 ;
         if (_sizeof($arr)==3)
          { $now_year=(int)date('y') ;
            $_y=(int)$arr[2] ;
            if (strlen($arr[2])==4)  $yaer=$_y ;
            else if ($now_year+10>$_y)  $yaer=(int)'20'.$arr[2] ; // 10 лет запасу
            else                     $yaer=(int)'19'.$arr[2] ;
            $month=(int)$arr[1] ;
            $day=(int)$arr[0] ;
            $dr=sprintf("%02d.%02d.%04d", $day, $month, $yaer);
            $tt = mktime(0,0,0,$month,$day,date('Y'));   // дата день рождения в этом году
            $now_year=(int)date('Y') ;
            $age=$now_year-$yaer ;
            if (time()<$tt) $age=$age-1 ;
          }
         return(array($dr,$age)) ;
      }
}



?>
