<?
function EVENT_PMO(){ if (!is_object($GLOBALS['EVENT_PMO'])) $GLOBALS['EVENT_PMO']=new i_event_pmo();return($GLOBALS['EVENT_PMO']);}
class i_event_pmo
{
   var $name='Периодический медицинский осмотр' ; // переодичность инструктажа
   var $ext='esmo_magnit_pmo/i_event_pmo' ;
   var $url_page_event_create='/cab/esmo_magnit_pmo/' ;
   var $url_page_event_card='/window/esmo_magnit_pmo/card/' ;
   var $default_settings=array('mode'=>6, // постоянное
                               'type'=>1, // ПМО - потом удалить
                               'sanction'=>array('block_mo'=>1),
                               'period_to_status_3'=>7,
                               'period_to_status_5'=>7,
                               'period_to_status_7'=>7,
                               'message1'=>'Вам необходимо получить документы по прохождению ПМО',
                               'message2'=>'Вам необходимо сдать документы по прохождению ПМО'
                               ) ;

   var $arr_status=array(0=>'',
                         1=>'Не направлено на ПМО',
                         2=>'Подлежит ПМО',
                         //22=>'Идет подготовка документов',
                         //3=>'Документы подготовлены',
                         //4=>'Уведомлен',
                         //5=>'Заблокирован по уведомлению',
                         //6=>'Документы получены',
                         7=>'Заблокирован по непрохождению ПМО',//'Заблокирован по прохождению ПМО' + //5=>'Заблокирован по уведомлению',
                         8=>'ПМО пройден, годен',
                         9=>'ПМО пройден, негоден',
                         10=>'Дообследование'
                      ) ;

   var $arr_status_color=array(0=>'',
                                 1=>'gray',
                                 2=>'gray',
                                 22=>'gray',
                                 3=>'gray',
                                 4=>'gray',
                                 5=>'gray',
                                 6=>'gray',
                                 7=>'red',//'Заблокирован по прохождению ПМО' + //5=>'Заблокирован по уведомлению',
                                 8=>'green',
                                 9=>'red bold'
                      ) ;

    var $arr_pmo_len=array(12=>'раз в год',
                           24=>'раз в два года',
                           6=>'раз в полгода',
                           -1=>'10  минут (тест)') ;

   function get_url_event_card($id)
   {
     return('/window/esmo_magnit_pmo/card/'.$id.'/') ;
   }

   function update_personal_status_1($event_id,$options=array())
   {  FILE_LOG()->append('update_personal_status_1') ;
      ob_start() ; $alerts=array() ;
      $GLOBALS['stack_sql_stats']=1 ; $GLOBALS['sql_stats']=array() ;

      $rec_event=EVENTS()->get_event_by_id($event_id) ;
      echo '<h3>Мероприятие "'.$rec_event['obj_name'].'", ID '.$rec_event['pkey'].'</h3><br>' ;

      ?><h3>Обновление списка учасников мероприятия</h3><?
      $result=EVENTS()->update_event_personals($event_id,array('remove_outer'=>1)) ;
      //damp_array($result,1,-1) ;


      // отправлемя на ПМО повторно тех, кто пошел на второй груг
      ?><h3>Отправка на второй круг сотрудников с истечением срока действия ПМО</h3><?
      $now=getdate() ;
      if($rec_event['_ext_info']['pmo_before'])
      {   $from=mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday']+$rec_event['_ext_info']['pmo_before'],$now['year']);
          echo 'Ищем сотрудников, у которых срок действия ПМО заканчивается до '.date('d.m.Y H:i:s',$from).' ('.date('d.m.Y').' + '.$rec_event['_ext_info']['pmo_before'].' дн.) <br>' ;
          $ids=execSQL_row('select personal_id,status from obj_site_events_pass where data_to<='.$from.' and status in (8,9) and event_id='.$event_id) ;
          if (_sizeof($ids))
          {  foreach($ids as $personal_id=>$status)
             { $old_status_name=$this->arr_status[$status] ;
               $new_status_name=1 ;
               echo 'Сотрудник <strong><a href="/window/personal/person/'.$personal_id.'/" class="new_window">'.$personal_id.'</a></strong>, статус <strong>'.$old_status_name.'</strong> - необходимо перевести в статус <strong>'.$new_status_name.'</strong><br>' ;
               EVENTS()->set_event_personal_data($event_id,$personal_id,array('status'=>1,
                                                                              'fname'=>'',
                                                                              'time_print'=>0,
                                                                              'mess_id'=>0,
                                                                              'result'=>0,
                                                                              'doc_id'=>0,
                                                                              'group_id'=>0,
                                                                              'close_data'=>0,
                                                                              'scan_id'=>0,
                                                                              'block_data'=>0
                   ),'Подлежит повторному прохождению по истечению срока действия') ;
			 }

              //FILE_LOG()->append('Подлежат повторному прохождению мероприятия: '._sizeof($ids).' сотрудников') ;
              //$result=EVENTS()->add_personals_to_event($event_id,$ids,array('pass_repeat'=>1)) ;
          }
          else echo '<div class="green">Сотрудников не найдено</div>' ;
      }


       // если в мероприятии автоперевод в "направлен на инструктаж" - направляем
       if ($rec_event['_ext_info']['auto_status_2']==2)
       {   ?><h3>В мероприятии установлен режим автоматического направления</h3><?
           $this->set_personal_to_status_2($event_id) ;
       }

       //$this->check_pmo_len_for_status_7_8($rec_event) ;
       $this->check_status_7($rec_event) ;
       $this->check_status_8($rec_event) ;

       if (_sizeof($alerts)) echo implode('<br>',$alerts) ;

       $text=ob_get_clean() ;
       echo $text ;

       LOGS()->reg_log('update_personal_status_1','',array('data'=>$result,'save_to_file'=>$text,'reffer'=>$rec_event['_reffer'])) ;

       FILE_LOG()->append('END');

      return($result) ;
   }

   function check_status_7($rec_event)
   {
     // проверяем сотрудников, у которых срок действия ПМО вышел - переводим их в блокировку, статус 7
      ?><h3>Проверка на сотрудников, у которых имеется актуальный срок действия ПМО, и этот срок вышел</h3><?
      $recs=execSQL('select t1.*
                     from obj_site_events_pass t1
                     where t1.event_id='.$rec_event['pkey'].' and t1.status!=7 and t1.enabled=1 and t1.data_to>0 and t1.data_to<'.time().'
                     order by t1.pkey desc
                    ') ;
      FILE_LOG()->append('Переводим в статус "Заблокирован по непрохождению ПМО" '._sizeof($recs).' сотрудников') ;

      if (_sizeof($recs)) foreach($recs as $rec_pass)
      { echo 'Сотрудник ID'.$rec_pass['personal_id'].' - будет переведен в статус 7 (заблокирован по непрохождению ПМО) с '.date('d.m.Y',$rec_pass['data_to']).'<br>' ;
        $this->set_personal_to_status_7($rec_pass,['time'=>$rec_pass['data_to']]);
      }
      else echo '<div class="green">Сотрудников не найдено</div>' ;

   }

   function check_status_8($rec_event)
   {
     // проверяем сотрудников, у которых еще актуальный срок действия ПМО, но их статус не 8
      ?><h3>Проверка на сотрудников, у которых имеется актуальный срок действия ПМО, и их статус не 8,10</h3><?
      $now=getdate() ;
      if($rec_event['_ext_info']['pmo_before'])
      {   $from=mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday']+$rec_event['_ext_info']['pmo_before'],$now['year']);
          echo 'Ищем сотрудников, у которых статус не 8,9,10 и срок действия ПМО заканчивается позднее '.date('d.m.Y H:i:s',$from).' ('.date('d.m.Y').' + '.$rec_event['_ext_info']['pmo_before'].' дн.) <br>' ;
          $arr=execSQL_row('select personal_id,status from obj_site_events_pass where enabled=1 and data_to>'.$from.' and status not in (8,9,10) and event_id='.$rec_event['pkey']) ;
          if (_sizeof($arr))
          {   FILE_LOG()->append('Восстанавливаем статус ПМО пройден: '._sizeof($arr).' сотрудников',1) ;
              foreach($arr as $personal_id=>$old_status)
              { $old_status_name=$this->arr_status[$old_status] ;
                $new_status_name=$this->arr_status[8] ;

                echo 'Сотрудник <strong><a href="/window/personal/person/'.$personal_id.'/" class="new_window">'.$personal_id.'</a></strong>, статус <strong>'.$old_status_name.'</strong> - необходимо перевести в статус <strong>'.$new_status_name.'</strong><br>' ;
                EVENTS()->set_event_personal_data($rec_event['pkey'],$personal_id,array('status'=>8),'Восстановлен статус "ПМО пройден"',array()) ;
                // если у сотрудника остались незакрытые сообщения - они будут закрыты позднее
              }
          }
          else echo '<div class="green">Сотрудников не найдено</div>' ;
      }
   }

    // меняем статус из "подлежит ПМО" на "направлен на ПМО"
    //  если стоит опция "пропуск подготовкм докуметов" необходимо перевести в статус "документы подготовлены" и отправить сообщение о необхожимости получить документы на ПМО
    function set_personal_to_status_2($event_id,$personal_ids='')
      {  //$rec_event=EVENTS()->get_event_by_id($event_id) ;

         $_usl=array() ;
         $_usl[]='event_id='.$event_id ;
         $_usl[]='status=1' ;
         if ($personal_ids)  $_usl[]='personal_id in ('.$personal_ids.')' ;
         $usl=implode(' and ',$_usl) ;
        $arr_ids=[] ;
         $recs=execSQL('select * from obj_site_events_pass where '.$usl) ;
         if (_sizeof($recs))
         { foreach($recs as $rec_pass)
             {   // если нет этапа подготовки документа - отправляем уведомление о необходимости получить документы
                 $this->show_info_text($rec_pass,'будет перемещен в статус "<strong>'.$this->arr_status[2].'</strong>"') ;
                 // иначе просто переводим сотрудника в статус "направлен на ПМО" - оператор сможет начать  подготовки документов
                 EVENTS()->set_event_personal_data($event_id,$rec_pass['personal_id'],array('status'=>2),'Начато прохождение ПМО') ;
                 $arr_ids[]=$rec_pass['personal_id'] ;
             }


           $personal_ids=implode(',',$arr_ids) ; // в значениях массива - personal_id
           //echo '<strong>Производим отправку пакетов документов к ПМО в адрес АТП</strong><br>' ;
           $setting=array('event_id'=>$event_id,
                          'str_personal_ids'=>$personal_ids,
                          ) ;

           include_once(_DIR_EXT.'/esmo_magnit_pmo/c_services_esmo_magnit_pmo_send_pmo_dock_pack.php') ;
           $service=new c_services_esmo_magnit_pmo_send_pmo_dock_pack($setting) ;
           $service->exec() ;

         }




      }

    function show_info_text($rec_pass,$text,$options=[])
    {
      $old_status_name=$this->arr_status[$rec_pass['status']] ;
      echo 'Сотрудник <strong><a href="/window/personal/person/'.$rec_pass['personal_id'].'/" class="new_window">'.$rec_pass['personal_id'].'</a></strong>, статус <strong>'.$old_status_name.'</strong> - '.$text.'<br>' ;
	}


  function set_personal_to_status_7($rec_pass,$options=array())
     {   $event_id=$rec_pass['event_id'] ;
         $personal_id=$rec_pass['personal_id'] ;

        $data=array() ;
        $data['status']=($options['status'])?:7 ;
        $options2=array('old_status'=>$options['old_status']) ;
        EVENTS()->set_event_personal_data($event_id,$personal_id,$data,'Прохождение МО заблокировано в связи непрохождением ПМО',$options2) ;
     }


   // форма после распорзнования заключения
   function on_scan_doc_OCR($rec_doc,$params=array())
   {   $recs_group_medic=_IL('IL_group_medic')->recs ;
       if (sizeof($recs_group_medic)) foreach($recs_group_medic as $id=>$rec) if (!$rec['_ext_info']['use_PMO']) unset($recs_group_medic[$id]) ;
       $arr_srok_dop_check=[1=>'1 месяц',2=>'2 месяца',3=>'3 месяца'] ;

       ?><div id="panel_set_diagnoz"><div id="panel_filter">
       <h2>Заключение </h2>
                   <form id="sky-form" class="sky-form">
                        <fieldset>
                            <? FORM()->row_open();?>
                                <section class="col col-4">
                                    <label class="label">К выполненению служебных обязанностей:</label>
                                    <label class="radio"><input type="radio" class="pmo_result" name="pmo_result" value="1" ><i></i> Годен</label>
                                    <label class="radio"><input type="radio" class="pmo_result" name="pmo_result" value="3" ><i></i> Не годен</label>
                                    <label class="radio"><input type="radio" class="pmo_result" name="pmo_result" value="4" ><i></i> Требуется дообследование</label>
                                </section>
                                <section class="col col-3">
                                    <label class="label">Дата заключения:</label>
                                    <label class="input"><input type="text" name="data_doc" class=datepicker data-required placeholder="" value=""></label>
                                </section>
                                <?
                                FORM()->filter_section_select('srok_dop_check','Срок доп.исследования:',3,$arr_srok_dop_check) ;
                                 FORM()->row_close_open();
                                 FORM()->filter_section_select('group_medic','Группа по болезни:',6,$recs_group_medic) ;
                                 FORM()->filter_section_select('group_health','Группа здоровья:',6,_IL('IL_group_health')->recs) ;
                                 FORM()->row_close();
                                ?>
                            <??>
                            <div class="clear">
                                <section>
                                    <label class="label">Ваш комментарий к документу:</label>
                                    <label class="textarea" style="width:100%;"><textarea name="comment"></textarea></label>
                                </section>
                         </div>
                        </fieldset>
                    <div id="panel_buttons">
                           <button class="button v2" cmd="esmo_magnit/ScanCaptureApply" personal_id=<?echo $params['personal_id']?> scan_id="<?echo $params['scan_id']?>">Принять заключение</button>&nbsp;&nbsp;<??>
                           <button class="button v2" cmd="esmo_magnit/ScanCaptureCancel" scan_id="<?echo $params['scan_id']?>">Отклонить заключение</button>&nbsp;&nbsp;
                           <button class="button v2" cmd="esmo_magnit/ScanPersonClear"  scan_id="<?echo $params['scan_id']?>">Сбросить сотрудника</button>&nbsp;&nbsp;
                       </div>
                    </form>
            </div>
       </div>
       <script type="text/javascript">
           $j('select#select_srok_dop_check').closest('section').hide() ;

           $j('body').on('change','input.pmo_result',function()
           { if(this.value==4)  $j('select#select_srok_dop_check').closest('section').show() ;
             else               $j('select#select_srok_dop_check').closest('section').hide() ;
           })
       </script>
     <?
   }

   // дейсвия после принятия заключения
  // $params = $_POST
   function on_scan_doc_apply($rec_doc,$params=array())
   { // пока не проверяем   $rec_doc['source_tkey']
     ob_start() ;
     //if ($rec_doc['source_obj']=='esmo_magnit_pmo/i_event_pmo' and !$rec_doc['event_id'])
     //{

	 //}

     //print_2x_arr([$rec_doc]);
     //damp_array($params);
     $rec_event_personal=array() ;
     if (!$params['pmo_result']) return(array('modal_window'=>'Прием заключения','text'=>'<div class="alert">Укажите результат заключения</div><br><p class="center"><button class="cancel">Закрыть</button></p>')) ;
     if (!$params['data_doc']) return(array('modal_window'=>'Прием заключения','text'=>'<div class="alert">Укажите дату заключения</div><br><p class="center"><button class="cancel">Закрыть</button></p>')) ;
     if ($params['pmo_result']==4 and !$params['srok_dop_check']) return(array('modal_window'=>'Прием заключения','text'=>'<div class="alert">Укажите срок доп.ислледований</div><br><p class="center"><button class="cancel">Закрыть</button></p>')) ;
     if ($rec_doc['source_pkey'])$rec_event_personal=execSQL_van('select * from view_event_personals where event_pass_id='.$rec_doc['source_pkey']) ;
     // если участие в мероприятии, на основании которого был создан документ уже удалено и возможно, созданого новое, ищем сотрудника по event_id и personal_id
     if (!$rec_event_personal['pkey'])
     { // использован документ без привязки к мероприятию, но указано что это документ - заключение ПМО, поэтому
       // и попали сюда
       // есть только personal_id
       $rec_event_personal=execSQL_van('select * from view_event_personals where personal_id='.$params['personal_id'].' and event_id='.$GLOBALS['LS_esmo_PMO_event']) ;

     }
     //  damp_array($rec_doc) ;
         // обновляем данные в скане
     $diagnoz='' ; $status=0 ;
     switch($params['pmo_result'])
     { case 1: $diagnoz='Годен' ; $status=8 ; break ;
       case 3: $diagnoz='Не годен' ; $status=9 ; break ;
       case 4: $diagnoz='Требуется дообследование' ; $status=10 ; break ;
	 }
	 if ($params['pmo_result']==4)
	 { if ($params['comment']) $params['comment'].='<br>' ;
       $params['comment'].='Срок доп.исследования: '.$params['srok_dop_check'].' - мес.<br>' ;
     }

     $data_doc=($params['data_doc'])? strtotime($params['data_doc']):0 ;
     $data=array('account_work'=>MEMBER()->id,'data_set'=>time(),'status'=>3,'diagnoz'=>$diagnoz,'comment'=>$params['comment'],'data_doc'=>$data_doc) ;
     if ($rec_event_personal['event_id'])
     { $data['event_id']=$rec_event_personal['event_id'] ;
       $data['event_pass_id']=$rec_event_personal['event_pass_id'] ;
     }
     if ($params['scan_id']) DOCS()->scan_update($params['scan_id'],$data) ;


     // сохраняем группу сотруднику, если назначена
     $rec_personal=PERSONAL()->get_personal_by_id($_POST['personal_id']) ;
     if ($_POST['group_medic'])
     {
       create_link($rec_personal['_reffer'],_IL('IL_group_medic')->recs[$_POST['group_medic']]['_reffer']) ;
	 }
     else
     { // удяляем все мед группы
       //ob_start() ;
       $arr_pkeys=[] ;
       //print_2x_arr(_IL('IL_group_medic')->recs);
       if (sizeof(_IL('IL_group_medic')->recs)) foreach(_IL('IL_group_medic')->recs as $rec_group) if ($rec_group['_ext_info']['use_PMO'])  $arr_pkeys[]=$rec_group['pkey'] ;
       //damp_array($arr_pkeys,1,-1);
       //execSQL('select * from obj_site_link where o_id='.$rec_personal['pkey'],2) ;
       if (sizeof($arr_pkeys)) execSQL_update('delete from obj_site_link where o_id='.$rec_personal['pkey'].' and o_tkey=107 and o_clss=211 and p_id in ('.implode(',',$arr_pkeys).') and p_clss=254',['debug'=>1]) ;
       //execSQL('select * from obj_site_link where o_id='.$rec_personal['pkey'],2) ;
       //$text=ob_get_clean() ;
       //LOGS()->reg_log('person_med_group_delete',$text) ;

     }



     // сохраняем группу здоровья сотруднику, если назначена
     if ($_POST['group_health'])
     {   damp_array($_POST);
         damp_array(_IL('IL_group_health')->recs);
         create_link($rec_personal['_reffer'],_IL('IL_group_health')->recs[$_POST['group_health']]['_reffer']) ;

	 }
         // обновляем данные в участнике мероприятия
     // изменяем статус на 8  - ПМО пройден, годен или на 9 - ПМО пройден, не годен
     if ($rec_event_personal['event_id'])
     {   $rec_event=EVENTS()->get_event_by_id($rec_event_personal['event_id']) ;
         $from=($data_doc)?:time() ;
         $now=getdate($from) ;
         // $pmo_len_info[vpf_len_id] - число месяцев срока действия ПМО
         $pmo_len_info=$this->get_pmo_len_info_to_person($rec_event,$_POST['personal_id']) ;
         // если требуется дописледование - срок задается в настройках
         if ($params['pmo_result']==4) $pmo_len_info['id']=$params['srok_dop_check'] ;


         if ($pmo_len_info['id']>0) $to=mktime(23,59,59,$now['mon']+$pmo_len_info['id'],$now['mday'],$now['year']);
         else $to=mktime($now['hours'],$now['minutes']+10,$now['seconds'],$now['mon'],$now['mday'],$now['year']); // раз в 10 минут
         if ($params['scan_id']) $doc_id=execSQL_value('select doc_id from obj_site_scan where pkey='.$params['scan_id']) ; else $doc_id=0 ;
         if ($doc_id<=0) $doc_id=0 ;
         $data_event_pass=array() ;
         $data_event_pass['status']=$status ;
         $data_event_pass['data_from']=$from ;
         $data_event_pass['data_to']=$to ;
         $data_event_pass['scan_id']=($params['scan_id'])? $params['scan_id']:0 ;
         $data_event_pass['doc_id']=$doc_id ;
         EVENTS()->set_event_personal_data($rec_event_personal['event_id'],$_POST['personal_id'],$data_event_pass,'Прием скана заключения') ;
		}

     $text=ob_get_clean() ;
     LOGS()->reg_log('on_scan_doc_apply',$text) ;



     $result=array('current_window'=>'close','opener_window'=>'reload') ;
     return($result) ;
   }

	function prepare_vpf_data_for_inrm($temp_table)
    { $arr=[] ;
      //if (_sizeof($arr_inrm)) foreach($arr_inrm as $inrm) $arr[]='"'.$inrm.'"' ;
      //$usl_inrm=' t1.inrm in ('.implode(', ',$arr).')' ;
      $arr_vpf_numbers=execSQL(
           'select distinct(t2.number),t2.parent2,t3.number as rasdel_number,t2.period,t1.inrm
            from list_rm_fvp t1
            left join list_vpf t2 on t2.pkey=t1.vpf_id
            left join list_vpf t3 on t3.pkey=t2.parent2
            left join '.$temp_table.' t4 on t4.inrm=t1.inrm
            where not t4.pkey is null
            order by t2.indx
           ');

        $vfp_numbers=[] ;
        $vfp_numbers_by_section=[] ;

        $result=[] ;
		if(_sizeof($arr_vpf_numbers)) foreach($arr_vpf_numbers as $rec)
        { $vfp_numbers[$rec['inrm']][]=$rec['number'] ;
		  $vfp_numbers_by_section[$rec['inrm']][$rec['rasdel_number']][]=$rec['number'];
          if ($rec['period']>0 and  ($result[$rec['inrm']]['min_period']>$rec['period'] or !$result[$rec['inrm']]['min_period'])) $result[$rec['inrm']]['min_period']=$rec['period'] ;
		}
		//damp_array($vfp_numbers,1,-1);

		if (sizeof($vfp_numbers)) foreach($vfp_numbers as $inrm=>$arr) $result[$inrm]['vfp_numbers']=(_sizeof($arr))? implode(', ',$arr):'';
		if(_sizeof($vfp_numbers_by_section)) foreach($vfp_numbers_by_section as $inrm=>$arr) foreach($arr as $section_name=>$arr_vpf) $result[$inrm]['vfp_numbers_by_section'][$section_name]=implode(', ',$arr_vpf);
        //damp_array($vfp_numbers_by_section,1,-1);
        return($result) ;
    }

	function get_pmo_len_info_to_person($rec_event,$personal_id,$options=[])
   {  // по умолчнанию срок действия ПМО задается в мероприятии
      $result['id']=$rec_event['_ext_info']['pmo_len'];
      $result['comment']='по ПМО';
      // далее смотрим если данные по ИНРМ, у сотрудника может быть две должности, надо смотреть обе
		$inrm=($options['inrm'])? $options['inrm']:execSQL_value('select inrm from obj_site_workers where enabled=1 and personal_id='.$personal_id.' order by is_main desc');
        $result['inrm']=$inrm;
		if (isset($options['inrm_data']))
		{ $result['vfp_numbers']=$options['inrm_data']['vfp_numbers'] ;
          $result['vfp_numbers_by_section']=$options['inrm_data']['vfp_numbers_by_section'] ;
		}
		else
		{
      $arr_vpf_numbers=execSQL(
              'select distinct(t2.number),t2.parent2,t3.number as rasdel_number
               from list_rm_fvp t1
               left join list_vpf t2 on t2.pkey=t1.vpf_id
               left join list_vpf t3 on t3.pkey=t2.parent2
               where t1.inrm="'.$inrm.'"
               order by t2.indx
              ') ;

      $result['inrm']=$inrm;
      if (_sizeof($arr_vpf_numbers)) foreach($arr_vpf_numbers as $rec) if ($rec['number'])
      { $vfp_numbers[]=$rec['number'] ;
        $vfp_numbers_by_section[$rec['rasdel_number']][]=$rec['number'] ;
      }

      // коррекция с 302 на 29 приказ
     /* $arr_str=OT()->get_arr_302_29() ;
      //damp_array($vfp_numbers);
      //damp_array($arr_str);
      $vfp_numbers_29=[] ;
      if (sizeof($vfp_numbers)) foreach($vfp_numbers as $num)
      {   $num=OT()->remove_last_point($num) ;
          if ($arr_str[$num] and $arr_str[$num]!='-') $vfp_numbers_29[]=$arr_str[$num] ;
      }
      $result['vfp_numbers_302']=(_sizeof($vfp_numbers))? implode(', ',$vfp_numbers):'';
      $result['vfp_numbers_29']=(_sizeof($vfp_numbers_29))? implode(', ',$vfp_numbers_29):'';
      $vfp_numbers=$vfp_numbers_29 ;*/



            //damp_array($vfp_numbers,1,-1);
      $result['vfp_numbers']=(_sizeof($vfp_numbers))? implode(', ',$vfp_numbers):'';
      if (_sizeof($vfp_numbers_by_section)) foreach($vfp_numbers_by_section as $section_name=>$arr_vpf) $result['vfp_numbers_by_section'][$section_name]=implode(', ',$arr_vpf) ;
            //damp_array($vfp_numbers_by_section,1,-1);
        }
      if ($rec_event['_ext_info']['pmo_len_union']['use_vpf'])
        {
          $vpf_len_id=(isset($options['inrm_data']))? $options['inrm_data']['min_period']:OT()->get_id_period_PMO_by_vpf($inrm);
          $result['vpf_len_id']=($vpf_len_id)? $vpf_len_id:0;
         if ($vpf_len_id)
		  {		$result['id']=$vpf_len_id;
               $result['comment']='по ВПФ' ;
               $result['vpf_len_srok']=$this->arr_pmo_len[$result['vpf_len_id']];
           }
       }
      // далее смотрим настройку групп по болезни для сотрудника
      if (_sizeof($rec_event['_ext_info']['pmo_len_union']['use_gb']))
        {   // если группы сотрудника не переданы - получаем их
            if (isset($options['personal_medic_groups'])) $groups_medic=$options['personal_medic_groups'] ;
            else
            { // фукнция get_medic_groups_to_personal_ids работает с массивом сотрудников
              $personals_medic_groups=$this->get_medic_groups_to_personal_ids([$personal_id]) ;
              $groups_medic=$personals_medic_groups[$personal_id] ;
            }

          if (_sizeof($groups_medic)) foreach($groups_medic as $group_id=>$group_name)
          {   // надо выбрать группу с наименьшим сроком ПМО
              if (isset($rec_event['_ext_info']['pmo_len_union']['use_gb'][$group_id]))
                  { $result['id']=$rec_event['_ext_info']['pmo_len_union']['use_gb'][$group_id] ;
                    $result['comment']='по МГ' ;
                    //damp_array($result);
                  }
          }
          //damp_array($rec_event['_ext_info']['pmo_len_union']['use_gb']);
          //damp_array($groups_medic);
      }
      $result['srok']=$this->arr_pmo_len[ $result['id']] ;




      return($result) ;

   }


    function get_status_by_ids($ids,$options=array())
    { if (is_int($ids)) $ids=array($ids) ;
      if ($options['ids_in_keys']) $ids=array_keys($ids) ;
      $arr=array() ;
      if (_sizeof($ids)) foreach($ids as $id) $arr[]=$this->arr_status[$id] ;
      return(implode(',',$arr)) ;

    }

    // $options[arr_inrm] - список ИНРМ, которые надо проверить
  function check_pmo_len_for_status_7_8($rec_event,$options=[])
    {   ob_start();
        // получаем ID сотрудников у которых статус ПМО пройден
		$_usl=[]; $usl_inrm='' ;
		$_usl[]='pass.event_id='.$rec_event['pkey'];
		//$_usl[]='pass.status in (8,9)';
		$_usl[]='pass.enabled=1';
		$_usl[]='not so.pkey is null';
		if($options['personal_id']) $_usl[]='pass.personal_id='.$options['personal_id'];
        if (sizeof($options['arr_inrm']))
        {   $arr=[] ;
            if (_sizeof($options['arr_inrm'])) foreach($options['arr_inrm'] as $inrm) $arr[]='"'.$inrm.'"' ;
            $usl_inrm=' and so.inrm in ('.implode(', ',$arr).')' ;
		}
        $usl=implode(' and ',$_usl) ;

        $sql='select pass.pkey,pass.personal_id,pass.status,pass.data_from,pass.data_to,so.inrm
                                    from obj_site_events_pass pass
                                    left join obj_site_workers so on so.personal_id=pass.personal_id
                where '.$usl.$usl_inrm;
        $temp_table_name='personals_pass_'.ENGINE()->generate_UID() ;
        SETUP()->create_temporary_table($temp_table_name,$sql);
		$recs_pass=execSQL('select * from '.$temp_table_name);
        echo 'Проверка срока действия ПМО для '._sizeof($recs_pass).' сотрудников<br>' ;
		if (!sizeof($options['arr_inrm']) and sizeof($recs_pass)) foreach($recs_pass as $rec) $options['arr_inrm'][]=$rec['inrm'] ;

        if ($options['arr_inrm']) $inrm_data=$this->prepare_vpf_data_for_inrm($temp_table_name) ;

        // получаем медгруппы для всех сотрудников разом
        $arr_personals_ids=[] ;
        if (sizeof($recs_pass)) foreach($recs_pass as $rec) $arr_personals_ids[]=$rec['personal_id'] ;
        $personals_medic_groups=$this->get_medic_groups_to_personal_ids_by_temptable($temp_table_name) ;

        if ($options['debug'])
        { //damp_array($inrm_data,1,-1);
          //damp_array($personals_medic_groups,1,-1);
        }

        $debugs=[] ; $i=0 ;

        // получаем медгруппу и ИНРМ этих сотрудников
        if (_sizeof($recs_pass)) foreach($recs_pass as $rec_pass)
		{   $debug_rec=[] ;
		    $debug_rec['Сотрудник']='Сотрудник <strong><a class=new_window href="/window/personal/person/card/'.$rec_pass['personal_id'].'/" target="_blank">'.$rec_pass['personal_id'].'</a></strong><br>' ;
			$debug_rec['Участие в мероприятии']='<strong><a class=new_window href="/window/events/event_pass/'.$rec_pass['pkey'].'/" target="_blank">'.$rec_pass['pkey'].'</a></strong><br>' ;
			$debug_rec['Текущий статус']='<span class="'.EVENT_PMO()->arr_status_color[$rec_pass['status']].'">'.EVENT_PMO()->arr_status[$rec_pass['status']].' ['.$rec_pass['status'].']</span>' ;
			$debug_rec['Текущий срок ПМО, от']=($rec_pass['data_from'])? date('d.m.Y',$rec_pass['data_from']):'-' ;
			$debug_rec['Текущий срок ПМО, до']=($rec_pass['data_to']>63147599)? date('d.m.Y',$rec_pass['data_to']):'-' ;
			$pmo_ot_info=$this->get_pmo_len_info_to_person(
			        $rec_event,
                    $rec_pass['personal_id'],
                    ['inrm'=>$rec_pass['inrm'],
                     'inrm_data'=>(isset($inrm_data[$rec_pass['inrm']]))? $inrm_data[$rec_pass['inrm']]:[],
                     'personal_medic_groups'=>(isset($personals_medic_groups[$rec_pass['personal_id']]))? $personals_medic_groups[$rec_pass['personal_id']]:[],
                     'debug'=>$options['debug']
                    ]
            );

			//if (sizeof($pmo_ot_info)) foreach($pmo_ot_info as $id=>$value) $debug_rec['pmo_ot_info['.$id.']']=$value ;
           $debug_rec['требуемый срок ПМО']=$pmo_ot_info['srok'] ;
           $debug_rec['основание срока']=$pmo_ot_info['comment'] ;

          $pmo_len=$pmo_ot_info['id'] ; $new_status=0 ;
          if ($rec_pass['data_from']>0)
          { $now=getdate($rec_pass['data_from']) ;
          $to=mktime(23,59,59,$now['mon']+$pmo_len,$now['mday'],$now['year']);
            if ($rec_pass['status']==8 or $rec_pass['status']==9) $last_status=$rec_pass['status'] ;
            else
            { $last_status=execSQL_value('select status_new from obj_site_events_pass_status where event_id='.$rec_event['pkey'].' and  personal_id='.$rec_pass['personal_id'].' and status_new in (8,9) order by pkey desc limit 1') ;
              $debug_rec['Текущий статус'].='<br>'.EVENT_PMO()->arr_status[$last_status].' ['.$last_status.']' ;
            }

          if ($to>$rec_pass['data_to'])
              {   // ищем, какой последний статус был у сотрудника, если сейчас не 8 или 9
                  $new_status=($to>time())? $last_status:$rec_pass['status'] ;
              $debug_rec['action']='Продлен до '.date('d.m.Y',$to).'<br>' ;
                  if (!$options['read_only'])
                      { //update_rec_in_table('obj_site_events_pass',['data_to'=>$to,'period'=>$pmo_len],'pkey='.$rec_pass['pkey']) ;
                        EVENTS()->set_event_personal_data($rec_event['pkey'],$rec_pass['personal_id'],['status'=>$new_status,'data_to'=>$to,'period'=>$pmo_len],'Изменение срока действия ПМО в связи с коррекцией исходных данных',['ignore_not_change_status'=>1]) ;
                      }
                  $i++ ;
  		}
          if ($to<$rec_pass['data_to'])
          {
              $debug_rec['action']='Уменьшен до '.date('d.m.Y',$to).'<br>' ;
                  $new_status=($to>time())? $last_status:$rec_pass['status'] ;
                  if (!$options['read_only'])
                  { //update_rec_in_table('obj_site_events_pass',['data_to'=>$to,'period'=>$pmo_len],'pkey='.$rec_pass['pkey']) ;
                    EVENTS()->set_event_personal_data($rec_event['pkey'],$rec_pass['personal_id'],['status'=>$new_status,'data_to'=>$to,'period'=>$pmo_len],'Изменение срока действия ПМО в связи с коррекцией исходных данных',['ignore_not_change_status'=>1]) ;
                  }

            // отправлемя на ПМО повторно тех, кто пошел на второй груг
              ob_start() ;
              $from=mktime($now['hours'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday']+$rec_event['_ext_info']['pmo_before'],$now['year']);
                  if ($to<$from)
                      { $debug_rec['action'].='<br>Отправлен на второй груг' ;
                        if (!$options['read_only']) EVENTS()->add_personals_to_event($rec_event['pkey'],$rec_pass['personal_id'],array('pass_repeat'=>1)) ;
                      }
              $debug_rec['pass_repeat']=ob_get_clean() ;
                  $i++ ;
  		}
              if ($new_status>0 and $new_status!=$rec_pass['status']) $debug_rec['new_status']='<span class="'.EVENT_PMO()->arr_status_color[$new_status].'">'.EVENT_PMO()->arr_status[$new_status].' ['.$new_status.']</span>' ;
          }
          //$debug_rec['i']=$i ;
          $debugs[]=$debug_rec ;
          //damp_array($pmo_ot_info);

          if ($options['limit']>0 and $options['limit']<$i) break ;
  	   }
        $text=ob_get_clean() ;
        if ($options['debug'])
        {   if ($options['read_only']) echo '<div class=red>РЕЖИМ: ТОЛЬКО ПРОВЕРКА, БЕЗ ВНЕСЕНИЯ ИЗМЕНЕНИЙ В БД</div>' ;
            print_2x_arr($debugs);
  	  }
        echo '<br><br><br>======================================================================================================================================================<br><br><br>'.$text ;


    }

  function get_medic_groups_to_personal_ids($arr_personals_ids=[])
  { $sql=[] ; $personals_medic_groups=[] ;
    if (_sizeof(_IL('IL_group_medic')->recs)) foreach(_IL('IL_group_medic')->recs as $rec_group) $sql[]='select pkey,'.$rec_group['id'].' as personal_group_id,"'.$rec_group['obj_name'].'" as personal_group_name from view_personals_medic_group_'.$rec_group['id'].' where pkey in ('.implode(',',$arr_personals_ids).')' ;
    if (_sizeof($sql)) $recs=execSQL(implode(' UNION ',$sql),0,1) ;
    if (sizeof($recs)) foreach($recs as $rec) $personals_medic_groups[$rec['pkey']][$rec['personal_group_id']]=$rec['personal_group_name'] ;
    return($personals_medic_groups) ;

  }

  // быстрая функция получения медгрупп сотрудника на основании временной таблицы с ID сотрудников и прямого обращения к медгурппам сотрудника минуя вьюверы
  function get_medic_groups_to_personal_ids_by_temptable($temp_table)
  { $personals_medic_groups=[] ;
    // схема хранения информациии по медгруппам сотрудников
    // таблица obj_site_link
    // p_id=879 - pkey мед группы сотрудника
    // p_clss=254 - clss медгруппы сотрудника
    // вьювер группы
    // select * from view_personals where clss=211 and pkey in (select o_id from obj_site_link where p_id=879 and p_clss=254)
    // pkey сотрудника храниться в поле o_id
    $arr_groups_pkeys=[] ; $group_clss=0 ;
    if (_sizeof(_IL('IL_group_medic')->recs)) foreach(_IL('IL_group_medic')->recs as $rec_group)
    { $arr_groups_pkeys[$rec_group['pkey']]=['id'=>$rec_group['id'],'name'=>$rec_group['obj_name']] ;
      $group_clss=$rec_group['clss'] ;
	}

    $sql='select t1.o_id,t1.p_id
          from obj_site_link t1
          left join '.$temp_table.' t2 on t2.personal_id=t1.o_id
          where t1.p_clss='.$group_clss.' and t1.p_id in ('.implode(',',array_keys($arr_groups_pkeys)).') and not t2.pkey is null' ;


    $recs=execSQL($sql,0,1) ;
    if (sizeof($recs)) foreach($recs as $rec)
    {   $med_group_info=$arr_groups_pkeys[$rec['p_id']] ; //print_r($med_group_info) ;
        if (sizeof($med_group_info))
        $personals_medic_groups[$rec['o_id']][$med_group_info['id']]=$med_group_info['name'] ;
    }
    //damp_array($personals_medic_groups,1,-1);
    return($personals_medic_groups) ;

  }

   // вызывается из EVENTS()->on_event_get_active_mess_to_personal по обраюботчику события get_active_mess_to_personal
  function prepare_message_to_personal($rec_pass)
     {  /*?><h2>i_event_pmo->prepare_message_to_personal</h2><?*/
         //damp_array($pass);
         $mess=[] ;
       $def_mess=[      'pkey'=>0,
                        'tkey'=>0,
                        'clss'=>217,
                        'enabled'=>1,
                        'obj_name'=>'',
                        'parent'=>1,
                        'c_data'=>time(),
                        'r_data'=>time(),
                        'account_id'=>0,
                        'pass_id'=>$rec_pass['pkey'],
                        'personal_id'=>$rec_pass['personal_id'],
                        'status'=>1,
                        'view_mode'=>1,
                        'block_mo'=>1,
                        'close_data'=>0,
                        'source_pkey'=>$rec_pass['pkey'],
                        'source_tkey'=>$rec_pass['tkey'],
                        'source_obj'=>'esmo_magnit_pmo/i_event_pmo',
                        'block_from'=>0,
                        'block_to'=>0,
                        'auto_close'=>0,
                        'view_from'=>0,
                        'view_to'=>0,
                        'max_day'=>0,
                        '_personal_name'=>'',
                        '_personal_dr'=>'',
                        '_otdel_id'=>'',
                        '_otdel_name'=>'',
                        '_org_id'=>'',
                        '_org_name'=>'',
                        '_image_name'=>'',
                        'personal_parent1'=>'',
                        'personal_parent2'=>'',
                        'personal_parent3'=>'',
                        'personal_parent4'=>'',
                        'personal_parent5'=>'',
                        'dr'=>'',
                        'propusk'=>'',
                        'account_name'=>'',
                        '__href_window'=>'',
                        'mess_event_id'=>$rec_pass['event_id'],
                        'mess_event_name'=>''
                ] ;
         ///$rec_pass_status=execSQL('select * from obj_site_events_pass_status where event_id='.$rec_pass['event_id'].' and personal_id='.$rec_pass['personal_id'].' and status_new='.$rec_pass['status'],2) ;

         $recs_pass_status=execSQL_van('select t1.personal_id,t1.c_data,t1.status_new from obj_site_events_pass_status t1
                                        right join
                                        (select t1.personal_id,max(pkey) as last_id
                                        from obj_site_events_pass_status t1
                                        where t1.event_id='.$rec_pass['event_id'].' and t1.enabled=1 and t1.personal_id='.$rec_pass['personal_id'].' and t1.status_new in (1,2,7,8,9)
                                        group by t1.personal_id) t2 on t1.pkey=t2.last_id
                                      ',0,1) ;

      // $recs_pass_status=[] ;
         if (!$recs_pass_status['c_data'])
             $recs_pass_status=execSQL_van('select t1.personal_id,t1.c_data,t1.status
                                            from obj_site_events_pass t1
                                            where t1.event_id='.$rec_pass['event_id'].' and t1.enabled=1 and t1.personal_id='.$rec_pass['personal_id'].'
                                            ',0,1) ;

         // смотрим текущий статус мепроприятия, и по нему определяем сроки для сотрудника
         // если в мероприятии указаны значения time_from и time_to - значит сотрудник уже на втором круге
         switch($rec_pass['status'])
         {   // Не направлено на ПМО
             case 1: $mess=[] ;
                     break ;
             // направлен на ПМО
             case 2:
             case 22:
             case 3:
             case 4:
             case 5:
             case 6: $rec_event=EVENTS()->get_event_by_id($rec_pass['event_id']) ;
                     $now=getdate($recs_pass_status['c_data']) ; // now - дата последнего изменения статуса сотрудник
                     // внимание, тут засада
                     // дата отпределяется неверно если есть срок действия ПМО

                     $block_from=mktime(23,59,59,$now['mon'],$now['mday']+$rec_event['_ext_info']['pmo_before'],$now['year']);
                     // если срок действия старого ПМО заканчивается раньше чем $block_from - уменьшаем $block_from до этой даты +1 cек
                     // 12.01.22 - если есть срок действия старого ПМО - то всегда блокировка только после окончания срока действия ПМО
                     if ($rec_pass['data_to']>0/* and $block_from>$rec_pass['data_to']*/) $block_from=$rec_pass['data_to']+1 ;

                     // если значение data_to пустое - вписываем в поле data_to значение $block_from-1 - нужно для перевода в статус "просрочено ПМО"
                     if (!$rec_pass['data_to']) execSQL_update('update obj_site_events_pass set data_to='.($block_from-1).' where pkey='.$rec_pass['pkey']) ;


                     $mess=['obj_name'=>$rec_event['_ext_info']['message1'].' в срок до '.date('d.m.Y',$block_from),
                            'c_data'=>$recs_pass_status['c_data'],
                            'r_data'=>$recs_pass_status['c_data'],
                            'block_from'=>$block_from,
                            'view_from'=>$recs_pass_status['c_data'],
                            'status'=>1
                            ] ;
                     break ;
             // Прохождение ПМО заблокировано
             case 7: $mess=['obj_name'=>'Прохождение МО заблокировано в связи с непрохождением ПМО',
                            'c_data'=>$recs_pass_status['c_data'],
                            'r_data'=>$recs_pass_status['c_data'],
                            'block_from'=>$recs_pass_status['c_data'],
                            'view_from'=>$recs_pass_status['c_data'],
                            'status'=>3
                           ] ;
                           break ;
             case 8: $mess=[] ;
                     break ;
             case 9: $mess=['obj_name'=>'Прохождение МО заблокировано в связи с отрицательным результатом ПМО',
                            'c_data'=>$recs_pass_status['c_data'],
                            'r_data'=>$recs_pass_status['c_data'],
                            'block_from'=>$recs_pass_status['c_data'],
                            'view_from'=>$recs_pass_status['c_data'],
                            'status'=>3
                           ] ;
                     break ;
           case 10: $mess=['obj_name'=>'Вам необходимо пройти дообследование ПМО в срок до '.date('d.m.Y',$rec_pass['data_to']),
                          'c_data'=>$rec_pass['data_from'],
                          'r_data'=>$rec_pass['data_from'],
                          'block_from'=>$rec_pass['data_to'],
                          'view_from'=>$rec_pass['data_from'],
                          'status'=>1
                          ] ;
                   break ;

		 }

         // дописываем в сообщение стандартные поля
		 if (sizeof($mess)) foreach($mess as $fname=>$value) $def_mess[$fname]=$value ;
		 else $def_mess=[] ;
		 return($def_mess);
 	}



}

?>
