View Javadoc

1    package ecar.servlet.relatorio.PPA_LinhaPrograma;
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.ItemEstruturaIett;
21  import ecar.servlet.relatorio.PPA_LinhaAcao.LinhaAcaoComparatorNome;
22  import ecar.servlet.relatorio.PPA_LinhaAcao.LinhaAcaoComparatorSigla;
23  import ecar.servlet.relatorio.PPA_LinhaAcao.PPA_LinhaAcaoBean;
24  import ecar.servlet.relatorio.PPA_Util.CalcularTotalVisitor;
25  
26  /**
27   * Classe de acoplamento do relatorio PPA por Linha de Acao e Programa com o sistema E-car
28   * 
29   * <BR/>
30   * Arvore de chamada de Metodos ::
31   * 
32   * RelatorioPPAServlet
33   * 	generatePPA
34   * 	  generateBeans
35   * 			geraPrevisao
36   * <BR/>
37   * @author Gabriel Solana
38   * @since 07/2007
39   */
40  public class RelatorioPPALinhaProgramaService {
41  
42  	/**
43  	 * Log da classe
44  	 */
45  	private Logger logger = Logger.getLogger(this.getClass());
46  	
47  	/**
48  	 * Requisicao
49  	 */
50  	private HttpServletRequest request;
51  	
52  	private static final Long codEstruturaLinhaAcao = Long.valueOf(27);
53  
54  	/**
55  	 * Dados do relatorio
56  	 */
57  	private ArrayList<PPA_LinhaAcaoBean> dados;
58  	
59  	
60  	// constante de base de dados - Periodo de 2008 - 2011
61  	private final Long CONSTANTE_PERIODO_EXERCICIO = Long.valueOf(2);
62  	
63  	// constante de base de dados - Status ativo / inativo
64  	private final Character CONSTANTE_IND_ATIVO = new Character('S');
65  	
66  	/**
67  	 * Listagem de exercicios do periodo
68  	 */
69  	private List<ExercicioExe> listaExercicios = new ArrayList<ExercicioExe>();
70  	
71  	
72  	/**
73  	 * Calcula os totais na tabela de resumo do relatorio PPA
74  	 */
75  	private final CalcularTotalVisitor calcularTotal = new CalcularTotalVisitor();
76  	
77  	private BigDecimal totalGeral1 = new BigDecimal(0);
78  	private BigDecimal totalGeral2 = new BigDecimal(0);
79  	private BigDecimal totalGeral3 = new BigDecimal(0);
80  	private BigDecimal totalGeral4 = new BigDecimal(0);	
81  	
82  	
83  	/*
84  	 * Impossibilita instanciar objeto de classe externa
85  	 */
86  	private RelatorioPPALinhaProgramaService(){
87  		dados = new ArrayList<PPA_LinhaAcaoBean>();
88  	}
89  	
90  	/**
91  	 * Retorna instancia da classe RelatorioPPAProgramaService com parametro de entrada request
92  	 * @param paramRequest
93  	 * @return
94  	 */
95  	public static RelatorioPPALinhaProgramaService getInstance( HttpServletRequest paramRequest ){
96  		RelatorioPPALinhaProgramaService objeto = new RelatorioPPALinhaProgramaService();
97  		objeto.request  = paramRequest;
98  		return objeto;
99  	}
100 	
101 	/**
102 	 * Recupera dados e dispara actions para geracao do relatorio
103 	 * @return Listagem
104 	 */
105 	public ArrayList<PPA_LinhaAcaoBean> generatePPA(){
106 		getDados();
107 		gerarContador();
108 		return dados;
109 	}
110 	
111 	public BigDecimal getTotalGeral1(){
112 		return totalGeral1;
113 	}
114 
115 	public BigDecimal getTotalGeral2(){
116 		return totalGeral2;		
117 	}
118 
119 	public BigDecimal getTotalGeral3(){
120 		return totalGeral3;		
121 	}
122 	
123 	public BigDecimal getTotalGeral4(){
124 		return totalGeral4;		
125 	}	
126 	
127 	public BigDecimal getTotalGeral(){
128 		return new BigDecimal(0).add(totalGeral1).add(totalGeral2).add(totalGeral3).add(totalGeral4);
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(){
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);
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 ) 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.setNivelItem(1);
248 			beans.add(Niveltmp);
249 
250 			BigDecimal totalProgramaAno1 = new BigDecimal(0);
251 			BigDecimal totalProgramaAno2 = new BigDecimal(0);
252 			BigDecimal totalProgramaAno3 = new BigDecimal(0);
253 			BigDecimal totalProgramaAno4 = new BigDecimal(0);
254 			
255 			// percorre programas do nivel
256 			for (Iterator iter2 = reordenarPrograma(item.getItemEstruturaIetts()).iterator(); iter2.hasNext();) {
257 				ItemEstruturaIett programa = (ItemEstruturaIett) iter2.next();
258 				
259 				PPA_LinhaAcaoBean programaTmp = new PPA_LinhaAcaoBean();
260 				programaTmp.setNome( programa.getNomeIett() );
261 				programaTmp.setNivelItem(Integer.valueOf(2));
262 				beans.add(programaTmp);	
263 
264 				
265 				BigDecimal totalAcoesAno1 = new BigDecimal(0);
266 				BigDecimal totalAcoesAno2 = new BigDecimal(0);
267 				BigDecimal totalAcoesAno3 = new BigDecimal(0);
268 				BigDecimal totalAcoesAno4 = new BigDecimal(0);
269 
270 				//percorre acoes do programa
271 				for (Iterator iter3 = reordenarPrograma(programa.getItemEstruturaIetts()).iterator(); iter3.hasNext();) {
272 					ItemEstruturaIett acao = (ItemEstruturaIett) iter3.next();
273 					
274 					PPA_LinhaAcaoBean acaoTmp = new PPA_LinhaAcaoBean();
275 					acaoTmp.setNivelItem(Integer.valueOf(3));
276 					BigDecimal[] totais = getPrevisao(acao);
277 					
278 					acaoTmp.setValor1( totais[0]==null?ZERO:totais[0] );
279 					acaoTmp.setValor2( totais[1]==null?ZERO:totais[1] );
280 					acaoTmp.setValor3( totais[2]==null?ZERO:totais[2] );
281 					acaoTmp.setValor4( totais[3]==null?ZERO:totais[3] );
282 					
283 					calcularTotal.visit(acaoTmp);
284 					totalAcoesAno1 = totalAcoesAno1.add( acaoTmp.getValor1() );
285 					totalAcoesAno2 = totalAcoesAno2.add( acaoTmp.getValor2() );
286 					totalAcoesAno3 = totalAcoesAno3.add( acaoTmp.getValor3() );
287 					totalAcoesAno4 = totalAcoesAno4.add( acaoTmp.getValor4() );
288 					
289 				} // acao
290 				
291 				
292 				// os valores do programa eh a soma de todas as acoes daquele programa
293 				programaTmp.setValor1( totalAcoesAno1 );
294 				programaTmp.setValor2( totalAcoesAno2 );
295 				programaTmp.setValor3( totalAcoesAno3 );
296 				programaTmp.setValor4( totalAcoesAno4 );
297 				calcularTotal.visit( programaTmp );
298 				
299 				totalProgramaAno1 = totalProgramaAno1.add( programaTmp.getValor1() );
300 				totalProgramaAno2 = totalProgramaAno2.add( programaTmp.getValor2() );
301 				totalProgramaAno3 = totalProgramaAno3.add( programaTmp.getValor3() );
302 				totalProgramaAno4 = totalProgramaAno4.add( programaTmp.getValor4() );
303 				
304 			} // programa
305 			
306 			// os valores do nivel eh a soma de todos os programas.
307 			Niveltmp.setValor1(  totalProgramaAno1 );
308 			Niveltmp.setValor2(  totalProgramaAno2 );
309 			Niveltmp.setValor3(  totalProgramaAno3 );
310 			Niveltmp.setValor4(  totalProgramaAno4 );
311 			calcularTotal.visit( Niveltmp );
312 			
313 			totalGeral1 = totalGeral1.add( Niveltmp.getValor1() );
314 			totalGeral2 = totalGeral2.add( Niveltmp.getValor2() );
315 			totalGeral3 = totalGeral3.add( Niveltmp.getValor3() );
316 			totalGeral4 = totalGeral4.add( Niveltmp.getValor4() );			
317 			
318 			
319 		} // nivel
320 		
321 		return beans;
322 		
323 	}
324 	
325 	
326 	/**
327 	 * Gera os totais valores da tabela para o item  na tabela do relatorio de PPA 
328 	 * @param Item estrutura
329 	 * @return array de valores da tabela PPA
330 	 * @throws ECARException
331 	 */
332 	private BigDecimal[] getPrevisao(final ItemEstruturaIett itemEstrut ) throws ECARException{
333 		
334 		final ItemEstruturaPrevisaoDao prevDao = new ItemEstruturaPrevisaoDao(request);
335 
336 		ArrayList<BigDecimal> previsao = new ArrayList<BigDecimal>();
337 		BigDecimal previsaoItem = null;
338 		for (Iterator iterExer = listaExercicios.iterator(); iterExer.hasNext();) {
339 			ExercicioExe elementoExerc = (ExercicioExe) iterExer.next();
340 			previsaoItem =  prevDao.previsaoItemAcao( itemEstrut.getCodIett(), elementoExerc.getCodExe() ) ;
341 			previsao.add(previsaoItem);
342 		}
343 		return previsao.toArray(new BigDecimal[previsao.size()]);
344 
345 	}
346 	
347 }