<?php
include_once("c_magnit_setting.php");
class c_page_cab_magnit_setting_actions extends c_page_cab_magnit_setting
{
  public $h1='Магнит - Операции' ;

 function block_main()
 { $this->page_title() ;
   ?> <!--<button class="v1" cmd="repair_nonclosed_message">Закрыть незакрытые уведомления</button>
      <button class="v1" cmd="check_ag_events">Анализ дубликатов мероприятий</button>
      <button class="v1" cmd="check_messages">Анализ дубликатов сообщений</button>
      <button class="v1" cmd="check_mess_ag">Анализ активных сообщений</button>
      <button class="v1" cmd="check_pass_ag">Анализ активных мепроприятий</button>
      <!--<button class="v1" cmd="repair_pmo">Восстановление ПМО</button>-->
      <!--<button class="v1" cmd="repair_pmo_docs">Восстановление документов ПМО</button>
      <button class="v1" cmd="full_pmo_length">Задание срока жизни ПМО</button>
      <button class="v1" cmd="clear_pmo_length">Сброс срока жизни ПМО</button>-->
      <button class="v1" cmd="set_group_risk">Создание таблицы группы риска</button><!--
      <button class="v1" cmd="repair_personals">Возврат сотрудников, отправленных на второй круг</button>
      <button class="v1" cmd="close_messages">Закрытие сообщение за первый круг ПМО - показать</button>
      <button class="v1" cmd="close_messages2">Закрытие сообщение за первый круг ПМО - выполнить</button>
      <button class="v1" cmd="svg2">Направления по АГ - добавить в мероприятие</button>
      <button class="v1" cmd="svg3">Направления по АГ - закрыть уведомления для сданных</button>
      <br><br>
      <button class="v1" cmd="svg4">ПМО - восстановить информацию по мероприятию в документах</button>
      --><button class="v1" cmd="svg5">Инструктажи - удалить дубликаты сообщений</button>
      <button class="v1" cmd="svg6">Удаление дубликатов сообщений</button>
      <button class="v1" cmd="svg7">Исправить фильтры мероприятий</button>
      <button class="v1" cmd="svg8">Восстановить статусы сотрудников</button>
      <button class="v1" cmd="svg9">Заблокировать дубликаты сотрудников</button>
      <button class="v1" cmd="svg10">Восстановить должности сотрудников</button>
      <button class="v1" cmd="svg11">Исправить сроки в сообщениях</button>
      <button class="v1" cmd="svg12">Сбросить авторов сообщений</button>
      <button class="v1" cmd="svg13">Повторно отправить на вводный инструктаж</button>
      <button class="v1" cmd="svg14">Восставить статусы прохождения инструктажа</button>
      <br><br>
     <?
     $cmd=$_POST['cmd'] ;
     if ($cmd and method_exists($this,$cmd)) $this->$cmd() ;
 }




    function svg14()
     {   $from=strtotime('30.08.2019 16:01') ;
         $to=strtotime('30.08.2019 16:56') ;
         $recs_events=execSQL('select * from obj_site_mo_log where obj_name="Отправка сообщения" and c_data>='.$from.' and c_data<='.$to) ;


        ?><p>Будет отменена отправка <?echo sizeof($recs_events)?> сообщений сотрудникам </p><?
        ?><p>Неверные статусы в таблице obj_site_events_pass будут исправлены автоматически</p>
          <p><button class="v1" cmd="svg14_apply">Начать</button></p>
         <?

     }

     function svg14_apply()
     { $from=strtotime('30.08.2019 16:01') ;
       $to=strtotime('30.08.2019 16:56') ;
       $recs_events=execSQL('select * from obj_site_mo_log where obj_name="Отправка сообщения" and c_data>='.$from.' and c_data<='.$to) ;
       if (sizeof($recs_events)) foreach($recs_events as $rec_event)
       {  $mess_reffer=$rec_event['reffer1'] ;
          $personal_reffer=$rec_event['reffer2'] ;
          list($mess_id,$tkey)=explode('.',$mess_reffer) ;
          list($personal_id,$tkey)=explode('.',$personal_reffer) ;
          $event_pass=execSQL_van('select * from obj_site_events_pass where mess_id='.$mess_id.' and personal_id='.$personal_id) ;
          if ($event_pass['status']<7)
          { $lessions_pass=execSQL('select * from obj_site_lession_persons where event_id='.$event_pass['event_id'].' and personal_id='.$personal_id.' order by pkey') ;
            $event_status=0 ;
            if (sizeof($lessions_pass))
            { foreach($lessions_pass as $rec_lesson_pass) if ($rec_lesson_pass['status']==4)
                {   $rec_lession=execSQL_van('select * from obj_site_lession where pkey='.$rec_lesson_pass['parent']) ;
                    execSQL_update('delete from obj_site_personal_mess where pkey='.$event_pass['mess_id']) ;
                    echo 'Сотрудник '.$personal_id.': удалено сообщение <strong>'.$event_pass['mess_id'].'</strong><br>' ;
                    execSQL_update('update obj_site_events_pass set status=7,mess_id=0,c_data='.$rec_lesson_pass['r_data'].',r_data='.$rec_lesson_pass['r_data'].',group_id='.$rec_lession['group_id'].' where pkey='.$event_pass['pkey']) ;
                    echo 'Сотрудник '.$personal_id.': исправлен статус участия в мероприятии <strong>'.$event_pass['pkey'].'</strong><br>' ;
                }
            } else echo 'Сотрудник '.$personal_id.': не найдено участия в мероприятии<br>' ;
          } else echo 'Сотрудник '.$personal_id.': текущий статус: '.$event_pass['status'].'<br>' ;
       }
     }

 function svg13()
 {
   echo 'Поиск сотрудников, которые не были отправлены на вводный инструктаж<br>' ;
   $recs=execSQL('select t1.pkey,t1.c_data,t1.data,t1.personal_id, 
                  t2.obj_name,t2.working,
                  t3.obj_name as work_name,
                  t4.job_data
                  from obj_site_mo_log t1 
                  left join obj_site_personals t2 on t2.pkey=t1.personal_id
                  left join view_IL_works t3 on t3.id=t2.working
                  left join obj_site_workers t4 on t4.personal_id=t1.personal_id
                  where t1.c_data>=UNIX_TIMESTAMP("2019-04-30") 
                  and t1.obj_name="Измение данных места работы" 
                  and (t1.data like "%Организация%" or t1.data like "%Должность%") 
                  and not t1.data like "%вхождения%"
                  and (t4.job_data is null or t4.job_data<t1.c_data)
                  ') ;
   ?><form>
       <table class="basic fz_small"><tr><th>Выбор</th><th>Дата изменений</th><th>ФИО сотрудника</th><th>Текущая должность</th><th>Изменения</th><th>Дата последнего вхождения в должность</th></tr>
           <?if (sizeof($recs)) foreach($recs as $rec){?>
           <tr>
               <td><input type="checkbox" name="check[<?echo $rec['personal_id']?>]"></td>
               <td><?echo date('d.m.Y H:i:s',$rec['c_data'])?></td>
               <td><?echo $rec['obj_name']?></td>
               <td><?echo $rec['work_name']?></td>
               <td><?echo damp_array(unserialize($rec['data']),1,-1)?></td>
               <td><?echo ($rec['job_data'])? date('d.m.Y H:i:s',$rec['job_data']):'-'?></td>
           </tr><?}?>
       </table>
       <br><button class="v1" cmd="svg13_apply">Отправить на вводный инструктаж выбранных</button>
   </form><?
 }

 function svg13_apply()
 {   $event_id=97 ;
     //damp_array($_POST) ;
     $event_obj=EVENTS()->get_event_obj_by_id($event_id) ;
     if (sizeof($_POST['check']))
     {
         $recs=execSQL('select t1.pkey,t1.c_data,t1.data,t1.personal_id, 
                           t2.obj_name,t2.working,
                           t3.obj_name as work_name,
                           t4.job_data
                           from obj_site_mo_log t1 
                           left join obj_site_personals t2 on t2.pkey=t1.personal_id
                           left join view_IL_works t3 on t3.id=t2.working
                           left join obj_site_workers t4 on t4.personal_id=t1.personal_id
                           where t1.c_data>=UNIX_TIMESTAMP("2019-04-30") 
                           and t1.obj_name="Измение данных места работы" 
                           and (t1.data like "%Организация%" or t1.data like "%Должность%") 
                           and not t1.data like "%вхождения%"
                           and (t4.job_data is null or t4.job_data<t1.c_data)
                           and t1.personal_id in ('.implode(',',array_keys($_POST['check'])).')') ;
         foreach($recs as $rec)
         {
             update_rec_in_table('obj_site_workers',array('job_data'=>$rec['c_data']),'personal_id='.$rec['personal_id'].' and is_main=1') ;
             echo 'Изменена дата вхождения в должность для <strong>'.$rec['obj_name'].'</strong><br>' ;
             update_rec_in_table('obj_site_events_pass',array('status'=>1),'personal_id='.$rec['personal_id'].' and event_id='.$event_id) ;

         }
         $result=$event_obj->set_personal_to_status_2($event_id,implode(',',array_keys($_POST['check']))) ;
         damp_array($result,1,-1) ;

     }
 }

 function  svg12()
 {
   echo '<h2>Будут сброшены авторы сообщений по инструктажам</h2>' ;
   $cnt=execSQL_update('update obj_site_personal_mess set account_id=0 where source_obj like "esmo_magnit_instruction/%"') ;
   echo 'Был сброшен автор в <strong>'.$cnt.'</strong> сообщениях<br>' ;
 }

/*
 function  svg11()
 { ob_start() ;
   $cnt=execSQL_update('update obj_site_personal_mess set max_data=block_from where block_from>max_data and max_data>0') ;
   echo 'Исправлено <strong>'.$cnt.'</strong> сообщений (block_from>max_data)<br>' ;
   execSQL_update('update obj_site_personal_mess set block_from=max_data where max_data>block_from and block_from>0') ;
   echo 'Исправлено <strong>'.$cnt.'</strong> сообщений (max_data>block_from)<br>' ;
   $text=ob_get_clean() ;
   echo $text ;
   LOGS()->reg_log('Исправление сроков сообщений',$text) ;
 }
*/

 function svg10()
 {   execSQL_update('update obj_site_personals set parent1=0 where parent1 is null') ;
     execSQL_update('update obj_site_personals set parent2=0 where parent2 is null') ;
     execSQL_update('update obj_site_personals set parent3=0 where parent3 is null') ;
     execSQL_update('update obj_site_personals set parent4=0 where parent4 is null') ;
     execSQL_update('update obj_site_personals set parent5=0 where parent5 is null') ;
     execSQL_update('update obj_site_workers set parent1=0 where parent1 is null') ;
     execSQL_update('update obj_site_workers set parent2=0 where parent2 is null') ;
     execSQL_update('update obj_site_workers set parent3=0 where parent3 is null') ;
     execSQL_update('update obj_site_workers set parent4=0 where parent4 is null') ;
     execSQL_update('update obj_site_workers set parent5=0 where parent5 is null') ;

     $recs_dubl=execSQL_row('select personal_id,count(pkey) as cnt from obj_site_workers where is_main=1 group by personal_id having cnt>1') ;
     if (sizeof($recs_dubl))
     { echo 'В таблице сотрудников присутствуют дубликаты записей по основной должности (ID/число дубликатов) - '.sizeof($recs_dubl).' записей<br>' ;
       //damp_array($recs_dubl,1,-1) ;
       foreach($recs_dubl as $personal_id=>$count)
       { $recs_ids=execSQL_line('select pkey from obj_site_workers where personal_id='.$personal_id.' and is_main=1',0,1) ;
         unset($recs_ids[0]) ;
         foreach($recs_ids as $id)
         { execSQL_update('delete from obj_site_workers where pkey='.$id);
           echo 'Для сотрудника ID '.$personal_id.' удален дубликат ID '.$id.'<br>' ;
         }
       }
       //echo '<span class=red>Данные сотрудники не могут быть корректно обработаны</span>' ;
     }

     ?><h3>Производим коррекцию данных по организации/подразделению/месту работы ФЛ на основе данных таблицы СО</h3><?
     $recs=execSQL('select t1.pkey,
                    t1.parent as sparent,t1.parent1 as sparent1,t1.parent2 as sparent2,t1.parent3 as sparent3,t1.parent4 as sparent4,t1.parent5 as sparent5,t1.working as swork_id,
                    t2.parent as wparent,t2.parent1 as wparent1,t2.parent2 as wparent2,t2.parent3 as wparent3,t2.parent4 as wparent4,t2.parent5 as wparent5,t2.work_id as wwork_id
                    from obj_site_personals t1
                    left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_main=1 
                    where (t2.parent!=t1.parent or t2.parent1!=t1.parent1 or t2.parent2!=t1.parent2 or t2.parent3!=t1.parent3 or t2.parent4!=t1.parent4 or t2.parent5!=t1.parent5 or t1.working!=t2.work_id)
                    and not t2.pkey is null 
     ') ;
     echo 'Найдено <strong>'.sizeof($recs).'</strong> записей, требующих восстановления<br>' ;
     if (sizeof($recs)) foreach($recs as $rec)
     {   update_rec_in_table('obj_site_personals',array('parent'=>$rec['wparent'],
                                                        'parent1'=>$rec['wparent1'],
                                                        'parent2'=>$rec['wparent2'],
                                                        'parent3'=>$rec['wparent3'],
                                                        'parent4'=>$rec['wparent4'],
                                                        'parent5'=>$rec['wparent5'],
                                                        'working'=>$rec['wwork_id']
                                                        ),'pkey='.$rec['pkey'],array('debug'=>0)) ;
         echo 'Обновлены данные по ФЛ: '.$rec['pkey'].'<br>' ;
     }

 }


 function svg9()
 {   ob_start() ;
     ?><h2>Блокировка дубликатов сотрудников</h2><?
     $recs=execSQL('select uid,count(pkey) as cnt from obj_site_personals where clss=211 group by uid having cnt>1') ;
     echo 'Обнаружено '.sizeof($recs).' дубликатов сотрудников<br>' ;
     if (sizeof($recs)) foreach($recs as $rec)
     {
         $recs_pers=execSQL('select * from obj_site_personals where uid="'.$rec['uid'].'" order by c_data',0,1) ;
         if (sizeof($recs_pers)) foreach($recs_pers as $i=>$rec_pers)
         if ($i>0) // первые записи - оригиналы
         {   $main_id=$recs_pers[0]['pkey'] ;
             echo '<h3>Дубликат ID='.$rec_pers['pkey'].'</h3>' ;
             echo 'Переносим МО на оригинал записи по МО<br>' ;
             $res=execSQL_update('update obj_site_mo_session set member_id='.$main_id.' where member_id='.$rec_pers['pkey'],array('log_result'=>1)) ;  echo '<br>' ;
             echo 'Блокируем запись по дубликату<br>' ;
             $res=execSQL_update('delete from obj_site_personals where pkey='.$rec_pers['pkey'],array('log_result'=>1)) ; echo '<br>' ;
         }
     }
     $text=ob_get_clean() ;
     LOGS()->reg_log('block_personals_by_uid',$text) ;
     echo $text ;
 }

 function svg8()
 {  ?><p>Будут проверно соответствие статусов участников мероприятия "Учебная программа" в таблице obj_site_events_pass истории статусов из таблицы obj_site_events_pass_status</p><?
    ?><p>Неверные статусы в таблице obj_site_events_pass будут исправлены автоматически</p>
      <p><button class="v1" cmd="svg8_apply">Начать</button></p>
     <?

 }

 function svg8_apply()
 { $event_id=137 ;
   $recs=execSQL('select t1.pkey,t1.personal_id,t1.status as status1,
                 (select t2.status_new from obj_site_events_pass_status t2 where t2.event_id='.$event_id.' and t2.personal_id=t1.personal_id order by t2.pkey desc limit 1) as status2 
                  from obj_site_events_pass t1 
                  where t1.event_id='.$event_id.'  
                  having t1.status!=status2 
                  ') ;
  foreach($recs as $rec)
  {  EVENTS()->set_personal_status($event_id,$rec['personal_id'],$rec['status2']) ;
     echo 'Сотрудник '.$rec['personal_id'].': установлен статус <strong>'.$rec['status2'].'</strong><br>' ;
     // закрываем все сообшения по данному мероприятию
     if ($rec['status2']==7)
     {   $mess_id=execSQL_value('select pkey from obj_site_personal_mess where source_pkey='.$rec['pkey']) ;
         if ($mess_id)
         { PERSONAL()->message_personal_close($mess_id) ;
           echo 'Сотрудник '.$rec['personal_id'].': закрыто сообщение <strong>'.$mess_id.'</strong><br>' ;
         }

     }
     //if ($rec['status2']==6)
     //{   $mess_id=execSQL('select pkey from obj_site_personal_mess where source_pkey='.$rec['pkey']) ;
//         if ($mess_id) PERSONAL()->message_personal_close($mess_id) ;
  //   }
  }

 }

 function svg7()
 { ob_start() ;
   $recs=execSQL('select pkey,ext_info from obj_site_events_schedule where clss=222') ;
   if (sizeof($recs)) foreach($recs as $rec)
       {   $arr=unserialize($rec['ext_info']) ;
           if ($arr['filter']!=null)
           {   $change=0 ;
               if (is_object($arr['filter'])) { $arr['filter']=(array)$arr['filter'] ; $change=1 ; }
               if (sizeof($arr['filter'])) foreach($arr['filter'] as $id=>$value)
                   {   if (is_object($value))
                        { $value=(array)$value ;
                          $arr['filter'][$id]=$value ;
                          $change=1 ;
                        }
                   }
               //var_dump($arr['filter']) ; echo '<hr>' ;
               if ($change)
               {  echo 'Корректировка фильтра для мероприятия ID '.$rec['pkey'].'<br>' ;
                  update_rec_in_table('obj_site_events_schedule',array('ext_info'=>$arr),'pkey='.$rec['pkey']) ;
               }
           }
       }
   $text=ob_get_clean() ;
   echo $text ;
   LOGS()->reg_log('svg7',$text) ;

 }

 function svg6()
 { include(_DIR_TO_MODULES.'/engine/i_backgroup_process.php') ;
   $back_process=new i_backgroup_process('/services/magnit/remove_dublicate_message/') ; // будет вызван  /ext/events/c_update_personal_status.php::c_update_personal_status->show()
   $back_process->panel_background_process() ;
   return ;
 }


 function svg5()
 {
     EVENTS()->delete_dublicate_message() ;
 }

 function svg4()
 {  ob_start() ;
     $recs_docs=execSQL('select t1.pkey as doc_id,t2.pkey as event_pass_id,t2.tkey as event_pass_tkey,t2.personal_id 
                         from obj_site_docs  t1
                         left join obj_site_events_pass t2 on t2.personal_id=t1.personal_id and t2.event_id='.$GLOBALS['LS_esmo_PMO_event'].' 
                         where (t1.source_obj="" or t1.source_obj is null) and t1.report_code like "%esmo_magnit_pmo%" 
                        ',0,1) ;
     echo 'Найдено <strong>'.sizeof($recs_docs).'</strong> документов, требующих восстановления<br>' ;
     if (sizeof($recs_docs)) foreach($recs_docs as $rec_doc) if ($rec_doc['event_pass_id'])
     {
         execSQL_update('update obj_site_docs set source_obj="esmo_magnit_pmo/i_event_pmo",source_tkey='.$rec_doc['event_pass_tkey'].',source_pkey='.$rec_doc['event_pass_id'].' where pkey='.$rec_doc['doc_id']) ;
         echo 'Восстановлена информация по документу # '.$rec_doc['doc_id'].': event_pass_id='.$rec_doc['event_pass_id'].'<br>' ;
     } else echo 'Документ # '.$rec_doc['doc_id'].': отсутствие информация по участию в мероприятии для сотрудника '.$rec_doc['personal_id'].'<br>' ;
   $text=ob_get_clean() ;
   echo $text  ;
   LOGS()->reg_log('Работа утилиты','Восстановление информации по мероприятию в документах<br>'.sizeof($recs_docs).' документов',array('save_to_file'=>$text)) ;
 }

 function svg3()
 {   ob_start() ;
     include(_DIR_EXT.'/events_docs/i_event_docs.php') ;
     $recs=execSQL('select t1.*,t3.c_data as doc_data 
                    from obj_site_personal_mess t1
                    left join obj_site_events_pass t2 on t2.pkey=t1.source_pkey
                    left join obj_site_docs t3 on t3.pkey=t2.doc_id 
                    where t1.source_obj="events_docs/i_event_docs" and t1.status<4
                    having (select max(c_data) from view_docs_scan t4 where t4.personal_id=t1.personal_id and t4.scan_id>0)>t3.c_data
    ',2) ;
     if (sizeof($recs)) foreach($recs as $rec_mess)
     {   execSQL_update('delete from obj_site_personal_mess where pkey='.$rec_mess['pkey']) ;
         execSQL_update('delete from obj_site_events_pass where pkey='.$rec_mess['source_pkey']) ;
         echo 'Сотрудник '.$rec_mess['personal_id'].'  - удалено сообщение № '.$rec_mess['pkey'].', участие в мероприятии '.$rec_mess['source_pkey'].'<br>' ;
     }
     execSQL_update('update obj_site_events_pass set status=5 where event_id=36 and status=2 and block_data=0',2) ;

     $recs=execSQL('select t1.* 
                    from obj_site_personal_mess t1
                    where t1.source_obj="events_docs/i_event_docs" and t1.status<4
                    having (select t4.data_set from obj_site_scan t4 where t4.personal_id=t1.personal_id  and t4.status=3 and t4.doc_id=-1 order by t4.pkey desc limit 1)>t1.view_from
                    ',2) ;
     if (sizeof($recs)) foreach($recs as $rec_mess)
     {   PERSONAL()->message_personal_close($rec_mess['pkey']) ;
         execSQL_update('update obj_site_events_pass set status=5 where pkey='.$rec_mess['source_pkey']) ;
         echo 'Сотрудник '.$rec_mess['personal_id'].'  - закрыто сообщение № '.$rec_mess['pkey'].', участие в мероприятии '.$rec_mess['source_pkey'].' изменен статус на сдан<br>' ;
     }


     $text=ob_get_clean() ;
     echo $text ;
     $fname=LOGS()->reg_file_log('svg3',$text) ;
     LOGS()->reg_log('svg3','<a href="'.$fname.'">Отчет</a>') ;


 }
 function svg2()
 {   include(_DIR_EXT.'/events_docs/i_event_docs.php') ;
     $result=EVENT_DOCS()->update_personal_status_1($GLOBALS['LS_esmo_ag_event']) ;
     damp_array($result,1,-1) ;
 }

 function close_messages($read_only=1)
 {  ?><h2>Будут закрыты сообщения связанные с прохождением ПМО, которые не были ранее закрыты</h2><?
     $recs=execSQL_row('select personal_id,count(pkey) from obj_site_events_pass_status where obj_name like "Подлежит пов%" group by personal_id having count(pkey)>1') ;
     if (sizeof($recs)) foreach($recs as $personal_id=>$count)
     {   echo 'Проверяем отправку на второй круг для сотрудника <strong>'.$personal_id.'</strong><br>' ;
         $recs_repat=execSQL('select * from obj_site_events_pass_status where obj_name like "Подлежит пов%" and personal_id='.$personal_id) ;
         if (sizeof($recs_repat)) foreach($recs_repat as $rec_repeat)
         {  echo 'Проверяем отправку на второй круг для сотрудника <strong>'.$personal_id.'</strong> от <strong>'.date('d.m.Y H:i:s',$rec_repeat['c_data']).'</strong><br>'  ;
            $arr_messages=execSQL('select * from obj_site_personal_mess where c_data<='.$rec_repeat['c_data'].' and source_obj="esmo_magnit_pmo/i_event_pmo" and status<4 and personal_id='.$personal_id) ;
            echo 'Найдено <strong>'.sizeof($arr_messages).'</strong> незакрытых сообщений до <strong>'.date('d.m.Y H:i:s',$rec_repeat['c_data']).'</strong><br>' ;
            if (sizeof($arr_messages)) foreach($arr_messages as $rec_message)
            {   echo 'Будет закрыто сообщение № '.$rec_message['pkey'].' "'.$rec_message['obj_name'].'"<br>' ;
                if (!$read_only)
                { PERSONAL()->message_personal_close($rec_message['pkey'],array('comment'=>'Утилита закрытия незакрытых после второго круга сообщений')) ;
                  echo 'Сообщение закрыто<br>' ;
                }
            }
         }
     }
 }
 function close_messages2()
 { $this->close_messages(0) ;
 }

 function repair_personals()
 {
    $personal_ids=execSQL('select * from obj_site_events_pass_status where obj_name like "Подлежит повторному прохождению по истечению срока действия"',1) ;
    if (sizeof($personal_ids)) foreach($personal_ids as $rec)
    { execSQL_update('update obj_site_events_pass set status=8 where event_id='.$rec['event_id'].' and personal_id='.$rec['personal_id'],1) ;
      execSQL_update('delete from obj_site_events_pass_status where pkey='.$rec['pkey'],1) ;
    }
 }

  function set_group_risk()
  {
      ENTERPRISE()->update_group_risk() ;
  }

    function clear_pmo_length()
    {
        execSQL_update('update obj_site_events_pass set data_from=0,data_to=0 where event_id='.$GLOBALS['LS_esmo_PMO_event'],2) ;
    }

    function full_pmo_length()
    {   $recs=execSQL('select t1.*,t2.pkey as doc_pkey,t2.obj_name as doc_name,t3.pkey as scan_pkey,t3.obj_name as scan_doc,t3.event_pass_id as scan_event_pass_id,t3.data_doc as scan_data_doc,t3.data_set as scan_data_set 
                      from obj_site_events_pass t1 
                      left join obj_site_docs t2 on t2.event_id='.$GLOBALS['LS_esmo_PMO_event'].' and t2.source_pkey=t1.pkey and t2.report_code="doc/esmo_magnit_pmo/zakluchenie" 
                      left join obj_site_scan t3 on t3.doc_id=t2.pkey and t3.personal_id=t1.personal_id and t3.status=3 
                      where t1.event_id='.$GLOBALS['LS_esmo_PMO_event'].' and t1.status in (7,8) and  t3.pkey>0 and
                          ( (t1.data_from is null or t1.data_from=0) and (t1.data_to is null or t1.data_to=0)
                             or
                            (t1.doc_id=0 or t1.doc_id is null)
                             or
                            (t1.scan_id=0 or t1.scan_id is null)
                            )
                          ',1) ;

        $rec_event=EVENTS()->get_event_by_id($GLOBALS['LS_esmo_PMO_event']) ;
        if (!$rec_event['_ext_info']['pmo_len']) { echo 'Не задан срок ПМО в настройках ПМО' ; return ; }
        //if (!$recs) { echo 'Все мероприятия обновлены' ; return ; }
        if (sizeof($recs)) foreach($recs as $rec)
        { $from=($rec['scan_data_doc'])? $rec['scan_data_doc']:$rec['scan_data_set'] ;
          $now=getdate($from) ;
          switch($rec_event['_ext_info']['pmo_len'])
           { case 1: $to=mktime(23,59,59,$now['mon'],$now['mday'],$now['year']+1); break ;
             case 2: $to=mktime(23,59,59,$now['mon']+6,$now['mday'],$now['year']); break ;
             case 3: $to=mktime(23,59,59,$now['mon'],$now['mday'],$now['year']+2); break ;
             case 4: $to=mktime($now['hours'],$now['minutes']+10,$now['seconds'],$now['mon'],$now['mday'],$now['year']); break ;
             default: $to=mktime(23,59,59,$now['mon'],$now['mday'],$now['year']+1); break ;
           }
         echo '<strong>Сотрудник ID '.$rec['personal_id'].'</strong>:<br>' ;
         $arr_changes=array() ;
         if (!$rec['data_from'])
         { //execSQL_update('update obj_site_events_pass set data_from='.$rec['r_data'].', data_to='.$to.' where pkey='.$rec['pkey']) ;
           echo 'Срок действия ПМО: '.date('d.m.Y H:i:s',$from).' - '.date('d.m.Y H:i:s',$to).'<br>' ;
           $arr_changes['data_from']=$from ;
           $arr_changes['data_to']=$to ;
         }

         if ($rec['doc_pkey'] and !$rec['doc_id'])
         { //execSQL_update('update obj_site_events_pass set doc_id='.$rec['doc_pkey'].' where pkey='.$rec['pkey']) ;
           echo 'ID заключения ПМО: '.$rec['doc_pkey'].'<br>' ;
           $arr_changes['doc_id']=$rec['doc_pkey'] ;
         }
         if ($rec['scan_pkey'] and !$rec['scan_id'])
         { //execSQL_update('update obj_site_events_pass set scan_id='.$rec['scan_pkey'].' where pkey='.$rec['pkey']) ;
           echo 'ID скана заключения ПМО: '.$rec['scan_pkey'].'<br>' ;
           $arr_changes['scan_id']=$rec['scan_pkey'] ;
         }

         if (sizeof($arr_changes)) update_rec_in_table('obj_site_events_pass',$arr_changes,'pkey='.$rec['pkey']) ;

         if ($rec['scan_pkey'] and !$rec['scan_event_pass_id'])
         { execSQL_update('update obj_site_scan set event_pass_id='.$rec['pkey'].' where pkey='.$rec['scan_pkey']) ;
           echo 'ID участия в ПМО: '.$rec['pkey'].'<br>' ;
         }
        }
    }

 function repair_pmo_links()
 {   ?><h3>Исправление связей у сотрудника 51093</h3><?
     execSQL_update('update obj_site_personal_mess set source_pkey=66504 where pkey=49783',2) ;
     execSQL_update('update obj_site_events_pass set doc_id=99986,scan_id=51229,mess_id=49783 where pkey=66504',2) ;
     ?><h3>Исправление связей у сотрудника 42340</h3><?
     execSQL_update('update obj_site_personal_mess set source_pkey=69784 where pkey=49786',2) ;
     execSQL_update('update obj_site_events_pass set doc_id=99997,scan_id=52297,mess_id=49786 where pkey=69784',2) ;
     ?><h3>Исправление связей у сотрудника 60094</h3><?
     execSQL_update('update obj_site_personal_mess set source_pkey=181621 where pkey=13997',2) ;
     execSQL_update('update obj_site_events_pass set doc_id=26680,mess_id=13997 where pkey=181621',2) ;
     ?><h3>Исправление связей у сотрудника 51370</h3><?
     execSQL_update('update obj_site_personal_mess set source_pkey=181624 where pkey=12981',2) ;
     execSQL_update('update obj_site_events_pass set doc_id=26482,mess_id=12981 where pkey=181624',2) ;
     ?><h3>Исправление связей у сотрудника 59142</h3><?
     execSQL_update('delete from obj_site_personal_mess where pkey=12968',2) ;
     execSQL_update('delete from obj_site_personal_mess where pkey=12847',2) ;
     execSQL_update('delete from obj_site_docs where pkey=25554',2) ;
     execSQL_update('delete from obj_site_docs where pkey=25553',2) ;
     ?><h3>Исправление связей у сотрудника 74480</h3><?
     execSQL_update('delete from obj_site_personal_mess where pkey=12752',2) ;
     ?><h3>Исправление связей у сотрудника 52513</h3><?
     execSQL_update('delete from obj_site_personal_mess where pkey=12752',2) ;

 }

 function check_messages()
 {   ob_start() ;
     ?><h2>Анализ дубликатов сообщений</h2><?
     $arr_account=array() ; $arr_dates=array() ;
     $recs=execSQL('select personal_id,source_pkey,obj_name,count(pkey) as cnt,min(pkey) as  from_id,min(account_id) as account_id from obj_site_personal_mess
                    where personal_id>0 and source_pkey>0
                    group by personal_id,source_pkey,obj_name having cnt>1 order by from_id',0,1) ;
     if (sizeof($recs))
     {   ?><form><button class="v1" cmd="check_messages" remove_mess="1">Удалить дубликаты</button></form><br><?
         echo 'Найдено '.sizeof($recs).' сообщений<br>' ;
         foreach($recs as $rec)
         {  $rec_personal=PERSONAL()->get_personal_by_id($rec['personal_id']) ;
            //$recs_dubl=execSQL('select pkey,c_data,obj_name,status,block_mo,view_cnt,view_data,close_data,account_id from obj_site_personal_mess where personal_id='.$rec['personal_id'].' and source_pkey='.$rec['source_pkey'].' and obj_name="'.$rec['obj_name'].'" order by pkey desc,status desc,view_cnt desc',0,1) ;
            $recs_dubl=execSQL('select pkey,c_data,obj_name,status,view_cnt,view_data,close_data,account_id from obj_site_personal_mess where personal_id='.$rec['personal_id'].' and source_pkey='.$rec['source_pkey'].' and obj_name="'.$rec['obj_name'].'" order by pkey desc,status desc,view_cnt desc',0,1) ;
            echo 'Сообщение "'.$rec['obj_name'].'",  для <a href="'.$rec_personal['__href_window'].'messages/" class=new_window>'.$rec_personal['obj_name'].'</a>, оператор '.ACCOUNTS()->get_member_name_by_id($rec['account_id']).'<br>' ;
            foreach($recs_dubl as $i=>$rec_dubl) if ($i)
            { $sql='delete from obj_site_personal_mess where pkey='.$rec_dubl['pkey'] ;
              if ($_POST['remove_mess']==1) { execSQL_update($sql) ; $text='УДАЛЕНО' ; }
              else $text='БУДЕТ УДАЛЕНО' ;
              $data_close=($rec_dubl['status']==4)? ' '.date('d.m.Y H:i:s',$rec_dubl['close_data']):'' ;
              echo 'Сообщение ID <strong>'.$rec_dubl['pkey'].'</strong> от <strong>'.date('d.m.Y H:i:s',$rec_dubl['c_data']).'</strong>, <strong>'.$_SESSION['ARR_mess_status'][$rec_dubl['status']].$data_close,'</strong> - <span class="green">'.$text.'</span><br>' ;
              $arr_account[$rec_dubl['account_id']]++ ;
              $arr_dates[$rec_dubl['c_data']][$rec_dubl['account_id']]++ ;
            }
            else
            { $data_close=($rec_dubl['status']==4)? ' '.date('d.m.Y H:i:s',$rec_dubl['close_data']):'' ;
              echo 'Сообщение ID <strong>'.$rec_dubl['pkey'].'</strong> от <strong>'.date('d.m.Y H:i:s',$rec_dubl['c_data']).'</strong>, <strong>'.$_SESSION['ARR_mess_status'][$rec_dubl['status']].$data_close.'</strong><br>' ;
              $arr_account[$rec_dubl['account_id']]++ ;
              $arr_dates[$rec_dubl['c_data']][$rec_dubl['account_id']]++ ;
            }

            echo '<br>' ;
         }
     }
     else echo '<span class="green">Дубликатов сообщений не найдено</span><br>' ;
     if (sizeof($arr_account))
     { ?><h2>Статистика по аккаунтам</h2><?
       $arr_account2=array() ;
       foreach($arr_account as $account_id=>$cnt) $arr_account2[ACCOUNTS()->get_member_name_by_id($account_id)]=$cnt ;
       damp_array($arr_account2,1,-1) ;
     }
     if (sizeof($arr_dates))
     { ?><h2>Статистика по датам</h2><?
       $arr_dates2=array() ;
       foreach($arr_dates as $t=>$cnt_acc) foreach($cnt_acc as $account_id=>$cnt) $arr_dates2[date('d.m.Y H:i',$t)][ACCOUNTS()->get_member_name_by_id($account_id)]+=$cnt ;
       damp_array($arr_dates2,1,-1) ;
     }
     $text=ob_get_clean() ;
     echo $text ;
     $fname=LOGS()->reg_file_log('delete_dublicate_messages',$text) ;
     LOGS()->reg_log('delete_dublicate_messages','<a href="'.$fname.'">Отчет</a>') ;
 }


 function repair_pmo_docs()
 {   ob_start() ;
     $recs=execSQL('select t1.pkey,t1.obj_name,t1.c_data,t1.personal_id,t1.source_pkey,
                          t2.pkey as pass_id,t2.status,t2.doc_id,t2.scan_id,
                          (select status_new from obj_site_events_pass_status t3 where t3.personal_id=t2.personal_id and t3.event_id=t2.event_id order by pkey desc limit 1) as status_cur
                          from obj_site_docs t1
                          left join obj_site_events_pass t2 on t2.personal_id=t1.personal_id and t2.event_id='.$GLOBALS['LS_esmo_PMO_event'].'
                          where t1.source_pkey>0 and t1.event_id='.$GLOBALS['LS_esmo_PMO_event'].'
                          and not t1.source_pkey in (select pkey from obj_site_events_pass where event_id='.$GLOBALS['LS_esmo_PMO_event'].')
                          and t1.personal_id in (select personal_id from obj_site_events_pass where event_id='.$GLOBALS['LS_esmo_PMO_event'].')
                          order by t1.pkey desc',2,1) ;
   if (sizeof($recs)) foreach($recs as $rec)
   {
       execSQL_update('update obj_site_docs set source_pkey='.$rec['pass_id'].' where pkey='.$rec['pkey']) ;
       echo 'doc_id '.$rec['pkey'].': '.$rec['source_pkey'].' => '.$rec['pass_id'].'<br>' ;
       if ($rec['status']!=$rec['status_cur'])
       { execSQL_update('update obj_site_events_pass set status='.$rec['status_cur'].' where pkey='.$rec['pass_id']) ;
         echo 'event_pass_id '.$rec['pass_id'].': '.$rec['status'].' => '.$rec['status_cur'].'<br>' ;
       }
   }
   $text=ob_get_clean() ;
   echo $text ;
   $fname=LOGS()->reg_file_log('repair_pmo_docs',$text) ;
   LOGS()->reg_log('repair_pmo_docs','<a href="'.$fname.'">Отчет</a>') ;



     
 }

 function  repair_nonclosed_message()
 {   ob_start() ;  $cnt_close=0 ; $cnt_update=0 ;  $cnt_mess=0 ; $cnt_no_mess=0 ;
     // ищем сканы без привязки к документу
     //
     $recs_scan=execSQL('select * from view_scan where clss=218 and status=3 and data_set>0 and personal_id>0 and (doc_id=-1 or doc_id is null or doc_id=0) order by pkey') ;
     echo 'В системе имеется <strong>'.sizeof($recs_scan).'</strong> сканов без привязки к документу<br>' ;
     if (sizeof($recs_scan)) foreach($recs_scan as $rec_scan)
     {
        $_usl=array() ;
        $_usl[]='c_data<='.$rec_scan['data_set'] ;
        $_usl[]='personal_id='.$rec_scan['personal_id'] ;
        $_usl[]='status in (1,2,3)';
        $_usl[]='not source_obj like "esmo_magnit_instruction%"';
        if ($rec_scan['diagnoz']=='Годен')        { $_usl[]='source_obj like "esmo_magnit_pmo%"' ; $doc_type='ПМО' ; }
        elseif ($rec_scan['diagnoz']=='Не годен') { $_usl[]='source_obj like "esmo_magnit_pmo%"' ; $doc_type='ПМО' ; }
        else                                      { $_usl[]='source_obj like "events_docs%"' ;     $doc_type='Направления по АГ' ; }
        $usl=implode(' and ',$_usl) ;
        $recs_mess=execSQL('select * from obj_site_personal_mess where '.$usl.' order by pkey') ;
        if (sizeof($recs_mess))
        { echo '<h3>Обрабатываем скан # '.$rec_scan['pkey'].', <a href="/window/personal/person/'.$rec_scan['_personal_id'].'/" class="new_window">'.$rec_scan['_personal_name'].'</a>, дата приема скана '.date('d.m.Y H:i',$rec_scan['data_set']).'</h3>' ;
          echo 'Найдено <strong>'.sizeof($recs_mess).'</strong> незакрытых сообщений (тема - '.$doc_type.'), отправленых до '.date('d.m.Y H:i',$rec_scan['data_set']).'<br>' ;
          foreach($recs_mess as $rec_mess)
            { echo 'Закрываем сообщение # '.$rec_mess['pkey'].' ['.$rec_mess['obj_name'].']<br>' ;
              PERSONAL()->message_personal_close($rec_mess['pkey'],array('data_close'=>$rec_scan['data_set'])) ;
              $cnt_close++ ;
              // если у сообщения указан ID источника - получаем запись по участию в мероприятии, в нем будет ID документа
              if ($rec_mess['source_pkey']) $event_pass=EVENTS()->get_event_pass_by_id($rec_mess['source_pkey']) ; else $event_pass=array() ;
              //damp_array($event_pass,1,-1) ;
              if ($event_pass['doc_id'])
              { execSQL_update('update obj_site_scan set doc_id='.$event_pass['doc_id'].' where pkey='.$rec_scan['pkey']) ;
                echo 'Задаем doc_id='.$event_pass['doc_id'].' для scan_id='.$rec_scan['pkey'].'<br>' ;
                $cnt_update++ ;
              }
            }
            $cnt_mess++ ;
        } $cnt_no_mess++ ; //else echo 'Все сообщения (тема - '.$doc_type.'), отправленые до '.date('d.m.Y H:i',$rec_scan['data_set']).' - закрыты<br>' ;
     }
     $result=array('Всего сканов без привязки к документам:'=>sizeof($recs_scan),
                   'Сканов, по которым сообщения закрыты:'=>$cnt_no_mess,
                   'Сканов, по которым есть открытые сообщения:'=>$cnt_mess,
                   'Закрыто сообщений:'=>$cnt_close,
                   'Задан ID документа в скане:'=>$cnt_update,

             ) ;
     damp_array($result,1,-1) ;

     $text=ob_get_clean() ;
     echo $text ;
     $name = LOGS()->reg_file_log('repair_nonclosed_message',$text);
   	 LOGS()->reg_log('repair_nonclosed_message','<a target=_blank href="' . $name . '">Отчет</a>',array('data'=>$result));

 }


 function check_ag_events()
 {   ?><h3>Сотрудники, имеющие более одного активнго мероприятия по АГ</h3><?
     $recs=execSQL('select t1.personal_id,count(t1.pkey) as cnt,t2.obj_name,t2.dr,t2.propusk,t2.enabled
                    from obj_site_events_pass t1
                    left join obj_site_personals t2 on t2.pkey=t1.personal_id
                    where t1.status in (0,1,2,3,4) and t1.event_id='.$GLOBALS['LS_esmo_ag_event'].'
                    group by t1.personal_id
                     having cnt>1
     
     ') ;

     include_once(_DIR_EXT.'/events_docs/report_events_in_event_docs_put.php') ;
     if (sizeof($recs)) foreach($recs as $rec)
     {
         ?><h1><?echo $rec['obj_name']?></h1><?
             $report_obj=new report_events_in_event_docs_put() ;
             $report_obj->filter['order']='c_data desc';
             $report_obj->personal_id=$rec['personal_id'] ;
             $report_obj->init();
             $report_obj->no_view_title=1;
             //$report_obj->setting();
             $report_obj->view() ;
     } else echo 'Дубликатов в активных мероприятиях не найдено' ;
 }

 function check_mess_ag()
 {   ?><h2>Активные сообщения, по которым есть принятые сканы после отправки сообщения</h2><?
     $recs=execSQL('select t1.*,
                    (select t2.pkey from obj_site_scan t2 
                     where t2.personal_id=t1.personal_id and t2.c_data>t1.c_data and t2.status=3 and (t2.source_obj="events_docs/i_event_docs" or t2.source_obj is null) 
                     order by pkey desc limit 1) as last_scan_id

                    from view_personals_messages t1
                    where t1.status=3 and t1.source_obj="events_docs/i_event_docs"
                    having last_scan_id>0
                    order by t1.pkey
     
     ',0) ;

     if (sizeof($recs))
     {
         include_once(_DIR_EXT.'/aspmo_personal/report_personal_messages.php') ;
         $report_obj=new report_personal_messages() ;
         $report_obj->no_view_title=1 ;
         $report_obj->view_panel_info=0 ;
         $report_obj->ids=implode(',',array_keys($recs)) ;
         //$report_obj->setting_small() ;
         $report_obj->view_as_HTML(array('view_all_status'=>1)) ;
     } else echo 'По всем активным сообщениям по сдаче документа АГ нет сканов, принятых после их создания' ;
 }
 function check_pass_ag()
 {   ?><h2>Активные мероприятия, по которым есть принятые сканы после создания мероприятия</h2><?
     $recs=execSQL('select t1.*,
                    (select t2.pkey from obj_site_scan t2 
                     where t2.personal_id=t1.personal_id and t2.c_data>t1.c_data and t2.status=3 and (t2.source_obj="events_docs/i_event_docs" or t2.source_obj is null) 
                     order by pkey desc limit 1) as last_scan_id
                    from obj_site_events_pass t1  
                    where t1.status in (0,1,2,3,4) and t1.event_id='.$GLOBALS['LS_esmo_ag_event'].'
                    having last_scan_id>0
                    order by t1.pkey
     ',0) ;

     if (sizeof($recs))
     {  include_once(_DIR_EXT.'/events_docs/report_events_in_event_docs_put.php') ;
        $report_obj=new report_events_in_event_docs_put() ;
        $report_obj->filter['order']='c_data desc';
        $report_obj->ids=implode(',',array_keys($recs)) ;
        $report_obj->init();
        $report_obj->no_view_title=1;
        //$report_obj->setting();
        $report_obj->view() ;
     } else echo 'По всем активным мероприятиям по сдаче документа нет сканов, принятых после их создания' ;

 }


 function repair_sign_mo()
 {  $from=($_GET['from'])? (int)$_GET['from']:0;
    $recs=execSQL_row('select t1.pkey,t2.pkey as id_DTW 
                        from obj_site_mo_session t1
                        left join '.ESMO()->table_mo_sessions.'_DTW t2 on t2.parent=t1.pkey
                        where t1.dopusk in (1,2,3) and t1.terminal_id>0 order by t1.pkey desc limit '.$from.',1000',3) ;
    if (sizeof($recs)) foreach($recs as $id=>$id_DTW)
    { $fname_img=_DIR_TO_ROOT.'/public/mo_photo/'.$id.'_DTW.png' ;
      $fname_dtw=_DIR_TO_ROOT.'/public/mo_sign/'.$id_DTW.'.data' ;
      if (!file_exists($fname_img))
      {   echo 'Отсутствует подпись для МО '.$id ;
          if (file_exists($fname_dtw))
          {  echo ', <span class="green">найдена DTW ['.$id_DTW.'], выполняем восстановление подписи</span> ' ;
             $cont=file_get_contents(_PATH_TO_SITE.'/services/aspmo_signature/DTW/?id=309') ;
             if ($cont) { file_put_contents($fname_img,$cont) ;
                          echo ' Подпись восстановлена: <a href="/public/mo_photo/'.$id.'_DTW.png" target="_blank">/public/mo_photo/'.$id.'_DTW.png</a><br>' ;
                         }
             else echo '<span class="red"> Не удалось восстановить подпись</span><br>' ;
          }
          else
          { echo ', <span class="red">не найдена DTW, восстановление невозможно</span><br>' ;
          }
      }

    }
    if (sizeof($recs))
    {  ?><script type="text/javascript">
           document.location="<?echo _PATH_TO_SITE?>/cab/magnit/setting/actions/?cmd=repair_sign_mo" ;
        </script><?

    }


 }


 function repair_pmo()
 {  echo '<h3>Делаем проверку наличия резервной копии obj_site_events_pass_13_03_18</h3>' ;
    $cnt=execSQL_value('select count(pkey) from obj_site_events_pass_13_03_18 where event_id='.$GLOBALS['LS_esmo_PMO_event']) ;
    if (!$cnt) { echo 'Отсутствет таблица для восстановления резервной копии<br>' ; return ; }
    $cnt=execSQL_value('select count(pkey) from obj_site_events_pass_13_03_18 where event_id='.$GLOBALS['LS_esmo_PMO_event'].' and pkey not in (select pkey from obj_site_events_pass where event_id='.$GLOBALS['LS_esmo_PMO_event'].')') ;
    echo 'Требует восстановления '.$cnt.' записей<br>' ;
    if (!$cnt) return ;

    echo '<h3>1. Делаем резервную копию таблицы obj_site_events_pass</h3>' ;
    SQL_copy_table('obj_site_events_pass','res_obj_site_events_pass_'.time()) ;
    echo '<h3>2. Удаляем повторное участие в мероприятии</h3>' ;
    $cnt=execSQL_update('delete from obj_site_events_pass where pkey>=185230 and pkey<=197722 and event_id='.$GLOBALS['LS_esmo_PMO_event'],2) ;
    echo '<h3>3. Возврат удаленных записей</h3>' ;
    $cnt=execSQL_update('insert into obj_site_events_pass select * from obj_site_events_pass_13_03_18 where event_id='.$GLOBALS['LS_esmo_PMO_event'].' and pkey not in (select pkey from obj_site_events_pass where event_id='.$GLOBALS['LS_esmo_PMO_event'].')',2) ;


 }




    
}



?>