<?php

class Sinistro2_CobrancaessorController extends Agro_Controller_Action {

	/**
	 * @var Sinistro2_Service_Gerarcobranca
	 */
	private $gerarCobrancaService;

	public function getModel($tipoVistoria = null) {
		if (strtolower($tipoVistoria) == 'previa' || strtolower($tipoVistoria) == 'prévia') {
			return new Sinistro2_Model_CobrancaPreviaEssor();
		} else {
			return new Sinistro2_Model_CobrancaPreliminarFinalEssor();
		}
	}

	public function getForm() {
		return new Sinistro2_Form_Cobranca();
	}

	public function init() {
		$this->view->title = 'Sinistro » Cobrança';
		$this->gerarCobrancaService = new Sinistro2_Service_Gerarcobranca();
	}

	public function saveAction(){
		$this->isAjax();
		$dados = array();

		//dados referentes a nota
		$dados['id_cobranca_relatorio'] = $this->getRequest()->getParam('id_cobranca_relatorio');
		//$dados['nr_nota_fiscal'] = $this->getRequest()->getParam('nr_nota_fiscal') ? $this->getRequest()->getParam('nr_nota_fiscal') : null;
		$dados['nota_honorarios'] = $this->getRequest()->getParam('notaValorHonorarios');
		$dados['nota_valor_km'] = $this->getRequest()->getParam('notaValorKm');
		$dados['nota_despesas'] = $this->getRequest()->getParam('notaValorDespesas');
		$dados['tipo_relatorio'] =  $this->getRequest()->getParam('tipoRelatorio');

		$status = new Sistema_Model_Status();
		$dados['id_status'] = $status->getId('NAO_ENVIADO','RELATORIO_COBRANCA');

		//dados referentes a vistoria
		$id_cobranca_relatorio_vistoria = $this->getRequest()->getParam('id_cobranca_relatorio_vistoria');
		$vistorias = $this->getRequest()->getParam('id_vistoria');
		$honorarios = $this->getRequest()->getParam('vistoriaHonorarios');
		$kmvalores = $this->getRequest()->getParam('vistoriaKmValor');
		$kmquantidade = $this->getRequest()->getParam('vistoriaKmQuantidade');
		$despesas = $this->getRequest()->getParam('vistoriaTotalDespesas') ? $this->getRequest()->getParam('vistoriaTotalDespesas') : 0;

		//dentro das despesas da vistoria
		$hotel = $this->getRequest()->getParam('vistoriaHotel');
		$alimentacao = $this->getRequest()->getParam('vistoriaAlimentacao');
		$pedagio = $this->getRequest()->getParam('vistoriaPedagio');

		if($dados['tipo_relatorio'] == 'P' || $dados['tipo_relatorio'] == 'Previa' || $dados['tipo_relatorio'] == 'Prévia'){
			$model = $this->getModel('previa');
		}else{
			$model = $this->getModel();
		}

		foreach($vistorias as $key => $value){
			$dados['vistorias'][$key]['id_vistoria'] = $value;
			$dados['vistorias'][$key]['id_cobranca_relatorio_vistoria'] = $id_cobranca_relatorio_vistoria[$key];
			$dados['vistorias'][$key]['despesas'] = $despesas[$key];
			$dados['vistorias'][$key]['km_valor'] = $kmvalores[$key];
			$dados['vistorias'][$key]['honorarios'] = $honorarios[$key];
			$dados['vistorias'][$key]['hotel'] = $hotel[$key];
			$dados['vistorias'][$key]['alimentacao'] = $alimentacao[$key];
			$dados['vistorias'][$key]['pedagio'] = $pedagio[$key];
			$dados['vistorias'][$key]['km_quantidade'] = $kmquantidade[$key];
		}

		if($model->save($dados)){
			$result = "Dados gravados com sucesso!";
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}


	public function gerarcobrancaAction()
	{
		$this->isAjax();

		$return = [];
		
		try {
			$adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

            $adapter->beginTransaction();

			$idsVistorias = $this->getRequest()->getParam('idsVistorias');
			$isPrevia = !empty($this->getRequest()->getParam('isPrevia')) ? true : false;
			
			$idsVistoriasInvalidos = array_filter($idsVistorias, function($value) {
				return filter_var($value, FILTER_VALIDATE_INT) === false;
			});

			if (!empty($idsVistoriasInvalidos)) {
				throw new Exception('IDs das vistorias devem ser inteiros.');
			}

			if (empty($idsVistorias)) {
				throw new Exception('Necessário selecionar ao menos uma vistoria.');
			}
			
			$idCobrancaRelatorio = $this->gerarCobrancaService->gerarCobranca(explode(',', $idsVistorias), $isPrevia);
			
			$adapter->commit();

			$return = ['status' => true, 'message' =>"Relatório com ID {$idCobrancaRelatorio} gerado com sucesso!"];

		} catch (Exception $e) {
			$adapter->rollback();
			
			$message = APPLICATION_ENV != 'production' ? $e->getMessage() : 'Erro ao gerar relatório de cobrança.';
			$return = ['status' => false, 'message' => $message];
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function listAction()
	{
		try {
			$this->getHelper('layout')->disableLayout();
			
			$modelVistoria = new Sistema_Model_Vistorias();
	
			$isPrevia = $this->getRequest()->getParam('tipo_grupo_produto') == 1
				|| $this->getRequest()->getParam('tipo_grupo_produto') == 3;
			
			$rsDados = $modelVistoria->fetchAll(
				$modelVistoria->getSelectDadosGerarRelatorio($this->getRequest()->getParams(), $isPrevia)
			);

			$mapIdFuncionarioVistoriasPorData = [];
			
			foreach ($rsDados as $row) {
				$idsFuncionarios = explode(',', $row['ids_funcionarios']);
				$dataVistoria = DateTime::createFromFormat('Y-m-d H:i:s', $row['dt_vistoria']);

				foreach ($idsFuncionarios as $id) {
					if (!empty($dataVistoria)) {
						$mapIdFuncionarioVistoriasPorData[$id][$dataVistoria->format('Y-m-d')][] = $row['id_vistoria'];
					}
				}
			}

			$this->view->json = Zend_Json::encode($mapIdFuncionarioVistoriasPorData);
			$this->view->isPrevia = $isPrevia;
			$this->view->paginator = $rsDados;
		} catch (Exception $e) {
		}
	}

	public function downloadzipAction(): void
	{
		$this->isAjax();

		try {
			
			$idCobrancaRelatorio = $this->getRequest()->getParam('idCobrancaRelatorio');
			$tipoRelatorio = $this->getRequest()->getParam('tipoRelatorio');

			if (!filter_var($idCobrancaRelatorio, FILTER_VALIDATE_INT)) {
				throw new Exception('ID Cobrança Relatório deve ser um inteiro.', 400);
			}

			$isPrevia = $tipoRelatorio == 'P';

			$arquivos = (new Sinistro2_Model_VistoriadorDespesaArquivo())
				->getArquivosByCobranca((int) $idCobrancaRelatorio, $isPrevia);

			$zip = new ZipArchive();
			$zipname = APPLICATION_PATH . "/upload_files/temp/cobranca-{$idCobrancaRelatorio}.zip";

			if ($zip->open($zipname, (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== TRUE) {
				throw new Exception('Error ao criar zip', 500);
			}

			foreach ($arquivos as $arquivo) {
				if (file_exists($arquivo['ds_caminho_arquivo'])) {
					$retorno = $zip->addFile($arquivo['ds_caminho_arquivo'], basename($arquivo['ds_caminho_arquivo']));
				}
			}

			$zip->close();

		} catch (Exception $e) {
			$retorno = ['message' => $e->getMessage(), 'status' => false];
			
			$this->getResponse()->setHttpResponseCode($e->getCode());
			$this->getResponse()->setBody(Zend_Json::encode($retorno));
		}
	}

	//order o array de vistorias pelo id de vistoria ou id da proposta
	private static function custom_sort($value1, $value2) {
		if ($value1['id_proposta'] == $value2['id_proposta']) {
			return $value1['id'] > $value2['id'];
		}
		return $value1['id_proposta'] > $value2['id_proposta'];
	}
	
	public function buscadadosAction(){
		$this->isAjax();

		$retorno = [];
		
		$idVistoria = $this->getRequest()->getParam('idVistoria');
		$idProposta = $this->getRequest()->getParam('idProposta');
		$tipoVistoria = $this->getRequest()->getParam('tipoVistoria');
		$dataVistoria = $this->getRequest()->getParam('dataVistoria');

		$tiposVistoria = ['Preliminar' => true, 'Final' => true, 'Prévia' => true];
		
		try {
			if (!filter_var($idVistoria, FILTER_VALIDATE_INT)) {
				throw new Exception('ID vistoria deve ser um inteiro.');
			}

			if (!filter_var($idProposta, FILTER_VALIDATE_INT)) {
				throw new Exception('ID proposta deve ser um inteiro.');
			}

			$dataTimeAux = DateTime::createFromFormat('Y-m-d H:i:s', $dataVistoria);

			if (!$dataTimeAux || $dataTimeAux->format('Y-m-d H:i:s') != $dataVistoria) {
				throw new Exception('Data vistoria inválida.');
			}

			if (empty($tiposVistoria[$tipoVistoria])) {
				throw new Exception('Tipo de vistoria inválido');
			}

			$isPrevia = $tipoVistoria == 'Prévia';

			$despesasVistoriaPorPerito = (new Sinistro2_Service_Buscadespesasvistoria())
				->busca($idVistoria, $idProposta, $tipoVistoria);
	
			$dadosVistoria[] = [
				'id' => $idVistoria,
				'dt_vistoria' => $dataVistoria,
				'id_proposta' => $idProposta
			];

			$honorarios = (new Sinistro2_Service_Buscahonorarios($isPrevia))->buscaHonorarios($dadosVistoria);
			
			$retorno = [
				'honorarios' => $honorarios,
				'despesasVistoriaPorPerito' => $despesasVistoriaPorPerito,
				'status' => true
			];
		} catch (Exception $e) {
			$retorno = [
				'status' => false,
				'message' => $e->getMessage()
			];
		}
		
		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	public function getcalculavalorpagarkilometragemAction() {
		$this->isAjax();
		$retorno = ['status' => true, 'mensagem' => '', 'valor' => 0];
		$parametros = $this->getRequest()->getParams();

		try {
		    $valorCombustivel = (new Sinistro2_Model_CobrancaValorCombustivel)->getValorCombustivelByProposta((int) $parametros['idProposta'], $parametros['dataVistoria']);

		    if (empty($valorCombustivel)) {
		        throw new Exception('Valor de combustível não encontrado para o estado da vistoria.');
            }

            $retorno['valor'] = Agro_Util::formatDbCurrency($valorCombustivel['valor'] * $parametros['km'] * Sinistro2_Model_CobrancaValorCombustivel::PESO_COMBUSTIVEL);
        } catch (Exception $erro) {
            $retorno['status'] = false;
            $retorno['mensagem'] = $erro->getMessage();
        }

		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	public function relatoriosgeradosAction() {
		$usuario = Zend_Auth::getInstance()->getIdentity();
		$this->view->mostrarCamposPeriodo = false;

		if (
			$usuario->id_role == Sistema_Model_Usuarios::PERFIL_SEGURADORA_ESSOR
			|| $usuario->tp_usuario == Sistema_Model_Usuarios::TIPO_USUARIO_FUNCIONARIO
		) {
			$this->view->mostrarCamposPeriodo = true;
		}

		$this->view->form = $this->getForm();
	}

	public function listrelatoriosgeradosAction(){
		$this->isAjax(true);
		$model = $this->getModel();

		if($this->getRequest()->getParam('tipo_cobranca') == 1){
			$model = $this->getModel('previa');
		}else{
			$model = $this->getModel();
		}
		
		$this->view->dados = $model->getRelatoriosGerados($this->getFilterGerados());
	}

	public function buscadadosnotafiscalAction()
    {
        $this->isAjax(true);
        $tipoVistoria = $this->getRequest()->getParam('tp_vistoria');
        $id = $this->getRequest()->getParam('id');
        $id = !Agro_Util::filterVariable($id) ? 0 : (int)$id;

		$dados = (new Sinistro2_Model_CobrancaRelatorio())->getDadosRelatorioGerado($id, $tipoVistoria == 'P');

		$buscaHonorariosService = new Sinistro2_Service_Buscahonorarios($tipoVistoria == 'P');
		
        foreach ($dados as $key => $value) {
            $dados[$key] = $buscaHonorariosService->preparaDados($dados[$key], false);

            foreach ($dados as $valor) {
                if ($dados[$key]['vistoriaHonorarios'] == 0) {
                    $dados[$key]['readonly'] = 'readonly';
                }

                //utilizados no html
                $notaHonorarios = $dados[$key]['vl_total_honorarios'];
                $notaDespesas = $dados[$key]['vl_total_despesas'];
                $notaKmCusto = $dados[$key]['vl_total_quilometragem'];
            }
        }

        $this->view->notaHonorarios = $notaHonorarios;
        $this->view->notaDespesas = $notaDespesas;
        $this->view->notaKmCusto = $notaKmCusto;
        $this->view->form = $this->getForm();
        $this->view->form->nr_nota_fiscal->setValue($dados[0]['nr_nota_fiscal']);
        $this->view->dados = $dados;
    }

	public function transmiterelatorioAction(){
		$this->isAjax();
		$modelStatus = new Sinistro2_Model_CobrancaRelatorioStatus();
		$dados['id_cobranca_relatorio'] = $this->getRequest()->getParam('id');

		$status = new Sistema_Model_Status();
		$dados['id_status'] = $status->getId('ENVIADO_EM_ANALISE','RELATORIO_COBRANCA');

		if($modelStatus->save($dados)){
			$result = "Relatório transmitido com sucesso!";
		}else{
			$result = "Erro ao transmitir relatório!";
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function devolverelatorioAction(){
		$this->isAjax();
		$modelStatus = new Sinistro2_Model_CobrancaRelatorioStatus();
		$dados['id_cobranca_relatorio'] = $this->getRequest()->getParam('id');

		$status = new Sistema_Model_Status();
		$dados['id_status'] = $status->getId('NAO_ENVIADO','RELATORIO_COBRANCA');

		if($modelStatus->save($dados)){
			$result = "Relatório devolvido com sucesso!";
		}else{
			$result = "Erro ao devolver relatório!";
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function solicitarnfAction(){
		$this->isAjax();
		$modelStatus = new Sinistro2_Model_CobrancaRelatorioStatus();
		$dados['id_cobranca_relatorio'] = $this->getRequest()->getParam('id');

		$status = new Sistema_Model_Status();
		$dados['id_status'] = $status->getId('CONFERIDO_AGUARDA_NF','RELATORIO_COBRANCA');

		if($modelStatus->save($dados)){
			$result = "Relatório aguardando NF!";
		}else{
			$result = "Erro ao devolver relatório!";
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function excelAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();
        $tipoVistoria = $this->getRequest()->getParam('tipovistoria');
        $id = $this->getRequest()->getParam('id');
        $id = !Agro_Util::filterVariable($id) ? 0 : (int)$id;
	
		$dados = (new Sinistro2_Model_CobrancaRelatorio())->getDadosRelatorioGerado($id, $tipoVistoria == 'P');
		$buscaHonorariosService = new Sinistro2_Service_Buscahonorarios($tipoVistoria == 'P');

        foreach ($dados as $key => $value) {
            $dados[$key] = $buscaHonorariosService->preparaDados($value);
        }

        $titles = array(
            'dt_vistoria' => 'Data',
            'id_proposta_mae' => 'Proposta',
            'id_processo' => 'Processo',
            'ds_nome_proponente' => 'Segurado',
            'ds_nome_municipio' => 'Município',
            'ds_sigla' => 'UF',
            'ds_nome_cultura' => 'Cultura',
            'ds_itens_segurados' => 'Talhão',
            'ds_variedades' => 'Variedade',
            'tp_vistoria' => 'Vistoria',
            'itensAreaTotal' => 'Área Vistoriada',
            'vl_honorarios' => 'R$',
            'perito' => 'Perito',
            'vl_quilometragem' => 'Km',
            'vl_custo_quilometragem' => 'R$',
            'vl_pedagio' => 'Pedágio',
            'vl_hotel' => 'Hotel',
            'vl_alimentacao' => 'Alimentação',
            'vl_despesas' => 'Total'
        );

        $csv = new Agro_Plugin_Rs2Csv();
        $csv->setRecordSet($dados);
        $csv->setType("application/octet-stream");
        $csv->setFileName("relatorio_honorario_cobranca.csv");
        $csv->setDisposition("attachment");
        $csv->setTitles($titles);
        $csv->setSeparator(";");
        $csv->getCsv();
    }

	public function viewAction()
    {
        $this->getHelper('layout')->setLayout('popup');
        $tipoVistoria = $this->getRequest()->getParam('tipovistoria');
        $id = $this->getRequest()->getParam('id');
        $id = !Agro_Util::filterVariable($id) ? 0 : (int)$id;
		
		$buscaHonorariosService = new Sinistro2_Service_Buscahonorarios($tipoVistoria == 'P');

		$dados = (new Sinistro2_Model_CobrancaRelatorio())->getDadosRelatorioGerado($id, $tipoVistoria == 'P');
		
        foreach ($dados as $key => $value) {
            $dados[$key] = $buscaHonorariosService->preparaDados($value);

            //utilizados no html
            $notaHonorarios = $dados[$key]['vl_total_honorarios'];
            $notaDespesas = $dados[$key]['vl_total_despesas'];
            $notaKmCusto = $dados[$key]['vl_total_quilometragem'];

            //somatório
            $notaKmRodada += $dados[$key]['vl_quilometragem'];
            $notaPedagio += $dados[$key]['vl_pedagio'];
            $notaHotel += $dados[$key]['vl_hotel'];
            $notaAlimentacao += $dados[$key]['vl_alimentacao'];
        }
		
        $this->view->notaHonorarios = $notaHonorarios;
        $this->view->notaDespesas = $notaDespesas;
        $this->view->notaKmCusto = $notaKmCusto;
        $this->view->notaKmRodada = $notaKmRodada;
        $this->view->notaPedagio = $notaPedagio;
        $this->view->notaHotel = $notaHotel;
        $this->view->notaAlimentacao = $notaAlimentacao;
        $this->view->notaTotalDespesasEKm = $notaDespesas + $notaKmCusto;

        $this->view->id = $id;
        $this->view->tipoRelatorio = $this->getRequest()->getParam('tipo');
        $this->view->dados = $dados;
    }

	public function arquivosAction() {
		$idRelatorio= $this->getRequest()->getParam('id');
		$tipoRelatorio = $this->getRequest()->getParam('tipo');
		$nota = $this->getRequest()->getParam('nota');

		$this->view->id = $idRelatorio;
		$this->view->tp_vistoria = $tipoRelatorio;
		$this->view->nota = $nota;

		$model = new Sinistro2_Model_CobrancaRelatorioArquivos();

		if($this->getRequest()->isPost()) {
			$dados = $this->getRequest()->getParams();

			if($dados['id'] && $_FILES) {
				$this->salvaarquivoAction($idRelatorio);
			}
		}

		$arquivos = $model->getCobrancaArquivos($idRelatorio);

		$this->view->arquivos = $arquivos;

	}

	public function salvaarquivoAction($idRelatorio) {
		// Inicializa o Adaptador de transferencia de arquivos
		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/cobranca/');
		$modelArquivos = new Sinistro2_Model_CobrancaRelatorioArquivos();
		// Percorre todos os arquivos postados
		foreach ($Adapter->getFileInfo() as $tipo => $file) {
			if ($file['name'] == '') {
				continue;
			}

			$name = $idRelatorio. $file['name'];
			$arr['ds_nome_arquivo'] = $name;
			$arr['id'] = $idRelatorio;

			$Adapter->addFilter('Rename', array('target' => APPLICATION_PATH . '/upload_files/cobranca/' . $name, 'overwrite' => true));

			if(!$Adapter->receive($file['name'])){
				$this->getResponse()->setBody(Zend_Json::encode('Não foi possível salvar o arquivo!'));
			} else {
				$modelArquivos->save($arr);
				$this->getResponse()->setBody(Zend_Json::encode('Arquivo salvo com sucesso!'));
			}
		}
	}

	public function deletearquivoAction() {
		$this->isAjax();
		$model = new Sinistro2_Model_CobrancaRelatorioArquivos();
		$result = array();

		try {
			if ($model->delete($this->getRequest()->getParam('id'))) {
				$result = MSG_SUCCESS;
			} else {
				$result = MSG_ERROR;
			}
		} catch (Exception $e) {
			$result = $this->view->escape(MSG_DELETE_FK_ERROR);
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));

	}

	public function baixanfAction() {
		$this->view->form = new Sinistro2_Form_Baixanf();
		$this->view->title .= ' » Baixa de NF';
	}

	public function verificanotaAction() {
		$this->isAjax();
		$params = $this->getRequest()->getParams();
		
		$return['status'] = false;
		$return['message'] = 'Erro ao realizar o processo.';
		
		if ($params['id_empresa'] && $params['numero']) {
			$model = new Sinistro2_Model_CobrancaRelatorio();
			$Notas = $model->getNota($params['id_empresa'], $params['numero']);
			if ($Notas->count()) {
				if ($this->geraObservacao($params)) {
					$return['status'] = true;
					$return['message'] = 'Processo realizado com sucesso.';
				} else {
					$return['false'] = false;
					$return['message'] = 'Atenção! Já existe esta observaçao nesta mesma data cadastrada.';
				}
			} else {
				$return['status'] = false;
				$return['message'] = 'Nota não encontrada.';
			}
		}
		
		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	private function geraObservacao($params) {
		$model = new Sinistro2_Model_CobrancaRelatorio();
		$Rs = $model->getNota($params['id_empresa'], $params['numero']);
		$Vistorias = new Sistema_Model_Vistorias();
		$return = $vistorias = array();

		$model->getDefaultAdapter()->beginTransaction();
		
		try {
			if ($Rs->count()) {
				foreach ($Rs as $key => $Row) {
		
					$Vistoria = $Vistorias->find($Row->id_vistoria)->current();
		
					if ($Vistoria) {
							
						$quadras = $Vistoria->quadras_observacoes();
						
						$observacao  = "Recebido em: ".date('d/m/Y')." Nota Fiscal Nº.: {$params['numero']} Quadras: {$quadras['quadras']} ";
						$observacao .= "Variedade: {$quadras['variedades']} Data da Vistoria: ".Agro_Util::formatDate($quadras['dt_vistoria'])." Tipo: {$quadras['tipo']} Vistoria: {$Vistoria->id}.";
						
						$ProcessosObservacoes = new Sinistro2_Model_ProcessosObservacoes();
						$CountProcObs = $ProcessosObservacoes->validaObservacaoCobranca($quadras['processo'], $observacao, date('d/m/Y'), $Vistoria->id);
						
						if (($observacao != $RowProcObs['ds_observacao']) && ($CountProcObs < 1)) {
							$model->addObservacao($quadras['processo'], $observacao);
						} else {
							$model->getDefaultAdapter()->rollBack();
							return false;
						}
					}
				}
				
				$model->getDefaultAdapter()->commit();				
				return true;
			}
		} catch (Exception $e) {
			$model->getDefaultAdapter()->rollBack();
			return false;	
		}	
	}
	
	/**
	 * NAO UTILIZADA MAIS EM FUNCAO DAS DUAS FUNCOES ACIMA
	 */
	public function darbaixaAction() {
		$this->isAjax();
		$result = array();

	    $model = new Sinistro2_Model_CobrancaRelatorio();
		$params = $this->getRequest()->getParams();

		$model->getDefaultAdapter()->beginTransaction();
		try {
			if ($params['id_empresa'] && $params['numero']) {
				$observacoes = $model->geraObservacao($params);

				if (is_array($observacoes)) {
					foreach ($observacoes as $vistoria => $observacao) {

					    //verifica se a vistoria foi selecionada na lista de vistorias
					    $fl_insere_obs = false;
					    foreach($params['vistoria'] as $vistoriaSelecionada){
                            if($vistoriaSelecionada == $vistoria){
                                $fl_insere_obs = true;
                            }
                        }

                        //insere observação somente para as vistorias selecionadas
                        if($fl_insere_obs){
    						$processos = $model->getProcessos($vistoria);
    						if (is_array($processos)) {
    							foreach ($processos as $processo) {
    								$model->addObservacao($processo['id_processo'], $observacao);
    							}
    						}
                        }
					}
				}
			}
			$result['status'] = true;
			$result['message'] = 'Processo realizado com sucesso.';

			$model->getDefaultAdapter()->commit();
		} catch (Exception $e) {
		    $result['status'] = false;
		    $result['message'] = 'Erro ao executar processo.';

			$model->getDefaultAdapter()->rollBack();
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function confirmaexclusaoAction(){
		$this->isAjax(true);
		$dados = $this->getRequest()->getParams();

		$this->view->dados = $dados;
	}

	public function deleterelatorioAction(){
		$this->isAjax();
		$dados = $this->getRequest()->getParams();

		if($dados['tipo'] == 'P'){
			$model = $this->getModel('previa');
		}else{
			$model = $this->getModel();
		}

		try{
			if($model->deleteRelatorio($dados['id'])){
				$modelMotivoExclusao = new Sinistro2_Model_CobrancaRelatorioMotivoExclusao();
				$modelMotivoExclusao->save($dados);

				$return['message'] = "Relatório excluído com sucesso!";
			}else{
				$return['message'] = "Erro ao excluir relatório!";
			}

		}catch (Exception $e){
			die($e);
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function alterarnfAction(){
		$this->isAjax(true);

		$Form = new Sinistro2_Form_AlterarNf();

		$Form->populate($this->getRequest()->getParams());

		$this->view->form = $Form;
	}

	public function salvarnfAction(){
		$this->isAjax();

		$model = new Sinistro2_Model_CobrancaRelatorio();
		$params = $this->getRequest()->getParams();
		$return = [
			'status' => true,
			'message' => 'Alteração realizada com sucesso!!!!',
			'id' => '',
			'nf' => $params['nr_nota_fiscal'] ?? ''
		];
		
		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

			if (
				empty($params['is-nota-ficticia'])
				&& (empty($params['nr_nota_fiscal']) || trim($params['nr_nota_fiscal']) == '-')
			) {
				throw new Exception('Número da NF não informado ou inválido.');
			}

			if (preg_match('/^0+$/', $params['nr_nota_fiscal'])) {
				throw new Exception('Número da NF inválido.');
			}

			if (
				empty($params['is-nota-ficticia'])
				&& !empty($params['nr_nota_fiscal'])
				&& !is_numeric($params['nr_nota_fiscal'])
			) {
				throw new Exception('Número da NF deve conter apenas números.');
			}
			
			$idsCobrancaRelatorio = explode(',', $this->getRequest()->getParam('id'));

			$cobrancasRelatorios = $model->findByIdsCobrancaRelatorio($idsCobrancaRelatorio); 

			$nfAntiga = $cobrancasRelatorios[0]['nr_nota_fiscal'];
			$idEmpresa = (int) $cobrancasRelatorios[0]['id_empresa'];
			$isNotaFicticia = $params['is-nota-ficticia'] ? true : false;
			
			foreach ($cobrancasRelatorios as $cr) {
				if ($cr['nr_nota_fiscal'] != $nfAntiga && $cr['nr_nota_fiscal'] != '-') {
					throw new Exception('Relatórios de cobrança selecionados devem ter o mesmo número de NF.');
				}

				if ($cr['id_empresa'] != $idEmpresa) {
					throw new Exception('Não é permitido informar a mesma NF para relatórios de cobrança de empresas diferentes.');
				}
			}
			
			if (empty($nfAntiga)) {
				// Atualiza apenas os relatórios selecionados
				$update = $model->updateByIds(
					$idsCobrancaRelatorio,
					$params['nr_nota_fiscal'],
					$isNotaFicticia
				);
			} else {
				// Atualiza todos os relatórios com a mesma NF e mesma empresa
				$update = $model->updateNumeroNotaFiscalAntiga(
					$idEmpresa,
					$nfAntiga,
					$params['nr_nota_fiscal'],
					$isNotaFicticia
				);
			}

			if (!$update) {
				throw new Exception('Erro ao atualizar as notas fiscais.');
			}
			
			$return['id'] = $idsCobrancaRelatorio;
			
			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
			
			$return["status"] = false;
			$return["message"] = $e->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function listarlognfAction(){
		$this->isAjax(true);
		$model = new Sinistro2_Model_CobrancaRelatorioLogAlteracaoNotas();
		$this->view->log = $model->fetchAll("id_cobranca_relatorio=".$this->getRequest()->getParam("id"), "dt_criacao desc");
	}



	public function getFilter() {
		$where = array();

		$where[] = array (
				'field' => 'id_seguradora',
				'operator' => '=',
				'value' => 181
			);

		if ($this->getRequest()->getParam('id_tipo_vistoria')) {
			$where[] = array (
				'field' => 'id_tipo_vistoria',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_tipo_vistoria')
			);
		}

		if (!empty($this->getRequest()->getParam('dt_vistoria_ini'))) {
			$aux = explode('/', $this->getRequest()->getParam('dt_vistoria_ini'));
			$dataVistoriaIni = "{$aux[2]}-{$aux[1]}-{$aux[0]} 00:00:00";

			$where[] = array (
				'field' => 'dt_vistoria',
				'operator' => '>=',
				'value' => $dataVistoriaIni
			);
		}

		if (!empty($this->getRequest()->getParam('dt_vistoria_fim'))) {
			$aux = explode('/', $this->getRequest()->getParam('dt_vistoria_fim'));
			$dataVistoriaFim = "{$aux[2]}-{$aux[1]}-{$aux[0]} 23:59:59";

			$where[] = array (
				'field' => 'dt_vistoria',
				'operator' => '<=',
				'value' => $dataVistoriaFim
			);
		}

		if ($this->getRequest()->getParam('id_grupo_vistoria')) {
			$where[] = array (
				'field' => 'id_grupo_vistoria',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_grupo_vistoria')
			);
		}

		if ($this->getRequest()->getParam('fl_ativo')) {
			$where[] = array (
				'field' => 'fl_ativo',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('fl_ativo')
			);
		}

		if ($this->getRequest()->getParam('tipo_grupo_produto')) {

			switch($this->getRequest()->getParam('tipo_grupo_produto')){

				//hortifruti preliminar/final
				case '1':
				case '2':
					$where[] = array (
						'field' => 'id_tipo_produto',
						'operator' => '=',
						'value' => 1
					);
					break;

				//graos preliminar/final
				case '3':
				case '4':
					$where[] = array (
						'field' => 'id_tipo_produto',
						'operator' => 'in',
						'value' => '(2,3)'
					);

					break;
			}
		}

		if ($this->getRequest()->getParam('id_cultura')) {
			$where[] = array(
				'field' => 'id_cultura',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_cultura')
			);
		}

		if ($this->getRequest()->getParam('id_estado')) {
			$where[] = array(
				'field' => 'id_estado',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_estado')
			);
		}

		if ($this->getRequest()->getParam('id_status')) {
			$where[] = array(
				'field' => 'cr.id_status',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_status')
			);
		}

		if ($this->getRequest()->getParam('id_empresa')) {
			$where[] = array (
				'field' => 'id_empresa',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_empresa')
			);
		}

		if ($this->getRequest()->getParam('nr_nota_fiscal')) {
			$where[] = array (
				'field' => 'nr_nota_fiscal',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('nr_nota_fiscal')
			);
		}

        if ($this->getRequest()->getParam('id_municipio')) {
            $where[] = array(
                'field' => 'id_municipio',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('id_municipio')
            );
        }

        if ($this->getRequest()->getParam('id_funcionario')) {
            $where[] = array(
                'field' => 'id_perito',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('id_funcionario')
            );
        }

		return $where;
	}


	public function getFilterGerados() {
		$where = array();

		$where[] = array (
				'field' => 'id_seguradora',
				'operator' => '=',
				'value' => 181
			);

		if ($this->getRequest()->getParam('id_tipo_vistoria')) {
			$where[] = array (
				'field' => 'id_tipo_vistoria',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_tipo_vistoria')
			);
		}
		
		if (!empty($this->getRequest()->getParam('dt_criacao_ini'))) {
			$aux = explode('/', $this->getRequest()->getParam('dt_criacao_ini'));
			$dataCriacaoIni = "{$aux[2]}-{$aux[1]}-{$aux[0]} 00:00:00";

			$where[] = array (
				'field' => 'cr.dt_criacao',
				'operator' => '>=',
				'value' => $dataCriacaoIni
			);
		}

		if (!empty($this->getRequest()->getParam('dt_criacao_fim'))) {
			$aux = explode('/', $this->getRequest()->getParam('dt_criacao_fim'));
			$dataCriacaoFim = "{$aux[2]}-{$aux[1]}-{$aux[0]} 23:59:59";

			$where[] = array (
				'field' => 'cr.dt_criacao',
				'operator' => '<=',
				'value' => $dataCriacaoFim
			);
		}

		if ($this->getRequest()->getParam('id_grupo_vistoria')) {
			$where[] = array (
				'field' => 'id_grupo_vistoria',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_grupo_vistoria')
			);
		}

		if ($this->getRequest()->getParam('fl_ativo')) {
			$where[] = array (
				'field' => 'fl_ativo',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('fl_ativo')
			);
		}

		if ($this->getRequest()->getParam('tipo_grupo_produto')) {

			switch($this->getRequest()->getParam('tipo_grupo_produto')){

				//hortifruti preliminar/final
				case '1':
				case '2':
					$where[] = array (
						'field' => 'id_tipo_produto',
						'operator' => '=',
						'value' => 1
					);
					break;

				//graos preliminar/final
				case '3':
				case '4':
					$where[] = array (
						'field' => 'id_tipo_produto',
						'operator' => 'in',
						'value' => '(2,3)'
					);

					break;
			}
		}

		if ($this->getRequest()->getParam('id_cultura')) {
			$where[] = array(
				'field' => 'id_cultura',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_cultura')
			);
		}

		if ($this->getRequest()->getParam('id_estado')) {
			$where[] = array(
				'field' => 'id_estado',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_estado')
			);
		}

		if ($this->getRequest()->getParam('id_status')) {
			$where[] = array(
				'field' => 'cr.id_status',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_status')
			);
		}

		if ($this->getRequest()->getParam('id_empresa')) {
			$where[] = array (
				'field' => 've.id_empresa',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_empresa')
			);
		}

		if ($this->getRequest()->getParam('nr_nota_fiscal')) {
			$where[] = array (
				'field' => 'nr_nota_fiscal',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('nr_nota_fiscal')
			);
		}

		return $where;
	}

	public function enviarseguradoraAction()
    {
		$this->isAjax();

        if (!filter_var($this->getRequest()->getParam('id'), FILTER_VALIDATE_INT)) {
            $this->getResponse()->setBody(Zend_Json::encode("Erro ao transmitir relatório! ID inválido"));
            return false;
        }

		$model = ($this->getRequest()->getParam('tp_vistoria') == 'P' ? $this->getModel('previa') : $this->getModel());
		$dados = $model->buscaDadosNotaFiscal((int)$this->getRequest()->getParam('id'));

		$status = new Sistema_Model_Status();
		$dados['id_status'] = $status->getId('ENVIADO_EM_ANALISE', 'RELATORIO_COBRANCA');
        $result = "Erro ao transmitir relatório!";

		if ($status->save($dados)) {
            $result = "Relatório transmitido com sucesso!";
        }
        
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function listarjustificativaskmAction()
	{
		$this->isAjax(true);
		
		try {
			$idCobrancaRelatorio = $this->getRequest()->getParam('idCobrancaRelatorio');
			$isPrevia = $this->getRequest()->getParam('tipoRelatorio') === 'P';

			if (empty($idCobrancaRelatorio) || !filter_var($idCobrancaRelatorio, FILTER_VALIDATE_INT)) {
				throw new Exception('ID cobrança relatório inválido.');
			}

			$justificativas = (new Sinistro2_Model_VistoriadorDespesa())
				->getJustificativasKmByIdCobrancaRelatorio($idCobrancaRelatorio)->toArray();
			
			$idsVistorias = [];
			foreach ($justificativas as $just) {
				$idsVistorias[$just['id_vistoria']] = $just['id_vistoria'];
			}

			$mapVistoriaPrecoCombustivel = (new Sinistro2_Model_CobrancaValorCombustivel())
				->getValorCombustivelPorVistorias($idsVistorias , $isPrevia);
			

			foreach ($justificativas as &$just) {
				$precoCombustivel = $mapVistoriaPrecoCombustivel[$just['id_vistoria']];
				$just['vl_custo_km'] = round(
					Sinistro2_Model_CobrancaValorCombustivel::calculaGastoCombustivel(
						$just['vl_despesa'],
						$precoCombustivel
					),
					2
				);

			}
			
			$this->view->justificativas = $justificativas;
		} catch (Exception $e) {
			$this->view->erro = 'Erro ao carregar justificativas.';
		}
	}
}
