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.


La franja horaria es GMT +2. Ahora son las 15:18:03.

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