<?php

class Seguro_Model_PropostasCoberturas extends Agro_Db_Table_Abstract {
	protected $_log = true;
	protected $_schema = 'seguro';
	protected $_name = 'propostas_coberturas';
	protected $_primary = array('id_cobertura', 'id_proposta');

	public function save($cobertura, $id, $Proposta, $flValidaTaxa=false) {
		$Coberturas = new Produto_Model_ProdutosCoberturas();
		$Cobertura = $Coberturas->find($Proposta->id_produto, $id)->current();
		$TaxasValores = new Comercializacao_Model_TaxasValores();
		$arr = explode('#', $cobertura['franquia']);
		
		if (empty($cobertura['valorFranquiaCar'])) {
			$Taxa = $TaxasValores->getRow($arr[1]);
			$valorFranquia = $Taxa->vl_franquia;
		}
		
		/*
		 * Valida se a taxa condiz com o valor da divisão do Prêmio pela LMGA
		 */
		if($flValidaTaxa && ((Agro_Util::formatCurrencyDb($cobertura['premio']) / $Proposta->lmga()) * 100) != $cobertura['taxa']){
			$vl_taxa_bi = round((Agro_Util::formatCurrencyDb($cobertura['premio']) / $Proposta->lmga()) * 100, 8);
		}

		$Row = $this->createRow();
		$Row->id_cobertura = $id;
		$Row->vl_lmi       = $Cobertura->vl_lmi;
		$Row->id_proposta  = $Proposta->id;
		$Row->fl_principal = ($cobertura['principal'] ? 1 : 0);
		$Row->vl_taxa      = $cobertura['taxa'];
		$Row->vl_taxa_bi   = ($vl_taxa_bi > 0 ? $vl_taxa_bi : $cobertura['taxa']);
		$Row->vl_premio    = Agro_Util::formatCurrencyDb(($cobertura['premio'] ? $cobertura['premio'] : 0));
		$Row->vl_franquia  = $cobertura['valorFranquiaCar'] ?? $Taxa->vl_franquia;

		return $Row->save();
	}

	public function delete($cobertura, $proposta) {
		if ($proposta) {
			$this->_db->query("delete from seguro.propostas_coberturas where id_proposta = $proposta and id_cobertura = $cobertura");
		}
	}

	public function atualizaLmi($idCobertura, $idProposta, $LMI) {
		$Row = $this->find($idCobertura, $idProposta)->current();
		if($Row){
			$Row->vl_lmi = Agro_Util::formatCurrencyDb($LMI);
			return $Row->save();
		}
		return true;
	}

	public function deleteProposta($proposta) {
		if ($proposta) {
			$this->_db->query("delete from seguro.propostas_coberturas where id_proposta = $proposta");
		}
	}

	public function getCoberturasSalvas($idProposta) {
		$Rs = $this->fetchAll("id_proposta = $idProposta");

		$ret = array();
		foreach ($Rs as $Row) {
			$ret[$Row->id_cobertura] = $Row->toArray();
		}

		return $ret;
	}

	public function get($id_proposta) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'seguro.propostas_coberturas'), array('fl_principal', 'vl_franquia', 'vl_taxa', 'vl_premio', 'vl_lmi', 'id_cobertura'));
		$Select->join(array('c' => 'produto.coberturas'), 'c.id = p.id_cobertura', array('ds_chave_cobertura'));
		$Select->join(array('pr' => 'seguro.propostas'), 'p.id_proposta = pr.id');
		$Select->join(array('pc' => 'produto.produtos_coberturas'), 'pc.id_produto = pr.id_produto and pc.id_cobertura = p.id_cobertura', array('fl_contratacao_automatica', 'cd_cobertura_seguradora'));
		$Select->where('id_proposta = ?', $id_proposta);
		$Select->where('fl_contratacao_automatica = false');
		$Select->order('fl_principal desc');

		return $this->fetchAll($Select);
	}

	public function hasCoberturaFitossanitariaProposta($idProposta) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pc' => $this->_schema . '.' . $this->_name), array('id_proposta'));
		$select->join(array('c'  => 'produto.coberturas'), 'c.id = pc.id_cobertura', array('ds_nome_cobertura'));
		$select->where('pc.id_proposta = ?', $idProposta);
		$select->where('c.ds_chave_cobertura = ?', 'COB_PROTECAO_FITO');

		$rs = $this->fetchRow($select);

		if ($rs) {
			return true;
		} else {
			return false;
		}
	}

    public function hasCoberturaByIdPropostaDsChave($idProposta, $dsChaveCobertura) {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('pc' => $this->_schema . '.' . $this->_name), array('id_proposta'));
        $select->join(array('c'  => 'produto.coberturas'), 'c.id = pc.id_cobertura', array('ds_nome_cobertura'));
        $select->where('pc.id_proposta = ?', $idProposta);
        $select->where('c.ds_chave_cobertura = ?', $dsChaveCobertura);

        $rs = $this->fetchRow($select);

        if ($rs) {
            return true;
        } else {
            return false;
        }
    }

	public function hasFlVistoriaPreliminar($idProposta, $idCobertura) {
		$data = array();
		if($idProposta && $idCobertura){
			$select = "
				select
					pdc.*
				from
					/*tabela que tem o id_proposta*/
					sinistro.avisos as av inner join

					/*busca as coberturas da proposta*/
					seguro.propostas_coberturas as pc on pc.id_proposta = av.id_proposta inner join
					produto.coberturas as c on c.id = pc.id_cobertura inner join

					/*filtra pelos eventos das coberturas*/
					sinistro.avisos_eventos as ae on ae.id_aviso = av.id inner join
					produto.coberturas_eventos as ce on ce.id_evento = ae.id_evento and ce.id_cobertura = c.id inner join

					/*filtra por produto*/
					seguro.propostas pr on pr.id = av.id_proposta inner join
					produto.produtos pd on pd.id = pr.id_produto inner join
					produto.produtos_coberturas pdc on pdc.id_cobertura = c.id and pdc.id_produto = pr.id_produto
				where
					av.id_proposta = $idProposta and
					c.id = $idCobertura
			";

			$rs = $this->_db->fetchRow($select);
			if ($rs) {
				$data = $rs['fl_vistoria_preliminar'];
			}
		}
		return $data;
	}

	public function getChaveCoberturasByProposta($idProposta) {
		$data = array();

		if ($idProposta) {
			$select = "
				select
					c.ds_chave_cobertura
				from
							   seguro.propostas_coberturas as pc
					inner join produto.coberturas as c on c.id = pc.id_cobertura
				where
					pc.id_proposta = $idProposta
			";

			$rs = $this->_db->fetchAll($select);
			if ($rs) {
				foreach ($rs as $it) {
					$data[] = $it['ds_chave_cobertura'];
				}
			}
		}

		return $data;
	}

	/**
	 * Função para atualizar o premio de uma cobertura
	 *
	 * @param integer $cobertura identificador da cobertura
	 * @param integer $proposta identificador da proposta
	 * @param numeric $premio valor do premio
	 */
	public function atualizaPremio($dados, $premio) {
		$Row = $this->find($dados['id_cobertura'], $dados['id_proposta'])->current();
		if (!$Row) $Row = $this->createRow();

		$Row->id_cobertura = $dados['id_cobertura'];
		$Row->id_proposta = $dados['id_proposta'];
		$Row->vl_franquia = $dados['franquia'] ? $dados['franquia'] : 0;
		$Row->vl_taxa = $dados['taxa'] ? $dados['taxa'] : 0;
		$Row->vl_premio = $premio ? $premio : 0;

		return $Row->save();
	}

	public function getFranquiaByPropostaCobertura($idProposta, $idCobertura) {
	    $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('pc' => $this->_schema . '.' . $this->_name), 'vl_franquia');
        $select->where('pc.id_proposta = ?', $idProposta);
        $select->where('pc.id_cobertura = ?', $idCobertura);

        return $this->_db->fetchOne($select);
	}

	public function getCoberturasByPropostaProdutoConfiguradoTipo($idProposta, $idTipo, $flAtivo = true) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('spc' => 'seguro.propostas_coberturas'), 'id_cobertura');
		$select->join(array('p' => 'seguro.propostas'), 'spc.id_proposta = p.id', false);
		$select->join(array('ppc' => 'produto.produtos_coberturas'), 'ppc.id_produto = p.id_produto AND ppc.id_cobertura = spc.id_cobertura', array('id_tipo_laudo_'.($idTipo == 2 ? 'preliminar' : 'final'), 'id_produto'));
		$select->join(array('pc' => 'produto.coberturas'), 'pc.id = ppc.id_cobertura', 'pc.ds_nome_cobertura');
		if($flAtivo){
			$select->where('ppc.fl_ativo = true');
		}
		$select->where('ppc.id_tipo_laudo_'.($idTipo == 2 ? 'preliminar' : 'final').' is not null');
		$select->where('p.id = ?', $idProposta);
		$select->order('pc.ds_nome_cobertura');

		return $this->_db->fetchAll($select);
	}
}
