<?
/**
 * @name Safra16_Model_LIQ13
 * @desc Liquidação Trigo / GRANIZO
 * @author Vinicius Marconi V. Berni
 * @since 01/11/2012
 */
class Safra16_Model_LIQ13 extends Agro_Db_Table_Abstract {
	protected $_schema = 'sinistro';
	protected $_name = 'tipo_liquidacao';
	protected $_primary = 'id';
	public $_order = 'ds_nome_tipo_liquidacao';

	private $_ModelLiquidacoes;
	private $_ModelLiquidacoesItensSegurados;
	private $_ModelLiquidacoesItensSeguradosCoberturas;
	private $_ModelLiquidacoesItensSeguradosCoberturasLf;
	private $_ModelPropostaCoberturas;
	private $_ModelItemSegurado;
	private $_ModelLfIS;

	public function init(){
		parent::init();

		$this->_ModelLiquidacoes = new Sinistro_Model_Liquidacoes();
		$this->_ModelLiquidacoesItensSeguradosCoberturas = new Sinistro_Model_LiquidacoesItensSeguradosCoberturas();
		$this->_ModelLiquidacoesItensSeguradosCoberturasLf = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLF();

		$this->_ModelPropostaCoberturas = new Seguro_Model_PropostasCoberturas();
		$this->_ModelItemSegurado = new Seguro_Model_ItensSegurados();

		$this->_ModelLfIS = new Sinistro_Model_LaudosFinaisItensSegurados();
	}

	public function liquidar($dados){
		$result = array("status"=>true, "message"=>"", "execute"=>"");

		$avisos = Zend_Db_Table::getDefaultAdapter()->fetchOne("select count(*) from sinistro.avisos where id_proposta = {$dados["id_proposta"]}  and id_status = ".Agro_Util::status("ACEITO", "SA"));

		if ($avisos > 1){
			$result["status"] = false;
			$result["message"] = "Esta liquidação não contempla casos com mais de 1 evento. \nPor favor, liquidar manualmente.";

		} elseif (count($dados["laudos"]) > 1){
			$result["status"] = false;
			$result["message"] = "Esta liquidação contempla casos que possuam somente 1 laudo, para os demais liquidar manualmente.";

		} elseif ($dados["laudos"][0]["ds_chave_cobertura"] != "COB_GRANIZO"){
			$result["status"] = false;
			$result["message"] = "Esta liquidação contempla casos de GRANIZO, demais coberturas devem ser liquidadas manualmente.";

		} else {
			$LFIS 			= $this->_ModelLfIS->fetchRow("id=".$dados["laudos"][0]['id_laudo_final_item_segurado']);
			$Liquidacao 	= $this->_ModelLiquidacoes->find($dados["id_liquidacao"])->current();
			$ItemSegurado 	= $this->_ModelItemSegurado->find($dados['id_item_segurado'])->current();
			$IsComplemento 	= $ItemSegurado->complemento();

			$this->getAdapter()->beginTransaction();

			try {
				/**
				 * Calcula LMGA remanecente
				 */
				$lmga_remanecente = $ItemSegurado->vl_lmga * ($LFIS->vl_ha_area_afetada / $ItemSegurado->vl_area);

				/**
				 *Calcula o prejuizo apurado
				 */
				$vl_prejuizo = Agro_Util::round(($LFIS->vl_percent_perdas > 0 ? (($LFIS->vl_percent_perdas * $lmga_remanecente) / 100) : 0), 2);

				/*
				 * Franquia
				 */
				$vl_percent_franquia = $this->_ModelPropostaCoberturas->getFranquiaByPropostaCobertura($dados['id_proposta'], $dados["id_cobertura"]);
				$vl_franquia = ($LFIS->vl_percent_perdas < $vl_percent_franquia ?  $vl_prejuizo : 0);

				/*
				 * Indenização
				 * Prejuizo - Franquia
				 */
				$vl_indenizacao =  Agro_Util::round($vl_prejuizo - $vl_franquia, 2);

				$LiqISCob =  $this->_ModelLiquidacoesItensSeguradosCoberturas->save(
					array(
						"id_usuario_criacao"	 => $Liq->id_usuario_criacao,
						"id_liquidacao" 		 => $dados["id_liquidacao"],
						"id_item_segurado" 		 => $dados["id_item_segurado"],
						"id_cobertura" 			 => $dados["id_cobertura"],
						"vl_percent_franquia" 	 => $vl_percent_franquia,
						"vl_franquia" 			 => $vl_franquia,
						"vl_indenizacao" 		 => $vl_indenizacao,
						"vl_prejuizo_total" 	 => $vl_prejuizo,
						"vl_percent_indenizacao" => $percent_area_afetada
					)
				);

				$this->_ModelLiquidacoesItensSeguradosCoberturasLf->save(
					array(
						"id_liquidacoes_itens_segurados_coberturas" => $LiqISCob->id,
						"id_laudo_final_item_segurado" => $dados["laudos"][0]['id_laudo_final_item_segurado'],
						"vl_prejuizo" => $vl_prejuizo
					)
				);

				$LiqISCob->save();

				$result['message'] = "Liquidação realizada com sucesso";

				$this->getAdapter()->commit();

			} catch (Exception $e) {
				$this->getAdapter()->rollBack();
				$result['status'] = false;
				$result['message'] = "Não foi possível realizar a liquidação. \n {$e->getMessage()}";

			}
		}

		return $result;
	}
}