<?
class i_poll_logic
{
    public $rec_personal ;
    public $recs_themes_with_ball ;
    public $arr_results_last_status ;
    public $arr_allow_themes_ids=[] ;
    public $arr_results=[] ;
    public $arr_results_correct=[] ;
    public $arr_results_uncorrect=[] ;
    public $arr_results_last_correct=[] ;
    public $arr_results_last_uncorrect=[] ;
    public $recs_results=[] ;
    public $stats=[] ;
    public $arr_quelle=[] ;
    public $arr_all_question=[] ;
    public $arr_next_question=[] ;
    public $arr_next_question_ids=[] ;
    public $arr_error_question=[] ;
    public $arr_new_question=[] ;
    public $arr_theme_question_round=[] ;


    function get_allow_themes($rec_personal,$options=[])
    {
        // получаем все темы КЗ, которые имеют условия отбора сотрудников, только один раз
        if (!_sizeof($this->recs_themes_with_ball)) $this->recs_themes_with_ball=execSQL(
               'select t1.*,
                tp1.obj_name as parent1_name,
                tp2.obj_name as parent2_name,
                tp3.obj_name as parent3_name,
                tp4.obj_name as parent4_name
                from poll_themes t1
                left join poll_themes tp1 on tp1.pkey=t1.parent1
                left join poll_themes tp2 on tp2.pkey=t1.parent2
                left join poll_themes tp3 on tp3.pkey=t1.parent3
                left join poll_themes tp4 on tp4.pkey=t1.parent4
                where t1.viewer_name!="" 
                order by t1.level') ;

        // массив $recs_themes_with_ball будет урезаться
        $recs_themes_with_ball=$this->recs_themes_with_ball ;
            // 1-й этап - отсеиваем темы, в которые сотрудник точно никак не попадает
            if (_sizeof($recs_themes_with_ball)) foreach($recs_themes_with_ball as $id=>$rec_theme)
            {   $arr_theme_path=[] ; $theme_path='' ;
                for($i=2;$i<=4;$i++) if ($rec_theme['parent'.$i.'_name']) $arr_theme_path[]=$rec_theme['parent'.$i.'_name'] ;
                if (_sizeof($arr_theme_path)) $theme_path=implode(' / ',$arr_theme_path).' / ' ;
                $theme_path.=$rec_theme['obj_name'] ;


                $res=EVENTS()->check_select_filter_to_personal($rec_theme['filter'],$rec_personal) ;
                if ($res['ball'])
                {   $this->arr_allow_themes_ids[]=$rec_theme['pkey'] ;
                    if ($options['debug']) echo '<div class="green">Тема <strong>'.$theme_path.'</strong> одобрена, балл '.$res['ball'].'</div>' ;
                    $recs_themes_with_ball[$id]['ball']=$res['ball'] ;
                    $recs_themes_with_ball[$id]['theme_path']=$theme_path ;

                }
                else
                { if ($options['debug']) echo '<div class="red">Тема <strong>'.$theme_path.'</strong> отклонена, балл '.$res['ball'].'</div>' ;
                  unset($recs_themes_with_ball[$id]) ;
                }

            }
         return($recs_themes_with_ball) ;
    }


    // вернуть очередь вопросов текущего сотрудника
    function prepare_personal_questions_stats($options=array())
    {
        // получаем все темы КЗ, которые имеют условия отбора сотрудников
        //$this->recs_themes_with_ball=execSQL('select * from poll_themes',0) ;
        $this->recs_themes_with_ball=execSQL('select t1.*,
                                        tp1.obj_name as parent1_name,
                                        tp2.obj_name as parent2_name,
                                        tp3.obj_name as parent3_name,
                                        tp4.obj_name as parent4_name
                                        from poll_themes t1
                                        left join poll_themes tp1 on tp1.pkey=t1.parent1
                                        left join poll_themes tp2 on tp2.pkey=t1.parent2
                                        left join poll_themes tp3 on tp3.pkey=t1.parent3
                                        left join poll_themes tp4 on tp4.pkey=t1.parent4
                                        where t1.viewer_name!="" 
                                        order by t1.level') ;
            // 1-й этап - отсеиваем темы, в которые сотрудник точно никак не попадает
            if (_sizeof($this->recs_themes_with_ball)) foreach($this->recs_themes_with_ball as $id=>$rec_theme)
            {   $arr_theme_path=[] ;
                for($i=1;$i<=4;$i++) if ($rec_theme['parent'.$i.'_name']) $arr_theme_path[]=$rec_theme['parent'.$i.'_name'] ;
                $theme_path=implode(' / ',$arr_theme_path).' / '.$rec_theme['obj_name'] ;


                $res=EVENTS()->check_select_filter_to_personal($rec_theme['filter'],$this->rec_personal) ;
                if ($res['ball'])
                {   $this->arr_allow_themes_ids[]=$rec_theme['pkey'] ;
                    echo '<div class="green">Тема <strong>'.$theme_path.'</strong> одобрена, балл '.$res['ball'].'</div>' ;
                    $this->recs_themes_with_ball[$id]['ball']=$res['ball'] ;
                    $this->recs_themes_with_ball[$id]['theme_path']=$theme_path ;

                }
                else
                { echo '<div class="red">Тема <strong>'.$theme_path.'</strong> отклонена, балл '.$res['ball'].'</div>' ;
                  unset($this->recs_themes_with_ball[$id]) ;
                }

            }
           // 2-й этап - получаем все вопросы по этим темам
        /*?><strong>recs_themes_with_ball</strong><?
        print_2x_arr($this->recs_themes_with_ball);*/
        $arr_results_last_status_by_section=[] ;

        $arr=[] ;
        if (_sizeof($this->arr_allow_themes_ids)) for($i=1;$i<=9;$i++) $arr[]=' t2.parent'.$i.' in ('.implode(',',$this->arr_allow_themes_ids).') ' ;
        //damp_array($arr) ;

        $this->recs_results=execSQL('select t1.pkey,t1.question_id,t1.correct,
                               t2.parent1,t2.parent2,t2.parent3,t2.parent4,t2.parent5,t2.parent6,t2.parent7,t2.parent8,t2.parent9  
                               from poll_result t1
                               left join poll_questions t2 on t2.pkey=t1.question_id
                               where t1.personal_id='.$this->rec_personal['pkey'].' and not t2.pkey is null 
                               and ('.implode(' or ',$arr).') 
                               order by t1.question_id,t1.pkey',0,1) ;

        $recs_questions_all=execSQL('select t2.*
                                    from poll_questions t2
                                    where '.implode('or',$arr).'
                                    order by t2.parent
                                   ') ;

        if (_sizeof($this->recs_results)) foreach($this->recs_results as $rec_result)
        {   $question_id=$rec_result['question_id'] ;
            if ($rec_result['correct']) $recs_questions_all[$question_id]['correct']=2 ;
            elseif ($recs_questions_all[$question_id]['correct']!=2) $recs_questions_all[$question_id]['correct']=1 ;
        }

        //print_2x_arr($recs_questions_all);

        if (_sizeof($this->recs_results)) foreach($this->recs_results as $indx=>$rec)
        { $this->arr_results[$rec['question_id']]++ ;
                  if (!$rec['correct']) $rec['correct']=0 ;

                          if ($rec['correct']) { $this->arr_results_correct[$rec['question_id']]++ ;    }
                          else                 { $this->arr_results_uncorrect[$rec['question_id']]++ ;  }

                          $this->arr_results_last_status[$rec['question_id']]=$rec['correct'] ;

                  // если это последний результат по данному вопросу - считаем в статистике
                  if ((isset($this->recs_results[$indx+1]) and $this->recs_results[$indx+1]['question_id']!=$rec['question_id']) or !isset($this->recs_results[$indx+1]))
                  {  for($i=1;$i<=9;$i++) if ($rec['parent'.$i]) $arr_results_last_status_by_section[$rec['parent'.$i]][$rec['correct']]++ ;
                     //echo 'Засчитан результат ID '.$indx.'<br>' ;
                  }
        }
        if (_sizeof($this->arr_results_last_status)) foreach($this->arr_results_last_status as $question_id=>$last_status)
        { if ($last_status==1) { $this->arr_results_last_correct[$question_id]=1 ;   }
          else                 { $this->arr_results_last_uncorrect[$question_id]=1 ; }
        }

        //damp_array($this->arr_results_last_status,1,-1);
        //echo 'число сессий КЗ: <strong>'._sizeof($this->recs_results).'</strong><br>' ;
        //echo 'число сессий с правильными ответами: <strong>'._sizeof($this->>arr_results_correct).'</strong><br>' ;
        //echo 'число сессий с неправильных ответами: <strong>'._sizeof($this->arr_results_uncorrect).'</strong><br>' ;
        //echo 'число заданных вопросов: <strong>'._sizeof($this->arr_results).'</strong><br>' ;
    }

    function get_personal_questions_quelle($options=array())
    {      $this->prepare_personal_questions_stats() ;



            // все вопросы тем


            $stop=0 ; $recs_questions_all=[] ;
            //damp_array($this->arr_allow_themes_ids);
            if (_sizeof($this->recs_themes_with_ball))
            {   // можно сделать и схему поизящнее - запросы только по parent с учетем level themes
                // пока делаем по всем parent

                // вот в этом месте надо получать вопросы по каждой теме отдельно с учетом необходимого процента покрытия темы и вопросов,
                // на которые сотрудник уже ответил правильно в прошлом круге
                //foreach($this->recs_themes_with_ball as $rec_theme)
                //{   $recs_questions_theme[$rec_theme['pkey']]=execSQL('select * from poll_questions where parent'.$rec_theme['level'].'='.$rec_theme['pkey'],2) ;
                //}

                // получаем все вопросы во всех темах
                // необходимо понят, закрывает ли очередной круг уже отвеченные вопросы
                $arr=[] ;
                for($i=1;$i<=9;$i++) $arr[]=' parent'.$i.' in ('.implode(',',$this->arr_allow_themes_ids).') ' ;
                $recs_questions_all=execSQL('select * from poll_questions where '.implode('or',$arr).' order by parent ') ;

                // closing_perc - значение в %, сколько процентов вопросов надо задать чтобы закрыть круг

                /*$recs_questions=execSQL('select t1.*,
                                         t2.correct,count(t2.pkey) as cnt_result
                                         from poll_questions t1
                                         left join poll_result t2 on t2.personal_id='.$this->rec_personal['pkey'].' and t2.question_id=t1.pkey
                                         where '.implode('or',$arr).'
                                         group by t1.pkey,t2.correct

                                         ') ;
                */
                echo 'число вопросов во всех темах: <strong>'._sizeof($recs_questions_all).'</strong><br>' ;

                //damp_array($this->arr_results_correct);
                //damp_array($this->arr_results_uncorrect);

                // собираем статистику
                if (_sizeof($recs_questions_all)) foreach($recs_questions_all as $id=>$rec)
                { for ($i=1;$i<=9;$i++) if ($rec['parent'.$i]>0)
                  {   $this->stats[$rec['parent'.$i]]['cnt_question']++ ;

                      if (isset($this->arr_results[$rec['pkey']]))
                      { $this->stats[$rec['parent'.$i]]['cnt_question_put']++ ;
                        $this->stats[$rec['parent'.$i]]['cnt_sessions']+=$this->arr_results[$rec['pkey']] ;
                      }
                      if (isset($this->arr_results_correct[$rec['pkey']])) $this->stats[$rec['parent'.$i]]['cnt_question_get_correct']+=$this->arr_results_correct[$rec['pkey']] ;
                      if (isset($this->arr_results_uncorrect[$rec['pkey']])) $this->stats[$rec['parent'.$i]]['cnt_question_get_uncorrect']+=$this->arr_results_uncorrect[$rec['pkey']] ;


                     /* if ($rec['cnt_result'])
                      { $this->stats[$rec['parent'.$i]]['cnt_question_put']+=$rec['cnt_result'] ;
                        if ($rec['correct']) $this->stats[$rec['parent'.$i]]['cnt_question_get_correct']+=$rec['cnt_result'] ;
                        else                 $this->stats[$rec['parent'.$i]]['cnt_question_get_uncorrect']+=$rec['cnt_result'] ;
                      }*/
                  }

                }
                //damp_array($this->stats);



            }

          //  print_2x_arr($this->recs_themes_with_ball) ;

           $last_uncorrect=[] ;
           $not_used=[] ;
           $this->arr_theme_question_round=[] ;
           $this->arr_next_question=[] ;
           $this->arr_all_question=[] ;
           $this->arr_error_question=[] ;
           $this->arr_new_question=[] ;
           $arr_themes_ids=[] ;
           $section_max=0 ;


           for($ball=10;$ball>0;$ball--) foreach($this->recs_themes_with_ball as $id=>$rec_theme) if ((int)$rec_theme['ball']==$ball)
           { //echo 'Ищем разделы КЗ с баллом <strong>'.$ball.'</strong><br>' ;
               $closing_perc=($rec_theme['closing_perc'])? $rec_theme['closing_perc']:100 ;
               $this->recs_themes_with_ball[$id]['closing_perc']=$closing_perc ;
               //$closing_perc=50 ;
               $arr_person_questions=[] ;
               $arr_person_questions_status=[] ;
               $theme_id=$rec_theme['pkey'] ;
               $arr_themes_ids[]=$theme_id ;

               echo 'Раздел КЗ <strong>'.$rec_theme['theme_path'].'</strong>, closing_perc=<strong>'.$closing_perc.'%</strong><br>' ;

               // берем все отеченные вопросы, добавлям в стек
               //$answers_correct=execSQL('select * from poll_result ')

                // получаем все ответы сотрудника по этой теме
                $this->recs_results=execSQL('select t1.pkey,t1.c_data,t1.question_id,t1.correct
                                               from poll_result t1
                                               left join poll_questions t2 on t2.pkey=t1.question_id
                                               where t1.personal_id='.$this->rec_personal['pkey'].' and not t2.pkey is null 
                                               and  t2.parent'.$rec_theme['level'].'='.$theme_id.' 
                                               order by t1.pkey',0,1) ;
                echo 'У сотрудника <strong>'._sizeof($this->recs_results).'</strong> ответов на вопросы<br>' ;

                // важно получить последний ответ сотрудника на вопрос - положительный или отрицательный
                if (_sizeof($this->recs_results))
                { foreach($this->recs_results as $rec) $arr_person_questions[$rec['question_id']]=$rec['correct'] ;
                  // разделяем правильно отвеченные и неправильно отвеченные вопросы
                  if (_sizeof($arr_person_questions)) foreach($arr_person_questions as $question_id=>$result) $arr_person_questions_status[$result][]=$question_id ;
                  echo 'У сотрудника <strong>'._sizeof($arr_person_questions).'</strong> отвеченных вопросов, <span class="green">'._sizeof($arr_person_questions_status[1]).'</span> правильно, <span class="red">'._sizeof($arr_person_questions_status[0]).'</span> неправильно<br>' ;

                }
                //damp_array($arr_person_questions,1,-1);
                //damp_array($arr_person_questions_status,1,-1);

                // все вопросы раздела надо получать именно в сортировке rand() чтобы  новые вопросы были случайными
                $ids_questions_all=execSQL_row('select pkey,1 from poll_questions  where parent'.$rec_theme['level'].'='.$theme_id.' order by rand()') ;

                $cnt_questions_all=_sizeof($ids_questions_all) ;
                $cnt_questions_all_to_round2=$ids_questions_all ; // сохраняем массив вопросов для второго круга
                echo 'Всего в теме <strong>'.$cnt_questions_all.'</strong> вопросов<br>' ;
                // по умолчанию первый круг. Если все вопросы темы отвечены - она отодвигается на второй круг

                // число вопросов на сектор
                $cnt_question_to_section=ceil($cnt_questions_all/100*$closing_perc) ;
                echo 'Число вопросов на сектор <strong>'.$cnt_question_to_section.'</strong>, (closing_perc=<strong>'.$closing_perc.'%</strong>)<br>' ;

                // формируем очередь вопросов текущего круга по секторам. У каждой темы - свой круг
                $round=1 ; $section=1 ; $i=0 ;
                // сначала собираем отвеченные вопросы
                if (_sizeof($arr_person_questions_status[1])) foreach($arr_person_questions_status[1] as $question_id)
                { $this->arr_theme_question_round[$theme_id][$round][$section][$question_id]='ok' ;
                  unset($ids_questions_all[$question_id]) ;
                  $i++ ;
                  if ($i>=$cnt_question_to_section) { $section++ ; $i=0 ; }
                }

                // далее добавляем неправильно вопросы
                /*if (_sizeof($arr_person_questions_status[0])) foreach($arr_person_questions_status[0] as $question_id)
                { $this->arr_theme_question_round[$theme_id][$round][$section][$question_id]='error' ;
                  $i++ ;
                  if ($i>=$cnt_question_to_section) { $section++ ; $i=0 ; }
                  unset($ids_questions_all[$question_id]) ;
                }*/

                // далее добавляем еще не отвеченные вопросы
                if (_sizeof($ids_questions_all)) foreach($ids_questions_all as $question_id=>$tt)
                { $this->arr_theme_question_round[$theme_id][$round][$section][$question_id]='new' ;
                  $i++ ;
                  if ($i>=$cnt_question_to_section) { $section++ ; $i=0 ; }
                }
                if ($section_max<$section) $section_max=$section ;


                // формируем очередь второго круга. На втором круге отвеченных вопросов нет, все вопросы идут как неотвеченные
                $round=2 ; $section=1 ; $i=0 ;
                if (_sizeof($cnt_questions_all_to_round2)) foreach($cnt_questions_all_to_round2 as $question_id=>$tt)
                { $this->arr_theme_question_round[$theme_id][$round][$section][$question_id]='new' ;
                  $i++ ;
                  if ($i>=$cnt_question_to_section) { $section++ ; $i=0 ; }
                }
                if ($section_max<$section) $section_max=$section ;








               // независимо от полноты покрытия темы, надо проверить вопросы, на которые был дан неправильный ответ последним
               // $this->arr_results_last_uncorrect - все IDs вопросов по всем темам, на которые последний ответ был некорректным
               // $arr_question_last_failed - некорректные вопросы по текущей теме
               //$arr_question_last_failed=$this->get_question_last_failed($rec_theme,$this->arr_results_last_uncorrect) ;
               //if ($options['check_result']) $this->check_question_last_failed($rec_theme,$arr_question_last_failed) ;
               //if (_sizeof($arr_question_last_failed)) $last_uncorrect[]=implode(',',$arr_question_last_failed) ;



               //$theme_id=$rec_theme['pkey'] ;

               //echo 'Проверяем покрытие раздела заданными вопросами<br>' ;
               //echo 'Число вопросов в разделе: <strong>'.$this->stats[$theme_id]['cnt_question'].'</strong><br>' ;
               //echo 'Число вопросов, которые уже были заданы по этому разделу: <strong>'.$this->stats[$theme_id]['cnt_question_put'].'</strong><br>' ;

               //if ($this->stats[$theme_id]['cnt_question']>$this->stats[$theme_id]['cnt_question_put'])
               { //echo '<div class="red">Обнаружено неполное начальное покрытие темы</div>' ;
                 //echo 'Получаем ID вопросов, которые еще не были заданы<br>' ;
                 //$arr_question_not_put=$this->get_questions_not_put($rec_theme,$this->arr_results) ;

                 /*if ($options['check_result']) $this->check_questions_not_put($arr_question_not_put) ;
                 if (_sizeof($arr_question_not_put))
                 {   $str=implode(',',$arr_question_not_put) ;
                     $arr=explode(',',$str);
                     shuffle($arr);
                     //$not_used[]=implode(',',$arr) ;
                     //damp_array($not_used,1,-1) ;
                 }*/
               }

               //if (_sizeof($this->arr_quelle)) $stop=1 ;


             //if ($stop) break ;

           }

        //print_2x_arr($this->arr_theme_question_round);
           // идем по темам, кругам, секторам и собираем (!!! в порядке следования тема-круг-сектор):
           // 1. Список вопросов, которые были заданы сотруднику
           // 2. Список вопросов, которые будут заданы сотруднику
           for($round=1;$round<=2;$round++) for($section=1;$section<=$section_max;$section++)
              foreach($arr_themes_ids as $theme_id)
              {
                  if (_sizeof($this->arr_theme_question_round[$theme_id][$round][$section])) foreach($this->arr_theme_question_round[$theme_id][$round][$section] as $question_id=>$status)
                  { $this->arr_all_question[]=['theme_id'=>$theme_id,'question_id'=>$question_id,'round'=>$round,'section'=>$section,'status'=>$status] ;

                    // все вопросы, которые не были отвечены или не были отвечены правильно собираем в массив $this->arr_next_question.
                    // внимаение! индекс по  $question_id делать нельзя, так как вопросы будут повторятся во втором круге
                    if ($status!='ok')
                    { $this->arr_next_question[]=['theme_id'=>$theme_id,'question_id'=>$question_id,'round'=>$round,'section'=>$section,'status'=>$status] ;
                      $this->arr_next_question_ids[$question_id]=1 ;

                    }
                    // все вопросы, которые были отвечены неправильно
                    if ($status=='error') $this->arr_error_question[$question_id]=['theme_id'=>$theme_id,'question_id'=>$question_id,'round'=>$round,'section'=>$section,'status'=>$status] ;
                    // все вопросы, которые еще не задавались
                    if ($status=='new') $this->arr_new_question[$question_id]=['theme_id'=>$theme_id,'question_id'=>$question_id,'round'=>$round,'section'=>$section,'status'=>$status] ;
                  }
              }

           //damp_array($this->arr_next_question,1,-1) ;
           /*?><strong>arr_next_question</strong><?
           print_2x_arr($this->arr_next_question);*/
           /*?><strong>arr_error_question</strong><?
           print_2x_arr($this->arr_error_question);
           ?><strong>arr_new_question</strong><?
           print_2x_arr($this->arr_new_question);*/


           $this->arr_quelle['error']=implode(',',array_keys($this->arr_error_question)) ;
           $this->arr_quelle['new']=implode(',',array_keys($this->arr_new_question)) ;


         if (_sizeof($this->arr_quelle))
           {  $question_ids_to_session=[] ;

              $cnt=$options['question_count'] ;
              if (!$cnt) $cnt=2 ;
              for($i=0;$i<$cnt;$i++) if ($this->arr_next_question[$i]) $question_ids_to_session[]=$this->arr_next_question[$i]['question_id'] ;
              $this->arr_quelle['quiestion_ids']=implode(',',$question_ids_to_session) ;
           }
        damp_array($this->arr_quelle);
        return($this->arr_quelle) ;
    }

    function get_questions_not_put($rec_theme,$arr_results)
    {  if (!_sizeof($arr_results)) $arr_results[0]=1 ;
        $arr_question_not_put=execSQL('select * from poll_questions where parent'.$rec_theme['level'].'='.$rec_theme['pkey'].' and not pkey in ('.implode(',',array_keys($arr_results)).') order by parent') ;
        echo 'Получено <strong>'._sizeof($arr_question_not_put).'</strong> вопросов, которые еще не были заданы: ' ;
        $str=implode(', ',array_keys($arr_question_not_put)) ;
        echo mb_substr($str,0,100).'....<br>' ;
        return(array_keys($arr_question_not_put)) ;

    }


    function check_questions_not_put($arr_question_not_put)
    {
      echo 'Выполняем обратную проверку:<br>' ;
      $recs_check=execSQL('select * from poll_result where personal_id='.$this->rec_personal['pkey'].' and question_id in ('.implode(',',$arr_question_not_put).') order by parent') ;
      if (!_sizeof($recs_check)) echo '<div class=green>Тест пройден, в poll_result нет заданных вопросов с данными ID для этого сотрудника</div>' ;
      else
      { echo '<div class=red>Тест НЕ пройден, в poll_result есть заданные вопросы с данными ID для этого сотрудника</div>' ;
        print_2x_arr($recs_check);
      }
    }

    function get_question_last_failed($rec_theme,$arr_results_last_uncorrect)
    {   if (!_sizeof($arr_results_last_uncorrect)) return([]) ;
        //echo 'Получаем ID вопросов, по которым последний ответ был неккоректным<br>' ;
        $arr_question_last_failed=execSQL('select * from poll_questions where parent'.$rec_theme['level'].'='.$rec_theme['pkey'].' and  pkey in ('.implode(',',array_keys($arr_results_last_uncorrect)).') order by parent') ;
        echo 'Получено <strong>'._sizeof($arr_question_last_failed).'</strong> вопросов, по которым последний ответ был некорректным: ' ;
        echo implode(',',array_keys($arr_question_last_failed)).'<br>' ;
        return(array_keys($arr_question_last_failed)) ;
    }

    function check_question_last_failed($rec_theme,$arr_question_last_failed)
    {
        echo 'Выполняем обратную проверку:<br>' ;
         // получаем все заданные вопросы сотруднику в порядке задавания
         $recs_check=execSQL('select t1.* 
                              from poll_result t1  
                              left join poll_questions t2 on t2.pkey=t1.question_id and t2.parent'.$rec_theme['level'].'='.$rec_theme['pkey'].'
                              where t1.personal_id='.$this->rec_personal['pkey'].' and not t2.pkey is null   
                              order by t1.pkey') ;
         echo 'Выполняем проверку в <strong>'._sizeof($recs_check).'</strong> сессий КЗ<br>' ;
        $check=[] ;
         if (_sizeof($recs_check)) foreach($recs_check as $rec)
         { $check[$rec['question_id']]=$rec['correct'] ;
         }
         // оставляем в массиве только вопросы, по которым был неудачный ответ
         if (_sizeof($check)) foreach($check as $question_id=>$value) if ($value) unset($check[$question_id]) ;

         //damp_array($check,1,-1); damp_array($arr_question_last_failed,1,-1);

         $arr_found=array_flip($arr_question_last_failed) ;
         $arr_not_found=[] ;
         if (_sizeof($check)) foreach($check as $question_id=>$value)
         { if (isset($arr_found[$question_id])) { unset($arr_found[$question_id]) ; }
           else $arr_not_found[]=$question_id ;
         }
         if (!_sizeof($arr_found) and !_sizeof($arr_not_found)) echo '<div class=green>Тест пройден</div>' ;
         else
          { echo '<div class=red>Тест НЕ пройден</div>' ;
            ?><strong>arr_found</strong><br><?
            damp_array($arr_found,1,-1);
            ?><strong>arr_not_found</strong><br><?
            damp_array($arr_not_found,1,-1);
          }
    }

}

?>
