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)
-   -   Diferencia máxima de 120 segundos??? (https://www.clubdelphi.com/foros/showthread.php?t=97048)

ermendalenda 05-12-2024 12:00:21

Respondido
Cita:


El error "2004 = El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos " se excepciona de la necesidad de ser subsanado y así lo puede verificar en el documento de validaciones en su apartado "4.3.1 Tratamiento de los errores en remisión voluntaria «VERI*FACTU ". Por lo cual no deberán realizar ninguna actuación posterior en caso de que obtengan dicho error.

bmfranky 05-12-2024 12:07:15

Cita:

Empezado por ermendalenda (Mensaje 560483)
Respondido

Pues si ,:cool:lo pone alli....
Cita:

4.3 Tratamiento de los errores
4.3.1 Tratamiento de los errores en remisión voluntaria «VERI*FACTU»
Los registros de facturación con errores admisibles serán “aceptados” y registrados por los
sistemas de la AEAT, pero deberán ser subsanados para poder llevar a cabo el tratamiento
y validación de los mismos.
Los errores admisibles que se han detectado en la versión actual, que deben ser
subsanados, son los siguientes:
- Los NIF informados en la agrupación Destinatario que sean correctos, pero no
figuren censados en la AEAT, indicando el tipo de identificación “07” (“No
censado”) en el campo “IDType” dentro del bloque “IDOtro”.
- Si se ha informado en el campo FechaHoraHusoGenRegistro una fecha y hora
mayor que la fecha del sistema de la AEAT, admitiéndose un margen de error. Se
excepciona este error de la necesidad de ser subsanado.

- Se ha informado una huella o hash del registro de facturación que no coincide
con el calculado por la AEAT.
- Si el campo ImporteTotal no cumple la validación especificada en cuanto a ajuste
de las cantidades (Ʃ (BaseImponibleOimporteNoSujeto + CuotaRepercutida +
CuotaRecargoEquivalencia) de todas las líneas de detalle de desglose dentro del
margen establecido.
- Si el campo CuotaTotal no cumple la validación especificada en cuanto a ajuste
de las cantidades Ʃ (CuotaRepercutida + CuotaRecargoEquivalencia) de todas
las líneas de detalle de desglose dentro del margen establecido.


Solo podrá llevarse a cabo una subsanación cuando no se trate de una causa que exija la
emisión de una factura rectificativa (u otro mecanismo contemplado en el Reglamento de
Facturación).
Este mecanismo se empleará para subsanar datos en cualquiera de los siguientes casos:

- Errores admisibles (registro de facturación aceptado –con errores admisibles– por
la AEAT), salvo las excepciones previstas en el apartado que explica el
tratamiento de los errores admisibles.
- Errores no admisibles (registro de facturación rechazado por la AEAT).
- Dato incorrecto detectado posteriormente por el obligado a expedir factura
(registro de facturación remitido y aceptado sin errores por la AEAT).
Para llevar a cabo la subsanación, será necesaria la remisión de un nuevo registro de
facturación (con el mismo identificador de factura del registro de facturación que se quiere
subsanar) por cada uno de los registros con datos a subsanar, con la combinación de
valores de campos que proceda según el caso (ver en el anexo los cuadros de operativas de
alta y anulación admisibles).

Ahora continuar con los otros 2000....


Cita:

********* Listado de códigos de error que producen la aceptación del registro de facturación en el sistema (posteriormente deben ser subsanados) *********
2000 = El cálculo de la huella suministrada es incorrecta.
2001 = El NIF del bloque Destinatarios no está identificado en el censo de la AEAT.
2002 = La longitud de huella del registro anterior no cumple con las especificaciones.
2003 = El contenido de la huella del registro anterior no cumple con las especificaciones.

2005 = El campo ImporteTotal tiene un valor incorrecto para el valor de los campos BaseImponibleOimporteNoSujeto, CuotaRepercutida y CuotaRecargoEquivalencia suministrados.
2006 = El campo CuotaTotal tiene un valor incorrecto para el valor de los campos CuotaRepercutida y CuotaRecargoEquivalencia suministrados.

ISCOPYME 27-01-2025 19:30:59

Servicio en Windows para envíos
 
Buenas tardes, para el envío de registros de facturación tenía pensado crear un servicio windows que cada x segundos (20 por ejemplo) se activara y si se cumplieran las condiciones para enviar registros a AEAT ( ya hubiera 1000 registros o más o que hubiera transcurrido el tiempo definido desde el último envío ) los enviara. Después de enviarlos, actualizaría el tiempo para el siguiente envío que me devuelve la AEAT.

La duda se me plantea en un sistema multiempresa, en el que hay que enviar los registros de facturación por cada empresa (objeto tributario). ¿ Se deberían enviar los registros de facturación de todas las empresas y luego actualizar el tiempo de espera o debería enviar la primera empresa, esperar el tiempo que marque aeat en su contestación, enviar la segunda empresa .... y así sucesivamente ?

Muchas gracias por vuestras respuestas.

newtron 27-01-2025 19:49:46

Cita:

Empezado por ISCOPYME (Mensaje 561463)
Buenas tardes, para el envío de registros de facturación tenía pensado crear un servicio windows que cada x segundos (20 por ejemplo) se activara y si se cumplieran las condiciones para enviar registros a AEAT ( ya hubiera 1000 registros o más o que hubiera transcurrido el tiempo definido desde el último envío ) los enviara. Después de enviarlos, actualizaría el tiempo para el siguiente envío que me devuelve la AEAT.

La duda se me plantea en un sistema multiempresa, en el que hay que enviar los registros de facturación por cada empresa (objeto tributario). ¿ Se deberían enviar los registros de facturación de todas las empresas y luego actualizar el tiempo de espera o debería enviar la primera empresa, esperar el tiempo que marque aeat en su contestación, enviar la segunda empresa .... y así sucesivamente ?

Muchas gracias por vuestras respuestas.


Yo entiendo que cada empresa tiene que llevar su camino, es decir, cada empresa debe de enviar sus registros de forma independiente cumpliendo los parámetros de tiempo, número de registros, etc. Mi opinión es que deberías de crear un servicio por cada empresa para no liar mucho la cosa.



Saludos.

ermendalenda 27-01-2025 19:59:01

Cita:

Empezado por ISCOPYME (Mensaje 561463)
Buenas tardes, para el envío de registros de facturación tenía pensado crear un servicio windows que cada x segundos (20 por ejemplo) se activara y si se cumplieran las condiciones para enviar registros a AEAT ( ya hubiera 1000 registros o más o que hubiera transcurrido el tiempo definido desde el último envío ) los enviara. Después de enviarlos, actualizaría el tiempo para el siguiente envío que me devuelve la AEAT.

La duda se me plantea en un sistema multiempresa, en el que hay que enviar los registros de facturación por cada empresa (objeto tributario). ¿ Se deberían enviar los registros de facturación de todas las empresas y luego actualizar el tiempo de espera o debería enviar la primera empresa, esperar el tiempo que marque aeat en su contestación, enviar la segunda empresa .... y así sucesivamente ?

Muchas gracias por vuestras respuestas.

No hay que esperar tiempos entre envios de distintas empresas hay que cumplir los tiempos o n registros(1000) de la misma empresa, ya decides como programarlo, yo lo tengo diferenciado con arrays dentro del mismo modulo fe envio (servicio en segundo plano) . Pero como dice el compañero te puedd resultar más fácil separarlo en distintos servicios.
Otra cosa, no sé si es correcto decir de la misma empresa, ya que un servicio de envío puede estar funcionando para distintos SIF de la misma empresa por que centraliza los envios, no así el encadenamiento por alguna dificultad en ello, por ejemplo por que estés usando un servicio de envío por terceros (uses un cif para enviar todo), en ese caso tienes que tener en cuenta que cada SIF que gestiones en el envío tiene que ser independiente

ISCOPYME 28-01-2025 10:11:26

Muchas gracias por vuestra respuesta.

Acabo de recibir contestación de verifactu y va por ese camino "El tiempo de espera es por cada SIF y dentro de cada SIF, por cada uno de los obligados tributarios.

La duda que me surge es que si opto por un único servicio para todas las empresas, se entiende que el algoritmo sería localizar las empresas con registros a enviar (que cumplan los requisitos de envío ) e iterar entre cada una de ellas haciendo el envío de estos registros.... Primero una empresa, luego la otra y así sucesivamente.

¿ Qué pasaría si hay un retraso significativo en la contestación de aeat para las siguiente empresas que estaban en cola de envío (podría no cumplirse el tiempo máximo de 120 segundos) ?

Con la opción de un servicio por empresa supongo que no pasaría esta situación....

rci 28-01-2025 10:31:25

Cita:

Empezado por ISCOPYME (Mensaje 561479)
Muchas gracias por vuestra respuesta.

Acabo de recibir contestación de verifactu y va por ese camino "El tiempo de espera es por cada SIF y dentro de cada SIF, por cada uno de los obligados tributarios.

La duda que me surge es que si opto por un único servicio para todas las empresas, se entiende que el algoritmo sería localizar las empresas con registros a enviar (que cumplan los requisitos de envío ) e iterar entre cada una de ellas haciendo el envío de estos registros.... Primero una empresa, luego la otra y así sucesivamente.

¿ Qué pasaría si hay un retraso significativo en la contestación de aeat para las siguiente empresas que estaban en cola de envío (podría no cumplirse el tiempo máximo de 120 segundos) ?

Con la opción de un servicio por empresa supongo que no pasaría esta situación....

Supongo que en ese caso lo mejor seria hacer hilos de ejecución (threads) independientes para cada cif emisor. Cada uno con su control de flujo.

jodaws 26-02-2025 17:23:24

Buenas tardes, me estoy volviendo un poco loca con este error:


Error no.: 2004 El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos.



Realizo la consulta de la hora en teoria "oficial" pero me sigue saliendo el mismo error. Algo no debo entender bien :confused:.


Código:

<FechaHoraHusoGenRegistro>2025-02-26T17:13:57.000Z</FechaHoraHusoGenRegistro>
No será por los milisegundos...


Alguien tiene este problema?

Faneka 26-02-2025 17:31:05

Cuando creas el RF le pones la Fecha y Hora si cuando llegue al servidor de AEAT han pasado más de 120 segundos te devolvera ese aviso.

jodaws 26-02-2025 17:37:11

Cita:

Empezado por Faneka (Mensaje 562269)
Cuando creas el RF le pones la Fecha y Hora si cuando llegue al servidor de AEAT han pasado más de 120 segundos te devolvera ese aviso.




Lo envío inmediatamente, por eso no lo entiendo.

bmfranky 26-02-2025 17:37:23

Cita:

Empezado por jodaws (Mensaje 562268)
Buenas tardes, me estoy volviendo un poco loca con este error:


Error no.: 2004 El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos.



Realizo la consulta de la hora en teoria "oficial" pero me sigue saliendo el mismo error. Algo no debo entender bien :confused:.


Código:

<FechaHoraHusoGenRegistro>2025-02-26T17:13:57.000Z</FechaHoraHusoGenRegistro>
No será por los milisegundos...


Alguien tiene este problema?

Hola, si es por los milisegundos, yo tenia ese problema al pasarle el timestamp, al final lo formatee yo en un string.


Para c# @rci me paso esta solucion.
Cita:

Empezado por rci (Mensaje 561988)
Hola bmfranky, Puedes adaptarlo a lo que necesites:
Código:

DateTime currentDateTime = GetDateTime(); // Coge la fecha y hora de internet o del ordenador

// Convert to Veri*Factu FORMAT EXPECTED: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601)
var creationDateTime = new DateTime(currentDateTime.Year,  currentDateTime.Month, currentDateTime.Day, currentDateTime.Hour,  currentDateTime.Minute, currentDateTime.Second, DateTimeKind.Local);

registroFacturacionAlta.FechaHoraHusoGenRegistro = creationDateTime;

Prueba a ver si te sirve, creo que no depende de la versión del VisualStudio que tengas

Saludos


newtron 26-02-2025 17:56:27

Hola.


Prueba con esta forma de generar ese dato:


Código Delphi [-]
  DateTime:=now;
  XSDatetime := TXSDatetime.Create;
  XSDateTime.AsDateTime := dateTime;
  Factura.RegistroAlta.FechaHoraHusoGenRegistro := XSDateTime;


La variable XSDatetime es del tipo TXSDatetime y tienes que poner en el uses Soap.XSBuiltIns


Saludos.

jodaws 26-02-2025 18:08:49

Cita:

Empezado por newtron (Mensaje 562272)
Hola.


Prueba con esta forma de generar ese dato:


Código Delphi [-] DateTime:=now; XSDatetime := TXSDatetime.Create; XSDateTime.AsDateTime := dateTime; Factura.RegistroAlta.FechaHoraHusoGenRegistro := XSDateTime;



La variable XSDatetime es del tipo TXSDatetime y tienes que poner en el uses Soap.XSBuiltIns


Saludos.




Y lo hacía así pero me daba error:


Código:

<FechaHoraHusoGenRegistro>2025-02-26T18:04:19.643+01:00</FechaHoraHusoGenRegistro>
Error no.: 1244 El campo FechaHoraHusoGenRegistro tiene un formato incorrecto.


Lo cambie por:

Código Delphi [-]XSDatetime := TXSDatetime.Create; XSDatetime.AsUTCDateTime :=getAhora;//Now; //XSDatetime.HourOffset:=1; //XSDatetime.UseZeroMilliseconds:=false; Factura.RegistroAlta.FechaHoraHusoGenRegistro :=XSDatetime;



Código:

<FechaHoraHusoGenRegistro>2025-02-26T18:06:21.000Z</FechaHoraHusoGenRegistro>
Me lo acepta pero con errores:


Error no.: 2004 El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos. RefExterna=2219518
TimestampPresentacion: 26/02/2025 18:06:21

Jarogo08 26-02-2025 18:27:42

Buenas jodaws


Creo que no tienes bien el formato. Tiene que ser algo así (sin milisegundos y con el +01:00 de la franja horaria):


2025-02-26T12:18:25+01:00


Yo lo obtengo así y me va sin problemas (es en VB. NET)


Dim retorno As String = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ssK")


espero que te sirva!

jodaws 26-02-2025 18:30:48

Cita:

Empezado por Jarogo08 (Mensaje 562275)
Buenas jodaws


Creo que no tienes bien el formato. Tiene que ser algo así (sin milisegundos y con el +01:00 de la franja horaria):


2025-02-26T12:18:25+01:00


Yo lo obtengo así y me va sin problemas (es en VB. NET)


Dim retorno As String = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ssK")


espero que te sirva!




Es que no lo puedo formatear yo o no sé como hacerlo, ya que tengo un tipo TXSDateTime. No le puedo asignar un string directamente... A ver si hay alguien en Delphi que lo haya solucionado y me da luz

newtron 26-02-2025 19:11:22

Cita:

Empezado por jodaws (Mensaje 562274)
Y lo hacía así pero me daba error:


Código:

<FechaHoraHusoGenRegistro>2025-02-26T18:04:19.643+01:00</FechaHoraHusoGenRegistro>
Error no.: 1244 El campo FechaHoraHusoGenRegistro tiene un formato incorrecto.


Lo cambie por:

Código Delphi [-]XSDatetime := TXSDatetime.Create; XSDatetime.AsUTCDateTime :=getAhora;//Now; //XSDatetime.HourOffset:=1; //XSDatetime.UseZeroMilliseconds:=false; Factura.RegistroAlta.FechaHoraHusoGenRegistro :=XSDatetime;



Código:

<FechaHoraHusoGenRegistro>2025-02-26T18:06:21.000Z</FechaHoraHusoGenRegistro>
Me lo acepta pero con errores:


Error no.: 2004 El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos. RefExterna=2219518
TimestampPresentacion: 26/02/2025 18:06:21


Ok, ya sé lo que te pasa. Es por los milisegundos. Prueba a hacerlo así:


Código Delphi [-]
  XSDateTime.AsDateTime := dateTime;
  Factura.RegistroAlta.FechaHoraHusoGenRegistro := XSDateTime;
  Factura.RegistroAlta.FechaHoraHusoGenRegistro.FractionalSeconds:=0;


Saludos.

jodaws 27-02-2025 09:17:51

Cita:

Empezado por newtron (Mensaje 562279)
Ok, ya sé lo que te pasa. Es por los milisegundos. Prueba a hacerlo así:


Código Delphi [-] XSDateTime.AsDateTime := dateTime; Factura.RegistroAlta.FechaHoraHusoGenRegistro := XSDateTime; Factura.RegistroAlta.FechaHoraHusoGenRegistro.FractionalSeconds:=0;



Saludos.


Muchas gracias a todos!Pues así lo ha hecho bien pero ahora me salta error en el cálculo de la huella :(


Código:

<FechaHoraHusoGenRegistro>2025-02-27T09:08:59+01:00</FechaHoraHusoGenRegistro>
Código:

<tikR:DescripcionErrorRegistro>El cálculo de la huella suministrada es incorrecta.
      Datos de entrada cálculo huella:
        IDEmisorFactura=XXXXXXXXX&
        NumSerieFactura=1/125000013&
        FechaExpedicionFactura=26-02-2025&
        TipoFactura=F1&
        CuotaTotal=1.72&
        ImporteTotal=9.90&
        Huella=857d7da1a202c1659e2249feb65273a6333afc3166e97d9f2018978a42cb9233&
        FechaHoraHusoGenRegistro=2025-02-27T09:08:59+01:00
        Huella calculada: FE087FDBAAC73C408D8F5100CC06175476A9741BF4EFBFC4C088C86F027F4E73</tikR:DescripcionErrorRegistro>

Edito: la huella debe estar en mayúsculas!

newtron 27-02-2025 09:40:54

Cita:

Empezado por jodaws (Mensaje 562300)
Muchas gracias a todos!Pues así lo ha hecho bien pero ahora me salta error en el cálculo de la huella :(


Código:

<FechaHoraHusoGenRegistro>2025-02-27T09:08:59+01:00</FechaHoraHusoGenRegistro>
Código:

<tikR:DescripcionErrorRegistro>El cálculo de la huella suministrada es incorrecta.
      Datos de entrada cálculo huella:
        IDEmisorFactura=XXXXXXXXX&
        NumSerieFactura=1/125000013&
        FechaExpedicionFactura=26-02-2025&
        TipoFactura=F1&
        CuotaTotal=1.72&
        ImporteTotal=9.90&
        Huella=857d7da1a202c1659e2249feb65273a6333afc3166e97d9f2018978a42cb9233&
        FechaHoraHusoGenRegistro=2025-02-27T09:08:59+01:00
        Huella calculada: FE087FDBAAC73C408D8F5100CC06175476A9741BF4EFBFC4C088C86F027F4E73</tikR:DescripcionErrorRegistro>

Edito: la huella debe estar en mayúsculas!


No das muchas pistas sobre lo que te pasa con la huella, por si te sirve de algo yo lo hago así:


Código Delphi [-]
  // Calculo huella
  sAux:='IDEmisorFactura='+Edit2.Text+'&NumSerieFactura='+Factura.RegistroAlta.IDFactura.NumSerieFactu  ra+'&FechaExpedicionFactura='+Factura.RegistroAlta.IDFactura.FechaExpedicionFactura;
 sAux:=sAux+'&TipoFactura='+ListaCampos[2]+'&CuotaTotal='+Factura.RegistroAlta.CuotaTotal+'&ImporteTotal='+Factura.RegistroAlta.ImporteTotal+'  &Huella='+Edit18.Text+'&FechaHoraHusoGenRegistro='+XSDateTime.NativeToXS;
  Huella:=UpperCase(HashSHA256(sAux));
  Factura.RegistroAlta.TipoHuella := TipoHuellaType._01;
  Factura.RegistroAlta.Huella     := Huella;


No creo que tengas mucho problema en adivinar unas cuantas variables que hay en esas líneas.


y la función HashSHA256:


Código Delphi [-]
function HashSha256(const APassword: string): string;
var
  SHA256: THashSHA2;
begin
  SHA256 := THashSHA2.Create;
  try
    Result := SHA256.GetHashString(APassword);
  finally
    FreeAndNil(SHA256);
  end;
end;


Saludos.

jodaws 27-02-2025 09:52:23

Cita:

Empezado por newtron (Mensaje 562303)
No das muchas pistas sobre lo que te pasa con la huella, por si te sirve de algo yo lo hago así:


Código Delphi [-] // Calculo huella sAux:='IDEmisorFactura='+Edit2.Text+'&NumSerieFactura='+Factura.RegistroAlta.IDFactura.NumSerieFactu ra+'&FechaExpedicionFactura='+Factura.RegistroAlta.IDFactura.FechaExpedicionFactura; sAux:=sAux+'&TipoFactura='+ListaCampos[2]+'&CuotaTotal='+Factura.RegistroAlta.CuotaTotal+'&ImporteTotal='+Factura.RegistroAlta.ImporteTotal+' &Huella='+Edit18.Text+'&FechaHoraHusoGenRegistro='+XSDateTime.NativeToXS; Huella:=UpperCase(HashSHA256(sAux)); Factura.RegistroAlta.TipoHuella := TipoHuellaType._01; Factura.RegistroAlta.Huella := Huella;



No creo que tengas mucho problema en adivinar unas cuantas variables que hay en esas líneas.


y la función HashSHA256:


Código Delphi [-]function HashSha256(const APassword: string): string; var SHA256: THashSHA2; begin SHA256 := THashSHA2.Create; try Result := SHA256.GetHashString(APassword); finally FreeAndNil(SHA256); end; end;



Saludos.




Muchas gracias y disculpad, quería decir que la huella debe estar en mayúsculas y ya me ha funcionado correctamente.


La franja horaria es GMT +2. Ahora son las 01:44:44.

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