<?

class i_mo_schedule
{
   // проверка расписания МО
   // $workgroup_id - рабочая группа, в которой проводиться МО
   // $arr_personal_group - группы сотрудника
   function check_chedule($workgroup_id,$arr_personal_group,$time_mo=0,$options=array())
   { ob_start() ;
     // получаем все родительские группы и связанные с ними правила расписания
     $recs_schedule=execSQL('
     select t2.pkey as group_id,t2.obj_name as work_group_name,t2.level,
            t3.pkey as schedule_id,t3.personal_group_id,t3.time_from,t3.time_to,t3.days,t3.action
     from obj_site_account t1
     left join obj_site_account t2 on t2.pkey=t1.pkey or t2.pkey=t1.parent1 or t2.pkey=t1.parent2 or t2.pkey=t1.parent3 or t2.pkey=t1.parent4 or t2.pkey=t1.parent5 or t2.pkey=t1.parent6 or t2.pkey=t1.parent7 or t2.pkey=t1.parent8 or t2.pkey=t1.parent9  
     left join mo_schedule t3 on t3.work_group_id=t2.pkey  
     where t1.pkey='.$workgroup_id.'
     order by t2.level,t3.pkey'
     ,0,1)  ;

     $arr_allows=[] ; $t_end_block=0 ; $allow_mo=1 ; // по умолчание прохождение МО разрешено
     if (_sizeof($recs_schedule)) foreach($recs_schedule as $rec_schedule) if ($rec_schedule['schedule_id'])
     { // 1. Проверяем соответствие группы сотрудников правилу
       $rule_allow_mo=1 ;
       echo '<br><strong>Проверяем правило '.$rec_schedule['schedule_id'].'</strong> для рабочей группы <strong>'.$rec_schedule['work_group_name'].'</strong><br>' ;
       $allow_by_group=0 ; $allow_by_time=0 ; $allow_by_day=0 ;
       if (_sizeof($arr_personal_group)) foreach($arr_personal_group as $group_id=>$group_name)
           if ($group_id==$rec_schedule['personal_group_id'])
           { $allow_by_group=1 ;
             echo 'Найдено соответвие по рабочей группе - '.$group_name.'<br>' ;
             break ;
           }

       if ($allow_by_group)
       { // далее проверяем  соответствие дня недели
         $day=date('N') ;
         //echo '$day='.$day.'<br>' ;
         $days=$arr=str_split($rec_schedule['days']) ;
         //damp_array($days);
         $allow_by_day=($days[$day-1])? 1:0 ;
         if ($allow_by_day)
         {
             echo 'Найдено соответвие по дню недели - '.$day.'<br>' ;
         }

         // далее проверяем соответвие по временному диапазону
         //echo 'time_from='.$rec_schedule['time_from'].'<br>' ;
         //echo 'time_to='.$rec_schedule['time_to'].'<br>' ;
         //echo 'time_now='.date('H').':'.date('i').'<br>' ;
         $arr1=explode(':',$rec_schedule['time_from']) ;
         $arr2=explode(':',$rec_schedule['time_to']) ;
         $t1=$arr1[0]*60+$arr1[1] ;
         $t2=$arr2[0]*60+$arr2[1] ;
         if (!$time_mo) { $t_now=date('H')*60+date('i') ; $time_mo=date('H').':'.date('i') ; }
         else // для проверки
         { $arr_now=explode(':',$time_mo) ;
           $t_now=$arr_now[0]*60+$arr_now[1] ;
         }

         //echo 't1='.$t1.'<br>' ;
         //echo 't2='.$t2.'<br>' ;
         //echo '$t_now='.$t_now.'<br>' ;
         // временной диапазон в пределах суток
         if ($t1<=$t_now and $t_now<=$t2)
         { $allow_by_time=1 ;
           echo 'Найдено соответвие по времени дня - '.date('H').':'.date('i').'<br>' ;
         }
         if ($t1>$t2 and ($t1<=$t_now or $t_now<=$t2))
         { $allow_by_time=1 ;
           echo 'Найдено соответвие по времени дня - '.date('H').':'.date('i').'<br>' ;
         }

         // если в указанный диапазон МО разрешено, запрещаем МО если нет соответствия по дню недели или времени суток
         if ($rec_schedule['action']==1)
         { if (!$allow_by_day or !$allow_by_time) { $rule_allow_mo=0 ; $t_end_block=$t2 ; }


         }
         // если в указанный диапазон МО запрещено, запрещаем МО если есть соответствия по дню недели или времени суток
         else
         { if ($allow_by_day and $allow_by_time) { $rule_allow_mo=0 ; $t_end_block=$t2 ; }

         }
         echo 'Результат проверки правила - '.(($rule_allow_mo)? '<span class="green">МО разрешено</span>':'<span class="red">МО запрещено</span>').'<br>' ;

         // если хотябы по одной из позиций МО запредено - возвращаем флаг запрещения
         if (!$rule_allow_mo) $allow_mo=0 ;
       }
       else echo 'Правило отклонено, несоответвие группы сотрудника<br>' ;
     }
     echo '<br>РЕШЕНИЕ ПО СУММЕ ПРАВИЛ: '.(($allow_mo)? '<span class="green">МО разрешено</span>':'<span class="red">МО запрещено</span>').'<br>' ;
     if ($t_end_block)
     { //echo '$time_mo='.$time_mo.'<br>' ;
       $arr=explode(':',$time_mo) ;
       $now_H=$arr[0] ;
       $now_M=$arr[1] ;
       $now=getdate() ;
       $t_now=mktime($now_H,$now_M,0,$now['mon'],$now['mday'],$now['year']);
       //echo '$t_now='.date('d.m.Y H:i:s',$t_now).'<br>' ;

       $h=floor($t_end_block/60) ;
       $m=$t_end_block-$h*60 ; if ($m<=9) $m='0'.$m ;
       $t_end_block_HM=$h.':'.$m ;
       echo 'Блокировка МО до: <strong>'.$t_end_block_HM.'</strong><br>' ;
       $now=getDate() ;
       $cur_HM=$now_H*60+$now_M ;
       //echo '$cur_HM='.$cur_HM.'<br>' ;
       //echo '$t_end_block='.$t_end_block.'<br>' ;
       if ($cur_HM>=$t_end_block) $t2=mktime($h,$m,0,$now['mon'],$now['mday']+1,$now['year']) ;
       else                       $t2=mktime($h,$m,0,$now['mon'],$now['mday'],$now['year']) ;

       //echo 't2='.date('d.m.Y H:i:s',$t2) ;
       $time_wait=ENGINE()->get_text_time_diff($t_now,$t2) ;
       //echo 'len='.$len.'<br>' ;
       //if ()

       //$rec['__pause']=ENGINE()->get_text_time_diff($t1,$t2) ;
       echo 'Осталось времени до конца блокировки: <strong>'.$time_wait.'</strong><br>' ;
     }
     //damp_array($arr_allows);
$text=ob_get_clean() ;
if (!$allow_mo) LOGS()->reg_log('mo_schedule_check',$text) ;
if ($options['view_debug']) echo $text ;
     return([$allow_mo,$t_end_block_HM,$time_wait]) ;
  }
}
?>
