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 22-10-2024
[email protected] frrr@grupo3rs.c is offline
Miembro
 
Registrado: mar 2024
Posts: 116
Poder: 3
frrr@grupo3rs.c Va por buen camino
Sabéis si han cambiado algo respecto al calculo de la huella digital. ???

De repente me dice que no coincide.


esto es lo que indica la respuesta de AEAT


DescripcionErrorRegistro>El cálculo de la huella suministrada es incorrecta.
Datos de entrada cálculo huella:
IDEmisorFactura=33461360V&NumSerieFactura=02-2024-13784&FechaExpedicionFactura=21-10-2024&TipoFactura=F1&CuotaTotal=1.81&ImporteTotal=10.45&Huella=C0E0A0F622EFF0A77A41E4 7C13972AEAB8E05A85E81D6B873942238A1A670BC5&FechaHoraHusoGenRegistro=2024-10-22T11:15:05+02:00
Huella calculada: 12EB4A6836E721DB0737F03A04EBDFF73D35B3A3D097F549548F00A259C65AFD
  #2  
Antiguo 22-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por marccabra Ver Mensaje
SI pudieras explicar como haces esto sería genial. Justo ahora obtengo errores al deserializar la respuesta y me vendría bien poderla ver en crudo.

Gracias
Cita:
Empezado por [email protected] Ver Mensaje
Me apunto a la explicacion

Hola, he implementado esta funcion , si la de aeat da error de serializacion o otro no interpretable uso esta.
Código:
       /// <summary>
        /// Envio del registro de la factura a la aeat
        /// </summary>
        /// <param name="facAPresentar">Registro creado con las funciones de la aeat.</param>
        /// <param name="action">Accion a realizar por defecto registro alta</param>
        /// <returns>Devuelve la respuesta completa de la aeat</returns>
        public string consultaAEAT(RegFactuSistemaFacturacion facAPresentar,string action = "RegistroAlta")
        {
            XmlSerializer serializaFactura = new XmlSerializer(typeof(RegFactuSistemaFacturacion));
            string facXml = "";
            using (var xmlw = new StringWriter())
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.Encoding = Encoding.UTF8;

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

            }
            facXml = facXml.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soapenv:Header /> <soapenv:Body >");
            facXml = facXml.Replace("<RegFactuSistemaFacturacion xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">", "<RegFactuSistemaFacturacion xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd\">");
            //facXml = facXml.Replace("</SistemaInformatico>", "</SistemaInformatico> \r\n <FechaHoraHusoGenRegistro xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd\">" + timeStamp +"</FechaHoraHusoGenRegistro>");
            facXml = facXml + " </soapenv:Body> </soapenv:Envelope > ";
            ////////////////////////// <----- Prueba extraccion sin serializar 


            XmlDocument doc = new XmlDocument();

            doc.LoadXml(facXml.Replace("utf-16", "utf-8"));
            HttpWebRequest webRequest = CreateWebRequest("https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP", action);
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            X509Certificate2 certificate = new X509Certificate2(Program.certificado, Program.passcertificado); //requiere estas variables globalescontienen el certificado y su clave
            var tiempo = certificate.SubjectName;
            if (certificate == null)
                throw new ArgumentNullException(
                    "Certificate is null. Maybe serial number in configuration was wrong.");

            if (certificate.NotAfter < DateTime.Now)
                throw new ArgumentNullException(
                  $"Certificate is out of date. NotAfter: {certificate.NotAfter}.");

            webRequest.ClientCertificates.Add(certificate);

            using (Stream stream = webRequest.GetRequestStream())
            {
                doc.Save(stream);
            }

            HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

            string statusDescription = response.StatusDescription;

            Stream dataStream = response.GetResponseStream();

            string responseFromServer;

            using (StreamReader reader = new StreamReader(dataStream))
            {
                responseFromServer = reader.ReadToEnd();
                reader.Close();
                dataStream.Close();
                response.Close();
            }

            return responseFromServer;

            //retorno = client.RegFactuSistemaFacturacion(facAPresentar);
        }
  #3  
Antiguo 22-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Hola, he implementado esta funcion , si la de aeat da error de serializacion o otro no interpretable uso esta.
Código:
       /// <summary>
        /// Envio del registro de la factura a la aeat
        /// </summary>
        /// <param name="facAPresentar">Registro creado con las funciones de la aeat.</param>
        /// <param name="action">Accion a realizar por defecto registro alta</param>
        /// <returns>Devuelve la respuesta completa de la aeat</returns>
        public string consultaAEAT(RegFactuSistemaFacturacion facAPresentar,string action = "RegistroAlta")
        {
            XmlSerializer serializaFactura = new XmlSerializer(typeof(RegFactuSistemaFacturacion));
            string facXml = "";
            using (var xmlw = new StringWriter())
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.Encoding = Encoding.UTF8;

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

            }
            facXml = facXml.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soapenv:Header /> <soapenv:Body >");
            facXml = facXml.Replace("<RegFactuSistemaFacturacion xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">", "<RegFactuSistemaFacturacion xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd\">");
            //facXml = facXml.Replace("</SistemaInformatico>", "</SistemaInformatico> \r\n <FechaHoraHusoGenRegistro xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd\">" + timeStamp +"</FechaHoraHusoGenRegistro>");
            facXml = facXml + " </soapenv:Body> </soapenv:Envelope > ";
            ////////////////////////// <----- Prueba extraccion sin serializar 


            XmlDocument doc = new XmlDocument();

            doc.LoadXml(facXml.Replace("utf-16", "utf-8"));
            HttpWebRequest webRequest = CreateWebRequest("https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP", action);
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            X509Certificate2 certificate = new X509Certificate2(Program.certificado, Program.passcertificado); //requiere estas variables globalescontienen el certificado y su clave
            var tiempo = certificate.SubjectName;
            if (certificate == null)
                throw new ArgumentNullException(
                    "Certificate is null. Maybe serial number in configuration was wrong.");

            if (certificate.NotAfter < DateTime.Now)
                throw new ArgumentNullException(
                  $"Certificate is out of date. NotAfter: {certificate.NotAfter}.");

            webRequest.ClientCertificates.Add(certificate);

            using (Stream stream = webRequest.GetRequestStream())
            {
                doc.Save(stream);
            }

            HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

            string statusDescription = response.StatusDescription;

            Stream dataStream = response.GetResponseStream();

            string responseFromServer;

            using (StreamReader reader = new StreamReader(dataStream))
            {
                responseFromServer = reader.ReadToEnd();
                reader.Close();
                dataStream.Close();
                response.Close();
            }

            return responseFromServer;

            //retorno = client.RegFactuSistemaFacturacion(facAPresentar);
        }
Hola, @rci, perdona no he seleccionado al copiar esto.


Código:
       /// <summary>
        /// Crea la instancia WebRequest para enviar la petición
        /// al web service de la AEAT.
        /// </summary>
        /// <param name="url">Url del web service.</param>
        /// <param name="action">Acción del web service.</param>
        /// <returns></returns>
        private static HttpWebRequest CreateWebRequest(string url, string action)
        {

            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);

            webRequest.Headers.Add("SOAPAction", action);

            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            return webRequest;

        }
simplemente uselo asi
Código:
 string retornoConsulta = consultaAEAT(facAPresentar);

Última edición por bmfranky fecha: 22-10-2024 a las 14:08:16.
  #4  
Antiguo 22-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Poder: 3
bmfranky Va por buen camino
Funcion para pasar el xml generado a la AEAT

Hola, adjunto la funcion en c# par aenviar la consulta a la aeat, sin usar la funcion del xlsd, para evitar los fallos de parseo.
Código:
        /// <summary>
        /// Envio el registro de la factura a la aeat
        /// </summary>
        /// <param name="facAPresentar">Registro creado con las funciones de la aeat.</param>
        /// <param name="certificado">arreglo en bytes que contiene el certificado</param>
        /// <param name="passcertificado">Password necesario para acceder al certificado</param>
        /// <returns>Devuelve la respuesta completa de la aeat</returns>
        public string consultaAEAT(RegFactuSistemaFacturacion facAPresentar,byte[] certificado,string passcertificado)
        {
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            XmlSerializer serializaFactura = new XmlSerializer(typeof(RegFactuSistemaFacturacion));
            string facXml = "";
            using (var xmlw = new StringWriter())
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.Encoding = Encoding.UTF8;

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

            }
            facXml = facXml.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soapenv:Header /> <soapenv:Body >");
            facXml = facXml.Replace("<RegFactuSistemaFacturacion xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">", "<RegFactuSistemaFacturacion xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd\">");
            //facXml = facXml.Replace("</SistemaInformatico>", "</SistemaInformatico> \r\n <FechaHoraHusoGenRegistro xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd\">" + timeStamp +"</FechaHoraHusoGenRegistro>");
            facXml = facXml + " </soapenv:Body> </soapenv:Envelope > ";
            ////////////////////////// <----- Prueba extraccion sin serializar 
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(facXml.Replace("utf-16", "utf-8"));
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP");
            //webRequest.Headers.Add("SOAPAction", action);
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            X509Certificate2 certificate = new X509Certificate2(certificado, passcertificado); //requiere estas variables globalescontienen el certificado y su clave
            var tiempo = certificate.SubjectName;
            if (certificate == null)
                throw new ArgumentNullException(
                    "Certificate is null. Maybe serial number in configuration was wrong.");

            if (certificate.NotAfter < DateTime.Now)
                throw new ArgumentNullException(
                  $"Certificate is out of date. NotAfter: {certificate.NotAfter}.");

            webRequest.ClientCertificates.Add(certificate);

            using (Stream stream = webRequest.GetRequestStream())
            {
                doc.Save(stream);
            }
            HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
            string statusDescription = response.StatusDescription;
            Stream dataStream = response.GetResponseStream();
            string responseFromServer;
            using (StreamReader reader = new StreamReader(dataStream))
            {
                responseFromServer = reader.ReadToEnd();
                reader.Close();
                dataStream.Close();
                response.Close();
            }
            return responseFromServer;
        }
La funcion se encarga de esxtraer el xml , formatearlo como soap y enviarlo con el certificado que pasamos como parametro.
Se usaria asi.
Cita:
string retornoConsulta = consultaAEAT(facAPresentar, Program.certificado, Program.passcertificado);

Ya me comentais si a alguien le ha resultado util.
  #5  
Antiguo 22-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.441
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 bmfranky Ver Mensaje
Ya me comentais si a alguien le ha resultado util.

Gracias por el aporte.
Actualizo el 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.
  #6  
Antiguo 22-10-2024
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 565
Poder: 6
rci Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Hola, adjunto la funcion en c# par aenviar la consulta a la aeat, sin usar la funcion del xlsd, para evitar los fallos de parseo.
....
Ya me comentais si a alguien le ha resultado util.

Muchas gracias bmfranky, de esta forma si puedo obtener el html completo, que en mi caso es una página web de hacienda con el error 403 indicando que hay algún problema con el certificado. a ver si puedo sacar textos limpios para mostrar al usuario.

Saludos
  #7  
Antiguo 22-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por rci Ver Mensaje
Muchas gracias bmfranky, de esta forma si puedo obtener el html completo, que en mi caso es una página web de hacienda con el error 403 indicando que hay algún problema con el certificado. a ver si puedo sacar textos limpios para mostrar al usuario.

Saludos

Hola, puede probar esto, a mi me funciona, me devuelve el codigo de error y el texto del mismo.


Cita:
string retornoConsulta = consultaAEAT(facAPresentar, Program.certificado, Program.passcertificado);
string numError = "";
string CodigoError = "";
Match error = Regex.Match(retornoConsulta, "text-danger\">(.*?)</p>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
if (error.Length > 0)
{
numError = error.Value;
numError = numError.Remove(numError.IndexOf("</h1>"));
numError = numError.Replace("text-danger\">", "");
CodigoError = error.Value;
CodigoError = CodigoError.Remove(0, error.Value.IndexOf("<p>")+3);
CodigoError = CodigoError.Replace("</p>","");
}
MessageBox.Show("Error " + numError + Environment.NewLine + WebUtility.HtmlDecode(CodigoError), "Ha ocurrido un error en la transmision a la AEAT");
  #8  
Antiguo 22-10-2024
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 565
Poder: 6
rci Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Hola, puede probar esto, a mi me funciona, me devuelve el codigo de error y el texto del mismo.
Lo acabo de probar y me funciona. Muchas gracias bmfranky
  #9  
Antiguo 22-10-2024
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 190
Poder: 10
nincillo Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Hola, adjunto la funcion en c# par aenviar la consulta a la aeat, sin usar la funcion del xlsd, para evitar los fallos de parseo.
Código:
        /// <summary>
        /// Envio el registro de la factura a la aeat
        /// </summary>
        /// <param name="facAPresentar">Registro creado con las funciones de la aeat.</param>
        /// <param name="certificado">arreglo en bytes que contiene el certificado</param>
        /// <param name="passcertificado">Password necesario para acceder al certificado</param>
        /// <returns>Devuelve la respuesta completa de la aeat</returns>
        public string consultaAEAT(RegFactuSistemaFacturacion facAPresentar,byte[] certificado,string passcertificado)
        {
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            XmlSerializer serializaFactura = new XmlSerializer(typeof(RegFactuSistemaFacturacion));
            string facXml = "";
            using (var xmlw = new StringWriter())
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.Encoding = Encoding.UTF8;

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

            }
            facXml = facXml.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soapenv:Header /> <soapenv:Body >");
            facXml = facXml.Replace("<RegFactuSistemaFacturacion xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">", "<RegFactuSistemaFacturacion xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd\">");
            //facXml = facXml.Replace("</SistemaInformatico>", "</SistemaInformatico> \r\n <FechaHoraHusoGenRegistro xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd\">" + timeStamp +"</FechaHoraHusoGenRegistro>");
            facXml = facXml + " </soapenv:Body> </soapenv:Envelope > ";
            ////////////////////////// <----- Prueba extraccion sin serializar 
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(facXml.Replace("utf-16", "utf-8"));
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP");
            //webRequest.Headers.Add("SOAPAction", action);
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            X509Certificate2 certificate = new X509Certificate2(certificado, passcertificado); //requiere estas variables globalescontienen el certificado y su clave
            var tiempo = certificate.SubjectName;
            if (certificate == null)
                throw new ArgumentNullException(
                    "Certificate is null. Maybe serial number in configuration was wrong.");

            if (certificate.NotAfter < DateTime.Now)
                throw new ArgumentNullException(
                  $"Certificate is out of date. NotAfter: {certificate.NotAfter}.");

            webRequest.ClientCertificates.Add(certificate);

            using (Stream stream = webRequest.GetRequestStream())
            {
                doc.Save(stream);
            }
            HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
            string statusDescription = response.StatusDescription;
            Stream dataStream = response.GetResponseStream();
            string responseFromServer;
            using (StreamReader reader = new StreamReader(dataStream))
            {
                responseFromServer = reader.ReadToEnd();
                reader.Close();
                dataStream.Close();
                response.Close();
            }
            return responseFromServer;
        }
La funcion se encarga de esxtraer el xml , formatearlo como soap y enviarlo con el certificado que pasamos como parametro.
Se usaria asi.


Ya me comentais si a alguien le ha resultado util.

Hola, estoy planteándome hacer el desarrollo en Delphi o en C# (mundo en el que estoy empezando por completo). ¿Podrías poner un pequeño ejemplo de como una vez importado el wsdl se van inicializando y rellenando los nodos de la factura para posteriormente hacer el envío?. Gracias de antemano.
  #10  
Antiguo 22-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Poder: 3
bmfranky Va por buen camino
Ejemplo paso a paso c#

Código:
               //creamos la factura paso a paso.
                RegFactuSistemaFacturacion facAPresentar = new RegFactuSistemaFacturacion();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

                }

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

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

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


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

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

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

Recuerden al importar el webservice cambiar en reference System.DateTyme por string, hay un fallo al serializar la fecha , incluye milisegundos lo que da error, esta mas o menos explicado.
Simplemente han de cambiar de donde rellenar los campos, y por ejemplo si envian varios registros a la vez tenerlño en cuenta.
  #11  
Antiguo 22-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Poder: 3
bmfranky Va por buen camino
Hola, esta parte de aqui,
Código:
string facXml = "";
                using (var xmlw = new StringWriter())
                {
                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.Indent = true;
                    settings.Encoding = Encoding.UTF8;

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

                }
Es para extraer los registros en texto plano, yo lo uso par ver si se han generado bien los campos, poniendo un punto de interrupcion miramos la variable facXml
  #12  
Antiguo 23-10-2024
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 190
Poder: 10
nincillo Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Código:
               //creamos la factura paso a paso.
                RegFactuSistemaFacturacion facAPresentar = new RegFactuSistemaFacturacion();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

                }

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

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

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


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

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

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

Recuerden al importar el webservice cambiar en reference System.DateTyme por string, hay un fallo al serializar la fecha , incluye milisegundos lo que da error, esta mas o menos explicado.
Simplemente han de cambiar de donde rellenar los campos, y por ejemplo si envian varios registros a la vez tenerlño en cuenta.
Muchas gracias compañero voy a ver si lo consigo poner en marcha. Es el plan "C" que tengo pensado si no lo consigo con el Delphi 2007 ni con el 2022.
  #13  
Antiguo 22-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por [email protected] Ver Mensaje
Sabéis si han cambiado algo respecto al calculo de la huella digital. ???

De repente me dice que no coincide.


esto es lo que indica la respuesta de AEAT


DescripcionErrorRegistro>El cálculo de la huella suministrada es incorrecta.
Datos de entrada cálculo huella:
IDEmisorFactura=33461360V&amp;NumSerieFactura=02-2024-13784&amp;FechaExpedicionFactura=21-10-2024&amp;TipoFactura=F1&amp;CuotaTotal=1.81&amp;ImporteTotal=10.45&amp;Huella=C0E0A0F622EFF0A77A41E4 7C13972AEAB8E05A85E81D6B873942238A1A670BC5&amp;FechaHoraHusoGenRegistro=2024-10-22T11:15:05+02:00
Huella calculada: 12EB4A6836E721DB0737F03A04EBDFF73D35B3A3D097F549548F00A259C65AFD
Esta teniendo en cuaenta la huella anteriormente enviada? , me he dado cuenta que desde ayer si la tienen en cuenta, antes no calculaban ellos sobre el registro que tenian anterior de huella , ahora si.
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 22:49:53.


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