<?php
//include_once("c_esmo_gateway_upload.php");
include_once("c_ot.php");
//include_once(_DIR_TO_ENGINE.'/admin/i_admin_system.php') ;
class c_page_cab_ot_upload_vpf_excel extends c_page_cab_ot
{
 public $h1='Загрузка списка ВПФ из файла XLS' ;
 public $objPHPExcel ;
 public $aSheet ;
 public $csv_headers ;
 public $db_headers ;
 public $setting ;
 public $table_name ;
 public $setting_name ;

 public $db_fields=array( 'number'=>'№ п/п',
                          'obj_name'=>'Наименование ВПФ',
                          'period'=>'Периодичность',
                          'doctors'=>'Врачи',
                          'checked'=>'Исследнования',
                          'comment'=>'Дополнительные противопоказания',
  ) ;

 function block_main()
 { $this->page_title() ;
   $this->setting_name='LS_import_XLS_setting_'.MEMBER()->id ;
   if (!isset($GLOBALS[$this->setting_name]))
   { $id_sect=SETUP_add_section_to_site_setting('Персонал') ;
     SETUP_add_rec_to_site_setting($id_sect,"Настройки импорта персонала для ".MEMBER()->name,'',$this->setting_name,array('hidden'=>1)) ;
   }

     unset($this->setting['set']['G']) ;

   $this->setting=unserialize(stripslashes($GLOBALS[$this->setting_name])) ;
   $this->csv_headers=$this->setting['csv_headers'] ;
   $this->db_headers=$this->setting['db_headers'] ;
   if (!isset($this->setting['set'])) $this->setting['set']=array() ;
   $this->table_name='temp_upload_csv_'.MEMBER()->id ;

   $this->panel_upload_promt() ;
   //damp_array($_POST) ;
   switch($_POST['cmd'])
   { //case 'upload_img': $this->upload_img() ; break ;
     case 'show_temp_table': $this->show_temp_table() ; break ;
     case 'show_vpf_table': $this->show_vpf_table() ; break ;
     case 'show_setting': $this->show_setting() ; break ;
   }
   //$this->cmd_exec_result['no_default_panel'] ;
     damp_array($this->setting['set']) ;

 }

 function show_temp_table()
 {   //damp_array($this->setting) ;
     ?><h2>Содержимое временной таблицы, созданной на основе загруженного файла</h2><?
     $recs=execSQL('select * from '.$this->table_name,0,1) ;
     print_2x_arr($recs) ;
 }
 function show_vpf_table()
 {   ?><h2>Содержимое таблицы ВПФ</h2><?
     $recs=execSQL('select * from list_vpf ',0,1) ;
     print_2x_arr($recs) ;
 }

 function show_setting()
 {
     damp_array($this->setting,1,-1) ;
 }

 function panel_upload_promt()
 {  ob_start() ; $cnt_uploads=execSQL_value('select count(*) from '.$this->table_name) ; ob_end_clean()  ;
    ?><div class="sky-form no_box_shadow">
      <form action="" method="POST" enctype="multipart/form-data"><input type="hidden" name="cmd" value="upload_file">
      <p><span class="fz_18">1.</span> Загрузите на сервер файл со списком сотрудников, используя заранее подготовленный файл Excel. <a href="<?echo _PATH_TO_EXT?>/aspmo_personal/demo/members.xls">Образец файла</a></p>
      <?    if ($cnt_uploads) echo '<p>Во временной таблице сейчас загружено <strong>'.$cnt_uploads.'</strong> строк</p>' ;
            if ($_POST['cmd']=='show_panel_upload_file') $this->panel_upload_file();
            else if ($_POST['cmd']=='upload_file') { $this->upload_file(); }
            else {?><button class="button v1" style="float:none;display:inline;" cmd="show_panel_upload_file">Перейти к загрузке файла</button><? }
            ob_start() ; $cnt_uploads=execSQL_value('select count(*) from '.$this->table_name) ; ob_end_clean()  ;
            if ($cnt_uploads) {?><button class="button v1" style="float:none;display:inline;" cmd="show_temp_table">Посмотреть временные данные</button><?}
            if ($cnt_uploads) {?><button class="button v1" style="float:none;display:inline;" cmd="show_vpf_table">Посмотреть итоговые данные</button><?}
         ?>
      <br><br></form>
      <?if ($cnt_uploads){?>
      <p><span class="fz_18">2.</span> Произведите сопоставление полей файла XLS и БД ЭСМО</p>
      <?  $this->panel_set_fields() ;
          if ($cnt_uploads){?><button class="button v1" style="float:none;display:inline;" cmd="set_set">Применить сопоставление</button><?}
          ?><br><?
          if ($_POST['cmd']=='set_set') $this->set_set() ;
      ?>
      <br>
      <p><span class="fz_18">3.</span> Импортируйте данные по сотрудникам в БД ЭСМО</p>
      <button class="button v1" style="float:none;display:inline;" cmd="import_from_temp_XLS">Импортировать данные в базу</button><?
        if ($_POST['cmd']=='import_from_temp_XLS') $this->import_from_temp_XLS() ;

      }?>
     </div>
     <style type="text/css">
      span.fz_18{font-size:18px;color:black;}
     </style>
     <?
 }

 function panel_upload_file()
 { ?><div id="panel_upload_promt"><form action="" method="POST" enctype="multipart/form-data"><input type="hidden" name="cmd" value="upload_file">
          <input name="upload_file[]" type="file" size="50">
          <input type="submit" class="button v1" cmd="upload_file" style="float:none;display:inline;" value="Загрузить файл"><br><br>
          <p>На этом этапе данные из файла XLS будут загружены по временную таблицу, в действующую таблицу персонала ничего загружено не будет</p><p><strong>Внимание!</strong><p>
          <div class=comment>Размер файла не более 1М, формат файла - Excel XLS.</div>
   <?
 }

 function upload_file()
  {
    ?><h2>Загрузка файла со списком ВПФ во временную таблицу</h2><?
    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')
          { ?><p>Загружаем данные из файла "<strong><?echo $recs_files[0]['name']?></strong>" во временную таблицу</p><?
             $file_name=_DIR_TO_ROOT.'/temp/personal_upload_'.MEMBER()->id.'.xls' ;  $members = array();
             move_uploaded_file($recs_files[0]['tmp_name'],$file_name) ;
             set_include_path(_DIR_TO_ROOT.'/AddOns/PHPExcel/');
             include_once 'PHPExcel/IOFactory.php';
             $this->objPHPExcel = PHPExcel_IOFactory::load($file_name);
             $this->objPHPExcel->setActiveSheetIndex(0);
             $this->aSheet = $this->objPHPExcel->getActiveSheet();
             if (is_object($this->aSheet))
             {
                 // получаем заголовки таблицы
                 $this->csv_headers=$this->upload_headers_from_excel() ;
                 //damp_array($this->csv_headers) ;

                 // создаем временную таблицу для данных
                 $this->create_temp_table($this->table_name) ;

                 // загружаем во временуую таблицу данные
                 $this->upload_recs_from_excel($this->table_name) ;

                 $this->setting['csv_headers']=$this->csv_headers ;
                 $this->setting['db_headers']=$this->db_headers ;
                 update_site_setting($this->setting_name,addslashes(add_data_to_serialize_array('',$this->setting)),array('no_stripslashes'=>1)) ;
             } else return(array('type'=>'error','code'=>'error_parsing_xls','text'=>'Не удалось разобрать XLS файл')) ;
            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'=>'Не был выбран файл')) ;
  }

  function convert_field_name($col,$fname)
  {
      $res=str_replace(array(' '),'_',$col.'_'.translit($fname)) ;
      return($res) ;
  }

  function create_temp_table($table_name)
  {   echo 'Очищаем временную таблицу<br>' ;
      execSQL_update('DROP TABLE IF EXISTS '.$table_name) ;
      //damp_array($this->csv_headers,1,-1) ;
      $arr_sql=array() ;    $this->db_headers=array() ;
      if (_sizeof($this->csv_headers)) foreach($this->csv_headers as $col=>$col_name)
      {   $this->db_headers[$col]=$this->convert_field_name($col,$col_name) ;
          $arr_sql[]=$this->db_headers[$col].' text  CHARACTER SET utf8 COLLATE utf8_general_ci ' ;
      }
      if (_sizeof($this->db_fields)) foreach($this->db_fields as $esmo_name=>$esmo_title)
          $arr_sql[]=$esmo_name.' text  CHARACTER SET utf8 COLLATE utf8_general_ci  ' ;
          $arr_sql[]=' period_indx int(11)   ' ;


      $sql_create='CREATE TABLE  '.$table_name.' ('.implode(',',$arr_sql).') ENGINE = MYISAM' ;
      execSQL_update($sql_create,array('debug'=>0)) ;
      echo 'Временная таблица успешно иницилизирована<br>' ;
      //damp_array($arr_sql) ;
  }



 //==========================================================================================================================================================================
   // ЗАГРУЗКА СОТРУДНИКОВ ИЗ EXCEL
   //==========================================================================================================================================================================
   function upload_headers_from_excel()
   { $rowIterator = $this->objPHPExcel->getActiveSheet()->getRowIterator();
     $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
       if ($cur_row==1) foreach ($cellIterator as $cell) $arr_row_names[$cell->getColumn()]=str_replace(array("\n",'/','(',')','*',',','.','-'),'',trim($cell->getCalculatedValue())) ;  // первая строка - заголовки
       else break ;
     }
     return($arr_row_names) ;
  }

  function upload_recs_from_excel($table_name)
  {  $rowIterator = $this->objPHPExcel->getActiveSheet()->getRowIterator();
     $arr=array() ;
     //damp_array($this->db_headers,1,-1) ;
     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() ;
       if ($cur_row>1) foreach ($cellIterator as $cell) $rec[$cell->getColumn()]='"'.addslashes($cell->getFormattedValue()).'"';

       if (_sizeof($rec)) $arr[]='('.implode(',',$rec).')' ;
       if (_sizeof($arr)==500)
       {  //damp_array($rec,1,-1) ;
          $sql='INSERT INTO '.$table_name.' ('.implode(',',$this->db_headers).') VALUES '.implode(', ',$arr).';' ;
          execSQL_update($sql,array('debug'=>0)) ;
          $arr=array() ;
       }
       //if ($cur_row>4) break ;

     }
     if (_sizeof($arr))
     {  $sql='INSERT INTO '.$table_name.' ('.implode(',',$this->db_headers).') VALUES '.implode(', ',$arr).';' ;
        execSQL_update($sql,array('debug'=>0)) ;
     }
     $cnt=execSQL_value('select count(*) from '.$table_name) ;
     echo 'Загружено <strong>'.$cnt.'</strong> записей из файла XLS<br>' ;
     //$name=LOGS()->reg_file_log('import_personals',$text) ;
     //LOGS()->reg_log('Импорт сотрудников','<a target=_blank href="'.$name.'">Отчет</a>') ;
     //return($members) ;
  }

  function panel_set_fields()
  { ?><h2>Сопоставление столбцов файла XLS и полей БД</h2><form><?
    ?><table class="basic fz_small full" id="panel_set_fields">
       <tr>
           <th>Столбец XLS</th><?if (_sizeof($this->csv_headers)) foreach($this->csv_headers as $col=>$fname){?><th><?echo $fname?></th><?}?>
       </tr>
       <tr>
           <th>Поле ЭСМО</th><?if (_sizeof($this->csv_headers)) foreach($this->csv_headers as $col=>$fname)
            { ?><td><select name="<?echo $col?>"><option value=""></option><?
              if (_sizeof($this->db_fields)) foreach($this->db_fields as $fname=>$ftitle) {?><option value="<?echo $fname?>" <?if ($this->setting['set'][$col]==$fname) echo 'selected'?>><?echo $ftitle?></option><?}
              ?></select></td><?}?>
       </tr>
       <tr>
           <th>Число заданных значений</th>
           <?if (_sizeof($this->csv_headers)) foreach($this->csv_headers as $col=>$fname){?><td><? echo execSQL_value('select count('.$this->db_headers[$col].') from '.$this->table_name.'  where '.$this->db_headers[$col].'!=""');?></td><?}?>
       </tr>
       <tr>
           <th>Число пустых значений</th>
           <?if (_sizeof($this->csv_headers)) foreach($this->csv_headers as $col=>$fname){?><td><? echo execSQL_value('select count('.$this->db_headers[$col].') from '.$this->table_name.' where '.$this->db_headers[$col].'=""');?></td><?}?>
       </tr>
       <tr>
           <th>Число уникальных значений</th>
           <?if (_sizeof($this->csv_headers)) foreach($this->csv_headers as $col=>$fname){?><td><? echo execSQL_value('select count(distinct('.$this->db_headers[$col].')) from '.$this->table_name.' where '.$this->db_headers[$col].'!=""');?></td><?}?>
       </tr>
      </table>
      </form>
      <script type="text/javascript">
         $j('table#panel_set_fields select').change(function(){send_ajax_request({cmd:'aspmo_personal/set_fields_XLS_ESMO',account_id:<?echo MEMBER()->id?>,el_name:$j(this).attr('name'),el_value:$j(this).val()});})
       </script>
    <?
  }

  function set_set()
  {   ?><br><h3>Применяем сопоставление полей для временной таблицы</h3><?
      //damp_array($this->setting,1,-1) ;
      if (_sizeof($this->setting['set'])) foreach($this->setting['set'] as $col=>$fname) if ($fname and isset($this->setting['db_headers'][$col]))
        execSQL_update('update '.$this->table_name.' set '.$fname.'='.$this->setting['db_headers'][$col]) ;

      //execSQL_update('update '.$this->table_name.' set obj_name=number where period=""') ;
      execSQL_update('update '.$this->table_name.' set period_indx=0') ;
      execSQL_update('update '.$this->table_name.' set period_indx=1 where period="1 раз в 2 года"') ;
      execSQL_update('update '.$this->table_name.' set period_indx=2 where period="1 раз в год"') ;

      $recs=execSQL('select * from '.$this->table_name.' where period=""') ;
      if (_sizeof($recs)) foreach($recs as $rec)
      {   $num=(float)$rec['number'] ;
          //execSQL_update('update '.$this->table_name.' set number="'.$num.'." where number="'.$rec['number'].'"') ;
      }
      //$recs=execSQL('select * from '.$this->table_name.' where period=""') ;
  }

  function import_from_temp_XLS()
  { ?><h2>Импортируем данные из временной таблицы XLS в таблицу ВПФ ЭСМО</h2><?
    $arr=array_flip($this->setting['set']) ;
    execSQL_update('truncate table list_vpf',2) ;
    execSQL_update('insert into list_vpf (clss,obj_name,parent) values (233,"ВПФ",0)') ;
    execSQL_update('insert into list_vpf (clss,number,obj_name,period,doctors,checked,comment) select 230,number,obj_name,period_indx,doctors,checked,comment from '.$this->table_name.' where obj_name!=""',0) ;
    execSQL_update('update list_vpf set clss=233 where period=0 or period is null',0) ;
    $recs_sections=execSQL('select * from list_vpf where clss=233',0) ;
    if (_sizeof($recs_sections)) foreach($recs_sections as $rec)
      execSQL_update('update list_vpf set parent='.$rec['pkey'].' where number like "'.trim($rec['number']).'%" and pkey!='.$rec['pkey'],0) ;

    $options['debug'] =1 ;
    TREE('list_vpf')->update_levels_parents('clss in (223) order by number',$options) ;
  }



}



?>



?>
