domingo, 28 de abril de 2013

555, 550, 551: Las cuentas malditas.


Buenas en este post voy a hablar sobre 3 fantásticas cuentas que existen en contabilidad que son el fiel reflejo de un pequeño caos contable.
Según el PGC:
55. Otras cuentas no bancarias.
550. Titular de la explotación
551. Cuenta corriente con socios administradores
555. Partidas pendientes de aplicación

La cuenta 550 es la del titular de la explotación y tiene sentido para aquellas personas físicas que son empresarios o profesionales que tributan en el IRPF a través de Rendimientos de Actividades Económicas y Profesionales. En esta cuenta se anotaría los reintegros que hace el empresario con un fin personal. También los ingresos en efectivo que hace el empresario. Se cancelará contra la cuenta 102 al cierre del ejercicio.

La cuenta 551 es la equivalente para personas físicas y en esta cuenta se anotaría fundamentalmente los reintegros que hacen los socios y que nada tienen que ver con la actividad de la empresa. También los ingresos en efectivo que hacen los socios, pero en este caso habría que ver si es en realidad un préstamo a la empresa y con el correspondiente tipo de interés y la retención por parte de la empresa al devolver el dinero al socio.

La cuenta 555 viene a ser la cuenta en la que se registran las partidas pendientes de asignación porque aún no se ha averiguado a la cuenta correcta a la que va. Pero en realidad sirve para lo mismo que las otras dos, y en cada cierre de impuestos suele haber un buen saldo deudor.

Pues bien en estas 3 cuentas viene a estar una gran parte del caos que existe en las contabilidades de las Pymes -y no tan Pymes- y el problema es el desconocimiento de cómo se deben regularizar.

La diferencia está en donde se tributa: en Renta o en Sociedades. 
En la cuenta 550 irán los reintegros y gastos no deducibles pagados por empresario individual persona física que ejerce una actividad y como para la Renta sólo se necesita la Cuenta de Pérdidas y Ganancias, el saldo de la 550 se cancelará contra la cuenta 102. Lógicamente aquí actividad empresarial y vida personal se mezclan, pero no hay problema porque lo relacionado con la actividad empresarial está en la cuenta de Pérdidas y Ganancias y a partir de ella se tributará en Renta a un tipo marginal del 52 %.
Ahora hablamos de personas jurídicas: si un empresario que tiene una sociedad saca dinero de la sociedad para usos personales, por ejemplo, compra con la tarjeta de la sociedad artículo en un establecimiento famoso de moda (gasto fiscalmente no deducible), esto es = a un reintegro. El movimiento contable sería el siguiente:
Lógicamente si se repone en un plazo no significativo no pasa nada. El problema es cuando no se repone y en esa cuenta se acaban contabilizando pagos de gastos fiscalmente no deducibles durante todo el año. En principio el contable ya hecho lo correcto, porque si contabiliza la factura del establecimiento de moda como gasto eso es incorrecto ya que no es gasto fiscalmente deducible, y ya no digamos si se deduce el IVA.
Lógicamente a las cosas hay que llamarlas por su nombre y esa compra se tendría que haber hecho en cuenta personal del administrador/socio/gerente y no en la cuenta de la sociedad. A efectos contables quedaría como si le ha hubiese anticipado la nómina del mes y que como toda nómina está sujeta a retención.

Pero aquí si se explican bien las cosas el empresario puede obtener un ahorro fiscal ya que estará dado de alta en el RETA y su nómina no cotiza (porque la Seguridad Social se paga con el recibo de autónomos), y sólo tributará. Lógicamente el más o menos 29 % de Seguridad Social a cargo de la empresa no lo tendrá y con eso conseguirá un ahorro fiscal. Si el importe de lo reintegrado no fiscalmente deducible es muy elevado, también se podría considerar los importes de las cuentas 551 y 553  como dividendos a cuenta -no deducibles fiscalmente- que tendrán una retención del 21 %, estando exentos los primeros 1500  €, o como un préstamo, que se tendría que formalizar ante notario/Hacienda y que el empresario lo tendrá que devolver y se devengarán intereses valorados a valor de mercado (aquí nada del 0 % de interés, usa el interés legal de dinero y Hacienda nunca te sancionará) por ser operación vinculada.

Un asiento contable típico que hay en todas las empresas de gasto no deducible pagado por la sociedad, para no poner el asiento de la compra del Zara que es un poco cutre pero que sería la misma idea, es el de los autónomos del socio/gerente/administador que se paga por la cuenta de la empresa (supongo que el socio presta servicios a la empresa, tiene una nómina de 2500 € brutos y la retención es del 18 %):

Eso sí luego habrá que explicarle al administrador/socio/gerente porqué sólo cobra 1761 €. Pero que quede claro que su nómina no ha variado, sigue siendo de 2500 € brutos, lo que ha variado es como se ha pagado. También se podría sumar añadir ese importe como más bruto de la nómina para que cobre lo mismo.
No hay que olvidar que los autónomos son deducibles en la renta, cosa que Hacienda lo reconoce en los datos fiscales pero no lo tiene en cuenta en el cálculo del borrador y estamos hablando de unos 3000 € al año a restar en la base.
También una alternativa para el asiento anterior, si queremos que en determinados programas contables aparezca en el importe de los autónomos en el M190 y en certificado de retenciones y se eviten problemas y malentendidos con Hacienda a la hora del cálculo del % de retención:

En el caso anterior para el pago de los autónomos se haría un asiento de la 476 a la 572.

lunes, 15 de abril de 2013

Crear pdf en .NET con iTextSharp


Buenas en este post voy a explicar como se crean pdf en .NET usando la librería iTextSharp. ITextSharp es una librería que permite crear pdfs de forma muy simple para aplicaciones en .NET y en Java (allí es llamada iText). Por ahora voy a crear el proyecto en .NET. En el siguiente post repetiré el proceso continuando el proyecto de retribuciones en especie del post anterior. El proyecto será muy simple: un formulario con una caja de texto y un botón. Luego mostraré un proyecto ya más profesional para que se vea lo fácil y lo bien que queda integrado en nuestras aplicaciones. También se podría usar esa librería para crear pdfs con los datos que tenemos en nuestras bases de datos pero aquí he de reconocer que me decanto más por usar informes, ya que me permiten exportar el contenido a pdf, Excel o Word. Pero para todo siempre hay opciones y gustos.
Bueno cuelgo aquí el vídeo y en el siguiente post continuaremos en Java donde hay muchas cosas por aprender.


A parte estoy preparado un post, ya que ahora comienza la fiesta con la campaña de la Renta 2012, Cuentas Anuales 2012 y en 2 meses el Impuesto sobre Sociedades 2012, en el que hablaré un poco sobre algunos conceptos de fiscalidad y legislación mercantil.

domingo, 7 de abril de 2013

Crear un Excel desde Java usando Apache POI

Buenas en este post voy a continuar con el tema de las retribuciones en especie pero desde un punto de vista más informático y voy a crear una sencilla aplicación para escritorio en Java que según los valores entrados en unas cajas de texto calculará el importe de la retribución en especie. Con esto vamos a automatizar el cálculo y así repasamos un poco como crear este tipo de aplicaciones con Netbeans. A parte voy explicar lo sencillo que es crear un fichero Excel desde Java. El Excel con los cálculos de la retribución en especie anual se podría adjuntar a la nómina de mes. Para crear Excels voy a usar una librería llamada apache Poi disponible en http://poi.apache.org/ Hay más librerías para Java iguales de buenas y que nos permiten automatizar la creación de Excels.

En un siguiente post explicaré cómo crear un pdf con “la factura que la empresa emite al trabajador” para ir repercutiendo al trabajador la parte proporcional del IVA que la empresa se ha deducido por la adquisición del vehículo. Entonces usaré otra librería que sirve tanto para proyectos para Java como para Net llamada iTextSharp o iText.  Como ya he comentado en el post anterior sólo se tendrá que repercutir el IVA al trabajador siempre que la empresa haya optado por deducirse el 100 % del IVA soportado en la compra o renting del vehículo que cede para el uso del trabajador.
Pues bien primero cuelgo aquí el proyecto ya acabado a la espera de añadir la opción de crear pdfs que será en el siguiente post.

Como vemos es una aplicación muy sencilla que tiene varias cajas de texto para entrar los datos, un botón para calcular los importes y otro botón para crear un Excel. El código para la creación de un Excel en Java es muy sencillo. Hay que entender los siguientes pasos:

Añadir los “import” necesarios:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

Crear un libro de Excel:
Workbook libro = new HSSFWorkbook();

Añadir una hoja al libro:
Sheet hoja = libro.createSheet("Nombre_Hoja");

Crear una fila:
Row fila1 = hoja.createRow(0);

Se accede a la celda 2 de la fila 1:
Cell filaCell = fila1.getCell(1);

Se añade contenido a la celda:
filaCell.setCellValue("Hola");

Una vez todo guardamos el libro:
OutputStream output = new FileOutputStream(“prueba.xls”);
libro.write(output);
output.close();

En la aplicación se puede ver que el proceso de guardado de la hoja Excel es un poco más complejo ya que he usado un JFileChooser. Se puede crear un método al que se le pase el libro de Excel y que lo guarde.
El código sería el siguiente:
    private void CrearExcel(Workbook libro) throws Exception {
        JFileChooser fc = null;
        FileNameExtensionFilter filter = null;
        //Set up the file chooser.
        if (fc == null) {
            fc = new JFileChooser();
            fc.setDialogTitle("Guardar");
            fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
            filter = new FileNameExtensionFilter("Libro de Excel", "xls");
            fc.addChoosableFileFilter(filter);
        }
        //Show it.
        int returnVal = fc.showSaveDialog(this);
        //Process the results.
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            String ext = "";
            if (fc.getFileFilter() == filter) {
                //Set xls extension only to xls files
                String extension = file.getAbsolutePath();
                if (!extension.endsWith(".xls")) {
                    ext = ".xls";
                }
            }
            try (
                    OutputStream output = new FileOutputStream(file + ext);) {
                libro.write(output);
                output.close();
            } catch (FileNotFoundException e) {
                System.err.println(e.getMessage());
            } catch (IOException e) {
                System.err.println(e.getMessage());
            }
        }
        //Reset the file chooser for the next time it's shown.
        fc.setSelectedFile(null);
    }

Como siempre como el proceso puede ser complejo cuelgo un vídeo donde explico cómo se haría.
Como he dicho en el siguiente post me centraré en crear pdfs con Java y a partir de aquí hablaré sobre bases de datos en Java.

viernes, 29 de marzo de 2013

Lío con las retribuciones en especie y el IVA

Uno de los cambios más recientes en materia contable, laboral y fiscal es el tema de cuando la empresa cede un vehículo a uno de sus trabajadores que lo usará para su actividad laboral y para fines personales. Esta práctica era extendida por las empresas que ofrecían las retribuciones en especie como una alternativa a la retribución dineraria ya que beneficia tanto al trabajador como a la empresa. La empresa te  paga el coche, el renting del ordenador o el alquiler del piso y así tú trabajador no lo tendrás que pagar y eso es beneficioso para los dos. Ya sabemos que hablamos de retribuciones en especie cuando el trabajador no ve el dinero, ya que si la empresa le da el dinero al trabajador esto es retribución dineraria.

Vamos por partes con este tema de las retribuciones en especie. Si es del piso de lo que hablamos las cosas han cambiado: si el piso es propiedad de la empresa, será retribución en especie para el trabajador, pero si no lo es (la empresa paga el alquiler a un tercero) a partir del cambio de criterio la mensualidad del alquiler será más salario del trabajador, que cotiza y tributa. Como el alquiler de un piso para los trabajadores está exento de IVA aquí no hay confusión con si se debe repercutir IVA al trabajador, porque la empresa no se podrá deducir ningún IVA y además Hacienda considera que está subarrendando (exento también).
Ahora lo explico con el caso del coche (o el ordenador), que es diferente. Hasta ahora no había un criterio único por lo que se refiere al coche, muchas empresas sólo se deducían el 50 % del IVA del vehículo y el otro 50 % como gasto, ya que Hacienda siempre aceptaba que el uso privado no deducible en el IVA era del 50 %. En caso contrario tú tenías que probar ante la inspección que el uso afecto a la actividad es superior y sólo te dejaban deducirte el 100% del IVA en aquellos casos en los que ya el propio artículo 95.- tres regla 2ª de la Ley del IVA especificaba claramente que el porcentaje de deducción es del 100. %. Lógicamente en este caso Hacienda aceptaba que no vas a ir con, por ejemplo, una ambulancia a pasar el fin de semana en la playa.
Pero el nuevo criterio se basa en que cuando empresario haya pactado con el trabajador pagarle menos a cambio de pagarle el coche, es decir, cambiar retribución dineraria por retribución en especie, la empresa se deducirá el 100 % del IVA en la adquisición del vehículo (siempre que se adquiera a un empresario o profesional) y luego repercutirá ese IVA al trabajador (según las normas de valoración del IRPF, por ejemplo). Si puedes demostrar que el trabajador no ha renunciado a retribución dineraria a cambio de retribución en especie, es decir, que cobra lo mismo o más que antes, pues no se devenga IVA, pero la empresa no se deducirá ningún IVA.  Pero ese nuevo criterio es peligroso de defender ante la inspección de trabajo porque si te detectan ese movimiento te pueden hacer cotizar lo que no has cotizado. Lógicamente te pago menos = menos base de cotización de la nómina del trabajador = menos TC1. Aquí este primer punto que por consultas que recibo veo que hay mucha confusión.

¿Qué es lo que dice Hacienda? Hacienda te deja deducir el 100 %  del IVA soportado de un vehículo cedido a un trabajador bajo la condición de ir repercutiendo poco a poco el IVA por dicha cesión. Es decir que para Hacienda haciendo así las cosas recibirás su bendición pero no ante la Inspección de trabajo. Aquí no digas que “he pactado con el trabajador cambiar retribución dineraria por retribución en especie que así cotizo menos”.

Es decir que para que la empresa se pueda deducir el 100 % del IVA soportado en la adquisición de un vehículo destinado al uso de un trabajador ha de repercutir IVA al trabajador (y puede usar las de valoración del IRPF para hallar la base imponible). En este caso los gastos accesorios al vehículo (gasolina, reparaciones, etc...)  son deducibles al 100 %.
Si no siempre se puede aplicar el anterior criterio de deducir al 50 % el iva de la adquisición del vehículo y el 50 % de los gastos accesorios hasta que Hacienda clarifique criterio.
Pero ha de quedar claro una cosa, que si el vehículo se adquiere sin IVA (de un particular o del régimen especial de vehículos usados) el IVA de ninguno de los gastos será deducible.

Otro tema es la venta del vehículo. Si el IVA se ha soportado al 100 % y los gastos deducidos al 100 %, se habrá de repercutir al 100 %, si se ha soportado al 50 % y los gastos al 50 %, pues al 50 % y si se ha soportado al 0 %, pues aquí está el tema.

Si lo has comprado con IVA al 0 %, en la Agencia Tributaria interpretan que si te has deducido el IVA en los gastos accesorios al vehículo, la compra del vehículo deja de estar exenta de IVA y por lo tanto en la venta del vehículo debes repercutir IVA, independientemente de si en su compra no te lo dedujiste. Es una interpretación del artículo 20 de la Ley de IVA.

Para hallar el importe de la retribución en especie ocurre que si el vehículo se ha adquirido mediante un renting el lugar de coger el precio de adquisición tomaremos el valor de mercado del vehículo como si fuese nuevo. Partimos del coste de adquisición o del valor de mercado del vehículo como nuevo y  ese importe se multiplica por el 20 % y por el % de utilización para fines privados. Al total resultante se le multiplicará por el % de retención que tenga el trabajador en Renta para hallar el importe del ingreso a cuenta.
Pero cuidado porque para calcular la base imponible de la “factura que emites al trabajador” sólo cogeremos el precio de adquisición o valor de mercado del vehículo más los impuestos, sin tener en cuenta ni el IVA ni el ingreso a cuenta, y multiplicaremos la base imponible por el 20 % y por el % de uso privado.

Bueno esto es un follón así que pondré un ejemplo numérico:
Por ejemplo una empresa compra un vehículo por 15.000 € más 3.150 € de IVA más 1.850 € de impuesto sobre matriculación. Este vehículo se va a ceder a un trabajador que tiene un porcentaje de retención del 15% y el uso para fines personales del vehículo será del 50 %.
Primero se calcula el valor de la retribución en especie y del ingreso a cuenta anual (y entre 12 sería el importe mensual):

Concepto
Importe
Coste adquisición coche
20.000 €
Retribución en especie anual
20.000x20%x50% = 2.000 €
Retribución en especie mensual
166,66 €
Ingreso a cuenta anual
2.000x15% = 300 €
Ingreso a cuenta mensual
25 €
Retribución en especie + ingreso a cuenta anual
(el ingreso a cuenta lo asume la empresa)
2.300 €
Retribución en especie + ingreso a cuenta mensual
191,66 €

Ahora vamos a calcular la base imponible y la cuota de IVA que la empresa repercutirá al trabajador:

Concepto
Importe
Precio adquisición sin IVA
16.850 € (sólo Impuesto Matriculación)
Retribución en especie anual
16.850 x20%x50% = 1.685 €
Base Imponible cada mes
140,41 €
IVA repercutido 21%
29,48 €

Pues bien con esos datos vamos a suponer que la retribución dineraria bruta mensual del trabajador es de 1.700 € y con una retención 255 € (el 15% de 1.700 €) y suponemos que, aparte del ingreso a cuenta que ya hemos dicho que lo asume la empresa como más gasto, con el IVA también la empresa hará lo mismo, lo asume la empresa y no se lo resta del liquido de la nómina del trabajador, considerándose más importe de la cuenta 649.

Pues el asiento de la nómina sería:
31/03/2013

1.700
(640) Sueldos y salarios
HP acreedora retención (4751.0)
255 €
191,66€ + 29,48€
(649) Otros gastos sociales
x
HP acreedora ingreso a
cta. Retr. especie (4751.1)
25 €
593,62 €
(642) Seg. Soc. a cargo de la empresa
Ingresos servicios
personal (755)
166,66 €
Iva repercutido (21%) (477)
29,48 €
Organismos Seg. Soc. Acreedores-TC1 (476)
715,62 €
Remuneraciones pendientes de pago (465)
1323 €

Pues bien en el programa de contabilidad este asiento de nóminas se contabilizaría de la siguiente forma:


En esta nómina para el importe de la cuenta 642 (la cuota patronal) se coge los 1.700 + 191,66 + 29,48 € de la base de cotización y se multiplica por 30,9 % (23,60 % de contingencias comunes + 5,50 % de desempleo + 0,20 % del FOGASA + 0,60 % de FP + 1 % de IT y IMS). El TC1 (cuota obrera + cuota patronal) será el resultado de multiplicar la base de cotización por 37,25% (Sabiendo que al trabajador se le resta un 4,7 % por cotización a Contingencias Comunes + 0,10 % por Cotización por formación + 1,55 % por cotización por desempleo).
Para más información apunto al enlace de las bases y tipos de cotización para el 2013 en la página de la Tesorería de la Seguridad Social en este enlace.
Pues bien este post continúa con el siguiente, que estará disponible a lo largo de la semana, donde vamos a programar un programita en Java que te calculará el importe retribuciones en especie en un periquiete y con esto introduzco el tema de cómo crear Excels en Java.

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.

martes, 1 de enero de 2013

Validar XML con XSD: ideas para validar el modelo 390 del IVA

Buenas en este post voy a tratar un tema de interés tanto para programadores como para contables. Se trata de cómo validar un fichero xml contra un esquema xds y como estamos casi a final de año voy a utilizar un ejemplo real que es la validación del fichero del Resumen Anual del IVA (modelo 390). Para programadores: el modelo 390 contiene la suma de los datos de las declaraciones de IVA presentadas a lo largo del año y además informa a la Agencia Tributaria sobre el importe y la naturaleza de determinadas operaciones tanto de ventas como de compras. Toda persona física o persona jurídica que ejerza una actividad profesional o empresarial y siempre y cuando sus operaciones estén sujetas (exentas o no al IVA) tendrá que presentar los correspondientes modelos 303/310/311 del IVA cada trimestre (o cada mes en el caso del modelo 303 si se dan los requisitos establecidos en la Ley) y el resumen anual de las declaraciones presentadas en el año anterior antes del 30 de enero de año siguiente. Para más información aquí hay un link donde se detalla qué es el modelo 390 y las instrucciones.

El proceso el simple se genera un fichero xml con los datos que están definidos en el diseño del registro que nos proporciona la Agencia Tributaria para la generación del modelo en papel, sólo en el caso de personas físicas, y/o para la presentación telemática del modelo a través de la subida del fichero al servidor de la Agencia Tributaria y la firma digital por el interesado o autorizado. De lo que se trata es de validar este xml contra el esquema xsd que nos ofrece la Agencia Tributaria cada año disponible en el siguiente link.

En visual basic una función interesante para validar tu archivo xml contra un esquema xsd puede ser la siguiente, donde filename es la ruta a tu archivo xml y xsd es la ruta a tu archivo con el esquema xsd:
 Dim success As Boolean

Public Function ValidarXML(filename As String, xsd As String) As Boolean

success = True
Dim ruta As String = xsd

If File.Exists(ruta) Then
'Si existe el archivo valido que cumpla el esquema xsd
Dim settings As New XmlReaderSettings()

settings.ValidationType = ValidationType.Schema
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
settings.Schemas = schemas
schemas.Add(
Nothing, ruta)

settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings
AddHandler settings.ValidationEventHandler, AddressOf ValidationEventHandler
Dim validator As XmlReader = XmlReader.Create(filename, settings)

'Leemos el documento xml, si se produce un error no cumplirá el esquema
While validator.Read()

End While

Else
MessageBox.Show("No se puede validar contra el esquema xds.", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If

Return success
End Function

Public Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
 'Si se ejecuta este código es porque el xml no cumple con el esquema
     success = False
End Sub

Lógicamente crear el xml del modelo 390 sería bastante laborioso pero como la idea es la misma voy a crear un programa en Visual Basic .NET con un botón que abra una caja de diálogo que nos permita seleccionar la ruta en la que se encuentra el fichero xml y una vez elegido el fichero se validará contra el esquema xsd. Así ya validaremos de una forma muy sencilla que el fichero cumple con el esquema evitando muchas líneas de código para validar cada uno de los nodos del fichero xml. Vamos podría ser un suplicio ir leyendo cada nodo e ir validando que no cambie nada.

Vamos a validar que el fichero tenga la misma estructura definida en el esquema y luego quedará por validar el tema que el contenido de los campos de campos sea el correcto. Como puede ser el NIF/NIE/CIF o los importes de bases y cuotas según la estructura del impuesto, pero esto ya es un tema más fiscal. Si de lo que preguntas es cuál es el proceso para generar el fichero xml te diré que con .NET es muy sencillo y lo más complicado es validar que los datos que entra el usuario, antes de guardarlos en la base de datos -que es de donde los coge el programa-, sean correctos. Lógicamente antes de guardar los datos comprobaríamos que los datos que usuario ha entrado en el programa son del tipo y el formato correcto, vamos con validaciones simples ya se puede conseguir lo que buscamos. Una vez tengamos todo validado creamos el xml y validamos que los datos cumplen con el esquema xsd. Lógicamente si esto no se hiciera nos podríamos encontrar luego con errores y eso es inaceptable, sobre todo si el programa lo usa un tercero.  En el mejor de los casos a la hora de subir el fichero al servidor de la Agencia Tributaria para presentarlo nos daría un error y en el peor incluso pero se podría presentar una declaración en principio se aceptarse pero los datos o las casillas informadas no fueran correctas. Bueno todo el proceso que he explicado también puede ser muy útil a la hora de guardar copias de seguridad de los datos en un fichero xml, encriptado o no,  y poder compartir datos entre varias instalaciones de tu programa en diferentes ordenadores de forma muy sencilla. Esta es una alternativa para en lugar de hacer un backup de tu base de datos local puedes guardar los datos en un fichero xml y luego recuperar los datos del xml.
Pues aquí cuelgo un vídeo donde explico un poco el proceso:

Pues bien en el siguiente post una vez acabados los exámenes de enero de la carrera actualizaré algunas aplicaciones como la del modelo 202 que quedaba pendiente porque la estoy replanteando ahora en Java. En próximos vídos quiero explorar el trabajo con bases de datos en Java. Una pincelada: si tienes una aplicación en java y quieres que pueda acceder a una base de datos hay 2 alternativas. Si trabajas con una base de datos MySQL situada en el servidor puedes escribir el código necesario para comunicarte ella y hacer operaciones con tus datos. Pero si te preguntas como puedes conseguir programar en Java lo que en .NET sería una aplicación con una base de datos local Access o SQLite o SQL compact pues la solución es muy sencilla: Apache Derby o Java DB (Embedded) y trabajar Java Persistence API o JPA. Aquí hablaré sobre un FrameWork muy interesante llamado Hibernate. Si te fijas la aplicación que distribuye la AEAT para el modelo 390 usa todo eso.