<?php

class Sinistro2_RegulacaoperdasController extends Agro_Controller_Action {

	public function loadAction() {
		$this->getHelper('layout')->disableLayout();
		$idProposta = $this->getRequest()->getParam('id_proposta');
		$idProcesso = $this->getRequest()->getParam('id_processo');

		$ModelProposta = new Seguro_Model_Propostas();
		$RowProposta = $ModelProposta->getRow($idProposta);
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();
		
		$User                = Zend_Auth::getInstance()->getIdentity();
		
		$this->view->bloquearLaudoDigitado = $User->tp_usuario != Sistema_Model_Usuarios::TIPO_USUARIO_FUNCIONARIO;

		$LaudosFinais      = new Sinistro2_Model_LaudosFinais();
		$Processo          = new Sinistro2_Model_Processos();
		$VistoriasAvisos   = new Sinistro2_Model_VistoriasAvisos();
		$Agendamento       = new Sistema_Model_Agendamentos();
		$AgronomosAgro     = new Sinistro2_Model_LaudosFinaisAgronomosAgro();

		$agendamentos                = $Agendamento->getAgendamentosProcessoSinistro($idProcesso);
		$rsVistoriasFinais           = $Processo->getDadosVistoriasFinais($idProposta, $User->id_empresa);
		$rsVistoriasPreliminares     = $Processo->getDadosVistoriasPreliminares($idProposta, $User->id_empresa);	

		if (count($rsVistoriasFinais) > 0) {
			$arFinal = array();
			$cont    = 0;
			foreach ($rsVistoriasFinais as $vistoriaFinal) {
				$arFinal[$cont]['ds_nome_cobertura']        = $vistoriaFinal['ds_nome_cobertura'];
				$arFinal[$cont]['id_cobertura']             = $vistoriaFinal['id_cobertura'];
				$arFinal[$cont]['id_vistoria']              = $vistoriaFinal['id_vistoria'];
				$arFinal[$cont]['id_agendamento']           = $vistoriaFinal['id_agendamento'];
				$arFinal[$cont]['dt_agendamento']           = $vistoriaFinal['dt_agendamento'];
				$arFinal[$cont]['ds_turno_agendamento']     = $vistoriaFinal['ds_turno_agendamento'];
				$arFinal[$cont]['id_laudo_final']           = $vistoriaFinal['id_laudo_final'];
				$arFinal[$cont]['dt_inicio_vistoria']       = $vistoriaFinal['dt_inicio_vistoria'];
				$arFinal[$cont]['ds_nome_fantasia']         = $vistoriaFinal['ds_nome_fantasia'];
				$arFinal[$cont]['id_empresa']               = $vistoriaFinal['id_empresa'];
				$arFinal[$cont]['id_status']                = $vistoriaFinal['id_status'];
				$arFinal[$cont]['ds_nome_laudo_fisico']     = $vistoriaFinal['ds_nome_laudo_fisico'];
				$arFinal[$cont]['fl_vistoria_valida']       = $vistoriaFinal['fl_vistoria_valida'];
				$arFinal[$cont]['id_vistoria_reavaliada']   = $vistoriaFinal['id_vistoria_reavaliada'];
				$arFinal[$cont]['fl_evento_nao_constatado'] = $vistoriaFinal['fl_evento_nao_constatado'];
				$arFinal[$cont]['avisos']                   = $VistoriasAvisos->getAvisosByVistoria($vistoriaFinal['id_vistoria']);
				$arFinal[$cont]['ds_url_laudo_edit']        = $this->getLaudoFinal($idProposta, $idProcesso, $vistoriaFinal['id_cobertura'], $vistoriaFinal['id_vistoria'], $vistoriaFinal['id_laudo_final']);
				$arFinal[$cont]['ds_url_laudo_view']        = $this->getLaudoFinal($idProposta, $idProcesso, $vistoriaFinal['id_cobertura'], $vistoriaFinal['id_vistoria'], $vistoriaFinal['id_laudo_final'], true);
				$arFinal[$cont]['ds_url_item_laudo_view']   = $this->getItemLaudoFinal($idProposta, $idProcesso, $vistoriaFinal['id_cobertura'], $vistoriaFinal['id_vistoria'], $vistoriaFinal['id_laudo_final']);
				if ($vistoriaFinal['id_laudo_final']) {
					$arFinal[$cont]['ds_periodo_vistoria']  = $LaudosFinais->getPeriodoVistoria($vistoriaFinal['id_laudo_final']);
				}

				$agronomos = $AgronomosAgro->getComboByLaudoFinal($vistoriaFinal['id_laudo_final']);
				// $arFinal[$cont]['agronomos_agro'] =
				$spacing = '';
				foreach ($agronomos as $agronomo) {
					$arFinal[$cont]['agronomos_agro'] .= $spacing . strtoupper($agronomo);
					$spacing = '</br></br>';
				}

				$arFinal[$cont]['ds_chave_status'] = $vistoriaFinal['ds_chave_status'];

				$arFinal[$cont]['fl_import_xml'] = (
					new Sinistro2_Model_TipoLaudoFinal()
					)->canImportXml(
						$vistoriaFinal['id_laudo_final'],
						$idProcesso,
						$vistoriaFinal['id_cobertura']
					);
				
				$cont++;
			}
		}

		if (count($rsVistoriasPreliminares) > 0) {
			$arPreliminar = array();
			$cont         = 0;
			foreach ($rsVistoriasPreliminares as $vistoriaPreliminar) {
				$arPreliminar[$cont]['ds_nome_cobertura']               = $vistoriaPreliminar['ds_nome_cobertura'];
				$arPreliminar[$cont]['id_cobertura']                    = $vistoriaPreliminar['id_cobertura'];
				$arPreliminar[$cont]['id_vistoria']                     = $vistoriaPreliminar['id_vistoria'];
				$arPreliminar[$cont]['id_agendamento']                  = $vistoriaPreliminar['id_agendamento'];
				$arPreliminar[$cont]['dt_agendamento']                  = $vistoriaPreliminar['dt_agendamento'];
				$arPreliminar[$cont]['ds_turno_agendamento']            = $vistoriaPreliminar['ds_turno_agendamento'];
				$arPreliminar[$cont]['ds_nome_vistoriador_agendamento'] = $vistoriaPreliminar['ds_nome_vistoriador_agendamento'];
				$arPreliminar[$cont]['id_laudo_preliminar']             = $vistoriaPreliminar['id_laudo_preliminar'];
				$arPreliminar[$cont]['dt_inicio_vistoria']              = $vistoriaPreliminar['dt_inicio_vistoria'];
				$arPreliminar[$cont]['ds_nome_fantasia']                = $vistoriaPreliminar['ds_nome_fantasia'];
				$arPreliminar[$cont]['id_status']                       = $vistoriaPreliminar['id_status'];
				$arPreliminar[$cont]['ds_nome_laudo_fisico']            = $vistoriaPreliminar['ds_nome_laudo_fisico'];
				$arPreliminar[$cont]['fl_evento_nao_constatado']        = $vistoriaPreliminar['fl_evento_nao_constatado'];
				$arPreliminar[$cont]['avisos']                          = $VistoriasAvisos->getAvisosByVistoria($vistoriaPreliminar['id_vistoria']);
				$arPreliminar[$cont]['ds_url_laudo_edit']               = $this->getLaudoPreliminar($idProposta, $idProcesso, $vistoriaPreliminar['id_cobertura'], $vistoriaPreliminar['id_vistoria'], $vistoriaPreliminar['id_laudo_preliminar']);
				$arPreliminar[$cont]['ds_url_laudo_view']               = $this->getLaudoPreliminar($idProposta, $idProcesso, $vistoriaPreliminar['id_cobertura'], $vistoriaPreliminar['id_vistoria'], $vistoriaPreliminar['id_laudo_preliminar'], true);
				$arPreliminar[$cont]['ds_chave_status'] 				= $vistoriaPreliminar['ds_chave_status'];
				$cont++;
			}
		}

		$ModelAgendamentos = new Sistema_Model_Agendamentos();

		foreach ($agendamentos as $a => $agendamento){
			if($agendamento['ds_chave_tipos_vistoria'] == 'FINAL'){
				if($ModelProdutoCobertura->getFlVistoriaPreliminar($RowProposta->id_produto, $agendamento['id_cobertura'])){
					$agendamentos[$a]['habilitaFinal'] =  $ModelAgendamentos->checkPreliminarPendente($agendamento['id_cobertura'], $idProcesso);
				}else{
					$agendamentos[$a]['habilitaFinal'] = true;
				}
			}

			//adiciona um "hint" dos vistoriadores agendados.
			if($agendamento['ds_status'] == 'AGENDADO') {
				$peritos = array();
				$vistoriadores = $ModelAgendamentos->getAgendamentoVistoriadores($agendamento['id_vistoria']);
				foreach ($vistoriadores as $v) { 
					array_push($peritos, $v['ds_nome_funcionario']);
				}

				$agendamentos[$a]['vistoriadores'] = implode("&#10;", $peritos);
			}
		}
		
		$this->view->agendamentos = $agendamentos;
		$this->view->vistoriaspreliminares = $arPreliminar;
		$this->view->vistoriasfinais = $arFinal;
		
		$data                             = array();
		$data['idProposta']               = $idProposta;
		$data['idProcesso']               = $idProcesso;
		$data['dsStatusProcesso']         = $Processo->getChaveStatus($idProcesso);

		// Busca informacões sobre Vistoria Previa
		$VistoriaPrevia = new Seguro_Model_VistoriaPreviaEmpresa();
		$arInfoVistoriaPrevia = $VistoriaPrevia->getStatusAnaliseByProposta($data['idProposta']);
		$data['ar_vistorias_previa'] = $arInfoVistoriaPrevia;

		$ModelSafras = new Produto_Model_Safras();
		$safra       = $ModelSafras->getSafraModel($data['idProposta']);
		$safraModel  = $ModelSafras->getSafraModel($data['idProposta'], "Lvp001");
		$safra_atual = $ModelSafras->getSafraAtual();
		$safra_prop  = $RowProposta->safra();

		$ModelLvp001 = new $safraModel();
		foreach($data['ar_vistorias_previa'] as $key => $vistoria){
			$arLaudo = $ModelLvp001->getLaudo($vistoria['id_proposta_vistoria']);
			if($arLaudo['id'] > 0){
				$data['ar_laudos'][$vistoria['id_proposta_vistoria']] = $arLaudo['id'];
			}
		}

		$data['safra']      = $safra;
		$data['safraModel'] = $safraModel;
		$data['id_safra']   = $safra_atual['id'];
		$data['id_safra_proposta'] = $safra_prop['id'];
		$this->view->data   = $data;

		$NumAviso = $Processo->getAvisosByProcesso($idProcesso);
		$this->view->num_aviso = $NumAviso['total'];

		$this->view->notas_fiscais_arquivos = (new Sinistro2_Model_ProcessosNotasFiscais())->getNotasFiscaisArquivoByIdProcesso($idProcesso);

		//Busca notas do processo
		$this->view->notas_fiscais_digitadas = (new Sinistro2_Model_ProcessosNotasFiscais())->getNotasFiscaisByIdProcesso($this->getRequest()->getParam('id_processo'));
		$Status = new Sistema_Model_Status();
		$this->view->ds_status = ($this->view->notas_fiscais_digitadas[0]['ds_status'] ? 
			$this->view->notas_fiscais_digitadas[0]['ds_status'] : 
			$Status->getNameById($Status->getIdByChaveTipoChave('NAO_DIGITADA','NOTAS_FISCAIS_DIGITACAO')));

		$modelProcessosEmpresa = new Sinistro2_Model_ProcessosEmpresas();
		$this->view->empresasProcesso = $modelProcessosEmpresa->getTodasEmpresasEnvolvidasByProcesso($idProcesso, false);
		$this->view->idEmpresaUserLogado = $idEmpresaUserLogado;

		$modelItensSegurados = new Seguro_Model_ItensSegurados();
		$this->view->itensSeguradosProposta = $modelItensSegurados->getItemSeguradoByProposta($idProposta);

		$this->view->statusPendenciasRegulacaoLaudos = $Status->getComboSimples("ARQUIVOS_PENDENTES_REGULACAO_LAUDOS");
		unset($this->view->statusPendenciasRegulacaoLaudos[0]);

		$modelProcessosArquivosPendencias = new Sinistro2_Model_ProcessosArquivosPendencias();
		$this->view->processosArquivosPendencias = $modelProcessosArquivosPendencias->getByProcesso($idProcesso);

		$this->view->isProcessoEmpresaAtiva = $Processo->isProcessoEmpresaAtiva($idProcesso);

		$rowProcesso = $Processo->getRow($idProcesso);
		$this->view->fl_arquivos_regulacao_conferidos = $rowProcesso['fl_arquivos_regulacao_conferidos'];
	}

	public function getLaudoPreliminar($idProposta, $idProcesso, $idCobertura, $idVistoria, $idLaudoPreliminar = null) {
		$schema = false;
		$controller = false;

		$ModelPropostas = new Seguro_Model_Propostas();
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();

		// Busca o schema da safra
		$Safra = new Produto_Model_Safras();
		$schema = $Safra->getSafraModel($idProposta);

		// Busca id do produto da proposta
		$Proposta = $ModelPropostas->getProposta($idProposta);
		$idProduto = $Proposta['id_produto'];

		$idSafra = $Safra->getSafraByProduto($idProduto);

		//ajuste para unificar safras no schema "regulacao"
		if($idSafra >= 18){
			$schema = 'regulacao';
		}

		// Produto Cobertura
		$ProdutoCobertura = $ModelProdutoCobertura->find($idProduto, $idCobertura)->current();
		$controller = $ProdutoCobertura->laudoPreliminar();

		if ($schema && $controller) {
			return "/$schema/$controller/form/id_proposta/$idProposta/id_processo/$idProcesso/id_cobertura/$idCobertura/id_vistoria/$idVistoria" . ($idLaudoPreliminar ? "/id/$idLaudoPreliminar" : "");
		} else {
			return '#';
		}
	}

	public function getLaudoFinal($idProposta, $idProcesso, $idCobertura, $idVistoria, $idLaudoFinal = null) {
		$schema = false;
		$controller = false;

		$ModelPropostas = new Seguro_Model_Propostas();
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();

		// Busca o schema da safra
		$Safra = new Produto_Model_Safras();
		$schema = $Safra->getSafraModel($idProposta);

		// Busca id do produto da proposta
		$Proposta = $ModelPropostas->getProposta($idProposta);
		$idProduto = $Proposta['id_produto'];

		$idSafra = $Safra->getSafraByProduto($idProduto);

		//ajuste para unificar safras no schema "regulacao"
		if($idSafra >= 18){
			$schema = 'regulacao';
		}

		// Produto Cobertura
		$ProdutoCobertura = $ModelProdutoCobertura->find($idProduto, $idCobertura)->current();
		$controller = $ProdutoCobertura->laudoFinal();

		if ($schema && $controller) {
			return "/$schema/$controller/form/id_proposta/$idProposta/id_processo/$idProcesso/id_cobertura/$idCobertura/id_vistoria/$idVistoria" . ($idLaudoFinal ? "/id_laudo_final/$idLaudoFinal" : "");
		} else {
			return '#';
		}
	}

	public function getItemLaudoFinal($idProposta, $idProcesso, $idCobertura, $idVistoria, $idLaudoFinal = null) {
		$schema = false;
		$controller = false;

		$ModelPropostas = new Seguro_Model_Propostas();
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();

		// Busca o schema da safra
		$Safra = new Produto_Model_Safras();
		$schema = $Safra->getSafraModel($idProposta);

		// Busca id do produto da proposta
		$Proposta = $ModelPropostas->getProposta($idProposta);
		$idProduto = $Proposta['id_produto'];

		$idSafra = $Safra->getSafraByProduto($idProduto);

		//ajuste para unificar safras no schema "regulacao"
		if($idSafra >= 18){
			$schema = 'regulacao';
		}

		// Produto Cobertura
		$ProdutoCobertura = $ModelProdutoCobertura->find($idProduto, $idCobertura)->current();
		$controller = $ProdutoCobertura->laudoFinal();

		if ($schema && $controller) {

			return "/".$schema."/".$controller."itemsegurado"."/".form."/".id_proposta."/".$idProposta."/".id_processo."/".$idProcesso."/".id_cobertura."/".$idCobertura."/".id_vistoria."/".$idVistoria . ($idLaudoFinal ? "/id_laudo_final/$idLaudoFinal/edit/0" : "");
		} else {
			return '#';
		}
	}

	public function adicionarprocessosarquivospendenciaAction()
	{
        $this->isAjax();
        $return = ['status' => true, 'message' => 'Salvo com sucesso.'];

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $modelProcessosArquivosPendencias = new Sinistro2_Model_ProcessosArquivosPendencias();
            $modelStatus = new Sistema_Model_Status();
            $params = $this->getRequest()->getParams();
            $nomesArquivos = [];

            if (empty($params['id_processo'])) {
                throw new Exception("Processo não informado.");
            }

            if (empty($params['id_status'])) {
                throw new Exception("Status não informado.");
            }

            if (empty($params['id_empresa'])) {
                throw new Exception("Empresa não informada.");
            }

            if (empty($params['nr_tipo'])) {
                throw new Exception("Tipo não informado.");
            }

            if (
                in_array(
                    $params['nr_tipo'],
                    [
                        Sinistro2_Model_ProcessosArquivosPendencias::TIPO_LAUDO_PARCIAL_FINAL,
                        Sinistro2_Model_ProcessosArquivosPendencias::TIPO_LAUDO_FINAL
                    ]
                )
            ) {
                if (empty($params['nr_item_segurado'])) {
                    throw new Exception("Item não informado.");
                }
            }

            if (empty($params['id_proposta'])) {
                throw new Exception("Proposta não informada.");
            }

            if (!file_exists(Sinistro2_Model_ProcessosArquivosPendencias::FILE_PATH)) {
                mkdir(Sinistro2_Model_ProcessosArquivosPendencias::FILE_PATH, '0755', true);
            }

            if (empty($params['id']) && empty($_FILES)) {
                throw new Exception("Ao menos um arquivo deve ser informado.");
            }

            if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro() && !empty($params['id'])) {
                $params['id_status'] = $modelStatus->getIdStatus(
                    'NAO_ANALISADO',
                    'ARQUIVOS_PENDENTES_REGULACAO_LAUDOS'
                );
            }

            if (!empty($_FILES)) {
                $diretorio = Sinistro2_Model_ProcessosArquivosPendencias::getDiretorioByStatus($params['id_status']);

                $adapter = new Zend_File_Transfer_Adapter_Http();
                $adapter->setDestination($diretorio);
                $adapter->addValidator('Extension', false, ['pdf', 'jpg', 'jpeg']);

                if (!$adapter->isValid()) {
                    throw new Exception("Formato de arquivo inválido (formato aceito: PDF, JPG ou JPEG).");
                }

                $contadorArquivos = 0;
                $files = $adapter->getFileInfo();

                foreach ($files as $file) {
					$infoArquivo = pathinfo($file['name']);
				
					if (preg_match('/[áéíóúàèìòùâêîôûãõçÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕÇ@#$%&*()\[\]\{\}<>:;?\/°\.]/u', $infoArquivo['filename'])) {
    					throw new Exception("Nome de arquivo inválido. Arquivo [ {$file['name']} ] possui caracteres especiais.");
					}


                    $nomeArquivo = $this->gerarNomeArquivoPendencia(
                        $contadorArquivos,
                        Agro_Util::getExtension($file['name'])
                    );

                    if (!copy($file['tmp_name'], $diretorio . "/" . $nomeArquivo)) {
                        throw new Exception("Não foi possível copiar o arquivo {$file['name']} para a pasta.");
                    }

                    if (!empty($params['id'])) {
                        $processoArquivoPendencia = $modelProcessosArquivosPendencias->find($params['id'])->current();
                        $file = Sinistro2_Model_ProcessosArquivosPendencias::getDiretorioByStatus(
                            $processoArquivoPendencia['id_status']
                        );
                        $file .= "/" . $processoArquivoPendencia['ds_nome_arquivo'];

                        if (file_exists($file)) {
                            unlink($file);
                        }
                    }

                    $params['ds_nome_arquivo'] = $nomeArquivo;
                    $nomesArquivos[] = $nomeArquivo;

                    $modelProcessosArquivosPendencias->save($params);
                    $contadorArquivos++;
                }
            } else {
                $processoArquivoPendencia = $modelProcessosArquivosPendencias->find($params['id'])->current();
                $params['ds_nome_arquivo'] = $this->gerarNomeArquivoPendencia(
                    0,
                    Agro_Util::getExtension($processoArquivoPendencia['ds_nome_arquivo'])
                );
                $nomesArquivos[] = $params['ds_nome_arquivo'];

                $modelProcessosArquivosPendencias->save($params);

                $oldFileName = Sinistro2_Model_ProcessosArquivosPendencias::getDiretorioByStatus(
                    $processoArquivoPendencia['id_status']
                );
                $oldFileName .= "/" . $processoArquivoPendencia['ds_nome_arquivo'];
                $oldFileName .= realpath($oldFileName);

                $newFileName = Sinistro2_Model_ProcessosArquivosPendencias::getDiretorioByStatus($params['id_status']);
                $newFileName .= "/" . $params['ds_nome_arquivo'];
                $newFileName .= realpath($newFileName);

                if ($oldFileName && $newFileName && !rename($oldFileName, $newFileName)) {
                    throw new Exception("Erro ao mover arquivo.");
                }
            }

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
        } catch (\Throwable $th) {
            $diretorio = Sinistro2_Model_ProcessosArquivosPendencias::getDiretorioByStatus($params['id_status']);

            foreach ($nomesArquivos as $nomeArquivo) {
                $sanitizedPath = realpath($diretorio . "/" . $nomeArquivo);

                if (file_exists($sanitizedPath)) {
                    unlink($sanitizedPath);
                }
            }

            $return['status'] = false;
            $return['message'] = $th->getMessage();
            Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
        }

        $this->getResponse()->setBody(Zend_Json::encode($return));
    }

	private function gerarNomeArquivoPendencia($contadorArquivos, $extensao)
	{
		$params = $this->getRequest()->getParams();
		
		$sigla = Sinistro2_Model_ProcessosArquivosPendencias::getSiglaByTipo($params['nr_tipo']);
		$hash = time() + $contadorArquivos;
		$nomeArquivo = "{$params['id_proposta']}_{$sigla}_{$hash}";

		if (!empty($params['nr_item_segurado'])) {
			$nomeArquivo .= "_{$params['nr_item_segurado']}";
		}
		
		$nomeArquivo .= ".{$extensao}";
		return $nomeArquivo;
	}

	public function atualizarstatusprocessosarquivospendenciaAction()
	{
		$this->isAjax();
		$return = ['status'=> true, 'message' => 'Status atualizado com sucesso.'];

		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

			$modelArquivosPendencias = new Sinistro2_Model_ProcessosArquivosPendencias();
			$params = $this->getRequest()->getParams();

			if (empty($params['id'])) {
				throw new Exception("Id do arquivo da pendência não informado.");
			}

			if (empty($params['id_status'])) {
				throw new Exception("Status do arquivo da pendência não informado.");
			}

			$modelArquivosPendencias->atualizarStatus($params['id'], $params['id_status']);

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (\Throwable $th) {

			$return['status'] = false;
			$return['message'] = $th->getMessage();
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function processosarquivospendenciasAction()
	{
		$this->isAjax(true);
		$modelProcessosEmpresa = new Sinistro2_Model_ProcessosEmpresas();
		$modelItensSegurados = new Seguro_Model_ItensSegurados();
		$modelProcessosArquivosPendencias = new Sinistro2_Model_ProcessosArquivosPendencias();
		$Status = new Sistema_Model_Status();
		$User = Zend_Auth::getInstance()->getIdentity();
		$modelUsuarios = new Sistema_Model_Usuarios();
		
		$idProcesso = $this->getRequest()->getParam('id_processo');
		$idProposta = $this->getRequest()->getParam('id_proposta');
		$id = $this->getRequest()->getParam('id');
		$isUsuarioLogadoAgro = Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro();

		$this->view->empresasProcesso = $modelProcessosEmpresa->getTodasEmpresasEnvolvidasByProcesso($idProcesso, false);
		$this->view->idEmpresaUserLogado = $User->id_empresa;
		$this->view->itensSeguradosProposta = $modelItensSegurados->getItemSeguradoByProposta($idProposta);
		$this->view->statusPendenciasRegulacaoLaudos = $Status->getComboSimples("ARQUIVOS_PENDENTES_REGULACAO_LAUDOS");
		unset($this->view->statusPendenciasRegulacaoLaudos[0]);
		$this->view->processoArquivoPendencia = [];
		$this->view->permiteEditarEmpresa = $isUsuarioLogadoAgro;

		if (!empty($id)) {
			$this->view->permiteEditarEmpresa = false;
			
			$processosArquivosPendencias =  $modelProcessosArquivosPendencias->find($id)->current();
			$this->view->processoArquivoPendencia = $processosArquivosPendencias;

			if ($isUsuarioLogadoAgro && $modelUsuarios->isFuncionarioAgro($processosArquivosPendencias['id_usuario_criacao'])) {
				$this->view->permiteEditarEmpresa = true;
			}
		}
	}

	public function excluirprocessosarquivospendenciasAction()
	{
		$this->isAjax();
		$return = ['status'=> true, 'message' => 'Excluído com sucesso.'];

		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

			$modelProcessosObservacoesArquivos = new Sinistro2_Model_ProcessosObservacoesArquivos();
			$params = $this->getRequest()->getParams();

			if (!isset($params['excluirPermanente'])) {
				throw new Exception("Tipo de exclusão não informada.");
			}

			if (empty($params['origem'])) {
				throw new Exception("Origem da exclusão não informada.");
			}
			
			if (empty($params['id_processo'])) {
				throw new Exception("Processo não informado.");
			}

			switch ($params['origem']) {
				case 'pendencias':
					$nomeArquivo = $this->excluirArquivoOrigemPendencias($params['id'], $params['excluirPermanente']);
					break;
				case 'laudosFinais':
				case 'laudosPreliminares':
					$nomeArquivo = $this->excluirArquivoOrigemLaudos($params['ds_nome_arquivo'], $params['excluirPermanente']);
					break;
				
				default:
					throw new Exception("Origem informada não identificada.");
					break;
			}

			$idObservacao = $modelProcessosObservacoesArquivos->insert(array(
				'ds_observacao_arquivos' => $this->montarObservacaoExclusao($params['origem'], $params['excluirPermanente'], $nomeArquivo),
				'id_processo' => $params['id_processo'],
				'ds_nome_arquivo' => (!$params['excluirPermanente']) ? $nomeArquivo : ''
			));

			if (!$idObservacao) {
				throw new Exception("Erro ao incluir a observação da exclusão.");
			}

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (\Throwable $th) {

			$return['status'] = false;
			$return['message'] = $th->getMessage();
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Exclui o arquivo da tabela processos_arquivos_pendencias, e caso seja exclusão lógica, move o arquivo para a pasta processos_arquivos_excluidos
	 * 
	 * @param int $id
	 * @param bool $excluirPermanente
	 * @return string
	 */
	private function excluirArquivoOrigemPendencias(int $id, bool $excluirPermanente): string
	{
		if (empty($id)) {
			throw new Exception("Id do arquivo da pendência não informado.");
		}

		$modelProcessosObservacoesArquivos = new Sinistro2_Model_ProcessosObservacoesArquivos();
		$modelProcessosArquivosPendencias = new Sinistro2_Model_ProcessosArquivosPendencias();
		$processoArquivoPendencia = $modelProcessosArquivosPendencias->find($id)->current();

		if (empty($processoArquivoPendencia)) {
			throw new Exception("Arquivo não encontrado para o id informado.");
		}

		if ($excluirPermanente) {
			$modelProcessosArquivosPendencias->excluirPermanentemente($id);
		} else {
			$modelProcessosArquivosPendencias->excluirLogicamente($id);
			$modelProcessosObservacoesArquivos->moverArquivoExcluidoLogicamente(Sinistro2_Model_ProcessosArquivosPendencias::getDiretorioByStatus($processoArquivoPendencia['id_status']) ."/". $processoArquivoPendencia['ds_nome_arquivo']);
		}

		return $processoArquivoPendencia['ds_nome_arquivo'];
	}

	/**
	 * Caso o arquivo seja de origem da tabela processos_arquivos_pendencias.
	 * Caso seja exclusão lógica, move o arquivo para a pasta processos_arquivos_excluidos
	 * 
	 * @param int $id
	 * @param bool $excluirPermanente
	 * @return string
	 */
	private function excluirArquivoOrigemLaudos(string $nomeArquivo, bool $excluirPermanente): string
	{
		if (empty($nomeArquivo)) {
			throw new Exception("Nome do arquivo não informado.");
		}

		$modelProcessosObservacoesArquivos = new Sinistro2_Model_ProcessosObservacoesArquivos();
		$modelProcessosArquivosPendencias = new Sinistro2_Model_ProcessosArquivosPendencias();
		$select = $modelProcessosArquivosPendencias->getData("ds_nome_arquivo = '{$nomeArquivo}'");
		$processoArquivoPendencia = $modelProcessosArquivosPendencias->fetchAll($select);
		
		if (!empty($processoArquivoPendencia[0]['id'])) {
			$this->excluirArquivoOrigemPendencias($processoArquivoPendencia[0]['id'], $excluirPermanente);
		} else {

			$caminhoArquivo = PATH_LAUDOS . "/". $nomeArquivo;
			if ($excluirPermanente) {

				if (!file_exists($caminhoArquivo)) {
					throw new Exception("Arquivo não encontrado.");
				}

				if (!unlink($caminhoArquivo)) {
					throw new Exception("Não foi possível excluir o arquivo.");
				}

			} else {
				$modelProcessosObservacoesArquivos->moverArquivoExcluidoLogicamente($caminhoArquivo);
			}
		}

		return $nomeArquivo;
	}
	
	/**
	 * Monta a observação de acordo com a origem e o tipo de exclusão
	 * 
	 * @param string $origem
	 * @param bool $excluirPermanente
	 * @param string $nomeArquivo
	 * @return string
	 */
	private function montarObservacaoExclusao(string $origem, bool $excluirPermanente, string $nomeArquivo): string
	{
		$observacao = "";

		if ($excluirPermanente) {
			switch ($origem) {
				case 'pendencias':
					$observacao = "Arquivo {$nomeArquivo} foi excluído definitivamente do processo, pela aba 'Pendências'.";
					break;
				case 'laudosFinais':
					$observacao = "Arquivo {$nomeArquivo} foi excluído definitivamente das vistorias finais do processo.";
					break;
				case 'laudosPreliminares':
					$observacao = "Arquivo {$nomeArquivo} foi excluído definitivamente das vistorias preliminares do processo.";
					break;
			}
		} else {
			switch ($origem) {
				case 'pendencias':
					$observacao = "Arquivo {$nomeArquivo} foi excluído das pendências do processo.";
					break;
				case 'laudosFinais':
					$observacao = "Arquivo {$nomeArquivo} foi excluído das vistorias finais do processo.";
					break;
				case 'laudosPreliminares':
					$observacao = "Arquivo {$nomeArquivo} foi excluído das vistorias preliminares do processo.";
					break;
			}
		}

		return $observacao;
	}

	public function buscapendenciasAction(){
		$this->getHelper('layout')->disableLayout();

		$modelPropostas = new Seguro_Model_Propostas();
		$modelProcessosEmpresa = new Sinistro2_Model_ProcessosEmpresas();
		$modelProcesso = new Sinistro2_Model_Processos();

		$idProposta = $this->getRequest()->getParam('id_proposta');
		$Proposta  = $modelPropostas->getRow($idProposta);
		$this->view->chamados = $Proposta->chamados('PENDENCIA_VISTORIA');

		$this->view->pendencias = [
			['ds_nome_pendencia' => "Inserir modelo de autorização padrão."],
			['ds_nome_pendencia' => "Inserir declaração informando rendimento/dano correto."],
			['ds_nome_pendencia' => "Inserir laudo(s) referente aos demais avisos não citados."],
			['ds_nome_pendencia' => "Inserir declaração especificando o tipo de dano não coberto."],
			['ds_nome_pendencia' => "Laudo não pertence ao processo."],
			['ds_nome_pendencia' => "Laudo ilegível."],
			['ds_nome_pendencia' => "Arquivo corrompido, inserir laudo novamente."],
			['ds_nome_pendencia' => "Inserir laudo preliminar dos demais talhões."],
			['ds_nome_pendencia' => "Inserir laudo com a seguinte observação: Este laudo substitui o laudo anterior."],
			['ds_nome_pendencia' => "Inserir laudo devidamente assinado."],
			['ds_nome_pendencia' => "Inserir laudo referente ao restante da área."],
			['ds_nome_pendencia' => "O modelo do laudo está incorreto."],
			['ds_nome_pendencia' => "Inserir declaração datada e assinada pelo perito, corrigindo:"]
		];

		$idProcesso = $modelProcesso->getIdProcessoByProposta($Proposta->id);
		$this->view->empresasProcesso = $modelProcessosEmpresa->getTodasEmpresasEnvolvidasByProcesso($idProcesso);
	}

	public function salvarpendenciasAction() {
		$this->isAjax();

		$return = ['status'=> true, 'message' => 'Pendência cadastrada com sucesso.'];

		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			$params = $this->getRequest()->getParams();

			$TipoChamado = new Atendimento_Model_TipoChamado();
			$Departamento = new Sistema_Model_Departamentos();
			$Prioridade = new Atendimento_Model_Prioridade();
			$Chamado = new Atendimento_Model_Chamado();

			if (empty($params['id_proposta'])) {
				throw new Exception("Proposta não informada.");
			}

			if (empty($params['ds_descricao'])) {
				throw new Exception("Ao menos uma pendência deve ser selecionada ou a observação escrita.");
			}

			if (empty($params['id_empresa'])) {
				throw new Exception("Empresa não informada.");
			}
	
			$descricaoPadrao = "\n\n O(s) anexo(s) de documento(s) solicitado(s) deve(m) ser realizado(s) em Processo de sinistro > aba 'Regulação e Laudos' > bloco de 'Pendências': botão 'Cadastrar Arquivos'. 
			- Em caso de dúvidas, consultar o 'Tutorial Pendências de vistorias', no menu: Manuais";

			$dados = array(
				'id_tipo_chamado' => $TipoChamado->getIdTipoChamado('PENDENCIA_VISTORIA'),
				'id_prioridade' => $Prioridade->getIdPrioridade('NORMAL'),
				'id_departamento' => $Departamento->getDepartamentoEmpresa("03.486.745/0001-09", "SINISTRO"),
				'id_proposta' => $params['id_proposta'],
				'ds_descricao' => $params['ds_descricao'] . $descricaoPadrao,
				'ds_tipo_destinatario' => Atendimento_Model_ChamadoDestinatario::DESTINATARIO_EMPRESA_VISTORIA,
				'id_empresa' => $params['id_empresa']
			);
			
			if (!$Chamado->save($dados)) {
				throw new Exception("Erro ao cadastrar pendência.");
			}

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (\Throwable $th) {

			$return['status'] = false;
			$return['message'] = $th->getMessage();
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));		
	}

	public function conferirarquivosregulacaoAction()
	{
		$this->isAjax();
		$return = ['status'=> true, 'message' => 'Conferido com sucesso.'];

		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			$params = $this->getRequest()->getParams();

			if (empty($params['id_processo'])) {
				throw new Exception("Processo não informado.");
			}

			$modelProcesso = new Sinistro2_Model_Processos();
			$rowProcesso = $modelProcesso->getRow($params['id_processo']);

			if (empty($rowProcesso['id'])) {
				throw new Exception("Processo não encontrado.");
			}

			$flArquivosRegulacaoConferidos = ($rowProcesso['fl_arquivos_regulacao_conferidos']) ? 'f' : 't';
			
			if (!$modelProcesso->update(["fl_arquivos_regulacao_conferidos" => $flArquivosRegulacaoConferidos], "id = {$params['id_processo']}")) {
				throw new Exception("Erro ao alterar a conferência dos arquivos da regução do processo.");
			}

			if ($flArquivosRegulacaoConferidos == 'f') {
				$return['message'] = 'Cancelamento de conferência realizada com sucesso.';
			}

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (\Throwable $th) {

			$return['status'] = false;
			$return['message'] = $th->getMessage();
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));		
	}
}
