<?php

class Atendimento_ChamadoController extends Agro_Controller_Action
{
	public function init() {
		$this->view->title = 'Atendimento » Chamados';
	}

	public function getForm() {
		$Form = new Atendimento_Form_Chamado();

		$params = $this->getRequest()->getParams();

		$Form->populate($params);

		if ($params['id']){
			$ChamadoArquivo = new Atendimento_Model_Chamadoarquivos();
			$this->view->arquivos_salvos = $ChamadoArquivo->getArquivosChamados($params['id']);
		}

		return $Form;
	}


	public function getModel() {
		return new Atendimento_Model_Chamado();
	}

	public function saveAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$result = array("status"=>true, "message"=>"Chamado aberto com sucesso.");

		try {
			$Model = $this->getModel();
			$params = $this->getRequest()->getParams();
			
			$user = Zend_Auth::getInstance()->getIdentity();

			$modelUser = new Sistema_Model_Usuarios();
			$modelTipoChamado = new Atendimento_Model_TipoChamado();
			$tipoChamado = $modelTipoChamado->getRow($params['id_tipo_chamado']);
			
			$isFuncionarioAgro = $modelUser->isFuncionarioAgro($user->id);
			if (
				!$tipoChamado['fl_criar_chamado_destinatario']
				&& !$isFuncionarioAgro
			) {
				throw new Exception('Erro! Tipo de chamado "'. $tipoChamado['ds_tipo_chamado'] .'" não pode ser utilizado por usuários Destinatários.');
			}
			
			if (!empty($_FILES) && array_key_exists('anexo1', $_FILES) && !empty($_FILES['anexo1']['size'])) {
				if (!$tipoChamado['fl_anexar_arquivo_destinatario'] && !$isFuncionarioAgro) {
					throw new Exception('Erro! O Tipo de Chamado "'. $tipoChamado['ds_tipo_chamado'] .'" não permite usuários destinatários anexarem arquivos.');
				} elseif (!$tipoChamado['fl_anexar_arquivo_interno'] && $isFuncionarioAgro) {
					throw new Exception('Erro! Usuário Agro não está liberado para anexar arquivos para o Tipo de Chamado "'. $tipoChamado['ds_tipo_chamado'] .'".');
				}
			}
			
            $temRespostaAutomatica = !empty($params['respostaAutomatica']);

            unset($params['respostaAutomatica']);

			$nrChamado = $Model->save($params);

			if (!$nrChamado){
			    $result["status"] = false;
			    $result["message"] = $Model->getMessages();
			} else {
				$modelChamadoDestinatario = new Atendimento_Model_ChamadoDestinatario();

				if (!empty($params['id_empresa_processo']) &&
					$params['id_departamento'] == Sistema_Model_Departamentos::AGRO_SINISTRO && 
					$modelChamadoDestinatario->getDestinatarioLogado($params) == Atendimento_Model_ChamadoDestinatario::DESTINATARIO_EMPRESA_VISTORIA
				){
					$enviarEmail = false;

					$tipoChamadosVistoridor = [
						Atendimento_Model_TipoChamado::VISTORIADOR_DECLARACAO_PERICIA,
						Atendimento_Model_TipoChamado::VISTORIADOR_CORRECAO_LAUDO,
						Atendimento_Model_TipoChamado::VISTORIADOR_DIGITACAO_LAUDOS
					];

					if (in_array($params['id_tipo_chamado'], $tipoChamadosVistoridor)) {
						$enviarEmail = true;
					} else {
						$whereTipoChamado  = "tc.id = " . $params['id_tipo_chamado'];
						$whereTipoChamado .= " AND (tc.ds_chave = 'AGENDAMENTO_VISTORIA' OR ";
						$whereTipoChamado .= "      tc.ds_chave = 'CANCELAMENTO_AVISO_PROCESSO' OR ";
						$whereTipoChamado .= "      tc.ds_chave = 'SUPORTE_AGRONET' OR ";
						$whereTipoChamado .= "      tc.ds_chave = 'SOLICITACAO_LAUDOS' OR ";
						$whereTipoChamado .= "      tc.ds_chave = 'NOVA_AVALIACAO')";
						
						$dataTipoChamado = $modelTipoChamado->getData($whereTipoChamado);
						
						if (count($dataTipoChamado) > 0) {
							$enviarEmail = true;
						}
					}

					if ($enviarEmail) {
						$empresaModel = new Sistema_Model_Empresas;
						$empresa = $empresaModel->getRow($params['id_empresa_processo']);
	
						$propostaModel = new Seguro_Model_Propostas;
						$proposta = $propostaModel->getRow($params['id_proposta']);
	
						$today = new DateTime;
						$subject = "{$today->format('d/m/Y')} NOVO CHAMADO SINISTRO PROPOSTA {$proposta->id_proposta_mae}";
	
						$this->view->nr_chamado = $nrChamado;
						$this->view->id_proposta = $proposta->id_proposta_mae;
						$body = $this->view->render('mail/novochamadoempresavistoriadora.phtml');
	
						$email = new Agro_Mail();
						$email->addTo($empresa->ds_email, $empresa->ds_nome_fantasia);
						$email->addBcc('ti@agrobrasilseguros.com.br', 'TI');
						$email->setSubject($subject);
						$email->setBody($body, 'html');
	
						$email->send();
					}
				}

                if ($temRespostaAutomatica) {
                    unset($_FILES);

                    $idChamado = $Model->save([
                        'id_usuario_criacao' => $params['id_responsavel'],
                        'id_responsavel' => $params['id_responsavel'],
                        'id_tipo_chamado' => $params['id_tipo_chamado'],
                        'id_prioridade' => $params['id_prioridade'],
                        'id_departamento' => $params['id_departamento'],
                        'id_proposta' => $params['id_proposta'],
                        'id_parent' => $nrChamado,
                        'id_status' => Atendimento_Model_Chamado::ID_STATUS_ABERTO,
                        'respostaAutomatica' => true,
                        'ds_descricao' => 'Prezado Vistoriador, informamos que estamos em contato com o Corretor. Favor aguardar.',
                    ]);

                    if (empty($idChamado)) {
                        $result["status"] = false;
                        $result["message"] = $Model->getMessages();
                    }

                    if (in_array((int)$params['id_tipo_chamado'], [Atendimento_Model_TipoChamado::TECNICA_CONFIRMAR_CONTATO, Atendimento_Model_TipoChamado::SINISTRO_CONFIRMAR_CONTATO_VISTORIADOR])
                        && $params['descricaoManual'] === 'false'
                    ) {
                        $rowProposta = (new Seguro_Model_Propostas())->getRow($params['id_proposta']);
                        $numeroPropostaCompleto = $rowProposta->doc();
                        $corretor = (new Sistema_Model_Corretores())->fetchRow(["id_usuario = {$rowProposta['id_usuario_criacao']}"]);

                        if (empty($corretor)) {
                            $corretor = (new Sistema_Model_Prepostos())->getCorretorByUsuario($rowProposta['id_usuario_criacao']);
                        }

                        $email = new Agro_Mail();
                        $tipoAssinatura = 2;

                        $body = "Prezado Corretor,<br><br>";
                        $body .= "Informamos que foi aberto chamado do tipo Confirmar Contato para a proposta {$numeroPropostaCompleto} ";
                        $body .= "conforme descrição abaixo:<br><br>";
                        $body .= "Descrição: <b>{$params['ds_descricao']}</b><br>";

                        if ((int)$params['id_tipo_chamado'] === Atendimento_Model_TipoChamado::TECNICA_CONFIRMAR_CONTATO) {
                            $dataPrazoRetorno = DateTime::createFromFormat('Y-m-d', date('Y-m-d'))->modify('+7 days')->format('d/m/Y');
                            $body .= "Prazo para retorno: {$dataPrazoRetorno}.<br><br>";

                            $email->clearFrom();
                            $email->setFrom('vp@agrobrasilseguros.com.br', 'AgroBrasil - Agronet 2.0');
                            $email->addBcc('karina.silva@agrobrasilseguros.com.br');
                            $email->addBcc('flavia.dupont@agrobrasilseguros.com.br');
                            $email->addBcc('raphael.funchal@agrobrasilseguros.com.br');

                            $tipoAssinatura = 1;
                        }

                        $body .= "Para evitarmos prejuízos ao Segurado, é imprescindível que regularize a pendência dentro do prazo. Para tanto, acesse o módulo de chamados no sistema.<br><br>";
                        $body .= "Acesse o sistema Agronet 2.0 através do endereço: <a href='http://agronet.agrobrasilseguros.com.br/'>http://agronet.agrobrasilseguros.com.br/</a>";
                        $body .= "<br>ATENÇÃO: esta é uma mensagem automática. Por favor, não responda. Se deseja entrar em contato conosco, escreva para atendimento@agrobrasilseguros.com.br <br><br>";

                        $anexo = Agro_Mail::getAssinatura($email, $tipoAssinatura);
                        $body .= "<img src=\"cid:{$anexo->id}\" height=\"102\" width=\"480\" />";
                        $body .= Agro_Mail::textoPadraoEmailHtml();

                        $email->addTo($corretor['ds_email']);
                        $email->setSubject("Alerta de Chamado – Confirmar Contato: Proposta {$numeroPropostaCompleto}");
                        $email->setBody($body, 'html');
                        $email->send();
                    }
                }
			}

		} catch (Exception $e) {
			$result["status"] = false;
			$result["message"] = $e->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function formAction() { 
		$Proponente = new Seguro_Model_PropostasProponentes();
		$Propostas  = new Seguro_Model_Propostas();
		
		$usuarioLogado = Zend_Auth::getInstance()->getIdentity();
		$this->view->isUsuarioLogadoDestinatario = $usuarioLogado->tp_usuario 
			!== Sistema_Model_Usuarios::TIPO_USUARIO_FUNCIONARIO;

		$this->getHelper('layout')->disableLayout();
		$this->view->id_empresa = $this->getRequest()->getParam('id_empresa'); 

		if ($this->getRequest()->getParam('id_proposta')){
			$Proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();

			$this->view->id_proposta = $this->getRequest()->getParam('id_proposta');
			$this->view->id_proposta_mae = $Proposta->id_proposta_mae($this->getRequest()->getParam('id_proposta'));
			$this->view->proponente = $Proponente->fetchRow("id_proposta=".$this->getRequest()->getParam('id_proposta'));
			$this->view->id_status_proposta = $Proposta['id_status'];

		} else {
			if($this->getRequest()->getParam('id')){
				$ModelChamado = new Atendimento_Model_Chamado();
				$Chamdo = $ModelChamado->fetchRow("id={$this->getRequest()->getParam('id')}");
				$Proposta = $Propostas->find($Chamdo->id_proposta)->current();

				$this->view->id_proposta = $Chamdo->id_proposta;
				$this->view->proponente = $Proponente->fetchRow("id_proposta={$Chamdo->id_proposta}");
				$this->view->id_proposta_mae = $Proposta->id_proposta_mae($this->getRequest()->getParam('id_proposta'));
			    $this->view->id_status_proposta = $Proposta['id_status'];
			}

		}

		//fixa o id_departamento pra sinistro para vistoriador não abrir chamado pra técnica através do sinistro.
		//tarefa #2089
		if ($this->getRequest()->getParam('is_sinistro')) {
			$this->view->is_sinistro = true;
		}

		if ($this->getRequest()->getParam('id')) {
			$this->view->id_chamado = $this->getRequest()->getParam('id');
		} else {
			$this->view->id_chamado = false;
		}

		parent::formAction();
	}

	public function formchamadosinistroAction() {
		$this->getHelper('layout')->disableLayout();

		$Proponente = new Seguro_Model_PropostasProponentes();
		$Propostas = new Seguro_Model_Propostas();

		if ($this->getRequest()->getParam('id_proposta')){
			$this->view->id_proposta = $this->getRequest()->getParam('id_proposta');
			$this->view->proponente = $Proponente->fetchRow("id_proposta=".$this->getRequest()->getParam('id_proposta'));
		} else {
			if($this->getRequest()->getParam('id')){
				$ModelChamado = new Atendimento_Model_Chamado();
				$Chamdo = $ModelChamado->fetchRow("id={$this->getRequest()->getParam('id')}");

				$this->view->id_proposta = $Chamdo->id_proposta;
				$this->view->proponente = $Proponente->fetchRow("id_proposta={$Chamdo->id_proposta}");
			}
		}

		$Proposta = $Propostas->find($this->view->id_proposta)->current();
		$this->view->id_status_proposta = $Proposta['id_status'];

		if($this->getRequest()->getParam('id')){
			$this->view->id_chamado = $this->getRequest()->getParam('id');
		} else {
			$this->view->id_chamado = false;
		}

		parent::formAction();

	}

	public function listAction(){
		if ($this->getRequest()->getParam('id_proposta')) {
			$Propostas = new Seguro_Model_Propostas();
			$Proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
    		$this->view->proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
			$this->view->id_proposta = $Proposta->id;
		}

		if ($this->getRequest()->getParam('nodiv')){
			$this->view->nodiv = $this->getRequest()->getParam('nodiv');
		}

		$departamento = $this->getRequest()->getParam('id_departamento');

		parent::listAction();
	}


	public function listresumoAction(){
		if ($this->getRequest()->getParam('id_proposta')) {
			$Propostas = new Seguro_Model_Propostas();
			$Proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
    		$this->view->proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
			$this->view->id_proposta = $Proposta->id;
		}

		if ($this->getRequest()->getParam('nodiv')){
			$this->view->nodiv = $this->getRequest()->getParam('nodiv');
		}

		$departamento = $this->getRequest()->getParam('id_departamento');

		parent::listAction();
	}

	public function listchamadosinistroAction(){
		if ($this->getRequest()->getParam('id_proposta')) {
			$Propostas = new Seguro_Model_Propostas();
			$ModelProcesso = new Sinistro2_Model_Processos();
			$Proposta = $Propostas->get($this->getRequest()->getParam('id_proposta'));

			$this->view->ds_nome_segurado = $Proposta->ds_nome_proponente;
			$this->view->id_proposta = $Proposta->id;
			$this->view->isProcessoEmpresaAtiva = true;

			$idProcesso = $ModelProcesso->getIdProcessoByProposta($Proposta->id);
			if (!empty($idProcesso)) {
				$this->view->isProcessoEmpresaAtiva = $ModelProcesso->isProcessoEmpresaAtiva($idProcesso);
			}
		}

		if ($this->getRequest()->getParam('nodiv')){
			$this->view->nodiv = $this->getRequest()->getParam('nodiv');
		}

        if ($this->getRequest()->getParam('ds_status_processo')) {
            $this->view->ds_status_processo = $this->getRequest()->getParam('ds_status_processo');
        }
		$departamento = $this->getRequest()->getParam('id_departamento');

        $objModel = $this->getModel();
       /** @var  response string
		* Included  new method to show up proposeCalled in listchamadosinistro.phtml
		* Included id_proposta_mae like method's atribute / Task - 2008281318
        */
		$this->view->response = $objModel->proposeCalled($Proposta->id_proposta_mae);
		
		parent::listAction();
	}

	public function listchamadopreviaAction() {
		$this->isAjax(true);

		if ($this->getRequest()->getParam('id_proposta')) {
			$Propostas = new Seguro_Model_Propostas();
			$Proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
    		$this->view->proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
			$this->view->id_proposta = $Proposta->id;
			$this->view->id_empresa = $this->getRequest()->getParam('id_empresa');
			$this->view->origemPrevia = !empty($this->getRequest()->getParam('origemPrevia'));

			$Model = $this->getModel();
            $usuario = Zend_Auth::getInstance()->getIdentity();
            $modelUsuarios = new Sistema_Model_Usuarios();
			
			$where[] = array(
					'field' => 'id_proposta',
					'operator' => '=',
					'value' => $this->getRequest()->getParam('id_proposta')
				);
			
			if ($this->getRequest()->getParam('id_empresa') && !$modelUsuarios->isFuncionarioAgro($usuario->id)) {
				$where[] = array(
					'field' => 'id_empresa',
					'operator' => '=',
					'value' => $this->getRequest()->getParam('id_empresa')
				);
			}

			$Rs = $Model->fetchAll($Model->getDataPrevia($where));
			$this->view->paginator = $Rs;
		}
	}

	public function viewAction() {
		$this->getHelper('layout')->setLayout('popup');
		$this->view->form = $this->getForm();
		$Model = $this->getModel();
		$params = $this->getRequest()->getParams();

		$Propostas  = new Seguro_Model_Propostas();
		$modelTipoChamado = new Atendimento_Model_TipoChamado();

		$Model->leTodosChamados($params['id']);
		$isUsuarioLogadoFuncionarioAgro = Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro();
		
        /**
         * Não sendo funcionário Agro, salvamos o log de acesso para o chamado pai e os filhos no primeiro acesso
         */
        if (!$isUsuarioLogadoFuncionarioAgro) {
            $idUsuarioLogado = Zend_Auth::getInstance()->getIdentity()->id;
            $modelChamadosLeitura = new Atendimento_Model_ChamadosLeitura();
            $rowChamadoLeitura = $modelChamadosLeitura->getByUsuarioChamado($idUsuarioLogado, $params['id'])->toArray();

            if (empty($rowChamadoLeitura)) {
                $modelChamadosLeitura->save(['ip' => getenv('REMOTE_ADDR'), 'id_chamado' => $params['id']]);
            }

            $rowsChamadosFilhos = $Model->getFilhos($params['id']);

            if (is_array($rowsChamadosFilhos)) {
                foreach ($rowsChamadosFilhos as $chamadoFilho) {
                    if ($chamadoFilho['id_usuario_criacao'] === $idUsuarioLogado) {
                        continue;
                    }

                    $rowChamadoLeitura = $modelChamadosLeitura->getByUsuarioChamado($idUsuarioLogado, $chamadoFilho['id'])->toArray();

                    if (empty($rowChamadoLeitura)) {
                        $modelChamadosLeitura->save(['ip' => getenv('REMOTE_ADDR'), 'id_chamado' => $chamadoFilho['id']]);
                    }
                }
            }
        }

		if ($this->getRequest()->isPost()){
			$params = $this->getRequest()->getParams();
			unset($params['id']);
			if (!$Model->save($params)) {
				$this->view->showMessage($Model->getMessages(), 'error');
			}
		}
	
		$id_chamado = $this->getRequest()->getParam('id');

		$this->view->dados = $Model->getViewData($id_chamado);
		
		$tipoChamado = $modelTipoChamado->find($this->view->dados['id_tipo_chamado'])->current();
		$columnAnexarArquivo =  $isUsuarioLogadoFuncionarioAgro 
			? 'fl_anexar_arquivo_interno'
			: 'fl_anexar_arquivo_destinatario';
			
		$this->view->flagAnexarArquivo = $tipoChamado[$columnAnexarArquivo];

		$modelVP = new Seguro_Model_VistoriaPrevia();
		
		$this->view->dados['agendamento'] = null;
		if ($this->view->dados['id_proposta']) {
			 $this->view->dados['agendamento'] = $modelVP->getAgendamentoVistoriaPreviaByProposta($this->view->dados['id_proposta']);
		}

		$this->view->formTipoChamado = new Atendimento_Form_Tipochamado();

        $Logs = new Atendimento_Model_ChamadoLog();
		
        $this->view->logs = $Logs->getHistoricos($id_chamado);

		$Proposta = $Propostas->find($this->view->dados['id_proposta'])->current();
		$this->view->dados['id_status_proposta'] = $Proposta['id_status'];
	}

	public function getArquivosChamado($id_chamado){
		$ChamadoArquivo = new Atendimento_Model_Chamadoarquivos();
		return $ChamadoArquivo->getArquivosChamados($id_chamado);
	}

	public function getFilter() {
		$usuarioLogado = Zend_Auth::getInstance()->getIdentity();
		$params = $this->getRequest()->getParams();
		$where  = array();
		// dump($params);
		if ($params['situacao_search']) {
			$Safras = new Produto_Model_Safras();

			switch($params['situacao_search']) {
				case 'agro_pendencias_externas':
				case 'corretor_minhas_pendencias':
					$params['safras'] = $Safras->safraCurrent-1;
					$params['fl_pendencia_agro'] = 'F';
					$params['id_status'] = $params['id_status'] ? $params['id_status'].',73,58' : '73,58';
					break;
				case 'agro_pendencias_agro':
				case 'corretor_pendencias_agro':
					$params['safras'] = $Safras->safraCurrent-1;
					$params['fl_pendencia_agro'] = 'T';
					$params['id_status'] = $params['id_status'] ? $params['id_status'].',73,58' : '73,58';
					break;
				case 'agro_resolvidos':
				case 'corretor_resolvidos':
					$params['safras'] = $Safras->safraCurrent-1;
					$params['id_status'] = $params['id_status'] ? $params['id_status'].',74' : '74';
					break;
			}
		}


		if ($params['id_proposta']) {
			$where[] = "v.id_endosso = (SELECT id_endosso from seguro.propostas where id = {$params['id_proposta']})";
		}

		if ($params['id_proposta_search']) {
			$where[] = "v.id_endosso = (SELECT id_endosso from seguro.propostas where id = {$params['id_proposta_search']})";
		}

		if ($params['nr_apolice']) {
			$where[] = array(
				'field' => 'nr_apolice',
				'operator' => '=',
				'value' => $params['nr_apolice']
			);
		}
		
		if ($params['id_empresa']) {
			$where[] = array(
				'field' => 'v.id_empresa',
				'operator' => '=',
				'value' => $params['id_empresa']
			);
		}

		if ($params['id_status_search']) {
			if (is_array($params['id_status_search'])) {
				$values = implode(',', $params['id_status_search']);
				$where[] = array(
					'field' => 'v.id_status',
					'operator' => 'in',
					'value' => $values
				);
			} else {
				$where[] = array(
					'field' => 'v.id_status',
					'operator' => '=',
					'value' => $params['id_status_search']
				);
			}

		} elseif ($params['id_status']){
			$where[] = array(
				'field' => 'v.id_status',
				'operator' => '=',
				'value' => $params['id_status']
			);
		}

		if ($params['id_status_proposta'] && !$params['safras']) {
		    $where[] = array(
		            'field' => 'id_status_proposta',
		            'operator' => '=',
		            'value' => $params['id_status_proposta']
		    );
		}

		if ($params['id_status_proposta']) {
		    $where[] = array(
		            'field' => 'id_status_proposta',
		            'operator' => '=',
		            'value' => $params['id_status_proposta']
		    );
		}

		if ($params['id_safra']) {
			$where[] = array(
				'field' => 'id_safra',
				'operator' => '=',
				'value' => $params['id_safra']
			);
		}

		if ($params['safras']) {
			$where[] = array(
					'field' => 'id_safra',
					'operator' => '>=',
					'value' => $params['safras']
			);
		}

		if ($params['id_prioridade']) {
			$where[] = array(
				'field' => 'id_prioridade',
				'operator' => '=',
				'value' => $params['id_prioridade']
			);
		}

		if ($params['id_tipo_chamado']) {
			$tiposChamado = is_array($params['id_tipo_chamado'])
				? implode(',', $params['id_tipo_chamado'])
				: $params['id_tipo_chamado'];

			$where[] = array(
				'field' => 'id_tipo_chamado',
				'operator' => 'in',
				'value' => "({$tiposChamado})"
			);
		}

		if ($params['id_departamento_search']) {
			$where[] = array(
				'field' => 'id_departamento',
				'operator' => '=',
				'value' => $params['id_departamento_search']
			);
		}

		if ($params['id_departamento'] && !$params['origemProcesso']) {
			$where[] = array(
				'field' => 'id_departamento',
				'operator' => '=',
				'value' => $params['id_departamento']
			);
		}

		if ($params['fl_pendencia_agro']) {
			if ($params['fl_pendencia_agro'] == 'F') {
				$where[] = array(
						'field' => 'fl_pendencia_agrobrasil',
						'operator' => '=',
						'value' => '0'
				);
			}
			if ($params['fl_pendencia_agro'] == 'T') {
				$where[] = array(
						'field' => 'fl_pendencia_agrobrasil',
						'operator' => '=',
						'value' => '1'
				);
			}
		}

		if ($params['id_corretor']) {
			$where[] = array(
				'field' => 'id_usuario_criacao',
				'operator' => '=',
				'value' => $params['id_corretor']
			);
		}

		if ($params['id_responsavel']) {
			$where[] = array(
				'field' => 'id_responsavel',
				'operator' => '=',
				'value' => $params['id_responsavel']
			);
		}

		if ($params['dt_criacao']) {
			$where[] = array(
				'field' => "to_char(v.dt_criacao, 'DD/MM/YYYY')",
				'operator' => '=',
				'value' => $params['dt_criacao']
			);
		}

		if ($params['fl_ativo']) {
			$where[] = array(
				'field' => 'fl_ativo',
				'operator' => '=',
				'value' => $params['fl_ativo']
			);
		}

		if ($params['id_executor_search']) {
			$where['id_executor'] = $params['id_executor_search'];
		}

		if ($params['id_chamado']) {
			$where[] = array(
				'field' => 'v.id',
				'operator' => '=',
				'value' => $params['id_chamado']
			);
		}

		if ($params['dt_ultima_alteracao']) {
			$where[] = array(
				'field' => "to_char(v.dt_alteracao, 'DD/MM/YYYY')",
				'operator' => '=',
				'value' => $params['dt_ultima_alteracao']
			);
		}

		if ($params['destinatario']) {
			$where[] = array(
				'field' => "ds_tipo_destinatario",
				'operator' => '=',
				'value' => $params['destinatario']
			);
		}

		if($params['previa']){
			$where[] = array(
				'field' => "v.id_tipo_chamado",
				'operator' => '=',
				'value' => '68'
			);
		}

		if($params['chamadosgerais']){
			$where[] = array(
				'field' => "departamento",
				'operator' => '=',
				'value' => '20,26'
			);

			$where[] = array(
				'field' => "v.id_tipo_chamado",
				'operator' => '!=',
				'value' => '68'
			);
		}

		if($params['id_estado_search']){
			$where[] = array(
				'field' => "v.id_estado",
				'operator' => '=',
				'value' => $params['id_estado_search']
			);
		}

		if($params['id_municipio_search']){
			$where[] = array(
				'field' => "v.id_municipio",
				'operator' => '=',
				'value' => $params['id_municipio_search']
			);
		}

        if ($params['origemProcesso']) {
			$modelChamadoDestinatario = new Atendimento_Model_ChamadoDestinatario();
			$modelUsuarios = new Sistema_Model_Usuarios();

			if (!$modelUsuarios->isFuncionarioAgro($usuarioLogado->id)) {
				$whereLegado = "(v.fl_destinatario_corretor is false AND v.fl_destinatario_seguradora is false AND v.fl_destinatario_empresa_vistoria is false)";
				switch($modelChamadoDestinatario->getDestinatarioLogado()) {
					case Atendimento_Model_ChamadoDestinatario::DESTINATARIO_CORRETOR:
						$where[] = "(v.fl_destinatario_corretor is true OR {$whereLegado})"; 
						break;
					case Atendimento_Model_ChamadoDestinatario::DESTINATARIO_SEGURADORA:
						$where[] = "(v.fl_destinatario_seguradora is true OR {$whereLegado})";
						break;
					case Atendimento_Model_ChamadoDestinatario::DESTINATARIO_EMPRESA_VISTORIA:
						$where[] = "(v.fl_destinatario_empresa_vistoria is true OR {$whereLegado})";
						break;
				}
			}
        }

		return $where;
	}

	public function deletearquivoAction(){
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		try {

			$ChamadoArquivo = new Atendimento_Model_Chamadoarquivos();
			$ChamadoArquivo->getAdapter()->beginTransaction();

			if (empty($this->getRequest()->getParam('id_arquivo'))) {
				throw new Exception("ID do arquivo não informado.");
			}

			$Row = $ChamadoArquivo->getRow($this->getRequest()->getParam('id_arquivo'));

			if (empty($Row->id)) {
				throw new Exception("Não foi encontrado arquivo para o ID informado.");
			}

			if (!$ChamadoArquivo->delete($Row->id, 'id')) {
				throw new Exception("Erro ao excluir o arquivo.");
			}

			$sanitizedPath = realpath(APPLICATION_PATH."/upload_files/chamados/".$Row->ds_nome_arquivo);

			if (!file_exists($sanitizedPath)) {
				throw new Exception("Erro ao deletar o arquivo '". $Row->ds_nome_arquivo ."' da pasta.");
			}

			unlink($sanitizedPath);

			$result = '';
			$ChamadoArquivo->getAdapter()->commit();

		} catch (\Throwable $th) {
			$result = $th->getMessage();
			$ChamadoArquivo->getAdapter()->rollBack();
		}

		$this->getResponse()->setBody($result);
	}

	public function setnaolidaAction(){
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$Model = $this->getModel();

		$Model->marcaComoNaoLido($this->getRequest()->getParam('id_chamado'));

		$result=array();
		$this->getResponse()->setBody(Zend_Json::encode($result));

	}

	public function verificachamadoabertoAction(){
		$this->isAjax();

		$User = Zend_Auth::getInstance()->getIdentity();

		$Model = $this->getModel();
		$chamadoAberto = $Model->verificaChamadoAberto($this->getRequest()->getParam('id_proposta'), $User->tp_usuario);


		$result=array();
		if($chamadoAberto){
			$result['status'] = true;
		}else{
			$result['status'] = false;
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function verificastatuspropostaAction(){
		$this->isAjax();

		$Model = $this->getModel();
		$propostaStatus = $Model->verificaStatusProposta($this->getRequest()->getParam('id_proposta'));

		$result=array();
		if($propostaStatus == 'PROPOSTA_CANCELADA'){
			$result['status'] = $propostaStatus;
		}else{
			$result['status'] = '';
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function atualizatipodeptoAction() {
		$this->isAjax();

		$retorno = ['erro' => false, 'mensagem' => ''];
		$idProposta = $this->getRequest()->getParam('id_proposta');
        $idChamado = $this->getRequest()->getParam('id_chamado');
        $idDepartamento = $this->getRequest()->getParam('id_departamento');
        $idTipoChamado = $this->getRequest()->getParam('id_tipo_chamado');

		$chamado = null;

		if (!empty($idChamado)) {
			$chamado = (new Atendimento_Model_Chamado())->find($idChamado)->current();
		}
		
		$tipoChamado = null;
		if (!empty($idTipoChamado)) {
			$tipoChamado = (new Atendimento_Model_TipoChamado())->find($idTipoChamado)->current();

			$retorno['tipoChamado'] = [
				'identificacaoTipoChamado' => $tipoChamado->ds_identificacao_tipo_chamado,
				'prazoDiasUteis' =>$tipoChamado->prazo_dias_uteis
			];
			
			if (!empty($chamado) && !empty($tipoChamado->prazo_dias_uteis)) {
				$data = !is_null($chamado) ? $chamado->dt_criacao : date('Y-m-d');
				$retorno['dataFinalPrazo'] = Agro_Util::somarDataDiasUteis($data, $tipoChamado->prazo_dias_uteis);
			}
		}

        $Model = new Atendimento_Model_Chamado();
		$rowProposta = (new Seguro_Model_Propostas())->getRow($idProposta);
		$idProcesso = (new Sinistro2_Model_Processos())->getIdProcessoByProposta($rowProposta->recupera_id_proposta_vigente($idProposta));

        if (!$idProcesso && (int) $idDepartamento === Sistema_Model_Departamentos::AGRO_SINISTRO) {
            $retorno['erro'] = true;
            $retorno['mensagem'] = "Alteração de Departamento/Tipo de Chamado não realizado. Essa proposta não possui um Processo de Sinistro aberto. Proposta: {$idProposta}";
        } else {
			
            if($Model->atualizaTipoDepto($idChamado, $idDepartamento, $idTipoChamado)){
                $retorno['mensagem'] = "Chamado alterado com sucesso!";
            } else {
                $retorno['erro'] = true;
                $retorno['mensagem'] = "Erro ao atualizar chamado!";
            }
			
        }
		
		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	public function atualizaresponsavelAction(){
		$this->isAjax();
		$Model = new Atendimento_Model_Chamado();

		$idChamado = $this->getRequest()->getParam('id_chamado');
		$idResponsavel = $this->getRequest()->getParam('id_responsavel');

		if($Model->atualizaResponsavel($idChamado, $idResponsavel)){
			$result = "Chamado alterado com sucesso!";
		}else{
			$result = "Erro ao atualizar chamado!";
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function getprazodataagendamentoAction()
	{
		$this->getHelper('layout')->disableLayout();
		$idProposta = $this->getRequest()->getParam('id_proposta');
		$modelVP = new Seguro_Model_VistoriaPrevia();
		
		$agendamento = null;
		if ($idProposta) {
			 $agendamento = $modelVP->getAgendamentoVistoriaPreviaByProposta($idProposta);
		}

		$this->view->agendamento = $agendamento;
		$this->view->form = $this->getForm();
	}

	public function salvaprorrogacaodataAction()
	{
		$this->isAjax(false);
		
		try {
			if ($this->getRequest()->isPost()) {
				$model = $this->getModel();
				$params = $this->getRequest()->getParams();
				$result = $model->salvaProrrogacaoData($params);
			}
		} catch (Exception $e) {
			dump($e->getMessage());
			$result = array('result' => "Ocorreu um erro ao salvar a data!", 'error' => true);
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

    public function propostaschamadospendentesAction()
    {
        $this->isAjax();

        $corretoresPropostas = [];
        $propostasComSolicitacaoEndosso = [];
        $safraAtual = (new Produto_Model_Safras())->getSafraAtual();
        $rowsSolicitacoesEndosso = (new Endosso_Model_Solicitacao())->getSolicitacoesSafraAnalisadas(
            $safraAtual['id']
        )->toArray();

        $rowsChamadosPropostas = (new Atendimento_Model_Chamado())->getChamadosPendencias(
            [Atendimento_Model_Chamado::ID_STATUS_ABERTO, Atendimento_Model_Chamado::ID_STATUS_NOVO]
            , $safraAtual['id']
            , true
        );

        foreach ($rowsChamadosPropostas as $rowChamadoProposta) {
            $statusValidosProposta = [
                Seguro_Model_Propostas::ID_STATUS_AGUARDANDO_ENVIO_SEG,
                Seguro_Model_Propostas::ID_STATUS_CONF_PENDENCIAS,
                Seguro_Model_Propostas::ID_STATUS_APOLICE_EMITIDA,
            ];

            if (!in_array($rowChamadoProposta['id_status_proposta'], $statusValidosProposta)) {
                continue;
            }

            $idProposta = $rowChamadoProposta['id_proposta'];
            $retorno = array_filter($rowsSolicitacoesEndosso, function($registro) use($idProposta) {
                return $idProposta === $registro['id_proposta'];
            });

            if (!empty($retorno)) {
                $propostasComSolicitacaoEndosso[] = $rowChamadoProposta;
            }
        }

        $modelChamados = $this->getModel();

        foreach ($propostasComSolicitacaoEndosso as $registro) {
            $rowChamado = $modelChamados->getUltimaRespostaChamadoByIdParent($registro['id_chamado']);

            if (!empty($rowChamado) && empty($rowChamado['id_funcionario'])) {
                continue;
            }

            $idChamado = $registro['id_chamado'];
            $idProposta = $registro['id_proposta'];
            $idUsuarioProposta = $registro['id_usuario_criacao_proposta'];
            $idUsuarioCorretor = $registro['id_usuario_corretor'];

            if (!array_key_exists($idUsuarioCorretor, $corretoresPropostas)) {
                $corretoresPropostas[$idUsuarioCorretor] = [];
            }

            if (!array_key_exists($idUsuarioProposta, $corretoresPropostas[$idUsuarioCorretor])) {
                $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta] = [];
            }

            if (!array_key_exists($idProposta, $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta])) {
                $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta][$idProposta] = [];
            }

            if (!array_key_exists($idProposta, $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta])) {
                $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta][$idProposta] = [];
            }

            if (!array_key_exists($idChamado, $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta][$idProposta])) {
                $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta][$idProposta][$idChamado] = [
                    'ds_nome_produto' => $registro['ds_nome_produto'],
                    'dt_prazo' => $registro['dt_prazo'],
                ];
            }

            if (!array_key_exists('pendencias', $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta][$idProposta][$idChamado])) {
                $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta][$idProposta][$idChamado]['pendencias'] = [];
            }

            $corretoresPropostas[$idUsuarioCorretor][$idUsuarioProposta][$idProposta][$idChamado]['pendencias'][$registro['id_pendencia']] = $registro['ds_nome_pendencia'];
        }

        $modelCorretores = new Sistema_Model_Corretores();
        $modelFuncionarios = new Sistema_Model_Funcionarios();
        $modelPrepostos = new Sistema_Model_Prepostos();

        foreach ($corretoresPropostas as $idUsuarioCorretor => $usuarioProposta) {
            $rowCorretorPrincipal = $modelCorretores->findByUser($idUsuarioCorretor);
            $emailCorretorPrincipal = $rowCorretorPrincipal['ds_email'];
            $rowFuncionario = $modelFuncionarios->getFuncionarioByIdUsuario($rowCorretorPrincipal['id_comercial']);

            $borderBottom = "border-bottom: 1px solid; border-top: 1px solid";
            $body = "Prezado Corretor,<br><br>";
            $body .= "Informamos que a(s) proposta(s) abaixo possui(em) chamado(s) aberto(s), notificando Pendência(s), conforme constatado em conferência de proposta:<br><br>";
            $body .= "<table style='border: 1px solid'>";
            $body .= "  <thead>";
            $body .= "    <tr>";
            $body .= "      <th {$borderBottom}>Proposta</th>";
            $body .= "      <th {$borderBottom}>Corretor</th>";
            $body .= "      <th {$borderBottom}>Sublogin</th>";
            $body .= "      <th {$borderBottom}>Produto</th>";
            $body .= "      <th {$borderBottom}>Prazo</th>";
            $body .= "      <th {$borderBottom}>Tipo de Pendências</th>";
            $body .= "    </tr>";
            $body .= "  </thead>";
            $body .= "  <tbody>";

            foreach ($usuarioProposta as $idUsuario => $proposta) {
                $rowCorretor = $modelCorretores->findByUser($idUsuario);
                $rowPreposto = null;
                $usuarioSublogin = '-';

                if (empty($rowCorretor)) {
                    $rowPreposto = $modelPrepostos->findByUser($idUsuario);
                    $rowCorretor = $modelCorretores->find($rowPreposto['id_corretor'])->current();
                    $usuarioSublogin = $rowPreposto['ds_nome_usuario'];
                }

                foreach ($proposta as $idProposta => $chamado) {
                    foreach ($chamado as $informacoesPendencia) {
                        $body .= "    <tr>";
                        $body .= "      <td style='text-align: center; {$borderBottom}'>{$idProposta}</td>";
                        $body .= "      <td style='text-align: center; {$borderBottom}'>{$rowCorretor['ds_nome_corretor']}</td>";
                        $body .= "      <td style='text-align: center; {$borderBottom}'>{$usuarioSublogin}</td>";
                        $body .= "      <td style='text-align: center; {$borderBottom}'>{$informacoesPendencia['ds_nome_produto']}</td>";
                        $body .= "      <td style='text-align: center; {$borderBottom}'>{$informacoesPendencia['dt_prazo']}</td>";
                        $body .= "      <td style='text-align: center; {$borderBottom}'>" . implode('; ', $informacoesPendencia['pendencias']) . "</td>";
                        $body .= "    </tr>";
                    }
                }
            }

            $body .= "  </tbody>";
            $body .= "</table><br><br>";
            $body .= "Acesse o sistema Agronet 2.0 através do endereço: <a href='http://agronet.agrobrasilseguros.com.br/'>http://agronet.agrobrasilseguros.com.br/</a>";
            $body .= "<br>ATENÇÃO: esta é uma mensagem automática. Por favor, não responda. Se deseja entrar em contato conosco, escreva para atendimento@agrobrasilseguros.com.br <br><br>";

            $from = $this->ambienteProducao ? 'atendimento@agrobrasilseguros.com.br' : 'testes@agrobrasilseguros.com.br';
            $email = new Agro_Mail();
            $email->clearFrom();
            $email->setFrom($from, 'AgroBrasil - Agronet 2.0');
            $email->addTo($emailCorretorPrincipal);
            $email->addCc($rowFuncionario['ds_email']);
            $email->addBcc('karina.silva@agrobrasilseguros.com.br');
            $email->setSubject("Propostas Pendentes");
            $email->setBody($body, 'html');
            $email->send();
        }

        $this->getResponse()->setBody(Zend_Json::encode([]));
    }

	public function aberturachamadoprimeiraparcelaAction()
	{
		$this->isAjax();

        $response = [
            'message' => 'Processamento realizado com sucesso.',
            'status' => true
        ];

		try {
			$model = $this->getModel();
			$prazoRetorno = Agro_Util::somarDataDiasUteis(date('Y-m-d'), 3);
			$descricao = MSG_CHAMADO_PRIMEIRA_PARCELA;
			$descricao = str_replace("[dt_prazo_retorno]", $prazoRetorno, $descricao);

			$boletos = (new Seguro_Model_PropostaBoleto)->getBoletosVencidos();

			$chamadosEnvioEmail = [];
			foreach ($boletos as $row) {

				if ($model->possuiChamadoAberto($row['id_proposta'], Atendimento_Model_TipoChamado::TECNICA_PARCELA_ABERTO)) {
					continue;
				}

				if ($model->possuiChamadoAberto($row['id_proposta'], Atendimento_Model_TipoChamado::TECNICA_PROR_PARC)) {
					continue;
				}

				$dadosChamado = [
					'id' => '',
					'id_proposta' => $row['id_proposta'],
					'id_prioridade' => Atendimento_Model_Prioridade::NORMAL,
					'id_departamento' => Sistema_Model_Departamentos::AGRO_TECNICA,
					'id_tipo_chamado' => Atendimento_Model_TipoChamado::TECNICA_PARCELA_ABERTO,
					'ds_descricao' => $descricao,
					'dt_prazo_retorno' => Agro_Util::formatDate($prazoRetorno, 'yyyy-MM-dd')
				];

				$nrChamado = $model->save($dadosChamado);

				if (!$nrChamado){
					throw new Exception($model->getMessages());
				}

				if ($row['vl_total'] >= 10000) {

					if (!array_key_exists($row['id_comercial'], $chamadosEnvioEmail)) {
						$chamadosEnvioEmail[$row['id_comercial']]['ds_email_comercial'] = $row['ds_email_comercial'];
					}

					$chamadosEnvioEmail[$row['id_comercial']]['dados'][] = [
						'id_proposta' => $row['id_proposta'],
						'ds_nome_responsavel' => $row['ds_nome_responsavel'],
						'vl_total' => $row['vl_total'],
					];
				}
			}

			if (!empty($chamadosEnvioEmail)) {
				$this->enviarEmailChamadoPrimeiraParcela($chamadosEnvioEmail);
			}

		} catch (\Throwable $th) {
			$response['message'] = $th->getMessage();
			$response['status'] = false;
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	private function enviarEmailChamadoPrimeiraParcela(array $comerciais): void
	{
		foreach ($comerciais as $comercial) {
			$corpo  = "Criados chamados de <b>Primeira parcela em aberto</b> para as seguintes propostas: \n";
			$corpo .= "<table border=1>";
			$corpo .= "	<thead style='backgroud-color: #F2F2F2;'>";
			$corpo .= "		<th>";
			$corpo .= "			<b>Propostas</b>";
			$corpo .= "		</th>";
			$corpo .= "		<th>";
			$corpo .= "			<b>Corretor</b>";
			$corpo .= "		</th>";
			$corpo .= "		<th>";
			$corpo .= "			<b>Valor do Prêmio</b>";
			$corpo .= "		</th>";
			$corpo .= "	</thead>";
			$corpo .= "	<tbody>";

			foreach ($comercial['dados'] as $dados) {
				$valorTotal = Agro_Util::formatDbCurrency($dados['vl_total']);

				$corpo .= "		<tr>";
				$corpo .= "			<td>";
				$corpo .= "				{$dados['id_proposta']}";
				$corpo .= "			</td>";
				$corpo .= "			<td>";
				$corpo .= "				{$dados['ds_nome_responsavel']}";
				$corpo .= "			</td>";
				$corpo .= "			<td>";
				$corpo .= "				{$valorTotal}";
				$corpo .= "			</td>";
				$corpo .= "		</tr>";
			}

			$corpo .= "	</tbody>";
			$corpo .= "</table>";
			
			if (APPLICATION_ENV != 'production') {
				$corpo .= "<br><br>[AMBIENTE TESTE][DEBUG] E-mail será enviado para {$comercial['ds_email_comercial']}<br><br>";
			}

			$corpo .= Agro_Mail::textoPadraoEmailHtml();

			$agroMail = new Agro_Mail();
			$agroMail->addTo($comercial['ds_email_comercial']);
			$agroMail->addCc("moacir.emmer@agrobrasilseguros.com.br");
			$agroMail->setSubject("Novos chamados de primeira parcela em aberto");
			$agroMail->setBody($corpo, 'html');
			$agroMail->send();
		}
	}
}
