<?
/**
 * Controller
 * 
 * Laudo final Tipo LF014 / Safra14 - Item Segurado
 * 
 * @author Samir Ortiz
 * @date 14/02/2012
 *
 */
class Safra14_Lf014itemseguradoController extends Agro_Controller_Action{

	public function init() {
		$this->view->title = 'Sinistro » Processos » Laudo Final » Totalização de Perdas';
	}
	
	public function getModel() {
	    return new Safra14_Model_Lf014ItensSeguradosAmostras();
	}

    public function getModelLf014ItensSegurados() {
        return new Safra14_Model_Lf014ItensSegurados();
    }   
    
	public function getForm($dados = array()) {
	    return new Sinistro_Form_LaudoFinalItemSegurado(array('dados'=>$dados));
	}	
    
    public function formAction() {
        $params = $this->getRequest()->getParams();
		
		$dadosForm = array();
		
		$arAmostras = array();
		
		$dadosForm['id_laudo_final'] = $params['id_laudo_final'];
		$dadosForm['id_item_segurado'] = $params['id_item_segurado'];
		
        $ProcessosEmpresas = new Sinistro_Model_ProcessosEmpresas();
        $dadosForm['id_empresa_vistoriadora'] = $ProcessosEmpresas->getEmpresaByProcesso($params['id_processo']);
        
		$this->view->jQuery()->addJavascriptFile('/resources/javascript/sinistro/laudofinalitemsegurado.js');
        $this->view->jQuery()->addStylesheet('/resources/css/sinistro/laudo.css');
		
		$Cultura = new Produto_Model_Culturas();
		$dadosForm['id_cultura'] = $Cultura->getCulturaByProposta($params['id_proposta']);

		$this->view->id_cultura = $dadosForm['id_cultura'];
		$params['id_cultura'] = $dadosForm['id_cultura']; 
		$estadios = $this->getArrayEstadios($params['id_cultura']); 


		/*
		 * Verifica se já possui identificador para laudo final - item segurado. 
		 * Em caso positivo permite a edição do laudo, pois a Classificação de Frutos já foi informada.
		 * Em caso negativo, bloqueia os campos, pois a Classificação de Frutos ainda não foi informada, e exibe 
		 * mensagem informando que a Classificação deve ser informada.
		 */

		if ($params['id_laudo_final_item_segurado']) {
			$dadosForm['readonly'] = false;
		} else {
			$dadosForm['readonly'] = true;
			$this->view->showMessage('Informe a classificação de frutos antes de inserir o laudo final para esta quadra.', 'error');
		}

		// Configura paramentro para campo 'Área Sinistrada' ser um campo bloqueado apenas exibindo a área da quadra
		$dadosForm['fl_area_sinistrada_readonly'] = true;
        
        $Model = $this->getModel();
        $Form = $this->getForm($dadosForm);
		
        $this->view->back = '/'.$this->_request->module.'/lf014/form/id_laudo_final/'.$params['id_laudo_final']."/id_processo/".$params['id_processo'];
        
        if($this->getRequest()->isPost()) {
            $Form->populate($params);
			
			$TotalizacaoPerdas = $this->calculaTotalizacaoPerdas($params);
            
            if($Form->isValid($Form->getValues())) {
                
                Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
                
                $dados = $Form->getValues();
                
                $dados['dt_vistoria'] = Agro_Util::formatDate($dados['dt_vistoria_data'].' '.$dados['dt_vistoria_hora'].' '.$dados['dt_vistoria_minutos'], 'yyyy-MM-dd HH:mm:ss');
                
                if(count($TotalizacaoPerdas['amostras_validas']) == 0) {
                    $erros[] = 'Informe pelo menos uma amostra';
                    $this->view->showMessage($erros, 'error');
                } else {
                    
                    $dados = array_merge($TotalizacaoPerdas, $dados);
                    
                    $params['id_laudo_final_item_segurado'] = $Model->save($dados);
                    
                    if($params['id_laudo_final_item_segurado']) {
                        Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
                        $this->view->showMessage(MSG_SUCCESS,'success');
                    } else {
                        Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
                        $this->view->showMessage($Model->getMessages(), 'error');
                    }
                }
            } else {
                $this->view->showMessage($this->getAllFormErros(array($Form),$_POST), 'error');
				$arAmostras = $TotalizacaoPerdas['amostras_validas'];

            }
        }

        $this->view->data = array();
        $this->view->data['amostras'] = array();
        
		$Form->populate($params);        
        
        if($params['id_laudo_final_item_segurado']) {
            $Model_Lf014ItensSegurados = $this->getModelLf014ItensSegurados();
            
            $dataLf014ItensSegurados = $Model_Lf014ItensSegurados->getDataLaudoFinalItemSegurado($params['id_laudo_final_item_segurado']);
            
            if ($dataLf014ItensSegurados) {
                	$params = array_merge($dataLf014ItensSegurados, $params);
                	if($params['vl_percent_colhido'] == '0.00' || $params['vl_percent_colhido'] == ''){
						unset($params['fl_assinatura_segurado']);
						unset($params['fl_assinatura_regulador']);
                	}
                	$Form->populate($params);
 
            }
			
			if (count($arAmostras) > 0) {
				$this->view->data['amostras'] = $arAmostras;
			} else {
				$this->view->data['amostras'] = $Model->getAmostras($params['id_laudo_final_item_segurado']);
			}
            
        } else {
        	$Form->setReadOnly(true);
		}
       
		$this->view->form = $Form;
        
        $this->view->data['vl_percent_perdas'] = $params['vl_percent_perdas'];
        $this->view->data['vl_percent_perda_qualidade'] = $params['vl_percent_perda_qualidade'];
        $this->view->data['configuracoes'] = $this->getConfiguracoesPlanilhaTP($params['vl_percent_perda_qualidade'],$estadios);
    }
    
    public function calculaTotalizacaoPerdas($params) {

        $Configuracoes = $this->getConfiguracoesPlanilhaTP(null,$estadios);
        $data['amostras_validas'] = array();
        $somaPerdasAmostras = 0;
        
        for ($y = 1; $y <= $Configuracoes['nr_amostras']; $y++) {
            $flAmostraValida = false;
            $Amostra = array();
            
            if (
                is_numeric($params['id_estadio_fenologico'][$y])  &&
                is_numeric($params['vl_percent_plantas_mortas'][$y]) &&
                is_numeric($params['vl_percent_perda_producao_reducao_stand'][$y]) &&
                is_numeric($params['nr_total_frutos_produzidos_plantas'][$y]) &&
                is_numeric($params['nr_atual_frutos_plantas'][$y]) &&
                is_numeric($params['vl_percent_desfolhamento'][$y]) &&
                is_numeric($params['vl_percent_dano_bruto'][$y])
            ) {
                $flAmostraValida = true;
                
                $Amostra['id_estadio_fenologico'] = $params['id_estadio_fenologico'][$y];
                $Amostra['vl_percent_plantas_mortas'] = $params['vl_percent_plantas_mortas'][$y];
                $Amostra['vl_percent_perda_producao_reducao_stand'] = $params['vl_percent_perda_producao_reducao_stand'][$y];
                $Amostra['nr_total_frutos_produzidos_plantas'] = $params['nr_total_frutos_produzidos_plantas'][$y];
                $Amostra['nr_atual_frutos_plantas'] = $params['nr_atual_frutos_plantas'][$y];
                $Amostra['vl_percent_frutos_danificados'] = $params['vl_percent_frutos_danificados'][$y];
                $Amostra['vl_percent_desfolhamento'] = $params['vl_percent_desfolhamento'][$y];
                $Amostra['vl_percent_dano_bruto'] = $params['vl_percent_dano_bruto'][$y];
                
                // Cálculo População restante (%)
                $Amostra['vl_percent_populacao_restante'] = 100 - $Amostra['vl_percent_perda_producao_reducao_stand'];
                
                // Cálculo Produção representativa (%)
                if ($Amostra['nr_atual_frutos_plantas'] > 0 && $Amostra['nr_total_frutos_produzidos_plantas'] > 0) {
                	$Amostra['vl_percent_producao_representativa'] = round($Amostra['nr_atual_frutos_plantas'] / $Amostra['nr_total_frutos_produzidos_plantas'] * 100, 2);
				} else {
					$Amostra['vl_percent_producao_representativa'] = 0;
				}
                
                // Cálculo Total dano fruto (%)
                $Amostra['vl_percent_total_dano_fruto'] = round((($Amostra['vl_percent_populacao_restante']/100) * ($Amostra['vl_percent_producao_representativa']/100) * ($Amostra['vl_percent_frutos_danificados']/100)) * 100, 2);
                
                // Cálculo Total dano direto (%)
                $Amostra['vl_percent_total_dano_direto'] = $Amostra['vl_percent_perda_producao_reducao_stand'] + $Amostra['vl_percent_total_dano_fruto'];
                
                // Cálculo Capacidade produtiva restante (%)
                $Amostra['vl_percent_capacidade_produtiva_restante'] = 100 - $Amostra['vl_percent_total_dano_direto'];
                
                // Cálculo Dano (%)
                $Amostra['vl_percent_dano'] = round((($Amostra['vl_percent_dano_bruto']/100) * ($Amostra['vl_percent_capacidade_produtiva_restante']/100)) * 100, 2);
                
                // Cálculo Total dano granizo
                $Amostra['vl_percent_total_dano_granizo'] = $Amostra['vl_percent_total_dano_direto'] + $Amostra['vl_percent_dano'];

                $somaPerdasAmostras += $Amostra['vl_percent_total_dano_granizo'];
            }
            
            if ($flAmostraValida) {
                $data['amostras_validas'][$y] = $Amostra;
            }
        }
        
        if (count($data['amostras_validas']) > 0) {
            $data['vl_percent_perdas'] = round($somaPerdasAmostras / (count($data['amostras_validas'])), 2);
        }
        
        return $data;
    }
        
    public function getConfiguracoesPlanilhaTP($vlPercentPerdaQualidade = null, $estadios) {

        /*
         * Configurações da planilha de Totalização de Perdas
         */
        $Configuracoes = array();

        /*
         * Colunas
         */

        $Colunas = array();
        $Colunas[] = array(
            'nr_coluna'		    => 1,
            'ds_nome_campo'		=> 'id_estadio_fenologico',
            'ds_nome_exibicao'  => 'Estádio',
            'ds_tipo'			=> 'select',
            'ar_opcoes'			=> $estadios
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 2,
            'ds_nome_campo'		=> 'vl_percent_plantas_mortas',
            'ds_nome_exibicao'  => 'Plantas mortas (%)',
            'ds_tipo'			=> 'text',
            'ds_class'		    => 'decimal'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 3,
            'ds_nome_campo'		=> 'vl_percent_perda_producao_reducao_stand',
            'ds_nome_exibicao'  => 'Perda produção red. estande (%)',
            'ds_tipo'			=> 'text',
            'ds_class'		    => 'decimal'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 4,
            'ds_nome_campo'		=> 'vl_percent_populacao_restante',
            'ds_nome_exibicao'  => 'População restante (%)',
			'ds_tipo'			=> 'result'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 5,
            'ds_nome_campo'		=> 'nr_total_frutos_produzidos_plantas',
            'ds_nome_exibicao'  => 'Nº total frutos produzidos em 4 plantas',
            'ds_tipo'			=> 'text',
            'ds_class'		    => 'integer'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 6,
            'ds_nome_campo'		=> 'nr_atual_frutos_plantas',
            'ds_nome_exibicao'  => 'Nº atual frutos produzidos em 4 plantas',
            'ds_tipo'			=> 'text',
            'ds_class'		    => 'integer'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 7,
            'ds_nome_campo'		=> 'vl_percent_producao_representativa',
            'ds_nome_exibicao'  => 'Produção representativa (%)',
            'ds_tipo'			=> 'result'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 8,
            'ds_nome_campo'		=> 'vl_percent_frutos_danificados',
            'ds_nome_exibicao'  => 'Frutos danificados (%)',
            'ds_tipo'			=> 'label-hidden',
            'value'             => $vlPercentPerdaQualidade
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 9,
            'ds_nome_campo'		=> 'vl_percent_total_dano_fruto',
            'ds_nome_exibicao'  => 'Total dano fruto (%)',
            'ds_tipo'			=> 'result'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 10,
            'ds_nome_campo'		=> 'vl_percent_total_dano_direto',
            'ds_nome_exibicao'  => 'Total dano direto (%)',
            'ds_tipo'			=> 'result'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 11,
            'ds_nome_campo'		=> 'vl_percent_capacidade_produtiva_restante',
            'ds_nome_exibicao'  => 'Capacidade produtiva restante (%)',
            'ds_tipo'			=> 'result'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 12,
            'ds_nome_campo'		=> 'vl_percent_desfolhamento',
            'ds_nome_exibicao'  => 'Desfolhamento (%)',
            'ds_tipo'			=> 'text',
            'ds_class'		    => 'decimal'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 13,
            'ds_nome_campo'		=> 'vl_percent_dano_bruto',
            'ds_nome_exibicao'  => 'Dano bruto cfe. tabela (%)',
            'ds_tipo'			=> 'text',
            'ds_class'		    => 'decimal'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 13,
            'ds_nome_campo'		=> 'vl_percent_dano',
            'ds_nome_exibicao'  => 'Dano (%)',
            'ds_tipo'			=> 'result'
        );
        
        $Colunas[] = array(
            'nr_coluna'		    => 14,
            'ds_nome_campo'		=> 'vl_percent_total_dano_granizo',
            'ds_nome_exibicao'  => 'Total dano granizo (%)',
            'ds_tipo'			=> 'result'
        );
        
        $Configuracoes['colunas'] = $Colunas;
                
        /*
         * Número de amostras
         */
        $Configuracoes['nr_amostras'] = 11;
        
        return $Configuracoes;
    }

    public function getArrayEstadios($idCultura) {
        $Model_Culturas = new Produto_Model_Culturas();
        $Estadios = $Model_Culturas->getComboEstadios($idCultura);

        return $Estadios;
    }    
}
