<?
/*
 * Liquidação Frutas 1 ( Caroço )
 */
class Safra16_Model_LIQ06 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;

	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(); 
		
	}
	
	public function liquidar(array $dados){
	    
		$result = array("status"=>true, "message"=>"", "execute"=>"");
		
		$ModelSafras = new Produto_Model_Safras();
		$dsSafra = $ModelSafras->getSafraModel($dados['id_proposta']);
		
		$ModelLiquidacoes = new Sinistro_Model_Liquidacoes();
		$ModelItemSegurado = new Seguro_Model_ItensSegurados();
		$ModelCoberturas = new Produto_Model_Coberturas();
		$ModelPropostasCoberturas = new Seguro_Model_PropostasCoberturas();
		$ModelLiquidacoesItensSeguradosCoberturas = new Sinistro_Model_LiquidacoesItensSeguradosCoberturas();
		$ModelLiquidacoesItensSeguradosCoberturasLF = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLF();
		$ModelLiquidacoesItensSeguradosCoberturasLFDependentes = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLFDependentes();
		
		try {
		    
    		$ItemSegurado = $ModelItemSegurado->find($dados['id_item_segurado'])->current();
    		
    		$this->getAdapter()->beginTransaction();
            
			// Array que acumulará o prejuizo calculado por cobertura, para posterior aplicação da franquia
			$arCoberturas = array();
			
			$count_laudos = count($dados['laudos']);
			$count_laudos_calculados = 0;
			$index = 0;
			
			$vl_percet_colhido_aux = 0;	
			
			foreach($dados['laudos'] as $laudo) {
				$count_laudos_calculados++;
			    
			    $Row = $ModelLiquidacoesItensSeguradosCoberturas->find($dados['id_liquidacao'], $dados['id_item_segurado'], $laudo['id_cobertura'])->current();
			    
			    if(!$Row) {
			        $Row = $ModelLiquidacoesItensSeguradosCoberturas->save(array(
                     'id_liquidacao'     => $dados['id_liquidacao'],
                     'id_item_segurado'  => $dados['id_item_segurado'],
                     'id_cobertura'      => $laudo['id_cobertura']
                    ));
			    }
			    
			    $params = array();
			    $params['id_liquidacoes_itens_segurados_coberturas'] = $Row['id'];
			    
				$vlPercentDanoLaudo = $laudo['percentual_dano'];
				$params['vl_percent_dano'] = $vlPercentDanoLaudo;
				
				if ($count_laudos_calculados == $count_laudos) {
					$vlPercentDanoCalculo = $vlPercentDanoLaudo * (100 - $laudo['vl_percent_colhido'])/100;
				} else {
					
					if (array_key_exists($index + 1, $dados['laudos'])) {
						$vl_percet_colhido_aux = $dados['laudos'][$index + 1]['vl_percent_colhido'];
					}
					
					$vlPercentDanoCalculo = $vlPercentDanoLaudo * ($vl_percet_colhido_aux - $laudo['vl_percent_colhido'])/100;
				}
				
				$params['id_laudo_final_item_segurado'] = $laudo['id_laudo_final_item_segurado'];
				$params['vl_prejuizo'] = round( ( ( $ItemSegurado->vl_lmga * $vlPercentDanoCalculo / 100) ), 2 );
				
				$idLiquidacoesItensSeguradosCoberturasLF = $ModelLiquidacoesItensSeguradosCoberturasLF->save($params);
				
				$arCoberturas[$laudo['id_cobertura']]['vl_prejuizo_total'] += $params['vl_prejuizo'];

				$vlPercenDanoCalculoDependentes = $vlPercentDanoLaudo;
				
                // Insere o percentual de dano do laudo atual no array de danos
                $arDanosAnteriores[] = $vlPercentDanoLaudo;
				$index++;
			}

			// Busca percentual da franquia da cobertura principal (Granizo)
			$vl_percent_franquia_principal = $ModelPropostasCoberturas->getFranquiaByPropostaCobertura($dados['id_proposta'], 1);
			$vl_franquia_restante = round( ($ItemSegurado->vl_lmga * $vl_percent_franquia_principal / 100) ,2);
			
			$fl_aplicar_franquia = true;
			
		    foreach ($arCoberturas as $id_cobertura=>$cobertura) {
		        if ($id_cobertura == 1 || $id_cobertura == 3) {
		            $vl_percent_franquia = $ModelPropostasCoberturas->getFranquiaByPropostaCobertura($dados['id_proposta'], $id_cobertura);
		        } else {
		            $vl_percent_franquia = 0;
		        }
		        
		        if($fl_aplicar_franquia && $vl_franquia_restante > 0) {
    		        $vl_franquia = round( ($ItemSegurado->vl_lmga * $vl_percent_franquia / 100), 2);
    		        
    		        if ($vl_franquia_restante > $cobertura['vl_prejuizo_total']) {
    		            $vl_franquia_restante -= $cobertura['vl_prejuizo_total'];
    		        } else {
    		            $vl_indenizacao = $cobertura['vl_prejuizo_total'] - $vl_franquia_restante;
    		            $fl_aplicar_franquia = false;
    		        }
    		        
		        } else {
		            $vl_percent_franquia = 0;
		            $vl_franquia = 0;
		            $vl_indenizacao = $cobertura['vl_prejuizo_total'];
		        }
				
		        
                $ModelLiquidacoesItensSeguradosCoberturas->save(array(
                 'id_liquidacao'        => $dados['id_liquidacao'],
                 'id_item_segurado'     => $dados['id_item_segurado'],
                 'id_cobertura'         => $id_cobertura,
                 'vl_percent_franquia'  => $vl_percent_franquia,
                 'vl_franquia'          => $vl_franquia,
                 'vl_indenizacao'       => $vl_indenizacao,
                 'vl_prejuizo_total'	=> $cobertura['vl_prejuizo_total']
                ));
		    }

			$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()} \n {$e->getTraceAsString()}";
			
		}
		
		return $result; 
	}
	
	
	/*
	 * Havendo mais de um laudo com percentual colhido 0% seleciona-se o ultimo pois 
	 * este possui o dano acumulado
	 */
	public function ajustaLaudos(array $laudos){
		$result = array();
		$result[0] = array();
		
		foreach ($laudos as $laudo){
			if ($laudo["vl_percent_colhido"] <= 0){
				$result[0] = $laudo;
				
			} else {
				$result[] = $laudo;
				
			}
		}
		
		return $result;
		
	}
}