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)

edari 17-10-2024 20:47:19

Cita:

Empezado por jguarda (Mensaje 558335)
He buscado donde presentar la declaración responsable para comenzar a hacer pruebas, no he consguido encontrar donde entregar esto, alguien sabe donde se hace ?

Que yo sepa la declaración responsable no hace falta para hacer pruebas

antoine0 17-10-2024 21:55:33

Cita:

Empezado por edari (Mensaje 558336)
Y en caso que esté caído su servidor, qué pasa con el husohorario que generamos en el envío fallido?

¿Dónde está el problema?
Si no sabes en qué huso horario estas o qué hora es porque se ha caído un servidor de tu entorno que normalmente te suministra la información, o la máquina que ha facturado no se recuerda de dónde está (GPS offline) o una cosa similar, entonces generas el hora de tu sistema (que se supone estará dentro de los márgenes) y lo apuntas el huso horario Z (GMT) o el huso local de tu sistema, dependiendo de si recuperas la hora UTc o la hora local, y la AEAT debe ser contenta (¡por eso sirven los husos horarios!)

La AEAT compara las fechas-horas en la escala UTc, es decir independientemente de los husos horarios y de su efecto sobre las horas «locales».
Es por esto que al principio algunos tenían problemas con las horas, no indicaban el huso correspondiente con la hora que suministraban por tanto había un descuadre.
Pero si conservas juntas la información de la hora y del huso horario en el cual se lee esta hora, no habrá problema.

Ejemplo práctico: dentro de semana y media vamos a dormir una hora más por el fin del horario de verano. Entonces después de las 02:59:59 serán las 02:00:00 (en la península). Pero no es ningún problema si se conserva los husos horarios: después de las 02:59:59+02:00 serán las 02:00:00+01:00. Y es univoco. En horario UTc (él que usa la AEAT y nuestro ordenadores internamente), los relojes pasan de 00:59:59Z a 01:00:00Z; lógico y sin problema.

unomasmas 17-10-2024 22:47:48

Cita:

Empezado por sglorka (Mensaje 558224)
El método que utilizas para iniciar una factura o tique es el que siempre se ha hecho, no había necesidad de encadenamiento y por tanto, podías iniciar y terminar el proceso en cualquier momento. Con la entrada de Verifactu, debes cambiar por completo esa filosofía porque ese caso que comentas, puede ocurrir en cualquier software donde exista concurrencia entre los usuarios a la hora de emitir facturas.

La idea es iniciar el proceso de facturación utilizando un contador auxiliar que no es el de factura o tique, por ejemplo, comenzar con una nota de entrega (albarán), ambos usuarios inician el proceso de venta con el contador de notas de entrega (cada uno con su número obtenido), el primero inicia la venta con 2 ítems y posteriormente, aparca el documento porque el cliente no le pasa la tarjeta, el segundo usuario termina su documento y solicita un número de factura bloqueando el contador de facturas para que sólo él pueda obtener un número, si el primer usuario recupera el documento aparcado y quiere emitir la factura en ese mismo momento, se encontrará con el contador bloqueado y tendrá que esperar. Desde que obtiene el número de factura el segundo usuario, genera el registro de facturación xml y desbloquea el contador. Ahora, el primer usuario podrá emitir su factura realizando el mismo proceso.

El proceso de bloqueo es muy rápido, ya que sólo requiere obtener el siguiente número de factura, asignárselo al documento que quiere emitir y generar el Xml con su fecha de creación, la del momento de generación del xml, no del inicio del proceso de venta.

No hay otra manera de asegurar la emisión de facturas en orden cronológico de número y fecha y además, asegurar el encadenamiento con el registro anterior. Al utilizar este contador de notas de entrega aseguras, por ejemplo, desechar el documento en caso de que te hayas equivocado, emitir un albarán en vez de una factura, porque el cliente era un cliente de resumen mensual de albaranes y no te habías percatado, aparcar operaciones como se hace en hostelería cuando gestionas mesas, emitir una factura completa porque el cliente antes de pagar te dice que quiere sus datos en ella, etc..

Muchas gracias por responder y especialmente, por lo detallada que es la respuesta :-)

Cita:

Empezado por rci (Mensaje 558222)
En nuestro caso, el numero de factura no se asigna hasta justo en el momento de guardar, así que el primer tpv que salva la factura coge el contador le toca. el número no se asigna al iniciar la venta.

Cita:

Empezado por pablog2k (Mensaje 558225)
justo esto iba a comentar, nosotros hacemos igual, hasta que la factura/ticket no está 'finalizada', no se le asigna el número

Muchas gracias por vuestra respuesta. A cambiar el planteamiento...

unomasmas 17-10-2024 23:03:31

Cita:

Empezado por bmfranky (Mensaje 558247)
Hola, una pregunta , como comente en su dia yo usaba un cliente ficticio llamado cliente contado y cif 9999999X, como ya sabemos ahora eso no se puede(Vale antes tampoco, pero colaba), mi pregunta es, en una factura "Normal" en la que no incluya datos del cliente, a saber en nombre pondria cliente contado, sin mas datos, pero el resto igual.


Seria tipo "F1" y marcaria FacturaSimplificadaArt7273 = S
o
Seria tipo "F2" y marcaria FacturaSinIdentifDestinatarioArt61d =S

O me estoy haciendola picha un lio.
Gracias por vuestras respuestas.

Yo creo que la opción b:
Seria tipo "F2" y marcaria FacturaSinIdentifDestinatarioArt61d=S

unomasmas 17-10-2024 23:13:01

Cita:

Empezado por bmfranky (Mensaje 558251)
Empezado por delphiGar Ver Mensaje
Hola sglorka, el primer caso es correcto, es decir:

se pueden emitir Facturas completas y Facturas Simplificadas cualificadas (con identificación de destinatario) y ambas se informan con la clave F1, sólo en caso de factura simplificada cualificada se marca la opción FacturaSimplificadaArt7273=S

pero en el segundo caso, tanto la factura simplicada no cualificada como la factura ordinaria sin identificar se informan con la clave F2, pero para el caso de la factura ordinaria sin identificar se pone la clave FacturaSinIdentifDestinatarioArt61d a S.

Lo de Factura ordinaria sin identificar es porque se utiliza un identificador que no lo recoge la AEAT, por ejemplo un pasaporte o un documento de identificacion de otro pais. En este caso en destinatario habria que poner el IDOtro en vez del NIF.

Creo que ya lo tengo, seria tipo factura "F2" sin marcar nada, es que no encontraba esta aclaracion, gracias @delphigar

Parece (al menos, yo entiendo) que delphiGar dice que la factura ordinaria sin identificar se usa para un cliente extranjero (con pasaporte u otro documento de identificación) y añade que habría que poner el IDOtro, pero me parece que no es compatible: si señalas la etiqueta FacturaSinIdentifDestinatarioArt61d=S te obliga a que el tipo de factura sea "F2" ¿No? y con este tipo de factura no se puede dar ningún dato del bloque de Destinatarios...

Resulta el error 1190:
<tikR:CodigoErrorRegistro>1190</tikR:CodigoErrorRegistro>
<tikR:DescripcionErrorRegistro>Si TipoFactura es F2 o R5 el bloque Destinatarios no puede estar cumplimentado.</tikR:DescripcionErrorRegistro>

unomasmas 17-10-2024 23:50:19

Cita:

Empezado por Jesusggc (Mensaje 558331)
...He puesto consulta a verifactu, y contestan lo siguiente:
Otra cuestión a tener en cuenta, es que está previsto que los sistemas informáticos de facturación, tengan indisponibilidades como cortes de luz, falta de conexión, fallos en el sistema , etc. y se pueda superar el tiempo establecido...En esos casos deben activar el campo "Incidencia" (ver diseño de registro, hoja "1)DR Remisión Alta-Anul.VF-Req.") para que no les aparezca dicho error

Me preocupa esto. ¿Habéis pensado cómo implementar la posibilidad de señalar el campo "Incidencia"? Se supone que el proceso debe ser lo más automatizado posible, por lo que no veo una buena solución la intervención humana; principalmente porque el usuario típico no se va a parar a pensar en procedimientos extraordinarios...

edari 18-10-2024 08:05:13

Cita:

Empezado por antoine0 (Mensaje 558341)
¿Dónde está el problema?
Si no sabes en qué huso horario estas o qué hora es porque se ha caído un servidor de tu entorno que normalmente te suministra la información, o la máquina que ha facturado no se recuerda de dónde está (GPS offline) o una cosa similar, entonces generas el hora de tu sistema (que se supone estará dentro de los márgenes) y lo apuntas el huso horario Z (GMT) o el huso local de tu sistema, dependiendo de si recuperas la hora UTc o la hora local, y la AEAT debe ser contenta (¡por eso sirven los husos horarios!)

La AEAT compara las fechas-horas en la escala UTc, es decir independientemente de los husos horarios y de su efecto sobre las horas «locales».
Es por esto que al principio algunos tenían problemas con las horas, no indicaban el huso correspondiente con la hora que suministraban por tanto había un descuadre.
Pero si conservas juntas la información de la hora y del huso horario en el cual se lee esta hora, no habrá problema.

Ejemplo práctico: dentro de semana y media vamos a dormir una hora más por el fin del horario de verano. Entonces después de las 02:59:59 serán las 02:00:00 (en la península). Pero no es ningún problema si se conserva los husos horarios: después de las 02:59:59+02:00 serán las 02:00:00+01:00. Y es univoco. En horario UTc (él que usa la AEAT y nuestro ordenadores internamente), los relojes pasan de 00:59:59Z a 01:00:00Z; lógico y sin problema.


En realidad me refería a la etiqueta FechaHoraHusoGenRegistro que mandamos en el fichero con la fecha de creación y que ya he podido comprobar en mis propias pruebas que si no cumple el margen de tiempo que estás obligado te devuelve el error

<tikR:CodigoErrorRegistro>2004</tikR:CodigoErrorRegistro>
<tikR:DescripcionErrorRegistro>El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos.</tikR:DescripcionErrorRegistro>

Mi duda en que si yo genero este valor a las 9:00 de hoy según estoy haciendo el envío y su servidor está out media hora, cuando vuelva a subir el fichero me dará este error o que se supone que habrá que hacer

A eso iba





bmfranky 18-10-2024 09:03:38

Cita:

Empezado por edari (Mensaje 558347)
En realidad me refería a la etiqueta FechaHoraHusoGenRegistro que mandamos en el fichero con la fecha de creación y que ya he podido comprobar en mis propias pruebas que si no cumple el margen de tiempo que estás obligado te devuelve el error

<tikR:CodigoErrorRegistro>2004</tikR:CodigoErrorRegistro>
<tikR:DescripcionErrorRegistro>El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos.</tikR:DescripcionErrorRegistro>

Mi duda en que si yo genero este valor a las 9:00 de hoy según estoy haciendo el envío y su servidor está out media hora, cuando vuelva a subir el fichero me dará este error o que se supone que habrá que hacer

A eso iba


Cita:

Cita:
Buenas tardes:
Este es un error de los denominados admisibles (ver documento de validaciones, apartado "4.3 Tratamiento de los errores admisibles ") y debido a ello se admitirá el registro. Este error en concreto, se excepciona de la necesidad de ser subsanado por lo que necesitarían realizar ninguna subsanación posteriormente.
Otra cuestión a tener en cuenta, es que está previsto que los sistemas informáticos de facturación, tengan indisponibilidades como cortes de luz, falta de conexión, fallos en el sistema , etc. y se pueda superar el tiempo establecido...En esos casos deben activar el campo "Incidencia" (ver diseño de registro, hoja "1)DR Remisión Alta-Anul.VF-Req.") para que no les aparezca dicho error


Hola, como indicaban en un post anterior, la administracion ya lo ha tenido en cuenta, simplemente se ha de indicar incidencia al realizar el envio, la forma de acerlo seria variada , por ejemplo, crear una lista de registros, en la añadir encadenadamente los registros generados, cuando no hay conexion, y en el momento de volver a tenerla, simplemente reenviar la lista completa marcando le check de incidencia, o como lo hare yo, en mi caso personal, no dejando abanzar hasta poder enviar el registro, aplicando un temporizador , reintente el envio x veces, si en esas veces no lo consigo, archivare el alta, sin dejar facturar hasta que se restablezca la conexion.

Pensandolo mejor , como hasta que no tengo la confirmacion de que ha llegado bien la consulta, no guardo nada en la base de datos, ni modifico el contador de facturas, voy a emitir un mensaje con un temporizador que me indique la incidencia y que vuelva a intentar el envio en por ejemplo 60" , si veo que sigue sin funcionar, guardare la factura como proforma, para volver a intentarlo mas tarde, sin perder todo el progreso de generacion de la misma, estamos hablando de que no podemos comunicar con la administracion, no es el mismo caso que el vuestro , yo no tengo que garantizar el poder continuar enviando / entregando facturas al cliente, perfectamente puedo cobrarle una proforma y enviarle la copia de la factura en otro momento.

edari 18-10-2024 09:34:10

Cita:

Empezado por bmfranky (Mensaje 558349)
Hola, como indicaban en un post anterior, la administracion ya lo ha tenido en cuenta, simplemente se ha de indicar incidencia al realizar el envio, la forma de acerlo seria variada , por ejemplo, crear una lista de registros, en la añadir encadenadamente los registros generados, cuando no hay conexion, y en el momento de volver a tenerla, simplemente reenviar la lista completa marcando le check de incidencia, o como lo hare yo, en mi caso personal, no dejando abanzar hasta poder enviar el registro, aplicando un temporizador , reintente el envio x veces, si en esas veces no lo consigo, archivare el alta, sin dejar facturar hasta que se restablezca la conexion.

Pensandolo mejor , como hasta que no tengo la confirmacion de que ha llegado bien la consulta, no guardo nada en la base de datos, ni modifico el contador de facturas, voy a emitir un mensaje con un temporizador que me indique la incidencia y que vuelva a intentar el envio en por ejemplo 60" , si veo que sigue sin funcionar, guardare la factura como proforma, para volver a intentarlo mas tarde, sin perder todo el progreso de generacion de la misma, estamos hablando de que no podemos comunicar con la administracion, no es el mismo caso que el vuestro , yo no tengo que garantizar el poder continuar enviando / entregando facturas al cliente, perfectamente puedo cobrarle una proforma y enviarle la copia de la factura en otro momento.


Aclarado, muchas gracias ^\||/

novatico 18-10-2024 09:41:06

Cita:

Empezado por unomasmas (Mensaje 558345)
Me preocupa esto. ¿Habéis pensado cómo implementar la posibilidad de señalar el campo "Incidencia"? Se supone que el proceso debe ser lo más automatizado posible, por lo que no veo una buena solución la intervención humana; principalmente porque el usuario típico no se va a parar a pensar en procedimientos extraordinarios...

En mi caso, siempre incluyo la "Incidencia=N" en el proceso normal, aunque no se obligatoria. Esto me permitirá sustituirla por "Incidencia=S" en el caso de tener que reenviarlo de forma automatizada, ya que, como ese dato no forma parte ni del cálculo del HASH ni del QR, no hay problema en modificarlo.

bmfranky 18-10-2024 09:54:55

Cita:

Empezado por novatico (Mensaje 558351)
En mi caso, siempre incluyo la "Incidencia=N" en el proceso normal, aunque no se obligatoria. Esto me permitirá sustituirla por "Incidencia=S" en el caso de tener que reenviarlo de forma automatizada, ya que, como ese dato no forma parte ni del cálculo del HASH ni del QR, no hay problema en modificarlo.

Si, es lo logico, yo uso un bool para consultar el estado en la regeneracion envio.
Código:


//en la parte del load del form incluyo indencia = false;


voluntaria.Incidencia = ServicioVerifactu.IncidenciaType.N;
                if(incidencia)
                {
                    voluntaria.Incidencia = ServicioVerifactu.IncidenciaType.S;
                }

Al intentar el envio establezco el valor en true;
Código:

                try
                {
                    retorno = client.RegFactuSistemaFacturacion(facAPresentar);
                }
                catch
                {
                    incidencia = true;
                    consolaError cE = new consolaError();
                    cE.Text = "Ha habido un error en la conexion con el servicio web de hacienda, por favor verifique el estado de su conexion a internet, en 60\"  vuelva a intentar el envio, si tampoco tiene exito, se archivara esta factura como proforma y se le indicara el numero de la misma , para que vuelva a proceder al envio de la misma mas tarde";
                    cE.Cuentaatras = 60;
                    cE.Errores = false;
                    cE.volverAVer.Visible = false;
                    cE.ShowDialog();
}


antoine0 18-10-2024 09:57:13

Cita:

Empezado por edari (Mensaje 558347)
Mi duda en que si yo genero este valor a las 9:00 de hoy según estoy haciendo el envío y su servidor está out media hora, cuando vuelva a subir el fichero me dará este error o que se supone que habrá que hacer

La cortesía en tal caso sería que los de AEAT desactive aquel control de hora después de re-arrancar la plataforma después de un corte (poco probable) de la totalidad del servicio Veri*factu durante media hora.
Pero me imagino que si pasaría tal cosa, tendrá la cabeza en un montón de cosas y este problema será de los últimos que les preocupará. :rolleyes:

unomasmas 18-10-2024 11:10:01

Cita:

Empezado por novatico (Mensaje 558351)
En mi caso, siempre incluyo la "Incidencia=N" en el proceso normal, aunque no se obligatoria. Esto me permitirá sustituirla por "Incidencia=S" en el caso de tener que reenviarlo de forma automatizada, ya que, como ese dato no forma parte ni del cálculo del HASH ni del QR, no hay problema en modificarlo.

Cita:

Empezado por bmfranky (Mensaje 558352)
Si, es lo logico, yo uso un bool para consultar el estado en la regeneracion envio.
Código:


//en la parte del load del form incluyo indencia = false;


voluntaria.Incidencia = ServicioVerifactu.IncidenciaType.N;
                if(incidencia)
                {
                    voluntaria.Incidencia = ServicioVerifactu.IncidenciaType.S;
                }

Al intentar el envio establezco el valor en true;
Código:

                try
                {
                    retorno = client.RegFactuSistemaFacturacion(facAPresentar);
                }
                catch
                {
                    incidencia = true;
                    consolaError cE = new consolaError();
                    cE.Text = "Ha habido un error en la conexion con el servicio web de hacienda, por favor verifique el estado de su conexion a internet, en 60\"  vuelva a intentar el envio, si tampoco tiene exito, se archivara esta factura como proforma y se le indicara el numero de la misma , para que vuelva a proceder al envio de la misma mas tarde";
                    cE.Cuentaatras = 60;
                    cE.Errores = false;
                    cE.volverAVer.Visible = false;
                    cE.ShowDialog();
}


Muchas gracias a ambos :-) Estoy pensando que podría servir incluso en caso de problemas de otro tipo; no sólo de caídas del sistema... (aunque es una idea que habrá que analizar un poco...)

[email protected] 18-10-2024 11:30:51

Error verificacion/carga XML
 
Compañeros, tengo un problema que no consigo que pase.

En el RegistroFactura / RegistroAlta

</IDFactura>

<NombreRazonEmisor xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd"/>

<TipoFactura xmlns ........................


Cuando intento cargar el xml, la linea <NombreRazonEmisor xmlns me dice Error registro : 1100, valor o tipo incorrecto de campo : NombreRazonEmisor y no consigo subsanar. Alguien puede indicarme alguna pista por donde seguir investigando

Gracias

bmfranky 18-10-2024 11:38:20

Cita:

Empezado por unomasmas (Mensaje 558355)
Muchas gracias a ambos :-) Estoy pensando que podría servir incluso en caso de problemas de otro tipo; no sólo de caídas del sistema... (aunque es una idea que habrá que analizar un poco...)

Para otros tipos de incidencia, he creado un condicionante llamado alta, segun el error la cambio , asi al reeenviar ya me codifica el motivo o mejor dicho que variar segun el motivo.
Código:

//Es por subsanacion ?
                altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.N;
                // Se havia rechazado ?
                altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.N;
//Si alta es diferente a "ALTA" , que es el valor iniucial actuamos al respecto
                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;
                }


El estado lo asigno segun la respuesta del servicio.
Código:

                XmlSerializer serializaFactura2 = new XmlSerializer(typeof(RespuestaRegFactuSistemaFacturacionType));


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

                    using (XmlWriter writter = XmlWriter.Create(xmlw, settings))
                    {
                        serializaFactura2.Serialize(writter, retorno);
                        info = xmlw.ToString();
                    }

                }
                string EstadoRegistro = "";
                Match match1 = Regex.Match(info, "<EstadoRegistro>(.*?)</EstadoRegistro>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
                if (null != match1.Value)
                {
                    EstadoRegistro = match1.Value.Replace("<EstadoRegistro>", "");
                    EstadoRegistro = EstadoRegistro.Replace("</EstadoRegistro>", "");
                    switch (EstadoRegistro)
                    {
                        case "Correcto":
                            {
                                txtConsulta.BackColor = Color.LawnGreen;
                                txtConsulta.Text = "Correcto";
                                huella.insertaHuella(new HuellaVerifactu(1, "CONTADO", facAPresentar.Cabecera.ObligadoEmision.NIF, txtSerie.Text, txtNfac.Text, altaFactura.FechaOperacion, altaFactura.TipoFactura.ToString(), altaFactura.CuotaTotal, altaFactura.ImporteTotal, altaFactura.Huella, altaFactura.FechaHoraHusoGenRegistro));
                               
                                //esto forma parte de mi sistema para guardar las factura... :D
                                Program.VehiculoSeleccionado.Marca = " ";
                                Program.VehiculoSeleccionado.Modelo = " ";
                                Program.facturaSeleccionada.Tasa = " ";
                                if (txtPortes.Text != "")
                                {
                                    Program.facturaSeleccionada.Portes = txtPortes.Text;
                                }
                                else
                                {
                                    Program.facturaSeleccionada.Portes = " ";
                                }
                                Program.facturaSeleccionada.ClientUID = 0;// Program.ClienteSelecionado.ClientUID;
                                Program.facturaSeleccionada.TipoFactura = "CONTADO";
                                Program.facturaSeleccionada.Tipo = "F2";
                                Program.facturaSeleccionada.Motivo = "";
                                Program.facturaSeleccionada.Regimen = "01";
                                Program.facturaSeleccionada.Sujeto = "S1";
                                Program.facturaSeleccionada.Exento = "";
                                Program.facturaSeleccionada.Fecha = altaFactura.FechaOperacion;// Program.RepSeleccionada.FechaReparacion;
                                Program.facturaSeleccionada.Matricula = " ";
                                Program.facturaSeleccionada.NumReparacion = 0;
                                Program.facturaSeleccionada.NºHoras = " ";// Program.madobra.Cantidad;
                                Program.facturaSeleccionada.DTOHoras = " ";//Program.madobra.Descuento;
                                Program.facturaSeleccionada.PrecioHoras = " ";//Program.madobra.Precio;
                                Program.facturaSeleccionada.TipoIva = Program.currentIva;
                                Program.facturaSeleccionada.Tasa = " ";// Program.madobra.Tasa;
                                Program.facturaSeleccionada.Materiales = info;
                                //Program.facturaSeleccionada.Portes = Program.madobra.Portes;
                                //Program.facturaSeleccionada.Materiales = " ";// Program.RepSeleccionada.Reparacion;
                                Program.facturaSeleccionada.NºFactura = Convert.ToInt32(txtNfac.Text);                                                //
                               
                                    Program.configTaller.NºFactura++;
                                    ConfigDB.actualizaNfac(Program.configTaller.NºFactura.ToString());
                                    FacturasDB.grabaFacturaSimple(Program.facturaSeleccionada, "contado", Program.currentYear);//,"");
                                    MaterialesDB.agregar(Program.MaterialesSeleccionados, "contado"+Program.currentYear);
                             

                                muestraFactura2 vf1 = FacturasDB.asignaReporteFacturaVenta();
                                InterfaceFunciones Interface1 = this.Owner as InterfaceFunciones;
                                Interface1.reiniciaBlocker("Parar");
                                vistaPrevia vP = new vistaPrevia(vf1);
                                vP.Text = "Factura Nº " + txtSerie.Text + txtNfac.Text;
                                vP.ShowDialog(Owner);
                                borra.PerformClick();
                                break;
                            }
                        case "AceptadoConErrores":
                            {
                                txtConsulta.BackColor = Color.Yellow;
                                txtConsulta.Text = "AceptadoConErrores";
                                if(alta=="ALTA")
                                {
                                    alta = "SUBSANACION";
                                }
                                else
                                {
                                    alta = "RECHAZO_SUBSANACION";
                                }
                                Match match2 = Regex.Match(info, "<CodigoErrorRegistro>(.*?)</CodigoErrorRegistro>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
                                string codigoRegistro = match2.Value.Replace("<CodigoErrorRegistro>", "");
                                codigoRegistro = codigoRegistro.Replace("</CodigoErrorRegistro>", "");
                                Match match3 = Regex.Match(info, "<DescripcionErrorRegistro>(.*?).", RegexOptions.IgnoreCase | RegexOptions.Singleline);
                                string DescripcionRegistro = match2.Value.Replace("<DescripcionErrorRegistro>", "");
                                txt_motivo.Text = codigoRegistro + " -> " + DescripcionRegistro;
                                break;
                            }
                        case "Incorrecto":
                            {
                                txtConsulta.BackColor = Color.Red;
                                txtConsulta.Text = "Errores";
                                alta="RECHAZO";
                                Match match2 = Regex.Match(info, "<CodigoErrorRegistro>(.*?)</CodigoErrorRegistro>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
                                string codigoRegistro = match2.Value.Replace("<CodigoErrorRegistro>", "");
                                codigoRegistro = codigoRegistro.Replace("</CodigoErrorRegistro>", "");
                                Match match3 = Regex.Match(info, "<DescripcionErrorRegistro>(.*?)</DescripcionErrorRegistro>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
                                string DescripcionRegistro = match3.Value.Replace("<DescripcionErrorRegistro>", "");
                                DescripcionRegistro = DescripcionRegistro.Replace("</DescripcionErrorRegistro>", "");
                                txt_motivo.Text = codigoRegistro + " -> " + DescripcionRegistro;
                                break;
                            }
                        default://Incorrecta
                            {
                                txtConsulta.BackColor = Color.Red;
                                txtConsulta.Text = "Errores";
                                Match match2 = Regex.Match(info, "<CodigoErrorRegistro>(.*?)</CodigoErrorRegistro>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
                                string codigoRegistro = match2.Value.Replace("<CodigoErrorRegistro>", "");
                                codigoRegistro = codigoRegistro.Replace("</CodigoErrorRegistro>", "");
                                Match match3 = Regex.Match(info, "<DescripcionErrorRegistro>(.*?)</DescripcionErrorRegistro>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
                                string DescripcionRegistro = match3.Value.Replace("<DescripcionErrorRegistro>", "");
                                DescripcionRegistro = DescripcionRegistro.Replace("</DescripcionErrorRegistro>", "");
                                txt_motivo.Text = codigoRegistro + " -> " + DescripcionRegistro;
                                break;
                            }
                    }
                }


No sera la forma mas limpia de hacerlo, pero a mi me funciona.

bmfranky 18-10-2024 11:39:05

Cita:

Empezado por [email protected] (Mensaje 558357)
Compañeros, tengo un problema que no consigo que pase.

En el RegistroFactura / RegistroAlta

</IDFactura>

<NombreRazonEmisor xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd"/>

<TipoFactura xmlns ........................


Cuando intento cargar el xml, la linea <NombreRazonEmisor xmlns me dice Error registro : 1100, valor o tipo incorrecto de campo : NombreRazonEmisor y no consigo subsanar. Alguien puede indicarme alguna pista por donde seguir investigando

Gracias


Hola, puedes postear el trozo del xml completo, para ver si esta mal formado?

[email protected] 18-10-2024 11:42:17

Cita:

Empezado por bmfranky (Mensaje 558359)
Hola, puedes postear el trozo del xml completo, para ver si esta mal formado?


<IDVersion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">1.0</IDVersion>
<IDFactura xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDEmisorFactura>33461360V</IDEmisorFactura>
<NumSerieFactura>2024</NumSerieFactura>
<FechaExpedicionFactura>15-10-2024</FechaExpedicionFactura>
</IDFactura>
<NombreRazonEmisor xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd"/>


con esto es suficiente o subo el xml completo

bmfranky 18-10-2024 11:49:06

Cita:

Empezado por [email protected] (Mensaje 558360)
<IDVersion xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">1.0</IDVersion>
<IDFactura xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<IDEmisorFactura>33461360V</IDEmisorFactura>
<NumSerieFactura>2024</NumSerieFactura>
<FechaExpedicionFactura>15-10-2024</FechaExpedicionFactura>
</IDFactura>
<NombreRazonEmisor xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd"/>


con esto es suficiente o subo el xml completo

Hola, estas cerrando la etiqueta, antes de rellenarla con ningun dato.
Cita:

SuministroInformacion.xsd"/> Sobra, la barra al final y luego has de poner el nombre asi: SuministroInformacion.xsd"> luego cierras la etiqueta


Cita:

<NombreRazonEmisor xmlns="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">Nombre emisor facturas</NombreRazonEmisor>


Asi.

Jesusggc 18-10-2024 12:10:42

Como estais formando NumSerieFactura
 
Buenas, me surge una duda

vosotros como estáis formando el campo NumSerieFactura?

las indicaciones son : Numero de Serie + Numero Factura

Me gustaría que saber como lo formais.

Yo, resumiendo, Tengo una tabla distinta de mi tabla de facturas llamada RegistrosFacturacion donde almaceno los registros de alta y anulacion, dicha tabla tiene un campo autoincrementado Id. NumSerieFactura lo formo así : Id/SerieNumero

Ejemplo:
Serie factura = 24
Numero Factura = 511
Id registro facturacion = 333

NumSerieFactura = 333/24511

Os agradezco vuestras opiniones

novatico 18-10-2024 12:40:25

Cita:

Empezado por Jesusggc (Mensaje 558362)
Buenas, me surge una duda

vosotros como estáis formando el campo NumSerieFactura?

las indicaciones son : Numero de Serie + Numero Factura

Me gustaría que saber como lo formais.

Yo, resumiendo, Tengo una tabla distinta de mi tabla de facturas llamada RegistrosFacturacion donde almaceno los registros de alta y anulacion, dicha tabla tiene un campo autoincrementado Id. NumSerieFactura lo formo así : Id/SerieNumero

Ejemplo:
Serie factura = 24
Numero Factura = 511
Id registro facturacion = 333

NumSerieFactura = 333/24511

Os agradezco vuestras opiniones

Yo te aconsejaría que cambiaras la barra que separa el 333 del 24511 por un guión medio o bajo, pues si lo vas a identificar igual para el montaje del QR, puede darte error.
A mí ya me paso.

[email protected] 18-10-2024 13:12:32

Cita:

Empezado por bmfranky (Mensaje 558361)
Hola, estas cerrando la etiqueta, antes de rellenarla con ningun dato.




Asi.



Muchas gracias y disculpar por mis preguntas pues tengo poca experiencia con los XML , etiquetas, etc.
Resuelto la primera duda, esto es como la ley de Murphy , despues de una solucion sale otro problma.

Ahora es con esta etiqueta :

<Desglose>
<DetalleDesglose>
<CalificacionOperacion>S1</CalificacionOperacion>
<TipoImpositivo>21</TipoImpositivo>
<BaseImponibleOimporteNoSujeto>8.18</BaseImponibleOimporteNoSujeto>
<CuotaRepercutida>1.72</CuotaRepercutida>
</DetalleDesglose>
</Desglose>

el error que me indica es el mismo que antes : Falta informar campo obligatorio : Desglose

He revisado el EXCEL donde se define la estructura 2D)Registro facturacion alta, etiqueta DESGLOSE y los campos en ROJO estan contemplados, salvo el que indica OperacionExenta que no lo trato

Si alguien me echa un cable se lo agradecere

Muchas Gracias

ermendalenda 18-10-2024 13:27:50

Que barbaridad lo de los 120 segundos, me había quedado tranquilo de que ya lo tengo casi todo y nuevo control, por que además si te devuelven [t]<>0 otro control más a tener en cuenta combinado con este para mandarlo como incidencia si o no.

bmfranky 18-10-2024 15:34:31

Hola, han actualizado otra vez el documento de los QR, se ha cambiado el mensaje que devuelve, diciendo que la factura puede tener mas informacion que la que ellos contemplan en el qr:eek:

Tambien han actualizado el documento de validaciones.

bmfranky 18-10-2024 15:38:55

Cita:

Empezado por [email protected] (Mensaje 558364)
Muchas gracias y disculpar por mis preguntas pues tengo poca experiencia con los XML , etiquetas, etc.
Resuelto la primera duda, esto es como la ley de Murphy , despues de una solucion sale otro problma.

Ahora es con esta etiqueta :

<Desglose>
<DetalleDesglose>
<CalificacionOperacion>S1</CalificacionOperacion>
<TipoImpositivo>21</TipoImpositivo>
<BaseImponibleOimporteNoSujeto>8.18</BaseImponibleOimporteNoSujeto>
<CuotaRepercutida>1.72</CuotaRepercutida>
</DetalleDesglose>
</Desglose>

el error que me indica es el mismo que antes : Falta informar campo obligatorio : Desglose

He revisado el EXCEL donde se define la estructura 2D)Registro facturacion alta, etiqueta DESGLOSE y los campos en ROJO estan contemplados, salvo el que indica OperacionExenta que no lo trato

Si alguien me echa un cable se lo agradecere

Muchas Gracias


Hola, te falta la la clave regimen utilizado.


Cita:

<DetalleDesglose>
<ClaveRegimen>01</ClaveRegimen>
<CalificacionOperacion>S1</CalificacionOperacion>
<TipoImpositivo>21.00</TipoImpositivo>
<BaseImponibleOimporteNoSujeto>26.44</BaseImponibleOimporteNoSujeto>
<CuotaRepercutida>9.33</CuotaRepercutida>
</DetalleDesglose>
Código:

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;


[email protected] 18-10-2024 16:44:50

Cita:

Empezado por bmfranky (Mensaje 558373)
Hola, te falta la la clave regimen utilizado.




Código:

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;



Muchísimas gracias bmfranky, voy a probar lo que me indicas. Aunque veo que esta etiqueta esta marcada como NO OBLIGATORIA en el la hoja excel.

Imagino que voy a seguir preguntando ya que me va a ocurrir lo mismo en otras etiquetas y debido a mi ignorancia sobre el tema, ya que estoy tambien apendiendo en paralelo la estructura y montaje de XML


Termino de probarlo y sigo teniendo el mismo error FALTA INFORMAR CAMPO OBLIGATORIO:

<Desglose>
<DetalleDesglose>
<ClaveRegimen>01</ClaveRegimen>
<CalificacionOperacion>S1</CalificacionOperacion>
<TipoImpositivo>21</TipoImpositivo>
<BaseImponibleOimporteNoSujeto>8.18</BaseImponibleOimporteNoSujeto>
<CuotaRepercutida>1.72</CuotaRepercutida>
</DetalleDesglose>
</Desglose>

Voy a probar indicando todos los campos que muestra la hoja excel aunque no sean obligatorios a ver lo que me dice.

bmfranky 18-10-2024 16:47:04

tambien an actualizado el esquema de respuesta xsd.


Código:

2.1. Versión 0.4.1
Modificación del esquema de respuesta añadiendo el nodo <Operacion> con
información del tipo de operación realizada en el registro de facturación.


ermendalenda 18-10-2024 17:23:27

Cita:

Empezado por [email protected] (Mensaje 558375)
Muchísimas gracias bmfranky, voy a probar lo que me indicas. Aunque veo que esta etiqueta esta marcada como NO OBLIGATORIA en el la hoja excel.

Imagino que voy a seguir preguntando ya que me va a ocurrir lo mismo en otras etiquetas y debido a mi ignorancia sobre el tema, ya que estoy tambien apendiendo en paralelo la estructura y montaje de XML


Termino de probarlo y sigo teniendo el mismo error FALTA INFORMAR CAMPO OBLIGATORIO:

<Desglose>
<DetalleDesglose>
<ClaveRegimen>01</ClaveRegimen>
<CalificacionOperacion>S1</CalificacionOperacion>
<TipoImpositivo>21</TipoImpositivo>
<BaseImponibleOimporteNoSujeto>8.18</BaseImponibleOimporteNoSujeto>
<CuotaRepercutida>1.72</CuotaRepercutida>
</DetalleDesglose>
</Desglose>

Voy a probar indicando todos los campos que muestra la hoja excel aunque no sean obligatorios a ver lo que me dice.


o es cambiar el tipo impositivo 21 por 21.00
o es que te faltan las referencias en los nodos ="https://www2.agenciatributaria.gob.e...nformacion.xsd"

bmfranky 18-10-2024 17:31:45

Mi gozo en un pozo, acabo de actulizar el xsd y me dice que no se puede deserializar porque el nuevo parametro que pasan en la respuesta es erroneo...


Cita:

System.ServiceModel.CommunicationException: Error al deserializar el cuerpo del mensaje de respuesta para la operación 'RegFactuSistemaFacturacion'. ---> System.InvalidOperationException: Error en el documento XML (3, 977). ---> System.InvalidOperationException: Error de validación de instancia: '' no es un valor válido para TipoOperacionType.

bmfranky 18-10-2024 17:37:56

Sera por que lo acaban de publicar y aun no lo usan?

rci 18-10-2024 17:38:08

Cita:

Empezado por bmfranky (Mensaje 558378)
Mi gozo en un pozo, acabo de actulizar el xsd y me dice que no se puede deserializar porque el nuevo parametro que pasan en la respuesta es erroneo...

A mi me da el mismo error pero imagino que significa que en el XML que le he enviado no hay la nueva propiedad obligatoria TipoOperacion.
Voy a probar de añadirla en el próximo envío a ver si ya lo acepta.

Creo que me he confundido. el nuevo campo es en la respuesta veo. Perdón

bmfranky 18-10-2024 17:39:20

En el envio esta?, creo que ponia en la descripcion que solo esta en la respuesta.

rci 18-10-2024 17:47:05

Cita:

Empezado por bmfranky (Mensaje 558381)
En el envio esta?, creo que ponia en la descripcion que solo esta en la respuesta.

No no, me he confundido, perdón.

Tendremos que contactar con verifactu.
No se si los otros usuarios, que utilizáis delphi tenéis el mismo problema o os funciona

bmfranky 18-10-2024 17:48:59

De momento voy a volver atras, y ver en la respuesta que campos incluye, porque creo aqu ha habido alguna gamba por su parte, porque el servicio que esta en la web , y el que se actualiza automatico , no son iguales.

ermendalenda 18-10-2024 18:07:10

Reabro polémica de facturas sustitutivas.
En post anteriores alguien ha puesto que para emitir una factura sobre un tiquet emitía un tiquet negativo y después volvía a hacer la factura.
Pues se me acaba de dar el caso de que un cliente a solicitado una factura de tiquets que tenían el 0% de Iva del mes de mayo, si hiciera el negativo, el SII rechaza tiquets y facturas con el 0% para este tipo de venta. Y peor aun, si lo hago así tendría que pagar el iva que antes estaba exento, y a quien se lo repercuto?
Nota: son productos que estaba al 0% y ahira están al 2% por cambio de normativa, y lo mismo con la pasta y legumbres que estaban al 5% y pasan al 7.5%

bmfranky 18-10-2024 18:13:20

Menuda miercoles de servicio, tiene esta gente, al actualizar daba error en la respuesta, desactualizo , vuelvo a enviar otra factura con el mismo numero, me indica que todo ok, pero al leer el QR, los datos no son correctos, porque se ha quedado grabada la factura enviada antes, no deveria haber contestado error porque la factura estaba duplicada???
Lo dicho, casi que las pruebas que hacemos no valen para nada...

bmfranky 18-10-2024 18:44:21

Cita:

Empezado por bmfranky (Mensaje 558385)
Menuda miercoles de servicio, tiene esta gente, al actualizar daba error en la respuesta, desactualizo , vuelvo a enviar otra factura con el mismo numero, me indica que todo ok, pero al leer el QR, los datos no son correctos, porque se ha quedado grabada la factura enviada antes, no deveria haber contestado error porque la factura estaba duplicada???
Lo dicho, casi que las pruebas que hacemos no valen para nada...

Lo acabo de verificar, la factura sube pero falla al serializar la respuesta, en algo han metido la gamba o les falta for subier alguna actualizacion mas, si se envia otra factura con el mismo numero contesta ok a la resubida, como si fuera una nueva, pero realmente no la actualiza, porque ya existe una.

jguarda 18-10-2024 18:48:10

probadores
 
estamos haciendo de probadores de su sistemas , mejorandolo y depurandolo ...


algun código que se haya subido para exarle un ojo ??

CarlosArjonomia 18-10-2024 18:53:15

Cita:

Empezado por jguarda (Mensaje 558387)
estamos haciendo de probadores de su sistemas , mejorandolo y depurandolo ...


algun código que se haya subido para exarle un ojo ??

Eso es lo triste, lo normal es que cuando tuvieran la documentación y ellos hubiesen probado el sistema, nosotros empezáramos a trabajar.

El tiempo que tenemos que dedicamos a hacerles de betatesters nos sustrae tiempo de otros recursos. Y no tendrán piedad si somos nosotros los que cometemos algún error.

bmfranky 18-10-2024 18:55:14

Respuesta en crudo
 
Hola, alguien que envie por http , sin usar sus funciones, puede pasa lo que responde en crudo el servico ahora, por verificar que ya estan incluyendo las nuevas etiquetas?

jguarda 18-10-2024 18:58:41

dudas
 
Yo creo que voi a aparcar esto hasta enero, voi a esperar a ver si publican la Orden Ministerial, si es así, en enero retomo esto sino, es q se retrasa todo, y entonces yo también lo retraso. Y a unas malas lo que haré será comprar alguna librería que ya esté implementada y punto pelota. Voi a pasar de todo esto xq solo me trae quebraderos de cabeza y no abanzo en lo que me piden los clientes q son los que me pagan.


La franja horaria es GMT +2. Ahora son las 03:36: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