<?
function PERSONAL_IMPORT(){ if (!is_object($GLOBALS['PERSONAL_IMPORT'])) $GLOBALS['PERSONAL_IMPORT']=new i_personal_import();return($GLOBALS['PERSONAL_IMPORT']);}
include_once(_DIR_TO_MODULES.'/engine/i_backgroup_process.php') ;
class i_personal_import  extends i_backgroup_process_exec
{
  var $db_debug=0;
  var $import_begin_time=0;
  var $read_only=0;
  var $full_update=0;

  var $arr_SOURCE_fields=array() ;
  var $arr_SOURCE_DB_fields=array() ;
  var $table_fz ;
  var $table_so ;
  var $source_action='' ;

  var $source_fnames=array('org_name'=>array('code'=>'Organizatsiya'),
                           'otdel_name'=>array('code'=>'PodrazdelenieNaimenovanie'),
                           'work_name'=>array('code'=>'DolzhnostNaimenovanie'),
                           'uid_fl'=>array('code'=>'FizicheskoeLitso'),
                           'uid_so'=>array('code'=>'Sotrudnik'),
                           'vz'=>array('code'=>'VidZanyatosti'),
                           'pol'=>array('code'=>'Pol'),
                           'dr'=>array('code'=>'DataRozhdeniya','is_data'=>1),
                           'du'=>array('code'=>'DataUvolneniya','is_data'=>1),

          ) ;

  function __construct()
  {  $this->table_fz=(MEMBER()->id)? 'temp_import_fl_'.MEMBER()->id:'temp_import_fl_'.date('d_m_Y_H_i_s');
     $this->table_so=(MEMBER()->id)? 'temp_import_so_'.MEMBER()->id:'temp_import_so_'.date('d_m_Y_H_i_s');

  }

	function connect_SOURCE($fname="")
  {
  }

  function defined_vars()
  {   define('ORG_NAME',$this->source_fnames['org_name']['code']) ;
      define('OTDEL_NAME',$this->source_fnames['otdel_name']['code']) ;
      define('WORK_NAME',$this->source_fnames['work_name']['code']) ;
      define('UID_FL',$this->source_fnames['uid_fl']['code']) ;
      define('UID_SO',$this->source_fnames['uid_so']['code']) ;
      define('VZ',$this->source_fnames['vz']['code']) ;
      define('DR',$this->source_fnames['dr']['code']) ;
      define('DU',$this->source_fnames['du']['code']) ;
      define('POL',$this->source_fnames['pol']['code']) ;
  }

 function parse_source_headers()
 {
 }


 function create_temp_tables()
 {   if (!_sizeof($this->arr_SOURCE_fields))
     {  execSQL_update('TRUNCATE TABLE '.$this->table_fz) ;
        execSQL_update('TRUNCATE TABLE '.$this->table_so) ;
        return ;
     }
     FILE_LOG()->append('create_temp_tables: start') ;

     execSQL_update('DROP TABLE  IF EXISTS '.$this->table_fz) ;
     execSQL_update('DROP TABLE  IF EXISTS '.$this->table_so) ;
     $fields=array() ;
     if (_sizeof($this->arr_SOURCE_fields)) foreach($this->arr_SOURCE_fields as $fname=>$len) $fields[]=$this->arr_SOURCE_DB_fields[$fname].' varchar('.$len.') DEFAULT ""' ;
     if (_sizeof($fields)) $str_fields=implode(', ',$fields) ;


     execSQL_update('CREATE TABLE  '.$this->table_fz.'  ('.$str_fields.' ,
                           personal_id int(11) DEFAULT 0,
                           obj_name varchar(255) DEFAULT "",
                           name1 varchar(255) DEFAULT "",
                           name2 varchar(255) DEFAULT "",
                           name3 varchar(255) DEFAULT "",
                           dr varchar(10) DEFAULT "",
                           poll varchar(10) DEFAULT "",
                           PRIMARY KEY ('.UID_FL.'),
                           key ('.UID_SO.'),
                           key ('.VZ.'),
                           key (personal_id)
                         ) ENGINE = InnoDB DEFAULT CHARSET=utf8',array('debug'=>0)) ;
     execSQL_update('CREATE TABLE  '.$this->table_so.'  ('.$str_fields.' ,
                           obj_name varchar(255) DEFAULT "",
                           worker_id int(11)  DEFAULT 0,
                           personal_id int(11) DEFAULT 0,
                           org_id int(11)  NULL DEFAULT 0,
                           otdel_id int(11)  NULL DEFAULT 0,
                           work_id int(11) DEFAULT 0,
                           is_main int(1) DEFAULT 0,
                           is_second int(1) DEFAULT 0,
                           fired_data int(11) DEFAULT 0,
                           PRIMARY KEY ('.UID_SO.'),
                           key ('.UID_FL.'),
                           key ('.VZ.'),
                           key (worker_id),
                           key (personal_id),
                           key (org_id),
                           key (otdel_id),
                           key (work_id)
                           
                         ) ENGINE = InnoDB DEFAULT CHARSET=utf8',array('debug'=>0)) ;

     $this->flog_append('create_temp_tables') ;
     FILE_LOG()->append('create_temp_tables: end') ;
 }

 // пересим данные из ИСТОЧНИКА в таблицу soap_xml_block в формате "как есть"
  function parse_SOURCE_to_DB()
  {
  }

  // формируем на основании '.$this->table_so.' таблицу сотрудников уже с указателями на сушности ESMO
  function sync_TEMP_DB_ESMO()
  {  FILE_LOG()->append('sync_TEMP_DB_ESMO: start') ;
     $this->flog_append('Начинаем синхронизировать загруженные данные с таблицами ЭСМО [sync_TEMP_DB_ESMO]') ;
     $this->flog_append('Заполяем org_id в '.$this->table_so) ;
     $cnt=execSQL_update('update '.$this->table_so.' set org_id=(select pkey from obj_site_personals where clss=207 and obj_name='.ORG_NAME.' order by pkey limit 1);') ;
     $this->flog_append('Заполяем org_id в '.$this->table_so.' - заполено '.$cnt.' строк') ;
     ?><strong>Анализ организаций</strong><br><?
     echo 'Записей с существующими организациями: <strong>'.$cnt.'</strong><br>';
     $recs=execSQL_line('select DISTINCT('.ORG_NAME.') from '.$this->table_so.' where org_id=0 or org_id is null') ;
     $this->flog_append('Найдено '._sizeof($recs).' новых организаций') ;
     $read_only_status=($this->read_only)? ' <span class="red">READ ONLY</span>':'' ;
     if (_sizeof($recs))
     { foreach($recs as $org_name)
       { if (!$this->read_only) PERSONAL()->create_org(array('obj_name'=>$org_name)) ;
         echo '<div class="green">Добавлена организация <strong>"'.$org_name.'"</strong>'.$read_only_status.'</div>' ;
         $this->flog_append('Добавлена организация:'.$org_name) ;
       }
       $this->flog_append('Заполяем org_id в '.$this->table_so) ;
       $cnt=execSQL_update('update '.$this->table_so.' set org_id=(select pkey from obj_site_personals where clss=207 and obj_name='.ORG_NAME.'  order by pkey limit 1);') ;
       $this->flog_append('Заполяем org_id в '.$this->table_so.' - заполено '.$cnt.' строк') ;
       echo 'Обновлены  <strong>'.$cnt.'</strong> cтрок с новыми организациями<br>' ;
     }

     ?><strong>Анализ подразделений</strong><br><?
      //CASE WHEN t2.fired_data>t3.fired_data THEN t2.fired_data ELSE t3.fired_data END
     $this->flog_append('Заполяем otdel_id в '.$this->table_so) ;
     $cnt=execSQL_update('update '.$this->table_so.' set otdel_id=(select pkey from obj_site_personals where clss=208 and parent=org_id and obj_name='.OTDEL_NAME.' order by pkey limit 1);') ;
     $this->flog_append('Заполяем otdel_id в '.$this->table_so.' - заполено '.$cnt.' строк') ;
     echo 'Записей с существующими подразделениями: <strong>'.$cnt.'</strong><br>';

     $recs=execSQL('select DISTINCT(CONCAT(org_id,'.OTDEL_NAME.')),org_id,'.OTDEL_NAME.' from '.$this->table_so.' where '.OTDEL_NAME.'!="" and (otdel_id=0 or otdel_id is null)',0,1) ;
     $this->flog_append('Найдено '._sizeof($recs).' новых подразделений') ;
     if (_sizeof($recs))
     { foreach($recs as $rec)
       { if (!$this->read_only) PERSONAL()->create_otdel($rec['org_id'],array('obj_name'=>$rec[OTDEL_NAME])) ;
         echo '<div class="green">Добавлено подразделение <strong>"'.$rec[OTDEL_NAME].'"</strong>'.$read_only_status.'</div>' ;
         $this->flog_append('Добавлено подразделение:'.$rec[OTDEL_NAME]) ;
       }
       $this->flog_append('Заполяем otdel_id в '.$this->table_so) ;
       $cnt=execSQL_update('update '.$this->table_so.' set otdel_id=(select pkey from obj_site_personals where clss=208 and parent=org_id and obj_name='.OTDEL_NAME.' order by pkey limit 1);') ;
       $this->flog_append('Заполяем otdel_id в '.$this->table_so.' - заполено '.$cnt.' строк') ;
       echo 'Обновлены  <strong>'.$cnt.'</strong> cтрок с новыми подразделениями<br>' ;
     }

     //echo 'Записей с существующими подразделениями: <strong>'.$cnt.'</strong><br>';
     //_IL('IL_works')->reload_list() ;
     //print_2x_arr(_IL('IL_works')->recs) ;
     ?><strong>Анализ должностей</strong><br><?
     $cnt=execSQL_update('update '.$this->table_so.' set work_id=(select id from obj_site_list where clss=20 and parent='._IL('IL_works')->list_id.' and obj_name='.WORK_NAME.' limit 1) where '.WORK_NAME.'!=""',array('debug'=>0)) ;

     echo 'Записей с существующими должностями: <strong>'.$cnt.'</strong><br>';
      $recs=execSQL('select DISTINCT('.WORK_NAME.') from '.$this->table_so.' where (work_id=0 or work_id is null) and '.WORK_NAME.'!=""',0,1) ;
      if (_sizeof($recs))
      { foreach($recs as $rec)
        { if (!$this->read_only)  _IL('IL_works')->get_id_of_value(trim($rec[WORK_NAME]),array('append_value_is_not_found'=>1)) ;
          echo '<div class="green">Добавлена должность <strong>"'.$rec[WORK_NAME].'"</strong>'.$read_only_status.'</div>' ;
        }
        $cnt=execSQL_update('update '.$this->table_so.' set work_id=(select id from obj_site_list where clss=20 and parent='._IL('IL_works')->list_id.' and obj_name='.WORK_NAME.' limit 1)  where '.WORK_NAME.'!=""') ;
        echo 'Обновлены  <strong>'.$cnt.'</strong> cтрок с новыми должностями<br>' ;
      }

     ?><strong>Анализ физических лиц</strong><br><?
     $cnt=execSQL_update('update '.$this->table_fz.' set personal_id=(select pkey from obj_site_personals where clss=211 and uid='.UID_FL.' limit 1);') ;
     echo 'Физические лица, найдено записей: <strong>'.$cnt.'</strong><br>';
      $recs=execSQL('select '.UID_FL.',obj_name,name1,name2,name3,dr from '.$this->table_fz.' where (personal_id=0 or personal_id is null)',0,1) ;
      if (_sizeof($recs))
      { foreach($recs as $i=>$rec)
        { $person['obj_name']=$rec['obj_name'] ;
          $person['name1']=$rec['name1'] ;
          $person['name2']=$rec['name2'] ;
          $person['name3']=$rec['name3'] ;
          $person['dr']=$rec['dr'] ;
          $person['uid']=$rec[UID_FL] ;
          $person['pol']=$rec['poll'] ;
          if (!$this->read_only) PERSONAL()->personal_create($person) ;
          $this->flog_append('Создано физическое лицо, '.$i.' из '._sizeof($recs)) ;
          echo '<div class="green">Физическое лицо, добавлена запись <strong>"'.$rec['obj_name'].'"</strong>'.$read_only_status.'</div>' ;
        }
        $cnt=execSQL_update('update '.$this->table_fz.' set personal_id=(select pkey from obj_site_personals where clss=211 and uid='.UID_FL.' limit 1);') ;
        echo 'Физические лица, связано записей между '.$this->table_fz.' и obj_site_personals по personal_id: <strong>'.$cnt.'</strong><br>';
      }

      // ищем сотрудников с изменившимися реквизитами
      // внимание! проверить выборку при разных комбинациях fired_data, fired_data2, enabled, fired_data_pause
      // и при разных комбинациях статуса совмещения сотрудника (только основная, основная+совмещение, только совмещение)
      // и при разных комбинациях передачи данных ищ ЗУП (только основная, основная+совмещение, только совмещение)
      $recs=execSQL('select t1.'.UID_FL.' as uid,t1.personal_id,
                            t1.obj_name,t2.obj_name as old_obj_name,
                            t1.name1,t2.name1 as old_name1,
                            t1.name2,t2.name2 as old_name2,
                            t1.name3,t2.name3 as old_name3,
                            t1.dr,t2.dr as old_dr,
                            t1.poll,t2.pol as old_pol
               from '.$this->table_fz.' t1
               left join obj_site_personals t2 on t2.pkey=t1.personal_id
               where t1.obj_name!=t2.obj_name or t1.name1!=t2.name1 or t1.name2!=t2.name2 or t1.name3!=t2.name3 or t1.dr!=t2.dr or t1.poll!=t2.pol'
              ,0,1) ;
      echo 'Физические лица, изменено записей: <strong>'._sizeof($recs).'</strong><br>';
      //if (_sizeof($recs)) print_2x_arr($recs) ;
      if (_sizeof($recs)) foreach($recs as $i=>$rec)
        {   $person=array() ;
            $person['obj_name']=$rec['obj_name'] ;
            $person['name1']=$rec['name1'] ;
            $person['name2']=$rec['name2'] ;
            $person['name3']=$rec['name3'] ;
            $person['dr']=$rec['dr'] ;
            $person['pol']=$rec['poll'] ;

            echo '<div class="green">Физическое лицо <strong>'.$rec['obj_name'].'</strong>, сохранены изменения ['.$rec['uid'].']'.$read_only_status.'</div>' ;

            PERSONAL()->personal_save($rec['personal_id'],$person,array('show_changes'=>1,'read_only'=>$this->read_only,'source_action'=>$this->source_action)) ;
            $this->flog_append('Изменены данные физического лица, '.$i.' из '._sizeof($recs)) ;
        }

      $cnt=execSQL_update('update '.$this->table_so.' set personal_id=(select pkey from obj_site_personals where clss=211 and uid='.UID_FL.' limit 1);') ;


      ?><strong>Анализ сотрудников</strong><br><?
      // отрабатываем операцию изменения в 1С GUID сотрудника - у них это обычная практика
      // вносит ограничение в базу - только одна должность по совмещению
      // надо найти дубликаты сотрудников организаций по всем полям, кроме UID
      // найденные записи в ЭСМО - меняем GUID сотрудника
      // wl - table_so - таблица импортированных СО
      // fl - table_fz - таблица импортированных ФЛ
      // ws - obj_site_workers  - таблица СО ЭСМО
      $recs=execSQL('select wl.*,ws.pkey as working_pkey,ws.uid as working_uid 
                     from '.$this->table_so.' wl
                     left join obj_site_workers ws on ws.personal_id=wl.personal_id and ws.uid!=wl.'.UID_SO.' and ((ws.is_main=wl.is_main) or (ws.is_second=wl.is_second))
                     where not ws.pkey is null
                    ',0,1)  ;
      if (_sizeof($recs)) foreach($recs as $rec)
      {  if (!$this->read_only) $cnt=execSQL_update('delete from obj_site_workers where personal_id='.$rec['personal_id'].' and uid="'.$rec[UID_SO].'"',array('debug'=>0)) ;
         else                   $cnt=execSQL_update('select count(pkey) from obj_site_workers where personal_id='.$rec['personal_id'].' and uid="'.$rec[UID_SO].'"',array('debug'=>0)) ;
         if ($cnt) echo '<span class="red">! Удалены дубликаты СО </span>['.$rec[UID_SO].'] для ФЛ <a href="/cab/personal/person/'.$rec['personal_id'].'/" class="new_window">'.$rec['obj_name'].'</a> '.$read_only_status.'<br>' ;
         PERSONAL()->worker_save($rec['working_pkey'],array('uid'=>$rec[UID_SO],'read_only'=>$this->read_only,'source_action'=>$this->source_action)) ;
         echo '<span class="red">! Изменен UID СО </span>'.$rec['working_uid'].' => '.$rec[UID_SO].'] для ФЛ <a href="/cab/personal/person/'.$rec['personal_id'].'/" class="new_window">'.$rec['obj_name'].'</a>'.$read_only_status.'<br>' ;
      }

     $cnt=execSQL_update('update '.$this->table_so.' set worker_id=(select pkey from obj_site_workers where clss=212 and uid='.UID_SO.' limit 1);') ;
     echo 'Сотрудники организаций, найдено записей: <strong>'.$cnt.'</strong><br>';
      $recs=execSQL('select wl.'.UID_SO.',wl.'.UID_FL.',wl.org_id,wl.otdel_id,wl.work_id,fl.personal_id,wl.'.VZ.',wl.fired_data,fl.obj_name
                     from '.$this->table_so.' wl
                     left join '.$this->table_fz.' fl on fl.'.UID_FL.'=wl.'.UID_FL.' 
                     where (worker_id=0 or worker_id is null)',0,1) ;
      echo 'Сотрудники организаций, будет добавлено записей: <strong>'._sizeof($recs).'</strong><br>';
      if (_sizeof($recs))
      {  //print_2x_arr($recs) ;
         foreach($recs as $i=>$rec) //if (!$rec['fired_data'])
        { //echo 'Добавляем '.$rec['personal_id'].'<br>' ;
          $person['personal_id']=$rec['personal_id'] ;
          $person['fired_data_pause']=0 ;
          $person['enabled']=1 ;
          $person['uid']=$rec[UID_SO] ;
          $person['otdel_id']=$rec['otdel_id'] ;
          $person['org_id']=$rec['org_id'] ;
          $person['work_id']=$rec['work_id'] ;
          //if ($rec['fired_data']) $person['fired_data']=$rec['fired_data'] ;
          $person['is_main']=($rec[VZ]==MAIN_WORK_NAME)? 1:0 ;
          $person['is_second']=($rec[VZ]==MAIN_WORK_NAME)? 0:1 ;
          //damp_array($person,1,-1) ;
          if (!$this->read_only) PERSONAL()->worker_create($person,array('no_return_id'=>1,'read_only'=>$this->read_only)) ;
          $this->flog_append('Создан сотрудник организации, '.$i.' из '._sizeof($recs)) ;
          $work_type='';
          if ($person['is_main']) $work_type='основная должность' ;
          if ($person['is_second']) $work_type='должность по совмещению' ;

          echo '<div class="green">Сотрудник организации <strong>'.$rec['obj_name'].'</strong>, <strong>'.$work_type.'</strong>, добавлена запись в таблицу сотрудников организаций '.$read_only_status.'</div>' ;
        }
        $cnt=execSQL_update('update '.$this->table_so.' set worker_id=(select pkey from obj_site_workers where clss=212 and uid='.UID_SO.' limit 1);') ;
        //echo 'Обновлены  <strong>'.$cnt.'</strong> cтрок с новыми сотрудниками<br>' ;
        //echo 'Сотрудники организации, связано записей между '.$this->table_fz.' и obj_site_personals по personal_id: <strong>'.$cnt.'</strong><br>';
      }


      // ищем сотрудников с изменившимися реквизитами
      // внимание! проверить выборку при разных комбинациях fired_data, fired_data2, enabled, fired_data_pause
      // и при разных комбинациях статуса совмещения сотрудника (только основная, основная+совмещение, только совмещение)
      // и при разных комбинациях передачи данных ищ ЗУП (только основная, основная+совмещение, только совмещение)
      //execSQL('select * from '.$this->table_so.'',2) ;

      $recs=execSQL('select t1.'.UID_SO.' as uid,
                            t1.personal_id,t2.pkey as worker_id,t3.obj_name as worker_name,
                            t1.fired_data,t2.fired_data_pause,t2.enabled,
                            t1.org_id,t2.parent2 as old_org_id,
                            t1.otdel_id,t2.parent3 as old_otdel_id,
                            t1.work_id,t2.work_id as old_work_id,
                            t1.is_main,t2.is_main as old_is_main,
                            t1.is_second,t2.is_second as old_is_second
               from '.$this->table_so.' t1
               left join obj_site_workers t2 on t2.pkey=t1.worker_id
               left join obj_site_personals t3 on t3.pkey=t2.personal_id
               where t2.parent2!=t1.org_id or 
                     t2.parent3!=t1.otdel_id or 
                     t2.work_id!=t1.work_id or 
                     t2.is_main!=t1.is_main or 
                     t2.is_second!=t1.is_second or 
                     t2.fired_data!=t1.fired_data or 
                     (t1.fired_data>0 and t1.fired_data<='.time().' and t2.fired_data_pause=0 and t2.enabled=1) or '. // по ЗУП уволен, по ЭСМО - активнен и нет отложенного увольнения
                    '(t1.fired_data=0 and (t2.fired_data>0 or t2.enabled=0))' // по ЗУП не уволен, по ЭСМО - уволен или отложенное увольнение
              ,0,1) ;
      //exit ;
      echo 'Сотрудники организаций, найдено измененных записей: <strong>'._sizeof($recs).'</strong><br>';
      //if (_sizeof($recs)) print_2x_arr($recs) ;
      if (_sizeof($recs)) foreach($recs as $i=>$rec)
        {   $person=array() ;
            $person['is_main']=$rec['is_main'] ;
            $person['is_second']=$rec['is_second'] ;
            $person['otdel_id']=$rec['otdel_id'] ;
            $person['org_id']=$rec['org_id'] ;
            $person['work_id']=$rec['work_id'] ;
            $person['fired_data']=($rec['fired_data'])?:0 ;
            $person['fired']=($rec['fired_data']>0 and $rec['fired_data']<=time())? 1:0 ;
            //echo 'Fired_data='.date('d.m.Y H:i:s',$rec['fired_data']).'<br>' ;
            $work_type='' ;
            if ($person['is_main']) $work_type='основной должности' ;
            if ($person['is_second']) $work_type='должности по совмещению' ;
            echo '<div class="green">Сотрудник организации <strong>'.$rec['worker_name'].'</strong>, сохранены изменения для <strong>'.$work_type.'</strong> ['.$rec['uid'].'] '.$read_only_status.'</div>' ;

            $update_result=PERSONAL()->worker_save($rec['worker_id'],$person,array('show_changes'=>1,'read_only'=>$this->read_only,'source_action'=>$this->source_action)) ;
            $this->flog_append('Изменены данные сотрудника организации, '.$i.' из '._sizeof($recs)) ;
        }

      if (_sizeof($recs)) ENGINE()->on_event('workers_changed_records',array('from'=>'personal_import','recs'=>$recs)) ;

      execSQL_update('update obj_site_workers set job_data=c_data where job_data is null') ;

      $this->flog_append('sync_TEMP_DB_ESMO') ;
      FILE_LOG()->append('sync_TEMP_DB_ESMO: end') ;
  }

  // синхронизация текущего списка сотрудник и персон
  // проходим по списку сотрудников (obj_site_workers, в зависимости от типа совмещения проставляем данные в obj_site_personals)
  function sync_workings_persons()
  {   FILE_LOG()->append('sync_workings_persons: start') ;
      // выгрузка - полное обновление, необхоодимо перевести в отложенное увольнение всех, кого нет в ней
        if ($this->full_update)
        {   $debug_db=1 ;
            $cnt=(int)$GLOBALS['LS_fired_pause_max_count'] ;
            $limit=($cnt)? 'limit '.$cnt:'' ;
            ?><strong>Производим отложенное увольнение лиц, отсутствующих в полной выгрузке</strong><br><?
           // id сотрудников организации е
           //$cnt_workers=execSQL_value('select count(pkey) from obj_site_workers where clss=212 and not personal_id in (select personal_id from '.$this->table_fz.') and enabled=1 and fired_data_pause=0') ;
           //$ids_workers=execSQL_line('select pkey from obj_site_workers where clss=212 and not personal_id in (select personal_id from '.$this->table_fz.')  and enabled=1 and fired_data_pause=0 '.$limit) ;
           $cnt_workers=execSQL_value('select count(pkey) from obj_site_workers where not pkey in (select worker_id from '.$this->table_so.') and enabled=1 and fired_data_pause=0') ;
           $ids_workers=execSQL_line('select t1.pkey 
                                      from obj_site_workers t1
                                      left join '.$this->table_so.' t2 on t2.worker_id=t1.pkey
                                      where t2.worker_id is null and t1.enabled=1 and ((t1.fired_data_pause=0 and t1.fired_data=0) or (t1.fired_data>0 and t1.fired_data<='.time().')) '.$limit) ;
           if (_sizeof($ids_workers))echo 'Будет выполнено отложенное увольнение для <strong>'._sizeof($ids_workers).' из '.$cnt_workers.'</strong> сотрудников организаций, которые отсутствует в импорте<br>' ;

           $cnt_personals=execSQL_value('select count(t1.pkey) 
                                         from obj_site_personals t1 
                                         where t1.clss=211 and not t1.pkey in (select personal_id from '.$this->table_fz.') and 
                                         not t1.pkey in (select personal_id from obj_site_workers) and t1.enabled=1 and t1.fired_data_pause=0 ') ;

           $ids_personals=execSQL_line('select t1.pkey 
                                        from obj_site_personals t1
                                        where t1.clss=211 and not t1.pkey in (select personal_id from '.$this->table_fz.') and 
                                        not t1.pkey in (select personal_id from obj_site_workers)   and t1.enabled=1 and fired_data_pause=0 '.$limit) ;
           if (_sizeof($ids_personals)) echo 'Будет выполнено отложенное увольнение для <strong>'._sizeof($ids_personals).' из '.$cnt_personals.'</strong> физических лиц, у которых отсутствуют данные по сотруднику организации<br>' ;
           if (!_sizeof($ids_workers) and !_sizeof($ids_personals)) echo 'В полной выгрузке присутствуют все сотрудники, увольнение не требуется<br>' ;

           if (!$this->read_only and _sizeof($ids_workers)) foreach($ids_workers as $worker_id) PERSONAL()->worker_save($worker_id,array('fired'=>1),array('show_changes'=>1,'source_action'=>$this->source_action)) ;
           if (!$this->read_only and _sizeof($ids_personals)) foreach($ids_personals as $personal_id) PERSONAL()->personal_save($personal_id,array('fired'=>1),array('show_changes'=>1,'source_action'=>$this->source_action)) ;
        }


   if (!$this->read_only)
   {
      // увольняем ФЛ, у которых только одна основная должность и она уволена
    execSQL_update('update obj_site_personals t1 
                    left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_main=1 and t2.enabled=0
                    set t1.enabled = 0, 
                        t1.fired_data_pause=0,
                        t1.fired_data = t2.fired_data
                    where t1.person_status=1 and t2.personal_id>0') ;
   // увольняем ФЛ, у которых только одна должность по совмещению и она уволена
    execSQL_update('update obj_site_personals t1 
                    left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_second=1 and t2.enabled=0
                    set t1.enabled = 0, 
                        t1.fired_data_pause=0,
                        t1.fired_data = t2.fired_data
                    where t1.person_status=3 and t2.personal_id>0') ;
   // увольняем ФЛ, у которых все должности в статус уволен
    execSQL_update('update obj_site_personals t1 
                    left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_main=1 and t2.enabled=0
                    left join obj_site_workers t3 on t3.personal_id=t1.pkey and t3.is_second=1 and t3.enabled=0 
                    set t1.enabled = 0, 
                        t1.fired_data_pause=0,
                        t1.fired_data = CASE WHEN t2.fired_data>t3.fired_data THEN t2.fired_data ELSE t3.fired_data END
                    where t1.person_status=2 and t2.personal_id>0 and t3.personal_id>0') ;

    // восстанавливаем ФЛ, у которых хотябы  одна должность и она активна
    execSQL_update('update obj_site_personals t1 
                    left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.enabled=1
                    set t1.enabled = 1, 
                        t1.fired_data_pause=0,
                        t1.fired_data = 0
                    where t2.personal_id>0') ;

    // актуализируем содержимое поля person_status после данных по уволнению
    execSQL_update('update obj_site_personals t1 set workings_count=-1 where clss=211',0) ;
    execSQL_update('update obj_site_personals t1 set person_status=0,workings_count=(select count(pkey) from obj_site_workers where personal_id=t1.pkey and enabled=1) where clss=211 and pkey in (select distinct(personal_id) from obj_site_workers)',0) ;
    execSQL_update('update obj_site_personals t1 set main_count=(select count(pkey) from obj_site_workers where personal_id=t1.pkey and is_main=1  and enabled=1) where clss=211',0) ;
    execSQL_update('update obj_site_personals t1 set second_count=(select count(pkey) from obj_site_workers where personal_id=t1.pkey and is_second=1 and enabled=1) where clss=211',0) ;
    execSQL_update('update obj_site_personals t1 set person_status=1 where clss=211 and main_count=1 and second_count=0',0) ; // только основная должность
    execSQL_update('update obj_site_personals t1 set person_status=2 where clss=211 and main_count=1 and second_count>0',0) ; // основная должность и совмещение
    execSQL_update('update obj_site_personals t1 set person_status=3 where clss=211 and main_count=0 and second_count>0',0) ; // только совмещение
    // переносим данные по организации, подраздление, должности в персоны, которые работают только по основной должности
     execSQL_update('update obj_site_personals t1 
                     left join obj_site_workers t2 on t2.personal_id=t1.pkey  and t2.is_main=1 and t2.enabled=1
                     set t1.parent=t2.parent,
                         t1.parent1=t2.parent1,
                         t1.parent2=t2.parent2,
                         t1.parent3=t2.parent3,
                         t1.parent4=t2.parent4,
                         t1.parent5=t2.parent5,
                         t1.parent6=t2.parent6,
                         t1.parent7=t2.parent7,
                         t1.parent8=t2.parent8,
                         t1.parent9=t2.parent9,
                         t1.working=t2.work_id,
                         t1.working2=0
                     where t1.person_status=1 and t2.personal_id>0',0) ;
    // переносим данные по организации, подраздление, должности в персоны, которые работают только по совмещению
     execSQL_update('update obj_site_personals t1 
                     left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_second=1 and t2.enabled=1
                     set t1.parent=t2.parent,
                         t1.parent1=t2.parent1,
                         t1.parent2=t2.parent2,
                         t1.parent3=t2.parent3,
                         t1.parent4=t2.parent4,
                         t1.parent5=t2.parent5,
                         t1.parent6=t2.parent6,
                         t1.parent7=t2.parent7,
                         t1.parent8=t2.parent8,
                         t1.parent9=t2.parent9,
                         t1.working=0,
                         t1.working2=t2.work_id
                     where t1.person_status=3 and t2.personal_id>0',0) ;
    // переносим данные по организации, подраздление, должности в персоны, которые работают по основой должности и по совмещению
     execSQL_update('update obj_site_personals t1 
                     left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_main=1 and t2.enabled=1
                     left join obj_site_workers t3 on t3.personal_id=t1.pkey and t3.is_second=1 and t3.enabled=1 
                     set t1.parent=t2.parent,
                         t1.parent1=t2.parent1,
                         t1.parent2=t2.parent2,
                         t1.parent3=t2.parent3,
                         t1.parent4=t2.parent4,
                         t1.parent5=t2.parent5,
                         t1.parent6=t2.parent6,
                         t1.parent7=t2.parent7,
                         t1.parent8=t2.parent8,
                         t1.parent9=t2.parent9,
                         t1.working=t2.work_id,
                         t1.working2=t3.work_id
                     where t1.person_status=2 and t2.personal_id>0 and t3.personal_id>0',0) ;
     // ставим для ФЛ, у которых основная должность под отложенным увольнением в статус отложенного увольнения
      execSQL_update('update obj_site_personals t1 
                      left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_main=1 and t2.enabled=1
                      set t1.fired_data_pause = CASE WHEN t2.fired_data_pause>0 THEN t2.fired_data_pause ELSE 0 END
                      where t1.person_status=1 and t2.personal_id>0') ;
     // ставим для ФЛ, у которых совмещаемая должность под отложенным увольнением в статус отложенного увольнения
      execSQL_update('update obj_site_personals t1 
                      left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_second=1 and t2.enabled=1
                      set t1.fired_data_pause = CASE WHEN t2.fired_data_pause>0 THEN t2.fired_data_pause ELSE 0 END
                      where t1.person_status=3 and t2.personal_id>0') ;
     // ставим для ФЛ, у которых все активные должности под отложенным увольнением в статус отложенного увольнения, время выбираем более позднее из двух
      execSQL_update('update obj_site_personals t1 
                      left join obj_site_workers t2 on t2.personal_id=t1.pkey and t2.is_main=1 and t2.enabled=1
                      left join obj_site_workers t3 on t3.personal_id=t1.pkey and t3.is_second=1 and t3.enabled=1 
                      set t1.fired_data_pause = CASE WHEN t2.fired_data_pause>0 and t3.fired_data_pause>0 THEN IF(t2.fired_data_pause>t3.fired_data_pause, t2.fired_data_pause, t3.fired_data_pause) ELSE 0 END
                      where t1.person_status=2 and t2.personal_id>0 and t3.personal_id>0') ;

   }

      if (_sizeof($GLOBALS['personals_changes']))
      {   ?><h2>Отчет по изменениям</h2><?
          print_2x_arr($GLOBALS['personals_changes']) ;
      }
      else echo '<strong class=green>Изменений не произведено</strong>' ;
      $this->flog_append('sync_workings_persons') ;
      FILE_LOG()->append('sync_workings_persons: end') ;
  }


    function insert_arr_to_db($table_fields,$arr)
    {   $sql='REPLACE INTO '.$this->table_fz.' ('.$table_fields.') VALUES '.implode(', ',$arr).';' ;
        execSQL_update($sql,array('debug'=>0)) ;
        $sql='REPLACE INTO '.$this->table_so.' ('.$table_fields.') VALUES '.implode(', ',$arr).';' ;
        execSQL_update($sql,array('debug'=>0)) ;
    }

    function check_db_fields_names($text)
    {  $text=trim($text) ;
       $text=stripslashes($text) ;
       $text=strip_tags($text) ;
       $text=translit($text) ;
       //$text=iconv('utf-8','ASCII//TRANSLIT',$text) ;
       // удаляем вредные символы

       $text=str_replace(array("\\",'/','"',"'",'`',',','.','+','?','&','#','%','<','>','-','(',')','=','!','[',']',']'),'',$text) ;
       $text=trim($text) ;
       // заменяем подряд следующие пробелы ( в том числе переносы строк и табуляторы) на символ-заменитель пробела
       $text=preg_replace('/\s+/','_',$text) ;
       $text=preg_replace('/\-+/','_',$text) ;
       //echo  $text.'<br>' ;

       return($text) ;
    }

    function sync_images_to_upload()
    {   ?><br><strong>Проверяем изображение для загрузки</strong><br><?
        $recs=execSQL('select t1.personal_id,t1.image_name,t2._image_name as image_name_old,t1.Images_url
               from '.$this->table_fz.' t1
               left join obj_site_personals t2 on  t2.clss=211 and t2.pkey=t1.personal_id
               where t2._image_name!=t1.image_name and t1.image_name!=""
               ',0,1) ;
        if (_sizeof($recs)) foreach($recs as $rec)
        {  $data[$rec['personal_id']]['upl_img']['url'][]=$rec['Images_url'] ;
           //damp_array($data,1,-1) ;
           update_rec_in_table('obj_site_personals',$data[$rec['personal_id']],'pkey='.$rec['personal_id']) ;
           echo 'Поставлено фото сотрудника <strong>'.$rec['image_name'].'</strong> в очередь загрузки<br>' ;
        } else echo 'Изображений для загрузки нет' ;
    }

    function personal_update_levels_parents()
    {
       FILE_LOG()->append('update_levels_parents PERSONAL: start') ;
       PERSONAL()->update_levels_parents() ;
       FILE_LOG()->append('update_levels_parents PERSONAL: start') ;

    }

    function workers_update_levels_parents()
    {
       FILE_LOG()->append('update_levels_parents WORKERS: start') ;
       PERSONAL()->update_levels_parents();
       FILE_LOG()->append('update_levels_parents WORKERS: start') ;

    }

    function flog_append($text)
    {
      FILE_LOG()->append($text);
    }

}

?>
