<?php

include_once("c_client.php");
class c_page_cab_client_drivers_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_drivers.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']) ;
      if (_sizeof($recs_files[0]))
        { if ($recs_files[0]['type']=='application/vnd.ms-excel')
          { ob_start() ;
            ?><h2>Загружаем данные из файла "<?echo $recs_files[0]['name']?>"</h2><?
            if ($_POST['read_only']) {?><strong>Только чтение загруженного файла</strong><?}

              $recs=$this->upload_drivers_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_drivers_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 'UUID':                 if ($value) $rec['UUID']=$value ;  break ;
                   case 'ВУ':                   if ($value) $rec['VU']=$value ;  break ;
                   case 'ФИО':                  if ($value) $rec['FIO']=$value ;  break ;
                   case 'Пол':                  if ($value) $rec['POL']=$value ;  break ;
                   case 'ДатаРожд':             if ($value) list($rec['DR'],$rec['AGE'])=$this->get_dr_age($cell->getFormattedValue()) ;break ;
                   case 'Телефон':              if ($value) $rec['PHONE']=$value ;  break ;
                   case 'Автопарк':             if ($value) $rec['PARK']=$value ;  break ;
                   case 'ДатаВыдачиМС':         if ($value) list($rec['MS'],$temp)=$this->get_dr_age($cell->getFormattedValue()) ;break ;
                   case 'URL':                  if ($value) $rec['URL']=$value ;  break ;
                 }
               }
               $col++ ;
             }
          if ($line>1 and $rec['VU']) $recs[]=$rec ;
          $line++ ;
         }
     }
     return($recs) ;
  }

  function adding_personal_from_array($recs)
  {   $cnt_added=0 ; $cnt_error=0 ; $cnt_update=0 ; $cnt_blocked=0 ;
      $org_add=0 ;  $cnt_img_to_upload=0 ; $cnt_img_to_delete=0 ; $cnt_img_exist=0 ;
      $parents_ids=PERSONAL()->tree[$this->client->main_org_id]->get_list_child() ;
      $arr_org=execSQL_row('select pkey,obj_name from obj_site_personals where clss=208 and parent='.$this->client->main_org_id) ;
      if (_sizeof($recs)) foreach($recs as $rec)
      { $data=array() ; $arr_img_names=array() ;//$arr_img_names[]='' ;
        $data['client_id']=MEMBER()->id ;
        $data['uid']=$rec['UUID'] ;
        $data['obj_name']=$rec['FIO'] ;
        $data['phone']=$rec['PHONE'] ;
        $data['dr']=$rec['DR'] ; ;
        $data['age']=$rec['AGE'] ; ;
        $data['s_medspravka']=strtotime($rec['MS']) ;
        $data['driving']=str_replace(' ','',$rec['VU']) ;
        $data['pol']=($rec['POL']=='мужской' or $rec['POL']=='Мужской')? 0:1 ;
        $otdel=$rec['PARK'] ;
        $data['enabled']=1 ;
        $data['temp']=0 ;
        $data['clss']=211 ;
        if ($rec['URL'])
        { $data['upl_img']['url'][]=$rec['URL']  ;
          $arr_img_names[]=basename($rec['URL']) ;
        }

        // проверяем автопарк  - если новая - добавляем в Базу как подразделение, в корень
        if ($otdel)
        {   if (!$org_id=array_search($otdel,$arr_org))
           {  $org_id=adding_rec_to_table('obj_site_personals',array('read_only'=>1,'obj_name'=>addslashes(trim($otdel)),'clss'=>208,'parent'=>$this->client->main_org_id)) ;
              $arr_org[$org_id]=$otdel ;
              $parents_ids.=','.$org_id ;
              $org_add++ ;
              echo '<div class=green>Добавлен новый автопарк "<strong>'.$otdel.'</strong>"</div>' ;
           }
           else
           {  update_rec_in_table('obj_site_personals',array('temp'=>0,'enabled'=>1,'read_only'=>1),'pkey='.$org_id) ;
           }
           $data['parent']=$org_id ;
        }  else $data['parent']=$this->client->main_org_id ;

        $exist_rec=execSQL_van('select pkey,parent,ext_info from obj_site_personals where uid="'.$data['uid'].'" and parent in ('.$parents_ids.')') ;
        if (!$exist_rec['pkey'])
        { $new_id=adding_rec_to_table('obj_site_personals',$data) ;
          update_rec_in_table('obj_site_personals',array('propusk'=>$new_id),'pkey='.$new_id) ;
          $cnt_img_to_upload+=_sizeof($data['upl_img']['url']) ;
          ?><div class="green"><strong><?echo $data['obj_name']?></strong> - успешно добавлен</div><? $cnt_added++ ;

        }
        else
        { // надо проверить уже закачанные фото
          // фото, которые уже закачаны - удаляет с заказчки
          // фото, которые уже закачаны и нет в XML - удаляем с объекта
          $arr_images=execSQL('select pkey,indx,obj_name,file_name from obj_site_personals_image where parent="'.$exist_rec['pkey'].'"') ;
          if (_sizeof($arr_images)) foreach($arr_images as $rec_image)
          {   $key=array_search($rec_image['obj_name'],$arr_img_names) ;
              if ($key!==false)
              { unset($data['upl_img']['url'][$key]) ; // фото есть в объекте и в XML - удаляем фото из массива загрузки
                $cnt_img_exist++ ;
                ?><div class="green"><strong><?echo $rec_image['obj_name']?></strong> - фото уже загружено</div><? $cnt_added++ ;
              }
              else // фото надо удалить из объекта, его нет в XML
              {  execSQL_update('delete from obj_site_personals_image where pkey='.$rec_image['pkey']) ;
                 clear_obj_img($rec_image['tkey'],$rec_image['file_name']) ;
                 damp_array($rec_image,1,-1) ;
                 $cnt_img_to_delete++ ;
                 ?><div class="green"><strong><?echo $rec_image['obj_name']?></strong> - удалено фото</div><? $cnt_added++ ;
              }
          }
          if (!_sizeof($data['upl_img']['url'])) unset($data['upl_img']['url']) ;
          if (!_sizeof($data['upl_img'])) unset($data['upl_img']) ;

          update_rec_in_table('obj_site_personals',$data,'pkey='.$exist_rec['pkey']) ;
          ?><div class="green"><strong><?echo $data['obj_name']?></strong> -  обновлен</div><?
          $cnt_update++ ;
          $cnt_img_to_upload+=_sizeof($data['upl_img']['url']) ;
        }
        //damp_array($data,1,-1) ;
      }
      return(array($cnt_added,$cnt_update,$cnt_blocked,$cnt_error)) ;

  }

   // дата идет в формате 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)) ;
   }

}



?>
