<?
/**
 * Controller
 * 
 * Matriz Laudo Final
 * 
 * @author Fernando Nunes
 * @date 02/03/2011
 *
 */
class Agro_Controller_LaudoFinalRegulacao extends Agro_Controller_Action {
	
    public function init() {
        $this->view->title = 'Sinistro » Processos » Laudo Final';
        
        if (!Agro_Util::checkPermission('sinistro:laudofinal:editarlaudoendosso')){
	        $Model = new Seguro_Model_Propostas();
	        $Proposta = $Model->find($this->getRequest()->getParam("id_proposta"))->current();
	        
	        if (is_object($Proposta)){
	        	$Produto = $Proposta->produto();
		        if ($Proposta->possuiEndosso() && $Produto['id_safra'] < 16){
		        	$this->_redirect("/sinistro2/index/bloqueiodigitacao");
		        }
	        }
        }
        
        if($this->_getParam('edit') && $this->_getParam('edit') == 0){
        	$this->view->jQuery()->addJavascriptFile('/resources/javascript/sinistro2/disableall.js');
        }
        
    }
    
	public function getModel() { }
	
	public function getForm() {	}
	
	public function getModelLaudosFinais() {
	    return new Sinistro2_Model_LaudosFinais();
	}
	
	public function formAction() {
		try{
			$params = $this->getRequest()->getParams();
		
	    	$Model = $this->getModel();
	    	$Model_LaudosFinais = $this->getModelLaudosFinais();

        	$flLaudoOK = true;
		
			if($params['id_laudo_final']) {
				$idLaudoFinal = $params['id_laudo_final'];
			}

        	$dadosForm['id_empresa_vistoriadora'] = $params['id_empresa_vistoriadora'];
		
			$Form = $this->getForm($dadosForm);

			$this->view->data = array();
		
			$this->view->jQuery()->addJavascriptFile('/resources/javascript/sinistro2/laudofinal.js?nocache='.rand(1,1000));
        	$this->view->jQuery()->addStylesheet('/resources/css/sinistro2/laudo.css');
			
			if($this->getRequest()->isPost()) {
				$Adapter = new Zend_File_Transfer_Adapter_Http();
				$Adapter->setDestination(PATH_LAUDOS);
				$Adapter->addValidator('Size', false, 2097152);
				$file = $Adapter->getFileInfo();
			
				$ModelLFIS = new Sinistro2_Model_LaudosFinaisItensSegurados();

				if (empty($file)) {
					$Form->removeElement('ds_nome_laudo_fisico');
				}

		   		if ($file["ds_nome_laudo_fisico"]["name"]){
					if($params['id_laudo_final']){
						$arquivo = $Model_LaudosFinais->getLaudoEscaneado($params['id_laudo_final']);
					
						if($arquivo){
							$Model_LaudosFinais->deleteArquivo($params['id_laudo_final']);
						}
					
						$Row = $Model_LaudosFinais->getRow($params['id_laudo_final']);
					}

					$infoArquivo = pathinfo($file["ds_nome_laudo_fisico"]["name"]);

					if (preg_match('/[áéíóúàèìòùâêîôûãõçÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕÇ@#$%&*()\[\]\{\}<>:;?\/°\.]/u',$infoArquivo['filename'])) {
						throw new Exception("Nome de arquivo de laudo escaneado inválido. Arquivo [{$infoArquivo['basename']}] possui caracteres especiais.");
					}else{
    					$newName = $ModelLFIS->geraNomeArquivoFisicoEventoNaoConstatado(null, $file["ds_nome_laudo_fisico"]["name"], $params);

    					$Adapter->addFilter('Rename', array('target' => PATH_LAUDOS."/".$newName, 'overwrite' => true));
				
						if($Adapter->receive($file["ds_nome_laudo_fisico"]["name"])){
							if ($Row->ds_nome_laudo_fisico){
								unlink(realpath(PATH_LAUDOS."/".$Row->ds_nome_laudo_fisico));
							}

							$params['ds_nome_laudo_fisico'] = $newName;

						}else{
							$this->view->showMessage('Erro ao salvar laudo escaneado!', 'error');
							return false;
						}
					}
				}
			
		    	$Form->populate($params);

    			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
    		
    			$dados = $Form->getValues();

				//Adiciona os dados de assinatura
				$this->preparaDadosAssinatura($params, $dados);

				$zoneamentos = $ModelLFIS->getZoneamentos($idLaudoFinal);
				
				if ($params['fl_evento_nao_constatado']) {
					
					$message = array();
				
					if (!in_array($params['controller'], ['lf003', 'lf034'])) {

						if (!array_key_exists("fl_assinatura_segurado", $_POST)){
							$message[] = "Assinatura do segurado";
						}
					
						if (!array_key_exists("fl_assinatura_regulador", $_POST)){
							$message[] = "Assinatura do regulador";
						}
					}
				
					if (!$_POST["dt_vistoria_data"]){
						$message[] = "Data da vistoria";
					}

					if (!array_key_exists("vistoriadores", $_POST)){
						$message[] = "Vistoriador";
					}
				
					if (!empty($message)){
						Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
	        			$this->view->showMessage("Os seguintes itens são de preenchimento obrigatório: <br><ul><li>".implode("</li><li>", $message)."</li><ul>", 'error');
	        		
					} else {
						if($params['ds_nome_laudo_fisico']){
							$dados['ds_nome_laudo_fisico'] = $params['ds_nome_laudo_fisico'];
						}
					
						$idLaudoFinal = $Model_LaudosFinais->save($dados);

						if (!$idLaudoFinal) {
							Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
							$this->view->showMessage($Model_LaudosFinais->getMessages(), 'error');
						} else {
							$Model_LaudosFinais->deleteEventoNaoConstatado($idLaudoFinal, $dados);
					
							$Model->delete($idLaudoFinal);
						
							if ($dados['id_vistoria']) {
								// Relaciona vistoria com avisos
								$Model_VistoriaAvisos = new Sinistro2_Model_VistoriasAvisos();
							
								if (array_key_exists("dt_vistoria_data", $dados) && $dados['dt_vistoria_data'] != ''){
									$dados['dt_vistoria'] = Agro_Util::formatDate($dados['dt_vistoria_data'].' '.$dados['dt_vistoria_hora'].' '.$dados['dt_vistoria_minutos'], 'yyyy-MM-dd HH:mm:ss');
								}
							/*
							if ($Model_VistoriaAvisos->setVistoriaFinalAvisos($dados['id_proposta'], $dados['id_vistoria'], $dados['dt_vistoria'], $dados['id_cobertura'], $Proposta->id_produto)){
								$this->view->showMessage(MSG_SUCCESS, 'success');
							} else {
								$this->view->showMessage($Model_VistoriaAvisos->getMessages(), 'error');
							};
							*/
							}
							
							$ModelLFIS->atualizarAssinaturas($idLaudoFinal, $params['fl_assinado']);
							$ModelLFIS->atualizarZoneamentos($idLaudoFinal, $zoneamentos);
							Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
							$this->view->showMessage(MSG_SUCCESS,'success');
						}
					}
				}elseif ($Form->isValid($Form->getValues())) {
					
					$mensagemErroDadosAssinatura = $Form->validaDadosAssinatura($params);
				
					if (!empty($mensagemErroDadosAssinatura)) {
						$this->view->showMessage($mensagemErroDadosAssinatura, 'error');
					} else {
						if($_POST['itens_segurados_selecionados']) {
							$dados['itens_segurados_selecionados'] = $_POST['itens_segurados_selecionados'];
						}
					
						if($_POST['id_motivo_quadra_nao_vistoriada']) {
							$dados['id_motivo_quadra_nao_vistoriada'] = $_POST['id_motivo_quadra_nao_vistoriada'];
						}
	
					   	if($_POST['fl_dt_evento_em_cobertura']) {
							$dados['fl_dt_evento_em_cobertura'] = $_POST['fl_dt_evento_em_cobertura'];
						}
					
						$dados['id_motivo_vistoria_nao_vistoriada'] = null;
					
						$idLaudoFinal = $Model->save($dados);
					
						if($idLaudoFinal) {
							
							if ($dados['id_vistoria']) {
								
								$ModelLFIS->atualizarAssinaturas($idLaudoFinal, $params['fl_assinado']);
								$ModelLFIS->atualizarZoneamentos($idLaudoFinal, $zoneamentos);

							
								Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
								$this->view->showMessage(MSG_SUCCESS,'success');
							}
						} else {
							Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
							$this->view->showMessage($Model->getMessages(), 'error');
						}
					}
				} else {
    				$this->view->showMessage($this->getAllFormErros(array($Form),$Form->getValues()), 'error');
                	$flLaudoOK = false;
    			}
			}

			if ($idLaudoFinal && $flLaudoOK) {
		    	$params = $Model_LaudosFinais->getLaudoFinal($idLaudoFinal);
				$params['id_laudo_final'] = $idLaudoFinal;
			
				$Form->init($params['id_laudo_final']);
			}
		
			$dadosLaudoFinalDocusign = (new Sinistro2_Model_LaudosFinaisDocusign())->getByLaudoFinal($idLaudoFinal);
			$params['ds_status_docusign'] = '';
			if (!empty($dadosLaudoFinalDocusign)) {
				$params['ds_status_docusign'] = Agro_DocuSign_Base::getDescricaoStatus($dadosLaudoFinalDocusign[0]['ds_status']);
			}

			$this->view->ds_responsavel = !empty($params['ds_responsavel']) ? $params['ds_responsavel'] : '';
			$this->view->cpf_responsavel = !empty($params['cpf_responsavel']) ? $params['cpf_responsavel'] : '';
			$this->view->ds_tipo_responsavel = !empty($params['ds_tipo_responsavel']) ? $params['ds_tipo_responsavel'] : '';


			$Form->populate($params);
			$this->view->back = '/sinistro2/processo/view/id/'.$params['id_processo'].'#regulacao_laudos';
			$this->view->form = $Form;
		}catch(Exception $e){
			$this->view->showMessage($e->getMessage(), 'error');
            $this->view->form = $Form;
            $this->view->form->populate($this->getRequest()->getParams());
		}
	}

	/**
	 * Verifica qual o tipo de autorizado que está assinando e busca o nome e cpf de acordo.
	 * 
	 * @param $dadosOriginais
	 * @param &$dadosAlterados
	 */
	private function preparaDadosAssinatura(array $dadosOriginais, array &$dadosAlterados): void
	{
		$dadosAssinatura = ['ds_responsavel' => null, 'cpf_responsavel' => null];
        switch ($dadosOriginais['ds_tipo_responsavel']) {
            case 'outro':
            case 'outro_pendente_autorizacao':
                $dadosAssinatura['ds_responsavel'] = $dadosOriginais['ds_responsavel'] ? $dadosOriginais['ds_responsavel'] : null;
                $dadosAssinatura['cpf_responsavel'] = $dadosOriginais['cpf_responsavel'] ? $dadosOriginais['cpf_responsavel'] : null;
                break;
            case 'autorizado':
                if (!empty($dadosOriginais['pessoa_autorizada'])) {
                    $modelPessoaAutorizada = new Seguro_Model_PessoaAutorizada;
                    $pessoa = $modelPessoaAutorizada->find($dadosOriginais['pessoa_autorizada'])->current();
                    $dadosAssinatura['ds_responsavel'] = $pessoa['ds_pessoa_autorizada'];
                    $dadosAssinatura['cpf_responsavel'] = $pessoa['cpf_cnpj'];
                }
                break;
            case 'segurado':
                if (!empty($dadosOriginais['id_proposta'])) {
                    $modelPropostasProponentes = new Seguro_Model_PropostasProponentes();
                    $segurado = $modelPropostasProponentes->get($dadosOriginais['id_proposta']);
                    if (!empty($segurado)) {
                        $dadosAssinatura['ds_responsavel'] = $segurado['ds_nome_proponente'] ? $segurado['ds_nome_proponente'] : null;
                        $dadosAssinatura['cpf_responsavel'] = $segurado['cpf_cnpj'] ? $segurado['cpf_cnpj'] : null;
                    }
                }
                break;
        }

        $dadosAlterados['ds_tipo_responsavel'] = $dadosOriginais['ds_tipo_responsavel'];
        $dadosAlterados['ds_responsavel'] = $dadosAssinatura['ds_responsavel'];
        $dadosAlterados['cpf_responsavel'] = $dadosAssinatura['cpf_responsavel'];
	}

	public function getagronomosagrotoupdatemultiselectAction()
	{
		$this->isAjax();
		$retorno = ['error' => false, 'message' => '', 'id_agronomos' => []];

		try {
			if (empty($this->getRequest()->getParam('id_laudo_final'))) {
				throw new Exception("ID do Laudo Final não informado.");
			}

			$modelFuncionarios = new Sistema_Model_Funcionarios();
			$modelLaudosFinaisAgronomosAgro = new Sinistro2_Model_LaudosFinaisAgronomosAgro();

			$agronomosAgro = $modelFuncionarios->getComboFuncionariosAgronomos();
			
			$agronomosVinculados = $modelLaudosFinaisAgronomosAgro->getComboByLaudoFinal($this->getRequest()->getParam('id_laudo_final'));
			
			$comboAgronomos = [];
			foreach ($agronomosAgro as $idAgronomo => $nomeAgronomo) {
				if (empty($idAgronomo)) {
					continue;
				}
				
				$comboAgronomos[] = [
					"value" => $idAgronomo,
					"text" => $nomeAgronomo,
					"selected" => array_key_exists($idAgronomo, $agronomosVinculados),
				];
			}

			$retorno['id_agronomos'] = $comboAgronomos;

		} catch (\Throwable $th) {
			$retorno['error'] = true;
			$retorno['message'] = $th->getMessage();
		}

		
		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	public function alterardadosenvioAction()
	{
		$this->isAjax();
		$retorno = ['error' => false, 'message' => ''];
		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			$params = $this->getRequest()->getParams();
			if (empty($params['idLaudoFinal'])) {
				throw new Exception("ID do Laudo Final não informado.");
			}

			if (($params['dsTipoEnvioLaudo'] == 'EMAIL' || $params['dsTipoEnvioDocAcompanhante'] == 'EMAIL') && $params['dsEmailSegurado'] == '') {
				throw new Exception("E-mail não informado");
			}

			if (($params['dsTipoEnvioLaudo'] == 'WHATS' || $params['dsTipoEnvioDocAcompanhante'] == 'WHATS') && $params['dsTelefoneSegurado'] == '') {
				throw new Exception("Telefone não informado");
			}

			$modelLaudoFinal = new Sinistro2_Model_LaudosFinais();
			$rowLaudoFinal = $modelLaudoFinal->getRow($params['idLaudoFinal']);
			
			if (empty($rowLaudoFinal['id'])) {
				throw new Exception("Laudo final não encontrado para o ID informado.");
			}

			$rowLaudoFinal->ds_email_segurado = $params['dsEmailSegurado'];
			$rowLaudoFinal->ds_telefone_segurado = $params['dsTelefoneSegurado'];

			$rs = $rowLaudoFinal->save();
			
			if (empty($rs)) {
				throw new Exception("Não foi possível alterar o e-mail/telefone.");
			}

			$retorno['message'] = "E-mail/Telefone alterados com sucesso!";
			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (\Throwable $th) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$retorno['error'] = true;
			$retorno['message'] = $th->getMessage();
		}
		
		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	public function alterartipoenvioAction()
	{
		$this->isAjax();
		$retorno = ['error' => false, 'message' => ''];
		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			$params = $this->getRequest()->getParams();

			if (empty($params['idLaudoFinal'])) {
				throw new Exception("ID do Laudo Final não informado.");
			}

			if (($params['dsTipoEnvioLaudo'] == 'EMAIL' || $params['dsTipoEnvioDocAcompanhante'] == 'EMAIL') && $params['dsEmailSegurado'] == '') {
				throw new Exception("É necessário ter o e-mail informado para poder trocar para esse tipo de envio.");
			}

			if (($params['dsTipoEnvioLaudo'] == 'WHATS' || $params['dsTipoEnvioDocAcompanhante'] == 'WHATS') && $params['dsTelefoneSegurado'] == '') {
				throw new Exception("É necessário ter o telefone informado para poder trocar para esse tipo de envio.");
			}

			$modelLaudoFinal = new Sinistro2_Model_LaudosFinais();
			$rowLaudoFinal = $modelLaudoFinal->getRow($params['idLaudoFinal']);
			
			if (empty($rowLaudoFinal['id'])) {
				throw new Exception("Laudo final não encontrado para o ID informado.");
			}

			$rowLaudoFinal->ds_tipo_envio_laudo = $params['dsTipoEnvioLaudo'];
			$rowLaudoFinal->ds_tipo_envio_doc_acompanhante = $params['dsTipoEnvioDocAcompanhante'];

			$rs = $rowLaudoFinal->save();
			
			if (empty($rs)) {
				throw new Exception("Não foi possível alterar o tipo de envio.");
			}
			$retorno['message'] = "Tipo de envio alterado com sucesso!";
			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (\Throwable $th) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$retorno['error'] = true;
			$retorno['message'] = $th->getMessage();
		}
		
		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	public function atualizarstatusdocusignAction()
    {
        $this->isAjax();

        $response = [
            'message' => '',
            'status_docusign' => '',
            'status_atualizado' => false,
            'status' => true
        ];

        $statusValidos = [
            Agro_DocuSign_Base::STATUS_SENT,
            Agro_DocuSign_Base::STATUS_DELIVERED
        ];

        $modelLaudosFinaisDocusign = new Sinistro2_Model_LaudosFinaisDocusign();

        if (!empty($this->getRequest()->getParam('id_laudo_final'))) {

			$fila = $modelLaudosFinaisDocusign->getByLaudoFinal($this->getRequest()->getParam('id_laudo_final'));
            if (count($fila) > 0 && !in_array($fila[0]['ds_status'], $statusValidos)) {
                $fila = [];
            }
        } else {
            $fila = $modelLaudosFinaisDocusign->getFila($statusValidos);
        }

        foreach ($fila as $laudoFinalDocusign) {
            try {
                Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

                $response['status_docusign'] = $modelLaudosFinaisDocusign->atualizarStatusEnvelope($laudoFinalDocusign);
                $response['status_atualizado'] = $response['status_docusign'] != $laudoFinalDocusign['ds_status'];

                Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
            } catch (\Throwable $th) {
                Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
                $response['message'] = $th->getMessage();
                $response['status'] = false;
            }
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

	public function baixardocumentosdocusignAction()
    {
        $this->isAjax();

        $response = [
            'message' => '',
            'status' => true,
            'path' => '/upload_files/docusign/',
			'filename' => ''
        ];

		
        try {

            if (empty($this->getRequest()->getParam('id_laudo_final'))) {
                throw new Exception("Laudo final não informado.");
            }

            $idLaudoFinal = $this->getRequest()->getParam('id_laudo_final');

			if (!filter_var($idLaudoFinal, FILTER_VALIDATE_INT)) {
                throw new Exception("Id do laudo final inválido.");
            }

			$modelLaudosFinaisDocusign = new Sinistro2_Model_LaudosFinaisDocusign();
            $documentos = $modelLaudosFinaisDocusign->getDocumentoByLaudoFinal((int) $idLaudoFinal);

			
			if (empty($documentos)) {
				throw new Exception("Nenhum documento encontrado.");
			}

			if (count($documentos) > 1) {
				$response['filename'] = "{$idLaudoFinal}-documentos-acompanhante.zip";
				$to = APPLICATION_PATH . $response['path'] . $response['filename'];

				if (!file_exists($to)) {
					$zip = new ZipArchive;
            
					if ($zip->open($to, (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== TRUE) {
						throw new Exception("Ocorreu um erro ao criar o arquivo ZIP.");
					}
		
					foreach ($documentos as $key => $documento) {
						$nomePdf = "{$key}.pdf";
						$filePath = APPLICATION_PATH . $response['path'] . $nomePdf;
						$zip->addFile($filePath, $documento->nome);
					}
		
					$zip->close();
				}
			} else {
				$response['filename'] = "{$idLaudoFinal}-documento-acompanhante.pdf";
				$to = APPLICATION_PATH . $response['path'] . $response['filename'];
				if (!file_exists($to)) {
					foreach ($documentos as $documento) {
						$from = $documento->splFileObject->getPathName();
						
						if (!copy($from, $to)) {
							throw new Exception("Não foi possível copiar o arquivo para a pasta.");
						}
					}
				}
			}
			
        } catch (\Throwable $th) {
            $response['message'] = $th->getMessage();
            $response['status'] = false;
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

	public function enviardocusignAction()
    {
        $this->isAjax();

        $response = [
            'message' => '',
            'status_docusign' => '',
            'status' => true
        ];

		try {
			$modelLaudosFinaisDocusign = new Sinistro2_Model_LaudosFinaisDocusign();
			$params = $this->getRequest()->getParams();
			$idLaudoFinal = null;

			if (empty($params['id_laudo_final'])) {
				throw new Exception("Laudo final não informado");
			}

			$idLaudoFinal = $params['id_laudo_final'];

			if (!filter_var($idLaudoFinal, FILTER_VALIDATE_INT)) {
                throw new Exception("Id do laudo final inválido.");
            }
			
			$modelLaudosFinaisDocusign->enviarTermoAutorizacaoAcompanhante((int) $idLaudoFinal);
			$response['message'] = "Termo de autorização do acompanhante enviado com sucesso.";
		} catch (\Throwable $th) {
			$response['status'] = false;
			$response['message'] = $th->getMessage();

			$data = [
                'id_laudo_final' => $idLaudoFinal,
                'id_envelope' => '',
                'ds_status' => Agro_DocuSign_Base::STATUS_ERROR,
                'ds_mensagem' => $th->getMessage()
            ];
            $modelLaudosFinaisDocusign->save($data);
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function historicoassinaturaAction()
    {
        $this->getHelper('layout')->disableLayout();
        $modelLaudosFinaisDocusign = new Sinistro2_Model_LaudosFinaisDocusign();
        $this->view->historicoAssinatura = $modelLaudosFinaisDocusign->getByLaudoFinal($this->getRequest()->getParam('id_laudo_final'), false);
    }

	public function historicoenviolaudoAction()
    {
        $this->getHelper('layout')->disableLayout();
        $modelLaudosFinaisEnviosLogs = new Sinistro2_Model_LaudosFinaisEnviosLogs();
        $this->view->historicoEnvios = $modelLaudosFinaisEnviosLogs->getByLaudoFinal($this->getRequest()->getParam('id_laudo_final'), false);
    }
}