sábado, 2 de febrero de 2013

Usar el módulo de transformación de IVA de xml a fichero Plano en un proyecto en Netbeans

Buenas en este post vamos ir empezando con temas de Java y de lo que se trata es de partir de una descarga que nos ofrece la AEAT que contiene unos ficheros .jar que nos darán la funcionalidad de convertir un fichero xml con los datos del modelo 390 del iva -cuyo plazo por cierto ya cumplió el pasado 30-01- a un fichero de texto plano. Este módulo está pensado para usarse en un software contable/fiscal. Lógicamente la aplicación que voy a diseñar en Netbeans va a ser más reducida, sólo para mostrar cómo agregar archivos .jar a nuestro proyecto y como poder usar la funcionalidad de un archivo .jar que nos proporciona otro programador. Vamos un poco de programación orientada a objetos donde yo no sé nada sobre cómo están programadas las clases y las interfaces que me proporciona otros programador. Yo sólo creo un objeto de la clase y utilizo los métodos que ya tengo implementados.
Pues bien primero voy a descargar el susodicho módulo en este link
Abrimos Netbeans (también se podría hacer lo mismo en el IDE Eclipse) y creamos un nuevo proyecto Java Application. (Archivo-->Proyecto Nuevo) y le damos un nombre: en este caso IVA390
 
Pues bien una vez creado el proyecto vamos a modificar algunas cosas porque lo que voy a hacer es una aplicación con formularios y no una aplicación de consola.  Lo primero es crear un nuevo paquete y borrar el anterior paquete llamado IVA390 que continiene el fichero IVA390.jar con el método público estático, ya creado, main. Según la convención que se usa, el nuevo paquete se llamará por ejemplo com.raul.iva390
Entonces voy a añadir al paquete creado un formulario JFrame. Cuando se añada veremos que tiene la vista de diseño y la vista de código. Empecemos en la vista de diseño y vamos a sacar nuestras dotes artísticas e ir añadiendo varios controles al formulario. Si no ves la paleta con los controles es tan sencillo como ir a Herramientas -->Paleta
 
Vamos a la pestaña de controles Swing y agregamos los controles que necesites. En este proyecto será un jTextField, dos JButton, dos jLabel y un JCombobox. También he añadido un JMenu y un JMenuItem. En la ventana de propiedades podemos cambiar las propiedades de cada control para que se ajuste a lo que buscamos. Poner para el jTextField un ToolTipText para cuando el usuario posicione el ratón encima de la caja de texto le insinue que debe introducir, en la propiedad model del jComboBox añadir varios valores por defecto, y también podemos cambiar la posición y el tamaño de los controles, todo y que esto último es más sencillo hacerlo en la vista de diseño.
Para los dos botones que hemos añadido al formulario tenemos en el panel de propiedades el evento actionPerformed que he ha de crear (también si se hace doble click en cada botón ya se crea ese evento). Pues ahora nos vamos a la vista de código y agregaremos el código que manejarán los dos eventos. Como vamos a usar tres archivos jar que nos proporcina la AEAT voy a crear una carpeta llamada lib y voy a pegar ahí los tres archivos jar.
 
También voy a Proyectos-->Bibliotecas-->Agregar archivo JAR/Carpeta y seleccionamos los 3 archivos.
Con ésto podremos crear un objeto de la clase parseador y acceder a los métodos públicos que nos ha creado a la AEAT. Lo que tendremos que hacer es primero dotar de contenido al método actionPerformed del botón 'Abrir fichero IVA 390 xml'. Sería crear un método OpenFile() que nos abriría una caja de diálogo para seleccionar ficheros xml.
 private void OpenFile() {
        //Creo un objecto JFileChooser: una ventana de diálogo para seleccionar un fichero.
        JFileChooser fc = null;
        //Set up the file chooser.
        if (fc == null) {
            fc = new JFileChooser();
            fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
            //Filtro a sólo archivos xml del 390
            FileNameExtensionFilter filter = new FileNameExtensionFilter("Fichero IVA 390", "xml");
            fc.setFileFilter(filter);
            fc.setAcceptAllFileFilterUsed(true);
        }
        //Show it.
        int returnVal = fc.showOpenDialog(this);
        //Process the results.
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File archivo;
            archivo = fc.getSelectedFile();
            //Muestro la ruta en la caja de texto
            jTextField390.setText(archivo.getAbsolutePath());
        }
        //Reset the file chooser for the next time it's shown.
        fc.setSelectedFile(null);
    }
Y luego añadir código al método actionPerformed del botón 'Transformar a fichero plano'. Sería crear un objecto de la clase parseador, pasandole a método constructor los parámetros que nos pide (entre ellos un InputStream con el fichero xml y un OutputStream con el fichero que vamos a crear .txt.
private void jButtonTransformarActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        // Llamada al módulo para transformación del fichero xml a fichero plano
        String modelo = "390";   // 390 o 392
        int ejercicio = 2012;    // 2004 en adelante (392 hasta 2008)
        boolean validar = false; // Indica si se validará el fichero según
        // el esquema correspondiente
        boolean ensobrar = false; // Indica si se genera el fichero ensobrado
        InputStream in;          // stream del que se lee el fichero xml
        OutputStream out;        // stream donde se deja el fichero plano
        String year;
        //Obtengo el año de jComboBox
        year = jComboBoxYear.getSelectedItem().toString();
        if (year.length() == 4) {
            //si el año tiene cuatro números lo convierto a integer
            ejercicio = Integer.parseInt(year);
        }
        //Obtengo el modelo
        if (ejercicio < 2008) {
            //Antes de 2008 el 390 era el 392
            modelo = "392";
        }
        //compruebo la ruta
        File archivo = new File(jTextField390.getText());
        if (!archivo.isFile()) {
            //No es válido
            JOptionPane.showMessageDialog(null, "El fichero no es válido.", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }
        try {
           in = new FileInputStream(archivo);
           String path = archivo.getPath();
           path = path.substring(0, path.lastIndexOf('.'));
           String nuevaruta = path + ".txt";
           out = new FileOutputStream(nuevaruta);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(IVA390.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }
        //Creo un objecto parseador. Es una clase que me viene en el módulo de la AEAT
        parseador traductor = new parseador(modelo, null, ejercicio, true, null);
        traductor.setValidar(validar);
        boolean ok = traductor.generarFicheroPlano(ensobrar, null, in, out);
        if (!ok) {
            // error en la generación
            JOptionPane.showMessageDialog(null, "Error en la generación.", "Error", JOptionPane.ERROR_MESSAGE);
        }
    }      
Pues una vez hecho todo ejecutamos el proyecto y se nos creará nuestro archivo IVA390.jar en la carpeta dist, listo para distribuir entre nuestros amigos. 
Como siempre cuelgo resultado de la compilación del proyecto en este link.

No hay comentarios:

Publicar un comentario