<?php

class Endosso_Model_Propostas extends Agro_Db_Table_Propostas {
	protected $_rowClass = 'Endosso_Model_Row_Proposta';
	protected $_name = 'propostas';
	protected $_schema = 'seguro';
	protected $_primary = 'id';

	public function endossar($idProposta) {
		$Row = $this->find($idProposta)->current();
		$Row->endossar();
		$this->setMessage($Row->getMessage());

		return false;
	}

	public function comboOrgaosExpedidores() {
		$Select = $this->select()->setIntegrityCheck(false)->from('sistema.orgao_expedidor', array('id', 'ds_nome_orgao'))->order('ds_nome_orgao');
		return $this->getDefaultAdapter()->fetchPairs($Select);
	}

	public function comboAtividadeEconomica() {
		$Select = $this->select()->setIntegrityCheck(false)->from('sistema.atividades_economicas', array('id', 'ds_nome_atividade_economica'))->order('ds_nome_atividade_economica');
		return $this->getDefaultAdapter()->fetchPairs($Select);
	}

	public function comboEstadosCivis() {
		$Select = $this->select()->setIntegrityCheck(false)->from('sistema.estado_civil', array('id', 'ds_nome_estado_civil'))->order('ds_nome_estado_civil');
		return $this->getDefaultAdapter()->fetchPairs($Select);
	}

	public function getPropostaVigente($idProposta){
		return $this->getDefaultAdapter()->fetchOne("select id_proposta from seguro.propostas_endosso where fl_proposta_vigente=true and id_endosso in (select id_endosso from seguro.propostas_endosso where id_proposta=$idProposta)");
	}

	public function endossarSinistro($idPropostaOriginal, $idPropostaBackup)
    {
        try {
            // Duplica os avisos
            if (!$this->getDefaultAdapter()->fetchOne("select count(*) from sinistro.avisos where id_proposta = $idPropostaBackup")) {

                $model = new Endosso_Model_Avisos();
                $model->setSalvarUsuarioDataAlteracao(false);
                $rs = $model->fetchAll("id_proposta = $idPropostaOriginal");

                if ($rs->count()) {
                    foreach ($rs as $Row) {
                        $Row->id_proposta = $idPropostaBackup;
                        $Row->save();
                    }

                    // Duplica os processos
                    $model = new Endosso_Model_Processos();
                    $model->setSalvarUsuarioDataAlteracao(false);
                    $processoOriginal = $model->fetchRow("id_proposta = $idPropostaOriginal");
                    if ($processoOriginal) {
                        $processoOriginal->id_proposta = $idPropostaBackup;
                        $processoOriginal->save();
                    }
                }

                // Duplica os avisos de inicio
                $model = new Endosso_Model_AvisosInicios();
                if ($rs = $model->fetchAll("id_proposta = $idPropostaOriginal")) {
                    if ($rs->count()) {
                        foreach ($rs as $Row) {
                            // Seta a proposta endossada
                            $Row->id_proposta = $idPropostaBackup;
                            $Row->save();

                            $modelIS = new Endosso_Model_AvisosInicioItensSegurados();
                            $modelIS->setSalvarUsuarioDataAlteracao(false);
                            $rsIS = $modelIS->fetchAll("id_aviso_inicio = {$Row->id}");
                            if ($rsIS->count()) {
                                foreach ($rsIS as $RowIS) {
                                    $id_item_segurado_endosso = $this->getItemSeguradoEndosso($RowIS->id_item_segurado, $idPropostaBackup);
                                    $RowIS->id_item_segurado = $id_item_segurado_endosso;
                                    $RowIS->save();
                                }
                            }
                        }
                    }
                }

                // Duplica os avisos de encerramento
                $model = new Endosso_Model_AvisosEncerramentos();
                if ($rs = $model->fetchAll("id_proposta = $idPropostaOriginal")) {
                    if ($rs->count()) {
                        foreach ($rs as $Row) {
                            // Seta a proposta endossada
                            $Row->id_proposta = $idPropostaBackup;
                            $Row->save();

                            $modelIS = new Endosso_Model_AvisosEncerramentoItensSegurados();
                            $modelIS->setSalvarUsuarioDataAlteracao(false);
                            $rsIS = $modelIS->fetchAll("id_aviso_encerramento = {$Row->id}");
                            if ($rsIS->count()) {
                                foreach ($rsIS as $RowIS) {
                                    $id_item_segurado_endosso = $this->getItemSeguradoEndosso($RowIS->id_item_segurado, $idPropostaBackup);
                                    $RowIS->id_item_segurado = $id_item_segurado_endosso;
                                    $RowIS->save();
                                }
                            }
                        }
                    }
                }

                /*
                 * Atualiza os itens segurados nas vistorias finais e preliminares
                 */
                if ($processoOriginal->id > 0) {
                    $model = new Endosso_Model_VistoriasProcessos();
                    $rs = $model->fetchAll("id_processo = {$processoOriginal->id}");

                    if ($rs->count()) {
                        foreach ($rs as $Row) {
                            $model = new Endosso_Model_VistoriasItensSegurados();
                            $model->setSalvarUsuarioDataAlteracao(false);
                            $rsVistoriaIS = $model->fetchAll("id_vistoria = {$Row['id_vistoria']}");
                            if ($rsVistoriaIS->count()) {
                                foreach ($rsVistoriaIS as $RowVistoriaIS) {
                                    $id_item_segurado_endosso = $this->getItemSeguradoEndosso($RowVistoriaIS->id_item_segurado, $idPropostaBackup);
                                    $RowVistoriaIS->id_item_segurado = $id_item_segurado_endosso;
                                    $RowVistoriaIS->save();
                                }
                            }
                        }
                    }

                    $model = new Endosso_Model_LaudosFinais();
                    $rs = $model->fetchAll("id_processo = {$processoOriginal->id}");

                    if ($rs->count()) {
                        foreach ($rs as $Row) {
                            $model = new Sinistro2_Model_LaudosFinaisItensSegurados();
                            $model->setSalvarUsuarioDataAlteracao(false);
                            $rsLFIS = $model->fetchAll("id_laudo_final = {$Row['id']}");

                            if ($rsLFIS->count()) {
                                foreach ($rsLFIS as $RowLFIS) {
                                    $id_item_segurado_endosso = $this->getItemSeguradoEndosso($RowLFIS->id_item_segurado, $idPropostaBackup);
                                    $RowLFIS->id_item_segurado = $id_item_segurado_endosso;
                                    $RowLFIS->save();
                                }
                            }
                        }
                    }

                    $model = new Endosso_Model_LaudosPreliminares();
                    $rs = $model->fetchAll("id_processo = {$processoOriginal->id}");

                    if ($rs->count()) {
                        foreach ($rs as $Row) {
                            $model = new Sinistro2_Model_LaudosPreliminaresItensSegurados();
                            $model->setSalvarUsuarioDataAlteracao(false);
                            $rsLPIS = $model->fetchAll("id_laudo_preliminar = {$Row['id']}");

                            if ($rsLPIS->count()) {
                                foreach ($rsLPIS as $RowLPIS) {
                                    $id_item_segurado_endosso = $this->getItemSeguradoEndosso($RowLPIS->id_item_segurado, $idPropostaBackup);
                                    $RowLPIS->id_item_segurado = $id_item_segurado_endosso;
                                    $RowLPIS->save();
                                }
                            }
                        }
                    }
                }

                /*
                 * FIM: Atualiza os itens segurados nas vistorias finais e preliminares
                */

				// Atualiza vínculo entre proposta e despesas para id da proposta vigente
				(new Sinistro2_Model_VistoriadorDespesa())->update(
					[
						'id_usuario_alteracao' => Zend_Auth::getInstance()->getIdentity()->id,
						'dt_alteracao' => 'now()',
						'id_proposta' => $idPropostaBackup
					],
					"id_proposta = {$idPropostaOriginal} AND id_vistoria IS NULL"
				);
				
				// Vincula as prévias com a proposta vigente
				(new Seguro_Model_VistoriaPrevia())->update(
					[
						'id_usuario_alteracao' => Zend_Auth::getInstance()->getIdentity()->id,
						'dt_alteracao' => 'now()',
						'id_proposta' => $idPropostaBackup
					],
					"id_proposta = {$idPropostaOriginal}"
				);
            }

            return true;
        } catch (Exception $e) {
            die($e);
        }
    }

	public function getItemSeguradoEndosso($id_item_segurado, $id_proposta){
		$ModelISBackup   = new Seguro_Model_ItensSegurados();
		$ModelISOriginal = new Seguro_Model_ItensSegurados();

		$ItemAviso              = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow("select * from seguro.itens_segurados where id=$id_item_segurado");
		$ItensSeguradosVigentes = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll("select * from seguro.itens_segurados where id_proposta=$id_proposta");

		foreach ($ItensSeguradosVigentes as $itemVigente){
			if ($itemVigente['nr_item_segurado'] == $ItemAviso['nr_item_segurado']){
				return $itemVigente['id'];
			}
		}
	}

	public function verificaMudancaAreaIsEndosso($idProposta, $idPropostaEndosso){
		$PropostaVigente = $this->find($idProposta)->current();
		$PropostaBackup = $this->find($idPropostaEndosso)->current();
	}

	public function verificaEndossoReducao($idProposta) {

		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('spe' => 'seguro.propostas_endosso'), null);
		$select->join(array('spr' => 'seguro.propostas'), 'spr.id = spe.id_proposta', 'spr.id');
		$select->join(array('sst' => 'sistema.status'), 'sst.id = spr.id_status', null);
		$select->join(array('pv' => 'seguro.propostas_versoes'), 'spr.id_versao = pv.id', null);
		$select->join(array('peo' => 'seguro.propostas_endosso_opcoes'), 'peo.id_proposta = spr.id', null);
		$select->join(array('te' => 'seguro.tipo_endosso'), 'te.id = peo.id_endosso_opcao', null);
		$select->where('te.ds_tipo = ?', 'REDUCAO');
		$select->where('sst.ds_chave = ?', 'APOLICE_EMITIDA');
		$select->where('spr.id_endosso = (select id_endosso from seguro.propostas where id = '.$idProposta.')');

		$Row = $this->fetchAll($select); return $Row->count();
	}
	
	public function buscaSubvencoes($idEndosso) {
		$this->_db->query("SELECT seguro.sumario_parcelas(".$idEndosso.");");

		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('pat' =>" sumario_parcelas"));

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

	public function getUltimoEndossoCobranca($idProposta) {
	
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('spe' => 'seguro.propostas_endosso'), null);
		$select->join(array('spr' => 'seguro.propostas'), 'spr.id = spe.id_proposta', 'spr.id');
		$select->join(array('sst' => 'sistema.status'), 'sst.id = spr.id_status', null);
		$select->join(array('pv' => 'seguro.propostas_versoes'), 'spr.id_versao = pv.id', null);
		$select->join(array('peo' => 'seguro.propostas_endosso_opcoes'), 'peo.id_proposta = spr.id', null);
		$select->join(array('te' => 'seguro.tipo_endosso'), 'te.id = peo.id_endosso_opcao', null);
		$select->where('te.ds_tipo = ?', 'COBRANCA');
		$select->where('sst.ds_chave = ?', 'APOLICE_EMITIDA');
		$select->where('spr.id_endosso = (select id_endosso from seguro.propostas where id = '.$idProposta.')');
		$select->order('spe.id_proposta desc');
		$select->limit(1);
	
		$id_ultimo_endosso_cobranca = $this->getDefaultAdapter()->fetchOne($select);

		if(!$id_ultimo_endosso_cobranca){
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('spe' => 'seguro.propostas_endosso'), null);
			$select->join(array('spr' => 'seguro.propostas'), 'spr.id = spe.id_proposta', 'spr.id');
			$select->join(array('sst' => 'sistema.status'), 'sst.id = spr.id_status', null);
			$select->join(array('pv' => 'seguro.propostas_versoes'), 'spr.id_versao = pv.id', null);
			$select->where('sst.ds_chave = ?', 'APOLICE_EMITIDA');
			$select->where('spr.id_endosso = (select id_endosso from seguro.propostas where id = '.$idProposta.')');
			$select->order('spe.id_proposta asc');
			$select->limit(1);		
			
			$id_ultimo_endosso_cobranca = $this->getDefaultAdapter()->fetchOne($select);
		} 

		return $id_ultimo_endosso_cobranca;
	}

	public function getPropostaMae($idProposta) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->join(array('spr' => 'seguro.propostas'), 'spr.id = spe.id_proposta', 'id_proposta_mae');
		$select->where('spr.id = '.$idProposta);
			
		return $this->getDefaultAdapter()->fetchOne($select);
	}

	/**
	 * Monta o SQL que sera usado na listagem de propostas dos endossos
	 *
	 * @param array $where
	 */
	public function getData(array $where) {
		$this->_db->query("SELECT seguro.sumario_parcelas(0);");
		
		$subselect = $this->select()->setIntegrityCheck(false);
		$subselect->from('seguro.propostas', "id as id_proposta, to_char(dt_transmissao, 'yyyy-mm-dd') as dt_transmissao");

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('spe' => 'seguro.propostas_endosso'), 'spe.fl_proposta_vigente');
		$Select->join(array('spr' => 'seguro.propostas'), 'spr.id = spe.id_proposta', array('id', 'id_endosso'
			, 'id_status'
			, 'spr.dt_vigencia_inicio'
			, 'id_usuario_criacao'
			, 'id_produto'
			, 'ds_status_seguradora'
			, 'nr_digito_verificador'
			, 'nr_apolice'
			, 'ds_identificador_seguradora'
			, 'id_versao'
			, 'seguro.nr_endosso(spr.id, spr.id_endosso) as nr_endosso'
			, 'id_proposta_mae'
			, 'id_proposta_endossada'
			, 'pat.valor_subvencao_federal'
			, "case when pat.valor_subvencao_federal > 0 then to_char(spr.dt_transmissao + interval '45 day','DD/MM/YYYY') else to_char(spr.dt_transmissao + interval '15 day','DD/MM/YYYY') end as dt_aceitacao"
			, 'seguro.id_proposta_mae_completo(spr.id) as id_proposta_mae_completo'));
		$Select->joinLeft(array('sps' => 'seguro.propostas_status'), 'sps.id_status = spr.id_status and sps.id_proposta = spr.id and sps.fl_ativo = true', false);
		$Select->join(array('spt' => 'seguro.propostas_proponentes'), 'spr.id = spt.id_proposta', array('ds_nome_proponente', 'cpf_cnpj'));
		$Select->join(array('spc' => 'seguro.propostas_corretores'), 'spr.id = spc.id_proposta', false);
		$Select->join(array('ppr' => 'produto.produtos'), 'ppr.id = spr.id_produto', array('ds_nome_abreviado', 'ds_nome_produto'));
		$Select->join(array('sf' =>  'produto.safras'), 'sf.id = ppr.id_safra', array('ds_nome_safra'));
		$Select->join(array('spd' => 'seguro.propostas_propriedades'), 'spr.id = spd.id_proposta', array('id_municipio'));
		$Select->join(array('smu' => 'sistema.municipios'), 'smu.id = spd.id_municipio', 'ds_nome_municipio');
		$Select->join(array('suf' => 'sistema.estados'), 'suf.id = smu.id_estado', 'ds_sigla');
		$Select->join(array('scr' => 'sistema.corretores'), 'spc.id_usuario = scr.id_usuario', array('ds_nome_fantasia'));
		$Select->join(array('sst' => 'sistema.status'), 'sst.id = spr.id_status', array('ds_cor', 'ds_chave', 'ds_status', 'cd_status'));
		$Select->join(array('sus' => 'sistema.usuarios'), 'sus.id = spr.id_usuario_criacao', 'ds_nome_usuario');
		$Select->join(array('lpt' => $subselect), 'lpt.id_proposta = spr.id_proposta_mae', 'dt_transmissao');
		$Select->joinLeft(array('spb' => 'seguro.proposta_boletos'), 'spr.id = spb.id_proposta AND spb.nr_parcela=1 and spb.fl_ativo = true and spb.id_versao = spr.id_versao', array('ds_identificador'));
		$Select->joinLeft(array('spv' => 'seguro.propostas_versoes'), 'spr.id_versao = spv.id', array('fl_pendente_transmissao', 'ds_nome_arquivo as digitalizacao'));
		$Select->joinLeft(array('speo' => 'seguro.propostas_endosso_opcoes'), 'speo.id_proposta = spr.id',false);
		$Select->joinLeft(array('ste' => 'seguro.tipo_endosso'), 'speo.id_endosso_opcao = ste.id', array('ds_tipo_endosso','ds_tipo'));
		$Select->joinLeft(array('pat' => 'sumario_parcelas'), 'pat.id_endosso = spr.id_endosso', array('valor_subvencao_federal'));
		$Select->joinLeft(array('pvp' => 'seguro.propostas_vistorias_previas'), 'pvp.id_proposta = spr.id_proposta_mae', array(
			'(select cd_status from seguro.propostas_vistorias_previas pvp2 inner join sistema.status pvps2 on pvp2.id_status = pvps2.id where pvp2.id = MAX(pvp.id)) as cd_status_previa',
			'(select ds_status from seguro.propostas_vistorias_previas pvp2 inner join sistema.status pvps2 on pvp2.id_status = pvps2.id where pvp2.id = MAX(pvp.id)) as ds_status_previa',
		));

		$Select->where('sst.ds_chave <> ?', 'PROPOSTA_INCOMPLETA');
		$Select->where('sst.ds_chave <> ?', 'ENDOSSO_INCOMPLETO');
		$Select->where('sst.ds_chave <> ?', Seguro_Model_Propostas::DS_CHAVE_SOLICITACAO_CANCELADA);
		//$Select->where('sst.ds_chave <> ?', 'ORCAMENTO_ENDOSSO');

		if(Zend_Auth::getInstance()->getIdentity()->ds_chave == 'SEGURADORA_ESSOR'){
			$Select->where('ppr.id_safra >= 16');
		}
		if(Zend_Auth::getInstance()->getIdentity()->ds_chave == 'SEGURADORA'){
			$Select->where('ppr.id_safra < 16');
		}

	    $this->getWhere($Select, $where);

		if ($this->_order) {
			$Select->order($this->_order);
		} else {
			$Select->order('spr.id');
		}

		$Select->group(array(
			  "spe.fl_proposta_vigente"
			, "spr.id"
			, "spr.id_endosso"
			, "spr.id_status"
			, "spr.dt_vigencia_inicio"
			, "spr.id_usuario_criacao"
			, "spr.id_produto"
			, "spr.ds_status_seguradora"
			, "spr.nr_digito_verificador"
			, "spr.nr_apolice"
			, "spr.ds_identificador_seguradora"
			, "spr.id_versao"
			, "spr.id_proposta_mae"
			, "spr.id_proposta_endossada"
			, "pat.valor_subvencao_federal"
			, "spr.dt_transmissao"
			, "spt.ds_nome_proponente"
			, "spt.cpf_cnpj"
			, "ppr.ds_nome_abreviado"
			, "ppr.ds_nome_produto"
			, "sf.ds_nome_safra"
			, "spd.id_municipio"
			, "smu.ds_nome_municipio"
			, "suf.ds_sigla"
			, "scr.ds_nome_fantasia"
			, "sst.ds_cor"
			, "sst.ds_chave"
			, "sst.ds_status"
			, "sst.cd_status"
			, "sus.ds_nome_usuario"
			, "lpt.dt_transmissao"
			, "spb.ds_identificador"
			, "spv.fl_pendente_transmissao"
			, "spv.ds_nome_arquivo"
			, "ste.ds_tipo_endosso"
			, "ste.ds_tipo"
		));

		return $Select;
	}
}
