<?php
include_once("c_setting_update.php");

class c_page_cab_setting_update_old_versions extends c_page_cab_setting_update
{
  public $h1='Обновление - обеспечение совместимости для старых версий' ;

 function block_main()
 { $this->page_title() ;
   if ($_POST['cmd'] and method_exists($this,$_POST['cmd'])) $this->{$_POST['cmd']}() ;
   else
   {
   ?><div class="alert">Внимание! Прежде чем выполнить данную операцию, пожалуйста, проконсультируйтесь с техподдержкой ЭСМО по поводу её целесообразности</div>
         <button class="v1" cmd="СMD_vers_2_5">Выполнить проверку совместимости старых версий</button><br>

         <p><strong>Импорт событий по ФЛ в новый формат</strong></p>
         <p>Будет выполнен перенос событий по ФЛ из общего журнала событий в отдельную таблицу</p>
         <button class="v1" cmd="СMD_conv_log_pers">Импорт событий</button><br>

         <p><strong>Импорт событий по СО в новый формат</strong></p>
         <p>Будет выполнен перенос событий по СО из общего журнала событий в отдельную таблицу</p>
         <button class="v1" cmd="СMD_conv_log_workers">Импорт событий</button><br>

         <p><strong>Преобразование способа хранения фильтров сотрудников в новый формат</strong></p>
         <p>Будет выполнен перенос данных EXT_INFO['personals'] в отдельную таблицу</p>
         <button class="v1" cmd="СMD_conv_personals_filter">Выполнить</button><br>
         <?
   }


 }


 function СMD_conv_log_pers()
 {   //$usl_select='obj_name="Измение данных сотрудника" or obj_name="Добавление нового сотрудника" or obj_name="Удаление сотрудника"' ;
     //execSQL_update('delete from log_personal_changes') ;

     include(_DIR_TO_MODULES.'/engine/i_backgroup_process.php') ;
     $back_process=new i_backgroup_process('/services/aspmo_setting/conv_log_pers/') ; // будет вызван  /ext/events/c_update_personal_status.php::c_update_personal_status->show()
     $back_process->panel_background_process() ;

 }

 function СMD_conv_log_workers()
 {   //$usl_select='obj_name="Измение данных сотрудника" or obj_name="Добавление нового сотрудника" or obj_name="Удаление сотрудника"' ;
     //execSQL_update('delete from log_workers_changes') ;
     $usl_select='obj_name="Измение данных места работы" or obj_name="Измение СО"' ;
     $cnt=execSQL_value('select count(pkey) from obj_site_mo_log where '.$usl_select) ;
     echo 'Будет перенесено <strong>'.$cnt.'</strong> записей журанала событий<br>' ;
     $limit=10000 ; $i=0 ;$recs2=array() ;
     while($i<$cnt)
     { $recs=execSQL('select * from obj_site_mo_log where '.$usl_select.' limit '.$i.','.$limit) ;
       $i+=$limit ; $arr_ids=array() ;
       if (_sizeof($recs)) foreach($recs as $rec) if ($rec['data'])
       { $info=unserialize($rec['data']) ;
         if (_sizeof($info)) foreach($info as $fname=>$change)
         { if (stripos($change,'=>')!==false) list($old_value,$new_value)=explode('=>',$change) ;
           else
           { $old_value='' ;
             $new_value=$change ;
           }
           $type=(stripos($rec['obj_name'],'Основная')!==false)? 1:0 ;
           $data=array(  'clss'=>278,
                        'c_data'=>$rec['c_data'],
                        'r_data'=>$rec['r_data'],
                        'obj_name'=>'upd',
                        'account_id'=>$rec['account_id'],
                        'personal_id'=>$rec['personal_id'],
                        'worker_id'=>0,
                        'type'=>$type,
                        'fname'=>$fname,
                        'old_value'=>trim($old_value),
                        'new_value'=>trim($new_value)
                    ) ;
           multiSQL_insert('log_workers_changes')->append($data);
         }
         $arr_ids[]=$rec['pkey'] ;
       }
       if (_sizeof($arr_ids)) execSQL_update('delete from obj_site_mo_log where pkey in ('.implode(',',$arr_ids).')') ;
     }
     multiSQL_insert('log_workers_changes')->flush();
     //execSQL_update('delete from obj_site_mo_log where '.$usl_select) ;

 }

 function СMD_vers_2_5()
 {    ?><h2>заполняем терминалы в пупилометрии</h2><?
      execSQL_update('update obj_site_narko_data t1 set t1.terminal_id=(select t2.terminal_id from obj_site_mo_session t2  where t2.pkey=t1.id_mo)',array('debug'=>2)) ;

      ?><h2>убираем null в допусках</h2><?
      execSQL_update('update obj_site_mo_session t1 set t1.dopusk=0 where dopusk is null',array('debug'=>2)) ;
      execSQL_update('ALTER TABLE  obj_site_mo_session CHANGE  model  model INT( 11 ) NOT NULL DEFAULT  "0"',array('debug'=>2)) ;

      ?><h2>obj_site_account  - поле smena - int(11)</h2><?
      execSQL_update('ALTER TABLE obj_site_account CHANGE smena smena int(11)',array('debug'=>2)) ;

      ?><h2>log_site_sql  - поле file - text</h2><?
      execSQL_update('ALTER TABLE log_site_sql CHANGE file file text',array('debug'=>2)) ;

      ?><h2>obj_site_mo_log  - delete events LS_last_cron_time</h2><?
      execSQL_update('delete LOW_PRIORITY from obj_site_mo_log where comment like "%LS_last_cron_time%"') ;

      //execSQL_update('ALTER TABLE  obj_site_mo_session CHANGE  terminal_comment  terminal_comment text',1) ;

       // заполняем doctor_id в TO
        //execSQL_update('update obj_site_cars_to t1 set t1.doctor_id=(select t2.doctor_id from obj_site_mo_session t2  where t2.pkey=t1.mo_id) where doctor_id is null',array('debug'=>2)) ;
        //execSQL_update('update obj_site_cars_to t1 set t1.doctor_id=(select t2.dopusk_user_id from obj_site_mo_session t2  where t2.pkey=t1.mo_id) where doctor_id is null',array('debug'=>2)) ;
        //execSQL_update('update obj_site_cars_to t1 set t1.doctor_id=(select t2.hand_check_user_id from obj_site_mo_session t2  where t2.pkey=t1.mo_id) where doctor_id is null',array('debug'=>2)) ;

     ?><h2>заполняем  dopusk_time_end в МО</h2><?
     $time_dopusk_def=$GLOBALS['LS_setting_auto_mo_allow_interval']*60*60 ;
     execSQL_update('update obj_site_mo_session set dopusk_time_end=dopusk_time+'.$time_dopusk_def.' where dopusk_time>0 and dopusk in (1,2) and (dopusk_time_end is null or dopusk_time_end=0)',array('debug'=>2)) ;

        // заполняем незаполенные поля res_XXX в МО для критичных значений
     ?><h2>заполняем незаполенные поля res_s, res_d, res_p, res_t, res_a в МО</h2><?
     execSQL_update('update obj_site_mo_session set res_s=2 where comment like "%Повышенное cистолическое%" and res_s is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_s=3 where comment like "%Пониженное cистолическое%" and res_s is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_d=2 where comment like "%Повышенное диастолическое%" and res_d is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_d=3 where comment like "%Пониженное диастолическое%" and res_d is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_p=2 where comment like "%Учащенный пульс%" and res_p is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_p=3 where comment like "%Медленный пульс%" and res_p is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_t=2 where comment like "%Повышенная температура%" and res_t is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_t=3 where comment like "%Пониженная температура%" and res_t is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_a=2 where comment like "%Превышен уровень алкоголя%" and res_a is null',array('debug'=>2)) ;
        // все что осталось - нормальное
     execSQL_update('update obj_site_mo_session set res_s=1 where tonometer=1 and systolic>0 and res_s is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_d=1 where tonometer=1 and diastolic>0 and res_d is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_p=1 where pulsometer=1 and pulse>0 and res_p is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_t=1 where thermometer=1 and temperature>0 and res_t is null',array('debug'=>2)) ;
     execSQL_update('update obj_site_mo_session set res_a=1 where alcotester=1 and alko=0 and res_a is null',array('debug'=>2)) ;

     if ($GLOBALS['LS_pdd_scan_mailbox_server'] and !$GLOBALS['LS_mailbox_server'])  update_site_setting('LS_mailbox_server',$GLOBALS['LS_pdd_scan_mailbox_server']) ;
     if ($GLOBALS['LS_pdd_scan_mailbox_port'] and !$GLOBALS['LS_mailbox_port'])  update_site_setting('LS_mailbox_port',$GLOBALS['LS_pdd_scan_mailbox_port']) ;
     if ($GLOBALS['LS_pdd_scan_mailbox_login'] and !$GLOBALS['LS_mailbox_login'])  update_site_setting('LS_mailbox_login',$GLOBALS['LS_pdd_scan_mailbox_login']) ;
     if ($GLOBALS['LS_pdd_scan_mailbox_pass'] and !$GLOBALS['LS_mailbox_pass'])  update_site_setting('LS_mailbox_pass',$GLOBALS['LS_pdd_scan_mailbox_pass']) ;
     if ($GLOBALS['LS_pdd_scan_mailbox_pass'] and !$GLOBALS['LS_mailbox_in_folder'])  update_site_setting('LS_mailbox_in_folder',$GLOBALS['LS_pdd_scan_mailbox_in_folder']) ;
     if ($GLOBALS['LS_pdd_scan_mailbox_protokol'] and !$GLOBALS['LS_mailbox_protokol'])  update_site_setting('LS_mailbox_protokol',$GLOBALS['LS_pdd_scan_mailbox_protokol']) ;
     if ($GLOBALS['LS_pdd_scan_mailbox_params'] and !$GLOBALS['LS_mailbox_params'])  update_site_setting('LS_mailbox_params',$GLOBALS['LS_pdd_scan_mailbox_params']) ;

     ?><h2>Коррекция структуры БД</h2><?
     execSQL_update('update obj_descr_obj_tables set parent=1 where clss=101 and table_name="obj_descr_obj_tables"') ;
        execSQL_update('alter table obj_site_list change uid uid VARCHAR(128)',2) ;
        execSQL_update('ALTER TABLE  obj_site_personals CHANGE  tab_number  tab_number VARCHAR( 32 ) NULL DEFAULT NULL') ;
     execSQL_update('ALTER TABLE obj_site_personals CHANGE uid uid varchar(128) DEFAULT ""') ;

     ?><h2>Задание типа терминала по умолчнию - mt</h2><?
     $cnt=execSQL_value('select count(pkey) from obj_site_account where clss=203 and (terminal_type="" or terminal_type is null)',1) ;
     if ($cnt) execSQL_update('update obj_site_account set terminal_type="mt" where clss=203 and (terminal_type="" or terminal_type is null)',1);

     execSQL_update('ALTER TABLE  event_lister CHANGE  method_name  method_name VARCHAR(128)') ;
     execSQL_update('ALTER TABLE  event_lister CHANGE  obj_name  obj_name VARCHAR(150)') ;
     execSQL_update('ALTER TABLE  reports CHANGE  code  code VARCHAR(64)') ;
     execSQL_update('ALTER TABLE  obj_site_req_log CHANGE  IP2  IP2 VARCHAR(64)') ;

     execSQL_update('update obj_site_personals set _image_name="" where _image_name is null') ;
     execSQL_update('update obj_site_personals set upl_img="" where upl_img is null') ;


     // коррекция для новых полей
     //execSQL_update('update obj_site_mo_log set account_id=member_id where member_id>0 and member_id<400',array('debug'=>2)) ;
     //execSQL_update('update obj_site_mo_log set account_id=user_id where user_id>0 and user_id<400',array('debug'=>2)) ;
     //execSQL_update('update obj_site_mo_log set personal_id=member_id where member_id>400',array('debug'=>2)) ;
     //execSQL_update('update obj_site_mo_log set personal_id=user_id where user_id>400',array('debug'=>2)) ;

      if (isset(_DOT(TM_LIST)->field_info['group'])) execSQL_update('ALTER TABLE `obj_site_list` DROP `group`;') ;

     execSQL_update('update obj_descr_obj_tables set dir_to_image="/public/account/" where table_name="obj_site_account_image"') ;
     execSQL_update('update obj_descr_obj_tables set dir_to_image="/public/account/" where table_name="obj_site_account_files"') ;
     execSQL_update('update obj_descr_obj_tables set dir_to_image="/public/personals/",img_pattern="personal" where table_name="obj_site_personals_image"') ;

     // совместимость со старыми группами
     ?><h1>Конвертация старых групп сотрудников в новый формат</h1><?
     $list_recs=PERSONAL()->get_list_groups() ;
     if (_sizeof($list_recs)) foreach($list_recs as $rec)
     {   ?><h2><?echo $rec['obj_name']?></h2><?
         $this->convert_group_personal_rules($rec['id']) ;
         PERSONAL()->group_personal_change($rec['id']) ;
     }

     //подставляем корневую группу в организации где родительская группа не указана
     ?><h2>Обновление организаций без родительской категории</h2><?
     $parent = execSQL_value('select pkey from obj_site_account where clss=1'); //id корневой группы
     $count = execSQL_update('update obj_site_personals set group_id='.$parent.' where group_id=0 and clss=207');
     ?><p>Обновлено <?echo $count?> записей</p><?

        PERSONAL()->update_levels_parents() ;
 }

    function convert_group_personal_rules($group_id)
      { $rec_group=PERSONAL()->get_group_by_id($group_id) ;  //  damp_array($rec_group,1,-1) ;
        $recs=get_arr_links_recs($rec_group,array()) ;
        $recs_by_clss=group_by_clss($recs) ;
        damp_array(array_keys($recs_by_clss),1,-1) ;
        $filter=array() ;
        if (_sizeof($recs_by_clss)) foreach($recs_by_clss as $clss=>$rec_linked)
        {   //damp_array($rec_linked)   ;
            switch($clss)
            { case 20:  foreach($rec_linked as $rec_link) $filter['working_ids'][]=$rec_link['id'] ; // должность
                        break ;
              case 207: foreach($rec_linked as $rec_link) $filter['org_ids'][]=$rec_link['pkey'] ; // организация
                        break ;
              case 208: foreach($rec_linked as $rec_link) $filter['otdel_ids'][]=$rec_link['pkey'] ; // организация
                        break ;
              case 211: foreach($rec_linked as $rec_link) $filter['personal_ids'][]=$rec_link['pkey'] ; // сотрудник
                        break ;
              case 265: foreach($rec_linked as $rec_link) $filter['personal_viewers'][]=$rec_link['arr_name'] ; ; // особые условия - ID сотрудников собраны во вьювере
                        break ;

            }
        }
        if (_sizeof($filter['personal_ids'])) $filter['personal_ids']=implode(',',$filter['personal_ids']) ;
        if (_sizeof($filter))
        {   include_once(_DIR_EXT.'/personals/report_personals_ids_by_filter.php') ;
            $report_obj=new report_personals_ids_by_filter() ;
            $report_obj->filter=ENGINE()->filter_array_flip(ENGINE()->clear_space_value($filter)) ;   // коррекция, в  $_POST['filter'] значения элементов в мультисписках идут не в индексах, а в значениях

            $new_filter_set['filter']=$report_obj->filter ;
            $new_filter_set['info_filter']=$report_obj->panel_info_filter() ;

            damp_array($new_filter_set,1,-1) ;

            $data['ext_info']=$rec_group['_ext_info'] ;
            $data['ext_info']['personals'][]=$new_filter_set ;
            $usl_exists=0 ;// флаг, что текущее условие еще не используется в даной группе
            if (_sizeof($rec_group['_ext_info']['personals'])) foreach($rec_group['_ext_info']['personals'] as $old_filter_set) if ($old_filter_set['filter']==$new_filter_set['filter']) $usl_exists=1 ;
            if (!$usl_exists)  PERSONAL()->group_personal_save($rec_group['id'],$data,array('save_log'=>1)) ;
            else echo 'Данные условия уже добавлены в группу<br>' ;
        }
      }

}



?>
