Page 6 of 8

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 1:12 pm
by AngelSalom
No acabo de entender tu postura Juanp. Entras en este foro con un mensaje de presentación que me parece perfecto. Se te indica una posible solución a la que algunos miembros del foro hemos decidido apoyar y colaborar para llevarla a cabo desde bastante antes de que aparecieras por aquí. Puedo comprender que esa solución no te guste o no se te acople o lo que sea, pero de ahí a ir despotricando y "pelando" al personal que decida usarla hay un abismo.

Si te molestas en ver el archivo de mensajes entenderás porque algunos confiamos plenamente en el saber hacer de Rafa y Quim, llevan muchísimos años colaborando con la comunidad y en infinidad de ocasiones han donado de forma altruista grandes clases que han aportado mucho y muy bueno a este lenguaje.

No digo que tu idea de cómo debe hacerse sea mejor o peor, sencillamente como en todo en esta vida hay infinidad de opiniones, pero desde el respeto por favor.

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 2:40 pm
by josevalle
Hola:
Yo tengo un dbf con las cabeceras de las facturas. Y he puesto solo dos campos adicionales.
{"SII_CSV ","C", 16, 0},;
{"SII_OK ","C", 1, 0},; // S=ok, 1=aceptada con errores

Cuando parseo la respuesta de la aeat si encuentro el tag
IF cTag="siiR:CSV" ; cCsv:=cDato
y es correcto
ELSEIF cTag="siiR:EstadoRegistro"
IF cDato="Correcto" ; cCorrecta :="S"

Entonces actualizo esos campos de la factura. Y ya se que no la tendré que volver a enviar.
REPLA SII_CSV WITH cCsv
REPLA SII_OK WITH "S"

Aunque dejo la opción por si la han borrado en la web de aeat y la quieren volver a enviar.

Ahora voy a hacer que si hay errores los visualice para que el usuario los corrija. Y antes de enviarlas voy a comprobar que no envie el recargo de equivalencia si es cero, que avise de descripción vacía, etc. Creo que todas las reglas están en en fichero .xsd y que Rafa ya las validará antes de enviar nada.

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 2:48 pm
by AngelSalom
Hola Jose, por las pruebas que he hecho no se puede borrar una factura desde la AEAT. Permite anularla y la deja marcada como Anulada y Modificada.
Si entonces intentas enviar la factura con el mismo número te devuelve un "3000 - Factura duplicada"

Yo he contemplado el proceso de "baja" desde la aplicación y el resultado es el mismo, la marca como Anulada pero no permite reutilizar el número.

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 3:47 pm
by juanp
AngelSalom wrote:Hola Jose, por las pruebas que he hecho no se puede borrar una factura desde la AEAT. Permite anularla y la deja marcada como Anulada y Modificada.
Si entonces intentas enviar la factura con el mismo número te devuelve un "3000 - Factura duplicada"

Yo he contemplado el proceso de "baja" desde la aplicación y el resultado es el mismo, la marca como Anulada pero no permite reutilizar el número.




¿ Estas diciendo que has modificado tu programa para que, en la bbdd de tu programa, ahora las facturas no se borren, sino que se marquen como anuladas ?

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 3:57 pm
by AngelSalom
No, en mi programa igual elimino la factura pero creo un registro para que se envíe la "baja" al SII.
Realmente lo que tengo es una tabla en la que creo un registro (IDSII , por ejemplo). Luego cada factura (emitida, recibida) se relaciona con el IDSII, de este modo cuando hago envíos me baso en la tabla donde tengo todos los identificadores y ahí es donde marco si está enviado, modificado o anulado ... no se si me explico bien :lol: :lol:

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 4:25 pm
by juanp
Angel,

no se si me explico bien :lol: :lol:


Seguro que te explicas perfectamente y yo de la misma forma quisiera entenderte.

Por lo que entiendo en esa tabla tienes un registro por factura, es decir, relacion uno a uno.
En sesa tabla tienes un campo que indica el estado de la factura.

Pero ese estado no me termina cuadrar:

Será enviado cuando envies la factura a la sede electronica
Será anulado CUANDO BORRES LA FACTURA EN TU PROGRAMA. Si es así, entonces no refleja el estado actual de la factura, sino el futuro, cuando sea enviado y tramitado el xml que incluya la baja.
Será modificado ¿ cuando ? ¿ Cuando envies la factura modificada ?

A ver si por favor me lo aclaras, ese tema me tiene la cabeza descuadrada, intentando hacerlo de la mejor manera posible.

Saludos

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 4:36 pm
by juanp
juanp wrote:Angel,

no se si me explico bien :lol: :lol:


Seguro que te explicas perfectamente y yo de la misma forma quisiera entenderte.

Por lo que entiendo en esa tabla tienes un registro por factura, es decir, relacion uno a uno.
En sesa tabla tienes un campo que indica el estado de la factura.

Pero ese estado no me termina cuadrar:

Será enviado cuando envies la factura a la sede electronica
Será anulado CUANDO BORRES LA FACTURA EN TU PROGRAMA. Si es así, entonces no refleja el estado actual de la factura, sino el futuro, cuando sea enviado y tramitado el xml que incluya la baja.
Será modificado ¿ cuando ? ¿ Cuando envies la factura modificada ?

A ver si por favor me lo aclaras, ese tema me tiene la cabeza descuadrada, intentando hacerlo de la mejor manera posible.

Saludos



Bueno, me respondo,

Supongo que lo que tienes es una tabla mas o menos asi


SiiEstado.Dbf
-------------------
Numero_Factura C 20
Estado_Factura C 10
Anulada_Factura L 1


Así cuando la factura es anulada, rapidamente creas un registro marcandolo como Anulada_Factura a True y Estado_Factura a "Pendiente"

¿ Es eso ?

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 4:44 pm
by AngelSalom
Viene a ser así. Escribo desde el móvil, luego cuando llegue a la oficina te copio unos pantallazos.

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 5:28 pm
by AngelSalom
juanp, te cuento.

Lo cierto es que estuve dando bastantes vueltas para ver qué sistema me simplificaría más las cosas, y además y muy importante, no afectara al resto del funcionamiento del programa. Dado que tenemos bastantes cientos de usuarios registrados, y de momento sólo cinco o seis van a ser los que van a utilizarlo, por ello que no quiero que el tema del SII sea muy "intrusivo" en la interfaz. De este modo llegué a la conclusión de crear un registro único para todos los documentos y un menú "aparte" en el programa que sólo se activara si el usuario desea utilizar el SII.

De este modo tengo esta tabla
Code: Select all  Expand view
DEFINE DATABASE SII NAME "Registro SII"
  FIELD IDSII       TYPE N LEN   6 BROWSE  1  NAME "Identificador para relacionar documentos con tabla SII"  
  FIELD FECHA       TYPE D LEN   8 BROWSE  3  NAME "Fecha de la factura"
  FIELD FECHAREC    TYPE D LEN   8 BROWSE  4  NAME "Fecha de recepción del documento"
  FIELD DOCUMENTO   TYPE C LEN  30 BROWSE  5  NAME "Documento"
  FIELD TIPODOC     TYPE C LEN  50 BROWSE  6  NAME "Tipo Documento"
  FIELD TIPOFAC     TYPE C LEN   2            NAME "Tipo de factura"
  FIELD TIPOFACL    TYPE C LEN 100 BROWSE  7  NAME "Literal tipo de factura"
  FIELD REGIMEN     TYPE C LEN   2            NAME "Clave de regimen especial o trascendencia"
  FIELD REGIMENL    TYPE C LEN 100 BROWSE  8  NAME "Literal regimen especial o trascendencia"
  FIELD SIIDESC     TYPE C LEN  50 BROWSE  9  NAME "Descripción de la operación"
 
  // Estados
  FIELD MODIFICADO  TYPE L LEN   1 BROWSE 10  NAME "Modificado"
  FIELD BAJA        TYPE L LEN   1 BROWSE 11  NAME "Marcado para baja"
  FIELD ES_BAJA     TYPE L LEN   1 BROWSE 12  NAME "Registro dado de baja"
  FIELD ENVIADO     TYPE L LEN   1 BROWSE 12  NAME "Registro enviado"
  FIELD EXITO       TYPE L LEN   1 BROWSE 13  NAME "Enviado con éxito"

 
  // Registros de envio
  FIELD CSV         TYPE C LEN  50            NAME "Identificador CSV - Respuesta del SII"
  FIELD VSII        TYPE C LEN  10            NAME "Versión SII de la comunicación - Respuesta del SII"
  FIELD ESTADOENV   TYPE C LEN  50            NAME "Estado envío - Respuesta del SII"
  FIELD TIMESTAMP   TYPE C LEN  50 BROWSE 14  NAME "TimeStamp - Respueta del SII"
 
  // Información extra
  FIELD PARTIDA     TYPE C LEN  13            NAME "Partida de la factura"  
 
  INDEX IDSII TO SII1
END DATABASE


En esta tabla el campo IDSII lo tengo creado también en facturas de compra y facturas de venta. Cuando se crea una factura, directamente creo un registro en la tabla SII con el mismo IDSII que no puede repetirse. Luego tengo una opción en el menú para acceder directamente a la tabla SII y de ahí hacer las operaciones de selección, envío y comprobación de resultados.

Básicamente el esquema de funcionamiento es :
- Creo factura : creo registro en SII
- Modifico factura : si SII->ENVIADO=.F. , dejo modificar, si SII->ENVIADO=.T. también dejo modificar pero aviso y marco el campo SII->MODIFICADO a .T.
- Borro factura : si SII->ENVIADO=.F., dejo borrar, si SII->ENVIADO=.T. también dejo borrar pero aviso y marco el campo SII->BAJA a .T.

De este modo cuando voy a hacer el envío al SII se los registros que tengo que añadir (ENVIADO=.F.), modificar (ENVIADO=.T. .AND. MODIFICADO=.T.) ó dar de baja (ENVIADO=.T. .AND. BAJA=.T.).

Con el resultado si va todo bien ya voy marcando , ENVIADO a .T. , EXITO a .T., pongo BAJA a .F. y ES_BAJA a .T. (esto último por tener claro si ya ha sido transmitido y dado de baja o si aún está pendiente de transmitir).

Por otro lado tengo otro fichero de líneas relacionado con la tabla SII donde guardo el resultado de la comunicación de cada registro de la tabla SII ya que pueden ser varios (alta, modificaciones varias, bajas ) De este modo se puede ver todo lo que ha pasado con cada factura.

Te pego un pantallazo que a veces se ve más claro porque menudo "tocho" me ha quedado :mrgreen: :mrgreen:

Image

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 5:57 pm
by juanp
Magnífico Angel y gracias por el aporte que sin duda nos servirá a todos.
Ya se ve que te lo has trabajado. Felicidades.

Se me ocurre que estos campos:
Code: Select all  Expand view

  // Registros de envio
  FIELD CSV         TYPE C LEN  50            NAME "Identificador CSV - Respuesta del SII"
  FIELD VSII        TYPE C LEN  10            NAME "Versión SII de la comunicación - Respuesta del SII"
  FIELD ESTADOENV   TYPE C LEN  50            NAME "Estado envío - Respuesta del SII"
  FIELD TIMESTAMP   TYPE C LEN  50 BROWSE 14  NAME "TimeStamp - Respueta del SII"


deberían ir al historico... aunque en el registro sii del documento tampoco está mal que esten porque asi tienes ahi los ultimos... mas a mano.

Por cierto ¿ Como compruebas si una factura ha sido modificada ?





AngelSalom wrote:juanp, te cuento.

Lo cierto es que estuve dando bastantes vueltas para ver qué sistema me simplificaría más las cosas, y además y muy importante, no afectara al resto del funcionamiento del programa. Dado que tenemos bastantes cientos de usuarios registrados, y de momento sólo cinco o seis van a ser los que van a utilizarlo, por ello que no quiero que el tema del SII sea muy "intrusivo" en la interfaz. De este modo llegué a la conclusión de crear un registro único para todos los documentos y un menú "aparte" en el programa que sólo se activara si el usuario desea utilizar el SII.

De este modo tengo esta tabla
Code: Select all  Expand view
DEFINE DATABASE SII NAME "Registro SII"
  FIELD IDSII       TYPE N LEN   6 BROWSE  1  NAME "Identificador para relacionar documentos con tabla SII"  
  FIELD FECHA       TYPE D LEN   8 BROWSE  3  NAME "Fecha de la factura"
  FIELD FECHAREC    TYPE D LEN   8 BROWSE  4  NAME "Fecha de recepción del documento"
  FIELD DOCUMENTO   TYPE C LEN  30 BROWSE  5  NAME "Documento"
  FIELD TIPODOC     TYPE C LEN  50 BROWSE  6  NAME "Tipo Documento"
  FIELD TIPOFAC     TYPE C LEN   2            NAME "Tipo de factura"
  FIELD TIPOFACL    TYPE C LEN 100 BROWSE  7  NAME "Literal tipo de factura"
  FIELD REGIMEN     TYPE C LEN   2            NAME "Clave de regimen especial o trascendencia"
  FIELD REGIMENL    TYPE C LEN 100 BROWSE  8  NAME "Literal regimen especial o trascendencia"
  FIELD SIIDESC     TYPE C LEN  50 BROWSE  9  NAME "Descripción de la operación"
 
  // Estados
  FIELD MODIFICADO  TYPE L LEN   1 BROWSE 10  NAME "Modificado"
  FIELD BAJA        TYPE L LEN   1 BROWSE 11  NAME "Marcado para baja"
  FIELD ES_BAJA     TYPE L LEN   1 BROWSE 12  NAME "Registro dado de baja"
  FIELD ENVIADO     TYPE L LEN   1 BROWSE 12  NAME "Registro enviado"
  FIELD EXITO       TYPE L LEN   1 BROWSE 13  NAME "Enviado con éxito"

 
  // Registros de envio
  FIELD CSV         TYPE C LEN  50            NAME "Identificador CSV - Respuesta del SII"
  FIELD VSII        TYPE C LEN  10            NAME "Versión SII de la comunicación - Respuesta del SII"
  FIELD ESTADOENV   TYPE C LEN  50            NAME "Estado envío - Respuesta del SII"
  FIELD TIMESTAMP   TYPE C LEN  50 BROWSE 14  NAME "TimeStamp - Respueta del SII"
 
  // Información extra
  FIELD PARTIDA     TYPE C LEN  13            NAME "Partida de la factura"  
 
  INDEX IDSII TO SII1
END DATABASE


En esta tabla el campo IDSII lo tengo creado también en facturas de compra y facturas de venta. Cuando se crea una factura, directamente creo un registro en la tabla SII con el mismo IDSII que no puede repetirse. Luego tengo una opción en el menú para acceder directamente a la tabla SII y de ahí hacer las operaciones de selección, envío y comprobación de resultados.

Básicamente el esquema de funcionamiento es :
- Creo factura : creo registro en SII
- Modifico factura : si SII->ENVIADO=.F. , dejo modificar, si SII->ENVIADO=.T. también dejo modificar pero aviso y marco el campo SII->MODIFICADO a .T.
- Borro factura : si SII->ENVIADO=.F., dejo borrar, si SII->ENVIADO=.T. también dejo borrar pero aviso y marco el campo SII->BAJA a .T.

De este modo cuando voy a hacer el envío al SII se los registros que tengo que añadir (ENVIADO=.F.), modificar (ENVIADO=.T. .AND. MODIFICADO=.T.) ó dar de baja (ENVIADO=.T. .AND. BAJA=.T.).

Con el resultado si va todo bien ya voy marcando , ENVIADO a .T. , EXITO a .T., pongo BAJA a .F. y ES_BAJA a .T. (esto último por tener claro si ya ha sido transmitido y dado de baja o si aún está pendiente de transmitir).

Por otro lado tengo otro fichero de líneas relacionado con la tabla SII donde guardo el resultado de la comunicación de cada registro de la tabla SII ya que pueden ser varios (alta, modificaciones varias, bajas ) De este modo se puede ver todo lo que ha pasado con cada factura.

Te pego un pantallazo que a veces se ve más claro porque menudo "tocho" me ha quedado :mrgreen: :mrgreen:

Image

Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 7:59 pm
by AngelSalom
Así es, en el histórico guardo estos campos y en la tabla SII tengo los de la última comunicación.

Respecto a comprobar si una factura ha sido modificada : guardo fecha, cliente o proveedor y el importe en variables locales antes de modificar. Cuango la grabo compruebo si difieren de los datos almacenados. También uso xBrowse modificado con una DATA que actualizo si ha sido alterado.

Ahora estoy trabajando en obtener un listado desde el SII de las facturas enviadas y cotejarlas con las que tengo en el registro "por si acaso". De todos modos aún me quedan probar envíos de bastantes combinaciones de facturas ... entiendo que la mayoría de usuarios tendrán de sobra con facturas nacionales y tal ... pero habrá que probarlo todo porque vaya telita si hay ... uf!!!

juanp wrote:...
Se me ocurre que estos campos:
Code: Select all  Expand view

  // Registros de envio
  FIELD CSV         TYPE C LEN  50            NAME "Identificador CSV - Respuesta del SII"
  FIELD VSII        TYPE C LEN  10            NAME "Versión SII de la comunicación - Respuesta del SII"
  FIELD ESTADOENV   TYPE C LEN  50            NAME "Estado envío - Respuesta del SII"
  FIELD TIMESTAMP   TYPE C LEN  50 BROWSE 14  NAME "TimeStamp - Respueta del SII"


deberían ir al historico... aunque en el registro sii del documento tampoco está mal que esten porque asi tienes ahi los ultimos... mas a mano.

Por cierto ¿ Como compruebas si una factura ha sido modificada ?


Re: Suministro Inmediato de Informacion - SII

PostPosted: Thu May 18, 2017 8:52 pm
by juanp
Ahí estamos, vaya telita...

En algún momento, se me ocurrió utilizar el WS para cotejar los datos y así saber lo que hay que dar de alta, de baja o modificacion.
Ejemplo 1: si tengo yo la factura y no la tienen "ellos", pues eso es un alta.
Ejemplo 2: si la factura tiene unos importes distintos a los suyos, pues eso es una modificacion.

Pero lo descarté, por ser una locura.. ¿ o no ?



Así es, en el histórico guardo estos campos y en la tabla SII tengo los de la última comunicación.

Respecto a comprobar si una factura ha sido modificada : guardo fecha, cliente o proveedor y el importe en variables locales antes de modificar. Cuango la grabo compruebo si difieren de los datos almacenados. También uso xBrowse modificado con una DATA que actualizo si ha sido alterado.

Ahora estoy trabajando en obtener un listado desde el SII de las facturas enviadas y cotejarlas con las que tengo en el registro "por si acaso". De todos modos aún me quedan probar envíos de bastantes combinaciones de facturas ... entiendo que la mayoría de usuarios tendrán de sobra con facturas nacionales y tal ... pero habrá que probarlo todo porque vaya telita si hay ... uf!!!

Re: Suministro Inmediato de Informacion - SII

PostPosted: Fri May 19, 2017 7:01 am
by AngelSalom
Pues tampoco es tan descabellado ... es otro planteamiento. De todos modos como aún no tengo claro el tema del listado de facturas que remiten (he visto que se pueden paginar los resultados en función a ciertas variables), aún no me aventuro a decir nada, cuando lo tenga bien comprobado lo expongo por aquí.

Saludos!

juanp wrote:Ahí estamos, vaya telita...

En algún momento, se me ocurrió utilizar el WS para cotejar los datos y así saber lo que hay que dar de alta, de baja o modificacion.
Ejemplo 1: si tengo yo la factura y no la tienen "ellos", pues eso es un alta.
Ejemplo 2: si la factura tiene unos importes distintos a los suyos, pues eso es una modificacion.

Pero lo descarté, por ser una locura.. ¿ o no ?




Re: Suministro Inmediato de Informacion - SII

PostPosted: Fri May 19, 2017 7:19 am
by juanp
Pero si es que al final, como un rio que inexorablemente, a pesar de todos los obstáculos, confluye en el mar, digo que al final tendremos que hacer un proceso de "cuadre", consistente en ver qué tiene la sede electrónica, ver qué tengo yo y sincronizar la sede electronica. ¿ O me equivoco ?

Re: Suministro Inmediato de Informacion - SII

PostPosted: Fri May 19, 2017 7:26 am
by AngelSalom
No habrá más remedio, al menos antes de la declaración mensual, para ver que las cifras cuadren :roll: :roll: :roll: