<?php

class Sinistro2_ProcessoController extends Agro_Controller_Action {

	public function getForm($dados) {
		return new Sinistro2_Form_PesquisaProcesso(array("dados"=>$dados));
	}
	public function getModel() { return new Sinistro2_Model_Processos(); }

	public function init() {
		$this->view->title = 'Sinistro » Processos';

		$this->session = new Zend_Session_Namespace('laudo_final');
		$this->session->unsetAll();
	}

	public function editAction() {
		$Processos = new Sinistro2_Model_Processos();
		$this->view->title .= " » Editar";
		
		// Faz upload do arquivo
		if ($this->getRequest()->isPost()) {
			$db = Agro_Db_Table_Abstract::getDefaultAdapter();
			
			try {
				$db->beginTransaction();

				$params = $this->getRequest()->getParams();

				if (empty($params['id_processo']) || !filter_var($params['id_processo'], FILTER_VALIDATE_INT)) {
					throw new Exception('ID processo inválido.');
				}

				if (empty($params['id_tipo_arquivo']) || !filter_var($params['id_tipo_arquivo'], FILTER_VALIDATE_INT)) {
					throw new Exception('ID tipo arquivo inválido.');
				}
				
				(new Sinistro2_Service_SalvarArquivoProcesso())->executar(
					(int) $params['id_processo'],
					(int) $params['id_tipo_arquivo']
				);

				$db->commit();

				$this->_redirect('/sinistro2/processo/view/id/'.$this->getRequest()->getParam('id_processo')."#arquivos");
			} catch (Exception $e) {
				$db->rollback();
				$this->view->showMessage(MSG_ERROR."<br />".$e->getMessage(), 'error');
			}
		}

		$this->view->processo = $Processos->getRow($this->getRequest()->getParam('id'));
		$this->view->form_file = new Sinistro2_Form_UploadArquivoProcesso();
	}

	public function regulacaoperdasAction() {}

	public function liquidacoesAction() {}

	public function loadAction(){

		$this->isAjax(true);

		// Busca observações do processo
		$ProcessosObservacoes = new Sinistro2_Model_ProcessosObservacoes();
		$arProcessosObservacoes = $ProcessosObservacoes->getObservacoesByProcesso($this->getRequest()->getParam('id_processo'));
		$this->view->ar_processos_observacoes = $arProcessosObservacoes;

		$modelProcessos = new Sinistro2_Model_Processos();
		$propostaId = $modelProcessos->getPropostaByProcesso($this->getRequest()->getParam('id_processo'));

		$modelProposta = new Seguro_Model_Propostas;
		$proposta = $modelProposta->find($propostaId)->current();
		
		$this->view->proponente = $proposta->proponente();
	}

	public function indexAction() {
		$this->view->title .= " » Listagem";

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

		$dados = array(
			"empresa_vistoriadora" => false,
			"show_status" => true
		);

		if($User->tp_usuario != 'F') {
			$Funcionario = new Sistema_Model_Funcionarios();

			$dados = array(
				"empresa_vistoriadora" => $Funcionario->getIdEmpresaByIdUsuario($User->id),
				"show_status" => false
			);
		}

		$this->view->form = $this->getForm($dados);
		$this->view->tp_usuario = $User->tp_usuario;
	}

	public function getFilter() {
		$field = $this->getRequest()->getParam('tipo_pesquisa');
		$value = trim($this->getRequest()->getParam('valor_pesquisa'));

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

		$where = array();

		if ($field && $value) {
			if ($field == "id_proposta"){
				$ModelProposta = new Seguro_Model_Propostas();

				$valorPesquisa = trim($this->getRequest()->getParam('valor_pesquisa'));
				$ids = array_filter(explode(" ", $valorPesquisa)); // Remove valores vazios

				$endossos = $ModelProposta->fetchAll(['id IN (?)' => $ids]);

				$idsEndossos = array_column($endossos->toArray(), 'id_endosso');

				if (!empty($idsEndossos)) {
    				$where[] = count($idsEndossos) > 1 ? 'id_endosso IN (' . implode(',', $idsEndossos) . ')' : 'id_endosso = ' . reset($idsEndossos);
				}else{
					$where[] = array(
						'field'=>'id_endosso',
						'operator'=>'=',
						'value'=>$valorPesquisa
					);
				}

			} else if(!is_numeric($value)) {
				$filter['field'] = $field;
				$filter['operator'] = 'ilike';
				$filter['value'] = "%".$value."%";
				$where[] = $filter;

			}elseif($field == 'id_aviso'){
				$where[] = array(
					'field' => 'id_proposta',
					'operator' => 'in',
					'value' => '(select id_proposta from sinistro.avisos where id = '.$value.')'
				);

			} else {
				$filter['field'] = $field;
				$filter['operator'] = '=';
				$filter['value'] = $value;

				$where[] = $filter;
			}

			/*else{
				$where[] = array('field' => $field,'operator' => $operator,'value' => $value);
			}*/

		}

		if ($this->getRequest()->getParam('id_empresa')) {
			$where[] = array(
				'field' => 'id_empresa',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_empresa')
			);
		}

		if ($this->getRequest()->getParam('safras')) {
			$tipo_pesquisa = $this->getRequest()->getParam('tipo_pesquisa');
			if(strcmp($tipo_pesquisa, "id_proposta") != 0){
				$where[] = array(
					'field' => 'id_safra',
					'operator' => '>=',
					'value' => $this->getRequest()->getParam('safras')
			);
			}
			
		}

		if ($this->getRequest()->getParam('ds_nome_proponente')) {
			$where[] = array(
				'field' => 'ds_nome_proponente',
				'operator' => 'like',
				'value' => "%".$this->getRequest()->getParam('ds_nome_proponente')."%"
			);
		}

		if ($this->getRequest()->getParam('id_status')) {
			$where[] = array(
				'field' => 'id_status',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_status')
			);
		}

		if ($this->getRequest()->getParam('avisos_colheita') != null ) {

			$bo = $this->getRequest()->getParam('avisos_colheita') ? 'true' : 'false';

 			$where[] = array(
				'field'    => 'id_proposta',
				'operator' => 'in',
				'value'    => '(select id_proposta from sinistro.avisos_inicio where fl_novo = '.$bo.')'
			);
 		}

		$arr = array("id_status_preliminar", "preliminares_pendentes", "id_status_final", "finais_pendentes");

		$validar_status = true;
		foreach ($arr as $campo){
			if (array_key_exists($campo, $this->getRequest()->getParams())){
				$validar_status = false;
			}
		}

        // só vai utilizar o filtro de safra caso não tenha sido estipulada uma proposta específica
        // e não tiver sido enviada safra por parâmetro
		if (
            !($field == "id_proposta" && $this->getRequest()->getParam('valor_pesquisa') <> '')
            && empty($this->getRequest()->getParam('safras'))
        ) {
			if ($this->getRequest()->getParam('id_safra') && $validar_status) {
				if ($this->getRequest()->getParam('id_safra') != "TODAS"){
					$where[] = array(
						'field' => 'id_safra',
						'operator' => '=',
						'value' => $this->getRequest()->getParam('id_safra')
					);
				}
			}
		}

		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_municipio')) {
			$where[] = array(
				'field' => 'id_municipio',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_municipio')
			);
		}

		if ($User->tp_usuario != "F"){
			$where[] = array(
				'field' => 'id_status',
				'operator' => '<>',
				'value' => Agro_Util::status("CANCELADO", "SP")
			);
		}

		if ($this->getRequest()->getParam('id_status_preliminar')) {
			try {
				$Safras = new Produto_Model_Safras();

				if ($User->tp_usuario == "V" || $User->tp_usuario == "M"){
					$where2 = " ve.id_empresa = $User->id_empresa and ";

				}else if ($User->tp_usuario == 'C') {
					$where2 = " pc.id_usuario = $User->id ";

				} elseif ($User->tp_usuario == 'P') {
					$where2 = " p.id_usuario_criacao = $User->id ";

				} else {
					$where2 = "";
				}

				$sql = "select distinct
							p.id
						from
							sistema.status s inner join
							sinistro.laudos_preliminares lp on lp.id_status = s.id inner join
							sistema.vistorias_laudos_preliminares vlp on vlp.id_laudo_preliminar = lp.id inner join
							sistema.vistorias_empresas ve on ve.id_vistoria = vlp.id_vistoria inner join
							sinistro.processos proc on proc.id = lp.id_processo inner join
							seguro.propostas p on p.id = proc.id_proposta inner join
							produto.produtos prod on prod.id  = p.id_produto inner join
							seguro.propostas_corretores pc on pc.id_proposta = p.id
						where
							s.fl_ativo = true and
							s.id = ".$this->getRequest()->getParam('id_status_preliminar')." and
							$where2
							prod.id_safra >= ".($this->getRequest()->getParam('safras'))."
				";

				$Row = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql);

				$propostas = array();

				foreach ($Row as $proposta){
					$propostas[] = $proposta["id"];
				}

				if (count($propostas)>0) {
					$where[] = array(
						'field' => 'id_proposta',
						'operator' => 'in',
						'value' => "(".implode(", ",$propostas).")"
					);
				}

			} catch (Exception $e) {
				dump($e->getMessage());
			}

		}

		if ($this->getRequest()->getParam('id_status_final')) {
			try {
				$Safras = new Produto_Model_Safras();

				if ($User->tp_usuario == "V" || $User->tp_usuario == "M"){
					$where2 = " ve.id_empresa = $User->id_empresa and ";

				}else if ($User->tp_usuario == 'C') {
					$where2 = " pc.id_usuario = $User->id ";

				} elseif ($User->tp_usuario == 'P') {
					$where2 = " p.id_usuario_criacao = $User->id ";

				} else {
					$where2 = "";
				}

				$sql = "select distinct
							p.id
						from
							sistema.status s inner join
							sinistro.laudos_finais lf on lf.id_status = s.id inner join
							sistema.vistorias_laudos_finais vlf on vlf.id_laudo_final = lf.id inner join
							sistema.vistorias_empresas ve on ve.id_vistoria = vlf.id_vistoria inner join
							sinistro.processos proc on proc.id = lf.id_processo inner join
							seguro.propostas p on p.id = proc.id_proposta inner join
							produto.produtos prod on prod.id  = p.id_produto inner join
							seguro.propostas_corretores pc on pc.id_proposta = p.id
						where
							s.fl_ativo = true and
							s.id = ".$this->getRequest()->getParam('id_status_final')." and
							$where2
							prod.id_safra >= ".($this->getRequest()->getParam('safras'))."
				";

				$Row = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql);

				$propostas = array();

				foreach ($Row as $proposta){
					$propostas[] = $proposta["id"];
				}

				if (count($propostas)>0) {
					$where[] = array(
						'field' => 'id_proposta',
						'operator' => 'in',
						'value' => "(".implode(", ",$propostas).")"
					);
				}
			} catch (Exception $e) {
				dump($e->getMessage());
			}

		}

		if ($this->getRequest()->getParam('preliminares_pendentes')) {
			$Safras = new Produto_Model_Safras();

			if ($User->tp_usuario == "V" || $User->tp_usuario == "M"){
				$where2 = " ve.id_empresa = $User->id_empresa and ";

			}else if ($User->tp_usuario == 'C') {
				$where2 = " pc.id_usuario = $User->id ";

			} elseif ($User->tp_usuario == 'P') {
				$where2 = " p.id_usuario_criacao = $User->id ";

			} else {
				$where2 = "";
			}

			$sql = "select distinct
						p.id
					from
						sinistro.avisos a inner join
						seguro.propostas p on p.id = a.id_proposta inner join
						seguro.propostas_corretores pc on pc.id_proposta = p.id inner join
						produto.produtos prod on prod.id = p.id_produto inner join
						sinistro.vistorias_avisos va on va.id_aviso = a.id inner JOIN
						sistema.vistorias v on v.id = va.id_vistoria inner JOIN
						sistema.vistorias_empresas ve on ve.id_vistoria = v.id inner join
						sistema.tipos_vistoria tv on tv.id = v.id_tipo
					where
						va.id_vistoria not in (select id_vistoria from sistema.vistorias_laudos_preliminares) and
						$where2
						tv.ds_chave_tipos_vistoria = 'PRELIMINAR' and
						prod.id_safra = ".($this->getRequest()->getParam('id_safra'));


			$Row = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql);

			$propostas = array();

			foreach ($Row as $proposta){
				$propostas[] = $proposta["id"];
			}

			if (count($propostas)>0) {
				$where[] = array(
					'field' => 'id_proposta',
					'operator' => 'in',
					'value' => "(".implode(", ",$propostas).")"
				);
			}
		}

		if ($this->getRequest()->getParam('finais_pendentes')) {
			$Safras = new Produto_Model_Safras();

			if ($User->tp_usuario == "V" || $User->tp_usuario == "M"){
				$where2 = " ve.id_empresa = $User->id_empresa and ";

			}else if ($User->tp_usuario == 'C') {
				$where2 = " pc.id_usuario = $User->id ";

			} elseif ($User->tp_usuario == 'P') {
				$where2 = " p.id_usuario_criacao = $User->id ";

			} else {
				$where2 = "";
			}

			$sql = "select distinct
						p.id
					from
						sinistro.avisos a inner join
						seguro.propostas p on p.id = a.id_proposta inner join
						seguro.propostas_corretores pc on pc.id_proposta = p.id inner join
						produto.produtos prod on prod.id = p.id_produto inner join
						sinistro.vistorias_avisos va on va.id_aviso = a.id inner JOIN
						sistema.vistorias v on v.id = va.id_vistoria inner JOIN
						sistema.vistorias_empresas ve on ve.id_vistoria = v.id inner join
						sistema.tipos_vistoria tv on tv.id = v.id_tipo
					where
						va.id_vistoria not in (select id_vistoria from sistema.vistorias_laudos_finais) and
						$where2
						tv.ds_chave_tipos_vistoria = 'PRELIMINAR' and
						prod.id_safra >= ".($this->getRequest()->getParam('id_safra'));

			$Row = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql);

			$propostas = array();

			foreach ($Row as $proposta){
				$propostas[] = $proposta["id"];
			}

			if (count($propostas)>0) {
				$where[] = array(
					'field' => 'id_proposta',
					'operator' => 'in',
					'value' => "(".implode(", ",$propostas).")"
				);
			}
		}

		if ($this->getRequest()->getParam('id_index')) {

			$sql = "select distinct
						p3.id
					from
						sinistro.processos p3 inner JOIN
						seguro.propostas prop3 on prop3.id = p3.id_proposta inner JOIN
						seguro.propostas_endosso pe on pe.id_proposta = prop3.id and pe.fl_proposta_vigente = true inner join
						produto.produtos prod3 on prod3.id = prop3.id_produto
						INNER JOIN sinistro.avisos_encerramento av3 ON av3.id_proposta = p3.id_proposta
					WHERE
						p3.id NOT in (select l3.id_processo from sinistro.liquidacoes l3) and
						p3.id_status <> 35
						and av3.fl_del is false
						and av3.fl_ativo is true
						and prod3.id_safra = " . $this->getRequest()->getParam('id_safra');

		    $Row = Zend_Db_Table::getDefaultAdapter()->fetchAll($sql);

			$processos = array();

			foreach ($Row as $processo){
				$processos[] = $processo["id"];
			}

			if (count($propostas)>0) {
				$where[] = array(
					'field' => 'id',
					'operator' => 'in',
					'value' => "(".implode(", ",$processos).")"
				);
			}
		}

        if (!empty($this->getRequest()->getParam('pendenciasChamados'))) {
            $where[] = array(
                'field'    => 'id_proposta',
                'operator' => 'in',
                'value'    => '(' .
                    (new Agronet_Model_Index())->countChamadosSinistro(
                        $this->getRequest()->getParam('safras'),
                        $this->getRequest()->getParam('id_status_chamados'),
                        $this->getRequest()->getParam('fl_pendencia_agro'),
                        (int)Zend_Auth::getInstance()->getIdentity()->id,
                        ['c.id_proposta'],
                        false
                    ) . ')'
            );
        }

		$where[] = [
			'field'    => 'fl_ativo',
			'operator' => '=',
			'value' => 't'
		];

		return $where;
	}

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

		if ($this->getRequest()->getParam('id')) {
			$Processos = new Sinistro2_Model_Processos();
			$Processo = $Processos->find($this->getRequest()->getParam('id'))->current();
			$this->getResponse()->setBody($Processo->area());
		}
	}

	public function unidadesatingidasAction() {
		$ItensSegurados = new Seguro_Model_ItensSegurados();
		$this->getHelper('layout')->disableLayout();

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

		if ($this->view->id_laudo_final) {
			$LaudosFinais = new Sinistro2_Model_LaudosFinais();
			$Laudo = $LaudosFinais->find($this->view->id_laudo_final)->current();
		}

		$this->view->unidades = $Laudo->itensAtingidos();
		$this->view->processo = $Laudo->processo();
		$this->view->laudo = $Laudo->getLaudo();
	}

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

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

		if ($this->view->id_laudo_final) {
			$LaudosFinais = new Sinistro2_Model_LaudosFinais();
			$Laudo = $LaudosFinais->find($this->view->id_laudo_final)->current();
		}

		$this->view->processo = $Laudo->processo();
		$this->view->proposta = $this->view->processo->proposta();
	}

	public function setitensatingidosAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		try {
			if ($this->getRequest()->getParam('id_laudo_final') && $this->getRequest()->getParam('id_processo')) {
				$Itens = new Sinistro2_Model_LaudosFinaisItensSegurados();
				$Itens->delete($this->getRequest()->getParam('id_laudo_final'));

				if (is_array($this->getRequest()->getParam('itens_segurados'))) {
					foreach ($this->getRequest()->getParam('itens_segurados') as $item) {
						$Itens->save(array(
							'id_laudo_final' => $this->getRequest()->getParam('id_laudo_final'),
							'id_item_segurado' => $item
						));
					}
				}
			}

			$this->getResponse()->setBody("$.loadItensAtingidos();");
		} catch (Exception $e) {
			$this->getResponse()->setBody("alert('Ocorreu um erro ao salvar os dados.');");
		}
	}

	public function viewAction()
    {
        //caso a procedência seja da tela de listagem de seguro/propostas manda de volta para lá
        $this->view->back = "/sinistro2/processo";
        if ($this->getRequest()->getParam('from') == 'prop') {
            $this->view->back = 'javascript:history.go(-1);';
        }

        $modelProcesso = new Sinistro2_Model_Processos();
        $idProcesso = !Agro_Util::filterVariable($this->getRequest()->getParam('id'))
            ? 0
            : (int)$this->getRequest()->getParam('id');

        $this->view->processo = $modelProcesso->find($idProcesso)->current();
        $this->view->proposta = $this->view->processo->proposta();
        $this->view->proponente = $this->view->processo->proponente();

        //Cria objeto do form de upload de arquivos do processo - está na aba arquivos
        $this->view->formUpload = new Sinistro2_Form_UploadArquivoProcesso();
        $this->view->formUpload->id_processo->setValue($idProcesso);

        if ($this->getRequest()->isPost()) {
            if ($this->view->formUpload->isValid($this->getRequest()->getPost())) {
				$db = Agro_Db_Table_Abstract::getDefaultAdapter();
			
				try {
					$db->beginTransaction();
					$params = $this->getRequest()->getParams();

					if (empty($params['id_processo']) || !filter_var($params['id_processo'], FILTER_VALIDATE_INT)) {
						throw new Exception('ID processo inválido.');
					}

					if (empty($params['id_tipo_arquivo']) || !filter_var($params['id_tipo_arquivo'], FILTER_VALIDATE_INT)) {
						throw new Exception('ID tipo arquivo inválido.');
					}
					
					(new Sinistro2_Service_SalvarArquivoProcesso())->executar(
						(int) $params['id_processo'],
						(int) $params['id_tipo_arquivo']
					);

					$db->commit();

					$this->_redirect('/sinistro2/processo/view/id/'.$this->getRequest()->getParam('id_processo')."#arquivos");
				} catch (Exception $e) {
					$db->rollback();
					$this->view->showMessage(MSG_ERROR."<br />".$e->getMessage(), 'error');
				}
            }
        }

        $this->view->data = $this->getRow();

        //Busca demais observações
        $propostaAtendimento = (new Atendimento_Model_Proposta())->find($this->view->proposta->id)->current();
        $observacoes = $propostaAtendimento->observacoes_arquivos_geral(
            Zend_Auth::getInstance()->getIdentity()->id_empresa != 20 ? true : null
        );

		$propostaProponente = (new Seguro_Model_PropostasProponentes())->get($this->view->proposta->id);

		$this->view->tipo_pessoa = $propostaProponente->tp_pessoa;

        $coberturasAdicionais = $propostaAtendimento->coberturas_contratadas('adicional');
        $coberturaPrincipal = $propostaAtendimento->coberturas_contratadas('principal');

        foreach ($coberturasAdicionais as $cob) {
            unset($cob['dt_criacao']);
            array_unshift($observacoes, $cob);
        }
        unset($coberturaPrincipal['dt_criacao']);
        array_unshift($observacoes, $coberturaPrincipal);

        $this->view->data['observacoesProposta'] = $observacoes;
        $this->view->data['beneficiarios'] = (new Seguro_Model_PropostasBeneficiarios())->getBeneficiarios(
            $this->view->proposta->id
        );

        $this->view->informacoes_bancarias = (new Seguro_Model_InformacoesBancarias())->getInformacoesBancarias(
            $this->view->proposta->id
        );

        $informacoesBancariasBeneficiarios = (new Seguro_Model_InformacoesBancariasBeneficiarios())
            ->getInformacoesBancariasBeneficiariosByProposta($this->view->proposta->id);

        $mapCpfCnpjToBeneficiario = [];

        foreach ($informacoesBancariasBeneficiarios as $info) {
            $mapCpfCnpjToBeneficiario[$info['nr_cpf_cnpj']] = $info;
        }

        $this->view->mapCpfCnpjToBeneficiario = $mapCpfCnpjToBeneficiario;

        $informacoesBancariasProponentes = (new Seguro_Model_InformacoesBancariasPropostas())
            ->getInformacoesBancariasProponentesByProposta($this->view->proposta->id);

        $mapCpfCnpjToProponente = [];
        foreach ($informacoesBancariasProponentes as $info) {
            $mapCpfCnpjToProponente[$info['nr_cpf_cnpj']] = $info;
        }

        $this->view->mapCpfCnpjToProponente = $mapCpfCnpjToProponente;

        $produto = (new Produto_Model_Produtos())->fetchRow('id = ' . $this->view->proposta->id_produto);
        $coberturas = array_merge($coberturasAdicionais, array($coberturaPrincipal['id'] => $coberturaPrincipal));

        if (count($coberturas) > 0 && $produto->id_produto_geral == 15) {
            $dados['id_proposta'] = $this->view->proposta->id;
            $this->view->form = new Sinistro2_Form_NotasFiscais(array('dados' => $dados));

            foreach ($coberturas as $key => $val) {
                preg_match('/^COB_QUALIDADE/m', $val['ds_chave_cobertura'], $matches, PREG_OFFSET_CAPTURE, 0);

                if (count($matches) > 0) {
                    $notas = (new Sinistro2_Model_ProcessosNotasFiscais())->fetchRow('id_processo = ' . $idProcesso);
                    $this->view->processo_nota_fiscal = is_null($notas) ? array() : $notas->toArray();
                    $this->view->show_bloco_notas = true;
                }
            }
        }

        $this->view->isProcessoEmpresaAtiva = $modelProcesso->isProcessoEmpresaAtiva($idProcesso);
    }

	public function deletefileAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$ProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();

		if ($this->getRequest()->getParam('id')) {
			$Row = $ProcessoArquivo->getRow($this->getRequest()->getParam('id'));

			$dados['id_processo'] = $this->getRequest()->getParam('id_processo');
			$dados['ds_nome_usuario'] = Agro_Util::getUserName(Zend_Auth::getInstance()->getIdentity()->id);
			$dados['ds_nome_arquivo'] = $Row->ds_nome_arquivo;

			try {
			    $Row->fl_ativo = '0';
				$Row->save();

				$ModelProcessoObsArquivos = new Sinistro2_Model_ProcessosObservacoesArquivos();
				$ModelProcessoObsArquivos->saveObservacaoExclusao($dados);

				if ($Row->id_tipo_arquivo == (new Sistema_Model_TipoArquivoProcesso)->getIdArquivo('DIFERENCA_INDENIZACAO')) {
					$modelPagamentoAdicional = new Sinistro2_Model_LiquidacaoPagamentoAdicional();
					$pagamentoAdicional = $modelPagamentoAdicional
						->getPagamentoAdicionalByNomeArquivo($Row->ds_nome_arquivo);
					
					if ($pagamentoAdicional !== null) {
						(new Sinistro2_Model_LiquidacaoPagamentoAdicional())->deletar($pagamentoAdicional->id_liquidacao);
						unlink(APPLICATION_PATH . "/upload_files/sinistro_processo/{$Row->ds_nome_arquivo}");
					}
				}
			} catch (Exception $e) {
				die($e);
			}

			$result = array('status' => true, 'id' => $this->getRequest()->getParam('id'));
			$this->getResponse()->setBody(Zend_Json::encode($result));
		} else {
			$this->getResponse()->setBody(Zend_Json::encode(array('status' => false)));
		}
	}

	public function checkfilesAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		if ($this->getRequest()->getParam('id_processo')) {

		    $ProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();

		    $data = array('fl_conferido'=>0);
		    $ProcessoArquivo->update($data, "id_processo=".$this->getRequest()->getParam('id_processo'));

		    $data = array('fl_conferido'=>1);

		    $arArquivos = $this->getRequest()->getParam('ar_arquivoss_proposta');
		    foreach($arArquivos as $id_arquivo) {
		        $ProcessoArquivo->update($data, 'id_processo='.$this->getRequest()->getParam('id_processo').' and id='.$id_arquivo);

                $row = $ProcessoArquivo->find($id_arquivo)->current();

                if ((int) $row['id_tipo_arquivo'] === Sistema_Model_TipoArquivoProcesso::ID_LIQUIDACAO) {
                    (new Log_Model_ArquivoLiquidacaoLiberacao())->save(['id_arquivo' => $id_arquivo]);
                }
		    }
		}

		$this->_redirect('/sinistro2/processo/view/id/'.$this->getRequest()->getParam('id_processo')."#arquivos");
	}

	public function saveobservacaonotasfiscaisAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		if (trim($this->getRequest()->getParam('ds_observacao_notas_fiscais')) && ($this->getRequest()->getParam('id_processos_notas_fiscais')>0)) {
			(new Sinistro2_Model_HistoricoProcessosNotasFiscais())->save(
				(int)$this->getRequest()->getParam('id_processos_notas_fiscais'),
				(string)trim($this->getRequest()->getParam('ds_observacao_notas_fiscais'))
			);
		}

		$this->_redirect('/sinistro2/processo/view/id/'.$this->getRequest()->getParam('id_processo').'#arquivos');
	}

	public function digitarnotasfiscaisAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		
		try {
			(new Sinistro2_Model_NotasFiscais())->save($this->getRequest()->getParams());
			(new Sinistro2_Model_ProcessosNotasFiscais())->updateStatusDigitado(
				$this->getRequest()->getParam('id_processo'),
				(new Sistema_Model_Status())->getIdByChaveTipoChave('DIGITANDO','NOTAS_FISCAIS_DIGITACAO') 
			);
		} catch (Exception $e) { Agro_Util::zf_debug($e->getMessage());
			$this->view->showMessage('Erro ao incluir nota fiscal.', 'error');
		}

		$this->_redirect('/sinistro2/processo/view/id/'.$this->getRequest()->getParam('id_processo').'#regulacao_laudos');
	}

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

		try {
			(new Sinistro2_Model_ProcessosNotasFiscais())->updateStatusDigitado(
				$this->getRequest()->getParam('id_processo'),
				(new Sistema_Model_Status())->getIdByChaveTipoChave('DIGITADA', 'NOTAS_FISCAIS_DIGITACAO')
			);
			$return['status'] = true;
		} catch (Exception $e) {
			$return['message'] = $e->getMessage();
			$return['status'] = false;
		}

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

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

		$coberturas = (new Seguro_Model_PropostasCoberturas())->fetchAll('id_proposta = '.$this->getRequest()->getParam('id_proposta'))->toArray();
		array_walk($coberturas, function (&$val, $key) { $val = $val['id_cobertura']; });
		$this->getRequest()->setParam('vl_percent_desvalorizacao', (new Sinistro2_Model_NotasFiscais())->getPercentDesvalorizacao($coberturas, $this->getRequest()->getParam('vl_percent_germinacao')));

		$this->getResponse()->setBody(Zend_Json::encode(array('status' => true, 'value' => number_format($this->getRequest()->getParam('vl_percent_desvalorizacao'), 2, '.', ''))));
	}

	public function saveobservacaoAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

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

        if (trim($this->getRequest()->getParam('ds_observacao'))) {
            $processosObservacoes = new Sinistro2_Model_ProcessosObservacoes();
            $nomeArquivo = '';

            if (!$_FILES['arquivo']['error']) {
                $extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
                $nomeArquivo = $idProcesso . date('ymdhis') . ".$extensao";
                $target = APPLICATION_PATH . '/upload_files/sinistro_processo/' . $nomeArquivo;

                copy($_FILES['arquivo']['tmp_name'], $target);
            }

            $processosObservacoes->insert(array(
                'ds_observacao' => $this->getRequest()->getParam('ds_observacao'),
                'id_processo' => $idProcesso,
                'ds_nome_arquivo' => $nomeArquivo
            ));
        } elseif (trim($this->getRequest()->getParam('ds_observacao_arquivos'))) {
            $processosObservacoesArquivos = new Sinistro2_Model_ProcessosObservacoesArquivos();
            $processosObservacoesArquivos->insert(array(
                'ds_observacao_arquivos' => $this->getRequest()->getParam('ds_observacao_arquivos'),
                'id_processo' => $idProcesso
            ));
        }

        $this->_redirect('/sinistro2/processo/view/id/' . $idProcesso);
    }

	public function atualizastatusarquivosAction() {
        $this->isAjax();
		
        $date = new Zend_Date();
        $idStatus   = $this->getRequest()->getParam('id_status_arquivos');
        $idProcesso = $this->getRequest()->getParam('id_processo');
        $idRevisor  = Zend_Auth::getInstance()->getIdentity()->id;
		$modelCronometro = new Sinistro2_Model_CronometroRegulacao();
		$serviceAvisoEncerramentoColheita = new Sinistro2_Service_AvisoEncerramentoColheita();
		
		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

        try {
            $Processos         = new Sinistro2_Model_Processos();
            $ModelFuncionarios = new Sistema_Model_Funcionarios();
            $nomeRevisor       = $ModelFuncionarios->getNomeUsuarioByIdUsuario($idRevisor);

            $rowProcesso = $Processos->getRow($idProcesso);
            $rowProcesso->id_status_arquivos  = $idStatus;
            $rowProcesso->id_revisor_arquivos = $idRevisor;
            $rowProcesso->dt_revisao_arquivos = $date->get(Zend_Date::W3C);
           	$rowProcesso->save();

			$idProposta = $rowProcesso->id_proposta;

            $ModelObsArq = new Sinistro2_Model_ProcessosObservacoesArquivos();
            $ModelObsArq->saveObservacaoAlteracaoStatus($idProcesso, $idStatus, $nomeRevisor);
			$modelAvisoEncerramento = new Sinistro2_Model_AvisosEncerramento();
            if((int) $idStatus === Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA) {

				(new Sinistro2_Service_AtualizarStatusLiquidacaoAposConclusaoAnalise())->executar($idProposta, $idProcesso);
				
                $modelAvisoEncerramentoDataBase = new Sinistro2_Model_AvisosEncerramentoDataBase();
                $registros = $this->getModel()->getDataBasePagamento($idProcesso);

                foreach ($registros as $registro) {
                    $maiorData = $registro['data_aviso_encerramento'];

                    if (!empty($registro['maior_data_arquivos_segurado']) && Agro_Util::contarDiasEntreDatas($maiorData, $registro['maior_data_arquivos_segurado']) > 0) {
                        $maiorData = $registro['maior_data_arquivos_segurado'];
                    }

                    if (!empty($registro['id_beneficiario']) && !empty($registro['maior_data_arquivos_beneficiario']) && Agro_Util::contarDiasEntreDatas($maiorData, $registro['maior_data_arquivos_beneficiario']) > 0) {
                        $maiorData = $registro['maior_data_arquivos_beneficiario'];
                    }

                    $modelAvisoEncerramentoDataBase->save([
                        'id_aviso_encerramento' => $registro['id_aviso_encerramento'],
                        'dt_base' => $maiorData,
                    ]);
                }

            	$dataRevisao = Agro_Util::formatDate($Processos->getDataRevisaoArquivos($idProcesso), Zend_Date::DATES);
            	$result = array('status' => true, 'nomeRevisor' => $nomeRevisor, 'dataRevisao' => $dataRevisao);

				$ModelProcesso = $this->getModel();
				$modelPropostasBeneficiarios = new Seguro_Model_PropostasBeneficiarios();
				$avisos = $modelAvisoEncerramento->getAvisosEncerramentoByProposta($idProposta);
				
				if($modelPropostasBeneficiarios->getBeneficiariosNaoBanco($idProposta)){
					$docBeneficiarios = $ModelProcesso->isDocumentacaoBeneficiariosValida($idProposta);
					
					if($avisos && $docBeneficiarios){
						//pegar cronometros da proposta
						$cronometros = $modelCronometro->getCronometrosByProposta($idProposta);
					
						if(!empty($cronometros->toArray())){
							//atualizar o status para ativar os cronometros
							foreach($cronometros as $cronometro){
								$modelCronometro->ativar($cronometro['id']);
							}
						}
						foreach($avisos as $aviso){
							$serviceAvisoEncerramentoColheita->criaCronometroRegulacao($idProposta, (int)$aviso['id']);
						}
					}
				}else{
					if($avisos){
						//pegar cronometros da proposta
						$cronometros = $modelCronometro->getCronometrosByProposta($idProposta);
						
						if(!empty($cronometros->toArray())){
						//atualizar o status para ativar os cronometros
							foreach($cronometros as $cronometro){
								$modelCronometro->ativar($cronometro['id']);
							}
						}
						foreach($avisos as $aviso){
							$serviceAvisoEncerramentoColheita->criaCronometroRegulacao($idProposta, (int)$aviso['id']);
						}
						
					}
				}
            }elseif((int)$idStatus === Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ANALISADO){
            	$ModelProcesso = $this->getModel();
				$modelBeneficiarios = new Seguro_Model_PropostasBeneficiarios();
				$docBeneficiarios = $ModelProcesso->isDocumentacaoBeneficiariosValida($idProposta);
				$avisos = $modelAvisoEncerramento->getAvisosEncerramentoByProposta($idProposta);
				
				if($modelBeneficiarios->getBeneficiariosNaoBanco($idProposta)){
					if($avisos && $docBeneficiarios){
						//pegar cronometros da proposta
						$cronometros = $modelCronometro->getCronometrosByProposta($idProposta);
					
						if(!empty($cronometros->toArray())){
						//atualizar o status para ativar os cronometros
							foreach($cronometros as $cronometro){
								$modelCronometro->ativar($cronometro['id']);
							}
						}
						foreach($avisos as $aviso){
							$serviceAvisoEncerramentoColheita->criaCronometroRegulacao($idProposta, (int)$aviso['id']);
						}
					}
				}else{
					if($avisos){
						//pegar cronometros da proposta
						$cronometros = $modelCronometro->getCronometrosByProposta($idProposta);
						
						if(!empty($cronometros->toArray())){
						//atualizar o status para ativar os cronometros
							foreach($cronometros as $cronometro){
								$modelCronometro->ativar($cronometro['id']);
							}
						}
						foreach($avisos as $aviso){
							$serviceAvisoEncerramentoColheita->criaCronometroRegulacao($idProposta, (int)$aviso['id']);
						}
						
					}
				}
            }elseif((int)$idStatus === Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ENVIADO){
				$cronometros = $modelCronometro->getCronometrosByProposta($idProposta);
				//atualizar o status para desativar os cronometros
				foreach($cronometros as $cronometro){
					$modelCronometro->zerar($cronometro['id'], 'Documentação obrigatória incompleta');
				}
			}

			if (empty($result)) {
				$result = array('status'=>true);
			}

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

        } catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
            $result = array('status'=>false,'error'=>$e->getMessage());
        }

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

	public function buscachamadodepartamentosinistroAction(){
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$id_proposta = $this->getRequest()->getParam('id_proposta');

		$Pendencias = new Atendimento_Model_Pendencia();
		$this->view->pendenciasSinistro = $Pendencias->getPendenciasProposta($id_proposta);

		$Propostas = new Seguro_Model_Propostas();

		$Proposta = $Propostas->getRow($id_proposta);

		$this->view->chamadosSinistro = $Proposta->chamados('23');
	}

	public function buscachamadosinistroAction(){
		$this->getHelper('layout')->disableLayout();
		$id_proposta = $this->getRequest()->getParam('id_proposta');

		$Pendencias = new Atendimento_Model_Pendencia();
		$this->view->pendencias = $Pendencias->getPendenciasProposta($id_proposta,'PENDENCIA_DOCUMENTOS_SINISTRO');

		$Propostas = new Seguro_Model_Propostas();
		$Proposta  = $Propostas->getRow($id_proposta);

		$wereChamados = " tc.id = " . Atendimento_Model_TipoChamado::CORRETOR_PENDENCIA_DOCUMENTOS_SINISTRO; 
		$wereChamados .= " OR (tc.ds_chave = 'PENDENCIA_DOCUMENTOS' AND cd.ds_tipo_destinatario = 'C') ";
		$this->view->chamados = $Proposta->chamados(null, null, $wereChamados);

		$dados = array('id_proposta' => $id_proposta);
		$this->view->data = $dados;
	}

	public function criachamadosinistroAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$id_proposta = $this->getRequest()->getParam('id_proposta');
		$ds_observacao_pendencia = $this->getRequest()->getParam('ds_observacao_pendencia');

		$pendencias = $this->getRequest()->getParam('pendencia');
		foreach($pendencias as $pendencia){
			$body .= $pendencia."\n";
		}
		$body .= $ds_observacao_pendencia;

		$TipoChamado = new Atendimento_Model_TipoChamado();
		$Departamento = new Sistema_Model_Departamentos();
		$Prioridade = new Atendimento_Model_Prioridade();
		$Chamado = new Atendimento_Model_Chamado();

		$dados = array(
			'id_tipo_chamado' => $TipoChamado->getIdTipoChamado('PENDENCIA_DOCUMENTOS'),
			'id_prioridade' => $Prioridade->getIdPrioridade('NORMAL'),
			'id_departamento' => $Departamento->getDepartamentoEmpresa("03.486.745/0001-09", "SINISTRO"),
			'id_proposta' => $id_proposta,
			'ds_descricao' => $body,
			'ds_tipo_destinatario' => Atendimento_Model_ChamadoDestinatario::DESTINATARIO_CORRETOR
		);

		if($Chamado->save($dados)){
			$result["mensagem"] = "- Pendência cadastrada com sucesso! \n- Status dos arquivos alterado!";
			$result["status"] = true;
		}else{
			$result["mensagem"] = "Erro ao cadastrar pendência!";
		}

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

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

		$params = $this->getRequest()->getParams();
		$result = array("status"=>true, "message"=>"Questionário salvo com sucesso");

		try {
			$ProcessoQuestionarios = new Sinistro2_Model_ProcessosQuestionarios();
			$ProcessoQuestionarios->save($params['questionario'], $params["id_processo"]);

		} catch (Exception $e) {
			$result["status"]=false;
			$result["message"]="Não foi possível salvar o questionário. Erro: ".$e->getMessage();
		}

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

	public function savefileliquidacaoAction(array $post) {

		// Obtém o arquivo do upload
		$adapter = new Zend_File_Transfer_Adapter_Http();
		$file = $adapter->getFileInfo();

		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();
		try {
			// Gera o nome do novo arquivo
			$TipoArquivoProcesso = new Sistema_Model_TipoArquivoProcesso();
			$tipo = $TipoArquivoProcesso->fetchRow($TipoArquivoProcesso->getAdapter()->quoteInto('id = ?', $post['id_tipo_arquivo']))->toArray();

			$ProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();
			$id = $ProcessoArquivo->nextSequenceId();

			$extensao = strtolower(end(explode('.', $file['arquivo']['name'])));

			$nomeArquivo = "{$post['id_processo']}.$id.{$tipo['ds_chave_tipo_arquivo']}.$extensao";
			$target = APPLICATION_PATH.'/upload_files/sinistro_processo/'.$nomeArquivo;

			// Faz o upload do arquivo
			$adapter->addFilter('Rename', array(
				'source' => $file['arquivo']['tmp_name'],
				'target' => $target,
				'overwrite' => true)
			);
			$adapter->receive();

			// Salva registro na tabela processos_arquivos
			$data = array();
			$data['id'] = $id;
			$data['id_processo'] = $post['id_processo'];
			$data['id_tipo_arquivo'] = $post['id_tipo_arquivo'];
			$data['ds_nome_arquivo'] = $nomeArquivo;

			$ProcessoArquivo->insert($data);

			// Se o status dos arquivos do processo for 'não enviado', altera para 'pendente'

			$Processos = new Sinistro2_Model_Processos();

            $Processo = $Processos->getRow($post['id_processo']);
            $idStatus = $Processos->getIdStatus('NAO_ENVIADO', 'ARQUIVOS_PROCESSO_SINISTRO');
            if($idStatus == $Processo->id_status_arquivos) {
                $Processo->id_status_arquivos = $Processos->getIdStatus('NAO_ANALISADO', 'ARQUIVOS_PROCESSO_SINISTRO');
                $Processo->save();
            }

			$Db->commit();

			$this->_redirect('/sinistro2/processo/view/id/'.$this->getRequest()->getParam('id_processo'));
		} catch (Exception $e) {
			$Db->rollback();
			$this->view->showMessage(MSG_ERROR."<br />".$e->getMessage(), 'error');
		}
	}

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

		$ModelObsArq = new Sinistro2_Model_ProcessosObservacoesArquivos();
		if($ModelObsArq->delete($this->getRequest()->getParam('id'))){
			$return['message'] = 'Observação de arquivo excluída com sucesso!';
		}else{
			$return['message'] = 'Erro ao excluir observação de arquivo!';
		}
		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

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

		if ((new Sinistro2_Model_HistoricoProcessosNotasFiscais())->delete($this->getRequest()->getParam('id'))) {
			$return['message'] = 'Observação de notas fiscais excluída com sucesso!';
		} else {
			$return['message'] = 'Erro ao excluir observação de notas fiscais!';
		}
		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

/*	public function amostrasfinalAction() {
		$this->getHelper('layout')->disableLayout();

		$ModelItensSeguradosArquivos = new Sinistro2_Model_LaudosFinaisItensSeguradosArquivos();
		$this->view->amostras = $ModelItensSeguradosArquivos->fetchAll("id_item_laudo_final = ".$this->getRequest()->getParam('id_laudo_final_item_segurado'))->toArray();
		$this->view->total = $ModelItensSeguradosArquivos->totalFotos($this->getRequest()->getParam('id_laudo_final_item_segurado'));
		$this->view->id_laudo = $this->getRequest()->getParam('id_laudo_final_item_segurado');
	}
*/
	public function fotosfinalAction() {
		$idLaudo = $this->getRequest()->getParam('id_laudo');
		$idVistoria = $this->getRequest()->getParam('id_vistoria');

		$this->view->id_laudo = $idLaudo;
		$this->view->id_vistoria = $idVistoria;

		$Model = new Sinistro2_Model_LaudosFinaisArquivos();

		if($this->getRequest()->isPost()) {
			$dados = $this->getRequest()->getParams();

			if($dados['id_laudo'] && $_FILES) {
				$this->view->sucesso = $this->salvaArquivo($idLaudo, 'laudofinal');
			}
		}

		$isMetodoDigital = (new Sinistro2_Model_LaudosFinais())->isMetodoDigital($idLaudo);
		$fotos = $Model->getLaudoFotos($idLaudo);
		$fotosAcompanhanteAutorizado = [];
		
		foreach ($fotos as $key => &$foto) {	

			$this->adicionarDadosFotos($foto, $isMetodoDigital);

			if (
				in_array(
					$foto['id_tipo_arquivo_laudo_final'],
					Sinistro2_Model_LaudosFinaisArquivos::IDS_ARQUIVOS_ACOMPANHANTE_AUTORIZADO
				)
			) {
				$fotosAcompanhanteAutorizado[] = $foto;
				unset($fotos[$key]);
			}
		}

		$this->view->fotos = $fotos;
		$this->view->fotosAcompanhanteAutorizado = $fotosAcompanhanteAutorizado;
	}

	public function fotositemamostrafinalAction(): void
	{
		$idLaudoFinal = filter_var($this->getRequest()->getParam('id_laudo_final'), FILTER_VALIDATE_INT);
		$idLaudoFinalItemSegurado = filter_var($this->getRequest()->getParam('id_laudo_final_item_segurado'), FILTER_VALIDATE_INT);
		$idVistoria = filter_var($this->getRequest()->getParam('id_vistoria'), FILTER_VALIDATE_INT);
		
		if (empty($idLaudoFinalItemSegurado) || empty($idVistoria) || empty($idLaudoFinal)) {
			return;
		}
		
		$this->view->idLaudoFinal = $idLaudoFinal;
		$this->view->idLaudoFinalItemSegurado = $idLaudoFinalItemSegurado;
		$this->view->idVistoria = $idVistoria;

		if($this->getRequest()->isPost()) {
			$dados = $this->getRequest()->getParams();

			if($dados['id_laudo'] && $_FILES) {
				$this->view->sucesso = $this->salvaArquivo($idLaudoFinal, 'laudofinal', $idLaudoFinalItemSegurado);
			}
		}

		$isMetodoDigital = (new Sinistro2_Model_LaudosFinais())->isMetodoDigital($idLaudoFinal);
		$modelItensArquivos = new Sinistro2_Model_LaudosFinaisItensSeguradosArquivos();
		$fotos = $modelItensArquivos->getArquivos($idLaudoFinalItemSegurado);
		
		foreach ($fotos as &$foto) {
			$foto['descricao_arquivo'] = $foto['ds_nome_arquivo'];
			$aux = explode('_', $foto['ds_nome_arquivo']);
			
			if (is_numeric($aux[4])) {
				$foto['descricao_arquivo'] .= " (Amostra {$aux[4]})";
			}

			$this->adicionarDadosFotos($foto, $isMetodoDigital);
		}

		$this->view->fotos = $fotos;
	}

	/**
	 * Adiciona dados adicionais utilizados na listagem das imagens nos laudos
	 *
	 * @param array &$foto
	 * @param bool $isMetodoDigital
	 */
	private function adicionarDadosFotos(array &$foto, bool $isMetodoDigital): void
	{
		$foto['dt_criacao'] = Agro_Util::formatDate($foto['dt_criacao']);
		$foto['status_recebimento'] = "Vistoria manual";
		$foto['arquivo_existe'] = file_exists(APPLICATION_PATH . '/upload_files/laudofinal/' . $foto['ds_nome_arquivo']);
		$foto['file_thumb'] =  "/resources/imagens/thumbnail/laudofinal/" . $foto['ds_nome_arquivo'];
		$foto['permite_excluir'] = true;

		if ($isMetodoDigital) {
			$foto['status_recebimento'] = $foto['arquivo_existe'] ? "Arquivo recebido" : "Aguardando recebimento";
			
			$usuario = Zend_Auth::getInstance()->getIdentity();
			$departamentosValidos = [
				Sistema_Model_Departamentos::AGRO_SINISTRO,
				Sistema_Model_Departamentos::AGRO_TI,
			];
			
			$foto['permite_excluir'] = false;
			if (
				$foto['id_tipo_arquivo_laudo_final'] == Sinistro2_Model_TiposArquivosLaudosFinais::FOTO_EXTRA
				&& in_array($usuario->id_departamento, $departamentosValidos)
			) {
				$foto['permite_excluir'] = true;
			}
		}
	}

	public function fotospreliminarAction() {
		$idLaudo = $this->getRequest()->getParam('id_laudo');
		$idVistoria = $this->getRequest()->getParam('id_vistoria');

		$this->view->id_laudo = $idLaudo;
		$this->view->id_vistoria = $idVistoria;

		$Model = new Sinistro2_Model_LaudosPreliminaresArquivos();

		if($this->getRequest()->isPost()) {
			$dados = $this->getRequest()->getParams();

			if($dados['id_laudo'] && $_FILES) {
				$this->view->sucesso = $this->salvaArquivo($idLaudo, 'laudopreliminar');
			}
		}

		$fotos = $Model->getLaudoFotos($idLaudo);

		$this->view->fotos = $fotos;

	}

	public function salvaArquivo($idLaudo, $tipoLaudo, $idLaudoItemSegurado = null) {
		// Inicializa o Adaptador de transferencia de arquivos
		$Adapter = new Zend_File_Transfer();
		$Adapter->addValidator('Size', false, 1572864);
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/'.$tipoLaudo.'/');

		$modelFotos = new Sinistro2_Model_LaudosPreliminaresArquivos();

		if($tipoLaudo == 'laudofinal') {
			$modelFotos = ($idLaudoItemSegurado) ? new Sinistro2_Model_LaudosFinaisItensSeguradosArquivos() : new Sinistro2_Model_LaudosFinaisArquivos();
			
			if ((new Sinistro2_Model_LaudosFinais())->isMetodoDigital($idLaudo)) {
				$arr['id_tipo_arquivo_laudo_final'] = Sinistro2_Model_TiposArquivosLaudosFinais::FOTO_EXTRA;
			}
		}

		$files = $Adapter->getFileInfo();

		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
		// Percorre todos os arquivos postados
		foreach ($files as $tipo => $file) {
			if ($file['name'] == '') {
				continue;
			}

			$name = $idLaudo . $file['name'];
			
			if ($idLaudoItemSegurado) {
				$name = $idLaudo . '_' . $idLaudoItemSegurado . $file['name'];
			}

			$arr['ds_nome_arquivo'] = $name;
			$arr['id_laudo'] = $idLaudo;

			if ($idLaudoItemSegurado) {
				$arr['id_item_laudo_final'] = $idLaudoItemSegurado;
			}

			$Adapter->addFilter('Rename', array('target' => APPLICATION_PATH . '/upload_files/'.$tipoLaudo.'/' . $name, 'overwrite' => true));

			if(!$Adapter->receive($file['name'])) {
				Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
				return false;
			} else {
				$modelFotos->save($arr);
			}
		}

		Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		return true;
	}

	public function editfileAction() {

		$TipoArquivoProcesso = new Sistema_Model_TipoArquivoProcesso();
		$TipoArquivo = $TipoArquivoProcesso->fetchRow($TipoArquivoProcesso->getAdapter()->quoteInto('id = ?', $this->getRequest()->getParam('id_tipo_arquivo')))->toArray();

	    $ModelProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();
		$Row = $ModelProcessoArquivo->getArquivo($this->getRequest()->getParam('id_arquivo'));
		$Row = $Row[0];

		$ProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();
		$id = $ProcessoArquivo->nextSequenceId();

		$Processo = new Sinistro2_Model_Processos();
		$RowProcesso = $Processo->find($Row['id_processo']);
		$Proponente = $Processo->getProponenteProcesso($Row['id_processo']);

		$countArquivos = $ProcessoArquivo->getCountTipoArquivo($Proponente['cpf_cnpj'], $this->getRequest()->getParam('id_tipo_arquivo'));
		if($countArquivos < 1){
		    $countArquivos = 1;
		} else {
		    $countArquivos += 1;
		}
        $extensao = strtolower(end(explode('.', $Row['ds_nome_arquivo'])));

		$cpf_cnpj = str_replace(".", "", $Proponente['cpf_cnpj']);
		$cpf_cnpj = str_replace("-", "", $cpf_cnpj);
		$cpf_cnpj = str_replace("/", "", $cpf_cnpj);

		if($TipoArquivo['ds_chave_tipo_arquivo'] == 'LIQUIDACAO'){
			$nomeArquivo = $RowProcesso[0]['id_proposta']."_".$TipoArquivo['ds_chave_tipo_arquivo']."_".$countArquivos.".".$extensao;
		} else {
			$nomeArquivo = $cpf_cnpj."_".$TipoArquivo['ds_chave_tipo_arquivo']."_".$countArquivos.".".$extensao;
		}
		$old = APPLICATION_PATH.'/upload_files/sinistro_processo/'.$Row['ds_nome_arquivo'];
		$target = APPLICATION_PATH.'/upload_files/sinistro_processo/'.$nomeArquivo;

        rename($old, $target);
        $ProcessoArquivo = $ModelProcessoArquivo->find($this->getRequest()->getParam('id_arquivo'))->current();
        $ProcessoArquivo->fl_transmitido_seguradora = 0;
        $ProcessoArquivo->id_tipo_arquivo = $this->getRequest()->getParam('id_tipo_arquivo');
        $ProcessoArquivo->ds_nome_arquivo = $nomeArquivo;
        
		if ($ProcessoArquivo->save()) {
			(new Sinistro2_Service_TransmitirArquivoEssor())->executar(
				(int) $Row['id_processo'], 
				(int) $this->getRequest()->getParam('id_arquivo'),
				(int) $this->getRequest()->getParam('id_tipo_arquivo'),
				$nomeArquivo,
				$target
			);
		}

        $this->_redirect('/sinistro2/processo/view/id/'.$Row['id_processo']);
    }

	public function deletefotofinalAction() {
		$this->isAjax();
		$Model = new Sinistro2_Model_LaudosFinaisArquivos();
		$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 deletefotolaudofinalitemAction() {
		$this->isAjax();

		$model = new Sinistro2_Model_LaudosFinaisItensSeguradosArquivos();
		$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 deletefotopreliminarAction() {
		$this->isAjax();
		$Model = new Sinistro2_Model_LaudosPreliminaresArquivos();
		$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 editararquivoAction(){
		$this->isAjax(true);
		$this->view->formUpload = new Sinistro2_Form_UploadArquivoProcesso();
		$this->view->formUpload->populate($this->getRequest()->getParams());
	}

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

		$result = array("status"=>true, "message"=>"Processo cancelado");

		Zend_Db_Table::getDefaultAdapter()->beginTransaction();

		try {
			$params = $this->getRequest()->getParams();

			$ModelProcesso = new Sinistro2_Model_Processos();
			$ModelProcessoObs = new Sinistro2_Model_ProcessosObservacoes();

			$Processo = $ModelProcesso->find($params["id"])->current();

			if ($Processo){
				$Processo->id_status = Agro_Util::status("CANCELADO", "SP");
				$ProcessoObs = $ModelProcessoObs->createRow();
				$ProcessoObs->id_processo = $Processo->id;
				$ProcessoObs->ds_observacao = "Processo <b>CANCELADO</b>.<br><b>Motivo: </b>".str_ireplace("\n", "<br>", $params["ds_motivo_cancelamento"]);
			}

			$Processo->save();
			$ProcessoObs->save();

			Zend_Db_Table::getDefaultAdapter()->commit();

		} catch (Exception $e) {
			Zend_Db_Table::getDefaultAdapter()->rollBack();
			$result["status"] = false;
			$result["message"] = "Não foi possível cancelar o processo.<br>Erro: {$e->getMessage()}";
		}

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

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

		$result = array("status"=>true, "message"=>"Processo reativado");

		Zend_Db_Table::getDefaultAdapter()->beginTransaction();

		try {
			$params = $this->getRequest()->getParams();

			$ModelProcesso = new Sinistro2_Model_Processos();
			$ModelProcessoObs = new Sinistro2_Model_ProcessosObservacoes();

			$Processo = $ModelProcesso->find($params["id"])->current();

			if ($Processo){
				$Processo->id_status = Agro_Util::status("ABERTO_REGULACAO", "SP");

				$ProcessoObs = $ModelProcessoObs->createRow();
				$ProcessoObs->id_processo = $Processo->id;
				$ProcessoObs->ds_observacao = "Processo <b>REATIVADO</b>.<br><b>Motivo: </b>".str_ireplace("\n", "<br>", $params["ds_motivo_reativacao"]);

			}

			$Processo->save();
			$ProcessoObs->save();

			Zend_Db_Table::getDefaultAdapter()->commit();

		} catch (Exception $e) {
			Zend_Db_Table::getDefaultAdapter()->rollBack();
			$result["status"] = false;
			$result["message"] = "Não foi possível reativar o processo.<br>Erro: {$e->getMessage()}";
		}

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

	public function encaminharliquidacaoAction(){
		$this->isAjax(true);
		$Model = new Sinistro2_Model_Processos();

		$Form = new Sinistro2_Form_EncaminharLiquidacao();

		$Form->populate($this->getRequest()->getParams());

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

		$this->view->processo = $Model->find($this->getRequest()->getParam("id_processo"))->current();
	}

	public function listarquivologAction() {
		$this->isAjax(true);
		
		$ModelLogTransmissao = new Log_Model_LogSinistroArquivosTransmissao();
		$this->view->dados = $ModelLogTransmissao->fetchAll('id_arquivo = ' . $this->getRequest()->getParam('id'))->toArray();
	}

	public function listaarquivosAction(){

		$this->isAjax(true);

		$this->view->data = array();

		$ModelProcesso = new Sinistro2_Model_Processos();
		$idProcesso = $this->getRequest()->getParam('id_processo');

		$this->view->processo = $ModelProcesso->find($idProcesso)->current();
		$this->view->data = $this->getRow();

		//Busca o tipo de usuário
		$Usuario = Zend_Auth::getInstance()->getIdentity();
		$this->view->data['tp_usuario'] = $Usuario->tp_usuario;

		// Busca arquivos do processo
		$ProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();
		$this->view->data['arquivos'] = $ProcessoArquivo->getProcessosArquivos($idProcesso);

		// Busca combo com status de arquivos de processos
		$Status = new Sistema_Model_Status();
		$this->view->data['comboStatusArquivos'] = $Status->getComboStatusArquivos('ARQUIVOS_PROCESSO_SINISTRO');

		//Busca revisor dos arquivos do processo
		$Processo = $ModelProcesso->getRow($idProcesso);
		$ModelFuncionarios = new Sistema_Model_Funcionarios();

		$this->view->revisorArquivos = array();
		$this->view->revisorArquivos['nomeRevisor'] = $ModelFuncionarios->getNomeUsuarioByIdUsuario($Processo->id_revisor_arquivos);
		$this->view->revisorArquivos['dataRevisao'] = $Processo->dt_revisao_arquivos;

		// Busca o código do status dos arquivos (cd_status) do processo
		$cd_status = $Status->getCodigoById($Processo['id_status_arquivos']);

		$this->view->data['cd_status_arquivos'] = $cd_status;

		// Busca observações referentes aos arquivos da Proposta/Processo
		$ProcessosObservacoesArquivos = new Sinistro2_Model_ProcessosObservacoesArquivos();
		$arProcessosObservacoesArquivos = $ProcessosObservacoesArquivos->getObservacoesArquivosByProcesso($idProcesso);
		$this->view->data['ar_processos_observacoes_arquivos'] = $arProcessosObservacoesArquivos;

		// Busca os laudos digitalizados
		$this->view->laudos = $this->laudosFisicos($this->getRequest()->getParam('id_proposta'));

		$ProcessosNotasFiscais = new Sinistro2_Model_ProcessosNotasFiscais();
		$notasFiscais = $ProcessosNotasFiscais->getNotasFiscaisArquivoByIdProcesso($idProcesso);

		if (count($notasFiscais)>0) {
			$this->view->show_bloco_notas = true;
			$this->view->notasfiscais = $notasFiscais;
			$this->view->status_nota = $Status->getNameById($notasFiscais[0]['id_status_arquivo']);
			$this->view->lista_status_notas = $Status->getComboTipo('NOTAS_FISCAIS');
			$this->view->historico_notas = (new Sinistro2_Model_HistoricoProcessosNotasFiscais())->getByIdProcessosNotasFiscais((int)$notasFiscais[0]['id']);
		}

		$this->view->origemPrevia = false;
		$origemPrevia = $this->getRequest()->getParam('origemPrevia');

		if (!empty($origemPrevia) && $origemPrevia === 'true') {
            $this->view->origemPrevia = true;
        }
	}

	public function atualizastatusnotasAction() {
		$this->isAjax();
		try {
			if ((new Sinistro2_Model_ProcessosNotasFiscais())->updateStatus(
				(int)$this->getRequest()->getParam('id_processo'), (int)$this->getRequest()->getParam('id_status'))) {
				$result = array('status' => true, 'message' => 'Status atualizado');
			} else {
				$result = array('status' => false, 'message' => 'Erro ao atualizar status');
			}
		} catch (Exception $e) {
			$result = array('status' => false, 'message' => 'Erro ao atualizar status(' . $e->getMessage() . ')');
		}

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

	/* Lista os laudos digitalizados */
	private function laudosFisicos($id_proposta, $tipo='')
    {
        $retornoProposta = (new Seguro_Model_Propostas())->find($id_proposta)->current();
        $endossos = $retornoProposta->buscaPropostasEndosso();

        foreach ($endossos as $proposta) {
            $ponteiro = opendir(PATH_LAUDOS);
            $ponteiro_safras_anteriores = opendir(PATH_LAUDOS_SAFRAS_ANTERIORES);
            $totalDigitosProposta = $proposta > 1000000 ? 7 : 6;
            $proximoPosicaoPosProposta = $totalDigitosProposta + 1;

            // monta os vetores com os itens encontrados na pasta
            while ($laudo = readdir($ponteiro)) {
                if (substr($laudo, 0, $totalDigitosProposta) == $proposta) {
                    $tipo_laudo = substr($laudo, $proximoPosicaoPosProposta, 2);
                    switch ($tipo_laudo) {
                        case "VF":
                        case "NA":
                            $vf[] = $laudo;
                            break;
                        case "VP":
                            $vp[] = $laudo;
                            break;
                        case "VL":
                            $vl[] = $laudo;
                            break;
                    }
                }
            }
            closedir($ponteiro);

            // monta os vetores com os itens encontrados na pasta
            while ($laudo = readdir($ponteiro_safras_anteriores)) {
                if (substr($laudo, 0, $totalDigitosProposta) == $proposta) {
                    $tipo_laudo = substr($laudo, $proximoPosicaoPosProposta, 2);
                    switch ($tipo_laudo) {
                        case "VF":
                        case "NA":
                            $vf[] = $laudo;
                            break;
                        case "VP":
                            $vp[] = $laudo;
                            break;
                        case "VL":
                            $vl[] = $laudo;
                            break;
                    }
                }
            }
            closedir($ponteiro_safras_anteriores);
        }

        $laudos = array();
        if ($tipo) {
            switch ($this->getRequest()->getParam('tipo')) {
                case 'previa':
                    $laudos['previa'] = $vp;
                    break;
                case 'preliminar':
                    $laudos['preliminar'] = $vl;
                    break;
                case 'final':
                    $laudos['final'] = $vf;
                    break;
            }
        } else {
            $laudos['final'] = $vf;
            $laudos['preliminar'] = $vl;
            $laudos['previa'] = $vp;
        }

        return $laudos;
    }

	// verifica se existe um aviso ou processo de sinistro aberto
	public function existesinistroAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$avisos = 0;
		if ($this->getRequest()->getParam('id_proposta')) {
			$ModelProposta = new Seguro_Model_Propostas();
			$Proposta = $ModelProposta->getRow($this->getRequest()->getParam('id_proposta'));
			$ModelProcesso = $this->getModel();
			$ModelAviso = new Sinistro2_Model_AvisosSinistro();
			$endosso = current($Proposta->endosso());

			// verifica se existem aviso (qualquer status) para proposta em questão
			$avisos = $ModelAviso->checkAvisoByEndosso($endosso['id_endosso']);
			// if ($avisos <= 0) {
				// verifica se existem algum processo de sinistro aberto para a apólice
				//$processos = $ModelProcesso->getProcessoAtivoProposta($this->getRequest()->getParam('id_proposta'));
			// }

			// if (($Proposta->id <> $Proposta->proposta_mae()) && ($processos <= 0)) {
			// 	// verifica se existem aviso (qualquer status) para proposta mãe
			// 	$avisos = $ModelAviso->checkAvisoByProposta($Proposta->proposta_mae());
			// 	if ($avisos <= 0) {
			// 		// verifica se existem algum processo de sinistro aberto para a apólice mãe
			// 		//$processos = $ModelProcesso->getProcessoAtivoProposta($Proposta->proposta_mae());
			// 	}
			// }
		}

		// if (($avisos > 0) || ($processos > 0)) {
		if ($avisos > 0) {
			$result = true;
		} else {
			$result = false;
		}

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

	public function editarnotasfiscaisAction() {
		$this->isAjax(true);
		
		$this->view->form = new Sinistro2_Form_NotasFiscais(array('dados' => array('id_proposta' => $this->getRequest()->getParam('id_proposta'))));
		$params = [];
		
		if (!empty($this->getRequest()->getParam('id'))) {
			$nota = (new Sinistro2_Model_NotasFiscais())->fetchRow('id = ' . $this->getRequest()->getParam('id'));

			$params['ds_nro_nota_fiscal'] = $nota['ds_nro_nota_fiscal'];
			$params['id_cooperativa'] = $nota['id_cooperativa'];
			$params['vl_peso'] = $nota['vl_peso'];
			$params['vl_percent_germinacao'] = $nota['vl_percent_germinacao'];
			$params['vl_percent_desvalorizacao'] = $nota['vl_percent_desvalorizacao'];
		}

		$this->view->id = $this->getRequest()->getParam('id');
		$this->view->id_processos_notas_fiscais =  $this->getRequest()->getParam('id_processos_notas_fiscais');
		$this->view->id_processo = $this->getRequest()->getParam('id_processo');
		$this->view->id_notas_fiscais_arquivos = $this->getRequest()->getParam('id_notas_fiscais_arquivos');

		$this->view->form->populate($params);
	}

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

		if ($this->getRequest()->getParam('id')) {
			try {
				(new Sinistro2_Model_NotasFiscais())->delete($this->getRequest()->getParam('id'));
				(new Sinistro2_Model_ProcessosNotasFiscais())->updateStatus(
					$this->getRequest()->getParam('id_processo'),
					(new Sistema_Model_Status())->getIdByChaveTipoChave('DIGITANDO', 'NOTAS_FISCAIS_DIGITACAO')
				);
				$return['message'] = 'Digitação de nota fiscal excluída.';
			} catch (Exception $e) {
				$return['message'] = 'Erro ao excluir digitação de nota fiscal.';
			}
		}

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

	public function acoesvistoriaAction() : void
    {
        $this->isAjax(true);

        $params = $this->getRequest()->getParams();

        if ($params['tipo'] === Sistema_Model_Tipostatus::DS_CHAVE_LAUDOS_PRELIMINARES) {
            $rowPreliminar = (new Sinistro2_Model_LaudosPreliminares())->getRow($params['id_laudo']);
            $params['vistoria_status'] = $rowPreliminar->id_status;

        } elseif ($params['tipo'] === Sistema_Model_Tipostatus::DS_CHAVE_LF) {
            $rowFinal = (new Sinistro2_Model_LaudosFinais())->getRow($params['id_laudo']);
            $params['vistoria_status'] = $rowFinal->id_status;
        }

        $rowVistoria = (new Sistema_Model_Vistorias())->getRow($params['id_vistoria']);

        $params['vistoria_valida'] = $rowVistoria->fl_vistoria_valida == 1 ? $rowVistoria->fl_vistoria_valida : 0;
        $params['vistoria_tablet'] = $rowVistoria->fl_vistoria_tablet == 1 ? $rowVistoria->fl_vistoria_tablet : 0;
        $params['vistoria_tablet_identificador'] = $rowVistoria->ds_identificador_tablet;

        $form = new Sinistro2_Form_AcoesVistoria($params);
        $form->populate($params);

        $classService = 'Sinistro2_Service_LaudosPreliminaresHistorico';
        $classLog = 'Log_Model_LaudosPreliminaresHistorico';

        if ($params['tipo'] === Sistema_Model_Tipostatus::DS_CHAVE_LF) {
            $classService = 'Sinistro2_Service_LaudosFinaisHistorico';
            $classLog = 'Log_Model_LaudosFinaisHistorico';
        }

        $this->view->historicoAcoesLaudo =
            (new $classService(new $classLog()))
            ->getDadosHistoricoByIdLaudo((int)$params['id_laudo'])->toArray();

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

	public function saveacoesvistoriaAction(){

		$this->isAjax();
		$params = $this->getRequest()->getParams();

		$Db = Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

		try{

			//row do processo
			$ModelVistoriaProcesso = new Sinistro2_Model_VistoriasProcessos();
			$RowVistoriaProcesso = $ModelVistoriaProcesso->fetchRow('id_vistoria = '.$params['id_vistoria']);

			//models em comum
			$ModelProcessoObs = new Sinistro2_Model_ProcessosObservacoes();
			$ModelAgendamento = new Sistema_Model_Agendamentos();
			$ModelVistoriaAgendamento = new Sistema_Model_VistoriasAgendamentos();
			$ModelStatus = new Sistema_Model_Status();

			//para flags de vistoria
			$ModelVistorias = new Sistema_Model_Vistorias();
			$RowVistoria = $ModelVistorias->getRow($params['id_vistoria']);

			if($params['fl_vistoria_status'] && $params['tipo_vistoria'] == 'LAUDOS_PRELIMINARES'){

				if($params['vistoria_status'] == Agro_Util::getIdStatus('CANCELADO', 6) || $params['vistoria_status'] == Agro_Util::getIdStatus('CANCELADO_CULPA_SEGURADO', 6)){
					//cancela o agendamento
					$RowVistoriaAgendamento = $ModelVistoriaAgendamento->fetchRow('id_vistoria = '.$params['id_vistoria']);
					$RowAgendamento = $ModelAgendamento->getRow($RowVistoriaAgendamento->id_agendamento);
					$RowAgendamento->id_status = Agro_Util::getIdStatus('AGENDAMENTO_CANCELADO', 20);
					$RowAgendamento->save();
				}

				//salva o novo status
				$ModelPreliminar = new Sinistro2_Model_LaudosPreliminares();
				$RowPreliminar = $ModelPreliminar->getRow($params['id_laudo']);
				$RowPreliminar->id_status = $params['vistoria_status'];
				$RowPreliminar->save();

				//salva a observação no processo
				$RowProcessoObs = $ModelProcessoObs->createRow();
				$RowProcessoObs->id_processo = $RowVistoriaProcesso->id_processo;
				$RowProcessoObs->ds_observacao = "Status da Vistoria Preliminar número ".$params['id_vistoria']." alterado para ".$ModelStatus->getNameById($params['vistoria_status']).". Motivo: ".$params['obs_vistoria_status'];
				$RowProcessoObs->save();


			}else if($params['fl_vistoria_status'] && $params['tipo_vistoria'] == 'LF'){

				if($params['vistoria_status'] == Agro_Util::getIdStatus('CANCELADO', 7) || $params['vistoria_status'] == Agro_Util::getIdStatus('CANCELADO_CULPA_SEGURADO', 7)){
					//cancela o agendamento
					$RowVistoriaAgendamento = $ModelVistoriaAgendamento->fetchRow('id_vistoria = '.$params['id_vistoria']);
					$RowAgendamento = $ModelAgendamento->getRow($RowVistoriaAgendamento->id_agendamento);
					$RowAgendamento->id_status = Agro_Util::getIdStatus('AGENDAMENTO_CANCELADO', 20);
					$RowAgendamento->save();
				}

				//salva o novo status
				$ModelFinal = new Sinistro2_Model_LaudosFinais();
				$RowFinal = $ModelFinal->getRow($params['id_laudo']);
				$RowFinal->id_status = $params['vistoria_status'];
				$RowFinal->save();

				//salva a observação no processo
				$RowProcessoObs = $ModelProcessoObs->createRow();
				$RowProcessoObs->id_processo = $RowVistoriaProcesso->id_processo;
				$RowProcessoObs->ds_observacao = "Status da Vistoria Final número ".$params['id_vistoria']." alterado para ".$ModelStatus->getNameById($params['vistoria_status']).". Motivo: ".$params['obs_vistoria_status'];
				$RowProcessoObs->save();

			}

			if($params['fl_vistoria_valida']){
				//insere observação no processo
				$RowProcessoObs = $ModelProcessoObs->createRow();
				$RowProcessoObs->id_processo = $RowVistoriaProcesso->id_processo;
				$RowProcessoObs->ds_observacao = "Vistoria número ".$params['id_vistoria']." setada como ".($params['vistoria_valida'] === 1 ? 'Válida' : 'Inválida').". Motivo: ".$params['obs_vistoria_valida'];
				$RowProcessoObs->save();

				//flag da vistoria
				$RowVistoria->fl_vistoria_valida = $params['vistoria_valida'];
			}

			if($params['fl_vistoria_tablet']){
				//insere observação no processo
				$RowProcessoObs = $ModelProcessoObs->createRow();
				$RowProcessoObs->id_processo = $RowVistoriaProcesso->id_processo;
				$RowProcessoObs->ds_observacao = "Vistoria número ".$params['id_vistoria']." setada como ".($params['vistoria_tablet'] === 1 ? 'Via Tablet' : 'Via Agronet').". Motivo: ".$params['obs_vistoria_tablet'];
				$RowProcessoObs->save();

				//flag da vistoria
				$RowVistoria->fl_vistoria_tablet = $params['vistoria_tablet'];
			}

			if($params['fl_vistoria_tablet_identificador']){
				//insere observação no processo
				$RowProcessoObs = $ModelProcessoObs->createRow();
				$RowProcessoObs->id_processo = $RowVistoriaProcesso->id_processo;
				$RowProcessoObs->ds_observacao = "Identificador atualizado ".$params['vistoria_tablet_identificador']." para a Vistoria número ".$params['id_vistoria']." Motivo: ".$params['obs_vistoria_tablet_identificador'];
				$RowProcessoObs->save();

				//flag da vistoria
				$RowVistoria->ds_identificador_tablet = $params['vistoria_tablet_identificador'];
			}

			//atualiza as flags da vistoria
			$RowVistoria->save();

			$Db->commit();
			$return['message'] = "Ações atualizadas com sucesso!";

		}catch (Exception $e){

			$Db->rollback();
			$return['message'] = "Erro ao atualizar ações!";

		}

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

	}

	/**
	 * Gera formulário de impressão para o perito.
	 */
	public function formulariovistoriacampoAction() {
		$this->getHelper('layout')->setLayout('popup');

		$params = $this->getRequest()->getParams();
		$User = Zend_Auth::getInstance()->getIdentity();

		$this->view->adminView = false;

		$ModelProposta 			= new Sinistro2_Model_Propostas();
		$ModelProcesso 			= new Sinistro2_Model_Processos();
		$PropostaCobertura      = new Seguro_Model_PropostasCoberturas();

		$dados = array();

		//dados básicos para a view
		$dados['id_proposta'] = $params['id_proposta'];
		$dados['module']      = 'sinistro2';
		$this->view->form 		= new Sinistro2_Form_AceitacaoAviso();

		$this->view->showPrint = true;
		$this->view->date = new Zend_Date();
		$this->view->dateFormat = 'dd/MM/Y';

		//dados comuns à view
		$proposta = $ModelProposta->find($params['id_proposta'])->current();
		$dados['proposta'] = $proposta;
		$dados['vigencia'] = $proposta->getVigenciaOriginal();
		$dados['produto'] = $proposta->produto();
		$dados['proponente'] = $proposta->proponente();
		$dados['propriedade'] = $proposta->propriedade();
		$dados['atributos'] = $proposta->atributos_rn('UNIDADE_SEGURADA');
		$dados['beneficiarios'] = $proposta->beneficiarios();
		$dados['coberturasAdicionais'] = $proposta->coberturas_contratadas('adicional');
		$dados['coberturaPrincipal'] = $proposta->coberturas_contratadas('principal');
		$dados['corretor'] = $proposta->corretor();
		$dados['observacoes'] = $proposta->observacoes();
		$dados['carencia'] = $proposta->carencia();
		$dados['croquis'] = $proposta->croquis();
		$dados['producaoGarantida'] = $proposta->atributos('PROPRIEDADE', 'PROD_PRODUCAO_GARANTIDA');
		$dados['pessoa_autorizada'] = $proposta->pessoa_autorizada();
		$dados['id_proposta_exibicao'] = ($proposta->versao_endosso(false) > 0) ? $proposta->id_proposta_mae($params['id_proposta']) : $params['id_proposta'];

		$this->view->proposta = $proposta;
		$this->view->dados = $dados;

		//Identifica se já existe um processo relacionado à proposta do aviso
		$processo = $ModelProcesso->fetchRow('id_proposta = '.$params['id_proposta']);
		if($processo){
			$processo = $processo->toArray();
			$this->view->form->id_processo->setValue($processo['id']);

			// Definindo valor default para combo de empresas
			$processoEmpresa = $ModelProcesso->getEmpresaVistoriadora($processo['id']);
			if($processoEmpresa){
				$this->view->idEmpresaProcesso = $processoEmpresa['id'];
				$this->view->form->empresas->setValue($processoEmpresa['id']);
			}

			$data['dsNomeEmpresaVistoriadora'] = $processoEmpresa['ds_nome_fantasia'];
			$data['id_processo'] = $processo['id'];
			$data['id_vistoria'] = $this->getRequest()->getParam('id_vistoria');
			$this->view->data = $data;

		}

		//informações de coberturas e evento
		$this->listChaveCoberturas = $PropostaCobertura->getChaveCoberturasByProposta($params['id_proposta']);
	}

	//finaliza o envio de notas
	public function finalizarnotaAction() {
		$this->isAjax();
		$ModelProcessoNotasFiscais = new Sinistro2_Model_ProcessosNotasFiscais();
		$ModelStatus = new Sistema_Model_Status();
		$idStatus = $ModelStatus->getIdByChaveTipoChave('ENVIADA','NOTAS_FISCAIS');
		$nomeStatus = $ModelStatus->getNameById($idStatus);

		if ($ModelProcessoNotasFiscais->updateStatus( $this->getRequest()->getParam('id_processo'), $idStatus)) {
			$result = array('message' => 'Notas enviadas.','id_status' => $idStatus, 'nome_status' => $nomeStatus);
		} else {
			$result = array('message' => 'Erro ao finalizar envio de notas', 'id_status' => 0, 'nome_status' => '');
		}

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

	//verifica se já existem arquivos cadastrado para o processo
	public function contaarquivoAction() {
		$this->isAjax();

		$count = $this->getTotalArquivosByProcesso((int) $this->getRequest()->getParam('id_processo'));
        $return = array('status' => true, 'message' => $count);
     	$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Retorna o total de arquivos do processo (desconsiderando o tipo de arquivo LIQUIDACAO)
	 *
	 * @param int $idProcesso
	 * @return int
	 */
	private function getTotalArquivosByProcesso(int $idProcesso): int
	{
		$modelProcessoArquivo = new Sinistro2_Model_ProcessosArquivos();
		$where = "id_processo = {$idProcesso} AND fl_ativo is true AND id_tipo_arquivo <> 18";
        return $modelProcessoArquivo->fetchAll($where)->count();
	}

	//dialog para cadastro de informações bancárias
	public function dadosbancarioAction() {
		$this->isAjax(true);

		$InformacoesBancarias = new Seguro_Model_InformacoesBancarias();
		$this->view->informacoes_bancarias = $InformacoesBancarias->getInformacoesBancarias($this->getRequest()->getParam('id_proposta'));

		$FormasPagamento = new Sistema_Model_FormasPagamento();
		$this->view->fpagamentos = $FormasPagamento->getFormasPagamento();
		$Bancos = new Sistema_Model_Bancos();
		$this->view->bancos = $Bancos->getBancos();
		$this->view->id_processo = (new Sinistro2_Model_Processos())->getIdProcessoByProposta($this->getRequest()->getParam('id_proposta'));
	}

	//salvar informações bancárias
	public function savedadosbancarioAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$result = ['status' => true, 'message' => 'Operação realizada com sucesso!'];

		$params = $this->getRequest()->getParams();
		$validados = $this->validaDadosBancarios($params);
		
		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

			if (!empty($validados)) {
				throw new Exception($validados);
			}

			$InformacoesBancarias = new Seguro_Model_InformacoesBancarias();
			$n_linhas = $params['num_linhas'];

			for ($i = 0; $i < $n_linhas; $i++) {

                if ($params['id_tipo_proponente_beneficiario_'.$i] === 'BENEFICIARIO') {
                    continue;
                }

				if ($params['id_'.$i] > 0) {
					$Row = $InformacoesBancarias->find($params['id_'.$i])->current();
				} else {
					$Row = $InformacoesBancarias->createRow();
				}

				$Row->cpf_cnpj = $params['cpf_cnpj_'.$i];
				$Row->id_proposta = $params['id_proposta_'.$i];
				$Row->id_banco = $params['banco_'.$i] ? $params['banco_'.$i] : null;
				$Row->nu_conta_corrente = $params['conta_corrente_'.$i];
				$Row->nu_digito_conta_corrente = $params['digito_conta_corrente_'.$i];
				$Row->nu_agencia = $params['agencia_'.$i];
				$Row->nu_digito_agencia = $params['digito_agencia_'.$i];
				$Row->id_forma_pagamento = $params['f_pagamento_'.$i];

				if (!$Row->save()) {
					throw new Exception('Erro ao realizar a operação ('.$i.')!');
				}
			}

			if (isset($params['ch_concordo']) && $params['ch_concordo'] == "on") {
				$count = $this->getTotalArquivosByProcesso((int) $params['id_processo']);

				if ($count == 0 && Sistema_Model_Usuarios::isUsuarioLogadoCorretorPreposto()) {
					$modelConfirmacaoTermoProcessos = new Sinistro2_Model_ConfirmacaoTermoProcessos();
					$modelConfirmacaoTermoProcessos->save(['id_processo' => $params['id_processo']]);
				}
			}

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

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

	private function validaDadosBancarios($params) {
		$num_linhas = $params['num_linhas'];
		$msg = null;

		for ($i=0; $i<$num_linhas; $i++) {
            if ($params['id_tipo_proponente_beneficiario_'.$i] === 'BENEFICIARIO') {
                continue;
            }

			if ($params['f_pagamento_'.$i] == 1) {
				if (!$params['banco_'.$i]) {
					$msg = "Campo banco na linha ".($i+1)." não pode ser nulo.\n";
				}
				if (!$params['agencia_'.$i]) {
					$msg .= "Campo agência na linha ".($i+1)." não pode ser nulo.\n";
				}
				if (!$params['conta_corrente_'.$i]) {
					$msg .= "Campo conta corrente na linha ".($i+1)." não pode ser nulo.\n";
				}
				if (!isset($params['digito_conta_corrente_'.$i])) {
					$msg .= "Campo digito da corrente na linha ".($i+1)." não pode ser nulo.\n";
				}
			}

			if ($params['f_pagamento_'.$i] == '') {
				$msg = "Forma de pagamento na linha ".($i+1)." deve ser selecionado.\n";
			}
		}

		return $msg;
	}

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

		$return = ['status' => true, 'message' => '', 'filename' => ''];
		
		try {
			if (empty($this->getRequest()->getParam('id_laudo'))) {
				throw new Exception("Número do laudo não informado.");
			}

			if (empty($this->getRequest()->getParam('tipo_laudo'))) {
				throw new Exception("Tipo de laudo não informado.");
			}

			$idLaudo = $this->getRequest()->getParam('id_laudo');
			$return['filename'] = "{$idLaudo}-fotos.zip";
			$diretorio = APPLICATION_PATH. '/upload_files/' . $this->getRequest()->getParam('tipo_laudo') . '/';
			
			switch ($this->getRequest()->getParam('tipo_laudo')) {
				case 'laudofinal':
					if ($this->getRequest()->getParam('id_laudo_final_item_segurado')) {
						$idLaudoFinalItemSegurado = (int) $this->getRequest()->getParam('id_laudo_final_item_segurado');
						$Model = new Sinistro2_Model_LaudosFinaisItensSeguradosArquivos();
						
						$fotos = $Model->fetchAll(
							$Model->select()
								->where('id_item_laudo_final = ?', $idLaudoFinalItemSegurado)
						);
						
						$return['filename'] = "{$idLaudo}-{$idLaudoFinalItemSegurado}-fotos.zip";
					} else {
						$Model = new Sinistro2_Model_LaudosFinaisArquivos();
						$fotos = $Model->getLaudoFotos($idLaudo);
					}
					break;
				case 'laudopreliminar':
					$Model = new Sinistro2_Model_LaudosPreliminaresArquivos();
					$fotos = $Model->getLaudoFotos($idLaudo);
					break;
				default:
					throw new Exception("Tipo de laudo informado não é válido.");
					break;
			}
			
			$zip = new ZipArchive;
			
			if ($zip->open($diretorio . $return['filename'], (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== TRUE) {
				throw new Exception("Ocorreu um erro ao criar o arquivo ZIP.");
			}

			foreach ($fotos as $foto) {
				$filePath = $diretorio . $foto['ds_nome_arquivo'];
				if (!file_exists($filePath)) {
					throw new Exception("Arquivo '{$foto['ds_nome_arquivo']}' não encontrado.");
				}

				$zip->addFile($filePath, $foto['ds_nome_arquivo']);
			}

			$zip->close();
			
		} catch (Exception $e) {
			$return['message'] = $e->getMessage();
			$return['status'] = false;
		}

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

	public function deleteobservacaoprocessoAction()
    {
        $this->isAjax();
        $return = ['status' => true, 'message' => 'Observação excluída com sucesso.'];
        $modelProcessosObservacoes = new Sinistro2_Model_ProcessosObservacoes();

        try {
            if (empty($this->getRequest()->getParam('id'))) {
                throw new Exception("ID da observação do processo não informado.");
            }

            $rowProcessosObservacoes = $modelProcessosObservacoes->getRow($this->getRequest()->getParam('id'));
            if (empty($rowProcessosObservacoes['id'])) {
                throw new Exception("Observação do processo não encontrado pelo ID informado.");
            }

            if (!empty($rowProcessosObservacoes['ds_nome_arquivo'])) {
                $caminhoArquivo = APPLICATION_PATH . '/upload_files/sinistro_processo/';
                $caminhoArquivo .= $rowProcessosObservacoes['ds_nome_arquivo'];

                if (!unlink(realpath($caminhoArquivo))) {
                    throw new Exception("Erro ao excluir o arquivo da observação do processo.");
                }
            }

            if (!$modelProcessosObservacoes->delete($rowProcessosObservacoes['id'])) {
                throw new Exception("Erro ao excluir a observação do processo.");
            }
        } catch (\Throwable $th) {
            $return['status'] = false;
            $return['message'] = $th->getMessage();
        }

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