<?php
/**
 * @name Safra13_Model_Lf002ItensSeguradosAmostras
 * @desc Model das amostras do Laudo final Itens Segurados Tipo LF002 / Safra13 
 * @author Vinicius Marconi Vasconcelos Berni
 * @since 19/05/2011
 * @see Agro_Db_Table_Abstract
 */
class Safra13_Model_Lf002ItensSeguradosAmostras extends Agro_Db_Table_Abstract {
	protected $_schema 	= 'safra13';
	protected $_name 	= 'lf002_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_Lf002ItensSegurados = new Safra13_Model_Lf002ItensSegurados();
		    
		    $idLaudoFinalItemSegurado = $Model_Lf002ItensSegurados->save($params);
		    
		    if($idLaudoFinalItemSegurado){
	    		$this->getDefaultAdapter()->beginTransaction();
		    	
		    	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) {
	    			die($e->getMessage());
	    			
	    		    $this->getDefaultAdapter()->rollBack();
	    			$this->setMessage($e->getMessage().'<br><pre>'.$e->getTraceAsString().'</pre>');
	    		    return false;
	    		}
		    } else {
		    	$this->setMessage($Model_Lf002ItensSegurados->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"],
		    "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"],
		    "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"],
		    "vl_tamanho_planta" 				=> $dados["vl_tamanho_planta"],
		    "id_estadio_fenologico" 			=> $dados["id_estadio_fenologico"],
		    "fl_amostragem_apos_espigamento"	=> ($dados["fl_amostragem_apos_espigamento"] ? 1 : 0),
		    "vl_desfolhamento"					=> $dados["vl_desfolhamento"],
		    "vl_desfolhamento_tabela"			=> $dados["vl_desfolhamento_tabela"],
		    "vl_colmos_danificados"				=> $dados["vl_colmos_danificados"],
		    "vl_colmos_danificados_tabela"		=> $dados["vl_colmos_danificados_tabela"],
		    "vl_percent_perdas"					=> ($dados["vl_percent_perdas"] ? $dados["vl_percent_perdas"] : 0),
		    "ds_aspecto_geral_cultura"			=> $dados["ds_aspecto_geral_cultura"],
		    "ds_observacao"						=> $dados["ds_observacao"],
		    "fl_avalia_danos_anteriores"		=> $dados["fl_avalia_danos_anteriores"],
		    "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_perfilhos_total" => null,
					"nr_perfilhos_destruidos" => null,
					"vl_percent_media_danos" => ($dados["vl_percent_media_danos_$i"] ? $dados["vl_percent_media_danos_$i"] : null),
				);	
			} else {
				$params["amostras"][$i] = array(
					"id_laudo_final_item_segurado" => null,
					"nr_amostra" => $i,
					"nr_perfilhos_total" => ($dados["nr_perfilhos_total_$i"] ? $dados["nr_perfilhos_total_$i"] : null),
					"nr_perfilhos_destruidos" => ($dados["nr_perfilhos_destruidos_$i"] ? $dados["nr_perfilhos_destruidos_$i"] : null),
					"vl_percent_media_danos" => null,
				);
			}
		}
		return $params;
	}
	
	public function __valida($params){
		$dados = $params;
		
		$message = array();
		$message[] = "O formulário contém erros. Segue:";
		
		$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;
		}				

		if(!$dados["vl_area_sinistrada"]){
			$message[] = "O preenchimento da área sinistrada é obrigatório.";
			
		} else {
			$ModelIS = new Seguro_Model_ItensSegurados();
			$IS = $ModelIS->find($dados["id_item_segurado"])->current();
			
			if ($dados["vl_area_sinistrada"] > $IS->vl_area){
				$message[] = "A área sinistrada não pode ser superior à área do talhão.";
			}
		}
		
		if ($dados["fl_amostragem_apos_espigamento"]){
			for ($i = 1; $i < 10; $i++) {
				if ($dados["amostras"][$i]["vl_percent_media_danos"]){
					if ($dados["amostras"][$i]["vl_percent_media_danos"] < 0 || $dados["amostras"][$i]["vl_percent_media_danos"] > 100){
						$message[] = "A amostras $i possui valor inválido. O valor deve está entre 0 e 100";
					}
				}
			}
			
		} else {
			for ($i = 1; $i < 10; $i++) {
				if ($dados["amostras"][$i]["nr_perfilhos_total"]){
					if ($dados["amostras"][$i]["nr_perfilhos_destruidos"] > $dados["amostras"][$i]["nr_perfilhos_total"]){
						$message[] = "A amostras $i possui valor inválido. O percentual destruido não pode ser superior ao total";
					}
				}
			}
		}
		
		if (count($message) > 1){
			$this->setMessage($message);
			$dados = false;
		}
		
		return $dados;
	}
	
	public function __calcula($params){
		$dados = $params;
		
		$TabelaAuxiliar = new Safra13_Model_Lf002Auxiliar();
		
		$dados["vl_desfolhamento_tabela"] = $TabelaAuxiliar->get($dados["id_estadio_fenologico"], $dados["vl_desfolhamento"], true);
		$dados["vl_colmos_danificados_tabela"] = $TabelaAuxiliar->get($dados["id_estadio_fenologico"], $dados["vl_colmos_danificados"], false);
		
		$dados["nr_somatorio_perfilhos_total"] = 0.0;
		$dados["nr_somatorio_perfilhos_destruidos"] = 0.0;
		$dados["vl_media_percent_media_danos"] = 0.0;
		$somatorio_vl_percent_media_danos = 0.0;
		$countAmostras = 0;
		
		for ($i=1;$i<=10;$i++){
			$dados["nr_somatorio_perfilhos_total"] += ($params["amostras"][$i]["nr_perfilhos_total"] > 0 ? $params["amostras"][$i]["nr_perfilhos_total"] : 0);
			$dados["nr_somatorio_perfilhos_destruidos"] += ($params["amostras"][$i]["nr_perfilhos_destruidos"] > 0 ? $params["amostras"][$i]["nr_perfilhos_destruidos"] : 0);
			
			if ($params["amostras"][$i]["vl_percent_media_danos"] != null) {
				$countAmostras++;
				$somatorio_vl_percent_media_danos += $params["amostras"][$i]["vl_percent_media_danos"];
			}
		}
	
		if ($countAmostras){
			$dados["vl_media_percent_media_danos"] = number_format(($somatorio_vl_percent_media_danos/$countAmostras), 2);
		}
		
		$dados["nr_somatorio_perfilhos_total"] = number_format($dados["nr_somatorio_perfilhos_total"], 2);
		$dados["nr_somatorio_perfilhos_destruidos"] = number_format($dados["nr_somatorio_perfilhos_destruidos"], 2);
		
		if ($dados["fl_amostragem_apos_espigamento"]){
			
			if ($dados["vl_media_percent_media_danos"] <= 0){
				$dados["vl_percent_perdas"] = 0;
			} else {
				$dados["vl_percent_perdas"] = $dados["vl_media_percent_media_danos"];				
				$dados["vl_percent_perdas"] += number_format((1-($dados["vl_media_percent_media_danos"]/100)) * ($dados["vl_desfolhamento_tabela"]), 4);				
				$dados["vl_percent_perdas"] += number_format((1-($dados["vl_media_percent_media_danos"]/100)) * (1-($dados["vl_desfolhamento_tabela"]/100)) * ($dados["vl_colmos_danificados_tabela"]), 4);				
			}
		} else {
			if($dados["nr_somatorio_perfilhos_total"] > 0){
				$remanecente = 1;
				
				$dados["vl_percent_perdas"] = $dados["nr_somatorio_perfilhos_destruidos"]/$dados["nr_somatorio_perfilhos_total"];
				
				$remanecente -= $dados["vl_percent_perdas"];
				
				$parcial = ($remanecente * $dados["vl_desfolhamento_tabela"])/100;
				
				$remanecente -= $parcial;
				
				$dados["vl_percent_perdas"] += $parcial;
				
				$parcial = ($remanecente * $dados["vl_colmos_danificados_tabela"])/100;
				
				$dados["vl_percent_perdas"] += $parcial;
				
				$dados["vl_percent_perdas"] = number_format($dados["vl_percent_perdas"] * 100, 4); 
 
			} else {
				$dados["vl_percent_perdas"] = 0;
			}
		}
		
		$dados["vl_percent_perdas"] = number_format($dados["vl_percent_perdas"], 2);
		$dados["nr_somatorio_perfilhos_total"] = number_format($dados["nr_somatorio_perfilhos_total"],2);
		$dados["nr_somatorio_perfilhos_destruidos"] = number_format($dados["nr_somatorio_perfilhos_destruidos"],2);
		
		return $dados;
	}
	
	public function get($idLaudoFinalItemSegurado) {
        $ModelLfIS = new Sinistro_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.lf002_itens_segurados") , array('vl_tamanho_planta', 'id_estadio_fenologico', 'fl_amostragem_apos_espigamento', 'vl_desfolhamento', 'vl_desfolhamento_tabela', 'vl_colmos_danificados', 'vl_colmos_danificados_tabela', 'ds_aspecto_geral_cultura', 'nr_somatorio_perfilhos_total', 'nr_somatorio_perfilhos_destruidos', 'vl_media_percent_media_danos'));
            $select->where('id_laudo_final_item_segurado = ?', $idLaudoFinalItemSegurado);
            
            $Rs = $this->fetchRow($select);
            
            if($Rs){
            	$dados = array_merge($dados, $Rs->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;
    }
}