<? // все операции связанные с фильтраций персонала для аккаунтов, рабочих групп, групп  сотрудников, мероприятий и т.д.
function PERSONALS_FILTER(){ if (!is_object($GLOBALS['PERSONALS_FILTER'])) $GLOBALS['PERSONALS_FILTER']=new i_personals_filter();return($GLOBALS['PERSONALS_FILTER']);return(new i_personals_filter());}
class i_personals_filter
{


    function check_old_format_personals_filters()
    {
        $cnt=execSQL_value('select count(pkey) from personals_filter') ;
        if (!$cnt) $this->convert_personals_filter_from_old_format() ;
    }

    function convert_personals_filter_from_old_format()
    {   execSQL_update('truncate  personals_filter') ;
        $exists_reffers=execSQL_row('select reffer,pkey as id from personals_filter') ;

        echo '<strong>Переносим настройки групп</strong><br>' ;
        $recs=execSQL('select pkey,obj_name,settings,tkey from obj_site_account where clss in (1,206)') ;
        if (_sizeof($recs)) foreach($recs as $rec)
        { if (isset($exists_reffers[$rec['_reffer']])) echo 'Группа <strong>'.$rec['obj_name'].'</strong> уже перенесена<br>' ;
          else
          { $ext_info=unserialize($rec['settings']) ;
            if ($ext_info===false) $ext_info=json_decode($rec['settings'],1) ;
            $new_ext=[] ;
            if (!_sizeof($ext_info['personals']) and _sizeof($ext_info['personal'])) $ext_info['personals'][]=$ext_info['personal'] ;
            //damp_array($ext_info['personals'],1,-1);
            if (_sizeof($ext_info['personals'])) foreach($ext_info['personals'] as $filter_set) $new_ext[]=$filter_set['filter'] ;
            if (_sizeof($new_ext))
            { $id=$this->append_rec_to_personals_filter($rec['_reffer'],$new_ext,'view_personals_workgroup_'.$rec['pkey'])  ;
              echo 'Группа <strong>'.$rec['obj_name'].'</strong> - <span class="green">добавлена запись '.$id.'</span><br>' ;
            } else echo 'Группа <strong>'.$rec['obj_name'].'</strong> - правила отбора сотрудников не заданы<br>' ;
          }
        }
        echo '<br><strong>Переносим настройки аккаунтов</strong><br>' ;
        $recs=execSQL('select pkey,obj_name,ext_info,tkey from obj_site_account where clss in (210)') ;
        if (_sizeof($recs)) foreach($recs as $rec)
        { if (isset($exists_reffers[$rec['_reffer']])) echo 'Аккаунт <strong>'.$rec['obj_name'].'</strong> уже перенесен<br>' ;
          else
          { $ext_info=unserialize($rec['ext_info']) ;
            if ($ext_info===false) $ext_info=json_decode($rec['ext_info'],1) ;
            $new_ext=[] ;
            if (!_sizeof($ext_info['personals']) and _sizeof($ext_info['personal'])) $ext_info['personals'][]=$ext_info['personal'] ;
            //damp_array($ext_info['personals'],1,-1);
            if (_sizeof($ext_info['personals'])) foreach($ext_info['personals'] as $filter_set) $new_ext[]=$filter_set['filter'] ;
            if (_sizeof($new_ext))
            { $id=$this->append_rec_to_personals_filter($rec['_reffer'],$new_ext,'view_personals_account_'.$rec['pkey'])  ;
              echo 'Аккаунт <strong>'.$rec['obj_name'].'</strong> - <span class="green">добавлена запись '.$id.'</span><br>' ;
            } else echo 'Аккаунт <strong>'.$rec['obj_name'].'</strong> - правила отбора сотрудников не заданы<br>' ;
          }
        }

        echo '<br><strong>Переносим настройки групп сотрудников</strong><br>' ;
        $recs=execSQL('select  pkey,id,obj_name,ext_info,tkey from view_IL_groups') ;
        if (_sizeof($recs)) foreach($recs as $rec)
        { if (isset($exists_reffers[$rec['_reffer']])) echo 'Группа сотрудников <strong>'.$rec['obj_name'].'</strong> уже перенесена<br>' ;
          else
          { $ext_info=unserialize($rec['ext_info']) ;
            if ($ext_info===false) $ext_info=json_decode($rec['ext_info'],1) ;
            $new_ext=[] ;
            if (!_sizeof($ext_info['personals']) and _sizeof($ext_info['personal'])) $ext_info['personals'][]=$ext_info['personal'] ;
            if (_sizeof($ext_info['personals'])) foreach($ext_info['personals'] as $filter_set) $new_ext[]=$filter_set['filter'] ;
            if (_sizeof($new_ext))
            { $id=$this->append_rec_to_personals_filter($rec['_reffer'],$new_ext,'view_personals_group_'.$rec['pkey'])  ;
              echo 'Группа сотрудников <strong>'.$rec['obj_name'].'</strong> - <span class="green">добавлена запись '.$id.'</span><br>' ;
            } else echo 'Группа сотрудников <strong>'.$rec['obj_name'].'</strong> - правила отбора сотрудников не заданы<br>' ;
          }
        }

        if (_table_id('obj_site_events_schedule'))
        {   echo '<br><strong>Переносим настройки мероприятий</strong><br>' ;
        $recs=execSQL('select pkey,obj_name,ext_info,tkey from obj_site_events_schedule') ;
        if (_sizeof($recs)) foreach($recs as $rec)
        { if (isset($exists_reffers[$rec['_reffer']])) echo 'Мероприятие <strong>'.$rec['obj_name'].'</strong> уже перенесена<br>' ;
          else
          { $ext_info=unserialize($rec['ext_info']) ;
            if ($ext_info===false) $ext_info=json_decode($rec['ext_info'],1) ;
            //damp_array($ext_info,1,-1);
            $new_ext=[] ;
            if (!_sizeof($ext_info['personals']) and _sizeof($ext_info['filter'])) $ext_info['personals'][]=$ext_info['filter'] ;
            if (_sizeof($ext_info['personals'])) foreach($ext_info['personals'] as $filter_set) $new_ext[]=$filter_set['filter'] ;
            if (_sizeof($new_ext))
            { $id=$this->append_rec_to_personals_filter($rec['_reffer'],$new_ext,'view_personals_event_'.$rec['pkey'])  ;
              echo 'Мероприятие <strong>'.$rec['obj_name'].'</strong> - <span class="green">добавлена запись '.$id.'</span><br>' ;
            } else echo 'Мероприятие <strong>'.$rec['obj_name'].'</strong> - правила отбора сотрудников не заданы<br>' ;
          }
        }
        }

        if (_table_id('quiz_themes'))
        { //  разделы КЗ - информация будет или в таблице quiz_themes или в таблице quiz_themes_text
        echo '<br><strong>Переносим настройки разделов КЗ</strong><br>' ;
        $recs=execSQL('select * from quiz_themes where viewer_name!=""') ;
        if (_sizeof($recs)) foreach($recs as $rec)
        { if (isset($exists_reffers[$rec['_reffer']])) echo 'Раздел КЗ <strong>'.$rec['obj_name'].'</strong> уже перенесен<br>' ;
          else
          { $filter=json_decode($rec['filter'],true) ;
            $ext_info=[$filter] ;
            $id=$this->append_rec_to_personals_filter($rec['_reffer'],$ext_info,'view_personals_quiz_section_'.$rec['pkey'])  ;
            echo 'Раздел КЗ <strong>'.$rec['obj_name'].'</strong> - <span class="green">добавлена запись '.$id.'</span><br>' ;
          }
        }
        //$recs=execSQL('select * from personals_filter') ;
    }
    }

    function append_rec_to_personals_filter($reffer,$ext_info,$name='')
     {
         $data=[] ;
          $data['clss']=220 ;
          $data['indx']=1 ;
          $data['reffer']=$reffer ;
          $data['obj_name']=$name ;
          $data['ext_info']=json_encode($ext_info,JSON_UNESCAPED_UNICODE) ;
          $id=adding_rec_to_table('personals_filter',$data) ;
          return($id) ;
     }

    function delete_rec_of_personals_filter($reffer)
    {
        $rec_filter=execSQL_van('select * from personals_filter where reffer="'.$reffer.'"') ;
        if ($rec_filter['pkey'])
        {  //damp_array($rec_filter,1,-1);
            if ($rec_filter['obj_name'])
            { execSQL_update('drop view if exists '.$rec_filter['obj_name'],['debug'=>0]) ;
              echo 'Удален вьювер '.$rec_filter['obj_name'].'<br>' ;
              execSQL_update('drop view if exists '.$rec_filter['obj_name'].'_all',['debug'=>0]) ;
              echo 'Удален вьювер '.$rec_filter['obj_name'].'_all<br>' ;
            }
            execSQL_update('delete from personals_filter where pkey='.$rec_filter['pkey']) ;
            echo 'Удалена запись по отбору сотрудников, ID='.$rec_filter['pkey'].'<br>' ;
        }
    }

    // вернет или имя вьювера фильтра или создаст временную таблицу по условиям фиьтра и вернет имя временной таблицы
    function get_viewer_name_by_filter_reffer($reffer,$options=array())
    {   $rec_filter=$this->get_personals_filter_rec_to_item($reffer) ;
        if ($rec_filter['viewer_name'])
        { $viewer_name=$rec_filter['viewer_name'] ;
          if ($options['debug']) echo 'Будет использован вьювер сотрудников объекта <strong>'.$viewer_name.'</strong><br>' ;
        }
        else if (_sizeof($rec_filter['filter_set']))
        { list($pkey,$tkey)=explode('.',$reffer) ;
          $viewer_name='temp_filter_'.MEMBER()->id.'_'.$pkey ; //str_replace('.','',$reffer) ;
          $options['create_temporary_table']=1 ;
          if ($options['debug']) echo 'Будет создана временная таблица <strong>'.$viewer_name.'</strong><br>' ;
          $options['debug']=0 ;
          $this->create_viewer_personals_by_filter_set($viewer_name,$rec_filter['filter_set'],$options) ;
        }
        else $viewer_name='' ;
        return($viewer_name) ;
    }


    // создает вьювер на основании условий отбора сотрудников
    // $name - название вьювера
    // $filter_set - json_decode поле $ext_info из personals_filters
    function create_viewer_personals_by_filter_set($viewer_name,$filter_set=array(),$options=array())
    { include_once(_DIR_EXT.'/personal/report_personals_ids_by_filter.php');
      $report_obj=new report_personals_ids_by_filter();
      $report_obj->no_use_account_usl_select=1 ;

      $arr_sql=[] ; $arr_sql_count=[] ; $arr_info_filter=[] ; $info_filter='' ;
      // с вариантов no_filter_is_all и no_filter_is_space переходим к безальтернативному варианту
      //if (!_sizeof($filter_set))
      //{ if ($options['no_filter_is_all'])            $filter_set[]['all']=1 ;                          //нет условий отбора, надо взять всех - ЭТА ОПЦИЯ НЕ ИСПОЛЬЗУЕТСЯ
      //  if ($options['no_filter_is_space'])          $filter_set[]['space']=1 ;                        // нет условий отбора, список должен быть пустой
     // }
      if (!_sizeof($filter_set)) $filter_set[]['space']=1 ;                        // нет условий отбора, список должен быть пустой


      // новый формат храним фильтры в массиве personals
      $arr_left_join=[] ;
      if (_sizeof($filter_set)) foreach($filter_set as $indx=>$filter) if (sizeof($filter))
      { $report_obj->left_join=[] ;
        $report_obj->unions=[] ;
        $report_obj->filter=$filter ;
        $options['filter_indx']=$indx ; // передаем номер фильтра для разноса псевдонимов таблицы в будущем итоговом общем запросе
        $usl=$report_obj->create_usl_select_obj('',$options) ;
        $arr_sql_count[]=$report_obj->get_count_sql($usl) ;
        $arr_sql[]=$report_obj->get_select_sql($usl) ;
        $arr_info_filter[]=$report_obj->panel_info_filter();

        $arr_usl[]='('.$usl.')' ;
        if (_sizeof($report_obj->left_join)) $arr_left_join=array_merge($arr_left_join,$report_obj->left_join) ; // только для отладки

      } else if ($options['debug']) echo 'Передан пустой массив <strong>$filter_set</strong><br>' ;

      //damp_array($options);


      if ($options['debug'])
      {   foreach($arr_sql as $i=>$sql)
          { echo '<strong>Запрос '.($i+1).':</strong><br>'.nl2br($sql).'<br>' ;
            if ($options['check_count'])
            { $cnt=execSQL_value($arr_sql_count[$i]) ;
              echo 'По данному запросу будет получено <strong>'.$cnt.'</strong> записей<br>' ;
            }
            echo '<br>' ;
          }
      }

       if (_sizeof($arr_sql))
       { $sql=implode("\nUNION\n",$arr_sql) ;
         if ($options['view_viewer_sql']) echo nl2br($sql).'<br>' ;
         $info_filter=implode("\n",$arr_info_filter);
         if (!$options['read_only'])
         {
             if ($options['create_viewer']) SETUP()->create_viewer($viewer_name,$sql) ;
             if ($options['create_ids_table'])  SETUP()->create_ids_table($viewer_name,$sql) ;
             if ($options['create_temporary_table'])  SETUP()->create_temporary_table($viewer_name,$sql) ;

             if ($options['debug'])
              {   $cnt=execSQL_value('select count(*) from '.$viewer_name) ;
                  echo '<strong>'.$viewer_name.'</strong> - <strong>'.$cnt.'</strong> записей<br>' ;
              }

             // убираем из запроса поля активности ФЛ и СО
             $sql=str_replace(['and fl.enabled=1','and so.enabled=1'],'',$sql) ;

             // и создаем аналогичные вьюверы по всем сотрудникам, добавляя в название '_all'
             if ($options['create_viewer']) SETUP()->create_viewer($viewer_name.'_all',$sql) ;
             if ($options['create_ids_table'])  SETUP()->create_ids_table($viewer_name.'_all',$sql) ;
             if ($options['create_temporary_table'])  SETUP()->create_temporary_table($viewer_name.'_all',$sql) ;

             if ($options['debug'])
             {  $cnt=execSQL_value('select count(*) from '.$viewer_name.'_all') ;
                echo '<strong>'.$viewer_name.'_all'.'</strong> - <strong>'.$cnt.'</strong> записей<br>' ;
             }



         }
       }

        if ($options['debug'])
        {
            damp_array($arr_usl,1,-1);
            damp_array($arr_left_join,1,-1);
        }
        return($info_filter) ;
    }

    // создает вьювер на основании условий отбора сотрудников для переданных reffer объектов
    // $name - название вьювера
    // $ext_info поле $ext_info из мероприятия или группы
    // в отличии от функции create_viewer_personals_by_filter_set
    // в данной функции идет учет фильтров в родительских объектах

    function create_viewer_personals_by_reffers($viewer_name,$arr_reffers,$options=array())
    { include_once(_DIR_EXT.'/personal/report_personals_ids_by_filter.php');
      $report_obj=new report_personals_ids_by_filter();
      $report_obj->no_use_account_usl_select=1 ;


        $filter_sets=[] ;
        $this->get_personals_filter_to_items($arr_reffers,$filter_sets) ;
        if ($options['debug']) { ?><strong>filter_sets</strong><? print_2x_arr($filter_sets); }
        // собираем все правила, которые назначены группе и родитеским группа
        // и отправляем в отчет на сборку
        $indx=2 ; $arr_sql_inner_join=[] ;
        if (_sizeof($filter_sets)) foreach($filter_sets as $reffer=>$filter_set)
        {
           if (!_sizeof($filter_set))
              { if ($options['no_filter_is_all'])            $filter_set[]['all']=1 ;                          //нет условий отбора, надо взять всех
                if ($options['no_filter_is_space'])          $filter_set[]['space']=1 ;                        // нет условий отбора, список должен быть пустой
              }

           // новый формат храним фильтры в массиве personals
           $arr_sql_union=[] ;
            if (_sizeof($filter_set)) foreach($filter_set as $indx=>$filter)
            { $report_obj->filter=$filter ;
              $options['filter_indx']=$indx ; // передаем номер фильтра для разноса псевдонимов таблицы в будущем итоговом общем запросе
              $usl=$report_obj->create_usl_select_obj('',$options) ;
              $arr_sql_count[]=$report_obj->get_count_sql($usl) ;
              $arr_sql_union[]=$report_obj->get_select_sql($usl) ;
              //$arr_info_filter[$reffer][$indx]=$report_obj->panel_info_filter();
            }
            if (_sizeof($arr_sql_union)) $arr_sql_inner_join['t'.$indx]=implode("\nUNION\n",str_replace("\n","",$arr_sql_union)) ;

           $indx++ ;
        }
        //  damp_array($arr_sql_inner_join);
        $sql_all='select t1.pkey  from obj_site_personals t1 ' ;
        if (_sizeof($arr_sql_inner_join)) foreach($arr_sql_inner_join as $t=>$sql_inner_join) $sql_all.="\ninner join ($sql_inner_join) $t on $t.pkey=t1.pkey" ;
        $sql_all.="\nwhere t1.pkey>0" ;
        if (_sizeof($arr_sql_inner_join)) foreach($arr_sql_inner_join as $t=>$sql_inner_join) $sql_all.="\n and not $t.pkey is null" ;


      //damp_array($arr_sql_count);
      if ($options['debug']) {?><strong>$arr_sql_inner_join</strong><? damp_array($arr_sql_inner_join,1,-1);}
      if ($options['check_count'])
        { $sql_count=str_replace('select t1.pkey ','select count(t1.pkey)',$sql_all) ;
          $cnt=execSQL_value($sql_count) ;
          echo 'По данному запросу будет получено <strong>'.$cnt.'</strong> записей<br>' ;
        }

       if ($sql_all)
       { if ($options['view_viewer_sql'] or $options['debug']) echo nl2br($sql_all).'<br>' ;
         //$info_filter=implode("\n",$arr_info_filter);
         if (!$options['read_only'])
         {   if ($options['create_viewer']) SETUP()->create_viewer($viewer_name,$sql_all) ;
             if ($options['create_ids_table'])  SETUP()->create_ids_table($viewer_name,$sql_all) ;
             if ($options['create_temporary_table'])  SETUP()->create_temporary_table($viewer_name,$sql_all) ;

             if ($options['debug'])
             {   $cnt=execSQL_value('select count(*) from '.$viewer_name) ;
                 echo '<strong>'.$viewer_name.'</strong> - <strong>'.$cnt.'</strong> записей<br>' ;
             }

             // убираем из запроса поля активности ФЛ и СО
             $sql_all=str_replace(['and fl.enabled=1','and so.enabled=1'],'',$sql_all) ;

             // и создаем аналогичные вьюверы по всем сотрудникам, добавляя в название '_all'
             if ($options['create_viewer']) SETUP()->create_viewer($viewer_name.'_all',$sql_all) ;
             if ($options['create_ids_table'])  SETUP()->create_ids_table($viewer_name.'_all',$sql_all) ;
             if ($options['create_temporary_table'])  SETUP()->create_temporary_table($viewer_name.'_all',$sql_all) ;

             if ($options['debug'])
             {   $cnt=execSQL_value('select count(*) from '.$viewer_name.'_all') ;
                 echo '<strong>'.$viewer_name.'_all'.'</strong> - <strong>'.$cnt.'</strong> записей<br>' ;
             }


         }
       }
        ///return($info_filter) ;
    }



    function get_personals_filter_to_item($reffer,$filter_id=0)
    {   $rec=execSQL_van('select * from personals_filter where reffer="'.$reffer.'"') ;
        if ($rec['pkey'])
        {   $filter_set=json_decode($rec['ext_info'],true) ;
            if ($filter_id)
            {   $filter_indx=$filter_id-1 ;
                $filter=(isset($filter_set[$filter_indx]))? $filter_set[$filter_indx]:[];
                return($filter) ;
            }
            else return($filter_set) ;
        }
        return([]) ;
    }

    function get_personals_filter_rec_to_item($reffer)
    {   $rec=execSQL_van('select * from personals_filter where reffer="'.$reffer.'"') ;
        if ($rec['pkey'])
        {   $rec['filter_set']=json_decode($rec['ext_info'],true) ;
            $rec['viewer_name']=$rec['obj_name'] ;
        }
        return($rec) ;
    }

    function get_personals_filter_to_items($arr_reffers,&$filter_set)
    {   $_usl=[] ; $recs=[] ;
        if (_sizeof($arr_reffers)) foreach($arr_reffers as $reffer) $_usl[]="reffer='$reffer'" ;
        if (_sizeof($_usl)) $recs=execSQL('select * from personals_filter where '.implode(' or ',$_usl)) ;
        if (_sizeof($recs)) foreach($recs as $rec) $filter_set[$rec['reffer']]=json_decode($rec['ext_info'],true) ;
    }

    function get_personals_filter_recs_to_items($arr_reffers)
    {   $_usl=[] ; $recs=[] ;
        if (_sizeof($arr_reffers)) foreach($arr_reffers as $reffer) $_usl[]="reffer='$reffer'" ;
        if (_sizeof($_usl)) $recs=execSQL('select * from personals_filter where '.implode(' or ',$_usl),['indx'=>'reffer']) ;
        if (_sizeof($recs)) foreach($recs as $id=>$rec)
            { $recs[$id]['filter_set']=json_decode($rec['ext_info'],true) ;
              $recs[$id]['viewer_name']=$rec['obj_name'] ;
            }
        return($recs) ;
    }

    function get_personals_filter_all($usl='')
    {   $usl_select=($usl)? ' where '.$usl:'' ;
        $recs=execSQL('select * from personals_filter '.$usl_select) ;
        $filter_sets=[] ;
        if (_sizeof($recs)) foreach($recs as $rec) $filter_sets[$rec['reffer']]=json_decode($rec['ext_info'],true) ;
        return($filter_sets) ;
    }

    function get_personals_filter_info_to_item($reffer,$no_filter_info='')
    {
        $filter_set=$this->get_personals_filter_to_item($reffer) ;
        if (_sizeof($filter_set))
        { include_once(_DIR_EXT.'/personal/panel_personal_info.php') ;
          panel_personals_filter_info($filter_set);
        } else echo $no_filter_info ;

    }

    function get_personals_viewer_name_to_item($reffer)
    {   $rec=execSQL_van('select * from personals_filter where reffer="'.$reffer.'"') ;
        if ($rec['pkey'] and $rec['obj_name']) return($rec['obj_name']) ;
        else return('') ;
    }

    function get_personals_ext_info_to_item($reffer,$options=[])
    {   $ext_info=[] ;
        $rec=execSQL_van('select * from personals_filter where reffer="'.$reffer.'"',$options) ;
        if ($rec['pkey']) $ext_info=json_decode($rec['ext_info'],true) ;
        return($ext_info) ;
    }

    // содержимое ext_data не правиться - только добавляется и удаляется
    function save_personal_filter($reffer,$filter,$viewer_name='')
    {   $rec=execSQL_van('select * from personals_filter where reffer="'.$reffer.'"') ;
        $data=[] ; $filter_set=[] ;
        // для существущих записей имя вьювера берется из поля obj_name
        if ($rec['pkey'])
         { $filter_set=json_decode($rec['ext_info'],true) ;
           if (!$viewer_name) $viewer_name=$rec['obj_name'] ;
         }
        // добавляем новый фильтр в набор фильтров
        $filter_set[]=$filter ;
        // обеспечиваем уникальность условий
        //$filter_set=array_unique($filter_set) ;

        $data['clss']=220;
        $data['parent']=1;
        $data['reffer']=$reffer;
        $data['obj_name']=$viewer_name;
        $data['ext_info']=json_encode($filter_set,JSON_UNESCAPED_UNICODE) ;
        // сохраняем или длобавляем новую запись
        if ($rec['pkey']) update_rec_in_table('personals_filter',$data,'pkey='.$rec['pkey']) ;
        else              adding_rec_to_table('personals_filter',$data) ;
        // обновляем вьювер
        //echo '$viewer_name='.$viewer_name.'<br>' ;
        if ($viewer_name) $this->update_viewer_personals($viewer_name) ;

    }

    function remove_personal_filter($reffer,$filter_id)
    {   $filter_indx=$filter_id-1 ;
        $rec=execSQL_van('select * from personals_filter where reffer="'.$reffer.'"') ;
        if ($rec['pkey'])
        {   $filter_set=json_decode($rec['ext_info'],true) ;
            unset($filter_set[$filter_indx]) ;
            $data['ext_info']=json_encode($filter_set,JSON_UNESCAPED_UNICODE) ;
            update_rec_in_table('personals_filter',$data,'pkey='.$rec['pkey']) ;
            // если имя задано - обновляем вьювер
            if ($rec['obj_name']) $this->update_viewer_personals($rec['obj_name']) ;
            // никогда не удаляем запись для живого объекта из таблицы фильтров
            //{   if (_sizeof($filter_set)) $this->update_viewer_personals($rec['obj_name']) ;
            //    else                     $this->remove_viewer_personals($rec['obj_name']) ;
           // }
        }
    }

// пересоздание вьюверов сотрудников - указываем имя вьювера или шаблон
  function update_viewer_personals($viewer_pref)
  { $t=fixed_time() ;
    $options['debug']=0;
    $options['create_viewer']=1 ;  // create_viewer or create_ids_table
    $recs=execSQL('select * from personals_filter where obj_name like "'.$viewer_pref.'%"') ;
    if (_sizeof($recs)) foreach($recs as $rec)
    { $filter_set=json_decode($rec['ext_info'],1) ;
      $viewer_name=$rec['obj_name'] ;
      $options['event_id']=0 ;
      if (strpos($viewer_name,'view_personals_event_')!==false)
      { list($event_id,$tkey)=explode('.',$rec['reffer']) ;
        $options['event_id']=$event_id; // опция для report_personals
        $options['no_filter_is_space']=1;
	  }
      $this->create_viewer_personals_by_filter_set($viewer_name,$filter_set,$options) ;
    }
    fixed_time($t,'Создание вьюверов по сотрудникам для "'.$viewer_pref.'"') ;
  }

    function remove_viewer_personals($viewer_name)
    { execSQL_update('drop table if exists '.$viewer_name) ;
      execSQL_update('drop view if exists '.$viewer_name) ;
      execSQL_update('update personals_filter set obj_name="",ext_info="" where obj_name="'.$viewer_name.'"') ;
    }

    function show_personal_filter_db_info($reffer)
    {
        ?><h2>personals filter</h2><?
        $ext_info=$this->get_personals_ext_info_to_item($reffer,['debug'=>2]) ;
        print_2x_arr($ext_info);
    }

    function get_arr_filter_reffers()
    {
        $arr2=[] ;
        $arr_reffers=execSQL_line('select reffer from personals_filter') ;
        if (_sizeof($arr_reffers)) foreach($arr_reffers as $reffer)
        {
            list($pkey,$tkey)=explode('.',$reffer) ;
            $arr[$tkey][]=$pkey ;
        }
        //damp_array($arr);
        if (_sizeof($arr)) foreach($arr as $tkey=>$arr_ids)
        {   $table_name=_DOT($tkey)->table_name ;
            $obj_names=execSQL('select pkey,clss,obj_name from '.$table_name.' where pkey in ('.implode(',',$arr_ids).')') ;
            if (_sizeof($obj_names)) foreach($obj_names as $rec) $arr2[$rec['_reffer']]=_CLSS($rec['clss'])->name.' "'.$rec['obj_name'].'"' ;
        }
        //damp_array($arr2);
        return($arr2) ;
    }

     // подготавливает конструкцию left_join для отбора сотруднику по фильту объекта
     // будет использован cуществующий вьювер или создана временная таблица
     function  prepare_left_join_on_filter_reffer($reffer,&$left_join,$options=[])
     {   list($pkey,$tkey)=explode('.',$reffer) ;
         $t='t_'.$pkey ;
         $table_name=$this->get_viewer_name_by_filter_reffer($reffer,$options) ;
         if ($table_name) $left_join[$table_name]=['join'=>'left join '.$table_name.' '.$t.' on '.$t.'.pkey=fl.pkey','usl'=>'not '.$t.'.pkey is null'] ;
         return($table_name) ;
     }

     function  prepare_left_join_on_table($table_name,&$left_join,$primary_field='fl.pkey')
     {   $t=$table_name ;
         $left_join[$table_name]=['join'=>'left join '.$table_name.' on '.$t.'.pkey='.$primary_field,'usl'=>'not '.$t.'.pkey is null'] ;

     }

  function prepare_SQL_left_join($left_join,$unions=[])
  {   $arr_join=[] ; $arr_usl=[] ;
       // первый вариант, указываем в массиве unions только имена таблиц, которые надо сделать left join, при этом связи должны быть у всех таблиц одинаковык
      if (_sizeof($unions)) foreach($unions as $i=>$union_table)
      {   $t='ut'.$i ;
          $arr_join[]="\n".'left join '.$union_table.' '.$t.' on '.$t.'.pkey=fl.pkey'."\n" ;
          $arr_usl[]='not '.$t.'.pkey is null' ;
      }

      // второй вариант
      $arr_temp=[] ; // массив нужен для исключения попадание одинаковых подзапросов в основной запрос несколько раз
      if (_sizeof($left_join)) foreach($left_join as $item) if (!isset($arr_temp[$item['join']]))
      {  $arr_join[]=$item['join'] ; $arr_temp[$item['join']]=1 ;
         $arr_usl[]=$item['usl'] ;
      }

      $join_table=(_sizeof($arr_join))? implode("\n",$arr_join):'' ;
      $join_usl=(_sizeof($arr_usl))? ' and '.implode(' and ',$arr_usl):'' ;
      return([$join_table,$join_usl]) ;
  }




}
