Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Envío de registros y sus respuestas (https://www.clubdelphi.com/foros/forumdisplay.php?f=66)
-   -   Demo con código Verifactu.dll para (delphi 7) (https://www.clubdelphi.com/foros/showthread.php?t=97004)

seccion_31 12-03-2025 18:56:35

la DLL ya esta modificada

No se cuantos estais utilizando el componente pero este fin de semana publicare la version 2.

Ya no hara falta el registro anterior, y habra que incluir el registroInicial con el primer encadenamiento del envio.

agradecer a los usuarios que me informaron del funcionamiento del encadenamiento, con ese conocimiento aportado he modificado el componente.

Ya detallare mas los cambios una vez se publique.

slds !

ramherfer 17-03-2025 08:22:58

Buenos días. Por favor tengo a raíz de los últimos post una pequeña duda y que pensaba que lo tenía claro.

Entonces, si la AEAT me rechaza una factura ya que contiene errores, en la AEAT está claro que no está, pero yo en el registro del SIF ya tengo uno como incorrecto/rechazado por el motivo que sea un registro.

Ahora bien, ¿Rectifico los errores en la factura (importes,nif, motivos exención,etc... -cualquier dato-) o se debe generar una nueva con los errores corregidos?

¿En el registro SIF dejo el registro de error tal cual para siempre generando un nuevo registro como subsanación por rechazo previo e inexistente en la AEAT y que iria encadenado con el registro SIF que provocó el rechazo?

Entiendo que se rectifica la factura y se genera un nuevo registro en el SIF con los datos correctos y encadenado al registro SIF erróneo. ¿Estoy en lo cierto?

¿Si ha sido aceptada con errores el procedimiento sería el mismo tanto en la factura como en el registro SIF?

Un saludo,

delphiGar 17-03-2025 08:44:21

Cita:

Empezado por ramherfer (Mensaje 562760)
Buenos días. Por favor tengo a raíz de los últimos post una pequeña duda y que pensaba que lo tenía claro.

Entonces, si la AEAT me rechaza una factura ya que contiene errores, en la AEAT está claro que no está, pero yo en el registro del SIF ya tengo uno como incorrecto/rechazado por el motivo que sea un registro.

Ahora bien, ¿Rectifico los errores en la factura (importes,nif, motivos exención,etc... -cualquier dato-) o se debe generar una nueva con los errores corregidos?

¿En el registro SIF dejo el registro de error tal cual para siempre generando un nuevo registro como subsanación por rechazo previo e inexistente en la AEAT y que iria encadenado con el registro SIF que provocó el rechazo?

Entiendo que se rectifica la factura y se genera un nuevo registro en el SIF con los datos correctos y encadenado al registro SIF erróneo. ¿Estoy en lo cierto?

¿Si ha sido aceptada con errores el procedimiento sería el mismo tanto en la factura como en el registro SIF?

Un saludo,

Si los errores del Registro de Facturacion ( RF ) estan contemplados en el Reglamento de Facturacion debes generar una nueva Factura tipo F1 o F2, Anula esa mediante SinRegistroPrevio=S y RechazoPrevio=N. Si por el contrario no esta en Reglamento de Facturacion haces una subsanacion de esa misma Factura mediante Susbanacion=S y RechaPrevio=X.
El encadenamiento recuerda que se hace con el ultimo registro de factuacion generado. De tal forma que si antes del rechazo habias generado otro se encadena a ese ultimo y no al rechazado.

gcqZW 17-03-2025 08:52:16

Cita:

De tal forma que si antes del rechazo habias generado otro se encadena a ese ultimo y no al rechazado.
Despues***

Cita:

Si los errores del Registro de Facturacion ( RF ) estan contemplados en el Reglamento de Facturacion debes generar una nueva Factura tipo F1 o F2
Seria un Rx no?? Si esta contemplado en el ROF significa que estas obligado a rectificar.

delphiGar 17-03-2025 08:55:42

Cita:

Empezado por gcqZW (Mensaje 562765)
Despues***

No, al ultimo RF generado por el SIF

Cita:

Empezado por gcqZW (Mensaje 562765)
Seria un Rx no?? Si esta contemplado en el ROF significa que estas obligado a rectificar.

No, por que ha sido Incorrecto. Distinto seria si fuera aceptada o aceptada con errores, en ese caso seria Rx.

gcqZW 17-03-2025 09:00:14

Cita:

No, al ultimo RF generado por el SIF
Exacto, según como lo has escrito has puesto que hay que encadenar con el ultimo correcto, si antes del rechazado has generado un RF, el rechazado debió estar encadenado a ese y el nuevo que generes ha de estar encadenado al rechazado.

delphiGar 17-03-2025 09:01:23

Cita:

Empezado por gcqZW (Mensaje 562765)
Despues***



Seria un Rx no?? Si esta contemplado en el ROF significa que estas obligado a rectificar.

Ponte en el caso de que estas generando nuevas facturas y el RF que se va a enviar y da Incorrecto esta en espera durante los 60sg para enviar, por eso siempre digo el ultimo generado.

gcqZW 17-03-2025 09:08:01

Si me da que estamos pensando lo mismo solo que hemos interpretado mal las palabras, el dogma es: se encadena al ultimo RF que hayas generado, pensaba que te referías a que se encadena al último RF aceptado que tuvieras. Me ha liado la palabra "antes".

DarkDudae 17-03-2025 09:16:44

Me da la sensación que hay mucha confusión con el tema de encadenamientos.

Hay que saber diferenciar entre Registro de Facturación y Facturación.
El registro de facturación es el que almacena el encadenamiento y las huellas y es el SIF el que debe encargarse de almacenar este registro de facturación. Este registro de facturación tendrá un registro encadenado por cada una de las operaciones que enviamos a VeriFactu, independientemente de que estas hayan sido aceptadas, aceptadas con error, o rechazadas. El encadenamiento no ha de tener en cuenta la respuesta recibida por VeriFactu (al menos no en lo relativo al encadenamiento y huellas previas), así que todos los registros irán inmediatamente enlazados a su registro anterior sin tener en cuenta su aceptación o no en la AEAT.

Por otro lado, tenemos la facturación.
Hay que saber distinguir los casos en los que una factura no ha llegado bien a VeriFactu o ha llegado pero con errores, o directamente, es errónea.

Si haces una subsanación de un registro NO ACEPTADO (el caso de un NIF incorrecto, por ejemplo)
FLAGS:
Subsanacion = S
RechazoPrevio = X

Si haces una subsanación de un registro Aceptado o Aceptado con Errores:
FLAGS:
Subsanacion = S
RechazoPrevio = N

En este último caso (Verifactu tiene los registros aceptados o aceptados con errores), el registro de facturación tendrá el mismo número de factura a subsanar cuando NO estemos obligados a generar una factura rectificativa. En caso de que sea necesaria una factura rectificativa, sí que llevaría el número de factura nuevo con la serie de rectificativas y la nueva numeración pertinente.

seccion_31 17-03-2025 19:59:34

Buenas noches

Ya esta enviada para publicacion la nueva version del componente la 2.0:

Cita:

version 2.0
----------------------------------------------------------------------------------------------------------------------------
-> ATENCION: aumentar el maxstack size minimo a: $00400000
-> ATENCION: Se recomienda deshabilitar range check

Tras recibir nueva informacion sobre el funcionamiento de los encadenanmientos en foro clubDelphi se ha modificado ampliamente
el funcionamiento del componente: Algunos de estos cambios pueden verse aplicados en la DEMO_D7

https://www.clubdelphi.com/foros/sho...d.php?p=559560

Los encadenamientos de un emisor son sobre el registro anterior generado cronologicamente, independientemente de si existe
o no en verifactu y de su serie. Asi ya no es necesario obtener el numero anterior de factura.

De esta forma eliminamos el parametro factura anterior y creamos la funcion registroInicial( ) para establecer el primer encadenamiento
del envio. (que deberia ser simplemente los datos el ultimo registro enviado, en el envio anterior)

TVeriFactu.addRegistroInicial(numserieFactura, fechaFactura, huella:string):boolean;

Asi tenemos la funcion registroInicial para establecer el encadenamiento cero y el resto de encadenamientos anteriores de los siguientes registros
como es cronologico se obtienen del registro indice del array de facturas - 1.

Si NO hay encadenamiento previo (registro Inicial), llamar a la funcion registroInicial con '' (string vacio) en todos los apartados. (o no llamarla).

---> Las huellas siempre se calculan en el momento del envio, (excepto la del registro inicial), dejar el campo huella de la factura sin valor al añadir la factura
Despues del envio se puede recuperar la factura con la nueva funcion TVerifactu.factura (ver abajo) y ahi estara la huella calculada - enviada.

---> ATENCION: Se ha publicado la funcion clear_factura( factura ) para limpiar todos los campos de una factura, previo a cargar datos por el usuario.

Es muy recomendable su uso, ya que algunos campos, especialmente los boolean tienden a quedar =true.

TVeriFactu.clearFactura(var afactura:TRegistroFactura);

Se añaden los siguientes campos en la factura: TRegistroFactura

subsanacion :boolean; // S
rechazoprevioExiste :boolean; // S
rechazoprevioNOExiste:boolean; // X

por defecto clear_factura los dejara a false (entre otros).

---> ATENCION: El indice inicial para analizar el resultado, consultas devueltas, etc... ahora comienzan en 1:

Los bucles quedaran asi:

for j:=1 to resultado.nFacturas do

....

for j:=1 to consulta.nfacturas do

Para una sola factura de consulta:

consulta.facturas[1]

---> ATENCION: Anulacion de facturas:

Añadido en el campo en factura, para la anulacion de factura: sinregistroPrevio:boolean;


Nueva funcion:

TVerifactu.factura(indice:integer; var aFactura:TRegistroFactura):boolean;

Devuelve la factura almacenada en la posicion indice del array. un indice de cero, devolvera los 3 apartados del registro inicial.

Ahora: En el array de resultado del envio de facturas, por cada factura, se envia su posicion indice en el array de facturas almacenadas

Al añadir una factura, se comprueba si existe en el array para ese numero y operacion, impidiendo añadir la misma factura dos veces en esa operacion.

Por tanto ahora las huellas y CSV en el resultado de envio se envian sin posibles fallos de identificacion.

Ver el formulario demo_d7 para comprobar estos cambios.


Modificaciones en consulta de registros:

Ahora la consulta se limpia correctamente antes de empezar su procesamiento

En TConsultaFactura

Timestamp se suprime (corresponde a fechaGenRegistro y horaGenRegistro)

Fecha pasa a FechaGenRegistro
Hora pasa a HoraGenRegistro

Se añaden: (todavia por comprobar)

idPeticion
FechaUltimaModificacion
HoraUltimaModificacion
TipoHuella
PrimerRegistro
Incidencia
clienteCodPais
clientetipoNIF
Subsanacion
RechazoPrevio
inversionSujetoPasivo
SinregistroPrevio

En el array de ivas

calificaciondeoperacion


Añadiendo facturas:

Chequeo de cuotas:

Ahora ya no es necesario indicar la cuotatotal en la factura
Si se indica cuotatotal=0 se sumaran las cuotas de iva y req del array de ivas
Si se indica cuotatotal<>0 debera cuadrar con las cuotas de iva y req del array de ivas

Parametros del sistema informatico:

Se suprime del envio y consulta por no obligatorio: TipoUsoPosibleSoloVerifactu y TipoUsoPosibleMultiOT


----------------------------------------------------------------------------------------------------------------------------
version 1.3 (no publicada)
-----------
Entrega de bienes a Canarias, ceuta y melilla, codigos postales 35 38, 51 y 52:->Automatizacion para entrega de bienes, regimen 02 exportacionn, E2, exentas por el capitulo 21

Corregida asignacion automatica de tiponif para ES

Correccion al enviar el nombre/password en certificados pfx p12

Mas correcciones en la carga de pfx y p12, ahora ya deberia estar correcto

Correccion en consultas, conDatos se quedaba a false, corregido

En tickets, F2 , automaticamente se coloca: canarias=false, e inversionSujetoPasivo=false

-> Se recomienda deshabilitar range check

Corregida asignacion de sesion al limpiar callbacks en inicio de sesion

DarkDudae 18-03-2025 07:27:17

Cita:

Empezado por seccion_31 (Mensaje 562802)
Buenas noches

Ya esta enviada para publicacion la nueva version del componente la 2.0:

Sólo queda agradecerte, una vez más, el trabajazo que has hecho. ¡Gracias por compartirlo!

Neftali [Germán.Estévez] 18-03-2025 09:19:04

La versión 2 del proyecto ya está subida al FTP del club.

Se adjunta el fichero RAR y un pequeño fichero TXT descriptivo de la versión, con el enlace al mensaje y los créditos.

Un saludo.

ramherfer 18-03-2025 09:35:02

Cita:

Empezado por DarkDudae (Mensaje 562807)
Sólo queda agradecerte, una vez más, el trabajazo que has hecho. ¡Gracias por compartirlo!

Claramente y sin paños calientes, sin esta ayuda, hubiese sido incapaz adaptar la aplicación y hubiese tirado el proyecto de años y años de trabajo a la basura. Superé el reto del i.t.e. al i.v.a, superé el reto del efecto 2000, superé el reto del maldito Euro, superé los cambios contables del 2008. Pero esto con gran desesperación y mucha preocupación lo veía imposible. Y gracias al trabajo de este hombre y el inestimable apoyo de otros de vosotros, la aplicación dará más guerra. No se de que forma lo puedo agradecer, siempre considerando que agradecer se queda corto. Solo gracias Sección_31, gracias Foro Club Delphi y gracias a todos aquellos que habeis puesto vuestro granito de arena y habeis permitido que siga en la brecha. Nunca pensé durante dos años de incertidumbres y desesperación que llegaría donde he llegado, ni por asomo.
Tengo una nueva oportunidad "Gracias a vosotros" sin lugar a ninguna duda.

CarlosMz 18-03-2025 10:06:15

Muchas gracias por tu trabajo y compartirlo de esta manera con la comunidad delphi,

A mi personalmente me ayudó mucho tu demo, pues no había usado SOAP nunca antes...

delphiGar 18-03-2025 16:10:56

Aunque no utilizo el componente, vi tu primera demo, y la verdad es que me instruyo bastante, te lo agradeci en su momento y te lo vuelvo a agradecer, eres un maquina!!!!

nincillo 18-03-2025 19:59:18

Yo me empezaré a poner en "serio" con este componente a partir de ahora que ya he conseguido finalizar otras cosas que tenía pendientes.

La verdad es que es de agradecer el curro que os habéis pegado para preparar esta demo y esta dll. Que nos va a servir a muchos como punto de partida para aprender muchas cosas.

Lo primero que voy a intentar entender es como poder aplicar esta dll a todas las variantes que se me pueden dar con mis clientes. Clientes que tienen un servidor y las tiendas se conectan por escritorio remoto, que cada tienda va a generar sus tickets con una numeración independiente y que la numeración de las facturas en unos casos las van a compartir y en otros casos van a tener diferentes series por delegación, etc.

Gracias de nuevo y voy leerme el hilo desde el principio para intentar entender lo más posible todo tu planteamiento.

Un saludo.

mqm 18-03-2025 21:10:26

Muchas gracias. A más de uno nos has salvado la vida.

ramherfer 19-03-2025 08:43:11

Buenos días

En la operaciones de baja / Anulación y teniendo en cuenta el nuevo dato sinRegistroPrevio en el registro de factura, ¿El siguiente código sería correcto?

Código Delphi [-]
      if QRegSifOPERACION.Value = 'BAJA' then begin

         actual.sinregistroPrevio := QRegSifAEAT_REGISTRO_PREVIO.Value;

         if QRegSifAEAT_RECHAZO_PREVIO.Value = 'S' then begin
            actual.rechazoprevioExiste := True;
            actual.rechazoprevioNOExiste := False;
         end;

         if QRegSifAEAT_RECHAZO_PREVIO.Value = 'N' then begin
            actual.rechazoprevioExiste := False ;
            actual.rechazoprevioNOExiste := True;
         end;

      end;

Ya que en el registro de anulación el dato RechazoPrevio está contemplado con el siguiente texto:

Cita:

Indicador que especifica que se está generando -para volverlo a remitir- un nuevo registro de facturación de anulación subsanado tras haber sido rechazado en su remisión inmediatamente anterior, es decir, en el último envío que contenía ese registro de facturación de anulación rechazado. Si no se informa este campo se entenderá que tiene valor "N". Solo es necesario informarlo en caso de remisión voluntaria «VERI*FACTU». Este campo forma parte del detalle de las circunstancias de generación de los registros de facturación.
o los datos rechazoprevioExiste y rechazoprevioNOexiste, son válidos solo para los registros de subsanación.

Un saludo,

Pedro9999 19-03-2025 13:20:25

Cita:

Empezado por seccion_31 (Mensaje 562657)
la DLL ya esta modificada

No se cuantos estais utilizando el componente pero este fin de semana publicare la version 2.

Ya no hara falta el registro anterior, y habra que incluir el registroInicial con el primer encadenamiento del envio.

agradecer a los usuarios que me informaron del funcionamiento del encadenamiento, con ese conocimiento aportado he modificado el componente.

Ya detallare mas los cambios una vez se publique.

slds !

Felicidades por tu gran aporte!!!

nincillo 19-03-2025 17:53:04

Cita:

Empezado por seccion_31 (Mensaje 561726)
gracias DarkDudae

voy a incoporar la corrección y en un tiempo, quizas dos semanas publicare una nueva version.

¿tenemos alguna sugerencia para seguir mejorando el componente?

Voy a retirar el campo "situacion", porque creo que no se usa, y asi libero espacio de la pila.
Corregire las fechas cuando entreguen la fecha de emision con - en lugar de /

Hay un indicador que se llama incidencia, que se puede activar manual, o automaticamente, cuando la fecha de alguna factura es diferente a la del dia.
Habra otro indicador que se llamara primerRegistro si se detecta primer registro en el envio
-->Ambos indicadores, deberian poder ser consultados antes del envio.

(Es una lastima no poder encapsularlo en una DLL, mejoraría mucho)

Habria que probar el certificado pfx

Y hay que añadir mas casos a la generación de la facturación, en especial la de exentos de iva. ¿hay alguien por aqui que domine el tema?

Saludos !

Siento si la respuesta llega con retraso, pero me he puesto a leer el hilo desde el principio para ir probando/entendiendo las cosas poco a poco.

Estoy trabajando con Delphi 2007 y acabo de modificar el código de la DEMO_D7_DLL2 y la Validación del NIF para que lo haga utilizando un certificado en fichero .p12 y con contraseña (en lugar de un certificado instalado en el sistema y seleccionado mediante el combo) y me ha hecho la validación correctamente.

Genial!!!.

Muchas gracias!!!

starlet 20-03-2025 19:16:58

Otro más que aterriza por aquí.

Me he enterado tarde de este proyecto que puede ser un "salva vidas" literal para mucha gente, entre los que me incluyo.

Cuanto tiempo me habría ahorrado si me hubiese enterado antes..

Mil gracias a seccion_31!!!!

Estoy analizando todo. Pero al intentar la demo, no hace nada, compila sin errores, pero no muestra formulario. Se cierra automáticamente.

Estoy haciendo algo mal?. Evidentemente se me escapa algo, pq al resto de la gente le funciona.

Versión Delphi 10.1 y 11.3

Gracias,

mqm 21-03-2025 14:21:26

Cita:

Empezado por starlet (Mensaje 562922)
Otro más que aterriza por aquí.

Me he enterado tarde de este proyecto que puede ser un "salva vidas" literal para mucha gente, entre los que me incluyo.

Cuanto tiempo me habría ahorrado si me hubiese enterado antes..

Mil gracias a seccion_31!!!!

Estoy analizando todo. Pero al intentar la demo, no hace nada, compila sin errores, pero no muestra formulario. Se cierra automáticamente.

Estoy haciendo algo mal?. Evidentemente se me escapa algo, pq al resto de la gente le funciona.

Versión Delphi 10.1 y 11.3

Gracias,

El formulario principal tiene visible = false
Ponlo a true

seccion_31 22-03-2025 07:48:53

Cita:

Empezado por mqm (Mensaje 562949)
El formulario principal tiene visible = false
Ponlo a true

gracias

que horror, se debio quedar a false en algun momento y como en D7 se abre sin problema ni cuenta me di.

gracias por todos los apoyos, y gracias a los que habeis contribuido, porque hemos pasado por varias fases:

al principio era un servidor de mensajes, que luego gracias a darkdudae y su aviso, paso a ser DLL, que parece mas profesional
a los usuarios del foro que han contribuido para aislar el xml del registro y poder archivarlo, cosa que no tenia ni idea
y finalmente el tema de comprender el encadenamiento que estaba muy equivocado.

fallos, no se si saldran muchos mas, ahora, tampoco se si falta alguna caracteristica clave como las dos ultimas mencionadas arriba.

Un saludo a todos, y me alegro de que este sirviendo para su fin.

starlet 22-03-2025 11:42:04

Cita:

Empezado por mqm (Mensaje 562949)
El formulario principal tiene visible = false
Ponlo a true

Lo primero, pedir disculpas, por la repetición de mensajes. Juro que al postear el mensaje me daba error, y no se publicaba, y hoy, aparecen de golpe varias repeticiones del mismo mensaje.

Pido a los moderadores, que sólo dejen uno. Gracias

Respecto a visible = false en el form principal, sí, ya lo había visto y por supuesto lo he puesto a true, pero sigue exactamente igual. Y como digo lo he probado con 2 versiones diferentes de Delphi.

Evidentemente, asumo que es un error de mi equipo, pero no tengo ni idea de qué puede ser, porque desarrollo en este equipo sin ningún problema desde hace varios años.

Reitero mi agradecimiento a seccion_31 y a todos los que habéis contribuido en este proyecto y desde ahora en lo que pueda, intentaré ayudar igualmente.

seccion_31 22-03-2025 12:04:37

Cita:

Empezado por starlet (Mensaje 562972)
Lo primero, pedir disculpas, por la repetición de mensajes. Juro que al postear el mensaje me daba error, y no se publicaba, y hoy, aparecen de golpe varias repeticiones del mismo mensaje.

Pido a los moderadores, que sólo dejen uno. Gracias

Respecto a visible = false en el form principal, sí, ya lo había visto y por supuesto lo he puesto a true, pero sigue exactamente igual. Y como digo lo he probado con 2 versiones diferentes de Delphi.

Evidentemente, asumo que es un error de mi equipo, pero no tengo ni idea de qué puede ser, porque desarrollo en este equipo sin ningún problema desde hace varios años.

Reitero mi agradecimiento a seccion_31 y a todos los que habéis contribuido en este proyecto y desde ahora en lo que pueda, intentaré ayudar igualmente.

Has instalado el capicom ?

seccion_31 22-03-2025 12:13:44

Cita:

Empezado por ontisoft (Mensaje 562942)
Hola de nuevo. Llevo un par de meses desconectado y veo que este proyecto a seguido avanzando bastante.
Gracias a todos por vuestro esfuerzo y trabajo.

Yo comencé con la demo trasteando y probando con Delphi 12 y tenia muy buena pinta.

Pero por lo que veo ahora os centráis mas en un componente DLL para Delphi 7.

Mi pregunta es, las mejoras de la DLL ¿se están llevando también a la demo inicial, o ya solo os centráis en la DLL?

¿La DLL se puede integrar también en Delphi 12 o solo es para versiones antiguas?

Quiero ponerme ya en serio con este asunto, y si puedo aportar algo en el proceso lo hare encantado.

La demo inicial sigue los cambios de la DLL. Incluso muy mejorada.

En principio la DLL y el componente se puede usar desde cualquier versión. De delphi.

Si vas a usar la DLL puedes ver la llamada desde el.componente.

También podrías usar la unidad de funciones sin su encapsulado de DLL llamando sin más a su unidad

ramherfer 22-03-2025 12:28:23

Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

creo que VeriFactuD7.final( LogFile ) No me está creando el fichero log

Un saludo,

seccion_31 22-03-2025 12:29:53

Cita:

Empezado por ramherfer (Mensaje 562975)
Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

Un saludo,

Podrías hacer una consulta simple

seccion_31 22-03-2025 12:33:29

Cita:

Empezado por ramherfer (Mensaje 562975)
Hola buenos días.
¿Teneis algún mecanismo para que antes de realizar un envío comprobar si el servicio de la AEAT se encuentra activo o no?.

creo que VeriFactuD7.final( LogFile ) No me está creando el fichero log

Un saludo,

Con la DLL el log quedo obsoleto

ramherfer 22-03-2025 12:35:00

Cita:

Empezado por seccion_31 (Mensaje 562976)
Podrías hacer una consulta simple

No quisiera hacer consultas muy recurrentes para no tener conflictos, voy a intentarlo y antes de hacer un envio consultar.

gracias por informar con el tema del log.

seccion_31 22-03-2025 12:39:38

Cita:

Empezado por ramherfer (Mensaje 562978)
No quisiera hacer consultas muy recurrentes para no tener conflictos, voy a intentarlo y antes de hacer un envio consultar.

gracias por informar con el tema del log.

también me había planteado comprobar el estado de la AEAT pero solo al abrir el programa.

Incluso habia pensado hacer una función de ese tipo, a ver si hay otra forma...

Con otro tema: Pensé en validar el.vies y está la función dentro, pero no me válida casi nunca y lo dejé por imposible.


Slds,!

ramherfer 22-03-2025 13:58:23

Voy de momento a usar esta función con la URL del Endpoint de la AEAT

Código Delphi [-]
function VerificarServicioSOAP(const URL: string; Intentos: Integer): Boolean;
var
  HTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  I: Integer;
begin
  Result := False; 
  HTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    HTTP.IOHandler := SSLHandler;
    HTTP.ReadTimeout := 5000; 

    for I := 1 to Intentos do
    begin
      try
        HTTP.Head(URL);
        Result := True; // El servicio está activo
        Exit;
      except
        on E: EIdException do
          ; // Oculta cualquier error de Indy
        on E: Exception do
          ; // Oculta otros errores generales
      end;
    end;
  finally
    SSLHandler.Free;
    HTTP.Free;
  end;
end;

Con un elemento visual en verde si está activo y en rojo si NO está activo en el statusBar.
Esto en el hilo principal de la aplicación y si al ir a remitir facturas a la señora AEAT si está inactivo que ni lo intente.
Ya que en estos momentos está caido lo tengo a modo de pruebas

seccion_31 22-03-2025 14:24:02

Cita:

Empezado por ramherfer (Mensaje 562981)
Voy de momento a usar esta función con la URL del Endpoint de la AEAT

Código Delphi [-]
function VerificarServicioSOAP(const URL: string; Intentos: Integer): Boolean;
var
  HTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  I: Integer;
begin
  Result := False; 
  HTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    HTTP.IOHandler := SSLHandler;
    HTTP.ReadTimeout := 5000; 

    for I := 1 to Intentos do
    begin
      try
        HTTP.Head(URL);
        Result := True; // El servicio está activo
        Exit;
      except
        on E: EIdException do
          ; // Oculta cualquier error de Indy
        on E: Exception do
          ; // Oculta otros errores generales
      end;
    end;
  finally
    SSLHandler.Free;
    HTTP.Free;
  end;
end;

Con un elemento visual en verde si está activo y en rojo si NO está activo en el statusBar.
Esto en el hilo principal de la aplicación y si al ir a remitir facturas a la señora AEAT si está inactivo que ni lo intente.
Ya que en estos momentos está caido lo tengo a modo de pruebas

Con tu permiso lo coloco en el componente

Slds !

seccion_31 22-03-2025 16:59:35

verificar que la AEAT esta ahi.

He usado el codigo de ramherfer con algun cambio para que me funcionara, y hoy da como activa la web de la aeat cuando tiene un error, el tipico del fin de semana:

Cita:

Descripción: UNSUCCESSFUL EXECUTION CAUSED BY AN UNAVAILABLE RESOURCE. REASON 00C90081, TYPE OF RESOURCE 00000210, AND RESOURCE NAME DBTCCSOR.TSTCCSOR.00000001. SQLCODE=-904, SQLSTATE=57011, DRIVER=4.33.43
La pagina existe, y por tanto aparece como activa, pero con error. Entrar en analizar su contenido me parece un poco exagerado. Es mi opinión. Ademas de necesitar las dlls adiciones para que funcione el ssl.

Por lo que creo que es mejor incorporar una consulta, la mas simple, de un día determinado, por ejemplo del día siguiente. (no se si dejara).

Otro tema es la frecuencia de revision planteada.

Saludos !

Nota: ya esta incpororada la funcion, para ello consulta una factura, llamada PING en el periodo y fecha actuales con el certificado de la sesion. Es inmediato y seguro.

mqm 22-03-2025 17:26:52

Buenas session_31.
Yo lo que hago en tu componente es lo que dices, una consulta inexstente y listo.

Código Delphi [-]
procedure TForm1.VerificaConexíonClick(Sender: TObject);
var
   ejercicio, periodo, numero: string;
   desde, hasta: TDatetime;
   resultado: TConsultaResultado;
begin
   // Datos esenciales de inicio de sesion para consulta
   VeriFactuD7.Certificado               := comboCertificados.text;
   VerifactuD7.Emisor.NombreRazonEmisor  := editEmisor.Text;
   VerifactuD7.Emisor.nifEmisor          := editNIFEmisor.Text;
   VerifactuD7.Simular                   := false;
   VerifactuD7.urlEndPoint               := editURL.text;

   // si se filtra por sistema informatico colocar los datos
   if filtroSIF.checked then
   begin
       VerifactuD7.SistemaInformatico.razonSocial       := editRazonSocial.Text;
       VerifactuD7.SistemaInformatico.nif               := editNIF.Text;
       VerifactuD7.SistemaInformatico.nombre            := editNombre.Text;
       VerifactuD7.SistemaInformatico.ID                := editID.Text;
       VerifactuD7.SistemaInformatico.Version           := editVersion.Text;
       VerifactuD7.SistemaInformatico.NumeroInstalacion := editInstalacion.Text;
   end;

   // Archivo XML vacío que se guardará como referencia de la consulta
   VeriFactuD7.filenameXML_Envio       := xmlEnvioConsulta;
   VeriFactuD7.filenameXML_Respuesta   := xmlRespuestaConsulta; 

   // Iniciar Sesión
   if not VeriFactuD7.inicio then
   begin
       ShowMessage('Error Iniciando Sesion');
       Exit;
   end;

     // Asignar parámetros mínimos válidos
     ejercicio := IntToStr(YearOf(Now));   // Año actual
     periodo := FormatDateTime('mm', Now); // Mes actual
     numero := '';                         // Consulta sin número específico
     desde := Now;                         // Fecha actual como ejemplo
     hasta := Now;                         // Mismo día para una consulta mínima válida

   // Intentar la consulta vacía
   if VeriFactuD7.consulta(ejercicio, periodo, numero, desde, hasta, filtroSIF.Checked, resultado) then
   begin
       ShowMessage('Conexión exitosa con el servidor.');
   end
   else
   begin
       ShowMessage('Error en la conexión: ' + resultado.errorDes);
   end;

   // Terminar sesión
   VeriFactuD7.final('');
end;

seccion_31 22-03-2025 17:30:56

si, creo que la consulta inexistente es lo mejor.

ahora se reducira a:

Código:

            VeriFactuD7.Certificado              :=comboCertificados.text;
            VerifactuD7.Emisor.NombreRazonEmisor :=editEmisor.Text;
            VerifactuD7.Emisor.nifEmisor        :=editNIFEmisor.Text;
            VerifactuD7.urlEndPoint              :=editURL.text;  // endpoint de la AEAT

            if veriFactuD7.VerifactuActivo then
                statusBar1.panels[1].Text:='AEAT Activa'
            else
                statusBar1.panels[1].Text:='AEAT Inactiva';


y si tienes el certificado ya cargado mucho menos codigo. Sin iniciar sesion.

Ya esta incluido el ejemplo en la Demo

Y la publicare la semana del 31 ; ) como version 2.1 con los cambios que vayan apareciendo.

Saludos !

: )

y buenas tardes

mqm 25-03-2025 13:04:24

en el proceso siguiente:

Código Delphi [-]
procedure TForm1.procesarEnvio(resultado:TResultadoEnvio);
var
  desError,error,estado,factura, emisor, huella:string;

  aFactura:TRegistroFactura;

  j:integer;
begin
      memoXML.Lines.LoadFromFile(xmlEnvio);
      memoXML.Text:=FormatXMLData(memoXML.Text);

      memoRes.lines.clear;
      memoRes.lines.Add('Se ha realizado el envío');
      memoRes.Lines.Add('');
      memoRes.Lines.Add('Estado Del Envio:'+resultado.EstadoEnvio );
      memoRes.lines.Add('CSV: ' + resultado.CSV);
      memoRes.lines.Add('TimeStamp: ' + resultado.Fecha+' '+resultado.Hora);
      memoRes.Lines.Add('');

Creo que resultado.Fecha+' '+resultado.Hora estan cambiados. ya que devuelve 11:59:10 25/03/2025

seccion_31 25-03-2025 20:06:48

Ya esta corregido !

gracias por el aviso.

Por cierto starlet ¿has podido probar la demo?


slds !

Cita:

Empezado por mqm (Mensaje 563087)
en el proceso siguiente:

Código Delphi [-]
procedure TForm1.procesarEnvio(resultado:TResultadoEnvio);
var
  desError,error,estado,factura, emisor, huella:string;

  aFactura:TRegistroFactura;

  j:integer;
begin
      memoXML.Lines.LoadFromFile(xmlEnvio);
      memoXML.Text:=FormatXMLData(memoXML.Text);

      memoRes.lines.clear;
      memoRes.lines.Add('Se ha realizado el envío');
      memoRes.Lines.Add('');
      memoRes.Lines.Add('Estado Del Envio:'+resultado.EstadoEnvio );
      memoRes.lines.Add('CSV: ' + resultado.CSV);
      memoRes.lines.Add('TimeStamp: ' + resultado.Fecha+' '+resultado.Hora);
      memoRes.Lines.Add('');

Creo que resultado.Fecha+' '+resultado.Hora estan cambiados. ya que devuelve 11:59:10 25/03/2025


seccion_31 26-03-2025 09:48:39

parece que han cambiado esto en la normativa: desde el 18 de marzo:

Cita:

15.6.9 ClaveRegimen 18. Recargo de equivalencia
- Sólo se puede cumplimentar TipoRecargoEquivalencia y CuotaRecargoEquivalencia
cuando CalificacionOperacion es “S1”.
- Si CalificacionOperacion es “S1”:
 Si Impuesto = “01” (IVA) o no se cumplimenta (considerándose “01” – IVA), sólo
se podrá cumplimentar TipoRecargoEquivalencia y CuotaRecargoEquivalencia si
ClaveRegimen igual a “18”.
 Si Impuesto = “01” (IVA) o no se cumplimenta (considerándose “01” – IVA) y
ClaveRegimen igual a “18”, es oblig
Cita:

1.0.3 18/03/2025 Se incluye nuevo “Aceptado con errores” al hacer
un mal uso del primer registro.
Se incluye nueva validación para la clave de
régimen 18 (Recargo de equivalencia)
Se elimina validación de NIFs iguales entre emisor
y destinatario (Facturas de autoconsumo)
Fuente: https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validaciones_Errores_Veri-Factu.pdf


Asi que he probado a intentar subir una factura usando la demoD7 con REQ y me la ha rechazado:

Incorrecto 1279 Si el impuesto es IVA(01) o vacio, solo se podrá informar TIPORECARGOEQUIVALENCIA y CUOTARECARGOEQUIVALENCIA si la clave de régimen es 18.

Este sera otro cambio que llevara la version 2.1

Si alguien quiere comentarlo....

Saludos !

delphiGar 26-03-2025 10:46:14

Cita:

Empezado por seccion_31 (Mensaje 563125)
parece que han cambiado esto en la normativa: desde el 18 de marzo:





Fuente: https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validaciones_Errores_Veri-Factu.pdf


Asi que he probado a intentar subir una factura usando la demoD7 con REQ y me la ha rechazado:

Incorrecto 1279 Si el impuesto es IVA(01) o vacio, solo se podrá informar TIPORECARGOEQUIVALENCIA y CUOTARECARGOEQUIVALENCIA si la clave de régimen es 18.

Este sera otro cambio que llevara la version 2.1

Si alguien quiere comentarlo....

Saludos !

Esto lo estamos comentado en dos hilos distinto, pero te resumo:

Si la factura lleva Recago de Equivalencia la ClaveRegimen tiene que ser 18, y aclaro, si la emite es por que puede hacerlo con recargo. Si esta en Recargo de Equivalencia el OT no puede emitir facturas con RE, por lo tanto sera la clave 01 u otra.


La franja horaria es GMT +2. Ahora son las 22:46:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi