Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Tema Cerrado
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2024
xevi xevi is offline
Miembro
 
Registrado: feb 2024
Posts: 69
Poder: 3
xevi Va por buen camino
Cita:
Empezado por jlmoli_67 Ver Mensaje
Buenas,

Solo comentaros que el servicio funciona perfectamente. Ya consegui enviar sin errores. La direccion es la del post que viene mas arriba de sglorka ( https://prewww1.aeat.es/wlpl/TIKE-CO.../VerifactuSOAP). La peticion soap la he firmado con mi certificado personal.


Me he tranquilizado muchisimo despues de ver mi primer "OK" ( lo estaba pasando realmente mal )



Gracias a todos. Os estoy muy agradecido. No podria haber hecho sin vuestra ayuda!!
El envio del primer registro, sin huella anterior, ¿como és el nodo <encadenamiento>???
Código:
<sum1:Encadenamiento>
<sum1:RegistroAnterior>
<sum1:IDEmisorFactura>AAAA</sum1:IDEmisorFactura>
<sum1:NumSerieFactura>44</sum1:NumSerieFactura>
<sum1:FechaExpedicionFactura>13-09-2024</sum1:FechaExpedicionFactura>
<sum1:Huella>HuellaRegistroAnterior</sum1:Huella>
</sum1:RegistroAnterior>
</sum1:Encadenamiento>
Ya que consigo enviar registros, pero me devuelve siempre que el calculo de la huella no es correcto.

Gracias.
  #2  
Antiguo 27-09-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 864
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por xevi Ver Mensaje
El envio del primer registro, sin huella anterior, ¿como és el nodo <encadenamiento>???
Código:
<sum1:Encadenamiento>
<sum1:RegistroAnterior>
<sum1:IDEmisorFactura>AAAA</sum1:IDEmisorFactura>
<sum1:NumSerieFactura>44</sum1:NumSerieFactura>
<sum1:FechaExpedicionFactura>13-09-2024</sum1:FechaExpedicionFactura>
<sum1:Huella>HuellaRegistroAnterior</sum1:Huella>
</sum1:RegistroAnterior>
</sum1:Encadenamiento>
Ya que consigo enviar registros, pero me devuelve siempre que el calculo de la huella no es correcto.

Gracias.
Segun el manual deve dejarse en blanco.
  #3  
Antiguo 27-09-2024
xevi xevi is offline
Miembro
 
Registrado: feb 2024
Posts: 69
Poder: 3
xevi Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Segun el manual deve dejarse en blanco.
¿Sin el nodo <Encadenamiento> ???
¿Con el nodo encadenamiento y sin nodo <RegistroAnterior>???
Con el nodo <Encadenamiento> y <RegistroAnterior>

Código:
El XML no cumple el esquema. Falta informar campo obligatorio.: PrimerRegistro</faultstring><detail><callstack>El XML no cumple el esquema. Falta informar campo obligatorio.: PrimerRegistro
WSExcepcion
Echo, añadido PrimerRegistro S

Ahora por lo visto no me cuadra el cálculo de la huella. A ver que más me sale!!!

Última edición por xevi fecha: 27-09-2024 a las 10:10:22.
  #4  
Antiguo 27-09-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 864
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por xevi Ver Mensaje
¿Sin el nodo <Encadenamiento> ???
¿Con el nodo encadenamiento y sin nodo <RegistroAnterior>???
Con el nodo <Encadenamiento> y <RegistroAnterior>

Código:
El XML no cumple el esquema. Falta informar campo obligatorio.: PrimerRegistro</faultstring><detail><callstack>El XML no cumple el esquema. Falta informar campo obligatorio.: PrimerRegistro
WSExcepcion
Hola, perdona si no me explique, se tiene que crear con todos los datos de la factura, pero en el lugar donde se asigna la anterior cadena, en blanco.
Código:
6.1. Caso 1: primer registro de facturación –en este caso, de
alta– en un Sistema Informático de Facturación (SIF)
Se parte de los siguientes datos de entrada en el XML:
1. IDEmisorFactura: 89890001K
2. NumSerieFactura: 12345678/G33
3. FechaExpedicionFactura: 01-01-2024
4. TipoFactura: F1
5. CuotaTotal: 12.35
6. ImporteTotal: 123.45
7. Huella (*):
8. FechaHoraHusoGenRegistro: 2024-01-01T19:20:30+01:00
(*) Sin contenido, al tratarse del primer registro de ese SIF y, por tanto, no haber
registro de facturación anterior.
  #5  
Antiguo 27-09-2024
xevi xevi is offline
Miembro
 
Registrado: feb 2024
Posts: 69
Poder: 3
xevi Va por buen camino
Esto es para el cálculo del hash/firma, pero para el xml a enviar a VERIFACTU, se debe de informar
Código:
               <sum1:Encadenamiento>
                  <sum1:PrimerRegistro>S</sum1:PrimerRegistro>
               </sum1:Encadenamiento>
Creo tener así entendido. Lo he probado y parece que traga, ahora a ver lo del cálculo de la huella
  #6  
Antiguo 27-09-2024
jlmoli_67 jlmoli_67 is offline
Miembro
 
Registrado: feb 2024
Posts: 132
Poder: 3
jlmoli_67 Va por buen camino
buenas

Correcto. Perdona entendi mal la pregunta

un saludo
  #7  
Antiguo 27-09-2024
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.219
Poder: 24
newtron Va camino a la fama
Buenas.


A mi me da un access violation al hacer la llamada. ¿Alguna idea de por qué puede ser?


Gracias y un saludo.
__________________
Be water my friend.
  #8  
Antiguo 27-09-2024
jlmoli_67 jlmoli_67 is offline
Miembro
 
Registrado: feb 2024
Posts: 132
Poder: 3
jlmoli_67 Va por buen camino
hash primer registro

buenas, lee el siguiente enlace, viene bien explicado:



https://www.agenciatributaria.es/sta..._registros.pdf



Caso 1: primer registro de facturación –en este caso, de
alta– en un Sistema Informático de Facturación (SIF)
Se parte de los siguientes datos de entrada en el XML:
1. IDEmisorFactura: 89890001K
2. NumSerieFactura: 12345678/G33
3. FechaExpedicionFactura: 01-01-2024
4. TipoFactura: F1
5. CuotaTotal: 12.35
6. ImporteTotal: 123.45
7. Huella (*):
8. FechaHoraHusoGenRegistro: 2024-01-01T19:20:30+01:00
(*) Sin contenido, al tratarse del primer registro de ese SIF y, por tanto, no haber
registro de facturación anterior.
Se obtendría la siguiente cadena de caracteres sobre la que aplicar el algoritmo
de huella o «hash»:
IDEmisorFactura=89890001K&NumSerieFactura=12345678/G33&FechaExped
icionFactura=01-01-
2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=&Fec
haHoraHusoGenRegistro=2024-01-01T19:20:30+01:00




un saludo
  #9  
Antiguo 20-10-2024
jguarda jguarda is offline
Miembro
 
Registrado: feb 2008
Posts: 27
Poder: 0
jguarda Va por buen camino
dudas

Verifactu me dice que el nif con el que envio la factura no está dado de alta. Como habeís solucionado este tema.


Gracias
  #10  
Antiguo 20-10-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por jguarda Ver Mensaje
Verifactu me dice que el nif con el que envio la factura no está dado de alta. Como habeís solucionado este tema.


Gracias
Hola, yo solo tengo ese problema si envio con un nif que no existe o de pruebas de estos tipos:Juan Español Español 12312312F
Comprueba que el nombre corresponda (al menos parcialmente) con el que está dado de alta en la aeat. por ejemplo no puedes poner un nif de persona fisica asociado a un nombre comercial.
  #11  
Antiguo 20-10-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Importante Para Envios Con Curl Para Software Antiguo

Hola, creo que es importante que se ponga esto en el primer post. Puede que le "salve la vida" a más de uno que usa desarrollo antiguo, tipo vb 6.0 , delphis antiquísimos etc..

Para realizar los envios con la aplicación Curl.exe.
1. Encapsular el fichero xml en SOAP.
Para ello agregar al fichero el inicio y final del soap
Código PHP:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<
soapenv:Header />
<
soapenv:Body>
<
sum:RegFactuSistemaFacturacion>
....
..
</
sum:RegFactuSistemaFacturacion>
</
soapenv:Body>
</
soapenv:Envelope
Ojo hay que quitarle
Código PHP:
<?xml version="1.0" encoding="UTF-8"?>
y si habeis puesto el inicio del nodo RegFactuSistemaFacturacion con referencias quitarlas y dejarlas así:
Código PHP:
<sum:RegFactuSistemaFacturacion
Ya que las referencias ya estan en el soap, aunque lo mismo funciona poniendolo en uno o en otro, pero si lo dejas en los 2 no va a funcionar.


2.Enviar el fichero soap con CURL.exe

Os dejo el comando, al que podeis hacerle modificaciones
curl.exe --connect-timeout 300 -m 300 -k -L -d "@C:\....\VFac22223.xml" -o respuesta_
VFac22223.xml -D cabecera_VFac22223.xml --cert-type P12 --cert C:\...certificado.pfx:contraseña https://prewww1.aeat.es/wlpl/TIKE-CO.../VerifactuSOAP --trace respuestatrace_VFac22223.txt

Explico un poco:
-Para enviar de esta forma podeis tener en una carpeeta el certificado con el que enviais en formato pfx/pt2, aunque el comando curl tambien admite usar certificados desde un almacen en el que lo habeis importado, si lo necesitais desde almacen podeis buscar ayuda al respectgo por el google.
-Aunque para saber un poco más de los parametros curl podeis ejecutar curl --help all desde el cmd os dejo las explicaciones a los parametros que uso:
*Los timeouts, son los tiempos de espera en segundos, que aunque los he puesto un poco exagerados, por experiencia los prefiero tener así, ya que me he encontrado en situaciones de conexiones 2G o que usaban un router de datos con los datos agotados y al menos alarga unos megas mas los envios a velocidad lenta.
*La opción -k os quitará muchos dolores de cabeza, ya que a veces hay restricciones de envios por temas de firewall, seguridad..., y es para que no tenga en cuenta si ha caducado el certificado del propio curl o de vuestro propio sistema... pero no tiene nada que ver con que caduque el certificado electronico con el que enviais, si ese caduca, channn-- error---

*La opcion -L permite que haya redirecciones, no es necesario, pero lo activo por si acaso meten alguna redireccion
*La opcion -d seguida de la ruta completa del archivo a enviar entrecomillada y precedida por el simbolo arroba @ antes de la ruta, es el archivo a enviar, se precede por el @ parea que se envie y reciba en formato binario y nos aseguremos que los caracteres que enviamos no lleguen convertidos a otro sistema que no sea el UTF8.
*La opción -o seguida de la ruta completa de la respuesta, nos devolverá en un fichero la respuesta de Hacienda en formato XML. Aconsejo usarla con la respuesta de cabecera -D, ya que podemos ver previamente si hay conexion o no, o sea, el de cabecera nos proporciona informacion adicional sobre la conexion, el fichero de cabecera puede tener varios estados: uno de ellos es vacio o que no se genere(con lo cual no ha habido conexion) y si tiene contenido nos informa si la conexion ha sido ok, haced bastantes pruebas, quitando la red, mandando repetidos etc.
* La opción --trace, no es necesaria, solo para hacer alguna prueba más severa por que tengamos algun problema con alguna conexion en particular y queramos informacion muy específica de todo lo que esta haciendo el comando.
* La opcion --cert-type P12 --cert continuada por el nombre del fichero(certificado pfx/pt2), continuada por dos puntos ":" y la contraseña indicamos que estamos enviando con un certificado de un fichero que tenemos donde indicamos. Debeis tener especial cuidad con este comando de no dejar rastros, no es aconsejable crear un .bat ni nada de eso, y tened en cuenta que es un pelin inseguro por temas que no voy a decir aquí.
* Y ya por ultimo el servidor para las altas de facturas:
https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP


Nota:
Podeis tener problemas con el servidor si teneis un router con tarjeta de datos 3g/4g/5g si el proveedor os han metido CG-NAT (de repente) o s han puesto en un blacklist, para saberlo receibirais al conectar un error 443, normalmente no es problema del firewall, que ese es otro tema, para corregir el problema teneis 2 opciones, o llamais al proveedor y os lo soluciona (le decis que os saque del CG-NAT) o cambias la tarjeta de datos.
Os lo digo por si quereis meter ese control en las respuestas, ya que no es un error frecuente y os puede también dar dolores de cabeza.

Última edición por ermendalenda fecha: 20-10-2024 a las 10:13:10.
  #12  
Antiguo 21-10-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.459
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por ermendalenda Ver Mensaje
Hola, creo que es importante que se ponga esto en el primer post. Puede que le "salve la vida" a más de uno que usa desarrollo antiguo, tipo vb 6.0 , delphis antiquísimos etc..

Gracias.
Por los detalles y la explicación.
Actualizo en mensaje#2
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
  #13  
Antiguo 20-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 864
Poder: 3
bmfranky Va por buen camino
Para los errores de dni no censado.

Cita:
Errores conwxion
1-> Error nif cliente mo coincide con nombre
2-> Error hora
Solo por que tengamos claro que hay que hacer. Marcar incidencia. Rectificativa...
Cita:
Empezado por jguarda Ver Mensaje
3-> Verifactu me dice que el nif con el que envio la factura no está dado de alta. Como habeís solucionado este tema.


Gracias

Hola, para los casos 2 y 3 hay una solucion propuesta por la misma administracion, porque puede ser perfectamente que un cliente no este censado en hacienda y al reenviarpor un corte seguro estamos fuera, de la hora de generacion fijo.


Para el caso 1 y 3 uso la misma solucion, compruebo la estructura que este bien formado, que no lo haya introducido mal.
Código:
   class verificaDniCif
    {
       public static Boolean valida_NIFCIFNIE(string data)
        {
            if (String.IsNullOrEmpty(data) || data.Length < 8)
                return false;

            var initialLetter = data.Substring(0, 1).ToUpper();
            if (Char.IsLetter(data, 0))
            {
                switch (initialLetter)
                {
                    case "X":
                        data = "0" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    case "Y":
                        data = "1" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    case "Z":
                        data = "2" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    default:
                        if (new Regex("[A-Za-z][0-9]{7}[A-Za-z0-9]{1}$").Match(data).Success)
                            return validadCIF(data);
                        break;
                }
            }
            else if (Char.IsLetter(data, data.Length - 1))
            {
                if (new Regex("[0-9]{8}[A-Za-z]").Match(data).Success || new Regex("[0-9]{7}[A-Za-z]").Match(data).Success)
                    return validarNIF(data);
            }
            return false;
        }

        private static string getLetra(int id)
        {
            Dictionary<int, String> letras = new Dictionary<int, string>();
            letras.Add(0, "T");
            letras.Add(1, "R");
            letras.Add(2, "W");
            letras.Add(3, "A");
            letras.Add(4, "G");
            letras.Add(5, "M");
            letras.Add(6, "Y");
            letras.Add(7, "F");
            letras.Add(8, "P");
            letras.Add(9, "D");
            letras.Add(10, "X");
            letras.Add(11, "B");
            letras.Add(12, "N");
            letras.Add(13, "J");
            letras.Add(14, "Z");
            letras.Add(15, "S");
            letras.Add(16, "Q");
            letras.Add(17, "V");
            letras.Add(18, "H");
            letras.Add(19, "L");
            letras.Add(20, "C");
            letras.Add(21, "K");
            letras.Add(22, "E");
            return letras[id];
        }

        private static bool validarNIF(string data)
        {
            if (data == String.Empty)
                return false;
            try
            {
                String letra;
                letra = data.Substring(data.Length - 1, 1);
                data = data.Substring(0, data.Length - 1);
                int nifNum = int.Parse(data);
                int resto = nifNum % 23;
                string tmp = getLetra(resto);
                if (tmp.ToLower() != letra.ToLower())
                    return false;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
            return true;
        }

        private static bool validadCIF(string data)
        {
            try
            {
                int pares = 0;
                int impares = 0;
                int suma;
                string ultima;
                int unumero;
                string[] uletra = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "0" };
                string[] fletra = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
                int[] fletra1 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
                string xxx;

                /*
                * T      P      P      N  N  N  N  N  C
                Siendo:
                T: Letra de tipo de Organización, una de las siguientes: A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S.
                P: Código provincial.
                N: Númeración secuenial dentro de la provincia.
                C: Dígito de control, un número ó letra: Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0.
                *
                *
                A.    Sociedades anónimas.
                B.    Sociedades de responsabilidad limitada.
                C.    Sociedades colectivas.
                D.    Sociedades comanditarias.
                E.    Comunidades de bienes y herencias yacentes.
                F.    Sociedades cooperativas.
                G.    Asociaciones.
                H.    Comunidades de propietarios en régimen de propiedad horizontal.
                I.    Sociedades civiles, con o sin personalidad jurídica.
                J.    Corporaciones Locales.
                K.    Organismos públicos.
                L.    Congregaciones e instituciones religiosas.
                M.    Órganos de la Administración del Estado y de las Comunidades Autónomas.
                N.    Uniones Temporales de Empresas.
                O.    Otros tipos no definidos en el resto de claves.

                */
                data = data.ToUpper();

                ultima = data.Substring(8, 1);

                int cont = 1;
                for (cont = 1; cont < 7; cont++)
                {
                    xxx = (2 * int.Parse(data.Substring(cont++, 1))) + "0";
                    impares += int.Parse(xxx.ToString().Substring(0, 1)) + int.Parse(xxx.ToString().Substring(1, 1));
                    pares += int.Parse(data.Substring(cont, 1));
                }

                xxx = (2 * int.Parse(data.Substring(cont, 1))) + "0";
                impares += int.Parse(xxx.Substring(0, 1)) + int.Parse(xxx.Substring(1, 1));

                suma = pares + impares;
                unumero = int.Parse(suma.ToString().Substring(suma.ToString().Length - 1, 1));
                unumero = 10 - unumero;
                if (unumero == 10) unumero = 0;

                if ((ultima == unumero.ToString()) || (ultima == uletra[unumero - 1]))
                    return true;
                else
                    return false;

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }
    }
Si esta correcto compruebo el Nif con hacienda usando la opcion de buscar los datos del nif en hacienda.http://www2.agenciatributaria.gob.es...ws/VNifV2.wsdl
Código:
        /// <summary>
        /// Comprueba si un CIF/NIf esta censado
        /// </summary>
        /// <returns>Si o No segun el estado del censo</returns>
        public string Censado()
        {
            string censado = "No";
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            Salida respuestaNif = new Salida();
            Entrada checaNif = new Entrada();
            VNifV2EntContribuyente contribuyente = new VNifV2EntContribuyente();
            contribuyente.Nif = Dni.Text;
            contribuyente.Nombre = Apellido1.Text + " " + Apellido2.Text + " " + nom.Text;
            VNifV2EntContribuyente[] contrib = new VNifV2EntContribuyente[1];
            contrib[0] = contribuyente;
            checaNif.VNifV2Ent = contrib;
            VNifV2Client checa = new VNifV2Client("VNifPort1");
            checa.ClientCredentials.ClientCertificate.Certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Program.certificado, Program.passcertificado);
            checa.ClientCredentials.UseIdentityConfiguration = true;
            checa.ClientCredentials.SupportInteractive = true;
            VNifV2SalContribuyente nifsalida = new VNifV2SalContribuyente();

            var resultado = checa.VNifV2(checaNif);
            if(resultado.VNifV2Sal[0].Resultado == "IDENTIFICADO")
            {
                txtCensado.BackColor = Color.Green;
                censado = "Si";
            }
            else
            {
                txtCensado.BackColor = Color.Red;
                MessageBox.Show("El cliente no esta censado en hacienda o sus datos son incorrectos, por favor reviselo , o no se podra utilizar para enviar le facturas.");
            }
            return censado;
        }
Si el CIF/NIF esta bien estructurado , pero no censado, se usa el tipo IDotro, rellenando todos los campos y estableciendo el idtype en 7, no censado
Código:
idOtro.IDType = PersonaFisicaJuridicaIDTypeType.Item07;
En cuanto a la hora , el numero 2, dan la opcion de consignar Incidencia, para que no tenga en cuenta la hora,
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
Por otro lado, en vuestro caso que rellenais a pelo el xml, deveriais intentar rellenar lo ultimo le Timestamp para que tengais el mayor margen posible.
  #14  
Antiguo 20-10-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Hola, para los casos 2 y 3 hay una solucion propuesta por la misma administracion, porque puede ser perfectamente que un cliente no este censado en hacienda y al reenviarpor un corte seguro estamos fuera, de la hora de generacion fijo.


Para el caso 1 y 3 uso la misma solucion, compruebo la estructura que este bien formado, que no lo haya introducido mal.
Código:
   class verificaDniCif
    {
       public static Boolean valida_NIFCIFNIE(string data)
        {
            if (String.IsNullOrEmpty(data) || data.Length < 8)
                return false;

            var initialLetter = data.Substring(0, 1).ToUpper();
            if (Char.IsLetter(data, 0))
            {
                switch (initialLetter)
                {
                    case "X":
                        data = "0" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    case "Y":
                        data = "1" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    case "Z":
                        data = "2" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    default:
                        if (new Regex("[A-Za-z][0-9]{7}[A-Za-z0-9]{1}$").Match(data).Success)
                            return validadCIF(data);
                        break;
                }
            }
            else if (Char.IsLetter(data, data.Length - 1))
            {
                if (new Regex("[0-9]{8}[A-Za-z]").Match(data).Success || new Regex("[0-9]{7}[A-Za-z]").Match(data).Success)
                    return validarNIF(data);
            }
            return false;
        }

        private static string getLetra(int id)
        {
            Dictionary<int, String> letras = new Dictionary<int, string>();
            letras.Add(0, "T");
            letras.Add(1, "R");
            letras.Add(2, "W");
            letras.Add(3, "A");
            letras.Add(4, "G");
            letras.Add(5, "M");
            letras.Add(6, "Y");
            letras.Add(7, "F");
            letras.Add(8, "P");
            letras.Add(9, "D");
            letras.Add(10, "X");
            letras.Add(11, "B");
            letras.Add(12, "N");
            letras.Add(13, "J");
            letras.Add(14, "Z");
            letras.Add(15, "S");
            letras.Add(16, "Q");
            letras.Add(17, "V");
            letras.Add(18, "H");
            letras.Add(19, "L");
            letras.Add(20, "C");
            letras.Add(21, "K");
            letras.Add(22, "E");
            return letras[id];
        }

        private static bool validarNIF(string data)
        {
            if (data == String.Empty)
                return false;
            try
            {
                String letra;
                letra = data.Substring(data.Length - 1, 1);
                data = data.Substring(0, data.Length - 1);
                int nifNum = int.Parse(data);
                int resto = nifNum % 23;
                string tmp = getLetra(resto);
                if (tmp.ToLower() != letra.ToLower())
                    return false;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
            return true;
        }

        private static bool validadCIF(string data)
        {
            try
            {
                int pares = 0;
                int impares = 0;
                int suma;
                string ultima;
                int unumero;
                string[] uletra = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "0" };
                string[] fletra = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
                int[] fletra1 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
                string xxx;

                /*
                * T      P      P      N  N  N  N  N  C
                Siendo:
                T: Letra de tipo de Organización, una de las siguientes: A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S.
                P: Código provincial.
                N: Númeración secuenial dentro de la provincia.
                C: Dígito de control, un número ó letra: Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0.
                *
                *
                A.    Sociedades anónimas.
                B.    Sociedades de responsabilidad limitada.
                C.    Sociedades colectivas.
                D.    Sociedades comanditarias.
                E.    Comunidades de bienes y herencias yacentes.
                F.    Sociedades cooperativas.
                G.    Asociaciones.
                H.    Comunidades de propietarios en régimen de propiedad horizontal.
                I.    Sociedades civiles, con o sin personalidad jurídica.
                J.    Corporaciones Locales.
                K.    Organismos públicos.
                L.    Congregaciones e instituciones religiosas.
                M.    Órganos de la Administración del Estado y de las Comunidades Autónomas.
                N.    Uniones Temporales de Empresas.
                O.    Otros tipos no definidos en el resto de claves.

                */
                data = data.ToUpper();

                ultima = data.Substring(8, 1);

                int cont = 1;
                for (cont = 1; cont < 7; cont++)
                {
                    xxx = (2 * int.Parse(data.Substring(cont++, 1))) + "0";
                    impares += int.Parse(xxx.ToString().Substring(0, 1)) + int.Parse(xxx.ToString().Substring(1, 1));
                    pares += int.Parse(data.Substring(cont, 1));
                }

                xxx = (2 * int.Parse(data.Substring(cont, 1))) + "0";
                impares += int.Parse(xxx.Substring(0, 1)) + int.Parse(xxx.Substring(1, 1));

                suma = pares + impares;
                unumero = int.Parse(suma.ToString().Substring(suma.ToString().Length - 1, 1));
                unumero = 10 - unumero;
                if (unumero == 10) unumero = 0;

                if ((ultima == unumero.ToString()) || (ultima == uletra[unumero - 1]))
                    return true;
                else
                    return false;

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }
    }
Si esta correcto compruebo el Nif con hacienda usando la opcion de buscar los datos del nif en hacienda.http://www2.agenciatributaria.gob.es...ws/VNifV2.wsdl
Código:
        /// <summary>
        /// Comprueba si un CIF/NIf esta censado
        /// </summary>
        /// <returns>Si o No segun el estado del censo</returns>
        public string Censado()
        {
            string censado = "No";
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            Salida respuestaNif = new Salida();
            Entrada checaNif = new Entrada();
            VNifV2EntContribuyente contribuyente = new VNifV2EntContribuyente();
            contribuyente.Nif = Dni.Text;
            contribuyente.Nombre = Apellido1.Text + " " + Apellido2.Text + " " + nom.Text;
            VNifV2EntContribuyente[] contrib = new VNifV2EntContribuyente[1];
            contrib[0] = contribuyente;
            checaNif.VNifV2Ent = contrib;
            VNifV2Client checa = new VNifV2Client("VNifPort1");
            checa.ClientCredentials.ClientCertificate.Certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Program.certificado, Program.passcertificado);
            checa.ClientCredentials.UseIdentityConfiguration = true;
            checa.ClientCredentials.SupportInteractive = true;
            VNifV2SalContribuyente nifsalida = new VNifV2SalContribuyente();

            var resultado = checa.VNifV2(checaNif);
            if(resultado.VNifV2Sal[0].Resultado == "IDENTIFICADO")
            {
                txtCensado.BackColor = Color.Green;
                censado = "Si";
            }
            else
            {
                txtCensado.BackColor = Color.Red;
                MessageBox.Show("El cliente no esta censado en hacienda o sus datos son incorrectos, por favor reviselo , o no se podra utilizar para enviar le facturas.");
            }
            return censado;
        }
Si el CIF/NIF esta bien estructurado , pero no censado, se usa el tipo IDotro, rellenando todos los campos y estableciendo el idtype en 7, no censado
Código:
idOtro.IDType = PersonaFisicaJuridicaIDTypeType.Item07;
En cuanto a la hora , el numero 2, dan la opcion de consignar Incidencia, para que no tenga en cuenta la hora,
Por otro lado, en vuestro caso que rellenais a pelo el xml, deveriais intentar rellenar lo ultimo le Timestamp para que tengais el mayor margen posible.
Gracias
Ya .as o menos se vé por donde van
Yo antes de enviar voy a comprobar la hora del registro y le meto incidencia si ha pasado por ejemplo 100 segundos, ya veo que si no es muy habitual quenle mandes todo fuera de hora tampoco te van a decir nada.
  #15  
Antiguo 20-10-2024
[email protected] frrr@grupo3rs.c is offline
Miembro
 
Registrado: mar 2024
Posts: 116
Poder: 3
frrr@grupo3rs.c Va por buen camino
Mensaje ERROR devuelto al encapsular el envio de una factura

Estoy intentado enviar el xml de ALTA DE FACTURA, ya no detecta errores, y al enviar ,

ESTAS SON LA PRIMERA LINEAS, SIN EL SOAP ENVELOPE

<sum:RegFactuSistemaFacturacion xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<sum1:Cabecera>
<sum1:ObligadoEmision>
la AEAT responde con :


ESTA ES LA RESPUESTA DE AEAT:

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><env:Fault><faultcode>env:Server</faultcode><faultstring>Codigo[1207].Se esperaba nodo {http://schemas.xmlsoap.org/soap/envelope/}Envelope y ha venido {https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd}RegFactuSistemaFacturacion</faultstring></env:Fault></env:Body></env:Envelope>



Despues de seguir vuestros consejos respecto a encapsular antes de enviar, lo hago y me responde como que tengo error en la huella. ??? :


ESTAS SON LAS LINEAS QUE HE AÑADIDO AL PRINCIPIO
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sum:RegFactuSistemaFacturacion xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<sum1:Cabecera>


Y AL FINAL CIEERO LAS MISMAS

</sum:RegFactuSistemaFacturacion>
</soapenv:Body>
</soapenv:Envelope>

Y ESTA ES LA RESPUESTA DE LA AEAT:


<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body Id="Body"><tikR:RespuestaRegFactuSistemaFacturacion xmlns:tik="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" xmlns:tikR="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/RespuestaSuministro.xsd"><tikR:Cabecera><tik:ObligadoEmision><tik:NombreRazon>HECTOR RAFAEL RODRIGO SANCHEZ</tik:NombreRazon><tik:NIF>33461360V</tik:NIF></tik:ObligadoEmision></tikR:Cabecera><tikR:TiempoEsperaEnvio>60</tikR:TiempoEsperaEnvio><tikR:EstadoEnvio>Incorrecto</tikR:EstadoEnvio><tikR:RespuestaLinea><tikR:IDFactura><tik:IDEmisorFactura>33461360V</tik:IDEmisorFactura><tik:NumSerieFactura>2024</tik:NumSerieFactura><tik:FechaExpedicionFactura>15-10-2024</tik:FechaExpedicionFactura></tikR:IDFactura><tikR:Operacion><tik:TipoOperacion/></tikR:Operacion><tikR:EstadoRegistro>Incorrecto</tikR:EstadoRegistro><tikR:CodigoErrorRegistro>1100</tikR:CodigoErrorRegistro><tikRescripcionErrorRegistro>Valor o tipo incorrecto del campo.: Huella</tikRescripcionErrorRegistro></tikR:RespuestaLinea></tikR:RespuestaRegFactuSistemaFacturacion>
</env:Body></env:Envelope>


Alguien puede orientarme al respecto.
Tema Cerrado


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hijo de Informáticos gluglu Humor 3 13-03-2007 11:05:35
Adictos informaticos ... Trigger Humor 2 11-10-2004 12:18:32
Nosotros los Informáticos Trigger Humor 1 10-10-2004 14:58:09
Patrón de los Informáticos. obiwuan Varios 20 10-09-2003 14:44:54
Chistes Informaticos jhonny Humor 2 11-08-2003 21:59:09


La franja horaria es GMT +2. Ahora son las 00:19:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi