sábado, 23 de febrero de 2013

Norma19 AEB: Norma19-34Creator 0.3b

Buenas voy  a colgar una versión totalmente nueva y funcional del programa Norma34Creator que permitirá generar también ficheros Norma 19. Norma19-34Creator aparte de generar los ficheros Norma34 de remesas de pagos de nóminas, transferencia y pensiones, generará ficheros Norma 19 de adeudos por domiciliaciones, es decir, permitirá domiciliar recibos en la cuenta de nuestros clientes, siempre con su permiso  por escrito, claro está, y cruzando los dedos para que no nos lo devuelvan.
Me he liado a programar y prácticamente lo he cambiado todo. He mejorado algunos códigos, he cambiado por entero la opción de imprimir informes de las remesas y he añadido la funcionalidad para la Norma 19. Mi idea: que sea sencillo, separando pagos (Norma 34) de cobros (Norma 19).
La interfaz del programa ha cambiado un poco para permitir las 2 opciones de generación de ficheros y he añadido la opción de importar los datos desde varios formatos (txt, csv y xls) también para la Norma 19. Como comenté no uso base de datos por temas de hacer un programa muy simple, y eso complica bastante la codificación. Podía haber usado una base de datos SQL, pero no quería el engorro de tener que instalar los 150 MB del SQL Server Express en cada cliente. Quizás algún día añada una pequeña base de datos SQL Compact, más portable ya que sólo ocupa 1,5 MB y con sólo agregar la dll con las clases al proyecto ya funcionaría en todos los ordenadores.
Bueno cuelgo el enlace y aviso que durante esta semana y la siguiente iré testeando que funcione todo correctamente y es posible que hayan actualizaciones en la versión, y como los recursos son los que hay, agradecería si alguien ve algún error o alguna cosa a mejorar que me lo comenté hasta ir corrigiendolo todo y que funcione igual de bien en todos los ordenadores. Bueno pues con esto doy por acabado el desarrollo de esta aplicación para centrame aplicaciones más complejillas y más profesionales, con interfaces más modernas, ahora usando JAVA y apache Derby, y este va a ver mi siguiente post relacionado con acceso a bases de datos en aplicaciones JAVA.

Notas:
23/02/2013 - versión 0.2b.
26/02/2013 - cambio en el módulo para detectar cuentas repetidas y en la creación de la referencia.
16/03/2013 -  se va a agregar la norma 34.1 al proyecto y el formato de fichero específico para trabajar con 'ING Direct', que no acepta la Norma34. Es muy importante que las transferencias que sean a no residentes no superen los 12.500 € ya que en este caso hay que comunicarlo para la balanza de pagos. Se añadirá esa advertencia al programa y es posible que en un futuro lo habilite para permitir ese tipo de transferencia especiales y transferencias transfronterizas.
-En 'opciones '--> 'usar como referencia de pago la cuenta del beneficiario' se usará la cuenta del beneficiario para crear la referencia de cada transferencia.
**Novedad**
23/06/2013 - Se le añade una base de datos para poder tener almacenados varios emisores y se cambia por completo el módulo para leer ficheros desde Excel para no dar problemas con versiones diferentes a la 2010.

**Novedad**
21/10/2013 - Se añade la posibilidad de elegir usar como referencia del beneficiario un código generado automáticamente o un nif previamente importado o en su ausencia la cuenta + dígito de control del beneficiario. Estas opciones se activan en el Menú Opciones marcando la casilla Referencia. Se añade en la carpeta Ejemplos nuevos ficheros con el nif añadido.



y...
En la entrada Norma1934CreatorSEPA en MARZO 2014 está una versión más actualizada de este programa compatible con SEPA.


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.