<?
/**
 * @name Regulacao_Model_LIQ10
 * @desc Liquidação de PG (Soja, Trigo e outros)
 * @author Vinicius Marconi V. Berni
 * @since 05/06/2011
 */
class Regulacao_Model_LIQ10 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 Sinistro2_Model_Liquidacoes(); 
		$this->_ModelLiquidacoesItensSeguradosCoberturas = new Sinistro2_Model_LiquidacoesItensSeguradosCoberturas();
		$this->_ModelLiquidacoesItensSeguradosCoberturasLf = new Sinistro2_Model_LiquidacoesItensSeguradosCoberturasLF();
		
		$this->_ModelPropostaCoberturas = new Seguro_Model_PropostasCoberturas();
		$this->_ModelItemSegurado = new Seguro_Model_ItensSegurados();

		$this->_ModelLfIS = new Sinistro2_Model_LaudosFinaisItensSegurados();
	}
	
	public function liquidar($dados){
		$result = array("status"=>true, "message"=>"", "execute"=>"");
		
		$Liq = $this->_ModelLiquidacoes->find($dados["id_liquidacao"])->current();
		
		if (count($dados["laudos"])>1){
			$result["status"] = false;
			$result["message"] = "Esta liquidação não permite mais de um laudo. Para tal, utilize a liquidação manual";
			
		} else {
		
			$ItemSegurado = $this->_ModelItemSegurado->find($dados['id_item_segurado'])->current();
			$IsComplemento = $ItemSegurado->complemento();
			
			$LFIS = $this->_ModelLfIS->getByID($dados["laudos"][0]['id_laudo_final_item_segurado']);
			
			$this->getAdapter()->beginTransaction();
			
			try {
				$vl_percent_franquia = $this->_ModelPropostaCoberturas->getFranquiaByPropostaCobertura($dados['id_proposta'], $dados["id_cobertura"]);
				
				$vl_franquia = ($ItemSegurado->vl_lmga * $vl_percent_franquia)/100;
				
				$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" 		 => 0,
						"vl_prejuizo_total" 	 => 0,
						"vl_percent_indenizacao" => 0
					)
				);
	
				$this->_ModelLiquidacoesItensSeguradosCoberturasLf->save(
					array(
						"id_usuario_criacao"	=> $Liq->id_usuario_criacao,
						"id_liquidacoes_itens_segurados_coberturas" => $LiqISCob->id,
						"id_laudo_final_item_segurado" => $dados["laudos"][0]['id_laudo_final_item_segurado'],
						"vl_prejuizo" => 0 
					)
				);
				
				if (floatval($IsComplemento["vl_producao_garantida"]) > 0){
					$laudo = $dados["laudos"][0];
					
					/*
					 * Calculo havendo percentual colhido
					 */
					if (floatval($laudo["vl_percent_colhido"])> 0){						
						if (floatval($LFIS->vl_rendimento_final_lavoura) <= 0){
							$LiqISCob->vl_indenizacao = $ItemSegurado->vl_lmga;
							$LiqISCob->vl_percent_indenizacao = 100;
							
						} elseif (floatval($LFIS->vl_rendimento_final_lavoura) < floatval($IsComplemento["vl_producao_garantida"])){
							$produtividade_media = (($laudo["vl_percent_colhido"]/100) * $ItemSegurado->vl_area * $ItemSegurado->vl_rendimento_tonelada);
							$produtividade_media += ((100-$laudo["vl_percent_colhido"])/100) * $ItemSegurado->vl_area * $LFIS->vl_rendimento_final_lavoura;
							$produtividade_media = round($produtividade_media / $ItemSegurado->vl_area, 3);
							
							if (floatval($IsComplemento["vl_producao_garantida"])<=0 || $LFIS->vl_rendimento_final_lavoura <= 0){
								$percent_indenizacao = 0;
								
							} else {
								$percent_indenizacao = floatval($IsComplemento["vl_producao_garantida"] - $produtividade_media) / floatval($IsComplemento["vl_producao_garantida"]);
								$percent_indenizacao = Agro_Util::round(($percent_indenizacao * 100),2);
								
							}
						
							$LiqISCob->vl_indenizacao = Agro_Util::round(($ItemSegurado->vl_lmga * $percent_indenizacao)/100 ,2);
							$LiqISCob->vl_percent_indenizacao = $percent_indenizacao;
						}
					/**
					 * Calculo se não houver percentual colhido
					 */	
					} else {
						if (floatval($LFIS->vl_rendimento_final_lavoura) <= 0){
							$LiqISCob->vl_indenizacao = $ItemSegurado->vl_lmga;
							$LiqISCob->vl_percent_indenizacao = 100;
							
						} elseif (floatval($LFIS->vl_rendimento_final_lavoura) > floatval($IsComplemento["vl_producao_garantida"])){
							$LiqISCob->vl_indenizacao = 0;
							$LiqISCob->vl_percent_indenizacao = 0;
						
						} else {
							$percent_indenizacao =  ((($IsComplemento["vl_producao_garantida"] - $LFIS->vl_rendimento_final_lavoura) / $IsComplemento["vl_producao_garantida"]));
						
							$LiqISCob->vl_indenizacao = Agro_Util::round(($ItemSegurado->vl_lmga * Agro_Util::round($percent_indenizacao, 4)), 2);
							$LiqISCob->vl_percent_indenizacao = $percent_indenizacao * 100;
						}
					}
				}
				
				$LiqISCob->vl_indenizacao = $LiqISCob->vl_indenizacao < 0 ? 0 : $LiqISCob->vl_indenizacao;
				$LiqISCob->vl_percent_indenizacao = $LiqISCob->vl_percent_indenizacao < 0 ? 0 : $LiqISCob->vl_percent_indenizacao;
				
				$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;		
	}
}