<?php
include_once("c_events_meeting_card_db.php");
class c_page_cab_events_meeting_card_db_actions extends c_page_cab_events_meeting_card_db
{
  public $h1='Проверка мероприятия' ;
  function block_main()
  { $this->page_title() ;
    //damp_array($this->rec_event,1,-1) ;
	?><button class="v1" cmd="update_personal_status_1">Обновить список подлежащих мероприятию</button><?
    ?><button class="v1" cmd="check_personal_status_1">Отладка отбора сотрудников в мероприятие</button><?
	/*?><button class="v1" cmd="check_status_info">Проверить статусы участников (инфо)</button><?
	?><button class="v1" cmd="check_status_exec">Проверить статусы участников (исправить)</button><?
      ?><br><?
	*/
      ?><br><h3>Проверка статусов участников мероприятия</h3>
      Будет выполнена проверка соответствия статуса участия в мероприятии на основании данных по участию в занятиях.<br>
      Будет выполнена проверка сообщений по мероприятию в соответствии с текущим статусом сотрудника.<br><?

      ?><button class="v1" cmd="check_event_end_info">Выполнить (только чтение)</button>&nbsp;&nbsp;<?
      ?><button class="v1" cmd="check_event_end_exec">Выполнить (исправить)</button><?

  }

  function cmd_check_personal_status_1()
  {
     $result=$this->obj_event->update_personal_status_1($this->rec_event['pkey'],array('debug_db'=>2,'read_only'=>1)) ;
     damp_array($result,1,-1) ;
  }

  function cmd_update_personal_status_1()
  {
	  $result=$this->obj_event->update_personal_status_1($this->rec_event['pkey'],array('debug_db'=>2)) ;
	  damp_array($result,1,-1) ;
  }

  function cmd_check_event_end_info()
  {
      $this->check_event_end(1) ;
  }
  function cmd_check_event_end_exec()
  {
      $this->check_event_end() ;
  }

  function check_event_end($read_only=0)
  {  ob_start() ;
     echo ($read_only)? 'РЕЖИМ ТОЛЬКО ЧТЕНИЕ':'РЕЖИМ ИСПРАВЛЕНИЯ' ;
     echo '<br>' ;
     $event_id=$this->rec_event['pkey'] ;
     $rec_event=EVENTS()->get_event_by_id($this->rec_event['pkey']) ;
     $obj_event=EVENTS()->get_event_obj_by_id($this->rec_event['pkey']) ;

     $result_pass=[] ;

     $recs_themes=EVENTS()->get_themes_of_events($this->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='.$this->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='.$this->rec_event['pkey'].'
          where t1.event_id='.$this->rec_event['pkey'].' and t1.sign_fname!="" and t4.status>0' ;

     $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><?
      foreach($recs_by_pers as $personal_id=>$recs_personal)
      {   $arr_personal_themes=[] ; $pass_status=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'] ;
          }

          $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 and $pass_status<7)
          { if (!$read_only)
            { //EVENTS()->set_event_personal_data($event_id,$personal_id,array('status'=>7),'Утилита check_event_end, исправлен статус так как прослушаны все темы') ;
              execSQL_update('update obj_site_events_pass set status=7 where event_id='.$event_id.' and personal_id='.$personal_id) ;
            }
            $result_pass['set_status_7']++ ;
            $report[$personal_id]['Новый статус']=7 ;
            $report[$personal_id]['comment'][]='исправлен статус '.$pass_status.'=>7, так как прослушаны все темы' ;

          }
          // прочитаны не все темы но статус 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>' ;

      ?><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'] ;
          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:  $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: отправлено новое сообщение 2, ID '.$mess_id ;
                            }
                            else
                            {   $report[$personal_id]['message_exists']='xxx' ;
                                $report[$personal_id]['message_open']='xxx' ;
                                $report[$personal_id]['comment'][]='будет отправлено новое сообщение 2' ;
                            }

                      }
                      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'][]='будет закрыто сообщение, 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'][]='будет исправлено 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) ;


  }

    function event_pass_close_messages($pass_id,$options=array())
    {   if (!isset($options['comment'])) $options['comment']='' ;
        if (!isset($options['read_only'])) $options['read_only']=0 ;
        // все сообщения в системе только от модуля "Мероприятия", поэтому ищем по полю source_pkey, так как поле source_tkey не индексировано
        update_rec_in_table('obj_site_personal_mess',array('status'=>4,'enabled'=>0,'close_data'=>time()),'source_pkey='.$pass_id) ;
    }



  // далее проверки не используется, достаточно информации по статусам на основании данных по участию сотрдника в занятиях
/*
  function cmd_check_status_info()
  {
      $this->check_status(1) ;
  }

  function cmd_check_status_exec()
  {
      $this->check_status(0) ;
  }


  // проверка статусов участников мероприятий
  // независимо от соответствия текущего статуса истории, проверяем, провильность истории
  // если сотрудник прошел обучение - все последнующие записи на удаление + закрытие сообщения
  // если  сотрудник не прошел обучение - проверить наличие активного сообщения


  function check_status($read_only=0)
  {   ob_start() ;
      $arr_stats=array() ;
      $rec_event=EVENTS()->get_event_by_id($this->rec_event['pkey']) ;
      ///damp_array($rec_event,1,-1);
      $obj_event=EVENTS()->get_event_obj_by_id($this->rec_event['pkey']) ;
      // участие сотрудника в мероприятия
      $recs_pass=execSQL('select t1.pkey,t1.tkey,t1.c_data,t1.personal_id,t1.status,t1.mess_id,t2.status as mess_status
                          from obj_site_events_pass t1
                          left join obj_site_personal_mess t2 on t2.pkey=t1.mess_id
                          where t1.event_id='.$this->rec_event['pkey']) ;
      echo 'В мероприятии участвуют <strong>'._sizeof($recs_pass).'</strong> участников<br>' ;
      // присутствие сотрудника на занятиях
      $recs_lessions_persons=execSQL('select pkey as id,c_data,personal_id,status,sign_fname from obj_site_lession_persons where event_id='.$this->rec_event['pkey']) ;
      echo 'Присутствие сотрудника на занятиях <strong>'._sizeof($recs_lessions_persons).'</strong> записей<br>' ;
      // присутствие сотрудника на занятиях
      $recs_lessions=execSQL('select pkey as id,c_data,obj_name from obj_site_lession where event_id='.$this->rec_event['pkey']) ;
      echo 'Список тем занятий <strong>'._sizeof($recs_lessions).'</strong> записей<br>' ;
      // история изменения статусов
      $recs_status=execSQL('select pkey as id,c_data,obj_name,personal_id,status_old,status_new,person_org,person_otdel,person_working from obj_site_events_pass_status where event_id='.$this->rec_event['pkey'].' order by pkey') ;
      echo 'История изменения статусов <strong>'._sizeof($recs_status).'</strong> записей<br>' ;
      $recs_status_pers=group_by_field('personal_id',$recs_status) ;
      //damp_array($recs_status_pers);

      $cnt_problem=0 ;
      $result_mess=[] ; $result_pass=[] ;
      $ids_to_remove=[] ;

      if (_sizeof($recs_pass)) foreach($recs_pass as $rec_pass)
      {   ob_start() ;
          echo '<hr>' ;
          echo 'Pass ID: '.$rec_pass['pkey'].' Personal_id:'.$rec_pass['personal_id'].'<br>' ;
          $arr222=[$rec_pass] ;
          print_2x_arr($arr222);


          $status_pers=$recs_status_pers[$rec_pass['personal_id']] ;
          $mess_id=$rec_pass['mess_id'] ;

          // проверям наличие в списке статусов 7 - прошел мероприятия
          $is_end=0 ;
          $is_problem=0 ;
          $max_status=0 ;
          if (_sizeof($status_pers)) foreach($status_pers as $i=>$rec_status)
          { if ($rec_status['status_new']==7 and !$is_end) $is_end=1 ;
            if ($rec_status['status_new']>$max_status) $max_status=$rec_status['status_new'] ;
            if ($is_end and $rec_status['status_new']!=7)
            { $status_pers[$i]['action']='remove' ;
              $ids_to_remove[]=$rec_status['id'] ;
              $is_problem=1 ;
              $cnt_problem++ ;
            }
          }

          echo 'is_end=<strong>'.$is_end.'</strong> max_status=<strong>'.$max_status.'</strong><br>' ;

          // проверяем соответствие статуса в pass максимальному статусу в истории
          if ($max_status!=$rec_pass['status'])
          { $cnt_problem++ ;
            $is_problem=1 ;
            echo 'Несооветствие статуса в PASS истории прохождения  <strong>'.$rec_pass['status'].'</strong> <=> <strong>'.$max_status.'</strong><br>' ;
            // если провшел мероприятие - закрываем сообщение, ставим в pass статус 7
            if ($max_status==7)
            { if ($mess_id and $rec_pass['mess_status']!=4) if (!$read_only) PERSONAL()->message_personal_close($mess_id) ;
              echo '<div class="green">Закрыто сообщение ID '.$mess_id.'</div>' ;
              $result_mess['close_message']++;
              if (!$read_only) update_rec_in_table('obj_site_events_pass',array('status'=>7,'mess_id'=>0),'pkey='.$rec_pass['pkey']) ;
              echo '<div class="green">Исправлена запись по участию в мероприятии: status=<strong>7</strong>, mess_id=0<br>' ;
              $result_pass['set_status_7']++ ;
            }
            // если не провшел мероприятие - открываем сообщение, ставим в pass статус $max_status
            else
            {   // сообщение не существует - нет ID или нет есть ID но нет статуса
                if (!$mess_id or !$rec_pass['mess_status'])
                { // участие в мероприятии преждевременно закрыто
                  $mess_rec=$obj_event->prepare_message($rec_event,$rec_pass,$rec_event['_ext_info']['message1'])  ;
                  if (!$read_only) $mess_reffer=PERSONAL()->message_personal_create($mess_rec) ;
                  list($mess_id,$mess_tkey)=explode('.',$mess_reffer) ;
                  echo 'Отправлено сообщение ID:'.$mess_id.'<br>' ;
                  damp_array($mess_rec,1,-1);
                  $result_mess['send_message']++;
                }
                // сообщение существует, но закрыто
                else if ($mess_id and $rec_pass['mess_status']==4)
                {  if (!$read_only)  update_rec_in_table('obj_site_personal_mess',array('status'=>3),'pkey='.$mess_id) ;
                   echo 'Активировано сообщение ID <strong>'.$rec_pass['mess_id'].'</strong><br>' ;
                   $result_mess['activate_message']++;
                }

                 // фиксируем в записи по человеку в событии ID отправленого ему сообщения
                 if (!$read_only) update_rec_in_table('obj_site_events_pass',array('status'=>$max_status,'mess_id'=>$mess_id),'pkey='.$rec_pass['pkey']) ;
                 echo 'Исправлен статус  <strong>'.$rec_pass['status'].'</strong> ==> <strong>'.$max_status.'</strong><br>' ;
                 $result_pass['set_status_'.$max_status]++ ;
            }



          }

          if ($is_problem and _sizeof($status_pers)) print_2x_arr($status_pers);
          $text=ob_get_clean() ;
          if ($is_problem) echo $text ;
          }

      if (_sizeof($ids_to_remove))
      {
          if (!$read_only) execSQL_update('delete from obj_site_events_pass_status where pkey in ('.implode(',',$ids_to_remove).')') ;
          echo 'Удалено  <strong>'._sizeof($ids_to_remove).'</strong> неверных записей по истории участия<br>' ;
      }


      if (!$cnt_problem) echo 'Не найдено сотрудников с неверным статусом<br>' ;
      else
      { damp_array($result_pass,1,-1);
        damp_array($result_mess,1,-1);
      }



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

  }
  */
}



?>
