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

class c_page_cab_setting_update_check_systems extends c_page_cab_setting_update
{
  public $h1='Обновление - проверки' ;

   var $arr_cmd=array('personal_update_levels_parents'=>'Проверка структуры организаций сотрудников',
                      'personal_check_workers'=>'Проверка записей по СО для ФЛ',
                      'personal_FL_SO'=>'Проверка СО для ФЛ',
                      'check_FL_SO_test'=>'Проверка статусов ФЛ и СО',
                      'check_mails'=>'Проверка почты',
                      'show_mail_recs_in_db'=>'Таблица принятых писем',
                      'show_mail_recs_in_db_attach'=>'Таблица принятых писем - вложения',
                      'crypt_pass_db'=>'Зашифровать пароль к БД',
                      'delete_loss_mess'=>'Удалить отвязанные от мероприятия сообщения',
                      'split_obj_name'=>'Разбить ФИО на слова',
                      //'check_'=>'Проверка групп ЭСМО',
                      'check_disk'=>'Проверка диска',
           ) ;

    function block_main()
     { $this->page_title() ;

       FORM()->form_open() ;
       FORM()->row_open();
       FORM()->section_select(['name'=>'filter[check_cmd]','recs'=>$this->arr_cmd,'value'=>$this->filter['check_cmd']]);
       FORM()->button(['title'=>'Выполнить','cmd_method'=>'v2','cmd'=>'set_filter']);
       FORM()->row_close();
       FORM()->form_close();

       //damp_array($this->filter);
       //damp_array(GENERAL()->POST);


       $cmd=$this->filter['check_cmd'] ;
       $action=GENERAL()->POST['action'] ;
       if ($this->filter['action'] and method_exists($this,$this->filter['action'])) $this->{$this->filter['action']}() ;
       elseif ($action and method_exists($this,$action)) $this->$action() ;
       elseif ($cmd and method_exists($this,$cmd)) $this->$cmd() ;

     }


	function split_obj_name()
	       {  ?><h1>Разбиваем obj_name на name1, name2, name3</h1><?
	          $cnt=execSQL_value('select count(pkey) from view_personals where clss=211 and (name1="" or name2="" or name3="" or name1 is null or name2  is null or name3  is null)') ;
	          echo 'Всего найдено <strong>'.$cnt.'</strong> записей с пустыми name1|name2|name3<br>';
	          echo 'За одну операцию может быть обработано не более 10 тыс записей<br>' ;
	          $recs=execSQL('select * from view_personals where clss=211 and (name1="" or name2="" or name3="" or name1 is null or name2  is null or name3  is null) order by pkey limit 10000') ;
	          ?><button class="v1" cmd=exec_check check_cmd="split_obj_name" action="split_obj_name_exec">Разнести obj_name по колонкам</button><?
	          if ($_POST['action']=='split_obj_name_exec')
	          { if (_sizeof($recs)) foreach($recs as $rec)
	            { $arr=explode(' ',trim($rec['obj_name'])) ;
	              if (!$arr[1]) { $arr[1]=$arr[2] ; }
	              if (!$arr[2]) { $arr[2]=$arr[3] ; }

	              $data=array('name1'=>$arr[0],'name2'=>$arr[1],'name3'=>$arr[2]) ;
	              if (!$data['name1'] or !$data['name2'] or !$data['name3']) echo '<div class=red>' ;
	              print_r($data) ; echo '<br>' ;
	              if (!$data['name1'] or !$data['name2'] or !$data['name3']) echo '</div>' ;
	              if (!$data['name1'] or !$data['name2'] or !$data['name3']) echo print_r($arr,true).'<br>' ;

	              update_rec_in_table('obj_site_personals',$data,'pkey='.$rec['pkey']) ;

	            }

	          }

	       }


     function check_FL_SO()
     {
         ?><h2>Проверка корректности записей  ФЛ и СО</h2><?
         $recs=execSQL('select t2.obj_name,t2.pkey as personal_id,t1.pkey as worker1_id,t3.pkey as worker2_id,
                        t2.enabled as personal_enabled,t1.enabled as worker1_enabled,t3.enabled as worker2_enabled,
                        t2.parent as personal_parent,t1.parent as worker1_parent,t3.parent as worker2_parent, 
                        t1.is_main as worker1_is_main,t1.is_second as worker1_is_second,
                        t3.is_main as worker2_is_main,t3.is_second as worker2_is_second
                        from obj_site_workers t1
                        left join obj_site_personals t2 on t2.pkey=t1.personal_id
                        left join obj_site_workers t3 on t3.personal_id=t2.pkey and t3.pkey!=t1.pkey
                        where 
                        (t1.enabled!=t2.enabled 
                         or (t1.is_main=1 and t2.parent!=t1.parent)
                         or (t3.is_main=1 and t2.parent!=t3.parent)
                         )
                        and t1.clss=212 and t2.clss=211 
         ',0,1) ;
         $arr_personals=array() ;
         if (_sizeof($recs)) foreach($recs as $rec)
         {   $arr_personals[$rec['personal_id']]['name']=$rec['obj_name'] ;
             $arr_personals[$rec['personal_id']]['fl']=$rec['personal_enabled'] ;
             if ($rec['worker1_is_main']) $arr_personals[$rec['personal_id']]['main']=$rec['worker1_enabled'] ;
             if ($rec['worker2_is_main']) $arr_personals[$rec['personal_id']]['main']=$rec['worker2_enabled'] ;
             if ($rec['worker1_is_second']) $arr_personals[$rec['personal_id']]['sec']=$rec['worker1_enabled'] ;
             if ($rec['worker2_is_second']) $arr_personals[$rec['personal_id']]['sec']=$rec['worker2_enabled'] ;
         }

         $arr=array() ;
         //damp_array($arr_personals);
         if (_sizeof($arr_personals)) foreach($arr_personals as $personal_id=>$rec)
         { $ff=0 ;
           // если FL активно, но обе должости выключены - надо выключить ФЛ
           if ($rec['fl'] and isset($rec['main']) and !$rec['main'] and isset($rec['sec']) and !$rec['sec'])
           { $arr['set_fl_to_disabled'][]=$personal_id ;
             echo 'ФЛ <strong>'.$rec['name'].'</strong> ID <strong>'.$personal_id.'</strong> - активно, по MAIN - уволен, по SEC - уволен<br>' ;
             $arr_personals[$personal_id]['action']='ФЛ будет уволено' ;
             $ff=1 ;
           }
           // если FL активно, но есть только основная должности, и она  выключена - надо выключить ФЛ
           elseif ($rec['fl'] and isset($rec['main']) and !$rec['main'] and !isset($rec['sec']))
           { $arr['set_fl_to_disabled'][]=$personal_id ;
             echo 'ФЛ <strong>'.$rec['name'].'</strong> ID <strong>'.$personal_id.'</strong> - активно, по MAIN - уволен, SEC - отсутствует<br>' ;
             $arr_personals[$personal_id]['action']='ФЛ будет уволено' ;
             $ff=1 ;
           }
           elseif ($rec['fl'] and !isset($rec['main']) and isset($rec['sec']) and !$rec['sec'])
           { $arr['set_fl_to_disabled'][]=$personal_id ;
             echo 'ФЛ <strong>'.$rec['name'].'</strong> ID <strong>'.$personal_id.'</strong> - активно, MAIN - отсутствует, по SEC - уволен<br>' ;
             $arr_personals[$personal_id]['action']='ФЛ будет уволено' ;
             $ff=1 ;
           }
           // если FL уволено, но активна одна из должностей - надо уволить ФЛ
           elseif (!$rec['fl'] and ($rec['main'] or $rec['sec']))
           { $arr['set_fl_to_disabled'][]=$personal_id ;
             echo 'ФЛ <strong>'.$rec['name'].'</strong> ID <strong>'.$personal_id.'</strong> - уволен, активна MAIN или SEC дложность<br>' ;
             $arr_personals[$personal_id]['action']='ФЛ будет уволено' ;
             $ff=1 ;
           }
           if (!$ff) unset($arr_personals[$personal_id]) ;
         }
         return([$arr,$arr_personals]) ;
     }

     function check_FL_SO_test()
     {
         list($arr,$arr_personals)=$this->check_FL_SO() ;
         if (_sizeof($arr))
         {   print_2x_arr($arr_personals);
             //damp_array($arr,1,-1);
             ?><button class="v1" check_cmd="check_FL_SO_exec">Исправить записи по ФЛ и СО</button><?
         }
         else echo '<div class=green>Все в порядке</div>' ;
     }

     function check_FL_SO_exec()
     {   ob_start() ;
         list($arr,$arr_personals)=$this->check_FL_SO() ;
         print_2x_arr($arr_personals);
         $cnt=0 ;
         if (_sizeof($arr['set_fl_to_disabled'])) foreach($arr['set_fl_to_disabled'] as $personal_id)
         {   PERSONAL()->personal_save($personal_id,array('fired_manual'=>1),array('source_action'=>'Коррекция ФЛ по статусу СО')) ;
             echo 'Исправлены данные по сотруднику ID '.$personal_id.'<br>' ;
             $cnt++ ;
         }
         if (_sizeof($arr['set_fl_to_enabled'])) foreach($arr['set_fl_to_enabled'] as $personal_id)
         {   PERSONAL()->personal_save($personal_id,array('fired'=>0),array('source_action'=>'Коррекция ФЛ по статусу СО')) ;
             echo 'Исправлены данные по сотруднику ID '.$personal_id.'<br>' ;
             $cnt++ ;
         }
         $text=ob_get_clean() ;
         echo $text ;
         LOGS()->reg_log('check_FL_SO_exec','Исправлен данные по '.$cnt.'сотрудникам',array('save_to_file'=>$text)) ;
     }

     function crypt_pass_db()
     {  ?><h2>Пароль к БД будет пересохранен в зашифрованном виде</h2><?
        //$pass=$GLOBALS['_SETTING']['main_db']['password'] ;
        $is_srypt=$GLOBALS['_SETTING']['main_db']['crypt_pass'] ;
        //echo 'pass='.$pass.'<br>' ;
        if (!$is_srypt) {?><button class="v1" cmd="crypt_pass_db_apply">Выполнить</button><?}
        else {?><div class="alert">Пароль уже хранится в зашифрованном виде</div><?}
     }

     function CMD_crypt_pass_db_apply()
     {  ?><h2>Сохраняем пароль к БД в зашифрованном виде</h2><?
         include_once(_DIR_TO_MODULES.'/engine/i_setup.php') ;
        $pass=$GLOBALS['_SETTING']['main_db']['password'] ;
        $is_srypt=$GLOBALS['_SETTING']['main_db']['crypt_pass'] ;
        if (!$is_srypt)
        { echo 'pass='.$pass.'<br>' ;
          // проверяем существование  _CRYPT_KEY
          $ini2_fname=_DIR_TO_ROOT.'/cab/ic13267832.yaml' ;
          $key_setting=(file_exists($ini2_fname))? Spyc::YAMLLoad($ini2_fname):array();
          if (!isset($key_setting['sdfjhaskjfdhabfak'])) SETUP()->append_key_value('sdfjhaskjfdhabfak',_CRYPT_KEY) ;
          damp_array($key_setting) ;
          echo '_CRYPT_KEY='._CRYPT_KEY.'<br>' ;
          $str=encrypt_string($pass,_CRYPT_KEY) ;
          SETUP()->update_ini_value('main_db','password',$str) ;
          SETUP()->append_ini_value('main_db','crypt_pass',1) ;
          echo '$str='.$str."<br>" ;
        }
     }



     function personal_update_levels_parents()
     {  $GLOBALS['debug_db']=1 ;
        PERSONAL()->update_levels_parents() ;
     }

     function personal_check_workers()
     {  //$GLOBALS['debug_db']=1 ;
        ?><strong>Выполняем синхронизацию СО и персон</strong><br><?
        PERSONAL()->sync_workers_by_persons() ;
     }

     function check_mails()
     {   include_once(_DIR_TO_MODULES."/engine/i_mailbox.php");
         $mail_box=new c_mailbox()  ;
         $mail_box->read_mail() ;

     }

    function show_mail_recs_in_db()
    {
        $recs=execSQL('select pkey as mail_id,c_data,sender,obj_name,size,status from obj_site_inmail order by pkey desc limit 100') ;
        print_2x_arr($recs) ;
    }

    function show_mail_recs_in_db_attach()
    {   $arr_status=array(0=>'Новое',1=>'Обработано',9=>'Ошибка') ;
        $recs=execSQL('select pkey as attach_id,parent as mail_id,obj_name,type,bytes,saved_fname,status from obj_site_inmail_attach order by pkey desc limit 100') ;
        if (_sizeof($recs)) foreach($recs as $i=>$rec) if (isset($arr_status[$rec['status']])) $recs[$i]['status']=$arr_status[$rec['status']]   ;
        print_2x_arr($recs) ;
    }


    function personal_FL_SO()
    {
       $recs=execSQL('select t1.*
                      from obj_site_personals t1
                      left join obj_site_workers t2 on t2.personal_id=t1.pkey 
                      where t1.clss=211 and t2.pkey is null
                      ') ;
       echo 'Требуется добавить <strong>'._sizeof($recs).'</strong> сотрудников организаций для физических лиц<br>' ;
       if (_sizeof($recs)) foreach($recs as $rec)
       {
           $person['obj_name']=$rec['obj_name'] ;
           $person['personal_id']=$rec['pkey'] ;
             $person['fired_data_pause']=0 ;
             $person['enabled']=$rec['enabled'] ;
             $person['uid']=$rec['uid'] ;
             $person['work_id']=$rec['working'] ;
             $person['is_main']=1 ;
             $person['is_second']=0 ;
             $person['person_status']=1 ;
             $person['job_data']=$rec['c_data'] ;
             $person['fired_data']=$rec['fired_data'] ;
             $person['level']=($rec['level'])? $rec['level']:0 ;
             $person['parent']=$rec['parent'] ;
             $person['parent1']=$rec['parent1'] ;
             $person['parent2']=$rec['parent2'] ;
             $person['parent3']=$rec['parent3'] ;
             $person['parent4']=$rec['parent4'] ;
             $person['parent5']=$rec['parent5'] ;
             $person['parent6']=$rec['parent6'] ;
             $person['parent7']=$rec['parent7'] ;
             $person['parent8']=$rec['parent8'] ;
             $person['parent9']=$rec['parent9'] ;
             PERSONAL()->worker_create($person,array('no_return_id'=>1,'use_multiSQL_insert'=>1,'log_comment'=>'Добавление СО из утилиты проверки СО для ФЛ')) ;

       }
       multiSQL_insert('obj_site_workers')->flush() ;
       multiSQL_insert('obj_site_mo_log')->flush() ;

       //execSQL('select * from obj_site_mo_log order by pkey desc limit 20',2) ;
    }


    function delete_loss_mess()
    {
        $pass_tkey=_DOT('obj_site_events_pass')->pkey ;
        $cnt=execSQL_value('select count(t1.pkey)
                      from obj_site_personal_mess t1
                      left join obj_site_events_pass t2 on t2.pkey=t1.source_pkey
                      where t1.source_tkey='.$pass_tkey.' and t2.pkey is null
                     ') ;
        if ($cnt)
        {
            echo 'Будет удалено <strong>'.$cnt.'</strong> сообщений, у которых отсутствет запись в таблице участий в мероприятии<br>' ;
            $arr_ids=execSQL_line('select t1.pkey
                                  from obj_site_personal_mess t1
                                  left join obj_site_events_pass t2 on t2.pkey=t1.source_pkey
                                  where t1.source_tkey='.$pass_tkey.' and t2.pkey is null
                                 ') ;
            $result=execSQL_update('delete from obj_site_personal_mess where pkey in ('.implode(',',$arr_ids).')',['return_result'=>1]) ;
            damp_array($result);
        }
    }


    function check_docs_files()
    {

      include(_DIR_EXT.'/setting/c_services_setting_repair_pdf_doc.php') ;
      $service=new c_services_setting_repair_pdf_doc(['limit'=>20]) ;
      $arr_docs_to_repair=$service->get_repair_stats() ;

      if (_sizeof($arr_docs_to_repair)){ ?><button class="v2" cmd="setting/repair_docs_files">Восстановить PDF-файлы документов</button><?}
      else echo 'Все файлы документов присутствуют<br>' ;
    }

    function fire_all_personals(){
        ?><h2>Увольнение всех сотрудников</h2>
        <div id="fire_all_personals"><span class="red">Уволить всех сотрудников? Данное действие нельзя будет отменить</span><br><br>
        <button class="v2" cmd="aspmo_personal/fire_all_personals">Выполнить</button></div><?
    }

    function check_disk()
    { include_once("i_disk_working.php");
      ?><div class="alert" style="background: #f8f9fa; border-left: 4px solid #0056aa; padding: 20px; margin: 20px 0; border-radius: 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
        <h3 style="margin-top: 0; color: #0056aa; font-size: 18px; font-weight: bold;">Проверка директорий с превышением срока хранения</h3>
        <p style="margin: 10px 0 15px 0; color: #555; line-height: 1.6;">Утилита проверяет директории на превышение срока хранения данных согласно настройкам системы. Для каждой директории будет показан список поддиректорий, которые можно удалить для освобождения места на диске.</p>
        <?
        FORM()->form_open() ;
        FORM()->row_open();

				FORM()->button(['title'=>'Фото МО (/public/mo_photo)',
		                        'cmd_method'=>'v1',
		                        'href'=>'/cab/setting/update/check_systems/[check_cmd=check_disk,action=check_mo_photo_storage]/'
		                       ]);

				FORM()->button(['title'=>'Цифровые слепки подписей (/public/mo_sign)',
												'cmd_method'=>'v1',
												'href'=>'/cab/setting/update/check_systems/[check_cmd=check_disk,action=check_mo_sign_storage]/'
											 ]);

				FORM()->button(['title'=>'Изображения подписей (/public/mo_sign_image)',
												'cmd_method'=>'v1',
												'href'=>'/cab/setting/update/check_systems/[check_cmd=check_disk,action=check_mo_sign_image_storage]/'
											 ]);

        FORM()->row_close();
        FORM()->form_close();
        ?>
      </div>

      <?
      FORM()->form_open() ;
      FORM()->row_open();

      FORM()->button(['title'=>'Информация о свободном месте на диске',
                      'cmd_method'=>'v1',
                      'href'=>'/cab/setting/update/check_systems/[check_cmd=check_disk,action=show_disk_info]/'
                     ]);

      FORM()->row_close();
      FORM()->form_close();

      ?><br><br>
      <style type="text/css">
          .sky-form .button.easy {margin: 2px 10px;
      </style>

      <?
      ob_start() ;
      switch($this->filter['action'])
      {
        case 'check_mo_photo_storage':  i_disk_working::check_mo_photo_storage($this->filter) ; break ;
        case 'check_mo_sign_storage':   i_disk_working::check_mo_sign_storage($this->filter) ; break ;
        case 'check_mo_sign_image_storage': i_disk_working::check_mo_sign_image_storage($this->filter) ; break ;
        case 'show_disk_info':          i_disk_working::show_disk_info() ; break ;
        case 'delete_mo_photo_storage':
        case 'delete_mo_sign_storage':
        case 'delete_mo_sign_image_storage':
																				include_once(_DIR_TO_MODULES.'/engine/i_backgroup_process.php');
                                         $back_process=new i_backgroup_process('/services/aspmo_setting/disk_working/') ;
                                         $back_process->setting['action']=$this->filter['action'] ;
                                         if (isset($this->filter['dirs_file'])) $back_process->setting['dirs_file']=$this->filter['dirs_file'] ;
                                         $back_process->panel_background_process() ;
                                         break ;
      }
      $text=ob_get_clean() ;
      echo $text ;
      if (in_array($this->filter['action'], array('check_mo_photo_storage', 'check_mo_sign_storage', 'check_mo_sign_image_storage')))
      {
          LOGS()->reg_log('disk_working',$this->filter['action'],['save_to_file'=>$text]) ;
      }
    }




}



?>
