View Javadoc

1    package ecar.servlet.relatorio.PPA_LinhaAcao;
2   
3   import java.math.BigDecimal;
4   import java.util.ArrayList;
5   import java.util.Collection;
6   import java.util.Iterator;
7   import java.util.List;
8   import java.util.Set;
9   import java.util.TreeSet;
10  
11  import javax.servlet.http.HttpServletRequest;
12  
13  import org.apache.log4j.Logger;
14  
15  import ecar.dao.ExercicioDao;
16  import ecar.dao.ItemEstruturaDao;
17  import ecar.dao.ItemEstruturaPrevisaoDao;
18  import ecar.exception.ECARException;
19  import ecar.pojo.ExercicioExe;
20  import ecar.pojo.ItemEstUsutpfuacIettutfa;
21  import ecar.pojo.ItemEstruturaIett;
22  import ecar.servlet.relatorio.PPA_Util.CalcularTotalVisitor;
23  
24  /**
25   * Classe de acoplamento do relatorio PPA por Linha de Acao com o sistema E-car
26   * 
27   * <BR/>
28   * Arvore de chamada de Metodos ::
29   * 
30   * RelatorioPPAServlet
31   * 	generatePPA
32   * 	  generateBeans
33   * 			geraPrevisao
34   * <BR/>
35   * @author Gabriel Solana
36   * @since 07/2007
37   */
38  public class RelatorioPPALinhaAcaoService {
39  
40  	/**
41  	 * Log da classe
42  	 */
43  	private Logger logger = Logger.getLogger(this.getClass());
44  	
45  	/**
46  	 * Requisicao
47  	 */
48  	private HttpServletRequest request;
49  	
50  	private static final Long codEstruturaLinhaAcao = Long.valueOf(27);
51  
52  	/**
53  	 * Dados do relatorio
54  	 */
55  	private ArrayList<PPA_LinhaAcaoBean> dados;
56  	
57  	
58  	// constante de base de dados - Periodo de 2008 - 2011
59  	private final Long CONSTANTE_PERIODO_EXERCICIO = Long.valueOf(2);
60  	
61  	// constante de base de dados - Status ativo / inativo
62  	private final Character CONSTANTE_IND_ATIVO = new Character('S');
63  	
64  	/**
65  	 * Listagem de exercicios do periodo
66  	 */
67  	private List<ExercicioExe> listaExercicios = new ArrayList<ExercicioExe>();
68  	
69  	
70  	/**
71  	 * Calcula os totais na tabela de resumo do relatorio PPA
72  	 */
73  	private final CalcularTotalVisitor calcularTotal = new CalcularTotalVisitor();
74  	
75  	
76  	private BigDecimal totalGeral1 = new BigDecimal(0);
77  	private BigDecimal totalGeral2 = new BigDecimal(0);
78  	private BigDecimal totalGeral3 = new BigDecimal(0);
79  	private BigDecimal totalGeral4 = new BigDecimal(0);
80  	
81  	
82  	
83  	public BigDecimal getTotalGeral1(){
84  		return totalGeral1;
85  	}
86  
87  	public BigDecimal getTotalGeral2(){
88  		return totalGeral2;		
89  	}
90  
91  	public BigDecimal getTotalGeral3(){
92  		return totalGeral3;		
93  	}
94  	
95  	public BigDecimal getTotalGeral4(){
96  		return totalGeral4;		
97  	}	
98  	
99  	public BigDecimal getTotalGeral(){
100 		return new BigDecimal(0).add(totalGeral1).add(totalGeral2).add(totalGeral3).add(totalGeral4);
101 	}
102 	
103 	/*
104 	 * Impossibilita instanciar objeto de classe externa
105 	 */
106 	private RelatorioPPALinhaAcaoService(){
107 		dados = new ArrayList<PPA_LinhaAcaoBean>();
108 	}
109 	
110 	/**
111 	 * Retorna instancia da classe RelatorioPPAProgramaService com parametro de entrada request
112 	 * @param paramRequest
113 	 * @return
114 	 */
115 	public static RelatorioPPALinhaAcaoService getInstance( HttpServletRequest paramRequest ){
116 		RelatorioPPALinhaAcaoService objeto = new RelatorioPPALinhaAcaoService();
117 		objeto.request  = paramRequest;
118 		return objeto;
119 	}
120 	
121 	/**
122 	 * Recupera dados e dispara actions para geracao do relatorio
123 	 * @return Listagem
124 	 */
125 	public ArrayList<PPA_LinhaAcaoBean> generatePPA( boolean possuiGerente ){
126 		getDados( possuiGerente );
127 		gerarContador();
128 		return dados;
129 	}
130 	
131 	private void gerarContador(){
132 		
133 		int cont = 0;
134 		for (Iterator iter = dados.iterator(); iter.hasNext();) {
135 			PPA_LinhaAcaoBean elemento = (PPA_LinhaAcaoBean) iter.next();
136 			elemento.setIndice(cont);
137 			cont++;
138 		}
139 		
140 	}
141 	
142 	/**
143 	 * Carrega exercicios do periodo de 2008 - 2011
144 	 *
145 	 */
146 	private void loadExerciciosValidos(){
147 		
148 		try {
149 			
150 			final ExercicioDao exercicioDao = new ExercicioDao(request);
151 			
152 			// carrega todos os exercicios do periodo de 2008 / 2011
153 			listaExercicios = exercicioDao.getExercicioByPeriodicidade( CONSTANTE_PERIODO_EXERCICIO );
154 			
155 		} catch (ECARException e) {
156 			logger.error("Nao foi possivel carregar Exercicio", e);
157 		} catch (Exception e) {
158 			logger.error("Nao foi possivel carregar Exercicio", e);			
159 		}				
160 		
161 	}		
162 	
163 	
164 	/**
165 	 * Retorna itens para geracao do relatorio PPA
166 	 * @param periodoIni
167 	 * @param periodoFim
168 	 * @return
169 	 */
170 	private void getDados( boolean possuiGerente ){
171 		
172 		ItemEstruturaDao itemEstruturaDao = new ItemEstruturaDao(request);
173 		ArrayList<ItemEstruturaIett> itens = new ArrayList<ItemEstruturaIett>();
174 		try {
175 			
176 			itens = new ArrayList<ItemEstruturaIett>(itemEstruturaDao.getItensByEstrutura(codEstruturaLinhaAcao));
177 			
178 			// 	carrega exercicios do periodo de 2008 / 2011
179 			loadExerciciosValidos();
180 			
181 			
182 			if(itens != null){
183 				if (itens.size()==0){
184 					logger.info("Nao existe itens na estrutura com este criterio de pesquisa!!!");
185 				}else{
186 					dados = generateBeans(itens, possuiGerente );
187 				}
188 			}
189 		} catch (Exception e) {
190 			logger.error("Nao foi possivel carregar dados", e);
191 		}		
192 	}
193 	
194 	/**
195 	 * Reordena Colecao de elementos de acordo com objeto Comparator
196 	 * @param list listagem
197 	 * @return Set de objetos reordenados
198 	 */
199 	private Set reordenarPrograma(Collection list){
200 		TreeSet<ItemEstruturaIett> novalista = new TreeSet<ItemEstruturaIett>( new LinhaAcaoComparatorNome() );
201 		for (Iterator iter = list.iterator(); iter.hasNext();) {
202 			ItemEstruturaIett item = (ItemEstruturaIett) iter.next();
203 			
204 			if ( CONSTANTE_IND_ATIVO.toString().equalsIgnoreCase( item.getIndAtivoIett() ) ){
205 				novalista.add(item);	
206 			}
207 			
208 		}			
209 		return novalista;
210 	}
211 	
212 	/**
213 	 * Reordena Colecao de elementos de acordo com objeto Comparator
214 	 * @param list listagem
215 	 * @return Set de objetos reordenados
216 	 */
217 	private Set reordenarLinhaAcao(Collection list){
218 		TreeSet<ItemEstruturaIett> novalista = new TreeSet<ItemEstruturaIett>( new LinhaAcaoComparatorSigla() );
219 		for (Iterator iter = list.iterator(); iter.hasNext();) {
220 			ItemEstruturaIett item = (ItemEstruturaIett) iter.next();
221 			
222 			if ( CONSTANTE_IND_ATIVO.toString().equalsIgnoreCase( item.getIndAtivoIett() ) ){
223 				novalista.add(item);	
224 			}
225 			
226 		}			
227 		return novalista;
228 	}	
229 	
230 	/**
231 	 * Dispara servicos para gerar os beans do relatorio PPA
232 	 * @param itemPrograma Item de nivel de acao referencial
233 	 * @throws Exception
234 	 */
235 	private ArrayList<PPA_LinhaAcaoBean> generateBeans( Collection itens, boolean possuiGerente ) throws Exception{
236 
237 		ArrayList<PPA_LinhaAcaoBean> beans = new ArrayList<PPA_LinhaAcaoBean>();
238 			
239 		final BigDecimal ZERO = new BigDecimal(0);
240 		
241 		// percorre niveis
242 		for (Iterator iter = reordenarLinhaAcao(itens).iterator(); iter.hasNext();) {
243 			ItemEstruturaIett item = (ItemEstruturaIett) iter.next();
244 		
245 			PPA_LinhaAcaoBean Niveltmp = new PPA_LinhaAcaoBean();
246 			Niveltmp.setNome( item.getNomeIett() );
247 			Niveltmp.setSiglaOrgao( "" );			
248 			Niveltmp.setNivelItem(1);
249 			beans.add(Niveltmp);
250 
251 			BigDecimal totalProgramaAno1 = new BigDecimal(0);
252 			BigDecimal totalProgramaAno2 = new BigDecimal(0);
253 			BigDecimal totalProgramaAno3 = new BigDecimal(0);
254 			BigDecimal totalProgramaAno4 = new BigDecimal(0);
255 			
256 			// percorre programas do nivel
257 			for (Iterator iter2 = reordenarPrograma(item.getItemEstruturaIetts()).iterator(); iter2.hasNext();) {
258 				ItemEstruturaIett programa = (ItemEstruturaIett) iter2.next();
259 				
260 				PPA_LinhaAcaoBean programaTmp = new PPA_LinhaAcaoBean();
261 				programaTmp.setNome( programa.getNomeIett() );
262 				programaTmp.setSiglaOrgao( programa.getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg() );
263 
264 				programaTmp.setNivelItem(Integer.valueOf(2));
265 				beans.add(programaTmp);	
266 
267 				PPA_LinhaAcaoBean novaLinha = new PPA_LinhaAcaoBean();
268 				
269 				if ( possuiGerente ){
270 					String usrTmp = "";
271 					for (Iterator iterUsu = programa.getItemEstUsutpfuacIettutfas().iterator(); iterUsu.hasNext();) {
272 						ItemEstUsutpfuacIettutfa usuario = (ItemEstUsutpfuacIettutfa)iterUsu.next();
273 						if ( usuario.getTipoFuncAcompTpfa().getCodTpfa().equals( Long.valueOf(4) ) ){
274 							if (usuario.getUsuarioUsu() != null){
275 								usrTmp = usuario.getUsuarioUsu().getNomeUsuSent();
276 							} else if (usuario.getSisAtributoSatb() != null){
277 								usrTmp = usuario.getSisAtributoSatb().getDescricaoSatb();
278 							}
279 							break;
280 						}
281 						
282 					}
283 					novaLinha.setNome( usrTmp );
284 				}else{
285 					novaLinha.setNome( "" );
286 				}
287 				novaLinha.setNivelItem( 99 );
288 				novaLinha.setSiglaOrgao( programa.getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg()  );
289 				
290 				beans.add(novaLinha);
291 				
292 				BigDecimal totalAcoesAno1 = new BigDecimal(0);
293 				BigDecimal totalAcoesAno2 = new BigDecimal(0);
294 				BigDecimal totalAcoesAno3 = new BigDecimal(0);
295 				BigDecimal totalAcoesAno4 = new BigDecimal(0);
296 
297 				TreeSet<PPA_LinhaAcaoBean> orgaoAcao = new TreeSet<PPA_LinhaAcaoBean>( new LinhaAcaoComparatorOrgao() ); // nao permite que orgaos se repitam
298 
299 				//percorre acoes do programa				
300 				Set acoes = programa.getItemEstruturaIetts();
301 				for (Iterator iter3 = acoes.iterator(); iter3.hasNext();) {
302 					ItemEstruturaIett acao = (ItemEstruturaIett) iter3.next();
303 
304 					if(CONSTANTE_IND_ATIVO.toString().equalsIgnoreCase( acao.getIndAtivoIett() ) ){
305 					
306 						PPA_LinhaAcaoBean acaoTmp = new PPA_LinhaAcaoBean();
307 						acaoTmp.setSiglaOrgao( acao.getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg() );
308 						acaoTmp.setNivelItem(Integer.valueOf(3));
309 						
310 
311 
312 						BigDecimal[] totais = getPrevisao(acao);
313 						
314 						acaoTmp.setValor1( totais[0]==null?ZERO:totais[0] );
315 						acaoTmp.setValor2( totais[1]==null?ZERO:totais[1] );
316 						acaoTmp.setValor3( totais[2]==null?ZERO:totais[2] );
317 						acaoTmp.setValor4( totais[3]==null?ZERO:totais[3] );
318 						
319 						calcularTotal.visit(acaoTmp);
320 
321 						// verifica se já adicionei um elemento LinhaAcaoBean no relatorio
322 						if ( orgaoAcao.contains(acaoTmp) ){
323 							
324 							// percorre todas as linhas já adicionadas no relatorio e acumula o valor previsto naquela linha que tiver
325 							// o mesmo nome do orgao.
326 							for (Iterator orgaoIt = orgaoAcao.iterator(); orgaoIt.hasNext();) {
327 								PPA_LinhaAcaoBean orgaoCheck = (PPA_LinhaAcaoBean) orgaoIt.next();
328 								
329 								if ( orgaoCheck.equals( acaoTmp ) ){
330 									orgaoCheck.setValor1( orgaoCheck.getValor1().add( acaoTmp.getValor1() ) );
331 									orgaoCheck.setValor2( orgaoCheck.getValor2().add( acaoTmp.getValor2() ) );
332 									orgaoCheck.setValor3( orgaoCheck.getValor3().add( acaoTmp.getValor3() ) );
333 									orgaoCheck.setValor4( orgaoCheck.getValor4().add( acaoTmp.getValor4() ) );
334 									orgaoCheck.setTotal( orgaoCheck.getTotal().add( acaoTmp.getTotal() ) );
335 									
336 									totalAcoesAno1 = totalAcoesAno1.add( acaoTmp.getValor1() );
337 									totalAcoesAno2 = totalAcoesAno2.add( acaoTmp.getValor2() );
338 									totalAcoesAno3 = totalAcoesAno3.add( acaoTmp.getValor3() );
339 									totalAcoesAno4 = totalAcoesAno4.add( acaoTmp.getValor4() );	
340 								}
341 								
342 							}
343 						}else{ // se não possui este orgao no relatorio ainda e a linha possui a mesma sigla do orgao atualiza valores da linha
344 							if ( acaoTmp.getSiglaOrgao().equalsIgnoreCase( novaLinha.getSiglaOrgao() ) ){
345 								novaLinha.setValor1(  novaLinha.getValor1().add(acaoTmp.getValor1()) );
346 								novaLinha.setValor2(  novaLinha.getValor2().add(acaoTmp.getValor2()) );
347 								novaLinha.setValor3(  novaLinha.getValor3().add(acaoTmp.getValor3()) );
348 								novaLinha.setValor4(  novaLinha.getValor4().add(acaoTmp.getValor4()) );
349 								novaLinha.setTotal( novaLinha.getTotal().add(acaoTmp.getTotal()) );
350 								
351 								totalAcoesAno1 = totalAcoesAno1.add( acaoTmp.getValor1() );
352 								totalAcoesAno2 = totalAcoesAno2.add( acaoTmp.getValor2() );
353 								totalAcoesAno3 = totalAcoesAno3.add( acaoTmp.getValor3() );
354 								totalAcoesAno4 = totalAcoesAno4.add( acaoTmp.getValor4() );	
355 								
356 							}else{						
357 								
358 								totalAcoesAno1 = totalAcoesAno1.add( acaoTmp.getValor1() );
359 								totalAcoesAno2 = totalAcoesAno2.add( acaoTmp.getValor2() );
360 								totalAcoesAno3 = totalAcoesAno3.add( acaoTmp.getValor3() );
361 								totalAcoesAno4 = totalAcoesAno4.add( acaoTmp.getValor4() );								
362 								
363 								orgaoAcao.add(acaoTmp);	
364 							}
365 							
366 								
367 						}
368 											
369 					} 
370 				}// percorre acao
371 				
372 				for (Iterator itOrgao = orgaoAcao.iterator(); itOrgao.hasNext();) {
373 					PPA_LinhaAcaoBean orgao = (PPA_LinhaAcaoBean) itOrgao.next();
374 					beans.add(orgao);
375 				}
376 				
377 				// os valores do programa e a soma de todas as acoes daquele programa
378 				programaTmp.setValor1( totalAcoesAno1 );
379 				programaTmp.setValor2( totalAcoesAno2 );
380 				programaTmp.setValor3( totalAcoesAno3 );
381 				programaTmp.setValor4( totalAcoesAno4 );
382 				calcularTotal.visit( programaTmp );
383 				
384 				totalProgramaAno1 = totalProgramaAno1.add( programaTmp.getValor1() );
385 				totalProgramaAno2 = totalProgramaAno2.add( programaTmp.getValor2() );
386 				totalProgramaAno3 = totalProgramaAno3.add( programaTmp.getValor3() );
387 				totalProgramaAno4 = totalProgramaAno4.add( programaTmp.getValor4() );
388 				
389 			} // programa
390 			
391 			// os valores do nivel e a soma de todos os programas.
392 			Niveltmp.setValor1(  totalProgramaAno1 );
393 			Niveltmp.setValor2(  totalProgramaAno2 );
394 			Niveltmp.setValor3(  totalProgramaAno3 );
395 			Niveltmp.setValor4(  totalProgramaAno4 );
396 			calcularTotal.visit( Niveltmp );
397 			
398 			// o total geral é a soma é todos os totais de nivel de acao 
399 			totalGeral1 = totalGeral1.add( Niveltmp.getValor1() );
400 			totalGeral2 = totalGeral2.add( Niveltmp.getValor2() );
401 			totalGeral3 = totalGeral3.add( Niveltmp.getValor3() );
402 			totalGeral4 = totalGeral4.add( Niveltmp.getValor4() );
403 			
404 		} // nivel
405 		
406 		return beans;
407 /*		
408 		PPA_LinhaAcaoBean programaTmp = geraPrograma(itemPrograma);
409 		geraPrevisao(programaTmp, itemPrograma );
410 		calcularTotal.visit(programaTmp); // gera calculo dos totais
411 		dados.add(programaTmp);
412 		
413 */		
414 	}
415 	
416 	
417 	/**
418 	 * Gera os totais valores da tabela para o item  na tabela do relatorio de PPA 
419 	 * @param Item estrutura
420 	 * @return array de valores da tabela PPA
421 	 * @throws ECARException
422 	 */
423 	private BigDecimal[] getPrevisao(final ItemEstruturaIett itemEstrut ) throws ECARException{
424 		
425 		final ItemEstruturaPrevisaoDao prevDao = new ItemEstruturaPrevisaoDao(request);
426 
427 		ArrayList<BigDecimal> previsao = new ArrayList<BigDecimal>();
428 		BigDecimal previsaoItem = null;
429 		for (Iterator iterExer = listaExercicios.iterator(); iterExer.hasNext();) {
430 			ExercicioExe elementoExerc = (ExercicioExe) iterExer.next();
431 			previsaoItem =  prevDao.previsaoItemAcao( itemEstrut.getCodIett(), elementoExerc.getCodExe() ) ;
432 			previsao.add(previsaoItem);
433 		}
434 		return previsao.toArray(new BigDecimal[previsao.size()]);
435 
436 	}
437 	
438 }