<?php
require_once(APPLICATION_PATH. "/../library/dompdf/autoload.inc.php");

Use Dompdf\Dompdf;
use Dompdf\Options;


class Regulacao_Lvp001Controller extends Agro_Controller_Action {
	private $__params;
	public $_backAfterSave = false;

	public function init() {
		$Model = new Sistema_Model_Empresas();
		$this->id_empresa = $Model->getIdEmpresaUsuarioCorrente();
		$this->__params = $this->getRequest()->getParams();
	}

	public function getModel() {
		return new Regulacao_Model_Lvp001();
	}

	public function getModelPrevia() {
		return new Seguro_Model_VistoriaPreviaEmpresa();
	}

	public function getForm($dados = array()) {
		return new Regulacao_Form_Lvp001(array('dados'=>$dados));
	}

    /**
     * Monta a tela de digitação de laudo do formulário ANTIGO.
    */
    public function formAction() {
        $this->view->jQuery()->addJavascriptFile('/resources/jquery/jquery.MultiFile.js');
        $this->view->jQuery()->addStylesheet('/resources/css/seguro/laudoview.css');
        //$this->view->jQuery()->addStylesheet('/resources/css/seguro/laudoprint.css');

        $Model = $this->getModel();
        $dados = $this->getRequest()->getParams();

        if($dados['id_laudo']){
            $totalItens = $this->getModelPrevia()->getTotalItensLaudo($dados);
        }else{
            $totalItens = $dados['n_quadras'];
        }

        $this->view->totalItens = $totalItens;
        //$this->view->totalItens =  $totalItens && $totalItens >= 4  ? ($totalItens && $totalItens < 4 ? 4 : $totalItens) : 40;

        $this->view->dados = $this->getModelPrevia()->getDadosProposta($dados['id_proposta']);
        $this->view->autorizados = $this->getModelPrevia()->getAutorizados($dados['id_proposta']);
        $this->view->id_proposta_vistoria = $dados['id_proposta_vistoria'];

        // busca a proposta vigente
        $ModelProposta = new Seguro_Model_Propostas();
        $Proposta = $ModelProposta->find($dados['id_proposta'])->current();
        $this->view->id_proposta_vigente = $Proposta->recupera_id_proposta_vigente($dados['id_proposta']);

        $Safra = $Proposta->safra();
        $this->view->id_safra = $Safra['id'];
        $Cultura = $Proposta->cultura();
        $this->view->ds_chave_cultura = $Cultura['ds_chave_cultura'];

        // busca os dados da proposta caso exista endosso
        if ($this->view->id_proposta_vigente <> $dados['id_proposta']) {
            $this->view->dados_proposta_vigente = $this->getModelPrevia()->getDadosProposta($this->view->id_proposta_vigente);
            $this->view->autorizados_vigente = $this->getModelPrevia()->getAutorizados($this->view->id_proposta_vigente);
            $this->view->proposta_vigente = $ModelProposta->find($this->view->id_proposta_vigente)->current();
            $this->view->tem_endosso = true;
            
            $PropostaArquivo = new Seguro_Model_PropostasArquivos();
            $this->view->croquis_endosso = $PropostaArquivo->getPropostaCroquis($this->view->id_proposta_vigente);
        }

        if($this->getRequest()->isPost()){
            $Form = $this->getForm(array('dados'=>$dados));
            $Form->populate($this->__params);

            if($Form->isValid($Form->getValues())) {

                $id_laudo = $Model->save($this->__params);

                if($id_laudo){
                    $url = $this->__params['module'].'/'.$this->__params['controller'].'/'.$this->__params['action'].'/id_laudo/'.$id_laudo.'/id_proposta_vistoria/'.$this->__params['id_proposta_vistoria'].'/id_proposta/'.$this->__params['id_proposta'].'/popup/1';
                    $this->_redirect($url);
                    $this->view->showMessage($Model->getMessages(), "success");
                }else{
                    $this->view->showMessage($Model->getMessages(), "error");
                    dump($Model->getMessages());
                }
            } else {
                $this->view->showMessage($this->getAllFormErros(array($Form),$_POST), 'error');
            }

        }
        $this->view->readonly = $dados['readonly'];

        $this->populate();
    }

    public function savenecessarionovavistoriaAction() {
        $this->isAjax();
        $dados = $this->getRequest()->getParams();
        $modelLvp001IS = new Regulacao_Model_Lvp001ItensSegurados;

        try {
            foreach ($dados['amostras'] as $amostra) {
                $itemSegurado = $modelLvp001IS->fetchRow($modelLvp001IS->select()->where('id = ?', $amostra['id']['value']));
                $itemSegurado->fl_habilitar_nova_vistoria = $amostra['fl_habilitar_nova_vistoria']['value'];

                $itemSegurado->save();
            }

            $return = array('status' => 'success', 'message' => 'Alterado com sucesso!');
        } catch (\Exception $e) {
            $return = array('status' => 'error', 'message' => 'Houve um problema ao atualizar as informações!');
        }

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

    /**
     * Método utilizado no formulário ANTIGO do laudo da prévia
     * 
     * @return void
     */
    public function populate(){

        $ProcessosEmpresas = new Sinistro2_Model_ProcessosEmpresas();

        $Model = $this->getModel();
        $ModelLvp001IS = new Regulacao_Model_Lvp001ItensSegurados();
        $ModelProposta = new Seguro_Model_Propostas();

        if ($this->__params["id_proposta_vistoria"]){
            $this->__params = $Model->getDadosLaudo($this->__params["id_proposta_vistoria"])  ? array_merge($this->__params, $Model->getDadosLaudo($this->__params["id_proposta_vistoria"])) : $this->__params;
            $this->__params = $this->__params['id_laudo'] ? array_merge($this->__params, $ModelLvp001IS->get($this->__params)) : $this->__params;
            $this->view->proposta = $ModelProposta->find($this->__params['id_proposta'])->current();
        }

        $Form = $this->getForm(array('dados'=>$this->__params));
        $Form->populate($this->__params);

        $this->view->form = $Form;

        if(!array_key_exists("amostras", $this->__params)){
            $this->__params = $Model->__prepararDados($this->__params);
        }

        $dadosProposta = $this->getModelPrevia()->getDadosProposta($this->__params['id_proposta']);


        $User = Zend_Auth::getInstance()->getIdentity();

        if($User->tp_usuario == 'F'){
            if(array_key_exists("amostras", $this->__params)){
                //zoneamento
                $idValidacao = null;
                $idProduto = $dadosProposta['id_produto'];
                $idMunicipio = $dadosProposta['id_municipio'];

                foreach ($this->__params['amostras'] as $key => $amostra){

                    //variedade não existe
                    if($amostra['id_variedade'] == 6971){
                        $this->__params['amostras'][$key]['foraZoneamento'] = true;
                    }

                    $idTipoSolo = $amostra['tipo_solo'];
                    $idCiclo = $amostra['id_ciclo'];
                    $dtInicioSemeadura = $amostra['dt_inicio_semeadura'];
                    $dtFimSemeadura = $amostra['dt_final_semeadura'];

                    $Validacoes = new Produto_Model_Validacoes();
                    if(!$Validacoes->verificaDataSemeadura($idValidacao, $idTipoSolo, $idProduto, $idCiclo, $idMunicipio, $dtInicioSemeadura, $dtFimSemeadura)){
                        $this->__params['amostras'][$key]['foraZoneamento'] = true;
                    }
                }
            }
        }

        if ($this->view->totalItens < 1) {
            $this->view->totalItens = count($this->__params['amostras']);
        }

        $this->view->dados = array_merge($this->__params, $dadosProposta);

    }

	/**
	 * Monta a tela de digitação de laudo do NOVO formulário.
	 */
	public function formnovoAction()
    {
		$this->view->jQuery()->addJavascriptFile('/resources/jquery/jquery.MultiFile.js');
        $this->view->jQuery()->addStylesheet('/resources/css/seguro/laudoview.css');
        $this->view->jquery()->addStylesheet('/resources/bootstrap/css/bootstrap.min.css');

        $this->view->title = 'Seguro » Vistoria Prévia » Laudo de Vistoria Prévia';

        if (!$this->view->back) {
            $this->view->back = "/seguro/vistoriapreviaempresa/index";
        }

		$model = $this->getModel();
		$dados = $this->getRequest()->getParams();

        $idPropostaVistoria = !Agro_Util::filterVariable($dados['id_proposta_vistoria'])
            ? 0
            : (int)$dados['id_proposta_vistoria'];

        $modelProposta = new Seguro_Model_Propostas();
		$this->view->title = 'Seguro » Vistoria Prévia » Laudo de Vistoria Prévia';

        $this->view->dadosLaudo = $this->getModelPrevia()->getLaudo($idPropostaVistoria, $dados['id_proposta']);
        if (!empty($this->view->dadosLaudo) && !empty($this->view->dadosLaudo['id'])) {
            $dados['id_laudo'] = $this->view->dadosLaudo['id'];
        }

        //busca informações da vistoria mãe para validar se há quadras indicadas para nova vistoria nessa nova vistoria
        $vp = $this->getModelPrevia()->find($idPropostaVistoria)->current();
        $itensLaudoMae = null;
        if ($vp->id_vistoria_mae) {
            $arTMP = array_merge($dados, array('id_proposta_vistoria' => $vp->id_vistoria_mae));
            $dadosLaudoMae = $this->getModelPrevia()->getLaudo($arTMP['id_proposta_vistoria'], $arTMP['id_proposta']);
            
            if (!empty($dadosLaudoMae) && !empty($dadosLaudoMae['id'])) {
                $arTMP['id_laudo'] = $dadosLaudoMae['id'];
            }
            
            $arTMP['fl_habilitar_nova_vistoria'] = true;
            $itensLaudoMae = $this->getModelPrevia()->getItensLaudo($arTMP);
            $arItensMae = array();
            
            foreach ($itensLaudoMae as $item) {
                //quando é vistoria nova, não traz os campos preenchidos
                $arItensMae[] = array(
                    'id_proposta' => $dados['id_proposta'],
                    'id_proposta_vistoria' => $idPropostaVistoria,
                    'nr_item_segurado' => $item['nr_item_segurado'],
                    'id_item_segurado' => $item['id_item_segurado'],
                    'id_item' => $item['id_item'],
                    'ds_item_segurado' => $item['ds_item_segurado'] ? $item['ds_item_segurado'] : $item['nr_quadra'],
                    'vl_rendimento_tonelada' => $item['vl_rendimento_tonelada'],
                    'vl_lmga' => $item['vl_lmga'],
                    'vl_area' => $item['vl_area'],
                );
            }
        }

        //valida se há itens setados para nova vistoria da vistoria anterior
		$this->view->itensLaudo = $arItensMae && !$dados['id_laudo']
            ? $arItensMae
            : $this->getModelPrevia()->getItensLaudo($dados);

		$this->view->dados = $this->getModelPrevia()->getDadosProposta($dados['id_proposta'], $idPropostaVistoria);
        $this->view->dados['amostras'] = $this->view->itensLaudo;

        $this->view->dados_proposta_vigente = $modelProposta->getRow($dados['id_proposta']);
        $this->view->autorizados = $this->getModelPrevia()->getAutorizados($dados['id_proposta']);
        $this->view->autorizados_vigente = $this->view->autorizados;
		$this->view->id_proposta_vistoria = $idPropostaVistoria;
		$this->view->id_status_previa = $dados['id_status_previa'];

        // busca a proposta vigente
        $proposta = $modelProposta->find($dados['id_proposta'])->current();
        $this->proposta = $proposta;
        $this->view->id_proposta_vigente = $proposta->recupera_id_proposta_vigente($dados['id_proposta']);

        $modelPessoasAutorizadas = new Seguro_Model_PessoaAutorizada();
        $this->view->pessoas_autorizadas = $modelPessoasAutorizadas->getPessoasAutorizadas($dados['id_proposta']);

        $safra = $proposta->safra();
        $this->view->id_safra = $safra['id'];
        $cultura = $proposta->cultura();
        $this->view->id_cultura = $cultura['id'];
        $this->view->ds_chave_cultura = $cultura['ds_chave_cultura'];
        $this->view->formArquivos = new Seguro_Form_VistoriaPreviaEmpresaArquivo;

        $modelArquivos = new Seguro_Model_Vistoriapreviaempresaarquivos();
        $arquivos = $modelArquivos->getArquivos($idPropostaVistoria);
        $this->view->arquivos = $arquivos;

        // busca os dados da proposta caso exista endosso
        if ($this->view->id_proposta_vigente <> $dados['id_proposta']) {
            $this->view->dados_proposta_vigente = $modelProposta->getRow($this->view->id_proposta_vigente);
            $this->view->autorizados_vigente = $this->getModelPrevia()->getAutorizados(
                $this->view->id_proposta_vigente
            );
            $dadosVigente = $dados;
            $dadosVigente['id_proposta'] = $this->view->id_proposta_vigente;
            $itensLaudo = $this->getModelPrevia()->getItensLaudo($dadosVigente);
            $this->view->itensLaudo = $itensLaudo;

            $this->view->dados['amostras'] = $itensLaudo;
            $this->view->tem_endosso = true;

            $propostaArquivo = new Seguro_Model_PropostasArquivos();
            $this->view->croquis_endosso = $propostaArquivo->getPropostaCroquis($this->view->id_proposta_vigente);
        }

		if ($this->getRequest()->isPost()) {
            $form = $this->getForm(array('dados'=>$dados));
	        $form->populate($this->__params);

			if($form->isValid($form->getValues())) {
				$id_laudo = $model->saveNovo($this->__params);

				if($id_laudo){
					$url = $this->__params['module'] . '/' . $this->__params['controller'];
					$url .= '/' . $this->__params['action'] . '/id_laudo/' . $id_laudo . '/id_proposta_vistoria/';
					$url .= $this->__params['id_proposta_vistoria'] . '/id_proposta/' . $this->__params['id_proposta'];

                    $this->_redirect($url);
					$this->view->showMessage($model->getMessages(), "success");
				} else {
					$this->view->showMessage($model->getMessages(), "error");
				}
        	} else {
        		$this->view->showMessage($this->getAllFormErros(array($form), $_POST), 'error');
        	}
		}

        $this->view->readonly = $dados['readonly'];
        
        if ($dados['id_laudo']) {
            $modelGeoCroqui = new Regulacao_Model_Lvp001Croqui();
            $count = $modelGeoCroqui->countCroqui($dados['id_laudo']);
            $this->view->show_edit_croqui = $count > 0;
        }

        //verificando se já existe um croqui desenhado pelo perito no Agronet
        if ($dados['id_laudo']) {
            if ((new Regulacao_Model_Croquis())->temCroquiDesenhado($dados['id_laudo'])) {
                $this->view->bw = false;
                $this->view->nome_regulacao = 'lvp001';
            } else {
                $this->view->bw = true;
            }
        } else {
            $this->view->bw = true;
        }

        $this->view->id_processo = null;

        $statusProcessoAberto = [
          Sinistro2_Model_Processos::ID_STATUS_ABERTO_REGULACAO,
          Sinistro2_Model_Processos::ID_STATUS_ABERTO_LIQUIDACAO,
          Sinistro2_Model_Processos::ID_STATUS_ABERTO_SEM_EMPRESA
        ];
        $rowProcesso = (new Sinistro2_Model_Processos())->fetchRow([
          "id_proposta = {$dados['id_proposta']}",
            "fl_ativo is true",
            "id_status in (" . implode(', ', $statusProcessoAberto) . ")"
        ]);

        if (!empty($rowProcesso)) {
            $this->view->id_processo = $rowProcesso['id'];
        }

        $this->view->id_tipo_pendencia = (new Atendimento_Model_TipoPendencia)->getIdTipoPendencia('PENDENCIA_PERITO');
        $this->populateNovo();
	}

    /**
     * Método utilizado no formulário NOVO do laudo da prévia
     * 
     * @return void
     */
    public function populateNovo(){

    	$ProcessosEmpresas = new Sinistro2_Model_ProcessosEmpresas();

    	$Model = $this->getModel();
    	$ModelLvp001IS = new Regulacao_Model_Lvp001ItensSegurados();
		$ModelProposta = new Seguro_Model_Propostas();

    	if ($this->__params["id_proposta_vistoria"]){
            $status_chamado = array(171,172,177);
            $VistoriaPrevia = $this->getModelPrevia()->find($this->__params['id_proposta_vistoria'])->current();

            $this->__params['id_status_analise'] = $VistoriaPrevia->id_status_analise;
            $this->__params['fl_necessario_endosso'] = $VistoriaPrevia->fl_necessario_endosso;
            $this->__params['id_status_alteracao'] = $VistoriaPrevia->id_status_alteracao;
            $this->__params['id_pendencia'] = $VistoriaPrevia->id_pendencia;

    		$this->__params = $Model->getDadosLaudo($this->__params["id_proposta_vistoria"])  ? array_merge($this->__params, $Model->getDadosLaudo($this->__params["id_proposta_vistoria"])) : $this->__params;
    		$this->__params = $this->__params['id_laudo'] ? array_merge($this->__params, $ModelLvp001IS->get($this->__params)) : $this->__params;
			$this->view->proposta = $ModelProposta->find($this->__params['id_proposta'])->current();
    	} 

    	$Form = $this->getForm(array('dados'=>$this->__params));
        $Form->populate($this->__params);

		$this->view->form = $Form;

		if(!array_key_exists("amostras", $this->__params)){
			$this->__params = $Model->__prepararDadosNovo($this->__params);
		}

		$dadosProposta = $this->getModelPrevia()->getDadosProposta($this->__params['id_proposta'], $this->__params['id_proposta_vistoria']);


		$User = Zend_Auth::getInstance()->getIdentity();

		if($User->tp_usuario == 'F'){
	    	if(array_key_exists("amostras", $this->__params)){
		    	//zoneamento
				$idValidacao = null;
				$idProduto = $dadosProposta['id_produto'];
				$idMunicipio = $dadosProposta['id_municipio'];

                //validação para ver se o zoneamento está de acorto
                $modelCiclos     = new Produto_Model_Ciclos();
                $proposta = $ModelProposta->getRow($this->__params['id_proposta']);
                $flZoneamentoRegiao  = $proposta->atributo_rn('PROPRIEDADE', 'PROD_ZONEAMENTO_REGIAO');
                $Propriedade = $proposta->propriedade();

		    	foreach ($this->__params['amostras'] as $key => $amostra){

                    if ($amostra['id_variedade']
                        && $amostra['tipo_solo']
                        && $amostra['vl_altitude']
                        && $amostra['tipo_semeadura']
                        && $amostra['dt_inicio_semeadura']
                        && $amostra['dt_final_semeadura']
                    ) {
    		    		//variedade não existe
    		    		if($amostra['id_variedade'] == 6971){
    		    			$this->__params['amostras'][$key]['foraZoneamento'] = true;
    		    		}

    		    		// $idTipoSolo = $amostra['tipo_solo'];
    		    		// $idCiclo = $amostra['id_ciclo'];
    					// $dtInicioSemeadura = $amostra['dt_inicio_semeadura'];
    					// $dtFimSemeadura = $amostra['dt_final_semeadura'];

                        // verifica se está configurado para zonemanto por região para buscar o ciclo
                        if(!$flZoneamentoRegiao){
                            $idCiclo = $modelCiclos->getCicloEstado($idProduto, $amostra['id_variedade'], $Propriedade['id_estado']);
                        } else {
                            // if(!$Propriedade['id_regiao']){
                            //     continue;
                            // }
                            $idCiclo = $modelCiclos->getCicloRegiao($idProduto, $amostra['id_variedade'], $Propriedade['id_estado'], $Propriedade['id_regiao']);
                        }
                    
    					$Validacoes = new Produto_Model_Validacoes();
                        $returnInitialDate = $Validacoes->verificaZoneamento(
                            $amostra['tipo_solo'],
                            $idProduto,
                            $idCiclo,
                            $idMunicipio,
                            $amostra['dt_inicio_semeadura'],
                            $amostra['vl_altitude'],
                            $amostra['tipo_semeadura']
                        );
                        $returnFinalDate = $Validacoes->verificaZoneamento(
                            $amostra['tipo_solo'],
                            $idProduto,
                            $idCiclo,
                            $idMunicipio,
                            $amostra['dt_final_semeadura'],
                            $amostra['vl_altitude'],
                            $amostra['tipo_semeadura']
                        );
    					if(!$returnInitialDate['status'] || !$returnFinalDate['status']){
    						$this->__params['amostras'][$key]['foraZoneamento'] = true;
    					}
                    }
		    	}
	    	}
		}

        if ($this->view->totalItens < 1) {
            $this->view->totalItens = count($this->__params['amostras']);
        }

        $this->view->dados = array_merge($this->__params, $dadosProposta);
        
        if (!empty($this->__params['amostras'])) {
            $arTMP = array();
            for ($i=0; $i < count($this->__params['amostras']); $i++) { 
                $arTMP[$i] = array_merge($this->view->itensLaudo[$i], $this->__params['amostras'][$i]);
            }
            $this->view->itensLaudo = $arTMP;
        }

        //adiciona a coluna nr_quadra a tabela de arquivos
        foreach($this->view->arquivos as $key => $arquivo) {
            foreach($this->view->itensLaudo as $key2 => $item) {
                if (strtolower($arquivo['ds_tipo_arquivo']) == 'foto') {
                    $fileName = explode('_', $arquivo['ds_nome_arquivo']);
                    if ($fileName[3] == $item['id_item_segurado']) {
                        $nroItem = ($item['nr_item_segurado'] ? $item['nr_item_segurado'] : $key2 + 1);
                        $nrQuadra = ($item['nr_quadra'] ? $item['nr_quadra'] : $item['ds_item_segurado']);
                        $this->view->arquivos[$key]['nr_quadra'] = $nroItem.".".$nrQuadra;
                    }
                }
            }
        }
    }

/*     public function transmitirAction() {
    	$result = array();
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

    	$this->getResponse()->setBody(Zend_Json::encode($this->getRequest()->getParams()));
    } */

    public function transmitirAction() {
        $result = "nok";
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        $Model = $this->getModel();
        if ($Model->saveMobile($this->getRequest()->getParams())) {
            $result = "ok";
        } else {
            $result = "nok-model";
        }

        if ($result == 'ok') {
            $itens = $this->getRequest()->getParam('nr_quadra');
            foreach ($itens as $item) {
                foreach ($item['arrayImagens'] as $imagem) {
                    if ($this->saveImage($imagem['imagem'], $imagem['nome'], $this->getRequest()->getParam('id_proposta_vistoria'))) {
                        $result = "ok";
                    } else {
                        $result = "nok-imagem";
                    }
                }
            }
        }

        $this->getResponse()->setBody($result);
    }

    /*
     * Salva imagem no diretório de laudos previa
     */
    private function saveImage($base64img, $filename, $idPropostaVistoria)
    {
        $dados['id_proposta_vistoria'] = $idPropostaVistoria;
        $dados['ds_nome_arquivo'] = $filename;
        $dados['id_tipo_arquivo_laudo_previa'] = 3;


        (new Seguro_Model_Vistoriapreviaempresaarquivos())->save($dados);

        $filename = Agro_File::clearFileName($filename);
        return file_put_contents(APPLICATION_PATH . "/upload_files/laudoprevia/{$filename}", base64_decode($base64img));
    }

    /**
     * Gera pdf do laudo e salva nos arquivos da vistoria prévia
     *
     * Na controller chamar:
     * $this->_forward('pdflaudo', 'lvp001', array('id_proposta_vistoria' => 1));
     */
    public function pdflaudoAction()
    {
        $this->isAjax();
        ini_set('memory_limit', -1);
        $params = $this->getRequest()->getParams();
        $return = null;
        
        if (empty($params['id_proposta_vistoria'])) {
            $return = array(
                'message' => 'Identificador da vistoria obrigatório!',
                'error' => true
            );
        }
        
        if (!$return) {
            $ModelPreviaArquivos = new Seguro_Model_Vistoriapreviaempresaarquivos();
            $nested = 0;
            try {
                if (!isset($params['transacao'])) {
                    $ModelPreviaArquivos->getAdapter()->beginTransaction();
                }
                
                $nested++;

                $filename = $this->getFileName($params);
                $dados['id_proposta_vistoria'] = $params['id_proposta_vistoria'];
                $dados['ds_nome_arquivo'] = $filename;
                $dados['id_tipo_arquivo_laudo_previa'] = 2; //laudo

                $ModelPreviaArquivos->save($dados);

                $dados['id_proposta'] = $this->getModelPrevia()->getPropostaVistoria($dados['id_proposta_vistoria']);

                $this->view->dadosLaudo = $this->getModelPrevia()->getLaudo($dados['id_proposta_vistoria'], $dados['id_proposta']);

                if (!empty($this->view->dadosLaudo) && !empty($this->view->dadosLaudo['id'])) {
                    $dados['id_laudo'] = $this->view->dadosLaudo['id'];
                }

                $dados['module'] = 'regulacao';
                $dados['controller'] = 'lvp001';
                $itensLaudo = $this->getModelPrevia()->getItensLaudo($dados);

                $this->view->dados = $this->getModelPrevia()->getDadosProposta($dados['id_proposta'], $dados['id_proposta_vistoria']);

                //logo da essor
                $this->view->logotipos = array();
                $this->view->logotipos['logo_essor'] = array(
                    'filename' => 'logo_essor.png',
                    'path' => RESOURCES."/imagens/",
                    'resolutionX' => 985,
                    'resolutionY' => 760,
                    'format' => 'png24'
                );

                $modelProposta = new Seguro_Model_Propostas();
                $this->view->dados_proposta_vigente = $modelProposta->getRow($dados['id_proposta']);

                // busca a proposta vigente
                $this->view->id_proposta_vigente = $this->view->dados_proposta_vigente->recupera_id_proposta_vigente($dados['id_proposta']);
                if ($this->view->id_proposta_vigente != $dados['id_proposta']) {
                    $this->view->dados_proposta_vigente = $modelProposta->getRow($this->view->id_proposta_vigente);
                }

                $complementoNome = '_'.$dados['id_proposta_vistoria'].'_'.$dados['id_proposta'];
                $assinaturas = array(
                    'filename_perito' => 'assinatura_perito'.$complementoNome.'.png',
                    'filename_segurado' => 'assinatura_segurado'.$complementoNome.'.png',
                    'path' => Agro_File::getPath('empresas'),
                    'resolutionX' => 985,
                    'resolutionY' => 760,
                    'format' => 'png24'
                );
                
                //converte a assinatura para png para apresentar no relatório
                if ($this->view->dadosLaudo['svg_assinatura_perito']) {
                    Agro_Util::convertImage(
                        $assinaturas['filename_perito'],
                        $assinaturas['format'],
                        $assinaturas['path'],
                        $assinaturas['resolutionX'],
                        $assinaturas['resolutionY'],
                        '',
                        $this->view->dadosLaudo['svg_assinatura_perito']
                    );
                }

                if ($this->view->dadosLaudo['svg_assinatura_segurado']) {
                    Agro_Util::convertImage(
                        $assinaturas['filename_segurado'],
                        $assinaturas['format'],
                        $assinaturas['path'],
                        $assinaturas['resolutionX'],
                        $assinaturas['resolutionY'],
                        '',
                        $this->view->dadosLaudo['svg_assinatura_segurado']
                    );
                }
                $this->view->assinaturas = $assinaturas;

                $combosTipoSolo = (new Produto_Model_Tiposolo())->getCombo(true, 'ds_tipo_solo');
                //corrige nome variedade 6971
                foreach ($itensLaudo as $key => $item) {
                    if ($item['id_variedade'] == 6971) {
                        $itensLaudo[$key]['ds_nome_variedade'] = 'Outros';
                    }

                    $itensLaudo[$key]['tipo_solo'] = $combosTipoSolo[$item['tipo_solo']];
                }

                $html = '';
                $this->view->arItensLaudo = array_chunk($itensLaudo, 4);
                $html .= $this->view->render('lvp001/pdflaudo.phtml');

                $dompdf = new Dompdf(array('isRemoteEnabled' => true));
                $dompdf->set_option('enable_html5_parser', TRUE);
                $dompdf->loadHtml($html);
                $dompdf->setPaper('A4', 'portrait');
                $dompdf->render();

                // para estourar na tela
                // $dompdf->stream($filename, array("Attachment" => false));
// exit(0);
                //apaga as imagens após gerar o relatório
                // Agro_File::delete('empresas', 'assinatura_segurado.png');
                // Agro_File::delete('empresas', 'assinatura_perito.png');

                $output = $dompdf->output();
                $filePath = APPLICATION_PATH . '/upload_files/laudoprevia/' . $filename;
                file_put_contents($filePath, $output);

                //envia email para o corretor
       		    $email = array();
       		    //envia email para o segurodo caso informado
                if (isset($this->view->dadosLaudo['ds_email']) && !empty($this->view->dadosLaudo['ds_email'])) {
                    $email['segurado'] = array(
                        'email' => $this->view->dadosLaudo['ds_email'],
                        'nome' => $this->view->dadosLaudo['ds_acompanhante']
                    );
                }
                //passo o contato do seguro agrículo para receber o email do laudo também
                $corretor = $this->view->dados_proposta_vigente->corretor();
                $email['corretor'] = array(
                    'email' => $corretor['ds_email'],
                    'nome' => $corretor['ds_contato_seguro_agricola']
                );

                if (!isset($params['transacao'])) {
                    $ModelPreviaArquivos->getAdapter()->commit();
                }
                $nested--;

                //se a vistoria já foi cancelada, não envia email
                if (!$this->getModel()->getCanceladaHistorico($dados['id_proposta_vistoria'])) {
                    $this->sendEmail(array_merge($this->view->dadosLaudo, $dados), $filePath, $email);
                }

                $return = array(
                    'message' => 'PDF do Laudo ('.$dados['id_proposta_vistoria'].') gerado com sucesso!',
                    'filename' => $filename,
                    'error' => false
                );
            } catch (Exception $e) {
                if ($nested && !isset($params['transacao'])) {
                    $ModelPreviaArquivos->getAdapter()->rollback();
                }

                $this->logErrorPdfLaudo($dados, $e);
                ob_start();
                print_r($e->getMessage());
                print_r($e->getTraceAsString());
                $stringE = ob_get_clean();
                $email = new Agro_Mail();
                if (APPLICATION_ENV == 'production') {
                    $config = array(
                        'ssl' => MAIL_SSL,
                        'port' => MAIL_PORT,
                        'auth' => MAIL_AUTH,
                        'username' => MAIL_USERNAME,
                        'password' => MAIL_PASSWORD
                    );

                    $transport = new Zend_Mail_Transport_Smtp(MAIL_SMTP, $config);
                    $email->setDefaultTransport($transport);
                }
                $email->addTo('ti@agrobrasilseguros.com.br', 'TI - Agrobrasil');

                if (APPLICATION_ENV == 'production') {
                    $email->setSubject('Erro na geração do Laudo de Vistoria Prévia Proposta: '.$dados['id_proposta']);
                } else {
                    $email->setSubject('HOMOLOG - Erro na geração do Laudo de Vistoria Prévia Proposta: '.$dados['id_proposta']);
                }
                $body = "
                <p style=\"margin-bottom: 15px\">Proposta: {$dados['id_proposta']} <br />Proposta Vistoria: {$dados['id_proposta_vistoria']}</p>

                <p style=\"margin-bottom: 15px\">
                Erro: {$stringE}
                </p>";

                $email->setBodyHtml($body);
                $email->send();

                $return = array(
                    'message' => 'Ocorreu um erro ao gerar o PDF!',
                    'filename' => null,
                    'error' => true
                );
            }
        }

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

    private function logErrorPdfLaudo($vistoria, $e) {
        $t = microtime(true);
        $micro = sprintf("%06d",($t - floor($t)) * 1000000);
        $d = new DateTime( date("Y-m-d H:i:s.".$micro, $t) );

        $filename = "gera_laudo_" . $d->format("Ymd") . ".log";
        $path = APPLICATION.'/rotinas/logs/'.$filename;
        ob_start();
        print_r('Proposta: '.$vistoria['id_proposta'].'\n');
        print_r($e);
        $e = ob_get_clean();
        file_put_contents($path, $e, FILE_APPEND);
    }

    private function isEmailValid($receiver, $vistoria = null) {
        $validator = new Zend_Validate_EmailAddress();
     
        $return = $validator->isValid($receiver);
        if (!$return) {
            $msg = "";
            foreach ($validator->getMessages() as $messageId => $message) {
                $msg .= $message."\n";
            }

            $this->logErrorPdfLaudo($vistoria, $msg);
        }

        return $return;
    }

    private function sendEmail($vistoria = null, $filePath = null, $cc = null) {
        $emailLaudo = $this->montaEmailLaudo($vistoria);
        $email = $emailLaudo['email_obj'];
        $subject = $emailLaudo['titulo'];

        $email->clearFrom();
        $email->setFrom('vp@agrobrasilseguros.com.br', 'AgroBrasil - Agronet 2.0');

        $modelVistoriaFuncionarios = new Sistema_Model_VistoriasFuncionarios;
        $vistoriadores = $modelVistoriaFuncionarios->getVistoriadoresByVistoria($vistoria['id_vistoria']);

        $emailTi = 'ti@agrobrasilseguros.com.br';
        if (APPLICATION_ENV != 'production' ||
            in_array(861, array_keys($vistoriadores))) { //evita que as vistorias feitas pelo Fábio Bertoldi de enviar emails
            // $this->email->addTo('joao@7taps.com.br', 'João Rutkoski');
            $email->addTo($emailTi, 'TI - Agrobrasil');

            $subject .= " - HOMOLOG";
        } else {
            $email->addBcc($emailTi, 'TI - Agrobrasil');
            $email->addBcc('karina.silva@agrobrasilseguros.com.br', 'Karina Silva');
            $email->addBcc('flavia.dupont@agrobrasilseguros.com.br');
            $email->addBcc('raphael.funchal@agrobrasilseguros.com.br');
            $email->addCc('vp@agrobrasilseguros.com.br', 'Agro - VP');

            //para evitar que o corretor receba os emails quando não for em produção
            if ($cc && is_array($cc)) {
                if (isset($cc['email'])) {
                    if ($this->isEmailValid($cc['email'], $vistoria)) {
                        $email->addTo($cc['email'], $cc['nome']);
                    }
                } else {
                    if (isset($cc['segurado']) && $this->isEmailValid($cc['segurado']['email'], $vistoria)) {
                        $email->addCc($cc['segurado']['email'], $cc['segurado']['nome']);
                    }

                    if (isset($cc['corretor']) && $this->isEmailValid($cc['corretor']['email'], $vistoria)) {
                        $email->addTo($cc['corretor']['email'], $cc['corretor']['nome']);
                    }                    
                }
            }
        }

        $email->setSubject($subject);
        $email->setBodyHtml($emailLaudo['mensagem']);

        if (!is_null($filePath)) {
            $content = file_get_contents($filePath);
            $attachment = new Zend_Mime_Part($content);
            $attachment->type = mime_content_type($filePath);
            $attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
            $attachment->encoding = Zend_Mime::ENCODING_BASE64;
            $attachment->filename = basename($filePath);

            $email->addAttachment($attachment);
        }

        $email->send();

        unset($email);
    }

    /**
     * Monta o título e a mensagem do Email que é enviado para o corretor ou segurado
     *
     * @param $vistoria Valores da vistoria
     */
    private function montaEmailLaudo($vistoria) {
        $email = new Agro_Mail();

        if (APPLICATION_ENV == 'production') {
            $config = array(
                'ssl' => MAIL_SSL,
                'port' => MAIL_PORT,
                'auth' => MAIL_AUTH,
                'username' => MAIL_USERNAME,
                'password' => MAIL_PASSWORD
            );

            $transport = new Zend_Mail_Transport_Smtp(MAIL_SMTP, $config);
            $email->setDefaultTransport($transport);
        }


        $db = $this->getModel()->getAdapter();

        $Select = $db->select();
        $Select->from(array('pc' => 'seguro.v_id_proposta_mae_completo'), array('id_proposta', 'chave_mae'));
        $Select->where('id_proposta = ?', $vistoria['id_proposta']);
        $propostaCompleto = $db->fetchRow($Select);

        $selectProponente = $db->select();
        $selectProponente->from(array('pc' => 'seguro.propostas_proponentes'), '*');
        $selectProponente->where('id_proposta = ?', $vistoria['id_proposta']);
        $proponente = $db->fetchRow($selectProponente);

        $titulo = "VISTORIA - ".$vistoria['id_vistoria'].": Proposta ".$propostaCompleto['chave_mae']." / ".$proponente['ds_nome_proponente'];
        $at = Agro_Mail::getAssinatura($email, 1);
        $dataConclusaoVistoria = new DateTime($vistoria['dt_laudo']);

        $mensagem = "
<p style=\"margin-bottom: 15px\">Prezado Corretor,</p>

<p style=\"margin-bottom: 15px\">
Informamos que a vistoria foi realizada conforme documento em anexo.
</p>

<p style=\"margin-bottom: 15px\">
Data da realização: {$dataConclusaoVistoria->format('d/m/Y')}
</p>

<p style=\"margin-bottom: 45px\">
Status da Vistoria: Em análise pela Seguradora. 
</p>

<img src=\"cid:".$at->id."\" height=\"102\" width=\"480\" />
<br />
<span style=\"color: grey; margin: 0!important;  font-family: Verdana; font-size: .5em; text-align: left; display: block;\">
<font face='webdings' style=\"color: darkgreen\">i</font> 
<span style=\"color: darkblue\"> Este e-mail, inclusive anexos, podem conter informações confidenciais de propriedade exclusiva da AgroBrasil Seguros,
<br />não devendo ser utilizado, copiado ou revelado sem prévia autorização.</span> This e-mail, including attachments, is intended<br /> for
the person(s) or company named and may contain confidential and/or legally privileged information. Unauthorized<br /> disclosure,
copying or use of this information may be unlawful and is prohibited. If you are not the intended recipient,<br /> please delete this
message and notify the sender.
</span>
<br />
<span style=\"color: grey; margin: 0!important; font-family: Verdana; font-size: .5em; text-align: left; display: block\">
<font face='webdings'  style=\"color: darkgreen\">P</font> <span style=\"font-weight: bold\">Antes de imprimir, pense em seu compromisso com o Meio Ambiente.</span> Before printing, think about your<br /> commitment
to the environment.
</div>
";

        return array('titulo' => $titulo, 'mensagem' => $mensagem, 'email_obj' => $email);
    }

    private function getFileName($dados, $extension = 'pdf')
    {
        $ModelArquivos = new Seguro_Model_Vistoriapreviaempresaarquivos();
        $idArquivo = $ModelArquivos->getMaxArquivo($dados['id_proposta_vistoria']);
        if(!$idArquivo){
            $numero = 1;
        }else{
            $nomeArquivo = $ModelArquivos->getNomeArquivo($idArquivo);
            $nome = explode('_', $nomeArquivo);
            $numero = explode('.',$nome[3]);
            $numero = $numero[0] + 1;
        }

        $count = str_pad($numero, 3, '0', STR_PAD_LEFT);

        $ModelVistoriaPreviaEmpresa = new Seguro_Model_VistoriaPreviaEmpresa();
        $id_vistoria = $ModelVistoriaPreviaEmpresa->getIdVistoriaByIdPropostaVistoria($dados['id_proposta_vistoria']);
        $id_proposta = $ModelVistoriaPreviaEmpresa->getPropostaMaeVistoria($dados['id_proposta_vistoria']);

        return $id_proposta."_VP_".$id_vistoria."_".$count.".".$extension;
    }

    public function croquiAction()
    {
        $this->getHelper('layout')->disableLayout();

        $idPropostaVistoria = !Agro_Util::filterVariable($this->getRequest()->getParam('id_proposta_vistoria'))
            ? 0
            : (int)$this->getRequest()->getParam('id_proposta_vistoria');

        $proposta = (new Seguro_Model_Propostas())->find($this->getRequest()->getParam('id_proposta'))->current();
        $propriedade = $proposta->propriedade();
        $this->view->coordenadas = Agro_Util::coordenadas($propriedade['ds_coordenadas']);
        $this->view->id_proposta = $this->getRequest()->getParam('id_proposta');
        $this->view->id_proposta_vistoria = $idPropostaVistoria;

        $poligonos = (new Regulacao_Model_Lvp001Croqui())->getCroqui($idPropostaVistoria);

        $this->view->js = $this->assembleQuadras($poligonos);
    }

    private function assembleQuadras(array $quadras): string {
		$i = 1;
		$js_pols = '';

		foreach ($quadras as $quadra) {
			$paths = str_replace('latitude','lat',$quadra['ds_coordenadas_poligono']);
			$paths = str_replace('longitude','lng',$paths);
			$paths = str_replace('"','',$paths);

			$js_pols .= "var pol_$i = new google.maps.Polygon ({" .
				"paths: " . $paths . "," .
				"strokeColor: 'yellow'," .
				"editable: false," .
				"draggable: false," .
				"fillOpacity: 0.5 
			});" .
			"var label_$i = centerLabel(pol_$i, '".$quadra['nome']."');".
			"label_$i.setMap(map);" .
			"pol_$i.setMap(map);" .
			"toolTip(pol_$i, 'Area: ' + getArea(pol_$i) + 'ha'); ";
			
			$i++;
		}

		return $js_pols ? $js_pols : '';
	}

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

        $return['status'] = false;
        $return['message'] = '';

        $dados['id_proposta_vistoria'] = $this->getRequest()->getParam('id_proposta_vistoria');

        $filename = $this->getFileName($dados, 'png');
        $dados['ds_nome_arquivo'] = $filename;
        $dados['id_tipo_arquivo_laudo_previa'] = 1;

        $ModelPreviaArquivos = new Seguro_Model_Vistoriapreviaempresaarquivos();

        if ($this->checkCroqui($dados['id_proposta_vistoria']) < 5) {
            $ModelPreviaArquivos->save($dados);
            $base = explode(',', $this->getRequest()->getParam('img_croqui'));
            file_put_contents(APPLICATION_PATH . '/upload_files/laudoprevia/' . $filename, base64_decode($base[1]));
            $return['status'] = true;
            $return['message'] = 'Croqui salvo com sucesso.';
        } else {
            $return['status'] = false;
            $return['message'] = 'Atenção: É necessário apagar o croqui existente para salvar um novo.';
        }

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

    // verifica se já existe um croqui salvo
    private function checkCroqui($id_proposta_vistoria) {
        $ModelPreviaArquivo = new Seguro_Model_Vistoriapreviaempresaarquivos();
        $count = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("SELECT count(*) 
                            FROM seguro.propostas_vistorias_previas_arquivos
                            WHERE id_tipo_arquivo_laudo_previa = 1
                            AND id_proposta_vistoria = $id_proposta_vistoria");
        return $count;
    }

    public function gerarlaudosautomaticospendentesAction()
    {
        $this->isAjax();
        $retorno = ['erro' => false, 'mensagem' => 'Processo concluído com sucesso.'];
        $safra = !empty($this->getRequest()->getParam('id_safra')) ? $this->getRequest()->getParam('id_safra') : null;

        $laudosPendentes = (new Seguro_Model_Vistoriapreviaempresaarquivos())->getLaudosAutomaticosPendentes($safra);

        foreach ($laudosPendentes as $laudo) {
            Agro_Util::generateAtscript('geralaudoprevia.php',
              ['id_proposta_vistoria' => $laudo['id_proposta_vistoria']]);
        }

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