Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Proyecto SIF/Veri*Factu/Ley Antifraude > Envío de registros y sus respuestas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Tema Cerrado
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-02-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 488
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por ramherfer Ver Mensaje
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
  #2  
Antiguo 18-02-2025
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.504
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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].
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
  #3  
Antiguo 18-02-2025
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 163
Poder: 14
ramherfer Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
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>
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.

Última edición por ramherfer fecha: 18-02-2025 a las 11:16:10.
  #4  
Antiguo 18-02-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 488
Poder: 10
seccion_31 Va por buen camino
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 !

Última edición por Neftali [Germán.Estévez] fecha: 18-02-2025 a las 12:10:47.
  #5  
Antiguo 18-02-2025
Avatar de DarkDudae
DarkDudae DarkDudae is offline
Miembro
 
Registrado: abr 2006
Posts: 177
Poder: 21
DarkDudae Va por buen camino
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
__________________
El recuerdo es la prisión en la que el alma sueña pasado, cuando no vive el presente, ni quiere un futuro.

Última edición por DarkDudae fecha: 18-02-2025 a las 18:27:51.
  #6  
Antiguo 18-02-2025
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 163
Poder: 14
ramherfer Va por buen camino
Cita:
Empezado por seccion_31 Ver Mensaje
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.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
  #7  
Antiguo 19-02-2025
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.504
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Actualizada la última versión en el FTP del club.
Gracias a todos.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
  #8  
Antiguo 19-02-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 488
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por ramherfer Ver Mensaje
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.
  #9  
Antiguo 19-02-2025
CarlosMz CarlosMz is offline
Miembro
 
Registrado: jul 2020
Posts: 143
Poder: 7
CarlosMz Va por buen camino
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
  #10  
Antiguo 19-02-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 488
Poder: 10
seccion_31 Va por buen camino
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 !
  #11  
Antiguo 19-02-2025
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.232
Poder: 24
newtron Va camino a la fama
Cita:
Empezado por seccion_31 Ver Mensaje
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.
__________________
Be water my friend.
  #12  
Antiguo 19-02-2025
Avatar de seccion_31
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 488
Poder: 10
seccion_31 Va por buen camino
Cita:
Empezado por newtron Ver Mensaje
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.

: )
Tema Cerrado


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Verifactu o por requerimiento (no-verifactu) ¿decisión del usuario? Maska10 Temas legales 2 07-12-2024 13:34:47
Demo de una applicación para una estación de enfermera con RAD Studio AgustinOrtu La Taberna 1 21-07-2015 18:41:35
Demo Delphi, EMail Caral Internet 1 19-12-2006 01:37:56
Demo de delphi 2005 mazinger Varios 2 18-12-2004 10:23:09
El Rave que viene con Delphi es una Demo? apicito Impresión 0 04-06-2003 12:33:36


La franja horaria es GMT +2. Ahora son las 20:40:45.


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
Copyright 1996-2007 Club Delphi