<?

class Safra16_Model_LIQ14 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_GEADA"){
			$result["status"] = false;
			$result["message"] = "Esta liquidação contempla casos de GEADA, demais coberturas devem ser liquidadas manualmente.";

		} else {
			$LFIS 			= $this->_ModelLfIS->fetchRow("id=".$dados["laudos"][0]['id_laudo_final_item_segurado']);
			$ItemSegurado 	= $this->_ModelItemSegurado->find($dados['id_item_segurado'])->current();

			$this->getAdapter()->beginTransaction();

			try {
				/*
				 * Calcula a área remanescente
				 * Área TOTAL - Colhido
				 */

				if (max($LFIS->vl_percent_colhido, $LFIS->vl_percent_colhido_chocho) > 0){
					$percent_area_remanecente = 100 - max($LFIS->vl_percent_colhido, $LFIS->vl_percent_colhido_chocho);
					$area_remanescente = $ItemSegurado->vl_area * ($percent_area_remanecente/100);

				} else {
					$area_remanescente = $ItemSegurado->vl_area;
					$percent_area_remanecente = 100;
				}

				/**
				 * Calcula LMGA remanecente
				 */
				$lmga_remanecente = ($ItemSegurado->vl_lmga);

				/*
				 * Normaliza dano chocho
				 */
				$vl_percent_dano_chocho = ($LFIS->vl_percent_perdas_chocho ? $LFIS->vl_percent_perdas_chocho : 0);

				/*
				 * Normaliza dano
				 */
				$vl_percent_dano = ($LFIS->vl_percent_perdas ? $LFIS->vl_percent_perdas : 0);

				/**
				 *Calcula o prejuizo apurado
				 */
				//arredondo com 3 casas decimais, e depois descarto a última casa
				$vl_prejuizo = (substr(number_format((((100 - $LFIS->vl_percent_perdas) * ($LFIS->vl_percent_perdas_chocho/100)) + $LFIS->vl_percent_perdas), 3), 0 , -1) * $ItemSegurado->vl_lmga)/100;

				/*
				 * Franquia
				 */
				$vl_percent_franquia = $this->_ModelPropostaCoberturas->getFranquiaByPropostaCobertura($dados['id_proposta'], $dados["id_cobertura"]);

				if ($vl_prejuizo > 0){

					$vl_franquia = $ItemSegurado->vl_lmga * ($vl_percent_franquia/100);

				} else {
					$vl_franquia = 0;
				}

				/*
				 * Indenização
				 * Prejuizo - Franquia
				 */
				$vl_indenizacao =  ($vl_franquia > $vl_prejuizo ? 0 : 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;
	}
}