miércoles, 4 de diciembre de 2013

Proyecto Tipo de Cambio SUNAT - Perú

Acabo de subir un proyecto a CODEPLEX que muestra como poder obtener el tipo de cambio SUNAT desde su pagina web. Esto mediante la lectura del HTML de su misma web de SUNAT y obtener los valores de cambio de soles a dolares y viceversa.

El proyecto esta desarrollado en el lenguaje C# con visual studio 2010 y es del tipo formularios windows.

La pagina web del tipo de cambio SUNAT la cual extraigo los datos
http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias

El proyecto en CODEPLEX que lee los datos de SUNAT esta en la siguiente dirección
https://tcsunatperu.codeplex.com/

Anteriormente subí una publicación donde detallo como se obtiene los datos de la web de SUNAT
http://r3xet.blogspot.com/2013/12/obtener-el-tipo-de-cambio-de-sunat-del.html

Sáquenle provecho y compartan el conocimiento que es gratis.

lunes, 2 de diciembre de 2013

Obtener el tipo de cambio de SUNAT del mes actual con C#

Después de varios meses de inactividad en el blog, quisiera compartir con todos el código para poder obtener el tipo de cambio del mes desde la web de SUNAT que es tan útil para conversiones de moneda sol a dolar en temas tributarios.

Primero tengo que obtener la librería HtmlAgilityPack que nos ayudara a manejar el HTML de la pagina web de SUNAT (http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias). Para esto, descargamos la versión 1.4.6 de la pagina web del proyecto https://htmlagilitypack.codeplex.com/. Posteriormente, lo importamos como referencia en nuestro proyecto.


Ahora nos toca implementar el código que se encargará de conectarse a la pagina web y obtener el documento HTML.

string sUrl = "http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias";
 
Encoding objEncoding = Encoding.GetEncoding("ISO-8859-1");
WebProxy objWebProxy = new WebProxy("proxy", 80);
CookieCollection objCookies = new CookieCollection();
 
//USANDO GET
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(sUrl);
getRequest.Proxy = objWebProxy;
getRequest.Credentials = CredentialCache.DefaultNetworkCredentials;
getRequest.ProtocolVersion = HttpVersion.Version11;
getRequest.UserAgent = ".NET Framework 4.0";
getRequest.Method = "GET";
 
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(objCookies);
 
Como se puede ver usamos el Httpwebrequest para realizar la petición a la web de SUNAT y con esto deberíamos obtener una respuesta que se cargara en el Httpwebresponse que se muestra continuación.

string sGetResponse = string.Empty;
 
using (HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse())
{
 objCookies = getResponse.Cookies;
 
 using (StreamReader srGetResponse = new StreamReader(getResponse.GetResponseStream(), objEncoding))
 {
  sGetResponse = srGetResponse.ReadToEnd();
 }
}

Se ve que el resultado de la consulta se guarda en la variable sGetResponse y esta contendrá el código HTML de la web de tipo de cambio. Con esta información ya podremos saber cuales son los tipos de cambio de este mes pero nos faltaría obtener los valores de día, venta y compra sin los demás datos redundante del HTML. Para ello, usaremos la librería HtmlAgilityPack que ya tenemos en nuestro proyecto.
//Obtenemos Informacion
HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(sGetResponse);
Como se puede apreciar, se ha cargado la variable sGetResponse, que contiene el código HTML, como  un objeto de tipo HtmlDocument. Con esto ya podemos navegar entre los TAG'S HTML y poder quitar los datos redundante y solo obtener los que necesitamos. Estos datos los colocaremos en una tabla que contendrá 3 columnas (día, compra y venta).
HtmlNodeCollection NodesTr = document.DocumentNode.SelectNodes("//table[@class='class=\"form-table\"']//tr");
if (NodesTr != null)
{
 DataTable dt = new DataTable();
 dt.Columns.Add("Día", typeof(String));
 dt.Columns.Add("Compra", typeof(String));
 dt.Columns.Add("Venta", typeof(String));

 int iNumFila = 0;
 foreach (HtmlNode Node in NodesTr)
 {
  if (iNumFila > 0)
  {
   int iNumColumna = 0;
   DataRow dr = dt.NewRow();
   foreach (HtmlNode subNode in Node.Elements("td"))
   {

    if (iNumColumna == 0) dr = dt.NewRow();

    string sValue = subNode.InnerHtml.ToString().Trim();
    sValue = System.Text.RegularExpressions.Regex.Replace(sValue, "<.*?>", " ");
    dr[iNumColumna] = sValue;

    iNumColumna++;

    if (iNumColumna == 3)
    {
     dt.Rows.Add(dr);
     iNumColumna = 0;
    }
   }
  }
  iNumFila++;
 }

 dt.AcceptChanges();
 this.dgvHtml.DataSource = dt;
 this.dgvHtml.ReadOnly = true;

}
Como se puede apreciar,  se filtra por el TAG
, la cual contiene los datos que necesitamos y procedemos a recorrer la pagina web y extraer los datos que necesitamos colocar en nuestra tabla. El resultado final será esto:


Resultado de web de SUNAT

Resultado de la aplicación después de manipular los datos que queremos mostrar.


Espero que sea tan útil como me sirvió a mi y les dejo el link de los archivos para que puedan descargarlo