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);
}
//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);
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());
}
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);
}
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
// 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
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 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;
}
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);
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);
}
}
// 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.
Como siempre cuelgo resultado de la compilación del proyecto en este link.
No hay comentarios:
Publicar un comentario