<?
class Safra12_Model_LIQ07 extends Agro_Db_Table_Abstract {
	protected $_schema = 'sinistro';
	protected $_name = 'tipo_liquidacao';
	protected $_primary = 'id';
	public $_order = 'ds_nome_tipo_liquidacao';
	
	public function liquidar($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();
		
		$ItemSegurado = $ModelItemSegurado->find($dados['id_item_segurado'])->current();
		
		$this->getAdapter()->beginTransaction();
		
		try {
            
		    // Array de danos utilizado para abater danos anteriores durante o cálculo
			$arDanosAnteriores = array();	
			
			// Array que acumulará o prejuizo calculado por cobertura, para posterior aplicação da franquia
			$arCoberturas = array();
			
			foreach($dados['laudos'] as $laudo) {
			    
			    $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'];
				
				// Se a cobertura for Granizo, verifica a fase de frutificação informada no laudo (Pré-Floração ou Pós-Floração)
				if ($laudo['ds_chave_cobertura'] == 'COB_GRANIZO') {
				    
			        // Se a fase de frutificação informada no laudo for 'Pós-Floração' aplica correção ao dano
				    if ($this->isPosFloracao($dsSafra, $laudo['id_laudo_final_item_segurado'])) {
				        
				        // Se o produto for Uva de Mesa, apenas dobra o valor do dano
				        if ($dados['ds_chave_produto'] == 'UVA_MESA') {
				            if($vlPercentDanoLaudo > 49.99) {
				                $vlPercentDanoLaudo = 100;
				            } else {
				                $vlPercentDanoLaudo = $vlPercentDanoLaudo * 2;
				            }
				        // Se o produto for Uva de Mesa Tabela II, busca o valor na tabela de conversão no BD
				        } elseif ($dados['ds_chave_produto'] == 'UVA_MESA_TABELA_II') {
				            $vlPercentDanoLaudo = $this->getPercentConvertido($vlPercentDanoLaudo);
				        }
				    }
				}
				
				// Se houver percentual colhido, ajusta o dano para a área remascente
			    if ($laudo['vl_percent_colhido'] > 0) {
			        $vlPercentDanoLaudo = ((100 - $laudo['vl_percent_colhido']) * $vlPercentDanoLaudo / 100);
			    }
				
				// Desconta os danos dos laudos anteriores
				foreach ($arDanosAnteriores as $danoAnterior) {
				    $vlPercentDanoLaudo = $vlPercentDanoLaudo * ( 1 - ( $danoAnterior / 100 ) );
				}
								
				$params['id_laudo_final_item_segurado'] = $laudo['id_laudo_final_item_segurado'];
				$params['vl_prejuizo'] = round( ( ( $ItemSegurado->vl_lmga * $vlPercentDanoLaudo / 100) ), 2 );
				
			
				$idLiquidacoesItensSeguradosCoberturasLF = $ModelLiquidacoesItensSeguradosCoberturasLF->save($params);
				
				$arCoberturas[$laudo['id_cobertura']]['vl_prejuizo_total'] += $params['vl_prejuizo'];

				// Insere o percentual de dano do laudo atual no array de danos
				$arDanosAnteriores[] = $vlPercentDanoLaudo;
				
			}
			
			$fl_aplicar_franquia = true;
			
		    foreach ($arCoberturas as $id_cobertura=>$cobertura) {
		        $vl_percent_franquia = $ModelPropostasCoberturas->getFranquiaByPropostaCobertura($dados['id_proposta'], $id_cobertura);
		        
		        if(!$vl_percent_franquia) {
		            $vl_percent_franquia = 0;
		        }
		        
		        if($fl_aplicar_franquia) {
    		        $vl_franquia = round( ($ItemSegurado->vl_lmga * $vl_percent_franquia / 100) ,2);
    		        
    		        if ($vl_franquia > $cobertura['vl_prejuizo_total']) {
    		            $vl_indenizacao = 0;
    		        } else {
    		            $vl_indenizacao = $cobertura['vl_prejuizo_total'] - $vl_franquia;
    		        }
    		        
    		        $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; 
	}
	
	public function isPosFloracao($dsSafra, $idLaudoFinalItemSegurado) {
	    
        $Select = $this->select()->setIntegrityCheck(false);
        $Select->from(array('lfis'=>$dsSafra.'.laudos_finais_uva_granizo_itens_segurados'), "lfis.fl_pos_floracao"); 
        $Select->where('lfis.id_laudo_final_item_segurado = ?', $idLaudoFinalItemSegurado);
        
        return $this->_db->fetchOne($Select);
	}
	
	public function getPercentConvertido($vlPercentPerdas) {
	    /*
	     * Busca o percentual de correção adequado na tabela sinistro.auxiliar_liquidacao_cebola_qualidade_i 
	     * para o percentual de perda passado
	     */
	    $Select = $this->select()->setIntegrityCheck(false);
	    $Select->from(array('aux'=>'sinistro.auxiliar_liquidacao_uva_mesa_conversao'), 'aux.vl_percent_correcao');
	    $Select->where('? between aux.vl_percent_perdas_min and aux.vl_percent_perdas_max', $vlPercentPerdas);
	    
	    return $this->_db->fetchOne($Select);
	}
}
