<?php
/**
 * @name Safra13_Model_Lf004ItensSeguradosAmostras
 * @desc Model das amostras do Laudo final Itens Segurados Tipo LF004 / Safra13 
 * @author Vinicius Marconi Vasconcelos Berni
 * @since 16/06/2011
 * @see Agro_Db_Table_Abstract
 */
class Safra13_Model_Lf004ItensSeguradosAmostras extends Agro_Db_Table_Abstract {
	protected $_schema 	= 'safra13';
	protected $_name 	= 'lf004_itens_segurados_amostras';
	protected $_primary = 'id';
	public 	  $_order 	= 'id_laudo_final';
		
	public function __beforeSave($dados){
		$params = $this->montaArray($dados);
		$params  = $this->__valida($params);
		if ($params){
			$params  = $this->__calcula($params);
		}
		return $params;
	}
	
	public function save($dados){
		$params = $this->__beforeSave($dados); 
		
		if (is_array($params)){
		    $Model_Lf004ItensSegurados = new Safra13_Model_Lf004ItensSegurados();
		    
		    $this->getDefaultAdapter()->beginTransaction();
		    
		    $idLaudoFinalItemSegurado = $Model_Lf004ItensSegurados->save($params);
		    
		    if($idLaudoFinalItemSegurado){
		    	try {
	    		    $this->delete($idLaudoFinalItemSegurado, 'id_laudo_final_item_segurado');
	    		    
	    		    foreach ($params["amostras"] as $amostra){
	    		    	$values = $amostra;
	    		    	$values["id_laudo_final_item_segurado"] = $idLaudoFinalItemSegurado;
	    		    	$this->insert($values);
	    		    }
	    		    
	    		    $this->getDefaultAdapter()->commit();
	    		    
	    		    $this->setMessage("Operação realizada com sucesso.");
	    		    
	    			return $idLaudoFinalItemSegurado;
	    			
	    		} catch (Exception $e) {
	    		    $this->getDefaultAdapter()->rollBack();
	    			$this->setMessage($e->getMessage().'<br><pre>'.$e->getTraceAsString().'</pre>');
	    		    return false;
	    		}
		    } else {
		    	$this->getDefaultAdapter()->rollBack();
		    	$this->setMessage($Model_Lf004ItensSegurados->getMessages());
		        return false;
		    }
		} else {
			return false;
		}
	}
	
	public function montaArray($dados){
		$params = array(
			"id_laudo_final_item_segurado" 				=> $dados["id_laudo_final_item_segurado"],
			"id_laudo_final" 							=> $dados["id_laudo_final"],
			"id_item_segurado" 							=> $dados["id_item_segurado"],
		    "id_proposta" 								=> $dados["id_proposta"],
		    "id_processo" 								=> $dados["id_processo"],
            "id_cobertura"                              => $dados["id_cobertura"],
            "id_vistoria"                               => $dados["id_vistoria"],
            "fl_vistoria_preliminar"                    => $dados["fl_vistoria_preliminar"],
		    "dt_vistoria_data" 							=> $dados["dt_vistoria_data"],
		    "dt_vistoria_hora" 							=> $dados["dt_vistoria_hora"],
		    "dt_vistoria_minutos" 						=> $dados["dt_vistoria_minutos"],
		    "vl_area_sinistrada" 						=> $dados["vl_area_sinistrada"],
		    "vl_percent_colhido" 						=> $dados["vl_percent_colhido"],
		    "vl_percent_perdas" 						=> $dados["vl_percent_perdas"],
	    	"ds_coordenadas_geograficas" 				=> $dados["ds_coordenadas_geograficas"],
		    "dt_vistoria" 								=> Agro_Util::joinDtVistoria($dados["dt_vistoria_data"], $dados["dt_vistoria_hora"], $dados["dt_vistoria_minutos"]),
			"vistoriadores"			 					=> $dados["vistoriadores"],
			"fl_area_atingiada_geada_outros_eventos" 	=> $dados["fl_area_atingiada_geada_outros_eventos"],
			"vl_qtd_hectares_atingidos_outros_eventos" 	=> $dados["vl_qtd_hectares_atingidos_outros_eventos"],
			"id_estadio_fenologico" 					=> $dados["id_estadio_fenologico"],
			"vl_percentual_danos_colmos" 				=> ($dados["fl_amostragem_apos_espigamento"] ? $dados["vl_percentual_danos_colmos_2"] : $dados["vl_percentual_danos_colmos_1"]) ,
			"vl_perda_parcial" 							=> $dados["vl_perda_parcial"],
			"fl_amostragem_apos_espigamento" 			=> $dados["fl_amostragem_apos_espigamento"],
			"nr_somatorio_plantas_perfilhos_total" 		=> $dados["nr_somatorio_plantas_perfilhos_total"],
			"nr_somatorio_plantas_perfilhos_destruidos" => $dados["nr_somatorio_plantas_perfilhos_destruidos"],
			"vl_somatorio_media_percentual_danos_aux1" 	=> $dados["vl_somatorio_media_percentual_danos_aux1"],
			"vl_somatorio_media_percentual_danos_aux2" 	=> $dados["vl_somatorio_media_percentual_danos_aux2"],
			"fl_avalia_danos_anteriores"				=> $dados["fl_avalia_danos_anteriores"],
			"ds_observacao"								=> $dados["ds_observacao"],
		    "avisos_relacionados"						=> $dados["avisos_relacionados"],
			"fl_assinatura_segurado" 			=> $dados["fl_assinatura_segurado"],
		    "fl_assinatura_regulador" 			=> $dados["fl_assinatura_regulador"],	
			"amostras"									=> array()
		);
		
		for ($i=1;$i<=10;$i++){
			if ($dados["fl_amostragem_apos_espigamento"]){
				$params["amostras"][$i] = array(
					"id_laudo_final_item_segurado" => null,
					"nr_amostra" => $i,
					"nr_plantas_perfilhos_total" => null,
					"nr_plantas_perfilhos_destruidos" => null,
					"vl_media_percentual_danos_aux1" => ($dados["vl_media_percentual_danos_aux1_$i"] ? $dados["vl_media_percentual_danos_aux1_$i"] : null),
					"vl_media_percentual_danos_aux2" => ($dados["vl_media_percentual_danos_aux2_$i"] ? $dados["vl_media_percentual_danos_aux2_$i"] : null)
				);	
			} else {
				$params["amostras"][$i] = array(
					"id_laudo_final_item_segurado" => null,
					"nr_amostra" => $i,
					"nr_plantas_perfilhos_total" => ($dados["nr_plantas_perfilhos_total_$i"] ? $dados["nr_plantas_perfilhos_total_$i"] : null),
					"nr_plantas_perfilhos_destruidos" => ($dados["nr_plantas_perfilhos_destruidos_$i"] ? $dados["nr_plantas_perfilhos_destruidos_$i"] : null),
					"vl_media_percentual_danos_aux1" => null,
					"vl_media_percentual_danos_aux2" => null
				);
			}
		}
	
		return $params;
	}
	
	public function __valida($dados){
		$result = $dados;
		
        $Model_Vistorias = new Sinistro_Model_VistoriasAvisos();
        $dtVistoria = new Zend_Date($dados['dt_vistoria_data'].' '.$dados['dt_vistoria_hora'].':'.$dados['dt_vistoria_minutos'], 'dd/MM/yyyy HH:mm');
        if (!$Model_Vistorias->verifyVistoriaFinalAvisos($dados['id_proposta'], $dados['id_vistoria'], $dtVistoria->toString('yyyy-MM-dd HH:mm'), $dados['id_cobertura'])) {
            $this->setMessage("Não existe sinistro disponível anterior a data de vistoria informada");
            $result = false;
        }
        
        // Caso o produto/cobertura possua vistoria preliminar, verifica se a data de vistoria informada está de acordo com o período da vistoria
        if ($dados['fl_vistoria_preliminar']) {
            $Model_LaudosFinaisItensSegurados = new Sinistro_Model_LaudosFinaisItensSegurados();
            $periodoVistoria = $Model_LaudosFinaisItensSegurados->getMinMaxDtVistoriaByIdLaudoFinal($dados['id_laudo_final'], $dados['id_laudo_final_item_segurado']);
            
            if ($periodoVistoria['min_dt_vistoria'] || $periodoVistoria['max_dt_vistoria']) {
                if ($periodoVistoria['min_dt_vistoria']) {
                    
                    $min_dt_vistoria = new Zend_Date($periodoVistoria['min_dt_vistoria'], 'yyyy-MM-dd HH:mm');
                    if ($min_dt_vistoria->isEarlier($dtVistoria)) {
                        $diff = ($dtVistoria->getTimestamp() - $min_dt_vistoria->getTimestamp()) / (3600 * 24);
                        if ($diff > 4) {
                            $this->setMessage("Data de vistoria fora do período para esta vistoria. Insira uma nova vistoria para este item.");
                            $result = false;
                        }
                    }
                }
                
                if ($periodoVistoria['max_dt_vistoria']) {
                    $max_dt_vistoria = new Zend_Date($periodoVistoria['max_dt_vistoria'], 'yyyy-MM-dd HH:mm');
                    if ($max_dt_vistoria->isLater($dtVistoria)) {
                        $diff = ($max_dt_vistoria->getTimestamp() - $dtVistoria->getTimestamp()) / (3600 * 24);
                        if ($diff > 4) {
                            $this->setMessage("Data de vistoria fora do período para esta vistoria. Insira uma nova vistoria para este item.");
                            $result = false;
                        }
                    }
                }
                
            }
        }
		
		$ModelIS = new Seguro_Model_ItensSegurados();
		$IS = $ModelIS->find($dados["id_item_segurado"])->current();
		
		if (!is_array($dados["vistoriadores"])){
			$this->setMessage("É necessário selecionar ao menos 1 vistoriador");
			$result = false;
		}
		
		if (!$dados["vl_area_sinistrada"]){
			$this->setMessage("A área sinistrada é de preenchimento obrigatório");
			$result = false;
			
		} else {
			if ($dados["vl_area_sinistrada"] > $IS->vl_area){
				$this->setMessage("A área sinistrada não pode ser superior a área total da quadra");
				$result = false;
			}
		}

		if (!$dados["vl_percent_colhido"]){
			$this->setMessage("Percentual colhido é de preenchimento obrigatório");
			$result = false;
		}
		
		if (!$dados["ds_coordenadas_geograficas"]){
			$this->setMessage("Coordenadas geográficas são de preenchimento obrigatório");
			$result = false;
		}
		
		if ($dados["fl_amostragem_apos_espigamento"]){
			for ($i = 0; $i <= 10; $i++) {
				if ($dados["amostras"][$i]["vl_media_percentual_danos_aux1"]){
					if ($dados["amostras"][$i]["vl_media_percentual_danos_aux1"] < 0 || $dados["amostras"][$i]["vl_media_percentual_danos_aux1"] > 100){
						$this->setMessage("A média por espigas destruidas da amostra $i possui valor inválido. O valor deve estar entre 0 e 100.");
						$result = false;	
					}		
				}

				if ($dados["amostras"][$i]["vl_media_percentual_danos_aux2"]){
					if ($dados["amostras"][$i]["vl_media_percentual_danos_aux2"] < 0 || $dados["amostras"][$i]["vl_media_percentual_danos_aux2"] > 100){
						$this->setMessage("A média por grão chocho da amostra $i possui valor inválido. O valor deve estar entre 0 e 100.");
						$result = false;
					}
				}
			}
		} else {
			$total = 0;
			$destruidas = 0;
			
			for ($i = 1; $i <= 10; $i++) {
				if($dados["amostras"][$i]["nr_plantas_perfilhos_total"] > 0){
					$total += $dados["amostras"][$i]["nr_plantas_perfilhos_total"]; 
				}
				
				if($dados["amostras"][$i]["nr_plantas_perfilhos_destruidos"] > 0){
					$destruidas += $dados["amostras"][$i]["nr_plantas_perfilhos_destruidos"];
				}
			}
			
			if ($destruidas > $total){
				$this->setMessage("A soma dos destruidos deve ser inferior ao total.");
				$result = false;
			}
		}

		if ($dados["vl_percentual_danos_colmos"] < 0 || $dados["vl_percentual_danos_colmos"] > 10){
			$this->setMessage("O percentual de dano nos colmos deve estar entre 0 e 10");
			$result = false;
		}
		
		return $result;
		
	}
	
	public function __calcula($dados){
		if ($dados["fl_amostragem_apos_espigamento"]){
			
			$countAux1 = 0;
			$countAux2 = 0;
			
			$dados["vl_somatorio_media_percentual_danos_aux1"] = 0;
			$dados["vl_somatorio_media_percentual_danos_aux2"] = 0;
			
			for ($i = 1; $i <= 10; $i++) {
				if($dados["amostras"][$i]["vl_media_percentual_danos_aux1"] != null){
					$dados["vl_somatorio_media_percentual_danos_aux1"] += $dados["amostras"][$i]["vl_media_percentual_danos_aux1"];
					$countAux1++;					
				}
				
				if($dados["amostras"][$i]["vl_media_percentual_danos_aux2"] != null){
					$dados["vl_somatorio_media_percentual_danos_aux2"] += $dados["amostras"][$i]["vl_media_percentual_danos_aux2"];
					$countAux2++;
				}
			}
			
			$dados["vl_somatorio_media_percentual_danos_aux1"] = ($countAux1 > 0 ? $dados["vl_somatorio_media_percentual_danos_aux1"]/$countAux1 : 0);
			$dados["vl_somatorio_media_percentual_danos_aux2"] = ($countAux2 > 0 ? $dados["vl_somatorio_media_percentual_danos_aux2"]/$countAux2 : 0);
			
			if ($dados["vl_somatorio_media_percentual_danos_aux1"] <= 0){
				$dados["vl_perda_parcial"] = 0;
				
			} else {
				$dados["vl_perda_parcial"] = $dados["vl_somatorio_media_percentual_danos_aux1"];

				$remanecente = 100 - $dados["vl_somatorio_media_percentual_danos_aux1"];
				
				$dados["vl_perda_parcial"] += ($remanecente * $dados["vl_percentual_danos_colmos"])/100;
			}
			
			$remanecente = 100 - $dados["vl_perda_parcial"];
			$dados["vl_percent_perdas"] = $dados["vl_perda_parcial"] + (($remanecente * $dados["vl_somatorio_media_percentual_danos_aux2"])/100);
					
		} else {
			$dados["nr_somatorio_plantas_perfilhos_total"] = 0;
			$dados["nr_somatorio_plantas_perfilhos_destruidos"] = 0;
			
			for ($i = 1; $i <= 10; $i++) {
				if($dados["amostras"][$i]["nr_plantas_perfilhos_total"] >= 0){
					$dados["nr_somatorio_plantas_perfilhos_total"] += $dados["amostras"][$i]["nr_plantas_perfilhos_total"]; 
				}
				
				if($dados["amostras"][$i]["nr_plantas_perfilhos_destruidos"] >= 0){
					$dados["nr_somatorio_plantas_perfilhos_destruidos"] += $dados["amostras"][$i]["nr_plantas_perfilhos_destruidos"];
				}
			}
			
			if ($dados["nr_somatorio_plantas_perfilhos_total"] <= 0){
				$dados["vl_percent_perdas"] = 0;
				
			} else {
				$div = $dados["nr_somatorio_plantas_perfilhos_destruidos"] / $dados["nr_somatorio_plantas_perfilhos_total"];
				
				$dados["vl_percent_perdas"] = $div;
							
				$dados["vl_percent_perdas"] +=  ((1 - $div) *$dados["vl_percentual_danos_colmos"])/100;
				
				$dados["vl_percent_perdas"] = $dados["vl_percent_perdas"]*100;
			}
			
		}
		
		return $dados;
	}
	
	public function get($idLaudoFinalItemSegurado) {
        $ModelLfIS = new Sinistro_Model_LaudosFinaisItensSegurados();
		$ModelIS = new Seguro_Model_ItensSegurados();
        try {
	        /*
			 * 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('fl_area_atingiada_geada_outros_eventos', 'vl_qtd_hectares_atingidos_outros_eventos', 'id_estadio_fenologico', 'vl_percentual_danos_colmos', 'vl_perda_parcial', 'fl_amostragem_apos_espigamento', 'nr_somatorio_plantas_perfilhos_total', 'nr_somatorio_plantas_perfilhos_destruidos', 'vl_somatorio_media_percentual_danos_aux1', 'vl_somatorio_media_percentual_danos_aux2'));
    	        $select->where('id_laudo_final_item_segurado = ?', $idLaudoFinalItemSegurado);

    	        $Row = $this->fetchRow($select);
    	        
    	        if ($Row){
    	        	$dados = array_merge($dados, $Row->toArray());
    	        }
            }
	        
	        /*
	         * Busca Amostras
	         */
	        if (!$dados['fl_nao_vistoriada']) {
                $dados["amostras"] = array();
                
                $amostras = $this->fetchAll("id_laudo_final_item_segurado = $idLaudoFinalItemSegurado")->toArray();
                
                foreach ($amostras as $amostra){
                	$dados["amostras"][$amostra["nr_amostra"]] = $amostra;
                }
            }
	        
	        return $dados;
 	
        } catch (Exception $e) {
        	die($e->getMessage());
        }
	}
}