<?
// утилита удаляет дубликаты сообщений, возникшие в результате присуствия скрытых мероприятий (невидимых для админа, без group_id)
include(_DIR_TO_MODULES.'/engine/i_backgroup_process.php') ;
class c_services_aspmo_setting_repair_pdf_doc extends i_backgroup_process_exec
{
	function exec()
  {
  	ob_start() ;
		$arr_docs_to_repair=$this->get_repair_stats() ;
		FILE_LOG()->append('Требуется восстановить '._sizeof($arr_docs_to_repair).' файлов',1) ;
		$i=1 ;
		if (_sizeof($arr_docs_to_repair)) foreach($arr_docs_to_repair as $doc_id=>$doc_name)
		{ FILE_LOG()->append('Документ '.$doc_name.' ('.$i.' из '._sizeof($arr_docs_to_repair).')',1) ;
			$this->recreate_doc($doc_id,$i,_sizeof($arr_docs_to_repair)) ;
			$i++ ;
		}
		$text=ob_get_clean() ;
		LOGS()->reg_log('docs_pdf_repair','',['save_to_file'=>$text]) ;
		echo $text ;

  }

  function get_repair_stats()
	{
		$_usl[]='clss=215' ;
		$_usl[]='not report_code is null' ;
		if ($this->setting['doc_id']) $_usl[]='pkey='.$this->setting['doc_id'] ;
		$usl=implode(' and ',$_usl) ;
		$recs=execSQL('select pkey,clss,obj_name,doc_dir,doc_name,sign_data,report_code from obj_site_docs where '.$usl.' order by pkey desc ',1) ;
		//$recs=execSQL('select * from obj_site_docs where clss=215 and not report_code is null order by pkey',2) ;
		$stats=[] ; $arr_docs_to_repair=[] ;
		if (_sizeof($recs)) foreach($recs as $rec)
		{   $check_fname=_DIR_TO_ROOT.'/docs/pdf/'.$rec['doc_dir'].$rec['doc_name'] ;
				//echo $check_fname.'<br>' ;
				if (!file_exists($check_fname))
				{ //echo $rec['obj_name'].' - файл документа отсутствует<br>' ;
					$stats[$rec['report_code']]++ ;
					$arr_docs_to_repair[$rec['pkey']]=$rec['obj_name'] ;
				}
		}
		//damp_array($arr_docs_to_repair,1,-1);
		//$this->setting['limit']=2 ;
		if ($this->setting['limit']) $arr_docs_to_repair=array_slice($arr_docs_to_repair,0,$this->setting['limit'],true) ;
		damp_array($stats,1,-1);
		//damp_array($arr_docs_to_repair,1,-1);
		return($arr_docs_to_repair) ;
	}

//test
	function recreate_doc($doc_id,$i=1,$all=1)
	  {
	  	$rec_doc=DOCS()->get_doc_by_id($doc_id) ;
			FILE_LOG()->append('Восстанавливаем PDF документа '.$rec_doc['doc_name'].' ['.$rec_doc['report_code'].']',1) ;

			$report_code=$rec_doc['report_code'] ;
			//if ($report_code=='report_napravlenie') $report_code='napravlenie' ;
	    $report_obj=ENGINE()->get_report_obj_by_code($report_code) ;
	    if (!$report_obj->error)
			{
				$filter=unserialize($rec_doc['report_filter']) ;
				//damp_array($filter,1,-1);
				if ($rec_doc['personal_id']) { $report_obj->personal_id=$rec_doc['personal_id'] ; $filter['personal_id']= $rec_doc['personal_id'] ; }
				if ($rec_doc['mo_id']) { $report_obj->mo_id=$rec_doc['mo_id'] ; $filter['mo_id']= $rec_doc['mo_id'] ; }
				if ($rec_doc['pkey']) { $report_obj->doc_id=$rec_doc['pkey'] ; $filter['doc_id']= $rec_doc['pkey'] ; }
				$report_obj->filter=$filter ;
				$report_obj->sign_account_id=$rec_doc['sign_member'] ;
				$report_obj->cur_group_id=($rec_doc['group_id'])?:1 ;
				$report_obj->title=$rec_doc['obj_name'] ;
				$report_obj->current_time=$rec_doc['c_data'] ;
				if (method_exists($report_obj,'init')) $report_obj->init();
				FILE_LOG()->append('Начинаем генерацию PDF документа ('.$i.' из '.$all.')',1) ;
				$result = $report_obj->save_as_PDF();
				$this->waiting_pdf_generate($result['outputfile']);
				FILE_LOG()->append('PDF документ готов',1) ;
				//$fname = _DIR_TO_ROOT . '/temp/' . $result['PDF_file_name'];;
				//damp_array($result,1,-1);
				if (file_exists($result['to']))
				{
						rename($result['to'],$rec_doc['__doc_dir']) ;
						echo 'Файл сохранен в '.$rec_doc['__doc_dir'].'<br>' ;
						if ($rec_doc['sign'])
						{ FILE_LOG()->append('Сохраняем подпись документа',1) ;
							$cont=file_get_contents($rec_doc['__doc_dir']) ;
							$sign_content=md5(base64_encode($cont)) ;
							$sign_fname=$rec_doc['__doc_dir'].'.sig' ;
							echo 'Сохраняем подпись в прикрепленном файле "'.$sign_fname.'"<br>' ;
							file_put_contents($sign_fname,$sign_content) ;

							$zip_fname = $rec_doc['__doc_dir'].'.zip' ;
							echo 'Создаем архив документа и подписи "'.$zip_fname.'"<br>' ;
							$zip = new ZipArchive();
							if (file_exists($zip_fname)) unlink($zip_fname);

							if ($zip->open($zip_fname, ZipArchive::CREATE)===TRUE)
							{ $zip->addFile($rec_doc['__doc_dir'],basename($rec_doc['__doc_dir']));
								$zip->addFile($rec_doc['__doc_dir'].'.sig',basename($rec_doc['__doc_dir'].'.sig'));
								$zip->close();
							}
							else echo '<div class="alert">Не удалось создать архив подписи документа</div>' ;
				}
			} else echo '<div class=red>'.$report_obj['error'].'</div>';
		}


	  }

	function waiting_pdf_generate($log_name)
   {
       $t1 = fixed_time();
       do
       {
           $text = file_get_contents($log_name);
           sleep(1);
       } while(strpos($text,'Done')===false and strpos($text,'100%')===false);
       $t2 = fixed_time();
       echo 'Генерация отчета - ' . round($t2-$t1,2) . ' сек.<br>';
       sleep(10);
   }

}

?>
