/** * * @author Hector Rodriguez */ package com.zazil.dwh.app.bussiness; import com.zazil.dwh.app.dao.EstadoCuentaDAO; import com.zazil.dwh.app.model.EstadoCuentaBean; import com.zazil.dwh.app.model.SaldoBean; import java.util.ArrayList; import java.util.Iterator; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; public class EstadoCuentaService { //****************************************************** Propiedades private ArrayList<EstadoCuentaBean> listaEstadosCuenta; private int periodoMayor; private int periodoMenor; private SortedMap<String,SortedMap<String,ArrayList<String>>> mapaGeneral = new TreeMap<>(); //****************************************************** Constructor public EstadoCuentaService(String rfcEmpresa){ this.obtenerEstadosCuenta(rfcEmpresa); if(estadoOptimo()){ this.obtenerMayor(); this.obtenerMenor(); this.crearMapa(); } } //****************************************************** Getters & Setters public int getPeriodoMayor() { return periodoMayor; } private void setPeriodoMayor(int periodoMayor) { this.periodoMayor = periodoMayor; } public int getPeriodoMenor() { return periodoMenor; } private void setPeriodoMenor(int periodoMenor) { this.periodoMenor = periodoMenor; } //****************************************************** Metodos Adicionales private void obtenerEstadosCuenta(String rfcEmpresa){ EstadoCuentaDAO dao = new EstadoCuentaDAO(); this.listaEstadosCuenta = dao.obtenerEstadosCuentaRFC(rfcEmpresa); } /** * Metodo que ve si la lista esta iniciada y contiene elementos * @return */ public final boolean estadoOptimo(){ boolean estado; if(this.listaEstadosCuenta == null || this.listaEstadosCuenta.isEmpty()){ estado = false; } else { estado = true; } return estado; } //Obtener estado cuenta mayor private void obtenerMayor(){ this.setPeriodoMayor(0); //Si la lista no es nula y la lista no esta vacia if(this.estadoOptimo()){ this.periodoMayor = Integer.parseInt(listaEstadosCuenta.get(0).getPeriodo()); int auxiliar; for (EstadoCuentaBean estadoCuentaBean : this.listaEstadosCuenta) { auxiliar = Integer.parseInt(estadoCuentaBean.getPeriodo()); if(auxiliar > this.periodoMayor){ this.setPeriodoMayor(auxiliar); } } //System.out.println("Periodo Mayor: " + this.getPeriodoMayor()); } } //Obtener estado cuenta menor private void obtenerMenor(){ this.setPeriodoMenor(0); //Si la lista no es nula y la lista no esta vacia if(this.estadoOptimo()){ this.periodoMenor = Integer.parseInt(listaEstadosCuenta.get(0).getPeriodo()); //System.out.println("periodoMenor: " + listaEstadosCuenta.get(0).getPeriodo()); int auxiliar; for (EstadoCuentaBean estadoCuentaBean : this.listaEstadosCuenta) { auxiliar = Integer.parseInt(estadoCuentaBean.getPeriodo()); if(auxiliar < this.periodoMenor){ this.setPeriodoMenor(auxiliar); } } //System.out.println("Periodo Menor: " + this.getPeriodoMenor()); } } private void crearMapa(){ for(Iterator<EstadoCuentaBean> it = this.listaEstadosCuenta.iterator(); it.hasNext();) { //Con Iterator Obtenemos un objeto de la listaGeneral de estados de cuenta EstadoCuentaBean estadoCuentaBean = it.next(); //Del Bean obtenemos su año, periodo es AAAAMMDD, nos interesa AAAA, es decir substring desde 0 hasta N = 4 String año = estadoCuentaBean.getPeriodo().substring(0, 4); //Del Bean obtenemos su mes, periodo es AAAAMMDD, nos interesa MM, es decir substring desde 4 hasta N = 6 String mes = estadoCuentaBean.getPeriodo().substring(4, 6); //Del Bean obtenemos su dia, periodo es AAAAMMDD, nos interesa DD, es decir substring desde 6 hasta periodo.length String dia = estadoCuentaBean.getPeriodo().substring(6); //Verificamos si contiene la llave if(this.mapaGeneral.containsKey(año)){ //si contiene el mes if(this.mapaGeneral.get(año).containsKey(mes)){ //Si ya contiene el mes obtenemos lista y verificamos si contiene dia if(this.mapaGeneral.get(año).get(mes).contains(dia)){ //Ya contiene el dia por lo que no hacemos nada }else{ this.mapaGeneral.get(año).get(mes).add(dia); //System.out.println("Añadido Dia:"+ dia); } }else{//Tiene año y mapa de meses pero no contiene mes y por ende tampoco lista dias ArrayList<String> listaDias = new ArrayList<>(); listaDias.add(dia); this.mapaGeneral.get(año).put(mes, listaDias); //System.out.println("Añadido Mes:"+ mes + " Dia:"+ dia); } }else{//si no contiene el año, entonces no tiene mapa asociado SortedMap<String,ArrayList<String>> mapaMeses = new TreeMap<>(); ArrayList<String> listaDias = new ArrayList<>(); listaDias.add(dia); mapaMeses.put(mes, listaDias); this.mapaGeneral.put(año, mapaMeses); //System.out.println("Primero: " + "Año: " + año + " Mes:"+ mes + " Dia:"+ dia); } //System.out.println("Numero de meses: " + mapaGeneral.get(año).keySet().size()); //**************************************************** for para recorrer la super estructura antes creada }//Del for principal //System.out.println("\n"); // System.out.println("\nNumero de años: " + this.mapaGeneral.keySet().size()); /* for (Map.Entry<String, SortedMap<String, ArrayList<String>>> listaAños : mapaGeneral.entrySet()) { String año = listaAños.getKey(); SortedMap<String, ArrayList<String>> MapaAños = listaAños.getValue(); System.out.println("Año: " + año); for (Map.Entry<String, ArrayList<String>> MapaMeses : MapaAños.entrySet()) { String mes = MapaMeses.getKey(); ArrayList<String> listaDias = MapaMeses.getValue(); System.out.println("Mes: " + mes); for (Iterator<String> it = listaDias.iterator(); it.hasNext();) { String dia = it.next(); System.out.print("" + dia + "\t"); } System.out.println(""); } } */ } /** * Problema: se rellenan los combos de la forma en manera de cascada, * primero año inicial, despues mes inicial, despues dia inicial, * despues año final, despues mes final, despues dia final. * * El service ya tiene el mapa asociado, puede devolver todas las keys que contiene * asi como la lista de dias del mes seleccionado. * @return */ public Set<String> obtieneAños(){ Set<String> keySet = this.mapaGeneral.keySet(); //System.out.println("Tamaño: " + keySet.size()); return keySet; } public Set<String> obtieneMeses(String año){ Set<String> listaMeses = this.mapaGeneral.get(año).keySet(); return listaMeses; } public ArrayList<String> obtieneDias(String año, String mes){ ArrayList<String> listaDias = this.mapaGeneral.get(año).get(mes); return listaDias; } /** * Recibimos 2 periodos y obtenemos sublista de la lista general * @param pI * @param pF * @return */ public ArrayList<EstadoCuentaBean> sublista(String pI, String pF){ //En periodos debemos siempre recibir un entero de 8 digitos int periodoIni = Integer.parseInt(pI); int periodoFin = Integer.parseInt(pF); ArrayList<EstadoCuentaBean> subLista = new ArrayList<>(); for (EstadoCuentaBean estadoCuentaBean : this.listaEstadosCuenta) { int periodo = Integer.parseInt(estadoCuentaBean.getPeriodo()); //Si el periodo es mayor o igual al periodo inicial o es menor o igual al periodo final entonces lo agregamos a la lista if( (periodo >= periodoIni) | (periodo <= periodoFin) ){ subLista.add(estadoCuentaBean); } } return subLista; } /** * Dada una subLista obtenemos lista de los estados de cuenta relevantes */ public ArrayList<EstadoCuentaBean> actividades(ArrayList<EstadoCuentaBean> estadoC){ ArrayList<EstadoCuentaBean> listaCambios = new ArrayList<>(); //Se agrega como referencia el primer elemento listaCambios.add(estadoC.get(0)); SaldoBean saldoInicial = new SaldoBean(estadoC.get(0)); for (EstadoCuentaBean estadoCuentaBean : estadoC) { SaldoBean saldoMonitor = new SaldoBean(estadoCuentaBean); //Agregamos los estados de cuenta mientras estos hayan cambiado if(!( saldoInicial.equals(saldoMonitor) )){ listaCambios.add(estadoCuentaBean); saldoInicial = saldoMonitor; } } return listaCambios; } /** * Con el parametro lista obtenemos informacion para llenar * la tabla de estados de cuenta que se desplegara en ventana * @param lista * @return */ public Object[][] obtenerArray(ArrayList<EstadoCuentaBean> lista){ int tamañoLista = lista.size(); int numeroDatos = 5; //Tamaño lista = numero de items, 5 = periodo, SdoIni, Entradas, Salidas, SdoFin Object datosTabla[][] = new Object[tamañoLista][numeroDatos]; for (int i = 0; i < tamañoLista; i++) { String periodo = lista.get(i).getPeriodo(); StringBuilder periodoFormateado = new StringBuilder(); periodoFormateado.append(periodo.substring(6)).append("-"); periodoFormateado.append(periodo.substring(4, 6)).append("-"); periodoFormateado.append(periodo.substring(0, 4)); datosTabla[i][0] = periodoFormateado.toString(); datosTabla[i][1] = lista.get(i).getSaldoInicial(); datosTabla[i][2] = lista.get(i).getEntradas(); datosTabla[i][3] = lista.get(i).getSalidas(); datosTabla[i][4] = lista.get(i).getSaldoFinal(); } return datosTabla; } }