<?
// включение плагина на /cab/setting/moduls/
// код для вывода
// $this->form_checkbox_left('<strong>opo</strong>','Модуль распознования по лицу','IS[plugins][opo]',$GLOBALS['_SETTING']['plugins']['opo'],'i_opo') ;

function OPO() {if (is_object($GLOBALS['opo_plugin'])) return($GLOBALS['opo_plugin']);$GLOBALS['opo_plugin']=new i_opo();return($GLOBALS['opo_plugin']);} ;

class i_opo
{

	var $arr_status=array(0=>'',
                         1=>'Не направлен на ОПО',
                         2=>'Подлежит ОПО',
                         //22=>'Идет подготовка документов',
                         //3=>'Документы подготовлены',
                         //4=>'Уведомлен',
                         //5=>'Заблокирован по уведомлению',
                         //6=>'Документы получены',
                         7=>'Заблокирован по непрохождению ОПО',//'Заблокирован по прохождению ОПО' + //5=>'Заблокирован по уведомлению',
                         8=>'ОПО пройден, годен',
                         9=>'ОПО пройден, негоден'
                                  ) ;
 var $arr_status_color=array(0=>'',
                                 1=>'gray',
                                 2=>'gray',
                                 22=>'gray',
                                 3=>'gray',
                                 4=>'gray',
                                 5=>'gray',
                                 6=>'gray',
                                 7=>'red',//'Заблокирован по прохождению ОПО' + //5=>'Заблокирован по уведомлению',
                                 8=>'green',
                                 9=>'red'
                      ) ;

	var $arr_opo_len=array(60=>'один раз в пять лет',
                          -1=>'10  минут (тест)') ;

 function __construct()
 {
 }

 function declare_menu($page)
 {
	$page->menu['/cab/setting/']['items']['/cab/opo/settings/']=array('title'=>'opo') ;
 }

 function install()
 {$descr_class[343]['name']='Виды работ ОПО' ;
	$descr_class[343]['parent']=0 ;
	$descr_class[343]['fields']['num']=array('type'=>'varchar(6)') ;

	SETUP()->reg_class($descr_class) ;

	$id_sect=SETUP_add_section_to_site_setting('ОПО') ;
	SETUP_add_rec_to_site_setting($id_sect,"ID мероприятия ОПО",0,'LS_esmo_OPO_event') ;
	//SETUP_add_rec_to_site_setting($id_sect,"URL сервера opo",'','LS_opo_server_url',['descr'=>'URL в формате https://xxx.xxx.xxx.xxx:port']) ;
	//SETUP_add_rec_to_site_setting($id_sect,"Отправлять на терминал запрос фото для opo",0,'LS_opo_check_photo',array('el'=>'checkbox','descr'=>'Если у сотрудника нет фото, верифицированного системой "opo", сервер ЭСМО запросит терминал сдедать такое фото и добавить его в базу сервера opo')) ;
	//SETUP_add_rec_to_site_setting($id_sect,"Показывать в карточке сотрудника информацию по opo",0,'LS_opo_view_info',array('el'=>'checkbox','descr'=>'В карточке сотрудника на фото подтверждение статуса opo')) ;

	//SETUP()->reg_event_lister('server_check_access_success','OPO','on_event_server_check_access_success') ;         //
	//SETUP()->reg_event_lister('examination_result_data_read','OPO','on_event_examination_result_data_read') ;         //
	//SETUP()->reg_event_lister('personal_change_photo','OPO','on_event_personal_change_photo') ;         //
  SETUP()->reg_event_lister('get_active_mess_to_personal','OPO','on_event_get_active_mess_to_personal') ;
  SETUP()->reg_event_lister('prepare_events_list','OPO','on_event_prepare_events_list') ;

	REPORTS()->reg_doc('ОПО','events_opo/doc_napravlenie_opo.php','Направление на ПМО') ;         //
  REPORTS()->reg_doc('ОПО','events_opo/doc_zakluchenie_opo.php','Заключение ПМО') ;         //


	$pattern=array() ;
	$pattern['table_title']				= 	'ОПО - виды работ' ;
	$pattern['use_clss']				= 	'343' ;
	$pattern['table_name']				= 	'opo_vpf' ;
	create_table_by_pattern($pattern) ;

	 // список вредных производственных факторов
  $pattern=array() ;
  $pattern['table_title']		        = 	'Список ВПФ (ОПО)' ;
  $pattern['use_clss']		        = 	'230,233' ;
  $pattern['table_name']				= 	'opo_list_vpf' ;
  $pattern['table_clss']				= 	101 ;
  create_table_by_pattern($pattern) ;

	 $pattern=array() ;
	 $pattern['table_title']		     = 	'Соответствия ВПФ ОПО для ИНРМ' ;
	 $pattern['use_clss']		        = 	'235' ;
	 $pattern['table_name']				= 	'opo_inrm_vpf' ;
	 $pattern['table_clss']				= 	101 ;
	 create_table_by_pattern($pattern) ;


	SETUP()->reg_ext('events_opo','ОПО') ;

	 if (SETUP_LEVEL('db_updates') and ESMO_STATUS!='SETUP_FIRST')
	 	 {
			 $event_id=execSQL_value('select pkey from obj_site_events_schedule where ext="events_opo/i_event_opo" and enabled=1 order by pkey limit 1') ;
 		  if ($GLOBALS['LS_esmo_OPO_event']!=$event_id) update_site_setting('LS_esmo_OPO_event',$event_id) ;
	 	 }

 }

	function on_event_get_active_mess_to_personal($personal_id,&$rec_mess_exists,$options=[])
	    {
	       // удаляем сообщения БД по ОПО - они более не имееют силы
	       if (sizeof($rec_mess_exists)) foreach($rec_mess_exists as $id=>$rec) if ($rec['source_obj']=='events_opo/i_event_opo') unset($rec_mess_exists[$id]) ;
	         // и формируем новые на основе текущего статуса сотрудника
	         $rec_pass=execSQL_van('select * from obj_site_events_pass where event_id='.$GLOBALS['LS_esmo_OPO_event'].' and personal_id='.$personal_id.' and enabled=1') ;
	         if ($rec_pass['pkey'])
	         {  if (isset($GLOBALS['_SETTING']['ext_local']['events_opo'])) include_once(_DIR_EXT_LOCAL.'/events_opo/i_event_opo.php') ;
	            else include_once(_DIR_EXT.'/events_opo/i_event_opo.php') ;
	            $virt_mess=EVENT_OPO()->prepare_message_to_personal($rec_pass) ;
	            if (sizeof($virt_mess)) $rec_mess_exists[]=$virt_mess ;
			 		 }
				//print_2x_arr($rec_mess_exists);
	 	  }

	// регистрируем мероприятие ОПО в списке "Добавить мероприятие"
	function on_event_prepare_events_list(&$arr_events)
	{
		$arr_events[]='events_opo/i_event_opo' ;
	}

	function upload_status_from_scan()
	{
	   $recs=execSQL('select t1.*,t2.pkey as pass_id,t2.status as pass_status 
                       from obj_site_scan t1
                       left join obj_site_events_pass t2 on t2.personal_id=t1.personal_id and t2.event_id='.$GLOBALS['LS_esmo_OPO_event'].' 
                       where t1.doc_type="zaklyuchenie_o_psihiatricheskom_osvidetelstvovanii" and t1.status=3
                       and not t2.pkey is null
                       order by pkey 
                       ',1) ;

    if (sizeof($recs)) foreach($recs as $rec)
    {   // after_block_mo - документ принят, прохождение МО разрешено
        if ($rec['pass_status']!=8)
         {  $data_doc=$rec['data_doc'] ;
            $time_doc=getdate($data_doc) ;
            $time_to=mktime(0,0,0,$time_doc['mon'],$time_doc['mday'],$time_doc['year']+5) ;
            if ($time_to>time())
            { $data=['status'=>($rec['after_block_mo']==1)? 8:9,
                   'scan_id'=>$rec['pkey'],
                   'account_id'=>$rec['account_work'],
                   'data_from'=>$data_doc,
                   'data_to'=>$time_to,
                  ] ;
              $options=['old_status'=>$rec['pass_status'],
                       'c_data'=>$rec['data_work'],
                       'show_debug_text'=>1
                      ] ;
              EVENTS()->set_event_personal_data($GLOBALS['LS_esmo_OPO_event'],$rec['personal_id'],$data,'На основании скана ID '.$rec['pkey'],$options) ;
            }
            else echo '<div class="red">Скан документа ID '.$rec['pkey'].' - срок действия документа истек</div>' ;
         }
    }
	}

	function prepare_vpf_data_for_inrm($temp_table)
   { $arr=[] ;
     //if (_sizeof($arr_inrm)) foreach($arr_inrm as $inrm) $arr[]='"'.$inrm.'"' ;
     //$usl_inrm=' t1.inrm in ('.implode(', ',$arr).')' ;
     $arr_vpf_numbers=execSQL(
          'select distinct(t2.number),t2.parent2,t3.number as rasdel_number,t2.period,t1.inrm 
           from opo_inrm_vpf t1 
           left join opo_list_vpf t2 on t2.pkey=t1.vpf_id
           left join opo_list_vpf t3 on t3.pkey=t2.parent2
           left join '.$temp_table.' t4 on t4.inrm=t1.inrm
           where not t4.pkey is null
           order by t2.indx
          ');

       $vfp_numbers=[] ;
       $vfp_numbers_by_section=[] ;

       $result=[] ;
			 if(_sizeof($arr_vpf_numbers)) foreach($arr_vpf_numbers as $rec)
       { $vfp_numbers[$rec['inrm']][]=$rec['number'] ;
	       $vfp_numbers_by_section[$rec['inrm']][$rec['rasdel_number']][]=$rec['number'];
         if ($rec['period']>0 and  ($result[$rec['inrm']]['min_period']>$rec['period'] or !$result[$rec['inrm']]['min_period'])) $result[$rec['inrm']]['min_period']=$rec['period'] ;
			 }
	//damp_array($vfp_numbers,1,-1);

	if (sizeof($vfp_numbers)) foreach($vfp_numbers as $inrm=>$arr) $result[$inrm]['vfp_numbers']=(_sizeof($arr))? implode(', ',$arr):'';
	if(_sizeof($vfp_numbers_by_section)) foreach($vfp_numbers_by_section as $inrm=>$arr) foreach($arr as $section_name=>$arr_vpf) $result[$inrm]['vfp_numbers_by_section'][$section_name]=implode(', ',$arr_vpf);
       //damp_array($vfp_numbers_by_section,1,-1);
       return($result) ;
   }

  function get_opo_len_info_to_person($rec_event,$personal_id,$options=[])
  {  // по умолчнанию срок действия ПМО задается в мероприятии
     $result['id']=$rec_event['_ext_info']['pmo_len'];
     $result['comment']='по ОПО';
     // далее смотрим если данные по ИНРМ, у сотрудника может быть две должности, надо смотреть обе
			$inrm=($options['inrm'])?:execSQL_value('select inrm from obj_site_workers where enabled=1 and personal_id='.$personal_id.' order by is_main desc');
			$result['inrm']=$inrm;
			if (isset($options['inrm_data']))
			{ $result['vfp_numbers']=$options['inrm_data']['vfp_numbers'] ;
						 $result['vfp_numbers_by_section']=$options['inrm_data']['vfp_numbers_by_section'] ;
			}
			else
			{   // формируем многоуровневый список ВПФ
				 $arr_vpf_numbers=execSQL(
								 'select t1.pkey,vpf.number,vpf.obj_name as vpf_text,vpf.parent,vpf.parent1,vpf.parent2,vpf.parent3,vpf.parent4,
       						vpf_2.obj_name as parent2_name,
       						vpf_3.obj_name as parent3_name,
       						vpf_4.obj_name as parent4_name
									from opo_inrm_vpf t1 
									left join opo_list_vpf vpf on vpf.pkey=t1.vpf_id
									left join opo_list_vpf vpf_4 on vpf_4.pkey=vpf.parent4
									left join opo_list_vpf vpf_3 on vpf_3.pkey=vpf.parent3
									left join opo_list_vpf vpf_2 on vpf_2.pkey=vpf.parent2
									where t1.inrm="'.$inrm.'"
									order by vpf.indx
								 ') ;

				 $tree_sectons=[] ;
				 $result['inrm']=$inrm; $vfp_numbers=[] ;
				 if (_sizeof($arr_vpf_numbers)) foreach($arr_vpf_numbers as $rec) if ($rec['number'])
				 { $vfp_numbers[$rec['number']]=$rec['number'] ;
					 if ($rec['parent2']) $tree_sectons[$rec['parent2']]['title']=$rec['parent2_name'] ;
					 if ($rec['parent3']) $tree_sectons[$rec['parent2']]['items'][$rec['parent3']]['title']=$rec['parent3_name'] ;
					 if ($rec['parent4']) $tree_sectons[$rec['parent2']]['items'][$rec['parent3']]['items'][$rec['parent4']]['title']=$rec['parent4_name'] ;
					 if ($rec['parent']==$rec['parent1']) $tree_sectons[$rec['pkey']]['title']=$rec['vpf_text'] ;
					 if ($rec['parent']==$rec['parent2']) $tree_sectons[$rec['parent2']]['items'][$rec['pkey']]['title']=$rec['vpf_text'] ;
					 if ($rec['parent']==$rec['parent3']) $tree_sectons[$rec['parent2']]['items'][$rec['parent3']]['items'][$rec['pkey']]['title']=$rec['vpf_text'] ;
					 if ($rec['parent']==$rec['parent4']) $tree_sectons[$rec['parent2']]['items'][$rec['parent3']]['items'][$rec['parent4']]['items'][$rec['pkey']]['title']=$rec['vpf_text'] ;
                   //damp_array($tree_sectons,1,-1);
				 }
				 //damp_array($tree_sectons);

				 $result['vfp_numbers']=(_sizeof($vfp_numbers))? implode(', ',$vfp_numbers):'';
				 ob_start() ;
				 $this->show_ul_list($tree_sectons) ;
				 $text=ob_get_clean() ;


				 $result['vfp_text']=$text;

				 if ($rec_event['_ext_info']['pmo_len_union']['use_vpf'])
				 {
						 $vpf_len_id=(isset($options['inrm_data']))? $options['inrm_data']['min_period']:$this->get_id_period_OPO_by_vpf($inrm);
						 $result['vpf_len_id']=($vpf_len_id)?:0;
						 if ($vpf_len_id)
						 {		$result['id']=$vpf_len_id;
									$result['comment']='по ВПФ' ;
									$result['vpf_len_srok']=$this->arr_opo_len[$result['vpf_len_id']];
							}
				 }
				 $result['srok']=$this->arr_opo_len[ $result['id']] ;
			}




    return($result) ;

  }

  function show_ul_list($arr)
	{
		if (sizeof($arr))
		{ ?><ul style="padding-left:0;"><?
			foreach($arr as $item)
			{ ?><li><div class="title"><?echo $item['title'] ;?></div><?
			  if (sizeof($item['items'])) $this->show_ul_list($item['items']) ;
				?></li><?
			}
			?></ul><?
		}
	}

	function get_id_period_OPO_by_vpf($inrm)
	 {
	   $value=execSQL_value('select min(t2.period) 
	                         from opo_inrm_vpf t1
	                         left join opo_list_vpf t2 on t2.pkey=t1.vpf_id
	                         where t1.inrm="'.$inrm.'" and t2.period>0',0,1) ;
	   if (!$value) $value=60 ;
	   return($value) ;
	 }


}

?>
