<?
class i_instruktios_utils
{
    // Проверка статусов участников мероприятия
    // Будет выполнена проверка соответствия статуса участия в мероприятии на основании данных по участию в занятиях.
    // Будет выполнена проверка сообщений по мероприятию в соответствии с текущим статусом сотрудника
   public static function check_events_personal_status($rec_event,$read_only=0)
  {  ob_start() ;
     echo ($read_only)? 'РЕЖИМ ТОЛЬКО ЧТЕНИЕ':'РЕЖИМ ИСПРАВЛЕНИЯ' ;
     echo '<br>' ;
     $event_id=$rec_event['pkey'] ;
     $obj_event=EVENTS()->get_event_obj_by_id($rec_event['pkey']) ;

     $result_pass=[] ;

     $recs_themes=EVENTS()->get_themes_of_events($rec_event['pkey']) ; $recs_lession=array() ;
     $cnt_event_themes=_sizeof($recs_themes) ;
     $recs_lession_themes=execSQL('select parent as lession_id,theme_id from obj_site_lession_themes where event_id='.$rec_event['pkey'],0,1);
     $recs_themes_by_lession=array() ;
     if (_sizeof($recs_lession_themes)) foreach($recs_lession_themes as $rec) $recs_themes_by_lession[$rec['lession_id']][$rec['theme_id']]=1 ;

     // проверка сотрудников по фактическому участию в занятиях
     $sql='select t1.parent as lession_id,t1.personal_id,t1.c_data,t1.account_id,t1.status,t1.sign_fname,
          t2.status as lession_status,
          t3.obj_name as lektor_name,
          t4.pkey as pass_id,t4.tkey as pass_tkey,t4.status as pass_status
          from obj_site_lession_persons t1
          left join obj_site_lession t2 on t2.pkey=t1.parent
          left join obj_site_account t3 on t3.pkey=t1.account_id
          left join obj_site_events_pass t4 on t4.personal_id=t1.personal_id and t4.event_id='.$rec_event['pkey'].'
          where t1.event_id='.$rec_event['pkey'].' and t1.sign_fname!="" and t4.status>0

' ;

    $rec_personals_org_names=execSQL_row('select t1.pkey,t1._org_name 
                                          from view_personals_active_all t1
                                          left join obj_site_events_pass t4 on t4.personal_id=t1.pkey and t4.event_id='.$rec_event['pkey'].' and t4.enabled=1
                                          where not t4.pkey is null') ;

     $recs=execSQL($sql,0,1) ;
      ?>Найдено участий сотрудников в проведенных занятиях - <strong><?echo _sizeof($recs)?></strong><br><?
     // print_2x_arr($recs);
      $recs_by_pers=group_by_field('personal_id',$recs,'lession_id') ;
      //print_2x_arr($recs_by_pers);
      ?>Найдено уникальных сотрудников в проведенных занятиях - <strong><?echo _sizeof($recs_by_pers)?></strong><br><?

      $report=array() ;
      ?><strong>Выполняем проверку корректности статусов на основе данных по участию в занятиях</strong><br><?
      foreach($recs_by_pers as $personal_id=>$recs_personal)
      {   $arr_personal_themes=[] ; $pass_status=0 ; $pass_id=0 ;
          foreach($recs_personal as $lession_id=>$rec_lession) if ($rec_lession['sign_fname'])
          { if (isset($recs_themes_by_lession[$lession_id])) foreach($recs_themes_by_lession[$lession_id] as $theme_id=>$pass) if ($pass) $arr_personal_themes[$theme_id]=1 ;
            $pass_status=$rec_lession['pass_status'] ;
        $pass_id=$rec_lession['pass_id'] ;
          }

      $report[$personal_id]['pass link']=($pass_id)? '<a class=new_window title=window_pass href="/window/events/status/'.$pass_id.'/" target="_blank">pass</a>':'-' ;
      $report[$personal_id]['person link']=($pass_id)? '<a class=new_window title=window_person href="/window/personal/person/'.$personal_id.'/" target="_blank">persons</a>':'-' ;
          $report[$personal_id]['Число заняний']=_sizeof($recs_personal) ;
          $report[$personal_id]['Число прослушанных тем']=_sizeof($arr_personal_themes) ;
          $report[$personal_id]['Всего тем']=$cnt_event_themes ;
          $report[$personal_id]['Текущий статус']=$pass_status ;

          //damp_array($arr_personal_themes,1,-1);
          if (_sizeof($arr_personal_themes)>=$cnt_event_themes)
          {  $last_pass_status=execSQL_van('select status_new,person_org from obj_site_events_pass_status where event_id='.$event_id.' and personal_id='.$personal_id.' and status_new=7 order by pkey desc') ;
             list($org_name_main,$org_name_second)=explode('/',$last_pass_status['person_org']) ;
             $org_name_main=trim($org_name_main) ;
        if ($rec_personals_org_names[$personal_id])
             {
        // пока рассматриваем восстановление только по основной должности
             //$rec_personals_workers=execSQL('select * from view_personals where pkey='.$personal_id) ; ;


              // проверка что сотрудник прослушал все темы но не имеет 7-го статуса
              if ( $pass_status<7)
              { // смотрим был ли получен допуск ранее и от какой организации
                if ($rec_personals_org_names[$personal_id]==$org_name_main or !$org_name_main)
        //if ($rec_personals_org_names[$personal_id]==$org_name_main or $rec_personals_org_names[$personal_id]==$org_name_second or !$org_name_main)
                  { if (!$read_only)
                      { //EVENTS()->set_event_personal_data($event_id,$personal_id,array('status'=>7),'Утилита check_event_end, исправлен статус так как прослушаны все темы') ;
                        PERSONAL()->messages_personal_close($personal_id,$rec_event['ext'],['event_id'=>$rec_event['pkey']]) ;
                        EVENTS()->set_event_personal_data($event_id,$personal_id,array('status'=>7),'Восстановление статуса в мероприятии',array('old_status'=>$last_pass_status['status_new'],'ignore_not_change_status'=>1)) ;
                      }
                      $result_pass['set_status_7']++ ;
                      $report[$personal_id]['Новый статус']=7 ;
                      $report[$personal_id]['comment'][]='исправлен статус '.$pass_status.'=>7, так как прослушаны все темы' ;
                  }
              }
              // проверка что сотрудник прослушал все темы, имеет 7-й статус, но по другой организации
              else if ($pass_status==7)
              {
                // смотрим был ли получен допуск ранее и от какой организации
                if ($rec_personals_org_names[$personal_id]!=$org_name_main and $org_name_main!="")
        //if (($rec_personals_org_names[$personal_id]!=$org_name_main and $org_name_main!="") or ($rec_personals_org_names[$personal_id]!=$org_name_second and $org_name_second!=""))
                  { if (!$read_only)
                      { //EVENTS()->set_event_personal_data($event_id,$personal_id,array('status'=>7),'Утилита check_event_end, исправлен статус так как прослушаны все темы') ;
                        //PERSONAL()->messages_personal_close($personal_id,$rec_event['ext']) ;
                        EVENTS()->set_event_personal_data($event_id,$personal_id,array('status'=>1),'Направление на повторный инструктаж',array('old_status'=>$last_pass_status['status_new'],'ignore_not_change_status'=>1)) ;
                      }
                      $result_pass['set_status_1']++ ;
                      $report[$personal_id]['Новый статус']=1 ;
                      $report[$personal_id]['comment'][]='исправлен статус '.$pass_status.'=>1, так как прослушаны все темы для организации '.$org_name_main.', а сотрудник в организации '.$rec_personals_org_names[$personal_id].'<br>' ;
                      //if ($org_name_main) $report[$personal_id]['comment'][]='исправлен статус '.$pass_status.'=>1, так как прослушаны все темы для организации '.$org_name_main.', а сотрудник в организации '.$rec_personals_org_names[$personal_id].'<br>' ;
                      //if ($org_name_second) $report[$personal_id]['comment'][]='исправлен статус '.$pass_status.'=>1, так как прослушаны все темы для организации '.$org_name_second.', а сотрудник в организации '.$rec_personals_org_names[$personal_id].'<br>' ;


 }
              }
            }
        }
          // прочитаны не все темы но статус 7
          if (_sizeof($arr_personal_themes)<$cnt_event_themes and $pass_status==7)
          { if (!$read_only)
            { //EVENTS()->set_event_personal_data($rec_event['pkey'],$personal_id,array('status'=>6),'Утилита check_event_end, исправлен статус так как не прослушаны все темы') ;
              execSQL_update('update obj_site_events_pass set status=6 where event_id='.$event_id.' and personal_id='.$personal_id) ;
            }
            $result_pass['set_status_6']++ ;
            $report[$personal_id]['Новый статус']=6 ;
            $report[$personal_id]['comment'][]='исправлен статус '.$pass_status.'=>6, так как не прослушаны все темы' ;
          }
      }
      if (_sizeof($result_pass)) { ?><div class="red">Будет произведена корректция статусов</div><? }
      else { ?><div class="green">Все статусы участников корректны</div><? }

      echo '<br>' ;

//$read_only=1 ;

      ?><strong>Выполняем проверку корректности сообщений на основе статусов участия в мероприятии</strong><br><?
        //1=>'Подлежит обучению',
        //2=>'Направлен на обучение (отправлено уведомление)',
        //3=>'Уведомлен',
        //4=>'Прибыл на обучение',
        //5=>'Проходит обучение',
        //6=>'Обучение пройдено частично',
        //7=>'Обучение завершено'

      // проверка сотрудников, подлежащих инструктажу и направленных на инструктаж
      // 1. У сотрудников, подлежащих инструктажу, не дожно быть никаких открытых сообщений
      $sql='select t1.pkey,t1.tkey,t1.status,t1.enabled,t1.personal_id,t1.mess_id as pass_mess_id,
            t3.obj_name as person_name,
            t2.pkey as message_id,t2.status as message_status,t2.enabled as messsage_enabled
            from obj_site_events_pass t1
            left join obj_site_personal_mess t2 on t2.source_pkey=t1.pkey and t2.source_tkey=t1.tkey and !(t2.status=4 or t2.enabled=0)
            left join obj_site_personals t3 on t3.pkey=t1.personal_id and t3.enabled=1
            where t1.event_id='.$event_id.' and t1.enabled=1 and not t3.pkey is null
            order by t1.personal_id,t2.pkey
           ' ;
      $recs=execSQL($sql,0,1) ;
      if (_sizeof($recs)) foreach($recs as $rec)
      {   $personal_id=$rec['personal_id'] ;
          if (!$report[$personal_id]['Текущий статус']) $report[$personal_id]['Текущий статус']=$rec['status'] ;
      if (!$report[$personal_id]['pass link']) $report[$personal_id]['pass link']=($rec['pkey'])? '<a class=new_window title=window_pass href="/window/events/status/'.$rec['pkey'].'/" target="_blank">pass</a>':'-' ;
          if (!$report[$personal_id]['person link']) $report[$personal_id]['person link']=($personal_id)? '<a class=new_window title=window_person href="/window/personal/person/'.$personal_id.'/" target="_blank">person</a>':'-' ;
      switch($rec['status'])
            {
             // 1 - Подлежит обучению
             case 1: if ($rec['message_status']) // закрываем все активные сообщения
                     {   if ($read_only) update_rec_in_table('obj_site_personal_mess',array('status'=>4,'enabled'=>0,'close_data'=>time()),'pkey='.$rec['message_id']) ;
                         $report[$personal_id]['message_close'].=$rec['message_id'].' ' ;
                     }
                     break ;
             //2=>'Направлен на обучение (отправлено уведомление)',
             //3=>'Уведомлен',
             //4=>'Прибыл на обучение',
             //5=>'Проходит обучение',
             //6=>'Обучение пройдено частично'
             case 2:
             case 3:
             case 4:
             case 5:
             case 6: if ($report[$personal_id]['Новый статус']==7) break ;
               $message_fname=($rec['status']==6)? 'message2':'message1' ;
                      $messge_comment=($rec['status']==6)?  'Сотрудник прошел первое занятие, отправляем сообщение № 2':'Сотрудник направлен на мероприятие, отправляем сообщение № 1' ;
                      if (!$rec['message_status']) // если сообщение еще не отправлено - отправлям сообщение о необходимости принять участие в мероприятии
                      {
                            $rec_event_pass=EVENTS()->get_event_pass_by_id($rec['pkey']) ;
                            $mess_rec_new=$obj_event->prepare_message($rec_event,$rec_event_pass,$rec_event['_ext_info'][$message_fname])  ;
                            if (!$read_only)
                            { $mess_reffer=PERSONAL()->message_personal_create($mess_rec_new,array('comment'=>$messge_comment)) ;
                              // фиксируем в записи по человеку в событии ID отправленого ему сообщения
                              list($mess_id,$mess_tkey)=explode('.',$mess_reffer) ;
                              // меняем статус
                              //EVENTS()->set_event_personal_data($rec_event['pkey'],$personal_id,array('mess_id'=>$mess_id),$messge_comment) ;
                              execSQL_update('update obj_site_events_pass set mess_id='.$mess_id.' where pkey='.$rec['pkey']) ;

                              $report[$personal_id]['message_exists']=$mess_id ;
                              $report[$personal_id]['message_open']=$mess_id ;
                              $report[$personal_id]['comment'][]='OPEN: отправлено новое сообщение, ID '.$mess_id.' : '.$rec_event['_ext_info'][$message_fname] ;
                            }
                            else
                            {   $report[$personal_id]['message_exists']='xxx' ;
                                $report[$personal_id]['message_open']='xxx' ;
                                $report[$personal_id]['comment'][]='будет отправлено новое сообщение: '.$rec_event['_ext_info'][$message_fname] ; //.print_r($rec,true) ;
                            }

                      }
                      else if ($report[$personal_id]['message_exists']) // дубликаты, их надо закрывать
                      {
                        if (!$read_only) update_rec_in_table('obj_site_personal_mess',array('status'=>4,'enabled'=>0,'close_data'=>time()),'pkey='.$rec['message_id']) ;
                        $report[$personal_id]['message_close'].=$rec['message_id'].' ' ;
            $report[$personal_id]['comment'][]='Обнаружены сообщения-дубликаты.<br>Будет закрыто сообщение, ID '.$rec['message_id'] ;
                      }
                      else $report[$personal_id]['message_exists']=$rec['message_id'] ;
                      break ;
              //7=>'Обучение завершено'
              case 7: if ($rec['message_status']) // закрываем все активные сообщения для тех, кто прошел обучения
                      {   if ($read_only) update_rec_in_table('obj_site_personal_mess',array('status'=>4,'enabled'=>0,'close_data'=>time()),'pkey='.$rec['message_id']) ;
                          $report[$personal_id]['message_close'].=$rec['message_id'].' ' ;
                      }
                      break ;
          }
          if ($report[$personal_id]['message_exists'] and $report[$personal_id]['message_exists']!=$rec['pass_mess_id'])
          {
              $report[$personal_id]['comment'][$rec['pass_mess_id'].'/'.$report[$personal_id]['message_exists']]='будет исправлено mess_id в event_pass: '.$rec['pass_mess_id'].' => '.$report[$personal_id]['message_exists'] ;
              if (!$read_only)
              {
                  //EVENTS()->set_event_personal_data($rec_event['pkey'],$personal_id,array('mess_id'=>$report[$personal_id]['message_exists']),'Утилита check_event_end, mess_id в event_pass') ;
                  execSQL_update('update obj_site_events_pass set mess_id='.$report[$personal_id]['message_exists'].' where pkey='.$rec['pkey']) ;
              }
          }
      }
      $report_show=[];
      echo 'Проверенео <strong>'._sizeof($report).'</strong> участников мероприятия<br>' ;
      if (_sizeof($report)) foreach($report as $id=>$data) if (_sizeof($data['comment']))
      { $report[$id]['comment']=implode('<br>',$data['comment']) ;
        $report_show[$id]=$report[$id] ;
      }

      if (_sizeof($report_show)) { ?><div class="red">Будет произведена корректция сообщений</div><? }
      else { ?><div class="green">Все сообщений участников мероприятия корректны</div><? }


      $text_to_event=ob_get_clean() ; //

      ob_start() ;
      echo $text_to_event ;
      if (_sizeof($result_pass)) { ?><div class="red">Будет произведена корректция статусов: </div><? damp_array($result_pass,1,-1);}
      if (_sizeof($report_show)) { ?><div class="red">Будет произведена корректция сообщений: </div><? print_2x_arr($report_show);}
      /*?><strong>Полная информация по участию в мероприятии:</strong><?
      print_2x_arr($report);*/
      $text_to_log=ob_get_clean() ;


      LOGS()->reg_log('check_event_end',$text_to_event,array('save_to_file'=>$text_to_log)) ;

      echo $text_to_event ;
      print_2x_arr($report_show);

      //$rec=execSQL_van('select * from obj_site_personal_mess where pkey=28179') ;
      //unset($rec['pkey'],$rec['_reffer'],$rec['_parent_reffer']) ;
      //adding_rec_to_table('obj_site_personal_mess',$rec) ;


  }
}
?>
