Si estas en Ecuador y quieres implementar la facturación electrónica en tu aplicación de Visual Studio, comprobarás que la documentación y las herramientas son un poco tediosas de buscar en la web.
¿Por dónde empezar?
Debes considerar algo tan simple como los siguientes resúmenes de los resúmenes que he investigado:
- La "factura electrónica" es un fichero XML firmado digitalmente.
- Lo mas fácil es tener que generar ese XML sin firmar.
- Se complica un poco al firmar XAdES-BES (aunque de hecho es el estándar mas básico)
- Se complica un poco si no conoces Java y deseas utilizar la librería MITyC (Ministerio de Industria, Energía y Turismo del gobierno de España)
- El punto 4 lo he visto por todas partes en Ecuador, así que creo que la mayoría del país la usa.
- Se complica un poco integrar C# y Java
- Es sencillo consumir un webservice del SRI desde C#
- Si llegaste hasta el punto 7 nose que haces leyendo este blog.
Si no lograste llegar hasta el punto 8 entonces deberías leer lo que sigue:
- Para poder firmar el XML, necesitas un certificado digital expedido por una entidad certificadora reconocida en el País.
- Una vez tengas el certificado (fichero en formato *.cer para el caso de Ecuador) lo siguiente es el tema de la firma XAdES-BES, lo cual para el caso de los proyectos en Visual Studio, una de las soluciones mas comunes es complicarse con java.
- Una busqueda rapida en internet te dara las librerias MITyC las cuales estan escritas en java.
- Otra busqueda rapida en internet te dara un ejemplo sencillo de como usar esta libreria para firmar un documento xml.
- De aquí viene varias alternativas, para este blog solo mencionare una:
- Crear un programa java que reciba parámetros de entrada ( como por ejemplo: rutas,archivo xml,certificado,claves,etc) y devuelva el resultado de lo firmado y después usar IKVM.NET para convertir ese programa en un dll para luego referenciarlo en el proyecto de Visual Studio.
En las ayudas de IKVM.NET se muestra como realizar paso a paso vía comando y de forma sencilla esta solución. Para referenciar el objeto dll en el proyecto de C# se lo realiza de la siguiente manera:
using packappjava.com; //esta es la ruta de los package java que contiene la clase
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
AppJava leer = new AppJava(); // este es la clase principla de java
// aqui en adelante va el codigo para enviar y recibir la respuesta de la firma
}
static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
{
return Assembly.LoadFile(@"C:\IKVM.OpenJDK.Core.dll"); // esta es la ruta del core OpenJDK
}
}
- Una vez superado el paso 5 ya lo que falta no es nada complejo. Consumir el Webservice del SRI se lo puede realizar de la siguiente forma:
String envelop = "\"http://schemas.xmlsoap.org/soap/envelope/\"";
String action = "\"http://ec.gob.sri.ws.recepcion/\"";
String base64arch = Convert.ToBase64String(archxml);
string xml = @"<soapenv:Envelope xmlns:soapenv=" + envelop + " xmlns:ec=" + action + ">";
xml = xml + "<soapenv:Header/>";
xml = xml + "<soapenv:Body>";
xml = xml + "<ec:validarComprobante>";
xml = xml + "<xml>" + base64arch + "</xml>";
xml = xml + "</ec:validarComprobante>";
xml = xml + "</soapenv:Body>";
xml = xml + "</soapenv:Envelope>";
byte[] bytes = Encoding.ASCII.GetBytes(xml);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); //url del webservice SRI
request.Method = "POST";
request.ContentLength = bytes.Length;
request.ContentType = "text/xml";
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
Para finalizar solo brindar mi opinión recalcando que el esquema de comprobantes electrónicos es un importante proyecto orientado a la responsabilidad social, ambiental y tributaria. Se obtiene mayor agilidad, simplificación de gestión; otorga integridad y seguridad desde la emisión, entrega y archivado de los comprobantes.
Espero que este post haya sido de mucha ayuda.
2 comentarios:
Auxilio...... en donde y cómo generó
El ride
Estoy enviando al SRI en ambiente de prueba y al ejecutar el codigo, no dice si ha sido exitoso o no. Me podria ayudar agregando lo necesario para darle una respuesta al usuario. Muchas gracias.
Publicar un comentario