<?php
use Mpdf\Mpdf;

class Corretor_ProcessoController extends Agro_Controller_Action {

	public function getForm() { return new Corretor_Form_PesquisaProcesso(); }
	public function getModel() { return new Corretor_Model_Processos(); }

	public function init() { $this->view->title = 'Sinistro » Processos'; }

	public function viewAction() {
		$this->isAjax(true);
		$this->view->show_bloco_notas = false;

		$Processos       = new Corretor_Model_Processos();
		$ProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();

		$this->view->processo = $Processos->find($this->getRequest()->getParam('id'))->current();
		$this->view->proposta = $this->view->processo->proposta();

		$this->view->proponente = $this->view->processo->proponente();
		$arSafra = $this->view->proposta->safra();
		$this->view->safra = $arSafra['id'];

		$this->view->arquivos = $ProcessoArquivo->getProcessosArquivos($this->getRequest()->getParam('id'));

		$Info = new Seguro_Model_InformacoesBancarias();
		$this->view->informacoes_bancarias = $Info->getInformacoesBancarias($this->view->proposta->id);
		
		$Beneficiarios = new Seguro_Model_PropostasBeneficiarios();
		$this->view->beneficiarios = $Beneficiarios->getBeneficiarios($this->view->proposta->id);		

		$this->view->form = new Corretor_Form_Upload();
				
		$replantioCobs = array(5,30,31,36);
		$PropostasCoberturas = new Seguro_Model_PropostasCoberturas();
		$this->view->hasReplantio = $PropostasCoberturas->fetchAll(
			'id_proposta = '.$this->view->proposta->id.
			' and id_cobertura in ('.implode(',', $replantioCobs).')')->count();
		
		//verifica se é cevada qualidade (id_produto_geral = 15; ds_chave %% 'COB_QUALIDADE')	
		$coberturas = $PropostasCoberturas->getChaveCoberturasByProposta($this->view->proposta->id);
		$produto = (new Produto_Model_Produtos())->fetchRow('id = '.$this->view->proposta->id_produto); 
		if (count($coberturas)>0 && ($produto->id_produto_geral == 15)) {
			foreach($coberturas as $key => $val) {
				preg_match('/^COB_QUALIDADE/m', $val, $matches);
				if (count($matches)>0) {
					$ProcessosNotasFiscais = new Sinistro2_Model_ProcessosNotasFiscais();
					$pNotasFiscais = $ProcessosNotasFiscais->getNotasFiscaisArquivoByIdProcesso($this->getRequest()->getParam('id'));
					$this->view->show_bloco_notas = true;
					$this->view->notasfiscais = $pNotasFiscais;
					$this->view->status_nota = $ProcessosNotasFiscais->getStatusByIdProcesso($this->getRequest()->getParam('id'))['ds_status'];
					$this->view->chave_status_nota = $pNotasFiscais[0]['ds_chave'];
					break;
				}
			}
		}
	}

	public function arquivosAction() {
		$this->isAjax(true);

		$Processos = new Corretor_Model_Processos();
		$ProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();
		
		$this->view->processo = $Processos->find($this->getRequest()->getParam('id'))->current();
		$this->view->arquivos = $ProcessoArquivo->getProcessosArquivos($this->getRequest()->getParam('id'));
	}

	public function deleteAction() {
		$this->isAjax();

		$ProcessoArquivo = new Sinistro_Model_ProcessosArquivos();
		$Row = $ProcessoArquivo->getRow($this->getRequest()->getParam('id'));

		$dados['id_processo'] = $this->getRequest()->getParam('id_processo');
		$dados['ds_nome_usuario'] = Agro_Util::getUserName(Zend_Auth::getInstance()->getIdentity()->id);
		$dados['ds_nome_arquivo'] = $Row->ds_nome_arquivo;

		$ModelProcessoObs = new Sinistro_Model_ProcessosObservacoesArquivos();
		$ModelProcessoObs->saveObservacaoExclusao($dados);

		if (file_exists(APPLICATION_PATH.'/upload_files/sinistro_processo/'.$Row->ds_nome_arquivo)) {
			unlink(APPLICATION_PATH.'/upload_files/sinistro_processo/'.$Row->ds_nome_arquivo);
		}

		$ProcessoArquivo->delete($Row->id);
	}

	public function notasfiscaisAction() {
		$this->isAjax(true);
		$this->view->notasfiscais = (new Sinistro2_Model_ProcessosNotasFiscais())->getNotasFiscaisArquivoByIdProcesso($this->getRequest()->getParam('id'));
	}

	public function uploadnotaAction()
    {
        $this->isAjax();

        Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

        try {
            if (($_FILES['arquivo']['size'] / 1024) > 3000) {
                $this->getResponse()->setBody('<script>alert("ATENÇÃO: O tamanho máximo permitido para o arquivo de nota é 3mb.");</script>');
            } else {
                if (!$_FILES['nota']['error']) {
                    $idProcesso = !Agro_Util::filterVariable($this->getRequest()->getParam('id_processo'))
                        ? 0
                        : (int)$this->getRequest()->getParam('id_processo');

                    $processosNotasFiscais = new Sinistro2_Model_ProcessosNotasFiscais();
                    $extensao = strtolower(end(explode('.', $_FILES['nota']['name'])));
                    $nomeArquivo = 'NOTA_FISCAL_' . $idProcesso . '_';
                    $nomeArquivo .= (count($processosNotasFiscais->getNotasFiscaisArquivoByIdProcesso($idProcesso)) + 1);
                    $nomeArquivo .= '.' . $extensao;

                    $path = APPLICATION_PATH . "/upload_files/sinistro_processo/" . $nomeArquivo;

                    $idProcessoNotasFiscais = $processosNotasFiscais->fetchRow('id_processo = ' . $idProcesso)['id'];

                    if (!$idProcessoNotasFiscais) {
                        $data = array(
                            'id_processo' => $idProcesso,
                            'id_status_arquivo' => (new Sistema_Model_Status())->getIdByChaveTipoChave(
                                'NAO_ENVIADA',
                                'NOTAS_FISCAIS'
                            )
                        );
                        $idProcessoNotasFiscais = $processosNotasFiscais->save($data);
                    }

                    if ($idProcessoNotasFiscais > 0) {

                        if ((new Sinistro2_Model_NotasFiscaisArquivos())->save($nomeArquivo, $idProcessoNotasFiscais)) {
                            if (copy($_FILES['nota']['tmp_name'], $path)) {
                                $modelStatus = new Sistema_Model_Status();
                                $idStatus = $modelStatus->getIdByChaveTipoChave('AGUARDANDO_ENVIO', 'NOTAS_FISCAIS');
                                $stStatus = $modelStatus->getNameById($idStatus);

                                if ($idStatus !== $processosNotasFiscais->id_status) {
                                    $processosNotasFiscais->updateStatus($idProcesso, $idStatus);
                                }

                                $this->getResponse()->setBody('
									<script>
										alert("ATENÇÃO\n\nNota cadastrada com sucesso."); 
										window.top.window.loadNotasFiscais();
										window.top.window.document.getElementById("status_notas").innerHTML = "Status das notas: <strong>' . $stStatus . '</strong>";
									</script>'
                                );
                                Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
                            } else {
                                $this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nNão foi possível copiar a nota para o destino.");</script>');
                                Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
                            }
                        } else {
                            $this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nNão foi possível relacionar a nota com o processo.");</script>');
                            Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
                        }
                    } else {
                        $this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nNão foi possível relacionar a nota com o processo.");</script>');
                        Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
                    }
                } else {
                    $this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nOcorreu um erro ao importar o arquivo.");</script>');
                    Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
                }
            }
        } catch (Exception $e) {
            $this->getResponse()->setBody('<script>alert("ATENÇÃO\n\n' . $e->getMessage() . '");</script>');
            Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
        }
    }

	public function uploadAction() {
		$ProcessoArquivo = new Sinistro_Model_ProcessosArquivos();
		$Processos = new Sinistro_Model_Processos();
		$this->isAjax();

		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
		try {
			$extensoes_permitidas = array('pdf', 'jpg', 'jpeg','png','jfif');
			$ext = explode('.', $_FILES['arquivo']['name']);
			$size = $_FILES["arquivo"]["size"] / 1024;

			if($size > 14000){
			    $this->getResponse()->setBody('<script>alert("Por favor, verifique o tamanho do arquivo (máximo permitido 14Mb)");</script>');
			} elseif (!in_array(strtolower($ext[1]), $extensoes_permitidas)) {
				$this->getResponse()->setBody('<script>alert("Por favor, verifique a extensão do arquivo (permitidas pdf,jpg,jpeg,png ou jfif)");</script>');
			} else {
    			if (!$_FILES['arquivo']['error']) {

					// Gera o nome do novo arquivo
					$TipoArquivoProcesso = new Sistema_Model_TipoArquivoProcesso();
					$TipoArquivo = $TipoArquivoProcesso->fetchRow($TipoArquivoProcesso->getAdapter()->quoteInto('id = ?', $this->getRequest()->getParam('id_tipo_arquivo')))->toArray();

					$Processos = new Sinistro_Model_Processos();
					$Processo = $Processos->getRow($this->getRequest()->getParam('id_processo'));
					$RowProcesso = $Processos->find($this->getRequest()->getParam('id_processo'));
					$Proponente = $Processos->getProponenteProcesso($this->getRequest()->getParam('id_processo'));

					$countArquivos = $ProcessoArquivo->getCountTipoArquivo($Proponente['cpf_cnpj'], $this->getRequest()->getParam('id_tipo_arquivo'));
					if($countArquivos < 1){
					    $countArquivos = 1;
					} else {
					    $countArquivos += 1;
					}
		            $extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

					$cpf_cnpj = str_replace(".", "", $Proponente['cpf_cnpj']);
					$cpf_cnpj = str_replace("-", "", $cpf_cnpj);
					$cpf_cnpj = str_replace("/", "", $cpf_cnpj);

					if($TipoArquivo['ds_chave_tipo_arquivo'] == 'LIQUIDACAO'){
						$nomeArquivo = $RowProcesso[0]['id_proposta']."_".$TipoArquivo['ds_chave_tipo_arquivo']."_".$countArquivos.".".$extensao;
					} else {
						$nomeArquivo = $cpf_cnpj."_".$TipoArquivo['ds_chave_tipo_arquivo']."_".$countArquivos.".".$extensao;
					}

					$target = APPLICATION_PATH.'/upload_files/sinistro_processo/'.$nomeArquivo;

					$ProcessoArquivo = new Sinistro_Model_ProcessosArquivos();
    				$Row = $ProcessoArquivo->createRow();

    				$Row->id_tipo_arquivo = $this->getRequest()->getParam('id_tipo_arquivo');
    				$Row->id_processo = $this->getRequest()->getParam('id_processo');
    				$Row->ds_nome_arquivo = $nomeArquivo;

    				if ($Row->save()) {
    					if (copy($_FILES['arquivo']['tmp_name'], $target)) {
    						$Row->ds_nome_arquivo = $nomeArquivo;
    						if ($Row->save()) {

								$Processo->id_status_arquivos = $ProcessoArquivo->getIdStatus('NAO_ANALISADO', 'ARQUIVOS_PROCESSO_SINISTRO');
								if ($Processo->save()) {
									##INICIO FLUXO CRONOMETRO##
									$modelAvisoEncerramento 			= new Sinistro2_Model_AvisosEncerramento();
									$modelPropostasBeneficiarios 		= new Seguro_Model_PropostasBeneficiarios();
									$modelCronometro					= new Sinistro2_Model_CronometroRegulacao();
									$modelProcessos 					= new Sinistro2_Model_Processos(); 
									$serviceAvisoEncerramentoColheita 	= new Sinistro2_Service_AvisoEncerramentoColheita();
									
									$avisos = $modelAvisoEncerramento->getAvisosEncerramentoByProposta($Processo->id_proposta);

									if($modelPropostasBeneficiarios->getBeneficiariosNaoBanco($Processo->id_proposta)){
										$docBeneficiarios = $modelProcessos->isDocumentacaoBeneficiariosValida($Processo->id_proposta);
										if($avisos && $docBeneficiarios){
										$cronometros = $modelCronometro->getCronometrosByProposta($Processo->id_proposta);
										if(!empty($cronometros->toArray())){
											foreach($cronometros as $cronometro){
												$modelCronometro->reativar($cronometro);
											}
										}else{
											foreach($avisos as $aviso){
												$serviceAvisoEncerramentoColheita->criaCronometroRegulacao($Processo->id_proposta, (int)$aviso['id']);
											}
										}
									}
									}else{
										if($avisos){
											//pegar cronometros da proposta
											$cronometros = $modelCronometro->getCronometrosByProposta($Processo->id_proposta);
					
											if(!empty($cronometros->toArray())){
												//atualizar o status para ativar os cronometros
												foreach($cronometros as $cronometro){
													$modelCronometro->reativar($cronometro);
												}
											}
											foreach($avisos as $aviso){
												$serviceAvisoEncerramentoColheita->criaCronometroRegulacao($Processo->id_proposta, (int)$aviso['id']);
											}
										}
									}
									##FIM FLUXO CRONOMETRO##


									Agro_Util::generateAtscript('transmitirarquivoessor.php', array(
										$this->getRequest()->getParam('id_processo'),
										$Row->id, $this->getRequest()->getParam('id_tipo_arquivo'),$nomeArquivo, $target
									));

									Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
									$this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nArquivo cadastrado com sucesso."); window.top.window.loadArquivos();</script>');
								} else {
									Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
									$this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nErro ao atualizar o status do arquivo.");</script>');
								}
							} else {
								$this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nNão foi possível salvar o arquivo.");</script>');
								Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();	
							}
    					} else {
    						$this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nNão foi possível copiar o arquivo para a pasta de destino.");</script>');
    						Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
    					}
    				} else {
    					$this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nNão foi possível relacionar o arquivo com o processo.");</script>');
    					Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
    				}
    			} else {
    				$this->getResponse()->setBody('<script>alert("ATENÇÃO\n\nOcorreu um erro ao importar o arquivo.");</script>');
    			}
			}
		} catch (Exception $e) {
			$this->getResponse()->setBody('<script>alert("ATENÇÃO\n\n'.$e->getMessage().'");</script>');
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
		}
	}

	public function transmitirarquivoessorAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$result = $this->transmitirArquivoEssor(
			$this->getRequest()->getParam('id_processo'),
			$this->getRequest()->getParam('id_arquivo'),
			$this->getRequest()->getParam('id_tipo_arquivo'),
			$this->getRequest()->getParam('filename'),
			$this->getRequest()->getParam('target')
		);

		return $this->getResponse()->setBody(Zend_Json::encode($result));
	}

    private function transmitirArquivoEssor(
        int    $idProcesso,
        int    $idArquivo,
        int    $idTipoArquivo,
        string $filename,
        string $fullFilename
    ): array
    {
        $wsdl = (APPLICATION_ENV != 'production') ? WSDL_DEV : WSDL_PROD;
        $client = new SoapClient($wsdl);
        $modelProcesso = new Sinistro2_Model_Processos();
        $tipoArquivoProcessos = (new Sistema_Model_TipoArquivoProcesso())->find($idTipoArquivo)->current();
        $nm_chave_valores = $modelProcesso->getIdentificadorSeguradora(
            $modelProcesso->getPropostaByProcesso($idProcesso)
        );
        $base64file = base64_encode(file_get_contents(realpath($fullFilename)));

        $args = array(
            'Executar' => array(
                'Servico' => 'InserirDocumentoECM',
                'conteudoXML' => '<i4proerp>
									<inserirecmws
										id_tp_documento="' . $tipoArquivoProcessos->id_tipo_documento_seguradora . '"
										id_dominio="4"
										nm_chave_valores="' . $nm_chave_valores . '"
										img_documento_arquivo="' . $filename . '"
										cd_usuario="AgroBrasil WS"
										cd_empresa="230"
										img_documento_content_type="' . mime_content_type($fullFilename) . '"
										nm_observacao="' . $tipoArquivoProcessos->ds_tipo_arquivo . '"
										nr_ref="' . $nm_chave_valores . '"
										img_documento="' . $base64file . '"
									/>
								</i4proerp>'
            )
        );

        $result = $client->__soapCall('Executar', $args, array('location' => explode('?', $wsdl)[0]));

        if ($result->ExecutarResult) {
            $result_xml = simplexml_load_string(
                utf8_encode($result->ExecutarResult), 'SimpleXMLElement', LIBXML_NOCDATA
            );
            if ($result_xml->sucesso->attributes()->cd_retorno > 0) {
                return array('status' => false, 'message' => $result_xml->sucesso->attributes()->nm_retorno);
            } else {
                $dados['id_processo'] = $idProcesso;
                $dados['id_arquivo'] = $idArquivo;
                $dados['id_documento_seguradora'] = $result_xml->sucesso->attributes()->id_documento;
                $dados['ds_mensagem'] = $result_xml->sucesso->attributes()->nm_retorno;

                if ((new Log_Model_LogSinistroArquivosTransmissao())->save($dados)) {
                    return array(
                        'status' => true,
                        'message' => 'Transmissão do arquivo para ESSOR efetuada com sucesso.'
                    );
                }
            }
        }

        return array('status' => false, 'message' => 'Erro na transmissão do arquivo para ESSOR.');
    }

	public function getFilter() {
		$User = Zend_Auth::getInstance()->getIdentity();
		$where = array();
		$valorPesquisa = trim($this->getRequest()->getParam('valor_pesquisa'));

		if ($this->getRequest()->getParam('tipo_pesquisa') && $valorPesquisa) {
			if ($this->getRequest()->getParam('tipo_pesquisa') == "id_proposta"){
				$ModelProposta = new Seguro_Model_Propostas();
				$endosso = $ModelProposta->fetchRow($ModelProposta->getAdapter()->quoteInto('id = ?', $valorPesquisa));

				if (!empty($endosso)) {
                    $endosso = $endosso->toArray();

                    $filter['field'] = 'id_endosso';
                    $filter['operator'] = '=';
                    $filter['value'] = $endosso['id_endosso'];
                } else {
                    $filter['field'] = 'id_endosso';
                    $filter['operator'] = '=';
                    $filter['value'] = $valorPesquisa;
                }

                $where[] = $filter;
			} elseif ($this->getRequest()->getParam('tipo_pesquisa') == "id_aviso") {
				$where[] = array(
					'field' => 'id_proposta',
					'value' => '(select id_proposta from sinistro.avisos where id = '.$valorPesquisa.')',
					'operator' => 'in'
				);
			} else if(is_numeric($valorPesquisa)){
				$where[] = array(
					'field' => $this->getRequest()->getParam('tipo_pesquisa'),
					'value' => $valorPesquisa,
					'operator' => '='
				);
			} else {
				$where[] = array(
					'field' => $this->getRequest()->getParam('tipo_pesquisa'),
					'value' => "%".$valorPesquisa."%",
					'operator' => 'ilike'
				);
			}
		}

		if ($User->tp_usuario == 'C') {
		    $where[] = array(
				'field' => 'id_usuario_corretor',
				'value' => $User->id,
				'operator' => '='
			);
		}

		if ($User->tp_usuario == 'P') {
            $where[] = array(
				'field' => 'id_usuario_preposto',
				'value' => $User->id,
				'operator' => '='
			);
		}

		if ($this->getRequest()->getParam('id_safra') && !(($this->getRequest()->getParam('tipo_pesquisa') == "id_proposta") && $valorPesquisa)) {
			$where[] = array(
				'value' => $this->getRequest()->getParam('id_safra'),
				'field' => 'id_safra',
				'operator' => '='
			);
		}

		if ($this->getRequest()->getParam('id_cultura')) {
			$where[] = array(
				'field' => 'id_cultura',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_cultura')
			);
		}

		if ($this->getRequest()->getParam('id_produto')) {
			$where[] = array(
				'value' => $this->getRequest()->getParam('id_produto'),
				'field' => 'id_produto',
				'operator' => '='
			);
		}

		if ($this->getRequest()->getParam('cpf_cnpj')) {
			$where[] = array(
				'value' => $this->getRequest()->getParam('cpf_cnpj'),
				'field' => 'cpf_cnpj',
				'operator' => '='
			);
		}

		if ($this->getRequest()->getParam('id_municipio')) {
			$where[] = array(
				'value' => $this->getRequest()->getParam('id_municipio'),
				'field' => 'id_municipio',
				'operator' => '='
			);
		}

	    if ($this->getRequest()->getParam('id_estado')) {
            $where[] = array(
				'value' => $this->getRequest()->getParam('id_estado'),
				'field' => 'id_estado',
				'operator' => '='
			);
        }

        if ($this->getRequest()->getParam('id_status')) {
            $where[] = array(
				'value' => $this->getRequest()->getParam('id_status'),
				'field' => 'id_status',
				'operator' => '='
			);
        }

		return $where;
	}

	public function savequestionarioAction(){
		$this->isAjax();
		$Model = new Seguro_Model_PropostasProponentes();

		$dados = $this->getRequest()->getParams();

		if($Model->saveQuestionario($dados)){
			$return = "Dados gravados com sucesso!";
		}else{
			$return = "Erro ao gravar dados!";
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

    public function gerarpdfcomunicadorecusaAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        (new Sinistro2_Service_AvisoSinistro())->gerarPdfRecusa((int)$this->getRequest()->getParam('id_aviso'));

        exit;
    }

    public function informacoescartarecusaAction()
    {
        $this->getHelper('layout')->disableLayout();

        $this->view->informacoes = (new Sinistro2_Service_AvisoSinistro())->getDadosAvisoPropostaRecusada(
            (int)$this->getRequest()->getParam('id_aviso')
        );
    }
}
