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 13-02-2025 12:28:21

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 562017)
Creo que hay varios mensajes donde está cómo hacerlo.
Por ejemplo este, genera el registro con SOAP y en un momento dado extrae el XML del registro de facturación.
https://www.clubdelphi.com/foros/sho...postcount=1428

Código Delphi [-]
...
 try
   newNode := Factura.RegistroFacturacion.ObjectToSOAP( ARootNode, ARootNode, MOPToSoapDomConvert, 'RegistroFacturacionType',
   Swdsl,'T',[ocoDontPrefixNode,ocoDontPutTypeAttr], RefId  ); //ocoDontPrefixNode

   XML.DocumentElement := ARootNode;
   XML.XML.SaveToFile('RegistroFacturacion.xml',TEncoding.UTF8);
   XML.Active := False;

 Except
   On E : Exception do Begin
    Showmessage(E.Message);
    XML.DocumentElement := ARootNode;
    XML.XML.SaveToFile('RegistroFacturacionError.xml',TEncoding.UTF8);
    XML.Active := False;
 End;
 ...

Perfecto, he visto el ejemplo de Delphier publicado al que agradezco su colaboracion, y ya funciona, a ver ahora como lo implemento en el componente. Pero esto ya esta. gracias !

nincillo 13-02-2025 12:46:03

Cita:

Empezado por seccion_31 (Mensaje 561795)
¿podemos estar seguro?

¿ entonces bajo el regimen general 01, la E4 ? esta tarde lo probare.

Automatizacion:

podemos automatizar, UE, fuera de UE, y canarias. Eso ya esta automatizado , (hay que modificar los tipos de exenciones que hay en el codigo, pero ya esta)

podemos automatizar facilmente, el E4, colocandole el regimen general 01. (si funciona).


Mas allá de esto, ¿ya no se puede automatizar?:

¿Quizás habría que crear un array particular para exenciones y cubrir el resto de casos?

Yo por lo que he podido ver en algún otro programa, he querido entender que las exenciones pueden incluso ir a nivel de apunte.

Eso sería bueno que nos lo aclarara alguien que estuviera más "ducho" en temas contables/fiscales.

No es lo mismo productos al 0% de IVA que productos "exentos" de IVA, como en su momento creo que eran las mascarillas y cosas de "esas".

seccion_31 13-02-2025 12:50:12

en la nueva version DLL hay un array para procesar exenciones, sin la automatizacion del array de ivas, con lo que quedaria solucionado. Eso si, hay que saber de fiscalidad para que el programa lo coloque corectamente. La nueva implementacion supera con creces la anterior.

Pero ese es el problema, yo al menos no se tanto de fiscalidad como asegurar que se estan generando bien los xml.

seria necesario y esto es una llamada de auxilio XD

un juego de XMLs para los casos principales, automatizados por el componente para verificar.


y otro despues para los menos comunes.

Pero sin eso aunque tecnicamente el componente funcione, estamos vendidos.

ramherfer 17-02-2025 21:48:29

Hola buenas tardes.
Al procesar la respuesta resultado.facturas[j].tipoOperacion me está devolviendo "SistemaFac" cuando la factura contiene algún error y es rechazada.
Si la factura es correcta y es admitida resultado.facturas[j].tipoOperacion devuelve "Alta".
Solo proceso una factura y utilizo este dato para identificar en el registroFacturación la operación de la factura a la que se refiere y actualizar su estado, movimiento.

En operaciones Baja declaradas en el registroFacturación obtengo un Access Violation en el módulo msgVerifactu.exe. He probado como fecha de factura la fecha actual y la propia fecha de la factura que se da de baja, pero no se, obtengo el mismo resultado. Voy a darle un vistazo a ver si soy capaz de encontrar el problema.

Al final creo que entiendo el sistema y tengo todo el tema de comunicaciones en una tabla independiente llamada RegistroSIF con las operaciones de cada una de las facturas (Alta, baja, modificacion, etc) que se relaciona con la tabla de cabeceras de facturas. Si genero una baja entra en RegistroSIF como baja y la cabecera de factura tambien la pone como baja. De esta forma puede tener una factura distintos movimientos o estados FR250056 ALTA y FR250056 BAJA. Gracias a los que me aclarasteis mi monumental lio mental.

Un saludo,

seccion_31 18-02-2025 06:54:40

Cita:

Empezado por ramherfer (Mensaje 562060)
Hola buenas tardes.
Al procesar la respuesta resultado.facturas[j].tipoOperacion me está devolviendo "SistemaFac" cuando la factura contiene algún error y es rechazada.
Si la factura es correcta y es admitida resultado.facturas[j].tipoOperacion devuelve "Alta".
Solo proceso una factura y utilizo este dato para identificar en el registroFacturación la operación de la factura a la que se refiere y actualizar su estado, movimiento.

En operaciones Baja declaradas en el registroFacturación obtengo un Access Violation en el módulo msgVerifactu.exe. He probado como fecha de factura la fecha actual y la propia fecha de la factura que se da de baja, pero no se, obtengo el mismo resultado. Voy a darle un vistazo a ver si soy capaz de encontrar el problema.

Al final creo que entiendo el sistema y tengo todo el tema de comunicaciones en una tabla independiente llamada RegistroSIF con las operaciones de cada una de las facturas (Alta, baja, modificacion, etc) que se relaciona con la tabla de cabeceras de facturas. Si genero una baja entra en RegistroSIF como baja y la cabecera de factura tambien la pone como baja. De esta forma puede tener una factura distintos movimientos o estados FR250056 ALTA y FR250056 BAJA. Gracias a los que me aclarasteis mi monumental lio mental.

Un saludo,

Esta pendiente el cambio a la version DLL, asi a bote pronto recuerdo que la baja daba error.

En cuanto lo publiquen en el FTP, que ya tienen el enlace, lo readaptas y vuelves a probar

Estos son los cambios de la nueva version , donde tambien ha colaborado el usuario darkdudae, a quien agradezco su trabajo.
(Algunos de ellos estan sin comprobar).

Cita:

> Nota general:
Ahora el servidor B10 ya no se suministra como aplicacion. Tenemos una DLL llamada veriFactu.dll


cuando se cambia un type (record). etc... en uTiposVeriFactu se deben recompilar verifactu.dll y aplicacion D7.
La compilacion de la DLL se guarda en la carpeta DEMO_D7 para facilitar las pruebas


Si ha utilizado la version anterior del componente, eliminarlo
Antes de registrar el componente copiar la DLL a syswow64
----------------------------------------------------------------------------------------------------------------------------


--------------------------------
---------------- version 1
--------------------------------
Se añade la funcion getCertificadosFecha para obtener no solo el nombre de los certificados si no su fecha de validez. En las funciones de certificados solo se devuelven certificados validos.

Aumentada longitud DescripcionError en el resultado de cada factura (array)

Se añade propiedad ultimo_error_verifactu con el texo de error al añadir una factura, de momento solo recoge algunos errores. Puede leerse si la funcion VeriFactuD7.addFactura retorna -1. (ver demo de ejemplo).


Se añaden en el componente las propiedades nsesion y nfacturas (numero de facturas altas y baja preparadas para enviar) como propiedades de solo lectura

Se eliminan del record TRegistroFactura nsesion y nfactura

En la DEMO se elimina del formulario el componente TVeriFactu pasando a ser creado al inicio del formulario, se incluye un ejemplo del nuevo evento OnRegFac, de esta forma ya no es necesario instalar el componente en Delphi y la DLL puede ser mantenida en el directorio de la Demo.

---> Se cambian las exenciones de operaciones EU a E5 y Export a E2, se automatiza el tipoNIF si NO esta indicado. Para EU 02 y para Export 06 (otro doc.probatorio).

Se incluye un array en la unidad uTiposVeriFactu llamado _AyudaExentas[1..6] que contiene un resumen textual de las exenciones a modo informativo.

Se añaden las funciones Paises PaisesEU PaisesExport Para obtener una lista de paises validos en un TStringList. ( ES: España se considera fuera de la lista en PaisesEU retornada )

Se añade la funcion validPais para validar el codigo de pais (ya con max. 3 digitos)

Automatizacion de facturas a España (canarias):
En codigoPais podemos enviar ahora el codigo postal de la provincia del cliente. Si se detecta valor numerico se procesara como españa, y ADEMAS si el codigo postal es 35 ó 38 se activara automaticamente el flag de canarias.

Se añade el evento OnRegFac que sera lanzado cuando se procese cada registro de facturacion, es decir, podemos dejar en blanco el pathXML_RegistroFacturacion y todavia guardar el archivo que nos ira enviando como un Stream al evento definido por el usuario: (o utilizar ambos, archivo y evento)

TRegistroFacEvent = procedure(Sender: TObject; numserieFactura:string; xml:TMemoryStream) of object;

Añadida busqueda por SIF en la funcion consulta(..... ) filtroSIF=true filtrara ademas por los datos del sistema informatico. Ver ejemplo en la Demo en consulta de periodo

Se añade refexterna en el dato de la factura, para indicar informacion libre, 60 digitos. tanto en alta/anulacion como en la consulta

Se añade el path para indicar donde guardar los registros de facturacion y una variable booleana para indicar si se guardan todos los registros o solo los aceptados, ATENCION: con una limitacion, podrian guardarse registros innecesarios de facturas con operaciones aceptadas y no aceptadas en la misma sesion de envio (si se da el caso).

pathXML_RegistroFacturacion (ruta a la carpeta, sin terminar en \)
Registro_soloAceptadas (true o false) (false= guardara todas los registros de facturacion)

Hay dos cambios de nombres en el archivo de XML:
Se cambian las variables de los xml de envio y de respuesta a: (para hacerlos mas consistentes)

filenameXML_Envio
filenameXML_Respuesta

Se corrije la consulta por fechas

La demo ha sido muy mejorada, con mas funciones y capacidad

Se añade el campo estadoderegistro en el array de la consulta para cotejar facturas (en cada factura) con los valores: Aceptada, Aceptada con errores, Anulada

Se corrigen las fechas devueltas por consulta a formato / /

Corregido fallo al dar de baja una factura, de momento solo se admiten bajas de facturas registradas en verifactu

-----------------------
Inversion del sujeto pasivo: Hay un nuevo flag que afecta todos los ivas llamado inversionSUjetoPasivo en el record de factura para facturas a ESPAÑA (no canarias):

"
- El proveedor o prestador del servicio registrará los datos de la factura en el Libro
registro de Facturas Expedidas consignando en el campo de tipo de operación la clave
“S2: Sujeta – No Exenta – Inv. Suj. Pasivo”. En los campos de tipo impositivo y cuota"
repercutida consignará “0”. -

"

> Toda la factura debe estar bajo ese regimen y utilizar el primer IVA para indicar unicamente la base imponible.
-----------------------

Corregido error al cotejar (consultar) una factura sin cliente, ni nif.

Eliminada variable situacion, por no usar

Si se suministra una fecha de factura en formato - - se convierte a / / que es el formato esperado

Se añade la extension .P12 para reconocer un certificado en disco al nombre del certificado: PFX y P12

Se añade el indicador primerRegistro para comprobar antes de enviar si no hay registro anterior en algun punto de las facturas a enviar.

Ahora hay dos indicadores: incidencia (lectura/escritura) y primerRegistro(lectura).

En la consulta a la AEAT, en desglose de iva ahora se carga la base imponible e incluye informacion sobre exencion,
revisar: TRegistroFacturaIVASConsulta

Cliente codpais pasa de 2 a 3 digitos

Se ha mejorado la limpieza de algunos records funciones clear_ internas del servidor B10 (ahora DLL)

Al validar el NIF ya se puede obtener el nombre validado (devuelto por la consulta)

EXENCIONES AUTOMATICAS : (en array iva)
------------------------
Las facturas con pais destino a la EU automaticamente se consideran tipoExenta E6 clave regimen 01 (ahora E5)

Las facturas con pais destino al resto del mundo (en clave regimen 02) y canarias (en clave regimen 01) automaticamente se consideran tipoExentas E3 (ahora E2)

Las facturas de inversion sujeto pasivo (para españa)


OTRAS EXENCIONES: (en array exenta)
-----------------
En el record de facturas hay un nuevo array para crear OTRAS exenciones:
Este array se procesa tal cual sin otro proceso generando el desglose equivalente.

Record Factura:

exenta: array[0..maxivas] of TRegistroFacturaExentas;


Array de:

TRegistroFacturaExentas=record
tipoExenta :string[2];
calificacionOperacion:string[2]; // ¿opcional?
claveRegimen :string[2];

baseImp :currency;
end;

Para indicar si la factura lleva alguna base imponible exenta, se hara de forma similar a la del iva, pero cambiando el array. (ver ejemplo en el importador de excel)

Asi mismo un record similar se encuentra en la consulta a la AEAT, para retornar informacion sobre las facturas exentas: (exenciones creadas automaticas, o manuales con el array).

Nota de uso: Cada sesion deberia limitarse a una serie de facturacion y por supuesto 1 solo objeto TVeriFactu

Saludos !

seccion_31 18-02-2025 07:09:18

Cita:

Empezado por ramherfer (Mensaje 562060)
Hola buenas tardes.
Al procesar la respuesta resultado.facturas[j].tipoOperacion me está devolviendo "SistemaFac" cuando la factura contiene algún error y es rechazada.
Si la factura es correcta y es admitida resultado.facturas[j].tipoOperacion devuelve "Alta".
Solo proceso una factura y utilizo este dato para identificar en el registroFacturación la operación de la factura a la que se refiere y actualizar su estado, movimiento.

En operaciones Baja declaradas en el registroFacturación obtengo un Access Violation en el módulo msgVerifactu.exe. He probado como fecha de factura la fecha actual y la propia fecha de la factura que se da de baja, pero no se, obtengo el mismo resultado. Voy a darle un vistazo a ver si soy capaz de encontrar el problema.

Al final creo que entiendo el sistema y tengo todo el tema de comunicaciones en una tabla independiente llamada RegistroSIF con las operaciones de cada una de las facturas (Alta, baja, modificacion, etc) que se relaciona con la tabla de cabeceras de facturas. Si genero una baja entra en RegistroSIF como baja y la cabecera de factura tambien la pone como baja. De esta forma puede tener una factura distintos movimientos o estados FR250056 ALTA y FR250056 BAJA. Gracias a los que me aclarasteis mi monumental lio mental.

Un saludo,

Aun asi puedes (y deberias) procesar la factura con

resultado.facturas[j].OK
y una vez OK entonces mirar tambien: resultado.facturas[j].aceptadoConErrores

tipoOperacion: Probablemente cuando es procesada la factura delphi interpretara ese valor dentro de los enum de tipo de operacion, muy probablemente en el campo XML no venga indicado si quiera. Si quieres postea el XML de resultado cuando ocurre eso. Ya adeverti que hace cosas raras cuando no hay valor un campo enum. quizas sea el caso.

Ver ejemplo en la demo:


Código:

            if resultado.facturas[j].OK then  // Es correcto ó aceptado con errores
            begin
                // colocar el csv y huella en la factura
                if facturasEnviadas.locate('emisor;NumSerieFactura',vararrayof([emisor, factura ]),[]) then
                begin
                    FacturasEnviadas.edit;
                    FacturasEnviadas.fieldbyName('csv').text      :=resultado.CSV;
                    FacturasEnviadas.FieldByName('huella').text  :=resultado.facturas[j].huellaFactura;
                    FacturasEnviadas.fieldbyName('situacion').text:=estado;
                    FacturasEnviadas.post;
                end;
                if resultado.facturas[j].aceptadoConErrores then inc(_oke) else inc(_ok);
            end
            else
                inc(_err);                            // Es erronea


Neftali [Germán.Estévez] 18-02-2025 09:07:55

En el FTP del clubdelphi ya está la última versión del proyecto con códo el código fuente incluído y todo lo que necesita.
De nuevo, desde aquí agradecer a [seccion_31] la aportación y la colaboración y aportes de [darkdudae].

ramherfer 18-02-2025 10:11:59

Cita:

Empezado por seccion_31 (Mensaje 562064)
Aun asi puedes (y deberias) procesar la factura con

resultado.facturas[j].OK
y una vez OK entonces mirar tambien: resultado.facturas[j].aceptadoConErrores

tipoOperacion: Probablemente cuando es procesada la factura delphi interpretara ese valor dentro de los enum de tipo de operacion, muy probablemente en el campo XML no venga indicado si quiera.
Si quieres postea el XML de resultado cuando ocurre eso. Ya adeverti que hace cosas raras cuando no hay valor un campo enum. quizas sea el caso.

Ver ejemplo en la demo:


Código:

            if resultado.facturas[j].OK then  // Es correcto ó aceptado con errores
            begin
                // colocar el csv y huella en la factura
                if facturasEnviadas.locate('emisor;NumSerieFactura',vararrayof([emisor, factura ]),[]) then
                begin
                    FacturasEnviadas.edit;
                    FacturasEnviadas.fieldbyName('csv').text      :=resultado.CSV;
                    FacturasEnviadas.FieldByName('huella').text  :=resultado.facturas[j].huellaFactura;
                    FacturasEnviadas.fieldbyName('situacion').text:=estado;
                    FacturasEnviadas.post;
                end;
                if resultado.facturas[j].aceptadoConErrores then inc(_oke) else inc(_ok);
            end
            else
                inc(_err);                            // Es erronea


Este es el XML del que intento localizar el tipoOperación de la factura para con ese dato y el numero de serie actualizar el RegistroSif para que indique que hay algo con error actualizando el codigo y la descripción del mismo para información del usuario (devuelve SistemaFac). Ojo los datos fiscales los he alterado en el nodo ObligadoEmision
Código:

<env:Header/>
<env:Body Id="Body">
<tikR:RespuestaRegFactuSistemaFacturacion xmlns:tikR="https://www2.agenciatributaria.gob.es/......" xmlns:tik="https://www2.agenciatributaria.gob.es/.....xsd">
<tikR:Cabecera>
<tik:ObligadoEmision>
<tik:NombreRazon>Nombre razon social del emisor</tik:NombreRazon>
<tik:NIF>00000000W</tik:NIF>
</tik:ObligadoEmision>
</tikR:Cabecera>
<tikR:TiempoEsperaEnvio>60</tikR:TiempoEsperaEnvio>
<tikR:EstadoEnvio>Incorrecto</tikR:EstadoEnvio>
<tikR:RespuestaLinea>
<tikR:IDFactura>
<tik:IDEmisorFactura>00000000W</tik:IDEmisorFactura>
<tik:NumSerieFactura>FR250056</tik:NumSerieFactura>
<tik:FechaExpedicionFactura>17-02-2025</tik:FechaExpedicionFactura>
</tikR:IDFactura>
<tikR:Operacion>
<tik:TipoOperacion>Alta</tik:TipoOperacion>
</tikR:Operacion>
<tikR:EstadoRegistro>Incorrecto</tikR:EstadoRegistro>
<tikR:CodigoErrorRegistro>1123</tikR:CodigoErrorRegistro>
<tikR:DescripcionErrorRegistro>El formato del NIF es incorrecto.. NIF:24369243S.</tikR:DescripcionErrorRegistro>
</tikR:RespuestaLinea>
</tikR:RespuestaRegFactuSistemaFacturacion>
</env:Body>
</env:Envelope>


seccion_31 18-02-2025 10:23:36

en uVeriFactuFuncs

asi rapido

linea 1829 -31 aproximadamente, pone:

Código Delphi [-]
sesiones[sesion].resultado.facturas[n].tipoOperacion   :=getEnumName( TypeInfo(TipoOperacionType), ord(res.RespuestaLinea[ j ].EstadoRegistro ) );

y deberia poner:

Código Delphi [-]
            sesiones[sesion].resultado.facturas[n].tipoOperacion   :=getEnumName( TypeInfo(TipoOperacionType), ord(res.RespuestaLinea[ j ].Operacion.TipoOperacion ) );

Recompila la DLL y ya

Nota: no lo he probado. Cuando este confirmado que funciona, y haya pasado algo mas de tiempo volvere a publicar otra version.

Saludos !

DarkDudae 18-02-2025 17:07:19

He encontrado un bug en el componente si el evento OnRegFac no está asignado antes de hacer un envío (lo cual causa una excepción).
En la demo este error no se muestra debido a que creamos el componente VeriFactuD7 en runtime, así como le asignamos dicha propiedad.

Para solucionarlo, debemos cambiar el código del componente (uVerifacu):

Debemos cambiar este código:

Código Delphi [-]
procedure _callbackRF(filehandleMap:longint);   stdcall;
var
  callback_RF_info:TFileHandledRecordCall;
begin
    try
      loadFileMappingData(@callback_RF_info, sizeof(callback_RF_info), filehandleMap);
      callBacksVeriFactus[callback_RF_info.sesion].FOnRegFac(callBacksVeriFactus[callback_RF_info.sesion]  ,callback_RF_info.numSerieFactura, callback_RF_info.streamXML );
   except
    ON E:Exception do
    begin
      ShowMessage('Error excepcion: '+E.Message);
    end;
   end;
end;

Por este otro en el que nos aseguramos que el evento esté asignado:
Código Delphi [-]
procedure _callbackRF(filehandleMap: longint); stdcall;
var
  callback_RF_info: TFileHandledRecordCall;
  callbackObj: TVeriFactu;
begin
  try
    loadFileMappingData(@callback_RF_info, sizeof(callback_RF_info), filehandleMap);
    
    callbackObj := callBacksVeriFactus[callback_RF_info.sesion];

    if Assigned(callbackObj) then
    begin
      // Verificar si el evento FOnRegFac está asignado antes de llamarlo
      if Assigned(callbackObj.FOnRegFac) then
        callbackObj.FOnRegFac(callbackObj, callback_RF_info.numSerieFactura, callback_RF_info.streamXML)
      else
        OutputDebugString(PAnsiChar('Advertencia: El evento FOnRegFac no está asignado.'));
    end
    else
      OutputDebugString(PAnsiChar('Error: callBacksVeriFactus[' + IntToStr(callback_RF_info.sesion) + '] es nil.'));
    
  except
    on E: Exception do
      ShowMessage('Error excepción en _callbackRF: ' + E.Message);
  end;
end;

Es posible que tengáis que desinstalar y volver a instalar el componente tras el cambio.

Un saludo

ramherfer 18-02-2025 19:40:12

Cita:

Empezado por seccion_31 (Mensaje 562071)
en uVeriFactuFuncs

asi rapido

linea 1829 -31 aproximadamente, pone:

Código Delphi [-]
sesiones[sesion].resultado.facturas[n].tipoOperacion   :=getEnumName( TypeInfo(TipoOperacionType), ord(res.RespuestaLinea[ j ].EstadoRegistro ) );

y deberia poner:

Código Delphi [-]
            sesiones[sesion].resultado.facturas[n].tipoOperacion   :=getEnumName( TypeInfo(TipoOperacionType), ord(res.RespuestaLinea[ j ].Operacion.TipoOperacion ) );

Recompila la DLL y ya

Nota: no lo he probado. Cuando este confirmado que funciona, y haya pasado algo mas de tiempo volvere a publicar otra version.

Saludos !

La modificación funciona perfectamente. Las Bajas o Anulaciones que tambien tenía problemas funcionan tambien. Gracias seccion_31.

Neftali [Germán.Estévez] 19-02-2025 08:38:21

Actualizada la última versión en el FTP del club.
Gracias a todos.

seccion_31 19-02-2025 09:49:04

Cita:

Empezado por ramherfer (Mensaje 562096)
La modificación funciona perfectamente. Las Bajas o Anulaciones que tambien tenía problemas funcionan tambien. Gracias seccion_31.

lo que falta por probar y creo que NO funciona, son las anulaciones de facturas que no tiene verifactu.

Saludos !

Y es una lastima que falten colaboraciones para depurar, ofrecer ideas, validar los XML y mejorar el codigo, este componente podria solucionar implantaciones "habituales" de verifactu sin mucho problema, en uno o tres dias de trabajo, puedes tener una instalacion verifactu funcional.

agradecer a darkdudae por su colaboracion.

CarlosMz 19-02-2025 09:55:21

Muchas gracias por los aportes,

Si me indicas en qué parte focalizar y puedo ayudar lo hago.

Yo trabajo con Delphi 12 y tengo problemas con los WDSL que vienen y necesito regenerarlos de nuevo con SOAP 1.2

Personalmente lo que estoy haciendo es modificar el código para quitar el componente y la DLL, dejando el sistema en solo código "plano" para poder usarlo en modo web y no en Windows

newtron 19-02-2025 10:03:53

Cita:

Empezado por seccion_31 (Mensaje 562110)
lo que falta por probar y creo que NO funciona, son las anulaciones de facturas que no tiene verifactu.

Saludos !

Y es una lastima que falten colaboraciones para depurar, ofrecer ideas, validar los XML y mejorar el codigo, este componente podria solucionar implantaciones "habituales" de verifactu sin mucho problema, en uno o tres dias de trabajo, puedes tener una instalacion verifactu funcional.

agradecer a darkdudae por su colaboracion.


Buenas compañero. Es posible que una factura rechazada no puedas anularla porque no exista en sus registros.


Saludos.

seccion_31 19-02-2025 10:10:21

hola carlos_mz

habria que tratar de subir una baja de factura, que no se encuentre en verifactu, y ver que pasa. en teoria puedes anular facturas que verifactu no ha almacenado. A mi no me funciono y lo deje aparcado.

verificar que en consulta, los datos que devuelve si son correctos para cada tipo de factura. en especial desgloses de iva, y exenciones.

por otro lado

generar un XML de cada tipo de factura, incluida canarias, quitas tus datos y vemos aqui en el foro si estan OK.

Eso se me ocurre como lo mas inmediato, si tienes tiempo miras lo que puedas.

Saludos !

seccion_31 19-02-2025 11:08:06

Cita:

Empezado por newtron (Mensaje 562113)
Buenas compañero. Es posible que una factura rechazada no puedas anularla porque no exista en sus registros.


Saludos.

hola !

no es una factura rechazada, es una factura anterior a la implantacion de verifactu, digamos de unos dias antes de su entrada en vigor. que yo recuerde en la documentacion dice que se puede.

: )

Neftali [Germán.Estévez] 19-02-2025 11:46:03

Cita:

Empezado por seccion_31 (Mensaje 562110)
lo que falta por probar y creo que NO funciona, son las anulaciones de facturas que no tiene verifactu.

Os adjunto cómo sería el registro enviado. Y que posteriormente me lo han aceptado.


Cita:

Empezado por newtron (Mensaje 562113)
Buenas compañero. Es posible que una factura rechazada no puedas anularla porque no exista en sus registros.

Pueden ser facturas antiguas, que modificas o borras (anteriorres a la activación). También una factura que se ha rechazado por algún motivo y que luego borras.

Cita:

Empezado por seccion_31 (Mensaje 562114)
habria que tratar de subir una baja de factura, que no se encuentre en verifactu, y ver que pasa. en teoria puedes anular facturas que verifactu no ha almacenado. A mi no me funciono y lo deje aparcado.

Cita:

Empezado por seccion_31 (Mensaje 562115)
no es una factura rechazada, es una factura anterior a la implantacion de verifactu, digamos de unos dias antes de su entrada en vigor. que yo recuerde en la documentacion dice que se puede.


Creo que pueden ser ambos casos; Se marca el registro de anulación como SinRegistroPrevio.

Código:

<sum:RegFactuSistemaFacturacion xmlns:xd="http://www.w3.org/2000/09/xmldsig#"
xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd"
xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
  <sum:RegistroFactura>
    <sum1:RegistroAnulacion>
      <sum1:IDVersion>1.0</sum1:IDVersion>
      <sum1:IDFactura>
        <sum1:IDEmisorFacturaAnulada>ZZZZZZZZZ</sum1:IDEmisorFacturaAnulada>
        <sum1:NumSerieFacturaAnulada>RECT-3</sum1:NumSerieFacturaAnulada>
        <sum1:FechaExpedicionFacturaAnulada>23-10-2024</sum1:FechaExpedicionFacturaAnulada>
      </sum1:IDFactura>
      <sum1:SinRegistroPrevio>S</sum1:SinRegistroPrevio>
      <sum1:Encadenamiento>
        <sum1:RegistroAnterior>
          <sum1:IDEmisorFactura>ZZZZZZZ</sum1:IDEmisorFactura>
          <sum1:NumSerieFactura>-1</sum1:NumSerieFactura>
          <sum1:FechaExpedicionFactura>24-10-2024</sum1:FechaExpedicionFactura>
          <sum1:Huella>25E03B23C71B88D8337D5EB4DD7E1F3C031962C6550452D59D1841D7A9FE4444</sum1:Huella>
        </sum1:RegistroAnterior>
      </sum1:Encadenamiento>
      <sum1:SistemaInformatico>
        <sum1:NombreRazon>Empresa Conservas S.L.</sum1:NombreRazon>
        <sum1:NIF>ZZZZZZZZ</sum1:NIF>
        <sum1:NombreSistemaInformatico>MiERP</sum1:NombreSistemaInformatico>
        <sum1:IdSistemaInformatico>04</sum1:IdSistemaInformatico>
        <sum1:Version>1.0.0.0</sum1:Version>
        <sum1:NumeroInstalacion>12345678</sum1:NumeroInstalacion>
        <sum1:TipoUsoPosibleSoloVerifactu>N</sum1:TipoUsoPosibleSoloVerifactu>
        <sum1:TipoUsoPosibleMultiOT>S</sum1:TipoUsoPosibleMultiOT>
        <sum1:IndicadorMultiplesOT>N</sum1:IndicadorMultiplesOT>
      </sum1:SistemaInformatico>
      <sum1:FechaHoraHusoGenRegistro>2025-02-19T10:36:16Z</sum1:FechaHoraHusoGenRegistro>
      <sum1:TipoHuella>01</sum1:TipoHuella>
      <sum1:Huella>E0D84796EE72EB59B8ABC9A81C9715F1967839A1B3D2ACA043006ECCC9144444</sum1:Huella>
    </sum1:RegistroAnulacion>
  </sum:RegistroFactura>
</sum:RegFactuSistemaFacturacion>


seccion_31 20-02-2025 07:58:38

gracias Neftali

viendo el codigo me doy cuenta de que "creo" que lo tenia mal planteado el sinRegistroPrevio

hay un "if" por medio que creo no estaba bien situado lo he movido. No lo he probado todavia.

Quedara para la 1.2

Saludos !

CarlosMz 20-02-2025 12:46:44

Buenas, no sé si era esto lo que me pediste:

Respuesta envío factura normal con 21%
Código:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
    <RegFactuSistemaFacturacion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
      <Cabecera>
        <ObligadoEmision xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
          <NombreRazon>INFORMATICA, S.L.</NombreRazon>
          <NIF>B1222222</NIF>
        </ObligadoEmision>
        <RemisionVoluntaria xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
          <Incidencia>S</Incidencia>
        </RemisionVoluntaria>
      </Cabecera>
      <RegistroFactura>
        <RegistroAlta xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
          <IDVersion>1.0</IDVersion>
          <IDFactura>
            <IDEmisorFactura>B1222222</IDEmisorFactura>
            <NumSerieFactura>25F00001</NumSerieFactura>
            <FechaExpedicionFactura>01-01-2025</FechaExpedicionFactura>
          </IDFactura>
          <NombreRazonEmisor>INFORMATICA, S.L.</NombreRazonEmisor>
          <TipoFactura>F1</TipoFactura>
          <DescripcionOperacion>VENTAS MERCADERIAS</DescripcionOperacion>
          <Destinatarios>
            <IDDestinatario>
              <NombreRazon>CLIM S.L.</NombreRazon>
              <NIF>B22222</NIF>
            </IDDestinatario>
          </Destinatarios>
          <Desglose>
            <DetalleDesglose>
              <ClaveRegimen>01</ClaveRegimen>
              <CalificacionOperacion>S1</CalificacionOperacion>
              <TipoImpositivo>21.00</TipoImpositivo>
              <BaseImponibleOimporteNoSujeto>46.00</BaseImponibleOimporteNoSujeto>
              <CuotaRepercutida>9.66</CuotaRepercutida>
            </DetalleDesglose>
          </Desglose>
          <CuotaTotal>9.66</CuotaTotal>
          <ImporteTotal>55.66</ImporteTotal>
          <Encadenamiento>
            <PrimerRegistro>S</PrimerRegistro>
          </Encadenamiento>
          <SistemaInformatico>
            <NombreRazon>INFORMATICA SL</NombreRazon>
            <NIF>B1222222</NIF>
            <NombreSistemaInformatico>S</NombreSistemaInformatico>
            <IdSistemaInformatico>1</IdSistemaInformatico>
            <Version>2025.1</Version>
            <NumeroInstalacion>undetermined</NumeroInstalacion>
            <TipoUsoPosibleSoloVerifactu>S</TipoUsoPosibleSoloVerifactu>
            <TipoUsoPosibleMultiOT>N</TipoUsoPosibleMultiOT>
            <IndicadorMultiplesOT>S</IndicadorMultiplesOT>
          </SistemaInformatico>
          <FechaHoraHusoGenRegistro>2025-02-20T12:43:58+01:00</FechaHoraHusoGenRegistro>
          <TipoHuella>01</TipoHuella>
          <Huella>EDC14FF1DD7F3136FCBA1FB821D516DA7C0A38BCD7965146A04A73CC1388EC32</Huella>
        </RegistroAlta>
      </RegistroFactura>
    </RegFactuSistemaFacturacion>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Respuesta envío Canarias
Código:


<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<RegFactuSistemaFacturacion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
<Cabecera>
<ObligadoEmision xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<NombreRazon>INFORMATICA, S.L.</NombreRazon>
<NIF>B1222222</NIF>
</ObligadoEmision>
<RemisionVoluntaria xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<Incidencia>S</Incidencia>
</RemisionVoluntaria>
</Cabecera>
<RegistroFactura>
<RegistroAlta xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDVersion>1.0</IDVersion>
<IDFactura>
<IDEmisorFactura>B1222222</IDEmisorFactura>
<NumSerieFactura>25F00002</NumSerieFactura>
<FechaExpedicionFactura>01-01-2025</FechaExpedicionFactura>
</IDFactura>
<NombreRazonEmisor>INFORMATICA, S.L.</NombreRazonEmisor>
<TipoFactura>F1</TipoFactura>
<DescripcionOperacion>VENTAS MERCADERIAS</DescripcionOperacion>
<Destinatarios>
<IDDestinatario>
<NombreRazon>GUSTAVO </NombreRazon>
<NIF>1111111Z</NIF>
</IDDestinatario>
</Destinatarios>
<Desglose>
<DetalleDesglose>
<ClaveRegimen>01</ClaveRegimen>
<OperacionExenta>E4</OperacionExenta>
<BaseImponibleOimporteNoSujeto>19.95</BaseImponibleOimporteNoSujeto>
</DetalleDesglose>
</Desglose>
<CuotaTotal>0.00</CuotaTotal>
<ImporteTotal>19.95</ImporteTotal>
<Encadenamiento>
<PrimerRegistro>S</PrimerRegistro>
</Encadenamiento>
<SistemaInformatico>
<NombreRazon>INFORMATICA SL</NombreRazon>
<NIF>B1222222</NIF>
<NombreSistemaInformatico>S</NombreSistemaInformatico>
<IdSistemaInformatico>1</IdSistemaInformatico>
<Version>2025.1</Version>
<NumeroInstalacion>undetermined</NumeroInstalacion>
<TipoUsoPosibleSoloVerifactu>S</TipoUsoPosibleSoloVerifactu>
<TipoUsoPosibleMultiOT>N</TipoUsoPosibleMultiOT>
<IndicadorMultiplesOT>S</IndicadorMultiplesOT>
</SistemaInformatico>
<FechaHoraHusoGenRegistro>2025-02-20T12:32:22+01:00</FechaHoraHusoGenRegistro>
<TipoHuella>01</TipoHuella>
<Huella>67C220CD32CF94DADAE0273B9A53E947E8E44086B335E669E72D66666ACABA</Huella>
</RegistroAlta>
</RegistroFactura>
</RegFactuSistemaFacturacion>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>



La franja horaria es GMT +2. Ahora son las 11:58:34.

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