Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Ley antifraude 2021 (VERIFACTU) - Programas informáticos (https://www.clubdelphi.com/foros/showthread.php?t=95235)

rci 23-10-2024 12:55:03

Cita:

Empezado por bmfranky (Mensaje 558650)
teniendo en cuenta que nos indican que no debemos continuar generando registros hasta subsanar los anteriores...

Donde has visto esto?

En mi opinión no podemos dejar de generar registros (hacer nuevas facturas) aunque haya un error, un usuario no puede dejar de vender.
Yo pienso que cuando el usuario vea que ha habido un error en una factura, cuando pueda lo arreglará de la forma que el programa se lo permita y se volverá a enviar.

Gracias

ermendalenda 23-10-2024 13:59:53

Cita:

Empezado por bmfranky (Mensaje 558650)
Hola, la cuestion es que estamos subsanado la huella, y segun esto.
Código:

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).

Creo que tenemos que componer la huella enviada, teniendo en cuenta los datos del registro a subsanar, osea la huella anterior al registro subsanado, teniendo en cuenta que nos indican que no debemos continuar generando registros hasta subsanar los anteriores...

Tiene más sentido, así pensaba yo hace unos días, pero me había reorientar a raíz de los últimos post.
Lo lógico es reencadebar todo, ya que si tenemos que pasar un programa para revisar el encadenamiento vanos a tener fallos.
Esto es un problema GORDO para los No verufactusncomo les pidan los registros de hace 1 ó 2 años.

ermendalenda 23-10-2024 14:01:24

Cita:

Empezado por rci (Mensaje 558652)
Donde has visto esto?

En mi opinión no podemos dejar de generar registros (hacer nuevas facturas) aunque haya un error, un usuario no puede dejar de vender.
Yo pienso que cuando el usuario vea que ha habido un error en una factura, cuando pueda lo arreglará de la forma que el programa se lo permita y se volverá a enviar.

Gracias

No tienes que parar nada, como algún compañero en un post anterior ha dicho, las facturas no llevan el encadenamiento en el qr. Solo se encadena en los XML. Se arreglan cuando se pueda, teniendo en cuenta que cuanto más esperes más registros tienes que volver a mandar

rci 23-10-2024 14:08:42

Cita:

Empezado por ermendalenda (Mensaje 558654)
No tienes que parar nada, como algún compañero en un post anterior ha dicho, las facturas no llevan el encadenamiento en el qr. Solo se encadena en los XML. Se arreglan cuando se pueda, teniendo en cuenta que cuanto más esperes más registros tienes que volver a mandar

:confused:


Yo diría que solo tienes que volver a mandar el que se tiene que arreglar... los demás ya están bien. No?

ermendalenda 23-10-2024 14:13:50

Cita:

Empezado por rci (Mensaje 558655)
:confused:


Yo diría que solo tienes que volver a mandar el que se tiene que arreglar... los demás ya están bien. No?

Bueno, algunos entendemos que hay que reencadenar el registro subsanado don el mismo que debería estar anteriormente, con lo cual habría que r3acer todos los encadenamientos de los generados posteriormente.
Yo voy a trabajar en esa línea hasta que alguien haga la consulta y lo detallen claramente.

bmfranky 23-10-2024 14:18:12

??
 
Cita:

Empezado por ermendalenda (Mensaje 558656)
Bueno, algunos entendemos que hay que reencadenar el registro subsanado don el mismo que debería estar anteriormente, con lo cual habría que r3acer todos los encadenamientos de los generados posteriormente.
Yo voy a trabajar en esa línea hasta que alguien haga la consulta y lo detallen claramente.

Hola, pues no se que deciros, ahora si que estoy hecho un lio, porque si enviamos por ejemplo la facturas 13 y la encadenomos mal , generando una huella por ejmplo hhhh(aunque deveria ser "AAA") , la siguiente factura, la encadenamos con la huella anterior hhhh, que es incorrecta, pero es la semilla que usamos para generar el encadenamiento, entonces nos dara OK, porque generamos con esa semilla, por eso os decia si alguien havia hecho la prueba de encadenar mal a drede , saltando un registro en el mismo envio, para ver como se comportaba.

bmfranky 23-10-2024 14:20:17

Cita:

Empezado por rci (Mensaje 558652)
Donde has visto esto?

En mi opinión no podemos dejar de generar registros (hacer nuevas facturas) aunque haya un error, un usuario no puede dejar de vender.
Yo pienso que cuando el usuario vea que ha habido un error en una factura, cuando pueda lo arreglará de la forma que el programa se lo permita y se volverá a enviar.

Gracias

Perdona , igual me lo he fumado yo, como mi idea es que si hay un error , subsanar antes de seguir...

bmfranky 23-10-2024 14:27:30

Cita:

Empezado por ermendalenda (Mensaje 558617)
Enviamos una factura, anulamos por error otra y la enviamos, y además pertenece a otro periodo impositivo la que hemos anulado por error.
Supongo que hay que volver a emitir una nueva de la que hemos anulado ¿con la fecha de la anterior?, aparte del lío de hablar con el cliente que lo mismo está en SII y ya se la ha declarado.
Ahora el cliente tiene que anular esa factura del SII (y que lo haga)
Vaya lio no?
PROHIBIDO EQUIVOCARSE.

Hola, simplemente haces un alta por subsanacion , con todos los datos de la factura anulada, segun la operativa, obtienes.

Cita:

OK(5) = Reactiva(vuelve a dejar de alta y en vigor) el registro de facturación anulado existente, sustituyendo completamente el registro de facturación registrado con los nuevos datos recibidos
Lo acabo de leer en el documento de validaciones.

delphiGar 23-10-2024 14:41:02

Cita:

Empezado por sglorka (Mensaje 558638)
La Huella anterior que debes coger para formar el registro de subsanación de A13 es la huella del registro de A13 que te aceptaron con errores

Tienes toda la razon sglorka, la consulta la hice yo y es asi como tu dices, es decir hay que coger la huella inmedianteme anterior al ultimo registro.

Pregunta a al AEAT

Código:

Tengo 5 registros de Alta para enviar, cada uno encadenado con el anterior mediante el hash correspondiente,
si el 2 registro me lo rechaza por ejemplo por que el tipo impositivo es incorrecto como debo actuar.

Si envio el 2 registro de nuevo ya corregido, el hash si lo calculo con el registro anterior que me dio por bueno y
el nuevo hash sera distinto por el importe de nuevo calculado, con lo cual el encadenamiento para los registros 3, 4 y 5 tampoco sera valido.
En este caso subsano los registros 3, 4 y 5 con el nuevo hash o envio el 2 registro encadenado con el ultimo hash del ultimo enviado como correcto y
dejo los demas registro tal cual.

Contestacion:

Buenos días:

En el caso planteado, tenga en cuenta que para solucionar el error del registro 2 (siempre y cuando no corresponda la emisión de una factura rectificativa) deberá generar un nuevo registro de facturación de tipo "ALTA POR RECHAZO" con el error corregido. El encadenamiento siempre será en orden cronológico, por lo que este nuevo registro (siguiendo la serie, sería el registro 6) irá encadenado con el registro 5.

Efectivamente se producirá un salto en la cadena entre el registro 1 y 3 pero es algo que desde la AEAT ya se tendrá en cuenta por lo que no debe subsanar los registros posteriores con nuevas huellas.

Código:

En este tipo de situaciones, puede darse el caso de algún salto en el encadenamiento. Los registros se admitirán aunque el encadenamiento no sea el

correcto. Aunque existan estos saltos , algo que desde la AEAT asumimos y prevemos que ocurra, tenemos la forma de detectar esta circunstancias excepcionales ya

que quedarán marcadas convenientemente y serán fáciles de trazar con nuestras herramientas de explotación. El sentido de tener encadenados cronológicamente a

través hash de la forma que se solicita en el reglamento es porque en la mayoría de las casuísticas esta cadena estará bien formada y sólo existirán casos

excepcionales que estarán bajo control. No debería ser una preocupación como empresa desarrolladora, la responsabilidad de detectar el mal uso o incumplimiento

reiterado está en nuestro tejado.


pablog2k 23-10-2024 14:53:41

bueno pues tras leer la respuesta que te dio Hacienda, veo que lleváis razón, no consideran que nº de factura sea igual que registro, y por lo tanto si subo las facturas A1 a A5, y luego modifico la A2, esta irá encadenada con A5, y luego cuando suba A6 irá encadenada con la subsanación de A2.
Personalmente me parece un lío, pero bueno, habrá que adaptarse a lo que digan.
gracias por las respuestas

bmfranky 23-10-2024 15:03:17

Cita:

Empezado por pablog2k (Mensaje 558661)
bueno pues tras leer la respuesta que te dio Hacienda, veo que lleváis razón, no consideran que nº de factura sea igual que registro, y por lo tanto si subo las facturas A1 a A5, y luego modifico la A2, esta irá encadenada con A5, y luego cuando suba A6 irá encadenada con la subsanación de A2.
Personalmente me parece un lío, pero bueno, habrá que adaptarse a lo que digan.
gracias por las respuestas

Entonces, lo que hay que hacer es guardar el encadenamiento en una tabla y cada vez que hacemos un envio, rectificacion o lo que sea , siempre usar los datos de la ultima entrada de la tabla, sea la que sea , podria ser abono de una factura del año pasado, da lo mismo , el ecadenamiento sera sobre los ultimos datos introducidos.

bmfranky 23-10-2024 15:49:22

Sustitutiva Cliente Erroneo.
 
Hola siguiendo con mi ritmo, ahora me toca las sutitutivas por cliente erroneo, la operativa seria.
Siendo A mis facturas B los registros enviados a la aeat teniendo en cuanta que la factura ya se ha emitido, enviado con su respectivo rsgistro mi factura Fac001.
1-> emito una factura F1 Fac002, con las cantidades en negativo , genero mi factura A, que imprimo por si se la he enviado al cliente anterior.
Genero un registro de Anulacion Bn4 con los datos de la factura Fac001, encadenado con el registro anterior sea cual sea (por claridad n3)

2-> emito una factura F1 Fac003 con los datos ya correctos para enviar al cliente correcto.
Genero un registro de alta, Bn5 con los datos de la factura Fac003, encadenado con Bn4.


Esto seria lo correcto o en vez de la factura F1 Fac002, seria una Rectificativa R1?


Perdonad la obbiedad pero soy muy ceporro con las cosas que no he hecho nunca hasta que las comprendo.

ermendalenda 23-10-2024 17:11:57

Cita:

Empezado por delphiGar (Mensaje 558660)
Tienes toda la razon sglorka, la consulta la hice yo y es asi como tu dices, es decir hay que coger la huella inmedianteme anterior al ultimo registro.

Pregunta a al AEAT

Código:

Tengo 5 registros de Alta para enviar, cada uno encadenado con el anterior mediante el hash correspondiente,
si el 2 registro me lo rechaza por ejemplo por que el tipo impositivo es incorrecto como debo actuar.

Si envio el 2 registro de nuevo ya corregido, el hash si lo calculo con el registro anterior que me dio por bueno y
el nuevo hash sera distinto por el importe de nuevo calculado, con lo cual el encadenamiento para los registros 3, 4 y 5 tampoco sera valido.
En este caso subsano los registros 3, 4 y 5 con el nuevo hash o envio el 2 registro encadenado con el ultimo hash del ultimo enviado como correcto y
dejo los demas registro tal cual.

Contestacion:

Buenos días:

En el caso planteado, tenga en cuenta que para solucionar el error del registro 2 (siempre y cuando no corresponda la emisión de una factura rectificativa) deberá generar un nuevo registro de facturación de tipo "ALTA POR RECHAZO" con el error corregido. El encadenamiento siempre será en orden cronológico, por lo que este nuevo registro (siguiendo la serie, sería el registro 6) irá encadenado con el registro 5.

Efectivamente se producirá un salto en la cadena entre el registro 1 y 3 pero es algo que desde la AEAT ya se tendrá en cuenta por lo que no debe subsanar los registros posteriores con nuevas huellas.

Código:

En este tipo de situaciones, puede darse el caso de algún salto en el encadenamiento. Los registros se admitirán aunque el encadenamiento no sea el

correcto. Aunque existan estos saltos , algo que desde la AEAT asumimos y prevemos que ocurra, tenemos la forma de detectar esta circunstancias excepcionales ya

que quedarán marcadas convenientemente y serán fáciles de trazar con nuestras herramientas de explotación. El sentido de tener encadenados cronológicamente a

través hash de la forma que se solicita en el reglamento es porque en la mayoría de las casuísticas esta cadena estará bien formada y sólo existirán casos

excepcionales que estarán bajo control. No debería ser una preocupación como empresa desarrolladora, la responsabilidad de detectar el mal uso o incumplimiento

reiterado está en nuestro tejado.


Pues esto es una buena noticia dentro de todo este lío.
Gracias.

ermendalenda 23-10-2024 17:54:16

Cita:

Empezado por bmfranky (Mensaje 558663)
Hola siguiendo con mi ritmo, ahora me toca las sutitutivas por cliente erroneo, la operativa seria.
Siendo A mis facturas B los registros enviados a la aeat teniendo en cuanta que la factura ya se ha emitido, enviado con su respectivo rsgistro mi factura Fac001.
1-> emito una factura F1 Fac002, con las cantidades en negativo , genero mi factura A, que imprimo por si se la he enviado al cliente anterior.
Genero un registro de Anulacion Bn4 con los datos de la factura Fac001, encadenado con el registro anterior sea cual sea (por claridad n3)

2-> emito una factura F1 Fac003 con los datos ya correctos para enviar al cliente correcto.
Genero un registro de alta, Bn5 con los datos de la factura Fac003, encadenado con Bn4.


Esto seria lo correcto o en vez de la factura F1 Fac002, seria una Rectificativa R1?


Perdonad la obbiedad pero soy muy ceporro con las cosas que no he hecho nunca hasta que las comprendo.

Creo que hay un pequeño lio de varias cosas aquí.
Empezando por el título, aquí nohay sustitutivas, aquí estas intentando hacer una rectificativa por sustitucion de una factura f1.
Las sustitutivas (f3) son emitidas para sustituir las de tipo f2.
Para las facturas por sustitución no hay que hacer anulaciones, algún compañerote lo podrá explicar mejor, ya que las rectificativas que yo tengo son por diferencias no hago de sustitución
El caso que has planteando estas aplicando una doble negativa, al anular y emitir un abono y se te quedaría todo a 0, como si no hubieras emitido nada.
Además las facturas rectificativas por sustitución también tienen 2 formas de hacerlas y dependiendo de lo que quieras hacer o mejor se adapte a tu software, es mejor qur lo veas claro.es un punto un poco lioso en el reglamento

antoine0 23-10-2024 18:43:00

Cita:

Empezado por sglorka (Mensaje 558629)
El encadenamiento siempre tiene que ser con el registro generado anteriormente en orden cronológico para el mismo SIF. La tercera operación que has hecho, -subo la factura A13 como subsanación, poniendo bien los valores de Encadenamiento (Encadena con A12, relleno bien IdEmisorFactura,NumSerieFactura,FechaExpedicionFactura y Huella) , respuesta OK.

no debería ser correcta ya que no estás encadenando con el registro anterior de factura A13 que sí fue aceptado, aunque con errores. Para subsanar una huella no puedes saltarte la cadena cronológica aunque parezca que en realidad no estás subsanando nada. Esto ya lo he consultado con el correo de Verifactu. Si te responde Ok en porque ellos internamente habrán decidido eso pero saben perfectamente que el encadenamiento está mal

Estoy contigo sobre lo que es lo correcto: si el SIF ha generado A13malo, debe encadenar la siguiente (A13bueno) con este mismo A13malo, no con A12.
Y estoy seguro que esta secuencia (A13bueno encadenada con A13malo y marcada subsanación) será aceptada por AEAT.

Ahora bien, puede haber caso de operatividad que permiten secuencias como:
  • se genera A12 limpiamente
  • se empieza a generar un A13, hay un problema, el sistema se raya, envía un A13malo y al mismo tiempo se cae (incluso puede llegar a no recuperar la respuesta al envío de A13malo)
  • se recupera el sistema, en la base la cadena tiene entonces A12 como última (el SIF no sabe nada de A13)
  • se envía la siguiente, A13bueno, encadenada con A12
  • este envío está descartado por AEAT ya que "A13" ya existe en el sistema de AEAT (aunque ¡no existe en el SIF!)
  • se reenvía A13bueno como subsanación (sin cambiar nada)
Visto desde la AEAT, la secuencia será efectivamente la que lo que ha probado @pablog2K. Y creo que es admisible (aunque se necesitan dos incidentes, que se raye y que se caiga).

sglorka 23-10-2024 18:58:14

Cita:

Empezado por antoine0 (Mensaje 558668)
Estoy contigo sobre lo que es lo correcto: si el SIF ha generado A13malo, debe encadenar la siguiente (A13bueno) con este mismo A13malo, no con A12.
Y estoy seguro que esta secuencia (A13bueno encadenada con A13malo y marcada subsanación) será aceptada por AEAT.

Ahora bien, puede haber caso de operatividad que permiten secuencias como:
  • se genera A12 limpiamente
  • se empieza a generar un A13, hay un problema, el sistema se raya, envía un A13malo y al mismo tiempo se cae (incluso puede llegar a no recuperar la respuesta al envío de A13malo)
  • se recupera el sistema, en la base la cadena tiene entonces A12 como última (el SIF no sabe nada de A13)
  • se envía la siguiente, A13bueno, encadenada con A12
  • este envío está descartado por AEAT ya que "A13" ya existe en el sistema de AEAT (aunque ¡no existe en el SIF!)
  • se reenvía A13bueno como subsanación (sin cambiar nada)
Visto desde la AEAT, la secuencia será efectivamente la que lo que ha probado pablo2K. Y creo que es admisible (aunque se necesitan dos incidentes, que se raye y que se caiga).

Bueno esta situación, en teoría, no podría darse, y no me refiero a que se caiga el sistema, me refiero a esta suposición que haces "se recupera el sistema, en la base la cadena tiene entonces A12 como última (el SIF no sabe nada de A13)". Si en el paso anterior has podido enviar A13 y la ha aceptado la Aeat, es por que la tienes registrada en tu sistema, que luego no te enteres de la respuesta porque el sistema se haya caido no es problema porque volverías a enviar A13 (se supone que tu algoritmo la tiene marcada como no enviada) y te daría registro duplicado en la Aeat y aquí no ha pasado nada.
En mi cabeza no cabe que un registro que se envía a la Aeat no esté almacenado en el Sif. El código que se desarrolle para tal cometido, al menos, debe asegurar este punto.

ermendalenda 23-10-2024 19:12:21

Cita:

Empezado por sglorka (Mensaje 558669)
Bueno esta situación, en teoría, no podría darse, y no me refiero a que se caiga el sistema, me refiero a esta suposición que haces "se recupera el sistema, en la base la cadena tiene entonces A12 como última (el SIF no sabe nada de A13)". Si en el paso anterior has podido enviar A13 y la ha aceptado la Aeat, es por que la tienes registrada en tu sistema, que luego no te enteres de la respuesta porque el sistema se haya caido no es problema porque volverías a enviar A13 (se supone que tu algoritmo la tiene marcada como no enviada) y te daría registro duplicado en la Aeat y aquí no ha pasado nada.
En mi cabeza no cabe que un registro que se envía a la Aeat no esté almacenado en el Sif. El código que se desarrolle para tal cometido, al menos, debe asegurar este punto.

Si de ha enviado seguramente puedas consultarla cuando hagan la web, debes generar la factura a13 de nuevo y enviarla como subsanacion, si r3cibes la r3spuesta que ya está en el sistema tienes que recibir esa notificación y saber que tienes que hacer.
El problema es que hayas emitido la factura con su qr y no haya dado tiempo a enviarla antes de la avería y es un escenario posible y un potencial problema aquí no cabe subsanacion.

nincillo 23-10-2024 19:39:38

Cita:

Empezado por bmfranky (Mensaje 558602)
Código:

              //creamos la factura paso a paso.
                RegFactuSistemaFacturacion facAPresentar = new RegFactuSistemaFacturacion();

                //rellenamos la cabecera
                ServicioVerifactu.Cabecera cabecera = new ServicioVerifactu.Cabecera();

                //creamos obligado presentador y se lo asignamos.
                ServicioVerifactu.PersonaFisicaJuridicaESType yo = new ServicioVerifactu.PersonaFisicaJuridicaESType();
                yo.NIF = Program.configTaller.Nif;
                yo.NombreRazon = Program.configTaller.NombreTaller;
                //se lo asignamos a la cabecera
                cabecera.ObligadoEmision = yo;

                //Creamos especificacion de remision voluntaria y la asignamos a la cabecera
                ServicioVerifactu.CabeceraRemisionVoluntaria voluntaria = new ServicioVerifactu.CabeceraRemisionVoluntaria();

                voluntaria.Incidencia = ServicioVerifactu.IncidenciaType.N;
                voluntaria.FechaFinVeriFactu = "";
                voluntaria.IncidenciaSpecified = true;
                //voluntaria.IncidenciaSpecified = false;
                cabecera.RemisionVoluntaria = voluntaria;

                // Asignamos la cabecera a la factura.
                facAPresentar.Cabecera = cabecera;

                //creamos el registro de factura podrian ser varios, pero solo asignaremos uno.
                ServicioVerifactu.RegistroFacturaType[] registroFactura = new ServicioVerifactu.RegistroFacturaType[1];

                //Como vamos a dar de alta la factura , creamos el registro de alta
                ServicioVerifactu.RegistroFacturacionAltaType altaFactura = new ServicioVerifactu.RegistroFacturacionAltaType();

                //Asignamos el ID version
                altaFactura.IDVersion = ServicioVerifactu.VersionType.Item10;//de momento la unica accesible

                //Identificamos la factura y lo asignamos a el Alta
                ServicioVerifactu.IDFacturaExpedidaType iDFactura = new ServicioVerifactu.IDFacturaExpedidaType();
                iDFactura.FechaExpedicionFactura = fechaFactura.Text;//Fecha de presentacion de la factura.
                iDFactura.IDEmisorFactura = Program.configTaller.Nif;//NIF del obligado emisor
                iDFactura.NumSerieFactura = numFactura;//numeo de factura y serie
                altaFactura.IDFactura = iDFactura;
                Program.facturaSeleccionada.Fecha = fechaFactura.Text;
                //asignamos nombre expedidor
                altaFactura.NombreRazonEmisor = Program.configTaller.NombreTaller;

                //Es por subsanacion ?
                altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.N;
                // Se havia rechazado ?
                altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.N;
                if(alta == "RECHAZO")
                {
                    //Es por subsanacion ?
                    altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.S;
                    // Se havia rechazado ?
                    altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.X;
                }
                if (alta == "SUBSANACION")
                {
                    //Es por subsanacion ?
                    altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.S;
                    // Se havia rechazado ?
                    altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.N;
                }
                if (alta == "RECHAZO_SUBSANACION")
                {
                    //Es por subsanacion ?
                    altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.S;
                    // Se havia rechazado ?
                    altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.S;
                }
                //Que tipo de factura estamos creando?
                altaFactura.TipoFactura = ServicioVerifactu.ClaveTipoFacturaType.F1;
                /*

                //Si es rectificativa lo indicamos y cumplimentamos los datos requeridos  ya sea rectificada o sustituida son el mismo diseño
                altaFactura.TipoRectificativa = ServicioVerifactu.ClaveTipoRectificativaType.I;
                Program.FacturaSeleccionada.Tipo=
                //aqui consignariamos los datos de las facturas para sutitucion y demas.
                int numeroFaR = 1;
                ServicioVerifactu.IDFacturaARType[] listFacturasRectificadas = new ServicioVerifactu.IDFacturaARType[numeroFaR];// creamos lista de facturas rectificadas.
                ServicioVerifactu.IDFacturaARType facSust = new ServicioVerifactu.IDFacturaARType();//rellenamos la primera
                facSust.FechaExpedicionFactura = "FECHA";          //Fecha de emision factura sustituida
                facSust.IDEmisorFactura = Program.configTaller.Nif;//Nif expedidor.
                facSust.NumSerieFactura = "Num Serie";            //Numero de serie factura sustituida
                listFacturasRectificadas[1] = facSust;            //le asignamos una por una las facturas rectificadas
                altaFactura.FacturasSustituidas = listFacturasRectificadas; //Asignamos al mandato

                //creamos desglose de la rectificacion con los totales a rectificar
                ServicioVerifactu.DesgloseRectificacionType desgloseRectificacion = new ServicioVerifactu.DesgloseRectificacionType();
                desgloseRectificacion.BaseRectificada = "";        // Cuota base a rectificar
                desgloseRectificacion.CuotaRecargoRectificado = "";// Hay recargo equivalencia ??
                desgloseRectificacion.CuotaRectificada = "";      //Cuota iva rectificada;
                altaFactura.ImporteRectificacion = desgloseRectificacion; // asignamos importe de la rectificacion

                */
                //Asignamos la fecha en que se izo la operacion si no es en la misma que se expide la factura, en este caso si es la misma, si fuera de reparacion puede variar
                altaFactura.FechaOperacion = fechaFactura.Text.Replace("/", "-");

                //Asignamos motivo descripcion de la operacion , en este caso venta de materiales;
                altaFactura.DescripcionOperacion = "Venta de materiales servidos.";// en caso de reparacion de vehiculo asignar aqui la reparacion.

                //Es factura simplificada s/n
                altaFactura.FacturaSimplificadaArt7273 = ServicioVerifactu.SimplificadaCualificadaType.N;

                //Es factura sin identificar destinatario? s/n
                altaFactura.FacturaSinIdentifDestinatarioArt61d = ServicioVerifactu.CompletaSinDestinatarioType.N;

                //por tercero ??
                //altaFactura.EmitidaPorTerceroODestinatario = ServicioVerifactu.TercerosODestinatarioType.T;
                /*
                // aqui se consignaria todo lo de terceros.
                ServicioVerifactu.PersonaFisicaJuridicaType Tercero = new ServicioVerifactu.PersonaFisicaJuridicaType();
                Tercero.NombreRazon = "";
                ServicioVerifactu.IDOtroType idTercero = new ServicioVerifactu.IDOtroType();
                idTercero.CodigoPais = ServicioVerifactu.CountryType2.ES;
                idTercero.ID = "nif"; //identificador
                idTercero.IDType = ServicioVerifactu.PersonaFisicaJuridicaIDTypeType.Item02;
                Tercero.Item = idTercero;
                altaFactura.Tercero = Tercero;
                */
                int numDestinatarios = 1;
                ServicioVerifactu.PersonaFisicaJuridicaType[] destinatarios = new ServicioVerifactu.PersonaFisicaJuridicaType[numDestinatarios];//lista de destinatarios, para mi siempre 1
                                                                                                                                                //primer destinatario
                ServicioVerifactu.PersonaFisicaJuridicaType destinatario = new ServicioVerifactu.PersonaFisicaJuridicaType(); //creamos nuevo destinatario
                if (cmbPais.Text != "ESPAÑA" || _documento.Text != "NIF-IVA")
                {
                    ServicioVerifactu.IDOtroType idOtro = new ServicioVerifactu.IDOtroType();
                    destinatario.NombreRazon = nom.Text + " " + Apellido1.Text + " " + Apellido2.Text;
                    idOtro.CodigoPais = ServicioVerifactu.CountryType2.ES;// hallar el pais
                    idOtro.ID = Dni.Text;
                    idOtro.IDType = tipoPersona(_documento.SelectedIndex);
                    destinatario.Item = idOtro;
                }
                else
                {
                    //ServicioVerifactu.PersonaFisicaJuridicaESType cliente = new ServicioVerifactu.PersonaFisicaJuridicaESType();
                    destinatario.NombreRazon = nom.Text + " " + Apellido1.Text + " " + Apellido2.Text;
                    //cliente.NIF = Dni.Text;
                    //cliente.NombreRazon = nom.Text + " " + Apellido1.Text + " " + Apellido2.Text;
                    destinatario.Item = Dni.Text; //cliente;
                }


                destinatarios[0] = destinatario;
                //se los asignamos a la factura
                altaFactura.Destinatarios = destinatarios;
                // ahora creamos el desglose uno por tipo de iva
                ServicioVerifactu.DetalleType[] desgloses = new ServicioVerifactu.DetalleType[numeroIvas];


                //iva 21%
                if (asignado21)
                {
                    ServicioVerifactu.DetalleType tipo21 = new ServicioVerifactu.DetalleType();
                    tipo21.Impuesto = ServicioVerifactu.ImpuestoType.Item01;
                    tipo21.ClaveRegimen = ServicioVerifactu.IdOperacionesTrascendenciaTributariaType.Item01;//Operaciones regimen general
                    tipo21.ClaveRegimenSpecified = true;
                    tipo21.Item = ServicioVerifactu.CalificacionOperacionType.S1;//no esta exenta ni es por inversion del sujeto pasivo...
                    tipo21.TipoImpositivo = "21.00";

                    tipo21.BaseImponibleOimporteNoSujeto = (base21 + totalPortes).ToString("F2").Replace(",", ".");// impon21.Text.Replace(",", ".").Replace(" €", "");
                    bases = bases + base21 + totalPortes;// float.Parse(impon21.Text.Replace(" €",""));
                    tipo21.CuotaRepercutida = float.Parse(cuota21.Text.Replace(" €", "")).ToString("F2").Replace(",", ".");// cuota21.Text.Replace(",", ".").Replace(" €", "");
                    cuotas = cuotas + float.Parse(cuota21.Text.Replace(" €", ""));
                    desgloses[numDetalle] = tipo21;
                    numDetalle++;
                }
                //iva10%
                if (asignado10)
                {
                    ServicioVerifactu.DetalleType tipo10 = new ServicioVerifactu.DetalleType();
                    tipo10.ClaveRegimenSpecified = true;
                    tipo10.Impuesto = ServicioVerifactu.ImpuestoType.Item01;
                    tipo10.ClaveRegimen = ServicioVerifactu.IdOperacionesTrascendenciaTributariaType.Item01;//Operaciones regimen general
                    tipo10.Item = ServicioVerifactu.CalificacionOperacionType.S1;//no esta exenta ni es por inversion del sujeto pasivo...
                    tipo10.TipoImpositivo = "10.00";
                    tipo10.BaseImponibleOimporteNoSujeto = float.Parse(impon10.Text.Replace(" €", "")).ToString("F2").Replace(",", ".");// impon10.Text.Replace(",", ".").Replace(" €", "");
                    bases = bases + float.Parse(impon10.Text.Replace(" €", ""));
                    tipo10.CuotaRepercutida = float.Parse(cuota10.Text.Replace(" €", "")).ToString("F2").Replace(",", ".");// cuota10.Text.Replace(",", ".").Replace(" €", "");
                    cuotas = cuotas + float.Parse(cuota10.Text.Replace(" €", ""));
                    desgloses[numDetalle] = tipo10;
                    numDetalle++;
                }
                //Iva4%
                if (asignado4)
                {
                    ServicioVerifactu.DetalleType tipo04 = new ServicioVerifactu.DetalleType();
                    tipo04.Impuesto = ServicioVerifactu.ImpuestoType.Item01;
                    tipo04.ClaveRegimen = ServicioVerifactu.IdOperacionesTrascendenciaTributariaType.Item01;//Operaciones regimen general
                    tipo04.ClaveRegimenSpecified = true;
                    tipo04.Item = ServicioVerifactu.CalificacionOperacionType.S1;//no esta exenta ni es por inversion del sujeto pasivo...
                    tipo04.TipoImpositivo = "04.00";
                    tipo04.BaseImponibleOimporteNoSujeto = float.Parse(impon4.Text.Replace(" €", "")).ToString("F2").Replace(",", "."); //impon4.Text.Replace(",", ".").Replace(" €", "");
                    bases = bases + float.Parse(impon4.Text.Replace(" €", ""));
                    tipo04.CuotaRepercutida = float.Parse(cuota10.Text.Replace(" €", "")).ToString("F2").Replace(",", "."); // cuota4.Text.Replace(",", ".").Replace(" €", "");
                    cuotas = cuotas + float.Parse(cuota4.Text.Replace(" €", ""));
                    desgloses[numDetalle] = tipo04;
                    numDetalle++;
                }
                //sin iva
                if (asignado0)
                {
                    ServicioVerifactu.DetalleType tipo0 = new ServicioVerifactu.DetalleType();
                    tipo0.Impuesto = ServicioVerifactu.ImpuestoType.Item01;
                    tipo0.ClaveRegimen = ServicioVerifactu.IdOperacionesTrascendenciaTributariaType.Item01;//Operaciones regimen general
                    tipo0.ClaveRegimenSpecified = true;
                    tipo0.Item = ServicioVerifactu.CalificacionOperacionType.N1;//si esta exenta
                    tipo0.TipoImpositivo = "0.00";
                    tipo0.BaseImponibleOimporteNoSujeto = float.Parse(impon0.Text.Replace(" €", "")).ToString("F2").Replace(",", ".");// impon0.Text.Replace(",", ".").Replace(" €", "");
                    bases = bases + float.Parse(impon0.Text.Replace(" €", ""));
                    //tipo0.CuotaRepercutida = cuota0.Text;
                    desgloses[numDetalle] = tipo0;
                    numDetalle++;
                }

                // se lo asignamos a la factura
                altaFactura.Desglose = desgloses;
                //asignamos total impuestos
                altaFactura.CuotaTotal = cuotas.ToString("F2").Replace(",", ".");
                total = cuotas + bases;
                //asignamos total factura;
                altaFactura.ImporteTotal = total.ToString("F2").Replace(",", ".");

                //creamos el encadenamiento
                ServicioVerifactu.RegistroFacturacionAltaTypeEncadenamiento cadenaFactura = new ServicioVerifactu.RegistroFacturacionAltaTypeEncadenamiento();
                Huella huella = new Huella();
                HuellaVerifactu huellaAnterior = new HuellaVerifactu();
                string _huella = "";
                if (huella.numeroHash() > 0)
                {
                    ServicioVerifactu.EncadenamientoFacturaAnteriorType anterior = new ServicioVerifactu.EncadenamientoFacturaAnteriorType();
                    huellaAnterior = huella.huellaAnterior();
                    anterior.FechaExpedicionFactura = huellaAnterior.FechaFactura;
                    anterior.IDEmisorFactura = huellaAnterior.IdEmisor;
                    anterior.NumSerieFactura = huellaAnterior.NumFactura;
                    anterior.Huella = huellaAnterior.Huella;
                    _huella = huellaAnterior.Huella;
                    cadenaFactura.Item = anterior;
                }
                else
                {
                    cadenaFactura.Item = ServicioVerifactu.PrimerRegistroCadenaType.S;
                }
                altaFactura.Encadenamiento = cadenaFactura;
                //ahora identificamos el software
                ServicioVerifactu.SistemaInformaticoType programaFacturacion = new ServicioVerifactu.SistemaInformaticoType();
                programaFacturacion.NombreSistemaInformatico = "Facturas Taller 2024";//nombre programa
                programaFacturacion.NombreRazon = "  ";
                programaFacturacion.Item = " ";
                programaFacturacion.Version = Program.version;
                programaFacturacion.IdSistemaInformatico = "A1";
                programaFacturacion.NumeroInstalacion = Program.numeroInstalacion;//numero de instalacion
                programaFacturacion.TipoUsoPosibleSoloVerifactu = ServicioVerifactu.SiNoType.S;//es verifactu
                programaFacturacion.TipoUsoPosibleMultiOT = ServicioVerifactu.SiNoType.N;//varias empresas a la vez
                programaFacturacion.IndicadorMultiplesOT = ServicioVerifactu.SiNoType.N;
                //ServicioVerifactu.PersonaFisicaJuridicaType[] Destinatarios = new ServicioVerifactu.PersonaFisicaJuridicaType[1];
                altaFactura.SistemaInformatico = programaFacturacion;//asignamos tipo systema
                altaFactura.TipoHuella = ServicioVerifactu.TipoHuellaType.Item01;//solo se admite un tipo
                var fechora = DateTime.Now;
                timeStamp = fechora.ToString("yyyy-MM-dd'T'HH:mm:ssK");
                altaFactura.FechaHoraHusoGenRegistro = timeStamp;// - new TimeSpan(0, 0, 0, 0, fechora.TimeOfDay.Milliseconds);

                //timeStamp = fechora.ToString("yyyy-MM-dd'T'HH:mm:ssK");
                altaFactura.Huella = huella.creaHuellaFactura(Program.configTaller.Nif, numFactura, fechaFactura.Text, tipoFactura, cuotas.ToString("F2").Replace(",", "."), total.ToString("F2").Replace(",", "."), _huella, timeStamp);//asignamos huella

                //registroFactura[1].Item = altaFactura;
                ServicioVerifactu.RegistroFacturaType[] fac = new ServicioVerifactu.RegistroFacturaType[1];
                //fac.Initialize();
                fac[0] = new ServicioVerifactu.RegistroFacturaType();
                fac[0].Item = altaFactura;
                facAPresentar.RegistroFactura = fac;

                //ServicioVerifactu.RegFactuSistemaFacturacionRequest envio = new ServicioVerifactu.RegFactuSistemaFacturacionRequest();
                //envio.RegFactuSistemaFacturacion = facAPresentar;
                /////////////////////////////  <--- Prueba de serializar la factura --->
                XmlSerializer serializaFactura = new XmlSerializer(typeof(ServicioVerifactu.RegFactuSistemaFacturacion));
                SoapAttributes soap = new SoapAttributes();

                string facXml = "";
                using (var xmlw = new StringWriter())
                {
                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.Indent = true;
                    settings.Encoding = Encoding.UTF8;

                    using (XmlWriter writter = XmlWriter.Create(xmlw, settings))
                    {
                        serializaFactura.Serialize(writter, facAPresentar);
                        facXml = xmlw.ToString();
                    }

                }

                System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

                RegFactuSistemaFacturacionResponse response = new ServicioVerifactu.RegFactuSistemaFacturacionResponse();
                // response.RespuestaRegFactuSistemaFacturacion = respuesta;
                ServicioVerifactu.RegFactuSistemaFacturacionRequest req = new ServicioVerifactu.RegFactuSistemaFacturacionRequest(facAPresentar);
                req.RegFactuSistemaFacturacion.Cabecera = cabecera;

                ServicioVerifactu.X509DataType x59 = new ServicioVerifactu.X509DataType();


                ServicioVerifactu.RSAKeyValueType key = new ServicioVerifactu.RSAKeyValueType();

                sfPortTypeVerifactuClient client = new ServicioVerifactu.sfPortTypeVerifactuClient(Program.enlaceVerifactu);
                System.ServiceModel.Description.ClientCredentials credenciales = new System.ServiceModel.Description.ClientCredentials();
                //client.ClientCredentials.UserName.UserName = Program.configTaller.Nif;
                client.ClientCredentials.ClientCertificate.Certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Program.certificado, Program.passcertificado);
                client.ClientCredentials.UseIdentityConfiguration = true;
                client.ClientCredentials.SupportInteractive = true;
                //client.ClientCredentials.ServiceCertificate.DefaultCertificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Program.certificado, Program.passcertificado);

                string test = "";
                //client.Open();
                RespuestaRegFactuSistemaFacturacionType retorno = new RespuestaRegFactuSistemaFacturacionType();
                try
                {
                    retorno = client.RegFactuSistemaFacturacion(facAPresentar);
                }


Recuerden al importar el webservice cambiar en reference System.DateTyme por string, hay un fallo al serializar la fecha , incluye milisegundos lo que da error, esta mas o menos explicado.
Simplemente han de cambiar de donde rellenar los campos, y por ejemplo si envian varios registros a la vez tenerlño en cuenta.

Muchas gracias compañero voy a ver si lo consigo poner en marcha. Es el plan "C" que tengo pensado si no lo consigo con el Delphi 2007 ni con el 2022.

bmfranky 23-10-2024 20:09:26

Forma de cambiar destinatario de una factura
 
Hola, segun esto, me cotesto a mi mismo
Cita:

  • Si se ha expedido una factura a nombre de un destinatario existente pero diferente de aquél para el que se realizó la correspondiente operación, deberá expedirse una factura rectificativa en la que constando el mismo destinatario se consignen con signo negativo las magnitudes de la misma.
    Además de lo anterior, se deberá expedir para el destinatario real de las operaciones una nueva factura ajustada a los datos y requisitos contenidos en el artículo 6 del Reglamento de Facturación, factura que no tendrá la consideración de factura rectificativa.
  • Si por el contrario en la factura originalmente expedida se ha cometido un error distinto del anterior en la identificación del destinatario real, por ejemplo, una incompleta denominación del nombre o razón social del destinatario, deberá expedirse una factura rectificativa que subsane, de forma clara e inteligible, el error cometido.

La operativa correcta es emitir una factura rectificativa "R1" , con todas las cantidades en negativo, a nombre del anterior destinatario Con numero de serie diferente ,asignado a las rectificativas, que es la que imprimo como prueba de la anulacion, creando un registro de sustitucion y a la vez, creo una factura ordinaria "F1", consignando los datos del destinatario correcto,que es la que imprimo y le doy al destinatario, creando un nuevo registro de alta, encadeno y envio los 2 registros.

1-> Emito una factura R1 FacR001, con las cantidades en negativo , genero mi factura A serie Rectificativa, que imprimo para el cliente anterior generando un registro de Rectificacion Bn4 con los datos de la factura Fac001, encadenado con el registro anterior sea cual sea (por claridad Bn3)

2-> Emito una factura F1 Fac002 con los datos ya correctos con serie de facturas normales ,para enviar al cliente correcto generando un registro de alta, Bn5 con los datos de la factura Fac002, encadenado con Bn4.



Gracias de todas formas por tu interes @ermendalenda^\||/

sglorka 23-10-2024 20:36:46

Cita:

Empezado por bmfranky (Mensaje 558672)
Hola, segun esto, me cotesto a mi mismo

La operativa correcta es emitir una factura rectificativa "R1" , con todas las cantidades en negativo, a nombre del anterior destinatario Con numero de serie diferente ,asignado a las rectificativas, que es la que imprimo como prueba de la anulacion, creando un registro de sustitucion y a la vez, creo una factura ordinaria "F1", consignando los datos del destinatario correcto,que es la que imprimo y le doy al destinatario, creando un nuevo registro de alta, encadeno y envio los 2 registros.

1-> Emito una factura R1 FacR001, con las cantidades en negativo , genero mi factura A serie Rectificativa, que imprimo para el cliente anterior generando un registro de Rectificacion Bn4 con los datos de la factura Fac001, encadenado con el registro anterior sea cual sea (por claridad Bn3)

2-> Emito una factura F1 Fac002 con los datos ya correctos con serie de facturas normales ,para enviar al cliente correcto generando un registro de alta, Bn5 con los datos de la factura Fac002, encadenado con Bn4.



Gracias de todas formas por tu interes @ermendalenda^\||/

Este punto al que te refieres
"Si se ha expedido una factura a nombre de un destinatario existente pero diferente de aquél para el que se realizó la correspondiente operación, deberá expedirse una factura rectificativa en la que constando el mismo destinatario se consignen con signo negativo las magnitudes de la misma." ...
puede ser incorrecto, ya que sólo tendrán consideración de rectificativas ( apartado 6 del artículo 15) la facturas que se expidan por alguna de las causas previstas en los apartados 1 y 2 del artículo 15 del reglamento de facturación (Real Decreto 1619/2012). En ningún caso, errar en el destinatario de la operación ( no en algún dato descriptivo del mismo) de forma que no era la persona a la que iba dirigida la factura, se contempla en dichos apartados. Para estos casos, existe la factura de abono (factura normal en negativo).

Yo barajaría dos opciones
1.- Anular la factura mediante un registro de anulación y emitir una nueva factura al cliente correcto
2.- Emitir una factura de abono en negativo al cliente incorrecto y otra factura normal con el cliente correcto

Yo elegiría la primera ,ya que de esta forma, el cliente que erramos no se entera de nada. Si eliges la segunda, debes enviar las dos facturas ( Factura errónea y Abono ) al cliente para que las declare como recibidas y se puedean conciliar ante un hipotético cruce de hacienda

bmfranky 23-10-2024 20:44:59

Cita:

Empezado por sglorka (Mensaje 558673)
Este punto al que te refieres
"Si se ha expedido una factura a nombre de un destinatario existente pero diferente de aquél para el que se realizó la correspondiente operación, deberá expedirse una factura rectificativa en la que constando el mismo destinatario se consignen con signo negativo las magnitudes de la misma." ...
puede ser incorrecto, ya que sólo tendrán consideración de rectificativas ( apartado 6 del artículo 15) la facturas que se expidan por alguna de las causas previstas en los apartados 1 y 2 del artículo 15 del reglamento de facturación (Real Decreto 1619/2012). En ningún caso, errar en el destinatario de la operación ( no en algún dato descriptivo del mismo) de forma que no era la persona a la que iba dirigida la factura, se contempla en dichos apartados. Para estos casos, existe la factura de abono (factura normal en negativo).

Yo barajaría dos opciones
1.- Anular la factura mediante un registro de anulación y emitir una nueva factura al cliente correcto
2.- Emitir una factura de abono en negativo al cliente incorrecto y otra factura normal con el cliente correcto

Yo elegiría la primera ,ya que de esta forma, el cliente que erramos no se entera de nada. Si eliges la segunda, debes enviar las dos facturas ( Factura errónea y Abono ) al cliente para que las declare como recibidas y se puedean conciliar ante un hipotético cruce de hacienda

Gracias por la sujerencia, el planteamiento es porque me ha pasado que al enviar la factura al cliente, ha cambiado la empresa, o uno que tuve que queria que le facturara a una empresa o otra segun le venia bien,la cuestion es poder anularla y tener un registro fisico, la factura rectificativa en este caso , por si al ceporro se le ocurre presentar las 2.

Entonces si anulo directamente la factura ,no he de darle nada al cliente?
Otra cosa, la factura erronea , tampoco la tengo que pasar a la gestoria?, que genero para que la gestora la elimine, porque en la aeat, el registrovale, pero para la gestoria que hago una factura en negativo?

bmfranky 23-10-2024 21:01:30

Pues con este es el 3 sitio donde consulto y dice lo mismo.
Cita:

Un contribuyente ha expedido una factura y posteriormente ha detectado un error en el destinatario de dicha factura y desea conocer si tiene obligación de emitir factura rectificativa.
Pues bien, sólo existe obligación de expedir una factura rectificativa en los supuestos expresamente contemplados en el art. 15 del RD 1619/2012 (Obligaciones de facturación). En particular, y en lo que se refiere al caso que nos ocupa, entre las causas que motivan la expedición obligatoria de una factura rectificativa se comprende la consignación de un nuevo destinatario de la factura cuando se incurrió en un error. Así, es causa de rectificación de las facturas la consignación errónea de cualquier dato o requisito obligatorio que se consigne en las mismas, como pudiera ser el caso de los datos de identificación del destinatario. Por tanto, en caso de que se haya consignado de manera incorrecta la identificación del destinatario de la factura, el contribuyente deberá expedir una factura rectificativa que deberá constar en serie específica de factura.
Dicho esto, la existencia de causas tasadas, que motivan la obligación de expedir una factura rectificativa, no impide que voluntariamente se puedan rectificar las facturas previamente expedidas, cuando se trate de una causa justificada y siempre que dicha práctica permita garantizar la correspondiente comprobación por parte de la Administración tributaria, si bien, en estos casos de modificación voluntaria de una factura previamente expedida no se estará ante la expedición de una factura rectificativa, en los términos y con los requisitos contenidos en el art. 15 del RD 1619/2012 (Obligaciones de facturación), pues de acuerdo con el apdo. 6 del mencionado precepto, sólo las facturas que deban ser objeto de rectificación obligatoria por las causas previstas en los apdos. 1 y 2 del mencionado art. 15, son las que tienen la consideración de facturas rectificativas.
Por tanto, en el supuesto de que no concurran las causas de rectificación obligatoria de una factura, contenidas en los apdos. 1 y 2 del art. 15 del mencionado RD 1619/2012 (Obligaciones de facturación), como podía suceder en casos en los que se expida una factura erróneamente por una operación que nunca llegó a realizarse, y procede su anulación, se está ante un supuesto de sustitución de aquélla factura por otra que la anula, que en ningún caso tendrá el carácter de factura rectificativa.

[email protected] 23-10-2024 21:35:28

Consultar factura por el codigo QR
 
Estoy leyendo el QR de una factura que previamente ya se ha enviado y aceptado como REGISTRO CORRCTO.

Porque al consultar el QR me dice que NO EXISTE DICHA FACTURA

????

jlsilver 23-10-2024 21:53:18

Hola:

Estoy integrando facturas en la AEAT por veri*factu mediante las clases generadas por la importación del WSDL en delphi,
me encuentro con las siguientes incidencias/problemas que quisiera saber si alguien más le sucede:

1.Cuando envío más de 8 facturas en un bloque me devuelve el siguiente error, esto no sucede si los bloques son de 8 o menos facturas:

Se requiere un certificado para completar la autenticación de cliente - :htt p://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP - SOAPAction:""

2.Envio una factura simplificada (SIN NIF) y me la acepta sin problema, a continuación intento enviar otra factura y me devuelve
el siguiente error:

Incorrecto - 1123 - Error en el bloque de Encadenamiento.. El formato del NIF es incorrecto.. NIF:. - 60

3.Genero las facturas mediante QuickReport, en una factura con varias páginas, y el cálculo de totales lo realizo a la vez que se genera la factura.
¿Como puedo generar el QR en la cabecera de la factura (se necesita el total de la factura entre otros datos)
si el total lo conozco al finalizar la última página?

¿Se tendría que calcular primero el importe de todas las facturas y luego imprimir?

ermendalenda 23-10-2024 22:18:18

Cita:

Empezado por bmfranky (Mensaje 558675)
Pues con este es el 3 sitio donde consulto y dice lo mismo.

Hola, ten en cuenta que en 2012 no estaba previsto verifactu y el registro de anulación, si estas hablando de un supuesto de que la factura no se ha entregadompuedes hacer el registro de anulación directamente y volver a emitir la correcta ya que no se ha realizado una operación al cliente que se ha emitido.
Es fácil de saber cuál es la opción a elegir en cada cada si tienes en cuenta un par de cosas:
1-la factura emitida no se ha entregado a ningún cliente o al cliente que se le ha entregado no tiene que ver con los datos que nos dijo : ANULACION y remisión nieva factura correctamente.
2-la factura se ha entregado al cliente con algún error o el cliente ha decidido cambiar los datos RECTIFICATIVA POR SUSTITUTUCION

Pero si tienes el programa preparado para facturas rectificativas por sustitución, no dudes en usar siempre esa opción para las modifiaciones del cliente

bmfranky 23-10-2024 22:23:31

Cita:

Empezado por jlsilver (Mensaje 558678)
Hola:

Estoy integrando facturas en la AEAT por veri*factu mediante las clases generadas por la importación del WSDL en delphi,
me encuentro con las siguientes incidencias/problemas que quisiera saber si alguien más le sucede:

1.Cuando envío más de 8 facturas en un bloque me devuelve el siguiente error, esto no sucede si los bloques son de 8 o menos facturas:

Se requiere un certificado para completar la autenticación de cliente - :htt p://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP - SOAPAction:""

2.Envio una factura simplificada (SIN NIF) y me la acepta sin problema, a continuación intento enviar otra factura y me devuelve
el siguiente error:

Incorrecto - 1123 - Error en el bloque de Encadenamiento.. El formato del NIF es incorrecto.. NIF:. - 60

3.Genero las facturas mediante QuickReport, en una factura con varias páginas, y el cálculo de totales lo realizo a la vez que se genera la factura.
¿Como puedo generar el QR en la cabecera de la factura (se necesita el total de la factura entre otros datos)
si el total lo conozco al finalizar la última página?

¿Se tendría que calcular primero el importe de todas las facturas y luego imprimir?

Hola, le recomiendo que realice los calculos antes de la impresion, preferiblemente mientras ser introducen los datos de la factura o que genere el Qreport y antes de visualizarlo asigne los datos del qr.
Tambien puede asignar en qreport que se origine la primera hoja al final del reporte.

Puede publicar la parte del codigo en la que asigna los datos de encadenamiento que genera este error?
Cita:

2.Envio una factura simplificada (SIN NIF) y me la acepta sin problema, a continuación intento enviar otra factura y me devuelve
el siguiente error:

Incorrecto - 1123 - Error en el bloque de Encadenamiento.. El formato del NIF es incorrecto.. NIF:. - 60
Porque para el encadenamiento siguiente no implica el nif anterior.

bmfranky 24-10-2024 00:27:20

Cita:

Empezado por ermendalenda (Mensaje 558680)
Hola, ten en cuenta que en 2012 no estaba previsto verifactu y el registro de anulación, si estas hablando de un supuesto de que la factura no se ha entregadompuedes hacer el registro de anulación directamente y volver a emitir la correcta ya que no se ha realizado una operación al cliente que se ha emitido.
Es fácil de saber cuál es la opción a elegir en cada cada si tienes en cuenta un par de cosas:
1-la factura emitida no se ha entregado a ningún cliente o al cliente que se le ha entregado no tiene que ver con los datos que nos dijo : ANULACION y remisión nieva factura correctamente.
2-la factura se ha entregado al cliente con algún error o el cliente ha decidido cambiar los datos RECTIFICATIVA POR SUSTITUTUCION

Pero si tienes el programa preparado para facturas rectificativas por sustitución, no dudes en usar siempre esa opción para las modifiaciones del cliente

Hola, gracias por su respuesta, pero lo que no me queda claro es , que pasa con la factura anulada Fac1-00012, porque si no se la llevo a la gestoria, me llama la atencion porque me falta, o la reimprimo con un texto cruzado que indique anulada y se lallevo asi, porque aunque este anulada, no podria reutilizar ese numero de factura, verdad?

ermendalenda 24-10-2024 00:34:31

Cita:

Empezado por bmfranky (Mensaje 558684)
Hola, gracias por su respuesta, pero lo que no me queda claro es , que pasa con la factura anulada Fac1-00012, porque si no se la llevo a la gestoria, me llama la atencion porque me falta, o la reimprimo con un texto cruzado que indique anulada y se lallevo asi, porque aunque este anulada, no podria reutilizar ese numero de factura, verdad?

Sí, se la puedes dejar al gestor como anulada.
Si hacen un requerimiento que lo tenga todo.

bmfranky 24-10-2024 00:36:54

Cita:

Empezado por ermendalenda (Mensaje 558685)
Sí, se la puedes dejar al gestor como anulada.
Si hacen un requerimiento que lo tenga todo.

Gracias , eso es lo que me faltava, simplemente , anulo la primera, reimprimo la factura como anulada y doy de alta la nueva, mañana me pongo a ello, Muchas gracias, de verdad.

sglorka 24-10-2024 01:18:46

Cita:

Empezado por bmfranky (Mensaje 558675)
Pues con este es el 3 sitio donde consulto y dice lo mismo.

La consulta vinculante a la que haces referencia es la (DGT, de 26-10-2022, V2245/2022) hace referencia a una operación que sí se realizó y por tanto, como hay un error en el destinatario, procedes a rectificarla emitiendo rectificativa en negativo y nueva factura con los nuevos datos del destinatario, aunque fuera otro distinto del inicial.
Cuando haces una factura y te equivocas de destinatario, teniendo todos sus datos correctos, la operación nunca llegó a realizarse con dicho destinanatario, por tanto, queda fuera de los casos de rectificación y como te indica en dicha consulta, una operación que nunca llegó a realizarse se debe anular con una factura de abono

ermendalenda 24-10-2024 07:33:25

Huella Anterior
 
Hola, podeis por favor cambiar la huella anterior (SOLO EL HASH), y enviar el siguiente (pero que incluya la huella anterior falsa),
No entiendo que todos estais diciendo que ya controlan el registro anterior, pero yo cambio la huella del anterior (despues de enviarla) y al enviar el siguiente con la huella anterior cambiada me da correcto.

bmfranky 24-10-2024 08:09:31

Por acabar de entenderlo.
 
Cita:

Empezado por sglorka (Mensaje 558687)
La consulta vinculante a la que haces referencia es la (DGT, de 26-10-2022, V2245/2022) hace referencia a una operación que sí se realizó y por tanto, como hay un error en el destinatario, procedes a rectificarla emitiendo rectificativa en negativo y nueva factura con los nuevos datos del destinatario, aunque fuera otro distinto del inicial.
Cuando haces una factura y te equivocas de destinatario, teniendo todos sus datos correctos, la operación nunca llegó a realizarse con dicho destinanatario, por tanto, queda fuera de los casos de rectificación y como te indica en dicha consulta, una operación que nunca llegó a realizarse se debe anular con una factura de abono

Hola, gracias por la respuesta, entonces por simplificar.
Si la factura la realizo despues de por ejemplo haber reparado el coche, rectificativa, en negativo.
Pero si es por ejemplo antes de entregar un material que me han pedido, factura de abono, verdad.

CarlosArjonomia 24-10-2024 08:26:04

Cita:

Empezado por ermendalenda (Mensaje 558690)
Hola, podeis por favor cambiar la huella anterior (SOLO EL HASH), y enviar el siguiente (pero que incluya la huella anterior falsa),
No entiendo que todos estais diciendo que ya controlan el registro anterior, pero yo cambio la huella del anterior (despues de enviarla) y al enviar el siguiente con la huella anterior cambiada me da correcto.

Solo controlan que la huella cumpla la regla de negocio, que sea UNA huella válida. No que sea LA huella válida.

Es normal, ya que esto nos facilita mucho el desarrollo. Imagina no poder pasar a la siguiente fase porque te atascas en el encadenamiento de las huellas. Más adelante activarán el control entiendo.

Neftali [Germán.Estévez] 24-10-2024 08:52:52

Cita:

Empezado por [email protected] (Mensaje 558676)
Estoy leyendo el QR de una factura que previamente ya se ha enviado y aceptado como REGISTRO CORRCTO.
Porque al consultar el QR me dice que NO EXISTE DICHA FACTURA????

La respuesta más lógica es que estés calculando mal el QR (la URL a consultar).
Deberías dar más datos de cómo lo calculas y a partir de qué datos. Sin eso es imposible ayudarte más.

ermendalenda 24-10-2024 09:03:00

Cita:

Empezado por CarlosArjonomia (Mensaje 558692)
Solo controlan que la huella cumpla la regla de negocio, que sea UNA huella válida. No que sea LA huella válida.

Es normal, ya que esto nos facilita mucho el desarrollo. Imagina no poder pasar a la siguiente fase porque te atascas en el encadenamiento de las huellas. Más adelante activarán el control entiendo.

No se Puede comprobar el hash de la huella anterior si no se comprueba con los datos del hash anterior.
Los hashses no tienen dígito de control ni letra de control ni nada en su contenido ni nada parecido para poder verificar si es correcto, la única forma de verificarlo es compararlo con el correcto,
Y peor aun, modifico un solo carácter del hash en el último registro enviado(despues de enviar) y en el siguiente registro (nodo registro anterior) incluyo el hash malo.
Y Dan como aceptado
Entonces mi duda es, esa prueba la habéis hecho?

CarlosArjonomia 24-10-2024 09:14:38

Cita:

Empezado por ermendalenda (Mensaje 558697)
No se Puede comprobar el hash de la huella anterior si no se comprueba con los datos del hash anterior.
Los hashses no tienen dígito de control ni letra de control ni nada en su contenido ni nada parecido para poder verificar si es correcto, la única forma de verificarlo es compararlo con el correcto,
Y peor aun, modifico un solo carácter del hash en el último registro enviado(despues de enviar) y en el siguiente registro (nodo registro anterior) incluyo el hash malo.
Y Dan como aceptado
Entonces mi duda es, esa prueba la habéis hecho?

Prueba enviando "xxx" y te dará como parcialmente aceptado con error el el cálculo del HASH.

Error:La longitud de huella del registro anterior no cumple con las especificaciones.

sglorka 24-10-2024 09:19:54

Cita:

Empezado por bmfranky (Mensaje 558691)
Hola, gracias por la respuesta, entonces por simplificar.
Si la factura la realizo despues de por ejemplo haber reparado el coche, rectificativa, en negativo.
Pero si es por ejemplo antes de entregar un material que me han pedido, factura de abono, verdad.

Es un buen resumen

Neftali [Germán.Estévez] 24-10-2024 09:55:48

Cita:

Empezado por jlsilver (Mensaje 558678)
1.Cuando envío más de 8 facturas en un bloque me devuelve el siguiente error, esto no sucede si los bloques son de 8 o menos facturas:
Se requiere un certificado para completar la autenticación de cliente - :htt p://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP - SOAPAction:""


¿Cómo estás incluyendo el certificado en el envío?
¿Si envías sólo 1 factura no te da ese error?


Cita:

Empezado por jlsilver (Mensaje 558678)
3.Genero las facturas mediante QuickReport, en una factura con varias páginas, y el cálculo de totales lo realizo a la vez que se genera la factura.
¿Como puedo generar el QR en la cabecera de la factura (se necesita el total de la factura entre otros datos)
si el total lo conozco al finalizar la última página?
¿Se tendría que calcular primero el importe de todas las facturas y luego imprimir?


Yo creo que lo ideal es que el total esté calculado y almacenado previamente con los datos de la factura.
¿Si lo generas al imprimir, significa que no lo tienes guardado en tu Base de Datos?
Si es así, podría pasar que 2 impresiones diferentes de una misma factura en diferentes momentos cambiaran el total.

Becario127 24-10-2024 10:05:54

Hola buenos dias

Preguntaba como funciona el encadenamiento de facturas puedo enviarlas todas por esta URL?:prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP
Y hay alguna URL para pruebas en vez de tener que usar la URL de produccion?

Muchas gracias

antoine0 24-10-2024 10:06:34

Cita:

Empezado por sglorka (Mensaje 558669)
Bueno esta situación, en teoría, no podría darse, y no me refiero a que se caiga el sistema, me refiero a esta suposición que haces "se recupera el sistema, en la base la cadena tiene entonces A12 como última (el SIF no sabe nada de A13)". Si en el paso anterior has podido enviar A13 y la ha aceptado la Aeat, es por que la tienes registrada en tu sistema, que luego no te enteres de la respuesta porque el sistema se haya caido no es problema porque volverías a enviar A13 (se supone que tu algoritmo la tiene marcada como no enviada) y te daría registro duplicado en la Aeat y aquí no ha pasado nada.

Disculpa que no he sido lo suficientemente claro. No estoy hablando de un sistema teórico, sino de un sistema que ha caído. Por tanto el sistema después de la recuperación no sabe si se ha enviado el A13malo o ni siquiera que existe este A13malo. Pensar por ejemplo que se ha recuperado desde un backup cogido después de la emisión de A12.

Cita:

En mi cabeza no cabe que un registro que se envía a la Aeat no esté almacenado en el Sif. El código que se desarrolle para tal cometido, al menos, debe asegurar este punto.
Aquí exactamente está mi punto. En teoría, el sistema debe pasar sucesivamente por todos los estados creación_número_factura - registro_creado_y_encadenado - enviado - recibido_AR, sin salto, siendo cada operación monotónica (procesando los registros en orden estricto). Y estoy de acuerdo contigo que el código debe absolutamente seguir este guion y asegurarlo (sé que hay una duda sobre la existencia del primer guion).
Pero en la práctica pasan cosas inesperadas y los sistemas pueden caer. Y luego arrancan desde un punto de recuperación anterior a la caída.
A veces, en situación perfecta, cada guion en mi esquema anterior siendo un punto de recuperación, se restaura desde el último guion anterior a la caída, y llegamos al esquema que propones.
Pero a veces en una caída, debes recular de uno o varios puntos de recuperación, por circunstancias; y aquí tienes la oportunidad de tener una situación, observada desde el exterior, como la que he dibujado.


La franja horaria es GMT +2. Ahora son las 08:43:00.

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