			<?php
/**
 * Model
 *
 * Laudo final Tipo LF004 / Safra17 - Melão/Melancia - Granizo
 *
 * @author Tonismar Bernardo
 * @date 12/12/2013
 *
 */
class Saafra17Model_Lf004ItensSeguradosAmostras extends Agro_Db_Table_Abstract {
	protected $_rowClass = 'Regulacao_Model_Row_Lf004ItemSeguradoAmostras';
	protected $_schema 	= 'regulacao';
	protected $_name 	= 'lf004_itens_segurados_amostras';
	protected $_primary = 'id';
	public 	  $_order 	= 'nr_amostra';

	public function save($dados) {
		$ModelIS = new Saafra17Model_Lf004ItensSegurados();

		$dados = $this->prepararDados($dados);

		if ($this->validar($dados)){

			$dados = $this->calcular($dados);

			$dados["id_laudo_final_item_segurado"] = $ModelIS->save($dados);

			if ($dados["id_laudo_final_item_segurado"]){
				try {
					$this->delete($dados["id_laudo_final_item_segurado"], "id_laudo_final_item_segurado");

					foreach ($dados["amostras"] as $key => $amostra) {
						$amostra["nr_amostra"] = $key;
						$amostra["id_laudo_final_item_segurado"] = $dados["id_laudo_final_item_segurado"];

						$this->insert($amostra);
					}

					$this->setMessage("Laudo salvo com sucesso.");

					return $dados["id_laudo_final_item_segurado"];

				} catch (Exception $e) {
					$this->setMessage($e->getMessage());
					return false;
				}
			} else {
				$this->setMessage($ModelIS->getMessages());
				return false;
			}
		}
	}

	public function validar($dados){
		$messages = array();

		if(count($dados['amostras']) < 1){
			$messages[] = "Preencha ao menos uma amostra.";
		}

		if (count($messages)){
			$this->setMessage("Os itens citados abaixo são de preenchimento obrigatório:<ul><li>".implode("</li><li>", $messages)."</li></ul>");
			return false;

		} else {
			return true;
		}
	}


	public function calcular($dados){
		$amostras = 0;
		for ($i = 1; $i < 11; $i++) {

			if($dados['amostras'][$i]['vl_percent_plantas_mortas'] != null || $dados['amostras'][$i]['vl_percent_desfolhamento'] != null){

				//redução de população
				//calcula e soma os danos por redução de stand
				$dados['amostras'][$i]['vl_percent_reducao_stand'] = $this->calculaReducaoStand($dados['id_estadio_fenologico'], $dados['amostras'][$i]['vl_percent_plantas_mortas']);

				//desfolhamento
				$dados['amostras'][$i]['vl_percent_dano_bruto'] = $this->calculaDesfolhamento($dados['id_estadio_fenologico'], $dados['amostras'][$i]['vl_percent_desfolhamento']);

				//auxiliares
				$populacaoRestante = (100 - $dados['amostras'][$i]['vl_percent_reducao_stand'])/100;
				$producaoRepresentativa = ($dados['amostras'][$i]['vl_num_frutos_expostos']/$dados['amostras'][$i]['vl_producao_plantas'])/100;
				$totalDanoFrutos = ($populacaoRestante*$producaoRepresentativa*($dados['amostras'][$i]['vl_percent_frutos_danificados']/100))*100;
				$totalDanoDireto = $totalDanoFrutos + ($dados['amostras'][$i]['vl_percent_reducao_stand']/100);
				$capacidadeRestante = (1-($totalDanoDireto) - ($dados['amostras'][$i]['vl_percent_colhido_dt_vistoria']/100))*100;
				$dano = round(($capacidadeRestante/100)*($dados['amostras'][$i]['vl_percent_dano_bruto']/100),4);

				$dados['amostras'][$i]['vl_percent_total_dano_granizo'] = ($totalDanoDireto + $dano)*100;
				$somaDanoGranizo += $dados['amostras'][$i]['vl_percent_total_dano_granizo'];
				$amostras++;
			}
		}

		$dados['vl_percent_total_perda_final'] = $somaDanoGranizo/$amostras;

		return $dados;
	}


	public function prepararDados($dados){

		$return = array();

		$return["id_laudo_final"] 						= $dados["id_laudo_final"];
    	$return["id_vistoria"] 							= $dados["id_vistoria"];
    	$return["id_cobertura"] 						= $dados["id_cobertura"];
    	$return["fl_vistoria_preliminar"] 				= $dados["fl_vistoria_preliminar"];
	    $return["id_item_segurado"] 					= $dados["id_item_segurado"];
	    $return["id_proposta"] 							= $dados["id_proposta"];
	    $return["id_processo"]							= $dados["id_processo"];
	    $return["fl_nao_vistoriada"] 					= $dados["fl_nao_vistoriada"];
	    $return["id_motivo_quadra_nao_vistoriada"] 		= $dados["id_motivo_quadra_nao_vistoriada"];
	    $return["id_laudo_final_item_segurado"]	 		= $dados["id_laudo_final_item_segurado"];
	    $return["fl_avalia_danos_anteriores"] 			= $dados["fl_avalia_danos_anteriores"];
	    $return["vl_percent_colhido"] 					= $dados["vl_percent_colhido"];
	    $return["ds_coordenadas_geograficas"] 			= $dados["ds_coordenadas_geograficas"];
	    $return["fl_assinatura_segurado"] 				= $dados["fl_assinatura_segurado"];
	    $return["ds_observacao_assinatura_segurado"]	= $dados["ds_observacao_assinatura_segurado"];
    	$return["fl_assinatura_regulador"] 				= $dados["fl_assinatura_regulador"];
	    $return["ds_observacao_assinatura_regulador"]	= $dados["ds_observacao_assinatura_regulador"];
	    $return["ds_observacao"]						= $dados["ds_observacao"];
	    $return["dt_vistoria_data"] 					= $dados["dt_vistoria_data"];
	    $return["dt_vistoria_hora"] 					= $dados["dt_vistoria_hora"];
	    $return["dt_vistoria_minutos"] 					= $dados["dt_vistoria_minutos"];
	    $return["dt_vistoria"] 							= Agro_Util::joinDtVistoria($dados["dt_vistoria_data"], $dados["dt_vistoria_hora"], $dados["dt_vistoria_minutos"]);
		$return["vistoriadores"] 						= $dados["vistoriadores"];
		$return["auxiliares"]							= $dados["auxiliares"];
		$return['id_estadio_fenologico'] 				= $dados['id_estadio_fenologico'];
		$return['vl_area'] 								= $dados['vl_area'];

		$return["amostras"] = array();

		for ($i = 1; $i < 11; $i++) {
			if($dados["vl_percent_plantas_mortas-".$i] != null || $dados["vl_producao_plantas-".$i] != null || $dados["vl_percent_desfolhamento-".$i] != null){
				$return["amostras"][$i] = array(
					"vl_percent_plantas_mortas" 	=> ($dados["vl_percent_plantas_mortas-".$i] ? $dados["vl_percent_plantas_mortas-".$i] : null),
					"vl_producao_plantas" 	      	=> ($dados["vl_producao_plantas-".$i] ? $dados["vl_producao_plantas-".$i] : null),
					"vl_percent_colhido_dt_vistoria"=> ($dados["vl_percent_colhido_dt_vistoria-".$i] ? $dados["vl_percent_colhido_dt_vistoria-".$i] : null),
					"vl_num_frutos_expostos" 		=> ($dados["vl_num_frutos_expostos-".$i] ? $dados["vl_num_frutos_expostos-".$i] : null),
					"vl_percent_frutos_danificados"	=> ($dados["vl_percent_frutos_danificados-".$i] ? $dados["vl_percent_frutos_danificados-".$i] : null),
					"vl_percent_desfolhamento" 	  	=> ($dados["vl_percent_desfolhamento-".$i] ? $dados["vl_percent_desfolhamento-".$i] : null)
				);
			}
		}

		return $return;
	}


	public function get($idLaudoFinalItemSegurado){
	 	$ModelLfIS = new Sinistro2_Model_LaudosFinaisItensSegurados();
		$ModelIS = new Seguro_Model_ItensSegurados();

		/*
		 * Busca dados globais
		 */
		$dados = $ModelLfIS->getDataLaudoFinalItemSegurado($idLaudoFinalItemSegurado);

		/*
		 * Busca dados especialização
		 */
		if (!$dados['fl_nao_vistoriada']) {
    		$select = $this->select()->setIntegrityCheck(false);
            $select->from(array("lfisX" => "$this->_schema.lf004_itens_segurados") , array('vl_percent_total_perda_final','id_estadio_fenologico'));
            $select->where('id_laudo_final_item_segurado = ?', $idLaudoFinalItemSegurado);

            $especializacao = $this->fetchRow($select);
            $especializacao = ($especializacao ? $especializacao->toArray() : array());

            $dados = array_merge($dados, $especializacao);
        }

        /*
         * Busca Amostras
         */
        $dados["amostras"] = array();

        if (!$dados['fl_nao_vistoriada']) {
            $amostras = $this->fetchAll("id_laudo_final_item_segurado = $idLaudoFinalItemSegurado");

            $amostras = ($amostras ? $amostras->toArray() : array());

            foreach ($amostras as $amostra){

            	$dados["amostras"][$amostra["nr_amostra"]] = $amostra;
            }
        }

        return $dados;
	}


	public function calculaReducaoStand($idEstadio, $dano){
		if($idEstadio == 217 || $idEstadio == 218){
			if($dano > 95){
				$retorno = 100;
			}elseif ($dano > 90){
				$retorno = 91;
			}elseif ($dano > 85){
				$retorno = 84;
			}elseif ($dano > 80){
				$retorno = 77;
			}elseif ($dano > 75){
				$retorno = 71;
			}elseif ($dano > 70){
				$retorno = 64;
			}elseif ($dano > 65){
				$retorno = 58;
			}elseif ($dano > 60){
				$retorno = 52;
			}elseif ($dano > 55){
				$retorno = 46;
			}elseif ($dano > 50){
				$retorno = 41;
			}elseif ($dano > 45){
				$retorno = 36;
			}elseif ($dano > 40){
				$retorno = 31;
			}elseif ($dano > 35){
				$retorno = 27;
			}elseif ($dano > 30){
				$retorno = 23;
			}elseif ($dano > 25){
				$retorno = 19;
			}elseif ($dano > 20){
				$retorno = 15;
			}elseif ($dano > 15){
				$retorno = 12;
			}elseif ($dano > 10){
				$retorno = 8;
			}elseif ($dano > 5){
				$retorno = 5;
			}elseif ($dano > 2.5){
				$retorno = 2;
			}else{
				$retorno = 0;
			}
		}else{
			return $dano;
		}

		return $retorno;

	}

	public function calculaDesfolhamento($idEstadio, $dano){
		if($idEstadio == 227 || $dano <= 2.5){
			return 0;

		}else{

			switch($idEstadio){
				case 217:
					if($dano > 90){
						$retorno = 15;
					}elseif ($dano > 80){
						$retorno = 13;
					}elseif ($dano > 70){
						$retorno = 10;
					}elseif ($dano > 60){
						$retorno = 8;
					}elseif ($dano > 50){
						$retorno = 6;
					}elseif ($dano > 40){
						$retorno = 4;
					}elseif ($dano > 30){
						$retorno = 3;
					}elseif ($dano > 20){
						$retorno = 2;
					}elseif ($dano > 10){
						$retorno = 1;
					}elseif ($dano > 7.5){
						$retorno = 0;
					}elseif ($dano > 5){
						$retorno = 0;
					}else{
						$retorno = 0;
					}
					break;

				case 218:
					if($dano > 90){
						$retorno = 27;
					}elseif ($dano > 80){
						$retorno = 25;
					}elseif ($dano > 70){
						$retorno = 23;
					}elseif ($dano > 60){
						$retorno = 18;
					}elseif ($dano > 50){
						$retorno = 13;
					}elseif ($dano > 40){
						$retorno = 8;
					}elseif ($dano > 30){
						$retorno = 5;
					}elseif ($dano > 20){
						$retorno = 3;
					}elseif ($dano > 10){
						$retorno = 2;
					}elseif ($dano > 7.5){
						$retorno = 0;
					}elseif ($dano > 5){
						$retorno = 0;
					}else{
						$retorno = 0;
					}
					break;

				case 219:
					if($dano > 90){
						$retorno = 45;
					}elseif ($dano > 80){
						$retorno = 40;
					}elseif ($dano > 70){
						$retorno = 36;
					}elseif ($dano > 60){
						$retorno = 28;
					}elseif ($dano > 50){
						$retorno = 20;
					}elseif ($dano > 40){
						$retorno = 12;
					}elseif ($dano > 30){
						$retorno = 8;
					}elseif ($dano > 20){
						$retorno = 6;
					}elseif ($dano > 10){
						$retorno = 4;
					}elseif ($dano > 7.5){
						$retorno = 2;
					}elseif ($dano > 5){
						$retorno = 1;
					}else{
						$retorno = 0;
					}
					break;

				case 220:
					if($dano > 90){
						$retorno = 63;
					}elseif ($dano > 80){
						$retorno = 55;
					}elseif ($dano > 70){
						$retorno = 49;
					}elseif ($dano > 60){
						$retorno = 38;
					}elseif ($dano > 50){
						$retorno = 27;
					}elseif ($dano > 40){
						$retorno = 16;
					}elseif ($dano > 30){
						$retorno = 11;
					}elseif ($dano > 20){
						$retorno = 9;
					}elseif ($dano > 10){
						$retorno = 6;
					}elseif ($dano > 7.5){
						$retorno = 3;
					}elseif ($dano > 5){
						$retorno = 2;
					}else{
						$retorno = 1;
					}
					break;

				case 221:
					if($dano > 90){
						$retorno = 82;
					}elseif ($dano > 80){
						$retorno = 72;
					}elseif ($dano > 70){
						$retorno = 62;
					}elseif ($dano > 60){
						$retorno = 48;
					}elseif ($dano > 50){
						$retorno = 34;
					}elseif ($dano > 40){
						$retorno = 20;
					}elseif ($dano > 30){
						$retorno = 14;
					}elseif ($dano > 20){
						$retorno = 11;
					}elseif ($dano > 10){
						$retorno = 5;
					}elseif ($dano > 7.5){
						$retorno = 5;
					}elseif ($dano > 5){
						$retorno = 4;
					}else{
						$retorno = 2;
					}
					break;

				case 222:
					if($dano > 90){
						$retorno = 100;
					}elseif ($dano > 80){
						$retorno = 84;
					}elseif ($dano > 70){
						$retorno = 69;
					}elseif ($dano > 60){
						$retorno = 54;
					}elseif ($dano > 50){
						$retorno = 39;
					}elseif ($dano > 40){
						$retorno = 24;
					}elseif ($dano > 30){
						$retorno = 18;
					}elseif ($dano > 20){
						$retorno = 13;
					}elseif ($dano > 10){
						$retorno = 10;
					}elseif ($dano > 7.5){
						$retorno = 6;
					}elseif ($dano > 5){
						$retorno = 5;
					}else{
						$retorno = 2;
					}
					break;

				case 223:
					if($dano > 90){
						$retorno = 90;
					}elseif ($dano > 80){
						$retorno = 56;
					}elseif ($dano > 70){
						$retorno = 46;
					}elseif ($dano > 60){
						$retorno = 36;
					}elseif ($dano > 50){
						$retorno = 26;
					}elseif ($dano > 40){
						$retorno = 16;
					}elseif ($dano > 30){
						$retorno = 12;
					}elseif ($dano > 20){
						$retorno = 9;
					}elseif ($dano > 10){
						$retorno = 7;
					}elseif ($dano > 7.5){
						$retorno = 4;
					}elseif ($dano > 5){
						$retorno = 3;
					}else{
						$retorno = 2;
					}
					break;

				case 224:
					if($dano > 90){
						$retorno = 45;
					}elseif ($dano > 80){
						$retorno = 40;
					}elseif ($dano > 70){
						$retorno = 32;
					}elseif ($dano > 60){
						$retorno = 25;
					}elseif ($dano > 50){
						$retorno = 18;
					}elseif ($dano > 40){
						$retorno = 12;
					}elseif ($dano > 30){
						$retorno = 9;
					}elseif ($dano > 20){
						$retorno = 7;
					}elseif ($dano > 10){
						$retorno = 5;
					}elseif ($dano > 7.5){
						$retorno = 3;
					}elseif ($dano > 5){
						$retorno = 2;
					}else{
						$retorno = 1;
					}
					break;

				case 225:
					if($dano > 90){
						$retorno = 26;
					}elseif ($dano > 80){
						$retorno = 23;
					}elseif ($dano > 70){
						$retorno = 19;
					}elseif ($dano > 60){
						$retorno = 15;
					}elseif ($dano > 50){
						$retorno = 11;
					}elseif ($dano > 40){
						$retorno = 7;
					}elseif ($dano > 30){
						$retorno = 5;
					}elseif ($dano > 20){
						$retorno = 3;
					}elseif ($dano > 10){
						$retorno = 2;
					}elseif ($dano > 7.5){
						$retorno = 1;
					}else{
						$retorno = 0;
					}
					break;

				case 226:
					if($dano > 90){
						$retorno = 10;
					}elseif ($dano > 80){
						$retorno = 8;
					}elseif ($dano > 70){
						$retorno = 7;
					}elseif ($dano > 60){
						$retorno = 5;
					}elseif ($dano > 50){
						$retorno = 4;
					}elseif ($dano > 40){
						$retorno = 2;
					}elseif ($dano > 30){
						$retorno = 1;
					}else{
						$retorno = 0;
					}
					break;
			}
		}

		return $retorno;

	}


}
