<?
/**
 *Liquidação de Uva de Mesa - Granizo e coberturas adicionais
 */
class Regulacao_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 Sinistro2_Model_Liquidacoes();
		$ModelItemSegurado = new Seguro_Model_ItensSegurados();
		$ModelCoberturas = new Produto_Model_Coberturas();
		$ModelPropostasCoberturas = new Seguro_Model_PropostasCoberturas();
		$ModelLiquidacoesItensSeguradosCoberturas = new Sinistro2_Model_LiquidacoesItensSeguradosCoberturas();
		$ModelLiquidacoesItensSeguradosCoberturasLF = new Sinistro2_Model_LiquidacoesItensSeguradosCoberturasLF();
		$ModelLiquidacoesItensSeguradosCoberturasLFDependentes = new Sinistro2_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' || $dados['ds_chave_produto'] == 'UVA_MESA_TABELA_II_S2'|| $dados['ds_chave_produto'] == 'UVA_VINHO_TABELA_II') {
				        	if ($vlPercentDanoLaudo > 20) {
				            	$vlPercentDanoLaudo = $this->getPercentConvertido($vlPercentDanoLaudo);
							}
				        }
				    }
				}

				$vlPercentDanoCalculo = $vlPercentDanoLaudo;
				$params['vl_percent_dano'] = $vlPercentDanoLaudo;

				// Se houver percentual colhido, ajusta o dano para a área remanescente
			    if ($laudo['vl_percent_colhido'] > 0) {
			        $vlPercentDanoCalculo = $vlPercentDanoCalculo * ( 1 - ($laudo['vl_percent_colhido'] / 100));
			    }

				// Desconta os danos dos laudos anteriores
				foreach ($arDanosAnteriores as $danoAnterior) {
				    $vlPercentDanoCalculo = $vlPercentDanoCalculo * ( 1 - ( $danoAnterior / 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'];

				// 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_percent_franquia > 0) {
    		        $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.'.lf005_itens_segurados'), "lfis.fl_floracao");
        $Select->where('lfis.id_laudo_final_item_segurado = ?', $idLaudoFinalItemSegurado);

        $valor = $this->_db->fetchOne($Select);

        return ($valor == "pos" ? true : false);
	}

	public function getPercentConvertido($vlPercentPerdas) {
	    $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);
	}
}
