<?php

class Atendimento_Model_Proposta extends Agro_Db_Table_Propostas {
    const ACAO_TODOSSTATUSPROPOSTACOMBO = 'atendimento:proposta:todosstatuspropostacombo';
    
	protected $_rowClass = 'Atendimento_Model_Row_Proposta';
	public $_order = 'dt_vigencia_inicio';

	public function encaminharProposta($dados) {
		$Row = $this->getRow($dados['id_proposta']);

		try {
			$Status = new Sistema_Model_Status();

			if ($Row->id_status == $Status->getId("PROPOSTA_AGUARDANDO_CONFERENCIA_VISTORIA")) {
				$status = 'PROPOSTA_AGUARDANDO_VISTORIA';
				$this->mensagemStatus = "Aguardando Vistoria";
			} else {
				$status = 'AGUARDA_ENVIO_SEGURADORA';
				$this->mensagemStatus = "Aguardando envio Seguradora";
			}

			return $this->changeStatus($dados, $status);
		} catch(Exception $e) {
			return false;
		}
	}

	public function getCoberturaPrincipal($id_proposta) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p' => 'seguro.propostas_coberturas'));
		$select->where('fl_principal = true');
		$select->where(" id_proposta = $id_proposta");
		$Rs = $this->_db->fetchAll($select);
		return $Rs[0];
	}

	public function getCoberturaAdicional($id_proposta) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p' => 'seguro.propostas_coberturas'));
		$select->join(array('c' => 'produto.coberturas'), 'c.id = p.id_cobertura', array('ds_nome_cobertura'));
		$select->join(array('pc' => 'produto.produtos_coberturas'), 'pc.id_cobertura = p.id_cobertura', array('fl_exibir_franquia', 'fl_taxa_relacionada'));
		$select->where('fl_principal = false');
		$select->where(" id_proposta = $id_proposta");
		$Rs = $this->_db->fetchAll($select);
		$ret = array();
		foreach($Rs as $row) {
			$ret[$row['id_cobertura']] = $row;
		}
		return $ret;
	}

	public function getResumoStatus($id_proposta) {
		$sql = "SELECT
				  ps.*, s.ds_status, u.ds_nome_usuario
				FROM
				  seguro.propostas_status AS ps INNER JOIN
				  sistema.status AS s ON  ps.id_status = s.id inner JOIN
				  sistema.usuarios AS u ON  ps.id_usuario_criacao = u.id
				WHERE
				(ps.id_proposta = $id_proposta) ORDER BY ps.id desc";

		$Rs = $this->_db->fetchAll($sql);
		$ret = array();
		$i = 0;
		foreach($Rs as $status) {
			$ret[$i]['dt_criacao'] = $status['dt_criacao'];
			$ret[$i]['ds_status'] = $status['ds_status'];
			$ret[$i]['ds_observacao'] = $status['ds_observacao'];
			$ret[$i]['ds_nome_usuario'] = $status['ds_nome_usuario'];

			$sql = "SELECT
					   p.*, a.ds_nome_pendencia
					FROM
					   seguro.propostas_pendencias AS p INNER JOIN
					   atendimento.pendencias AS a ON  p.id_pendencia = a.id
					WHERE
					   p.id_proposta_status = {$status['id']}";
			$Pendencias = $this->_db->fetchAll($sql);
			$arr = array();
			foreach($Pendencias as $pend) {
				$arr[] = $pend['ds_nome_pendencia'];
			}
			$ret[$i]['pendencias'] = $arr;
			if (($status['id_status'] == 5) || ($status['id_status'] == 13)) {
				$sql = "SELECT tp.ds_tipo_cancelamento,
							   pc.ds_descricao
						FROM seguro.propostas_cancelamento pc
						INNER JOIN atendimento.tipo_cancelamento tp
						ON pc.id_motivo_cancelamento = tp.id
					    WHERE pc.id_proposta = {$id_proposta}";
				$motivos = $this->_db->fetchAll($sql);

				$arr = array();
				foreach($motivos as $motivo) {
					$descricaoCancelamento = $motivo['ds_tipo_cancelamento'];
					
					if (!empty($motivo['ds_descricao'])) {
						$descricaoCancelamento .= ": {$motivo['ds_descricao']}";
					}

					$arr[] = $descricaoCancelamento;
				}
				
				$ret[$i]['motivos'] = $arr;
			}
			$i++;
		}

		return $ret;
	}

	public function getInfoAdicionais($id_proposta) {
		$sql = "SELECT
				  po.id,po.dt_criacao, po.ds_observacao, po.fl_observacao_endosso, po.fl_ocultar_itens_segurados, su.ds_nome_usuario, poa.ds_nome_arquivo, poa.id as id_observacao_arquivo
				FROM
				  seguro.propostas_observacoes AS po INNER JOIN
				  sistema.usuarios AS su ON su.id = po.id_usuario_criacao
				  LEFT JOIN seguro.propostas_observacoes_arquivos AS poa ON po.id = poa.id_observacao
				WHERE
					po.id_proposta = $id_proposta
					AND po.fl_principal = false
				ORDER BY dt_criacao desc";
		$Rs = $this->_db->fetchAll($sql);
		$ret = array();
		$i = 0;
		foreach($Rs as $infoAdicionais) {
			$ret[$i]['id']                    = $infoAdicionais['id'];
			$ret[$i]['dt_criacao']            = $infoAdicionais['dt_criacao'];
			$ret[$i]['ds_observacao']         = $infoAdicionais['ds_observacao'];
			$ret[$i]['ds_nome_usuario']       = $infoAdicionais['ds_nome_usuario'];
			$ret[$i]['ds_nome_arquivo']       = $infoAdicionais['ds_nome_arquivo'];
			$ret[$i]['id_observacao_arquivo'] = $infoAdicionais['id_observacao_arquivo'];
			$ret[$i]['fl_observacao_endosso'] = $infoAdicionais['fl_observacao_endosso'];
			$ret[$i]['fl_ocultar_itens_segurados'] = $infoAdicionais['fl_ocultar_itens_segurados'];
			$i++;
		}
		return $ret;
	}

	public function getObservacoesProposta($id_proposta) {
		$sql = "SELECT
				  po.id, po.dt_criacao, po.ds_observacao, po.fl_observacao_endosso, po.fl_ocultar_itens_segurados, su.ds_nome_usuario, poa.ds_nome_arquivo, poa.id as id_observacao_arquivo
				FROM
				  seguro.propostas_observacoes AS po INNER JOIN
				  sistema.usuarios AS su ON su.id = po.id_usuario_criacao
				  LEFT JOIN seguro.propostas_observacoes_arquivos AS poa ON po.id = poa.id_observacao
				WHERE
					po.id_proposta = $id_proposta
					AND po.fl_principal = false
				ORDER BY dt_criacao desc";

		$Rs = $this->_db->fetchAll($sql);
		$ret = array();
		$i = 0;
		foreach($Rs as $infoAdicionais) {
			$ret[$i]['id']                    = $infoAdicionais['id'];
			$ret[$i]['dt_criacao']            = $infoAdicionais['dt_criacao'];
			$ret[$i]['ds_observacao']         = $infoAdicionais['ds_observacao'];
			$ret[$i]['ds_nome_usuario']       = $infoAdicionais['ds_nome_usuario'];
			$ret[$i]['ds_nome_arquivo']       = $infoAdicionais['ds_nome_arquivo'];
			$ret[$i]['id_observacao_arquivo'] = $infoAdicionais['id_observacao_arquivo'];
			$ret[$i]['fl_observacao_endosso'] = $infoAdicionais['fl_observacao_endosso'];
			$ret[$i]['fl_ocultar_itens_segurados'] = $infoAdicionais['fl_ocultar_itens_segurados'];

			$i++;
		}
		return $ret;
	}

	public function getDadosXls() {
		$select = $this->select();
		$select->setIntegrityCheck(false);

		$select->from(array('p' => "seguro.v_propostas"));
		$select->where("p.id_status = ?", 3);

		$Rs = $this->fetchAll($select);
		if ($Rs->count()) {
			return $Rs->toArray();
		} else {
			return array();
		}
	}

	public function changeStatusId($idProposta, $idStatus, $obs = '') {
		try {
			$Row = $this->getRow($idProposta);
			$Row->id_status = $idStatus;
			
			$PropostaStatus = new Seguro_Model_PropostaStatus();

			if ($PropostaStatus->save(array('ds_observacao' => $obs, 'id_proposta' => $idProposta, 'id_status' => $idStatus))) {
				$ModelStatus = new Sistema_Model_Status();

				$chave = $ModelStatus->getChave($idStatus);
				if($chave == 'DEVOLVIDA' || $chave == 'PROPOSTA_CANCELADA'){
					$Chamados = new Atendimento_Model_Chamado();
					$Chamados->fechaUltimosChamados($idProposta);
				}
				
				$Row->save();
				
				return true;
			} else {
				return false;
			}
				
		} catch (Exception $e) {
			die($e);
		}
	}

	public function changeProdutoId($idProposta, $idProduto) {
	    try {
	        $Row = $this->getRow($idProposta);
	        $Row->id_produto = $idProduto;
        
	        if ($Row->save()) {
	            return true;
	        } else {
	            return false;
	        }
	        
	    } catch (Exception $e) {
	        die($e);
	    }
	}
	
	public function desativaBoletos($idProposta){
		try {
			$this->_db->query('UPDATE seguro.proposta_boletos SET fl_ativo = false WHERE id_proposta = '.$idProposta);
		}catch (Exception $e){
			die('Erro ao desativar boletos da proposta!');
		}
	}

	public function getLog($idProposta){
		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('log' => 'log.v_propostas_transmissao'),
			array(
				'log.id',
				'log.ds_tipo_transmissao',
				'log.fl_sucesso',
				'log.ds_retorno',
				'log.versao',
				"to_char(log.dt_criacao,'DD/MM/YYYY HH24:MI:SS') as dt_criacao",
				"CASE WHEN log.dt_envio IS NOT NULL THEN to_char(log.dt_envio, 'DD/MM/YYYY HH24:MI:SS') ELSE to_char(log.dt_criacao, 'DD/MM/YYYY HH24:MI:SS') END as dt_envio",
				"CASE WHEN log.dt_retorno IS NOT NULL THEN to_char(log.dt_retorno, 'DD/MM/YYYY HH24:MI:SS') ELSE to_char(log.dt_criacao,'DD/MM/YYYY HH24:MI:SS') END as dt_retorno",
				'log.ds_nome_usuario'
			)
		);
		$Select->where("log.id_proposta = ?", $idProposta);
		$Select->order('log.id DESC');

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

	public function getXmlTransmissao($id){
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('log' => 'log.v_propostas_transmissao'),'ds_xml_transmissao');
		$Select->where("log.id = ?", $id);

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


	public function getBoleto($idProposta, $idVersao=""){
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('b' => 'seguro.v_propostas_boletos'),array('*'));
		$Select->where("b.id_proposta = ?", $idProposta);

		if($idVersao > 0){
			$Select->where("b.id_versao = ?", $idVersao);
		}

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

    public function subvencaoConcedida($idProposta, $completa = false)
    {
        $sql = "SELECT ss.ds_status, ss.ds_chave, spcc.vl_subvencao_federal as vl_subvencao, spcc.dt_concessao
		          FROM seguro.propostas_subvencao sps
		               INNER JOIN sistema.status ss ON ss.id = sps.id_status_subvencao_federal
		               LEFT JOIN seguro.propostas_consulta_cadin spcc ON spcc.id_proposta = sps.id_proposta
				 WHERE sps.id_proposta = {$idProposta}";

        return $this->getSubvencaoConcessao($sql, $completa);
    }

    public function subvencaoEstadualConcedida($idProposta, $completa = false)
    {
        $sql = "SELECT ss.ds_status, ss.ds_chave, pcse.vl_subvencao_estadual as vl_subvencao, pcse.dt_concessao
                  FROM seguro.propostas_subvencao sps
                       INNER JOIN sistema.status ss ON ss.id = sps.id_status_subvencao_estadual
					   LEFT JOIN seguro.propostas_consulta_subvencao_estadual pcse ON pcse.id_proposta = sps.id_proposta
                 WHERE sps.id_proposta = {$idProposta}";

        return $this->getSubvencaoConcessao($sql, $completa);
    }

	private function getSubvencaoConcessao($sql, $completa)
	{
		$subvencaoConcedida = $this->getDefaultAdapter()->fetchAll($sql);
		
		$subvencao = new stdClass();
		$subvencao->concessao = '-';
		$subvencao->vl_subvencao = '-';
		$subvencao->dt_concessao = '-';

        $statusValoresVazios = [
            Seguro_Model_PropostasSubvencao::DS_CHAVE_EM_FILA_ENVIO,
            Seguro_Model_PropostasSubvencao::DS_CHAVE_NAO_CONCEDIDA,
            Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO,
        ];

		if (!empty($subvencaoConcedida)) {
            $dadosSubvencao = $subvencaoConcedida[0];
			$modelPropostasSubvencao = new Seguro_Model_PropostasSubvencao();
			$subvencao->concessao = $modelPropostasSubvencao->getDescricaoStatusSubvencao(
				$dadosSubvencao['ds_chave'],
				$dadosSubvencao['ds_status']
			);

            if (!in_array($dadosSubvencao['ds_chave'], $statusValoresVazios)) {
                $subvencao->vl_subvencao = !empty($dadosSubvencao['vl_subvencao'])
                    ? number_format($dadosSubvencao['vl_subvencao'], 2, ',', '.')
                    : '-';
                $subvencao->dt_concessao = !empty($dadosSubvencao['dt_concessao'])
                    ? Agro_Util::formatDate($dadosSubvencao['dt_concessao'])
                    : '-';
            }
		}
		
		if ($completa) {
			return $subvencao;
		}

		return $subvencao->concessao;
	}
}
