<?php
/**
 * @name Safra12_Model_Lf002ItensSeguradosAmostras
 * @desc Model das amostras do Laudo final Itens Segurados Tipo LF003 / Safra12 
 * @author Vinicius Marconi Vasconcelos Berni
 * @since 27/04/2011 16:17
 * @see Agro_Db_Table_Abstract
 */
class Safra12_Model_Lf003ItensSeguradosAmostras extends Agro_Db_Table_Abstract {
	protected $_schema 	= 'safra12';
	protected $_name 	= 'lf003_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_Lf003ItensSegurados = new Safra12_Model_Lf003ItensSegurados();
		    
		    $idLaudoFinalItemSegurado = $Model_Lf003ItensSegurados->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) {
	    		    $this->getDefaultAdapter()->rollBack();
	    			$this->setMessage($e->getMessage().'<br><pre>'.$e->getTraceAsString().'</pre>');
	    		    return false;
	    		}
		    } else {
		    	$this->setMessage($Model_Lf003ItensSegurados->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"],
		    "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"]),
		    "fl_amostragem_maquina" 		=> $dados["fl_amostragem_maquina"],
		    "ds_observacao" 				=> $dados["ds_observacao"],
		    "fl_assinatura_segurado" 		=> $dados["fl_assinatura_segurado"],
		    "fl_assinatura_regulador" 		=> $dados["fl_assinatura_regulador"],
		    "vistoriadores" 				=> $dados["vistoriadores"],
			"vl_rendimento_final_lavoura" 	=> $dados["vl_rendimento_final_lavoura"],
			"fl_danos_nao_cobertos_pragas" 	=> ($dados["fl_danos_nao_cobertos_pragas"] ? 1 : 0),
			"fl_danos_nao_cobertos_doencas" => ($dados["fl_danos_nao_cobertos_doencas"] ? 1 : 0),
			"fl_danos_nao_cobertos_outros" 	=> ($dados["fl_danos_nao_cobertos_outros"] ? 1 : 0),
			"vl_danos_nao_cobertos" 		=> $dados["vl_danos_nao_cobertos"],
			"amostras"						=> array()
		);
	
		if ($params["fl_amostragem_maquina"]){
			$params["amostras"][1] = array(
				"id_laudo_final_item_segurado" => 0,
				"nr_amostra" => 1,
				"vl_espacamento_entre_linhas" => null,
				"vl_metros_linhas_colhidos" => null,
				"vl_producao_colhida_amostra" => $dados["vl_producao_colhida_amostra"],
				"vl_producao_kilos_hectare" => 0,
				"vl_perda_colheita" => $dados["vl_perda_colheita"],
				"vl_umidade_graos" => $dados["vl_umidade_graos"],
				"vl_desconto_umidade_graos" => $dados["vl_desconto_umidade_graos"],
				"vl_producao_bruta" => null,
				"vl_desconto" => $dados["vl_desconto"],
				"vl_producao_liquida" => 0,
				"vl_area_colhida" => $dados["vl_area_colhida"],
				"vl_producao_kilos_hectare_com_perda" => 0,
				"vl_producao_bruta_kilos_hectare" => 0
			);
			
			$params["fl_amostragem_maquina"] = 1;
			
		} else {
			for ($i=1;$i<=10;$i++){
				if ($dados["vl_espacamento_entre_linhas_$i"] > 0){
					$params["amostras"][$i] = array(
						"id_laudo_final_item_segurado" => 0,
						"nr_amostra" => $i,
						"vl_espacamento_entre_linhas" => $dados["vl_espacamento_entre_linhas_$i"],
						"vl_metros_linhas_colhidos" => $dados["vl_metros_linhas_colhidos_$i"],
						"vl_producao_colhida_amostra" => $dados["vl_producao_colhida_amostra_$i"],
						"vl_producao_kilos_hectare" => $dados["vl_producao_kilos_hectare_$i"],
						"vl_perda_colheita" => null,
						"vl_umidade_graos" => $dados["vl_umidade_graos_$i"],
						"vl_desconto_umidade_graos" => $dados["vl_desconto_umidade_graos_$i"],
						"vl_producao_bruta" => $dados["vl_producao_bruta_$i"],
						"vl_desconto" => $dados["vl_desconto_$i"],
						"vl_producao_liquida" => $dados["vl_producao_liquida_$i"],
						"vl_area_colhida" => null,
						"vl_producao_kilos_hectare_com_perda" => null,
						"vl_producao_bruta_kilos_hectare" => $dados["vl_producao_bruta_kilos_hectare_$i"],
					);
				}
			}
			
			$params["fl_amostragem_maquina"] = 0;
		}
		
		return $params;
	}
	
	public function __valida($dados){
		$result = $dados;
		
		if (!is_array($dados["vistoriadores"])){
			$this->setMessage("É necessário selecionar ao menos 1 vistoriador");
			$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_maquina"]){		
			
			$campos = array(
				"vl_espacamento_entre_linhas" => "Espaçamento entre linhas",
				"vl_metros_linhas_colhidos" => "Metros de linha colhidos",
				"vl_producao_colhida_amostra" => "Produção colhida na amostra",
				"vl_umidade_graos" => "Umidade dos grãos",
				"vl_desconto_umidade_graos" => "Desconto de umidade",
				"vl_desconto" => "Desconto"
			);
			
			foreach ($dados["amostras"] as $amostra){
				$campos_vazios = array();
				
				if ($amostra["vl_espacamento_entre_linhas"] > 0){
					foreach ($campos as $key => $label){
						if(!$amostra[$key]){
							$campos_vazios[] = $campos[$key];
						}
					}	
				}
				
				if (count($campos_vazios)){
					$this->setMessage("Amostra {$amostra["nr_amostra"]}, campos não preenchidos:<ul><li>".implode("</li><li>", $campos_vazios)."</li></ul>");
					$result=false;
				}
			}
			
		} else {
			$campos = array(
				"vl_area_colhida" => "Área Colhida (ha)",
				"vl_producao_colhida_amostra" => "Produção colhida na amostra",
				"vl_perda_colheita" => "Perda de colheita (%)",
				"vl_umidade_graos" => "Umidade dos Graos (%)",
				"vl_desconto_umidade_graos" => "Desconto de umidade",
				"vl_desconto" => "Desconto (%)"
			);
			
			foreach ($campos as $key => $label){
				if (!$dados["amostras"][1][$key]){
					$this->setMessage("O campo '{$campos[$key]}' é de preenchimento obrigatório.");
					$result=false;
				}
			}
		}
		
		if (!$dados["vl_danos_nao_cobertos"]){
			$this->setMessage("Percentual de danos não cobertos é de preenchimento obrigatório");
			$result = false;
		}
		
		return $result;
		
	}
	
	public function __calcula($dados){
		if ($dados["fl_amostragem_maquina"]){
			
			if ($dados["amostras"][1]["vl_area_colhida"] > 0){
				if($dados["amostras"][1]["vl_area_colhida"] > 0){
					$dados["amostras"][1]["vl_producao_kilos_hectare"] = $dados["amostras"][1]["vl_producao_colhida_amostra"] / $dados["amostras"][1]["vl_area_colhida"];
				} else {
					$dados["amostras"][1]["vl_producao_kilos_hectare"] = $dados["amostras"][1]["vl_producao_colhida_amostra"];
				}
				
			} else {
				$dados["amostras"][1]["vl_producao_kilos_hectare"] = 0;
			}
			
			$dados["amostras"][1]["vl_producao_kilos_hectare_com_perda"] = ($dados["amostras"][1]["vl_producao_kilos_hectare"] > 0 ? ($dados["amostras"][1]["vl_perda_colheita"] < 3 ? $dados["amostras"][1]["vl_producao_kilos_hectare"] : ($dados["amostras"][1]["vl_producao_kilos_hectare"] * ((100 + ($dados["amostras"][1]["vl_perda_colheita"] - 3)) / 100))) : 0);
			
			if ($dados["amostras"][1]["vl_producao_kilos_hectare_com_perda"] > 0){
				$dados["amostras"][1]["vl_producao_bruta_kilos_hectare"] = $dados["amostras"][1]["vl_producao_kilos_hectare_com_perda"];
				
				if ($dados["amostras"][1]["vl_desconto_umidade_graos"] > 0){
					$dados["amostras"][1]["vl_producao_bruta_kilos_hectare"] -= ($dados["amostras"][1]["vl_producao_kilos_hectare_com_perda"] * $dados["amostras"][1]["vl_desconto_umidade_graos"])/100; 
				}
			} else {
				$dados["amostras"][1]["vl_producao_bruta_kilos_hectare"] = 0;
			}
			
			if ($dados["amostras"][1]["vl_producao_bruta_kilos_hectare"] > 0){
				$dados["amostras"][1]["vl_producao_liquida"] = $dados["amostras"][1]["vl_producao_bruta_kilos_hectare"];
				
				if ($dados["amostras"][1]["vl_desconto"] > 0){
					$dados["amostras"][1]["vl_producao_liquida"] -= ($dados["amostras"][1]["vl_producao_bruta_kilos_hectare"] * $dados["amostras"][1]["vl_desconto"]) / 100;	
				}
				
			} else {
				$dados["amostras"][1]["vl_producao_liquida"] = 0;
			}

			$dados["vl_rendimento_final_lavoura"] = ($dados["amostras"][1]["vl_producao_liquida"] ? round(($dados["amostras"][1]["vl_producao_liquida"] / 1000), 3) : null);
		
		} else {
			for ($i=1;$i <= count($dados["amostras"]);$i++){
				$dados["amostras"][$i]["vl_producao_kilos_hectare"] = ($dados["amostras"][$i]["vl_espacamento_entre_linhas"] > 0 ? (($dados["amostras"][$i]["vl_producao_colhida_amostra"] * 1000)/($dados["amostras"][$i]["vl_espacamento_entre_linhas"] * ($dados["amostras"][$i]["vl_metros_linhas_colhidos"] > 0 ? $dados["amostras"][$i]["vl_metros_linhas_colhidos"] : 1))*10) : 0);
				$dados["amostras"][$i]["vl_perda_colheita"] = ($dados["amostras"][$i]["vl_producao_kilos_hectare"] > 0 ? ($dados["amostras"][$i]["vl_producao_kilos_hectare"] * 0.97) : 0);
				$dados["amostras"][$i]["vl_producao_bruta_kilos_hectare"] = ($dados["amostras"][$i]["vl_espacamento_entre_linhas"] > 0 ? ($dados["amostras"][$i]["vl_perda_colheita"] - ($dados["amostras"][$i]["vl_perda_colheita"] * ($dados["amostras"][$i]["vl_desconto_umidade_graos"] / 100))) : 0);
				
				if($dados["amostras"][$i]["vl_espacamento_entre_linhas"] > 0){
					$dados["amostras"][$i]["vl_producao_liquida"] = $dados["amostras"][$i]["vl_producao_bruta_kilos_hectare"];
					
					if ($dados["amostras"][$i]["vl_desconto"]){
						$dados["amostras"][$i]["vl_producao_liquida"] -= ($dados["amostras"][$i]["vl_producao_bruta_kilos_hectare"] * $dados["amostras"][$i]["vl_desconto"]) / 100; 
					}
					
				} else {
					$dados["amostras"][$i]["vl_producao_liquida"] = 0;
				}				  				
			}
			
			if ($dados["amostras"][1]["vl_espacamento_entre_linhas"] > 0){
				$rendimento = 0.0;
				
				$total_producao_liquida = $this->__somaAmostra("vl_producao_liquida", $dados); 
				
				if ($total_producao_liquida["valor"] > 0){
					$rendimento = ($total_producao_liquida["valor"] / $total_producao_liquida["count"]) / 1000;
				}
				
				$dados["vl_rendimento_final_lavoura"] = round($rendimento, 3);
			} else {
				$dados["vl_rendimento_final_lavoura"] = null;	
			}
		}		
		return $dados;
	}
	
	public function __somaAmostra($nomeAmostra, $dados){
		$somatorio = array(
			"valor" => 0.0,
			"count" => 0
		);
		
		for($i=1;$i<=10;$i++){
			if ($dados["amostras"][$i][$nomeAmostra]){
				$somatorio["valor"] += $dados["amostras"][$i][$nomeAmostra];
				$somatorio["count"] += 1;
			}
		}
		
		return $somatorio;
	}
	
	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
		 */		
		$select = $this->select()->setIntegrityCheck(false);
        $select->from(array("lfisX" => "$this->_schema.lf003_itens_segurados") , array('fl_amostragem_maquina', 'fl_danos_nao_cobertos_pragas', 'fl_danos_nao_cobertos_doencas', 'fl_danos_nao_cobertos_outros', 'vl_danos_nao_cobertos'));
        $select->where('id_laudo_final_item_segurado = ?', $idLaudoFinalItemSegurado);
        
        $dados = array_merge($dados, $this->fetchRow($select)->toArray());
		
        /*
         * Busca Amostras
         */
        $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;
    }
}