<?php

class Atendimento_Model_Chamado extends Agro_Db_Table_Abstract {
    const ID_COMUNICADO_VP = 96;

    const ID_STATUS_ABERTO = 73;
    const ID_STATUS_NOVO = 58;
    const ID_STATUS_RESOLVIDO = 74;

	const PRAZO_ANDAMENTO = 1;
    const PRAZO_PROXIMO_EXPIRAR = 2;
    const PRAZO_EXPIRADO = 3;

	protected $_rowClass = 'Atendimento_Model_Row_Chamado';
	protected $_view_relatorio = 'v_chamados_relatorio';
	public $_order = array('c.id','c.dt_criacao');
	protected $_schema = 'atendimento';
	protected $_name = 'chamados';
	protected $_view = 'v_chamados';
	protected $_primary = 'id';
	public $_columnExcel = array(
		'id' => 'Id',
		'id_proposta' => 'Proposta',
    	'ds_nome_usuario' => 'Criador',
    	'dt_criacao' => 'Criação',
    	'ds_tipo_chamado' => 'Tipo',
    	'ds_nome_departamento' => 'Departamento',
    	'ds_status' => 'Status'
	);

	public function relatorioChamados($dados) {
	    $Empresa = new Sistema_Model_Empresas();
	    $empresa = $Empresa->getIdEmpresaUsuarioCorrente();
	    
	    $this->_db->query(
	        "CREATE temp TABLE chamados_temp AS (
                select 
                    id_parent,
                    id_proposta,
                    max(id) as id_max_chamado
                from 
                    atendimento.chamados c 
                where 
                    id_parent is not null
                group by 
                    id_parent, id_proposta			
				)"
	        );
	    $subselect = $this->select()->setIntegrityCheck(false);
	    $subselect->from('atendimento.chamados', "id_parent, max(id)");
	    $subselect->where('id_parent is not null');
	    $subselect->group('id_parent');

		$Select = $this->select()->setIntegrityCheck(false);
    	$Select->from(array('c' => 'atendimento.chamados'), array('id', 'id_usuario_criacao', 'id_usuario_alteracao', 'dt_criacao', 'dt_alteracao', "TO_CHAR(c.dt_final_prazo, 'DD/MM/YYYY') AS dt_final_prazo"));
    	$Select->join(array('d' => 'sistema.departamentos'), 'd.id = c.id_departamento', array('ds_nome_departamento'));
    	$Select->join(array('t' => 'atendimento.tipo_chamado'), 't.id = c.id_tipo_chamado', array('ds_tipo_chamado', 'prazo_dias_uteis'));
    	$Select->join(array('cp' => 'sistema.status'), 'cp.id = c.id_status', array('ds_status','cd_status'));
    	$Select->join(array('p' => 'seguro.propostas'), 'p.id = c.id_proposta', array('id as id_proposta','nr_apolice','id_proposta_mae'));
    	$Select->join(array('pd' => 'produto.produtos'), 'pd.id = p.id_produto', array('ds_nome_produto'));

    	$Select->joinLeft(array('spo' => 'sinistro.processos'), 'spo.id_proposta = p.id', false);
    	$Select->joinLeft(array('pe' => 'sinistro.processos_empresas'), 'pe.id_processo = spo.id and pe.fl_ativo=true', false);
    	if ($this->_user->tp_usuario == 'V' || $this->_user->tp_usuario == 'M') {
    		$Select->joinLeft(array('e' => 'sistema.empresas'), 'e.id = pe.id_empresa and e.id = '.$empresa, 'ds_nome_fantasia');
    	} else {
  			$Select->joinLeft(array('e' => 'sistema.empresas'), 'e.id = pe.id_empresa', 'ds_nome_fantasia');
    	}

    	$Select->joinLeft(array('pve' => 'seguro.propostas_vistorias_previas'), 'pve.id_proposta = p.id', false);
    	$Select->joinLeft(array('ve' => 'sistema.vistorias_empresas'), 've.id_vistoria = pve.id_vistoria', false);
   		$Select->joinLeft(array('e2' => 'sistema.empresas'), 'e2.id = ve.id_empresa', 'ds_nome_fantasia as ds_nome_fantasia_previa');
   		$Select->joinLeft(array('acc' => 'chamados_temp'), 'acc.id_parent = c.id and c.id_proposta = acc.id_proposta');

        $caseDescricao = "case ";
        $caseDescricao .= "   when c2.id_parent IS NOT NULL ";
        $caseDescricao .= "       then ";
        $caseDescricao .= "            case ";
        $caseDescricao .= "                when c2.ds_descricao <> '' AND telefones_chamado.telefones <> '' ";
        $caseDescricao .= "                    then regexp_replace(c2.ds_descricao || ' / Telefone(s): ' || telefones_chamado.telefones, E'[\n\r]+', ' ', 'g') ";
        $caseDescricao .= "                when c2.ds_descricao = '' AND telefones_chamado.telefones <> '' ";
        $caseDescricao .= "                    then regexp_replace('Telefone(s): ' || telefones_chamado.telefones, E'[\n\r]+', ' ', 'g') ";
        $caseDescricao .= "                else regexp_replace(c2.ds_descricao, E'[\n\r]+', ' ', 'g') ";
        $caseDescricao .= "             end ";
        $caseDescricao .= "   else regexp_replace(c.ds_descricao, E'[\n\r]+', ' ', 'g') ";
        $caseDescricao .= "end AS ds_descricao_ultimo_log";

   		$Select->joinLeft(array('c2' => 'atendimento.chamados'), 'c2.id = acc.id_max_chamado', $caseDescricao);

    	$Select->join(array('sp' => 'sistema.status'), 'sp.id = p.id_status', array('cd_status','ds_chave'));
    	$Select->join(array('pp' => 'seguro.propostas_proponentes'), 'p.id = pp.id_proposta', 'ds_nome_proponente');
    	$Select->join(array('pr' => 'seguro.propostas_propriedades'), 'p.id = pr.id_proposta', 'ds_nome_propriedade');
    	$Select->join(array('cd' => 'atendimento.chamados_destinatario'), 'c.id = cd.id_chamado', array('ds_tipo_destinatario'));
		$Select->join(array('u' => 'sistema.usuarios'), 'c.id_usuario_criacao = u.id', array('ds_nome_usuario','tp_usuario'));
		$Select->join(array('up' => 'sistema.usuarios'), 'p.id_usuario_criacao = up.id', array('ds_nome_usuario as digitador'));
		$Select->joinLeft(array('u2' => 'sistema.usuarios'), 'c.id_usuario_alteracao = u2.id', 'ds_nome_usuario as ds_nome_usuario_alteracao');
		$Select->joinLeft(array('fu2' => 'sistema.funcionarios'), 'u2.id = fu2.id_usuario', 'fu2.id_empresa as id_empresa_alteracao');

		$Select->joinLeft(array('u3' => 'sistema.usuarios'), 'c.id_responsavel = u3.id', 'ds_nome_usuario as ds_nome_responsavel');

        $sqlChamadosTelefones = "SELECT array_to_string(array_agg(ds_telefone), ' / ') as telefones, id_chamado ";
        $sqlChamadosTelefones .= "FROM atendimento.chamados_telefones ";
        $sqlChamadosTelefones .= "GROUP BY id_chamado";

		$Select->joinLeft(array('telefones_chamado' => "({$sqlChamadosTelefones})"), 'telefones_chamado.id_chamado = c2.id', 'telefones');

    	if ($dados['departamento']) { $Select->where('c.id_departamento = ?', $dados['departamento'], 'integer'); }
    	if ($dados['destinatario']) { $Select->where('cd.ds_tipo_destinatario = ?', $dados['destinatario']); }

		if ($dados['situacao_search']) {
			$dados['status'] = is_array($dados['status']) ? implode("," , $dados['status']) : $dados['status'];

			switch($dados['situacao_search']) {
				case 'agro_pendencias_externas':
				case 'corretor_minhas_pendencias':
					$Select->where("c.fl_pendencia_agrobrasil = ?", 'false');
					$dados['status'] = isset($dados['status']) ? $dados['status'].',73,58' : '73,58';
					break;
				case 'agro_pendencias_agro':
				case 'corretor_pendencias_agro':
					$Select->where("c.fl_pendencia_agrobrasil = ?", 'true');
					$dados['status'] = isset($dados['status']) ? $dados['status'].',73,58' : '73,58';
					break;
				case 'agro_resolvidos':
				case 'corretor_resolvidos':
					$dados['status'] = isset($dados['status']) ? $dados['status'].',74' : '74';
					break;
			}

			$dados['status'] = explode(",", $dados['status']);
		}    	

    	if(is_array($dados['status'])){
    		$filtro .= "(".implode("," , $dados['status']).")";
    		$Select->where('c.id_status in'. $filtro);
    	} else {
    	    if ($dados['status']) {
    	        $Select->where('c.id_status = ?', $dados['status'], 'integer');
    	    }
    	}

		if ($dados['sou_responsavel']) {
			$User = Zend_Auth::getInstance()->getIdentity();
			$Select->where('c.id_responsavel = ?', $User->id);
			if (empty($dados['status']) && 
				empty($dados['tipochamado']) &&
				empty($dados['departamento']) &&
				empty($dados['destinatario'])
			) {
				$Select->where('c.id_status <> ?', 74);
			}
		}

    	if (!empty($dados['tipochamado'])) {
			$chamados = "(".implode("," , $dados['tipochamado']).")";
    		$Select->where("c.id_tipo_chamado in {$chamados}");
    	}

		if (!empty($dados['prazo'])) {
			$wherePrazo = '';

			foreach ($dados['prazo'] as $prazo) {
				switch ($prazo) {
					case self::PRAZO_ANDAMENTO:
						$wherePrazo .= !empty($wherePrazo)
							? " OR now()::DATE < (c.dt_criacao::DATE + ((c.dt_final_prazo - now()::DATE) * 0.8) * INTERVAL '1 day')"
							: "now()::DATE < (c.dt_criacao::DATE + ((c.dt_final_prazo - now()::DATE) * 0.8) * INTERVAL '1 day')";
						break;
					case self::PRAZO_PROXIMO_EXPIRAR:
						$wherePrazo .= !empty($wherePrazo)
							? " OR now()::DATE > (c.dt_criacao::DATE + ((c.dt_final_prazo - now()::DATE) * 0.8) * INTERVAL '1 day')"
							: "now()::DATE > (c.dt_criacao::DATE + ((c.dt_final_prazo - now()::DATE) * 0.8) * INTERVAL '1 day')";
						break;
					case self::PRAZO_EXPIRADO:
						$wherePrazo .= !empty($wherePrazo)
							? ' OR c.dt_final_prazo > now()::DATE'
							: 'now()::DATE > c.dt_final_prazo';
						break;
				}
			}

			$Select->where($wherePrazo);
		}
		
    	if ($this->_user->tp_usuario == 'C') {
    		$Select->join(array('pc' => 'seguro.propostas_corretores'), 'p.id = pc.id_proposta');
    		$Select->where('pc.id_usuario = ?', $this->_user->id);
    	}

		if ($this->_user->tp_usuario == 'F' && $this->_user->ds_chave == 'SEGURADORA') {
			$Select->where('cd.ds_tipo_destinatario = ?', 'S');
		}

		if ($this->_user->tp_usuario == 'C' || $this->_user->tp_usuario == 'P') {
			$Select->where('p.id_usuario_criacao = ?', $this->_user->id);
			$Select->where('cd.ds_tipo_destinatario = ?', 'C');
		}

		if ($this->_user->tp_usuario == 'V' || $this->_user->tp_usuario == 'M') {
			$Select->where('c.id_usuario_criacao = ?', $this->_user->id);
			$Select->where('cd.ds_tipo_destinatario = ?', 'V');
		}

		$Select->where('c.id_parent IS NULL');
    	return $this->fetchAll($Select);
	}

	public function relatorioChamadosPrevia($dados) {
		$Empresa = new Sistema_Model_Empresas();
		$empresa = $Empresa->getIdEmpresaUsuarioCorrente();

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('c' => 'atendimento.chamados'), array('id', 'id_usuario_criacao', 'id_usuario_alteracao', 'dt_criacao', 'dt_alteracao'));
		$Select->join(array('d' => 'sistema.departamentos'), 'd.id = c.id_departamento', array('ds_nome_departamento'));
		$Select->join(array('t' => 'atendimento.tipo_chamado'), 't.id = c.id_tipo_chamado', array('ds_tipo_chamado'));
		$Select->join(array('cp' => 'sistema.status'), 'cp.id = c.id_status', array('ds_status','cd_status'));
		$Select->join(array('p' => 'seguro.propostas'), 'p.id = c.id_proposta', array('id as id_proposta','nr_apolice'));

		$Select->join(array('pve' => 'seguro.propostas_vistorias_previas'), 'pve.id_proposta = p.id', false);
		$Select->join(array('ve' => 'sistema.vistorias_empresas'), 've.id_vistoria = pve.id_vistoria', false);

		if ($this->_user->tp_usuario == 'V'|| $this->_user->tp_usuario == 'M') {
			$Select->join(array('e2' => 'sistema.empresas'), 'e2.id = ve.id_empresa and e2.id = '.$empresa, 'ds_nome_fantasia as ds_nome_fantasia_previa');
		} else {
		    $Select->join(array('e2' => 'sistema.empresas'), 'e2.id = ve.id_empresa', 'ds_nome_fantasia as ds_nome_fantasia_previa');
		}

		$Select->join(array('sp' => 'sistema.status'), 'sp.id = p.id_status', array('cd_status','ds_chave'));
		$Select->join(array('pp' => 'seguro.propostas_proponentes'), 'p.id = pp.id_proposta', 'ds_nome_proponente');
		$Select->join(array('pr' => 'seguro.propostas_propriedades'), 'p.id = pr.id_proposta', 'ds_nome_propriedade');
		$Select->join(array('cd' => 'atendimento.chamados_destinatario'), 'c.id = cd.id_chamado', array('ds_tipo_destinatario'));
		$Select->join(array('u' => 'sistema.usuarios'), 'c.id_usuario_criacao = u.id', 'ds_nome_usuario');
		$Select->joinLeft(array('u2' => 'sistema.usuarios'), 'c.id_usuario_alteracao = u2.id', 'ds_nome_usuario as ds_nome_usuario_alteracao');
		$Select->joinLeft(array('u3' => 'sistema.usuarios'), 'c.id_responsavel = u3.id', 'ds_nome_usuario as ds_nome_responsavel');

		$Select->where('cd.ds_tipo_destinatario = ?', 'V');
		$Select->where('t.ds_chave = ?', 'PENDENCIA_LAUDO_PREVIA');

		if(is_array($dados['status'])){
			$filtro .= "(".implode("," , $dados['status']).")";
			$Select->where('c.id_status in'. $filtro);
		} else {
			if ($dados['status']) {
				$Select->where('c.id_status = ?', $dados['status'], 'integer');
			}
		}

		return $this->fetchAll($Select);
	}


	public function save($data) {
		//valida uma exceção para quando já existir uma transação aberta, não estoura o erro
		$nested = 0;
		try {
			$this->getAdapter()->beginTransaction();
		} catch (Exception $e) {
			$nested++;
		}

		try {

			$User = Zend_Auth::getInstance()->getIdentity();
			$modelUser = new Sistema_Model_Usuarios();
			$ChamadoArquivos = new Atendimento_Model_Chamadoarquivos();
			$TipoChamado = new Atendimento_Model_TipoChamado();
			$Status = new Sistema_Model_Status();
			$Processo = new Sinistro2_Model_Processos();
			$Empresas = new Sistema_Model_Empresas();
			$Proposta = new Seguro_Model_Propostas();
			$User = Zend_Auth::getInstance()->getIdentity();
			$RowProposta = $Proposta->getRow($data['id_proposta']);

			$Chamado = $this->getRow($data['id']);
            $tipoChamadoConfirmarContato = in_array((int) $data['id_tipo_chamado'], [Atendimento_Model_TipoChamado::TECNICA_CONFIRMAR_CONTATO, Atendimento_Model_TipoChamado::SINISTRO_CONFIRMAR_CONTATO_VISTORIADOR]);
			
			//Valida se o usuário logado está pertencente ao chamado
			if (isset($data['id_parent']) && !empty($data['id_parent'])) {
				$error = false;
				if ($User->tp_usuario == 'C') {
					$Select = $this->select()->setIntegrityCheck(false);
			    	$Select->from(array('a' => 'atendimento.v_chamados'), false);
			    	$Select->join(array('b' => 'seguro.propostas_corretores'), 'a.id_proposta = b.id_proposta', false);
			    	$Select->join(array('c' => 'sistema.corretores'), 'b.id_usuario = c.id_usuario', 'c.*');
			    	$Select->where('a.id = ?', $data['id_parent']);
			    	$Select->where("ds_tipo_destinatario = 'C'");
			    	$Select->where("b.id_usuario = ?", $User->id);

			    	$corretor = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);

			    	if (empty($corretor)) {
			    		$error = true;
			    	}
			    } else if ($User->tp_usuario == 'P') {
			    	$Select = $this->select()->setIntegrityCheck(false);
			    	$Select->from(array('a' => 'atendimento.v_chamados'), false);
			    	$Select->join(array('b' => 'seguro.propostas'), 'a.id_proposta = b.id', false);
			    	$Select->join(array('c' => 'sistema.prepostos'), 'b.id_usuario_criacao = c.id_usuario', 'c.*');
			    	$Select->where('a.id = ?', $data['id_parent']);
			    	$Select->where("ds_tipo_destinatario = 'C'");
			    	$Select->where("b.id_usuario_criacao = ?", $User->id);

			    	$preposto = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);

			    	if (empty($preposto)) {
			    		$error = true;
			    	}
			    }
		    	
		    	if ($error) {
		    		throw new Exception("Usuário logado não tem permissão para realizar essa ação.", 1);
	    	    }
		    }
			/*
			 * Ações quando o chamado for para o sinistro
			 */
	    	if($data['id_departamento'] == 23){

				$id_processo = $Processo->getIdProcessoByProposta($RowProposta->recupera_id_proposta_vigente($data['id_proposta']));

	    	    if($id_processo){
					$RowProcesso = $Processo->find($id_processo)->current();

					/*
					 * Se o processo foi encaminhado para liquidação, torna responsável pelo chamado o mesmo usuário responsável pela liquidação
					 */
					if ($RowProcesso->id_usuario_responsavel_liquidacao){
						$id_responsavel = $RowProcesso->id_usuario_responsavel_liquidacao;

						/**
						 * Verifica se existem chamados do sinistro abertos com outro responsavel, se existirem altera para o responsavel pela liquidação
						 */
						$ChamadosAbertos = $this->fetchAll("id_proposta = {$data['id_proposta']} and id_departamento = 23");

						if ($ChamadosAbertos->count()){

							foreach ($ChamadosAbertos as $row) {

								if ($row->id_responsavel != $RowProcesso->id_usuario_responsavel_liquidacao){
									$row->id_responsavel = $RowProcesso->id_usuario_responsavel_liquidacao;
									$row->save();
								}
							}
						}

					} else {
						$id_responsavel = $TipoChamado->getIdResponsavel($data['id_tipo_chamado']);
					}

	    	    } else {
					/*
					 * Se não tem processo aberto, não permite criar chamado
					 */
					$this->setMessage("Essa proposta não possui um Processo de Sinistro aberto. A importação não foi realizada. Proposta: ".$data['id_proposta']);
					if (!$nested) {
	    	        	$this->getAdapter()->rollBack();
					}
	    	        return false;
				}

	    	} else {
				$id_responsavel = $TipoChamado->getIdResponsavel($data['id_tipo_chamado']);
			}

            /**
             * Quando trata-se de um chamado novo de um usuário Agro, é possível selecionar o responsável
             */
			if (!empty($data['id_responsavel'])) {
                $id_responsavel = $data['id_responsavel'];
            }

			$objetoTipoChamado = $TipoChamado->find($data['id_tipo_chamado'])->current();

			$Chamado->id_tipo_chamado 	= $data['id_tipo_chamado'];
			$Chamado->id_prioridade 	= $data['id_prioridade'];
			$Chamado->id_departamento 	= $data['id_departamento'];
			$Chamado->id_proposta 		= $data['id_proposta'];
			$Chamado->ds_descricao 		= Agro_Util::escaparHtmlComExcecoes($data['ds_descricao']);
			$Chamado->id_parent 		= ($data['id_parent'] ? $data['id_parent'] : null);
			$Chamado->id_status 		= ($data['id_status'] ? $data['id_status'] : $Status->getId('NOVO_CHAMADO', 'CH'));
			$Chamado->id_responsavel 	= $id_responsavel;
			$Chamado->fl_pendencia_agrobrasil = (($User->tp_usuario == 'F' && $User->id_empresa == 20) ? '0' : '1');

			if (empty($Chamado->id) && $objetoTipoChamado->prazo_dias_uteis) {
				$dataChamado = $Chamado->dt_criacao ?? date('Y-m-d');
				$dtFinalPrazo = Agro_Util::somarDataDiasUteis($dataChamado, $objetoTipoChamado->prazo_dias_uteis);
				$Chamado->dt_final_prazo = DateTime::createFromFormat('d/m/Y', $dtFinalPrazo)->format('Y-m-d');
			}

			if (isset($data['dt_agendamento']) && !empty($data['dt_agendamento'])) {
				if (!Agro_Util::isDbDate($data['dt_agendamento'])) {
					$data['dt_agendamento'] = explode('/', $data['dt_agendamento']);
					$data['dt_agendamento'] = implode('-', array_reverse($data['dt_agendamento']));
				}
				$Chamado->dt_agendamento = $data['dt_agendamento'];
			}
			if (isset($data['dt_prazo_agendamento']) && !empty($data['dt_prazo_agendamento'])) {
				if (!Agro_Util::isDbDate($data['dt_prazo_agendamento'])) {
					$data['dt_prazo_agendamento'] = explode('/', $data['dt_prazo_agendamento']);
					$data['dt_prazo_agendamento'] = implode('-', array_reverse($data['dt_prazo_agendamento']));
				}
				$Chamado->dt_prazo_agendamento = $data['dt_prazo_agendamento'];
			}

			if (isset($data['dt_prazo_retorno']) && !empty($data['dt_prazo_retorno'])) {
				if (!Agro_Util::isDbDate($data['dt_prazo_retorno'])) {
					$data['dt_prazo_retorno'] = explode('/', $data['dt_prazo_retorno']);
					$data['dt_prazo_retorno'] = implode('-', array_reverse($data['dt_prazo_retorno']));
				}
				$Chamado->dt_prazo_retorno = $data['dt_prazo_retorno'];
			}

			$empresa = $Empresas->getIdEmpresaUsuarioCorrente();

			//chamados de CORRETORES sempre status ABERTO
			if ($empresa != 20) {
				if ($Chamado->id_parent != null && !$tipoChamadoConfirmarContato && empty($data['finalizadoViaTransmissaoDigitacao'])) {
					$Chamado->id_status = $Status->getId('ABERTO', 'CH');
				}
			}
		
            if (($tipoChamadoConfirmarContato && !empty($data['respostaAutomatica'])) || !empty($data['chamadoAutomaticoCorretor'])) {
                $Chamado->id_usuario_criacao = $id_responsavel;
            }

			if($tipoChamadoConfirmarContato){
				$Chamado->fl_pendencia_agrobrasil = '0';
			}
			$idChamado = $Chamado->save();

			if ($idChamado) {
				//verifica se veio da previa, pois o save do destinatario é diferente
				if($data['analise_previa'] == true){

					if (!$nested) {
						$this->getAdapter()->commit();
					}
					return $idChamado;

				}else{
				
					if ($Chamado->id_parent){
						$Pai = $this->find($Chamado->id_parent)->current();
						$Pai->id_status = $Chamado->id_status;
						if(!$tipoChamadoConfirmarContato){
							$Pai->fl_pendencia_agrobrasil = ($User->tp_usuario == 'F' ? '0' : '1');
						}
						$Pai->save();
						
						//Caso o chamado seja uma resposta para um chamado do tipo confirmar contato vistoriador
						if($Pai->id_status = Atendimento_Model_TipoChamado::SINISTRO_CONFIRMAR_CONTATO_VISTORIADOR && $Pai->id_departamento = 23 && empty($data['respostaAutomatica'])){
					
							//busca chamado de vistoriador
							$ChamadoVistoriador = $this->getChamadoVistoriador($Pai->id, $Pai->id_proposta);

							//Caso usuário que está criando a interação seja Agro ela não deve ser replicada no chamado do vistoriador, apenas para o corretor.
							$isFuncionarioAgro = $modelUser->isFuncionarioAgro($User->id);
							if($ChamadoVistoriador && !$isFuncionarioAgro){
								//Adiciona um novo registro com id_parent = id_chamadovistoriador pra ele conseguir visualizar a resposta a partir do seu chamado.
								$data['id_parent'] 	= $ChamadoVistoriador->toArray()['id'];
								$id_chamado 		= $this->insertChamadoSemDestinatario($data);

								if (!empty($data['telefones']) && is_array($data['telefones'])) {
									$modelChamadosTelefones = new Atendimento_Model_ChamadosTelefones();
				
									foreach ($data['telefones'] as $telefone) {
										
										if (empty($telefone)) {
											continue;
										}
											
										if (!$modelChamadosTelefones->save([
											'id_chamado' => $id_chamado,
											'ds_telefone' => $telefone,
										])) {
									
											throw new Exception('Erro ao salvar o telefone.');
										}
									}
								}
							}
						}

					} else {
						
						$ChamadoDestinatario = new Atendimento_Model_ChamadoDestinatario();
						$modelUsuarios = new Sistema_Model_Usuarios();

						// No caso de ser login agro e não ter escolhido uma opção de destinatário na tela, buscamos qual opção está cadastrada no tipo informado
						if ($modelUsuarios->isFuncionarioAgro($User->id) && empty($data['ds_tipo_destinatario'])) {
							
							$tipo_destinatario = Atendimento_Model_ChamadoDestinatario::DESTINATARIO_CORRETOR;
							$rowTipoChamado = $TipoChamado->getRow($data['id_tipo_chamado']);
							
							if ($rowTipoChamado['fl_destinatario_empresa_vistoria']) {
								$tipo_destinatario = Atendimento_Model_ChamadoDestinatario::DESTINATARIO_EMPRESA_VISTORIA;
							}
							
							if ($rowTipoChamado['fl_destinatario_seguradora']) {
								$tipo_destinatario = Atendimento_Model_ChamadoDestinatario::DESTINATARIO_SEGURADORA;
							}
						} elseif ($tipoChamadoConfirmarContato) {
                            $tipo_destinatario = $data['ds_tipo_destinatario'];
                        } else {
							$tipo_destinatario = $ChamadoDestinatario->getDestinatarioLogado($data);
						}

						if ($tipo_destinatario == Atendimento_Model_ChamadoDestinatario::DESTINATARIO_EMPRESA_VISTORIA &&
						    $data['id_departamento'] == Sistema_Model_Departamentos::AGRO_SINISTRO
						){
							//relaciona com a empresa do processo
							$ModelProcessoEmpresa = new Sinistro2_Model_ProcessosEmpresas();
							$idEmpresa = !empty($data['id_empresa']) ? $data['id_empresa'] : $ModelProcessoEmpresa->getEmpresaByProcesso($id_processo);

							$destinatario = array('id_chamado' => $Chamado->id,'ds_tipo_destinatario' => $tipo_destinatario, 'id_empresa' => $idEmpresa);
						} else if ($data['id_departamento'] == Sistema_Model_Departamentos::AGRO_TECNICA &&
							       $tipo_destinatario == Atendimento_Model_ChamadoDestinatario::DESTINATARIO_EMPRESA_VISTORIA
						){
							//relaciona com a empresa de vistoria prévia
							$ModelVistoriaPrevia = new Seguro_Model_VistoriaPreviaEmpresa();
							$idEmpresa = $ModelVistoriaPrevia->getIdEmpresaByProposta($data['id_proposta']);

							if (!$idEmpresa) {
								$idEmpresa = $data['id_empresa'] ? $data['id_empresa'] : null;
							}
							$destinatario = array('id_chamado' => $Chamado->id,'ds_tipo_destinatario' => $tipo_destinatario, 'id_empresa' => $idEmpresa);
						} else {
							$destinatario = array('id_chamado' => $Chamado->id,'ds_tipo_destinatario' => $tipo_destinatario, 'id_empresa' => ($data['id_empresa'] ? $data['id_empresa'] : null));
						}

						$ChamadoDestinatario->save($destinatario);
					}

					$aux=1;
					if (!isset($data['fl_importacao_automatica']) || !$data['fl_importacao_automatica']) {
						$insertChamadoArquivos = $this->insertChamadoArquivos($Chamado->id);

						if (!$insertChamadoArquivos && !$nested) {
							if (!$nested) {
								$this->getAdapter()->rollBack();
							}
							$this->setMessage("Erro ao salvar o arquivo");
							return false;
						}
					}
				}

				if (empty($data['id']) && empty($data['id_parent']) && (int) $data['id_tipo_chamado'] === self::ID_COMUNICADO_VP && Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()) {
				    $statusVistoriaPreviaValidos = [
				      Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_CONCLUIDA_AUMENTO,
				      Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_CONCLUIDA_CANC,
				      Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_CONCLUIDA_RED,
                    ];

				    $rowsPropostas = $Proposta->fetchAll(["id_proposta_mae = {$RowProposta['id_proposta_mae']}"])->toArray();
				    $propostas = [];

				    foreach ($rowsPropostas as $rowProposta) {
                        $propostas[] = $rowProposta['id'];
                    }

				    $rowVistoriaPrevia = (new Seguro_Model_VistoriaPrevia())->fetchRow(['id_proposta in(' . implode(', ', $propostas) . ')', 'id_status_analise in(' . implode(', ', $statusVistoriaPreviaValidos) . ')']);

				    if (!empty($rowVistoriaPrevia)) {
				        $proponente = $RowProposta->proponente();
				        $dadosProposta = $RowProposta->toArray();
                        $dadosProposta['numeroPropostaCompleto'] = $RowProposta->doc();
                        $dadosProposta['ds_nome_proponente'] = $proponente['ds_nome_proponente'];
                        $dadosProposta['descricao_chamado'] = $data['ds_descricao'];

				        $this->enviarEmailCorretor($dadosProposta);
                    }
                }

                if (!empty($data['telefones']) && is_array($data['telefones'])) {
                    $modelChamadosTelefones = new Atendimento_Model_ChamadosTelefones();

                    foreach ($data['telefones'] as $telefone) {
                        if (empty($telefone)) {
                            continue;
                        }
                        
                        if (!$modelChamadosTelefones->save([
                            'id_chamado' => $idChamado,
                            'ds_telefone' => $telefone,
                        ])) {
								
                            throw new Exception('Erro ao salvar o telefone.');
                        }
                    }
                }
			}

			if (!$nested) {
				$this->getAdapter()->commit();
			}

			return $Chamado->id;
		} catch (Zend_Db_Statement_Exception $e) {
			if (!$nested) {
				$this->getAdapter()->rollback();
			}
			
			$this->setMessage('Ocorreu um erro ao tentar importar chamado para a proposta '.$data['id_proposta'].'.');
			return false;
		} catch (Exception $e) {
			if (!$nested) {
				$this->getAdapter()->rollback();
			}
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	public function insertChamado($data) {

		$Status = new Sistema_Model_Status();

		$Chamado = $this->createRow();
		$Chamado->id_tipo_chamado = $data['id_tipo_chamado'];
		$Chamado->id_prioridade = $data['id_prioridade'];
		$Chamado->id_departamento = $data['id_departamento'];
		$Chamado->id_proposta = $data['id_proposta'];
		$Chamado->ds_descricao = $data['ds_descricao'];
		$Chamado->fl_pendencia_agrobrasil = $data['fl_pendencia_agrobrasil'];
		$Chamado->id_parent = ($data['id_parent'] ? $data['id_parent'] : null);
		$Chamado->id_status = ($data['id_status'] ? $data['id_status'] : $Status->getId('NOVO_CHAMADO', 'CH'));
		$Chamado->id_responsavel = ($data['id_responsavel'] ? $data['id_responsavel'] : null);

		$Chamado->save();
		
		$ChamadoDestinatario = new Atendimento_Model_ChamadoDestinatario();
		$tipo_destinatario = "C";

		$ChamadoDestinatario->save(array(
							'id_chamado' => $Chamado->id,
							'ds_tipo_destinatario' => $tipo_destinatario
							));

		$this->insertChamadoArquivos($Chamado->id);
		return $Chamado->id;
	}

	/**
	 * Insere os arquivos vindos do $_FILES para o chamado criado
	 *
	 * @param int $idChamado
	 * @return bool
	 */
	private function insertChamadoArquivos(int $idChamado): bool
	{
		$aux = 1;
		$status = true;
		$modelChamadoArquivos = new Atendimento_Model_Chamadoarquivos();

		foreach($_FILES as $files){

			if ($files['error'] == 0) {
				$newFileName = $idChamado."_".$aux.".".end(explode('.', $files['name']));
				$newFile = PATH_CHAMADOS."/".$newFileName;

				if (copy($files['tmp_name'], $newFile)) {
					
					$modelChamadoArquivos->save(array(
						'id_chamado' => $idChamado,
						'ds_nome_arquivo' => $newFileName,
						'ds_nome_original_arquivo' => $files['name']
					));
				} else {
					$status = false;
					break;
				}
			}
			$aux++;
		}

		return $status;
	}

	private function insertChamadoSemDestinatario($data){
		$Status = new Sistema_Model_Status();

		$Chamado = $this->createRow();
		$Chamado->id_tipo_chamado = $data['id_tipo_chamado'];
		$Chamado->id_prioridade = $data['id_prioridade'];
		$Chamado->id_departamento = $data['id_departamento'];
		$Chamado->id_proposta = $data['id_proposta'];
		$Chamado->ds_descricao = $data['ds_descricao'];
		$Chamado->fl_pendencia_agrobrasil = $data['fl_pendencia_agrobrasil'];
		$Chamado->id_parent = ($data['id_parent'] ? $data['id_parent'] : null);
		$Chamado->id_status = ($data['id_status'] ? $data['id_status'] : $Status->getId('NOVO_CHAMADO', 'CH'));
		$Chamado->id_responsavel = ($data['id_responsavel'] ? $data['id_responsavel'] : null);

		$Chamado->save();
		return $Chamado->id;
	}

	public function getIdChamadoPai($id_chamado){
		$id_chamado_pai = null;

		$Chamado = $this->getRow($id_chamado);

		if ($Chamado->id_parent){
			$id_chamado_pai = $this->getIdChamadoPai($Chamado->id_parent);

		} else {
			$id_chamado_pai = $Chamado->id;
		}

		return $id_chamado_pai;
	}

	public function delete($id, $field=''){
		$id_filho = $this->getIdFilho($id);

		if($id_filho){
			$this->delete($id_filho);
		}

		$ChamadoArquivos = new Atendimento_Model_Chamadoarquivos();

		$Arquivos = $ChamadoArquivos->fetchAll("id_chamado = $id")->toArray();

		try {
			// Deleta Chamados no banco
			$ChamadoArquivos->delete($id, 'id_chamado');

			// Delete o chamado
			parent::delete($id, 'id');

			// Deleta os arquivos
			foreach ($Arquivos as $arquivo){
				$fileName = realpath(APPLICATION_PATH."/upload_files/chamados/".$arquivo['ds_nome_arquivo']);

				if (!file_exists($fileName)){
					continue;
				}

				@unlink($fileName);
			}

			return true;

		} catch (Exception $e) {
			return false;
		}
	}

	public function getIdFilho($id_chamado){
		$Row = $this->fetchRow("id_parent = $id_chamado");

		if ($Row){
			return $Row->id;
		} else {
			return false;
		}
	}

	public function getData($where=false) {

		$User = Zend_Auth::getInstance()->getIdentity();
		$empresas = new Sistema_Model_Empresas();
		$empresa = $empresas->getIdEmpresaUsuarioCorrente();

		$select = $this->select()->setIntegrityCheck(false);

		//view 1 como default
		$viewFlag = 1;

		//percorre todos os campos do where para setar qual a view a ser utilizada
		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					if($field == "to_char(v.dt_ultima_alteracao, 'DD/MM/YYYY')"){
						$viewFlag = 2;
					}
				}
			}
		}

		//seta a view
		switch($viewFlag){
			case '1':
				$view = $this->_view;
				break;
			case '2':
				$view = $this->_view_relatorio;
				break;
		}

		$select->from("{$this->_schema}.{$view} as v");

		if ($User->tp_usuario == 'C'){
			$select->join(array('pc' => 'seguro.propostas_corretores'), 'v.id_proposta = pc.id_proposta', false);
			$select->where("pc.id_usuario = ?", $User->id);
			$select->where("ds_tipo_destinatario = 'C'");

		} elseif ($User->tp_usuario == 'P'){
			$select->join(array('pr' => 'seguro.propostas'), 'v.id_proposta = pr.id', false);
			$select->where("pr.id_usuario_criacao = ?", $User->id);
			$select->where("ds_tipo_destinatario = 'C'");
		//NOBRE
		} elseif ($User->tp_usuario == 'F' && ($empresa == 6)){
			$select->where("ds_tipo_destinatario = 'S'");

		} elseif ($User->tp_usuario == 'V' || $User->tp_usuario == 'M'){
			$select->where("ds_tipo_destinatario = 'V'");
			$select->where("v.id_empresa = $empresa");
		}

		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];
					if($field == 'id_proposta'){
						$select->where("v.$field $operator ?", $value);
					} else if($field == 'v.id_status'){
						$select->where("$field IN ($value)");
					} else if($field == 'departamento'){
						$select->where("v.id_departamento IN ($value)");
					} else {
					    if (in_array($operator, ['in', 'not in'])) {
                            $select->where("$field $operator $value");
                        } else {
						    $select->where("$field $operator ?", $value);
                        }
					}
				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

		return $select;
	}

	public function getDataPrevia($where=false, bool $validarUsuarioLogado = true)
    {
        $user = Zend_Auth::getInstance()->getIdentity();
        $empresas = new Sistema_Model_Empresas();
        $empresa = $empresas->getIdEmpresaUsuarioCorrente();
        $select = $this->select()->setIntegrityCheck(false);

        $sql = "(SELECT id_endosso from seguro.propostas where id = " . $where[0]['value'] . " )";

        $select->where('v.id_endosso = ' . $sql);
        $select->from("{$this->_schema}.{$this->_view} as v");

        if ($validarUsuarioLogado) {
            if ($user->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_CORRETOR) {
                $select->join(array('pc' => 'seguro.propostas_corretores'), 'v.id_proposta = pc.id_proposta', false);
                $select->where("pc.id_usuario = ?", $user->id);
                $select->where("ds_tipo_destinatario = 'C'");
            } elseif ($user->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_PREPOSTO) {
                $select->join(array('pr' => 'seguro.propostas'), 'v.id_proposta = pr.id', false);
                $select->where("pr.id_usuario_criacao = ?", $user->id);
                $select->where("ds_tipo_destinatario = 'C'");
                //NOBRE
            } elseif ($user->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_FUNCIONARIO && ($empresa == 6)) {
                $select->where("ds_tipo_destinatario = 'S'");
            } elseif (
                in_array(
                    $user->tp_usuario,
                    [Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR, Sistema_Model_Usuarios::TIPO_USUARIO_MANAGER]
                )
            ) {
                $select->where("ds_tipo_destinatario = 'V'");
                $select->where("id_departamento = ?", 26);
            }
        }

        if ($where[1]['value']) {
            $select->where("id_empresa = ?", $where[1]['value']);
        }

        return $select;
    }

	public function getDataGerais($where=false) {
		$User = Zend_Auth::getInstance()->getIdentity();
		$empresas = new Sistema_Model_Empresas();
		$empresa = $empresas->getIdEmpresaUsuarioCorrente();

		$select = $this->select()->setIntegrityCheck(false);

		$select->from("{$this->_schema}.{$this->_view} as v");

		if ($User->tp_usuario == 'C'){
			$select->join(array('pc' => 'seguro.propostas_corretores'), 'v.id_proposta = pc.id_proposta', false);
			$select->where("pc.id_usuario = ?", $User->id);
			$select->where("ds_tipo_destinatario = 'C'");

		} elseif ($User->tp_usuario == 'P'){
			$select->join(array('pr' => 'seguro.propostas'), 'v.id_proposta = pr.id', false);
			$select->where("pr.id_usuario_criacao = ?", $User->id);
			$select->where("ds_tipo_destinatario = 'C'");
		//NOBRE
		} elseif ($User->tp_usuario == 'F' && ($empresa == 6)){
			$select->where("ds_tipo_destinatario = 'S'");

		} elseif ($User->tp_usuario == 'V' || $User->tp_usuario == 'M'){
			$select->where("ds_tipo_destinatario = 'V'");
		}

		$select->where("id_departamento IN (20,26)");
		$select->where("v.tipo_chamado != 'PENDENCIA_LAUDO_PREVIA'");

		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];
					if($field == 'id_proposta'){
						$select->where("v.$field $operator ?", $value);
					}else if($field == 'v.id_status'){
						$select->where("$field IN (?)", $value);
					}else{
						$select->where("$field $operator ?", $value);
					}
				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

		return $select;
	}


	public function getViewData($id){

		// Busca chamado Pai
		$ChamadoPai = $this->select()->distinct(true)->setIntegrityCheck(false);
		$ChamadoPai->from(array('c' => 'atendimento.v_chamados'), array('id_usuario_criacao', 'id_usuario_alteracao', 'fl_ativo', 'fl_del', 'id', 'id_prioridade', 'id_tipo_chamado', 'id_status', 'id_departamento', 'id_proposta', 'ds_descricao', 'id_responsavel', "c.dt_criacao as data_criacao", "to_char(c.prorrogacao_dt_agendamento, 'DD/MM/YYYY') as prorrogacao_dt_agendamento", "to_char(c.prorrogacao_dt_prazo_agendamento, 'DD/MM/YYYY') as prorrogacao_dt_prazo_agendamento", "to_char(c.dt_prazo_retorno, 'DD/MM/YYYY') as dt_prazo_retorno", "to_char(c.dt_final_prazo, 'DD/MM/YYYY') as dt_final_prazo"));
		$ChamadoPai->join(array('tc' => 'atendimento.tipo_chamado'), 'c.id_tipo_chamado = tc.id', array('ds_tipo_chamado as tipo_chamado', 'tc.id as id_tipo_chamado', 'tc.ds_identificacao_tipo_chamado', 'tc.prazo_dias_uteis'));
		$ChamadoPai->join(array('cd' => 'atendimento.chamados_destinatario'), 'c.id = cd.id_chamado', array('cd.ds_tipo_destinatario'));
		$ChamadoPai->join(array('p' => 'atendimento.prioridade'), 'c.id_prioridade = p.id', array('ds_descricao as prioridade'));
		$ChamadoPai->join(array('s' => 'sistema.status'), 'c.id_status = s.id', array('ds_status'));
		$ChamadoPai->join(array('d' => 'sistema.departamentos'), 'c.id_departamento = d.id', array('ds_nome_departamento'));
		$ChamadoPai->join(array('u' => 'sistema.usuarios'), 'c.id_usuario_criacao = u.id', array('ds_nome_usuario'));
		$ChamadoPai->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = c.id_proposta', array('pp.ds_nome_proponente', 'ds_tel_residencia', 'ds_tel_propriedade', 'ds_tel_celular'));
		$ChamadoPai->join(array('pr' => 'seguro.propostas'), 'pr.id = c.id_proposta', array('pr.nr_apolice','pr.id_proposta_mae'));
		$ChamadoPai->join(array('st' => 'sistema.status'), 'pr.id_status = st.id', array('st.cd_status as cd_status_proposta', 'st.ds_status as ds_status_proposta'));
		$ChamadoPai->joinLeft(array('pro' => 'sinistro.processos'), 'c.id_proposta = pro.id_proposta', 'pro.id_processo_seguradora');
		$ChamadoPai->joinLeft(array('e' => 'sistema.empresas'), 'e.id = cd.id_empresa', 'ds_nome_fantasia');
		$ChamadoPai->where("c.id = $id");
		$Row = $this->fetchRow($ChamadoPai);
		
		if ($Row) {
			$Row = $Row->toArray();

			$ChamadoArquivo = new Atendimento_Model_Chamadoarquivos();
			// Busca arquivos
			$Row['arquivos'] = $ChamadoArquivo->getArquivosChamados($Row['id']);

			// Busca filhos (Respostas)
			$Row['respostas'] = $this->getFilhos($id);

            $Row['proposta']['pessoasAutorizadas'] = (new Seguro_Model_Propostas())->get($Row['id_proposta'])->pessoa_autorizada();
            $Row['proposta']['telefonesPessoasContatoAviso'] = (new Sinistro2_Model_AvisosPessoasContato())->getPessoasContatoByProposta($Row['id_proposta']);
		}

		return $Row;
	}

	public function getChamadoVistoriador($idChamadoCorrretor, $id_proposta){
		$idChamadoVistoriador = $idChamadoCorrretor - 2;
		$ChamadoPai = $this->select()->distinct(true)->setIntegrityCheck(false);
		$ChamadoPai->from(array('c' => 'atendimento.chamados'), array('id'));
		$ChamadoPai->where("c.id_tipo_chamado = ".Atendimento_Model_TipoChamado::SINISTRO_CONFIRMAR_CONTATO_VISTORIADOR);
		$ChamadoPai->where("c.id_status = ".self::ID_STATUS_ABERTO);
		$ChamadoPai->where("c.id_departamento = 23");
		$ChamadoPai->where("c.id_proposta = $id_proposta");
		$ChamadoPai->where("c.id = $idChamadoVistoriador");
		$Row = $this->fetchRow($ChamadoPai);
		return $Row;
	}


	public function getFilhos($id_chamado){

		$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Chamado->from(array('c' => 'atendimento.chamados'), array('id', 'id_responsavel', 'c.ds_descricao', "c.dt_criacao as data_criacao", "id_usuario_criacao"));
		$Chamado->join(array('s' => 'sistema.status'), 'c.id_status = s.id', array('ds_status'));
		$Chamado->join(array('u' => 'sistema.usuarios'), 'c.id_usuario_criacao = u.id', array('ds_nome_usuario'));
		$Chamado->where("c.id_parent = $id_chamado");
		$Chamado->order(array('c.id', 'c.dt_criacao desc'));

		$Rs = $this->fetchAll($Chamado);

		if ($Rs){
			$chamado = $Rs->toArray();
			$ChamadoArquivo = new Atendimento_Model_Chamadoarquivos();
            $modelChamadosTelefones = new Atendimento_Model_ChamadosTelefones();
			$Filhos = array();

			foreach($chamado as $filho){
				$filho['arquivos'] = $ChamadoArquivo->getArquivosChamados($filho['id']);
				$filho['telefones'] = $modelChamadosTelefones->fetchAll(["id_chamado = {$filho['id']}"])->toArray();
				$Filhos[] = $filho;
			}
			return $Filhos;
		} else {
			return false;
		}
	}

	public function marcaComoNaoLido($id_chamado){
		$Filhos = $this->getFilhos($id_chamado);
		if(count($Filhos) > 0){
			for($x=0;$x<=count($Filhos);$x++){
				$filho[$x] = $Filhos[$x]['id'];
				if ($filho[$x] > $filhoMaior){
					$filhoMaior = $filho[$x];
				}
			}
		}else{
			$filhoMaior = $id_chamado;
		}
		$this->_db->query("UPDATE atendimento.chamados SET fl_lido = false
						   WHERE id = $filhoMaior");
	}

	public function getChamadoPai($id_filho){
		$Pai = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Pai->from(array('c' => 'atendimento.chamados'), 'id');
		$Pai->where("c.id_parent is not null");
		$Pai->where("to_char(c.dt_criacao, 'dd/MM/yyyy') = ?",$data);
		$Rs = $this->fetchAll($Filhos);
	}


	public function getFilhosNaoLidos($id_chamado){
		$User = Zend_Auth::getInstance()->getIdentity();
		$Filhos = $this->getFilhos($id_chamado);

		if(count($Filhos) > 0){
			foreach($Filhos as $filho){
				$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
				$Chamado->from(array('c' => 'atendimento.chamados'));
				$Chamado->where("c.id = ?", $filho['id']);
				$Chamado->where("c.fl_lido = ?", 'false');
				if($Rs = $this->fetchRow($Chamado)){
					if($User->id != $Rs->id_usuario_criacao){
						//só retorna quando o filho não foi lido
						return true;
					}
				}
			}
		}else{
			//testa se o pai foi lido
			$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
			$Chamado->from(array('c' => 'atendimento.chamados'));
			$Chamado->where("c.id_parent is null");
			$Chamado->where("c.id = ?",$id_chamado);
			$Chamado->where("c.fl_lido = ?", 'false');

			if($Rs = $this->fetchRow($Chamado)){
				if($User->id != $Rs->id_usuario_criacao){
					//retorna quando o pai não foi lido ainda
					return true;
				}
			}
		}
	}

	public function leTodosChamados($id_chamado){
		$User = Zend_Auth::getInstance()->getIdentity();
		$Filhos = $this->getFilhos($id_chamado);

		if(count($Filhos) > 0){
			foreach ($Filhos as $filho){
				$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
				$Chamado->from(array('c' => 'atendimento.chamados'),'id_usuario_criacao');
				$Chamado->where("c.id = ?", $filho['id']);
				if($Rs = $this->fetchRow($Chamado)){
					if($User->id != $Rs->id_usuario_criacao){
						$this->_db->query("UPDATE atendimento.chamados SET fl_lido = true
									   WHERE id =".$filho['id']);
					}
				}
			}
		}else{
			$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
			$Chamado->from(array('c' => 'atendimento.chamados'));
			$Chamado->where("c.id_parent is null");
			$Chamado->where("c.id = ?",$id_chamado);
			$Chamado->where("c.fl_lido = ?", 'false');
			if($Rs = $this->fetchRow($Chamado)){
				if($User->id != $Rs->id_usuario_criacao){
					$this->_db->query("UPDATE atendimento.chamados SET fl_lido = true
								   WHERE id = ".$id_chamado);
				}
			}
		}
	}

	public function fechaUltimosChamados($id_proposta){
		$Pai = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Pai->from(array('c' => 'atendimento.chamados'),'id');
		$Pai->where("c.id_proposta = ?", $id_proposta);
		$Pai->where("c.id_parent is null");
		if ($Rs = $this->fetchAll($Pai)){
			$Pais = $Rs->toArray();
			foreach($Pais as $pai){
				$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
				$Chamado->from(array('c' => 'atendimento.chamados'),array('c.id','c.dt_criacao'));
				$Chamado->where("c.id_proposta = ?",$id_proposta);
				$Chamado->order(array('c.dt_criacao DESC'));
				$chamado = $this->fetchRow($Chamado);
				//fecha o último filho
				$this->_db->query("UPDATE atendimento.chamados SET id_status = 74 WHERE id = ".$chamado['id']);

				//fecha o pai
				$this->_db->query("UPDATE atendimento.chamados SET id_status = 74 WHERE id = ".$pai['id']);
			}
		}
	}
    /**
     * Method make load called without paginator
     * task number :  04049 / 2008281318
     */
	public function proposeCalled($id_proposta)
    {

        $activeQuery = $this->select()->setIntegrityCheck(false);
		$activeQuery->from(array('c' => 'atendimento.chamados'))
			->join(array('pr'=>'atendimento.prioridade'), 'pr.id = c.id_prioridade', array('ds_descricao'))
			->join(array('cd'=>'atendimento.chamados_destinatario'), ' cd.id_chamado = c.id', array('ds_tipo_destinatario'))
			->join(array('s'=>'sistema.status'), 'c.id_status = s.id', array('ds_status'))
			->join(array('p'=>'seguro.propostas'), 'p.id = c.id_proposta', array('id_proposta_mae'))
			->join(array('dep'=>'sistema.departamentos'), 'dep.id = c.id_departamento', array('ds_nome_departamento'))
			->join(array('u'=>'sistema.usuarios'), 'u.id = c.id_usuario_criacao', array('ds_nome_usuario'))
			->join(array('tc' => 'atendimento.tipo_chamado'), 'tc.id = c.id_tipo_chamado', array('ds_tipo_chamado'))
			->joinLeft(array('e' => 'sistema.empresas'), 'e.id = cd.id_empresa', 'ds_nome_fantasia')
			->where("p.id_proposta_mae = $id_proposta");

		if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()) {
		    $activeQuery->where("c.id_departamento = ?", Sistema_Model_Departamentos::AGRO_SINISTRO);
            $usuarioLogado = Zend_Auth::getInstance()->getIdentity();

            if (in_array((int) $usuarioLogado->id_role, [Sistema_Model_Roles::ID_VISTORIADOR, Sistema_Model_Roles::ID_VISTORIADOR_RESP])) {
				$whereLegado = "(tc.fl_destinatario_corretor is false AND tc.fl_destinatario_seguradora is false AND tc.fl_destinatario_empresa_vistoria is false)";
                $activeQuery->where("(tc.fl_destinatario_empresa_vistoria is true OR {$whereLegado})");
				$activeQuery->where("ds_tipo_destinatario = 'V'");
            }

			$activeQuery->where("cd.id_empresa = {$usuarioLogado->id_empresa}");
        }

        $activeQuery->order(array('c.id', 'c.dt_criacao desc'));

        $response = $this->fetchAll($activeQuery);
		
        $rowCount = count($response);
        $rowCount > 0 ? $response : $response = false;

        return $response;
    }

	public function verificaChamadoAberto($id_proposta, $destinatario){
		$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Chamado->from(array('c' => 'atendimento.chamados'),array('c.id','c.dt_criacao'));
		$Chamado->join(array('cd' => 'atendimento.chamados_destinatario'), 'cd.id_chamado = c.id', array('ds_tipo_destinatario'));
		$Chamado->where("c.id_proposta = ?",$id_proposta);
		$Chamado->where("c.id_status NOT IN(35,74)");
		$Chamado->where("c.id_parent is null");
		$Chamado->where("cd.ds_tipo_destinatario = ?", $destinatario);
		$chamadoAberto = $this->fetchRow($Chamado);

		if($chamadoAberto){
			return true;
		}else{
			return false;
		}
	}

	public function verificaChamadoNovoOuAberto($id_proposta){

		$endosso = $this->getDefaultAdapter()->fetchOne('select id_endosso from seguro.propostas_endosso where id_proposta = '.$id_proposta);

		$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Chamado->from(array('c' => 'atendimento.chamados'),array('c.id','c.dt_criacao'));

		if($endosso){
			$Chamado->join(array('pe' => 'seguro.propostas_endosso'), 'pe.id_proposta = c.id_proposta', false);
			$Chamado->where("pe.id_endosso = ?", $endosso);
		}

		$Chamado->join(array('ad' => 'atendimento.chamados_destinatario'), 'ad.id_chamado = c.id', false);

		$Chamado->where("c.id_status IN(58,73)");
		$Chamado->where("c.id_parent is null");
		$Chamado->where("ad.ds_tipo_destinatario = 'C'");

		$chamadoAberto = $this->fetchRow($Chamado);

		if($chamadoAberto){
			return true;
		}else{
			return false;
		}
	}

	public function verificaStatusProposta($id_proposta){
		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('c' => 'atendimento.chamados'), false);
		$Select->join(array('p' => 'seguro.propostas'), 'c.id_proposta = p.id', false);
		$Select->join(array('s' => 'sistema.status'), 'p.id_status = s.id', array('ds_chave'));
		$Select->where("c.id_proposta = ?", $id_proposta);

		return $this->_db->fetchOne($Select);

	}

	public function atualizaTipoDepto($id_chamado,$id_departamento,$id_tipo_chamado){
            $data = array();
            try {
                $Select = $this->select()->setIntegrityCheck(false);
                $Select->from(array('c' => 'atendimento.chamados'), '*');
                $Select->orWhere('id = ?', $id_chamado);
                $Select->orWhere('id_parent = ?', $id_chamado);
                $Row = $this->fetchRow($Select);
				
            	$this->_db->query("UPDATE atendimento.chamados SET id_departamento = ". $id_departamento.",
            		               id_tipo_chamado = ".$id_tipo_chamado."
            		               WHERE (id = ".$id_chamado.") OR (id_parent = ".$id_chamado.")");

                $Row->id_departamento = $id_departamento;
                $Row->id_tipo_chamado = $id_tipo_chamado;

                $Log = new Atendimento_Model_ChamadoLog();
                $data['id_chamado'] = $id_chamado;
                $data['id_departamento'] = $id_departamento;
                $data['id_tipo_chamado'] = $id_tipo_chamado;
                $data['id_responsavel'] = $Row->id_responsavel;
                $data['ds_descricao'] = 'Alteração de departamento/tipo de chamado.';
				$data['dt_final_prazo'] = $Row->dt_final_prazo;

                return $Log->save($data);

            } catch (Exception $e) {
                $this->setMessage($this->getMessages());
                return false;
            }
	}

	public function atualizaResponsavel($id_chamado,$id_responsavel){
            $data = array();
            try {

            	$this->_db->query("UPDATE atendimento.chamados SET id_responsavel = ".$id_responsavel."
            					   WHERE (id = ".$id_chamado.") OR (id_parent = ".$id_chamado.") ");

                $Select = $this->select()->setIntegrityCheck(false);
                $Select->from(array('c' => 'atendimento.chamados'), '*');
                $Select->orWhere('id = ?', $id_chamado);
                $Select->orWhere('id_parent = ?', $id_chamado);
                $Row = $this->fetchRow($Select);

                $Log = new Atendimento_Model_ChamadoLog();
                $data['id_chamado'] = $id_chamado;
                $data['id_departamento'] = $Row->id_departamento;
                $data['id_tipo_chamado'] = $Row->id_tipo_chamado;
                $data['id_responsavel'] = $id_responsavel;
				$data['dt_final_prazo'] = $Row->dt_final_prazo;
                $data['ds_descricao'] = 'Alteração de responsável.';
                return $Log->save($data);

            } catch (Exception $e) {
                $this->setMessage($this->getMessages());
                return false;
            }
	}

	public function salvaProrrogacaoData($params)
	{
		$erro = false;
		if (!isset($params['id_proposta']) || empty($params['id_proposta'])) {
			$erro = true;
			$result = "Proposta inválida!";
		}

		if ((isset($params['dt_agendamento']) && !empty($params['dt_agendamento'])) ||
			(isset($params['dt_prazo_agendamento']) && !empty($params['dt_prazo_agendamento'])) && !$erro) {
			$modelVP = new Seguro_Model_VistoriaPrevia();
			//busca as datas para comparação
			$agendamentoVistoria = $modelVP->getAgendamentoVistoriaPreviaByProposta($params['id_proposta']);

			//salva a data de agendamento
			if ($params['dt_agendamento']) {
				$dtAgendamentoNovo = DateTime::createFromFormat('d/m/Y', $params['dt_agendamento']);
				$dtAgendamentoAtual = DateTime::createFromFormat('d/m/Y', $agendamentoVistoria['dt_agendamento']);
				$diff = $dtAgendamentoAtual ? $dtAgendamentoNovo->getTimestamp() - $dtAgendamentoAtual->getTimestamp() : 1;  //caso não tenha data atual, salva a nova
				if ($diff >= 0) {
					$modelAgendamento = new Sistema_Model_Agendamentos();
					$data = array(
						'id' => $agendamentoVistoria['id_agendamento'],
						'dt_agendamento' => $params['dt_agendamento']
					);
					$modelAgendamento->save($data);

					$result = 'Data Agendamento salva com sucesso!';
				} else {
					$erro = true;
					$result = 'Data Agendamento não pode ser menor que a atual!';
				}
			}

			//salva a data prazo de agendamento
			if ($params['dt_prazo_agendamento']) {
				$dtPrazoAgendamentoNovo = DateTime::createFromFormat('d/m/Y', $params['dt_prazo_agendamento']);
				$dtPrazoAgendamentoAtual = DateTime::createFromFormat('d/m/Y', $agendamentoVistoria['dt_prazo_agendamento']);
				$diff = $dtPrazoAgendamentoAtual ? $dtPrazoAgendamentoNovo->getTimestamp() - $dtPrazoAgendamentoAtual->getTimestamp() : 1; //caso não tenha data atual, salva a nova

				if ($diff >= 0) {
					$modelVPE = new Seguro_Model_VistoriaPreviaEmpresa();
					$rowVP = $modelVPE->getRow($agendamentoVistoria['id_vistoria_previa']);
					$rowVP->dt_prazo_agendamento = Agro_Util::formatDate($params['dt_prazo_agendamento'], Zend_Date::W3C);
					$rowVP->save();

					$result = 'Data Prazo de Agendamento salva com sucesso!';
				} else {
					$erro = true;
					$result = 'Data Prazo de Agendamento não pode ser menor que a atual!';
				}
			}
		} else {
			$result = "Informe uma data válida!";
		}

		return array('result' => $result, 'error' => $erro);
	}

	private function enviarEmailCorretor(array $dadosProposta)
    {
        $corretor = (new Sistema_Model_Corretores())->fetchRow(["id_usuario = {$dadosProposta['id_usuario_criacao']}"]);

        if (empty($corretor)) {
            $corretor = (new Sistema_Model_Prepostos())->getCorretorByUsuario($dadosProposta['id_usuario_criacao']);
        }

        $email = new Agro_Mail();

        $body = "Prezado Corretor,<br><br>";
        $body .= "Informamos que foi aberto chamado do tipo Comunicado de Alteração – por Vistoria Prévia para a ";
        $body .= "proposta {$dadosProposta['numeroPropostaCompleto']} / {$dadosProposta['ds_nome_proponente']}";
        $body .= " comunicando alterações, conforme constatadas em Vistoria a campo:<br><br>";
        $body .= "Motivo: <i>{$dadosProposta['descricao_chamado']}</i><br><br>";
        $body .= "<b>Alertamos que este comunicado deverá ser informado de imediato, para evitar qualquer prejuízo ao Segurado.</b><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, 1);
        $body .= "<img src=\"cid:{$anexo->id}\" height=\"102\" width=\"480\" />";

        $body .= Agro_Mail::textoPadraoEmailHtml();

        $email->clearFrom();
        $email->setFrom('vp@agrobrasilseguros.com.br', 'AgroBrasil - Agronet 2.0');
        $email->addTo($corretor['ds_email']);
        $email->addBcc('karina.silva@agrobrasilseguros.com.br');
        $email->addBcc('flavia.dupont@agrobrasilseguros.com.br');
        $email->addBcc('raphael.funchal@agrobrasilseguros.com.br');
        $email->setSubject("Alerta de Chamado - Comunicado de Alteração por VP: Proposta {$dadosProposta['numeroPropostaCompleto']} / {$dadosProposta['ds_nome_proponente']}");
        $email->setBody($body, 'html');
        $email->send();
    }

    public function getChamadosPendencias(
        array $idsStatusChamado = null
        , int $idSafra = null
        , bool $prazoExpirado = false
    ) : array
    {
        $innerPropostasPendenciasChamado = [
          'propostas_pendencias.id_usuario_criacao = chamados.id_usuario_criacao',
          "to_char(propostas_pendencias.dt_criacao, 'YYYY-MM-DD') = to_char(chamados.dt_criacao, 'YYYY-MM-DD')",
          "to_char(propostas_pendencias.dt_criacao, 'HH24:MI') = to_char(chamados.dt_criacao, 'HH24:MI')",
        ];

        $campos = [
            'propostas.id as id_proposta',
            'chamados.id as id_chamado',
            'status.id as id_status_chamado',
            'status.ds_status as ds_status_chamado',
            'propostas_pendencias.id_pendencia',
            'propostas.id_usuario_criacao as id_usuario_criacao_proposta',
            "to_char(propostas_pendencias.dt_prazo, 'DD/MM/YYYY') as dt_prazo",
            'pendencias.ds_nome_pendencia',
            'produto.ds_nome_produto',
            'case when corretor.id_usuario is not null then corretor.id_usuario else corretor_preposto.id_usuario end as id_usuario_corretor',
            'propostas.id_status as id_status_proposta',
        ];

        $select = $this->select()->distinct()->setIntegrityCheck(false);
        $select->from(['chamados' => "{$this->_schema}.{$this->_name}"], $campos);
        $select->join(['status' => 'sistema.status'], 'status.id = chamados.id_status', false);
        $select->join(['propostas_pendencias' => 'seguro.propostas_pendencias'], implode(' AND ', $innerPropostasPendenciasChamado), false);
        $select->join(['pendencias' => 'atendimento.pendencias'], 'pendencias.id = propostas_pendencias.id_pendencia', false);
        $select->join(['propostas_status' => 'seguro.propostas_status'], 'propostas_status.id = propostas_pendencias.id_proposta_status AND propostas_status.id_proposta = chamados.id_proposta', false);
        $select->join(['propostas' => 'seguro.propostas'], 'propostas.id = propostas_status.id_proposta', false);
        $select->join(['produto' => 'produto.produtos'], 'produto.id = propostas.id_produto', false);
        $select->join(['funcionarios' => 'sistema.funcionarios'], 'funcionarios.id_usuario = chamados.id_usuario_criacao AND funcionarios.id_empresa = ' . Sistema_Model_Empresas::AGROBRASIL, false);
        $select->joinLeft(['corretor' => 'sistema.corretores'], 'corretor.id_usuario = propostas.id_usuario_criacao', false);
        $select->joinLeft(['preposto' => 'sistema.prepostos'], 'preposto.id_usuario = propostas.id_usuario_criacao', false);
        $select->joinLeft(['corretor_preposto' => 'sistema.corretores'], 'corretor_preposto.id = preposto.id_corretor', false);
        $select->where('chamados.id_tipo_chamado = ?', Atendimento_Model_TipoChamado::ATENDIMENTO_PENDENCIA);
        $select->where('pendencias.id_tipo_pendencia = ?', Atendimento_Model_TipoPendencia::ID_PENDENCIA_CONFERENCIA);

        if (!empty($idsStatusChamado)) {
            $select->where('chamados.id_status in(' . implode(', ', $idsStatusChamado) . ')');
        }

        if (!empty($idSafra)) {
            $select->where('produto.id_safra = ?', $idSafra);
        }

        if ($prazoExpirado) {
            $select->where('propostas_pendencias.dt_prazo < now()');
        }

        $select->order('propostas.id desc, chamados.id desc');

        return $this->fetchAll($select)->toArray();
    }

    public function getUltimaRespostaChamadoByIdParent(int $idParent, bool $naoResolvido = false)
    {
        $campos = [
            'MAX(ac.id) as ultima_resposta',
            'sf.id as id_funcionario',
        ];

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['ac' => "{$this->_schema}.{$this->_name}"], $campos);
        $select->joinLeft(['sf' => 'sistema.funcionarios'], 'sf.id_usuario = ac.id_usuario_criacao AND sf.id_empresa = ' . Sistema_Model_Empresas::AGROBRASIL, false);
        $select->where('ac.id_parent = ?', $idParent);

        if (!$naoResolvido) {
            $select->where('ac.id_status in (' . implode(', ', [self::ID_STATUS_NOVO, self::ID_STATUS_ABERTO]) . ')');
        }

        $select->group('sf.id');

        return $this->fetchRow($select);
    }

    public function getTotalChamadosByTipo(int $tipoChamado) : array
    {
        $select = $this->select()
            ->setIntegrityCheck(false)
            ->from(['ac' => "{$this->_schema}.{$this->_name}"], ['count(id)', 'id_proposta'])
            ->where("id_tipo_chamado = ?", $tipoChamado)
            ->where("id_parent is null")
            ->group('id_proposta');

        $result = $this->fetchAll($select)->toArray();
        $totalChamados = [];

        foreach ($result as $registro) {
            $totalChamados[$registro['id_proposta']] = $registro['count'];
        }

        return $totalChamados;
    }

    public function getUltimoChamadoByIdParent(int $idParent)
    {
        $subQuery = $this->select()
            ->setIntegrityCheck(false)
            ->from(['ac' => "{$this->_schema}.{$this->_name}"], ['max(id) as id'])
            ->where("id_parent = ?", $idParent)
            ->group("id_proposta");

        $select = $this->select()
            ->setIntegrityCheck(false)
            ->from(['ac' => "{$this->_schema}.{$this->_name}"], '*')
            ->join(['sub' => new Zend_Db_Expr("($subQuery)")], 'sub.id = ac.id', false);

        return $this->fetchRow($select);
    }

	/**
	 * Valida se a proposta informada já possui um chamado em aberto para o tipo de chamado informado
	 *
	 * @param int $idProposta
	 * @param int $idTipoChamado
	 * @return bool
	 */
	public function possuiChamadoAberto(int $idProposta, int $idTipoChamado): bool
	{
		$select = $this->select()->setIntegrityCheck(false);
        $select->from(['ch' => "{$this->_schema}.{$this->_name}"], ['id']);
        $select->where("ch.id_parent is null");
		$select->where("ch.id_status <> ?" , Atendimento_Model_Chamado::ID_STATUS_RESOLVIDO);
		$select->where("ch.id_proposta = ?", $idProposta);
		$select->where("ch.id_tipo_chamado = ?", $idTipoChamado);
		$rs = $this->getDefaultAdapter()->fetchOne($select);

		return !empty($rs);
	}

	public function getChamadosAbertos($id_proposta, $destinatario){
		$Chamado = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Chamado->from(array('c' => 'atendimento.chamados'),array('c.id','c.dt_criacao', 'id_tipo_chamado'));
		$Chamado->join(array('cd' => 'atendimento.chamados_destinatario'), 'cd.id_chamado = c.id', array('ds_tipo_destinatario'));
		$Chamado->where("c.id_proposta = ?",$id_proposta);
		$Chamado->where("c.id_status NOT IN(35,74)");
		$Chamado->where("c.id_parent is null");
		$Chamado->where("cd.ds_tipo_destinatario = ?", $destinatario);
		$Chamado->where("c.id_tipo_chamado = ?", 68);
		$Chamado->where("c.id_status IN (?)", [58,73]);
		$chamadoAberto = $this->fetchAll($Chamado);
	
		if(!empty($chamadoAberto->toArray())){
			return true;
		}else{
			return false;
		}
	}
}
