- CFDI 3.3
- CFDI 4.0
- .Net Framework 4.5 o superior
Instalar la libreria a traves Package Manager Console nuget.org
Install-Package SW-Tools
En caso de no utilizar Package Manager Console puedes descargar la libreria directamente a traves del siguiente link y agregarla como referencia local a tu proyecto. Asegurate de utilizar la ultima version publicada.
Puedes generar un xml en su versión 3.3 de tipo ingreso/egreso así como tambien realizar el sellado para ser timbrado. Puedes consultar más ejemplos en UT Tools
using SW.Tools.Services.Sign;
using System;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Se construye el xml añadiendo los valores de cada atributo mediante objetos
Tools.Entities.Comprobante comprobante = new Tools.Entities.Comprobante();
comprobante.SetComprobante("MXN", "I", "01", "PPD", "20000");
comprobante.SetConcepto(1, "84131500", "ZZ", "Prima neta", "1", "NO APLICA", 3592.83m);
comprobante.SetConceptoImpuestoTraslado(0.160000m, "Tasa", "002", 3592.83m);
comprobante.SetConcepto(1, "84131500", "ZZ", "Recargo por pago fraccionado", "1", "NO APLICA", 258.68m);
comprobante.SetConceptoImpuestoTraslado(0.160000m, "Tasa", "002", 258.68m);
comprobante.SetConcepto(1, "84131500", "ZZ", "derecho de poliza", "1", "NO APLICA", 550.00m);
comprobante.SetConceptoImpuestoTraslado(0.160000m, "Tasa", "002", 550.00m);
comprobante.SetEmisor("EKU9003173C9", "ACCEM SERVICIOS EMPRESARIALES SC", "601");
comprobante.SetReceptor("XAXX010101000", "MIGUEL LANGARKA GENESTA", "G03");
var invoice = comprobante.GetComprobante();
var xmlInvoice = Tools.Helpers.Serializer.SerializeDocument(invoice);
xmlInvoice = SignInvoice(xmlInvoice);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Puedes generar un xml en su versión 4.0 de tipo ingreso/egreso así como tambien realizar el sellado para ser timbrado. Puedes consultar más ejemplos en UT Tools
using SW.Tools.Services.Sign;
using System;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Se construye el xml añadiendo los valores de cada atributo mediante objetos
Comprobante comprobante = new Comprobante();
comprobante.SetComprobante("MXN", "I", "99", "PPD", "20000", "01");
comprobante.SetConcepto(1, "84131500", "ZZ", "Prima neta", "1", "NO APLICA", 3592.83m, "02", 3592.83m);
comprobante.SetConceptoImpuestoTraslado("Tasa", "002", 3592.83m, 0.160000m, 574.85m);
comprobante.SetConcepto(1, "84131500", "ZZ", "Recargo por pago fraccionado", "1", "NO APLICA", 258.68m, "02", 258.68m);
comprobante.SetConceptoImpuestoTraslado("Tasa", "002", 258.68m, 0.160000m, 41.38m);
comprobante.SetConcepto(1, "84131500", "ZZ", "derecho de poliza", "1", "NO APLICA", 550.00m, "02", 550.00m);
comprobante.SetConceptoImpuestoTraslado("Tasa", "002", 550.00m, 0.160000m, 88.00m);
comprobante.SetEmisor("EKU9003173C9", "ESCUELA KEMPER URGATE", "601");
comprobante.SetReceptor("URE180429TM6", "UNIVERSIDAD ROBOTICA ESPAÑOLA", "G01", "65000", "601");
var invoice = comprobante.GetComprobante();
var xmlInvoice = SerializerCfdi40.SerializeDocument(invoice);
xmlInvoice = SignInvoice(xmlInvoice); ;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Puedes generar un xml en su versión 4.0 con su complementeo de pagos 2.0, así como tambien realizar el sellado para ser timbrado. Puedes consultar más ejemplos en UT Tools
using SW.Tools.Services.Sign;
using SW.Tools.Entities.Complementos;
using System;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Se construye el xml añadiendo los valores de cada atributo mediante objetos
SW.Tools.Cfdi.Complementos.Pagos20.Pagos pago = new SW.Tools.Cfdi.Complementos.Pagos20.Pagos();
pago.SetPago("01", null, DateTime.Now, null, "MXN", 200.00m, null, null, null, null, 1m);
pago.SetDoctoRelacionado(null, null, "bfc36522-4b8e-45c4-8f14-d11b289f9eb7",
"MXN", "1", "01", 1m, 200.00m, 200.00m, 0.00m);
pago.SetEmisor("EKU9003173C9", "ESCUELA KEMPER URGATE", "601");
pago.SetReceptor("JUFA7608212V6", "ADRIANA JUAREZ FERNANDEZ", "29133", "606");
pago.SetTotales("200.00");
var invoice = pago.GetInvoice("99056", "01", "01", "A", "1");
var xmlInvoice = SW.Tools.Helpers.SerializerCfdi40.SerializeDocument(invoice);
xmlInvoice = SignInvoice(xmlInvoice);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Una vez construido el xml con todos sus nodos y atributos puedes realizar el sellado del mismo con la siguiente fucnión:
- xml 3.3
- PFX en Base64
- Password del archivo key
using SW.Tools.Services.Sign;
using System.IO;
using System;
using System.Text;
using System.Xml;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Se construye el xml añadiendo los valores de cada atributo mediante objetos
byte[] bytesCer = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.cer");
byte[] bytesKey = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.key");
string password = "12345678a";
var pfx = Sign.CrearPFX(bytesCer, bytesKey, password);
var xml = Fiscal.RemoverCaracteresInvalidosXml(Encoding.UTF8.GetString(File.ReadAllBytes(@"Resources\cfdi33.xml")));
var xmlResult = Sign.SellarCFDIv33(pfx, password, xml);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlResult);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Una vez construido el xml con todos sus nodos y atributos puedes realizar el sellado del mismo con la siguiente fucnión:
- xml 4.0
- PFX en Base64
- Password del archivo key
using SW.Tools.Services.Sign;
using System.IO;
using System;
using System.Text;
using System.Xml;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
byte[] bytesCer = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.cer");
byte[] bytesKey = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.key");
string password = "12345678a";
var pfx = Sign.CrearPFX(bytesCer, bytesKey, password);
var xml = Fiscal.RemoverCaracteresInvalidosXml(Encoding.UTF8.GetString(File.ReadAllBytes(@"Resources\cfdi40.xml")));
var xmlResult = Sign.SellarCFDIv40(pfx, password, xml);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlResult);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Una vez construido el xml con todos sus nodos y atributos puedes realizar el sellado del mismo con la siguiente fucnión:
- xml retenciones 2.0
- PFX en Base64
- Password del archivo key
using SW.Tools.Services.Sign;
using System.IO;
using System;
using System.Text;
using System.Xml;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
byte[] bytesCer = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.cer");
byte[] bytesKey = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.key");
string password = "12345678a";
var pfx = Sign.CrearPFX(bytesCer, bytesKey, password);
var xml = Fiscal.RemoverCaracteresInvalidosXml(Encoding.UTF8.GetString(File.ReadAllBytes(@"Resources\retencion20.xml")));
var xmlResult = Sign.SellarRetencionv20(pfx, password, xml);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlResult);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Puedes construir y sellar un xml de cancelación incluyendo el/los UUID a cancelar.
- Folios (UUID, motivo, foliosustitucion)
- RFC emisor
- PFX en Base64
- Password del archivo key
using SW.Tools.Services.Sign;
using System;
using System.Xml;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Puedes agregar hasta 1000 folios
var pfx = Sign.CrearPFX(build.BytesCer, build.BytesKey, build.CerPassword);
List<Cancelacion> folios = new List<Cancelacion>();
folios.Add(new Cancelacion()
{
Folio = Guid.Parse("b6a15ce8-0fb8-401a-bfe7-8930983e182e"),
Motivo = CancelacionMotivo.Motivo01,
FolioSustitucion = Guid.Parse("63187375-3433-4ae8-ad5a-3323872026fc")
});
folios.Add(new Cancelacion()
{
Folio = Guid.Parse("63187375-3433-4ae8-ad5a-3323872026fc"),
Motivo = CancelacionMotivo.Motivo02
});
var xml = Sign.SellarCancelacion(folios, build.RfcEmisor, pfx, build.CerPassword);
Cancelation cancelation = new Cancelation(build.Url, build.Token);
var cancelacion = cancelation.CancelarByXML(Encoding.UTF8.GetBytes(xml));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Cuando requieras aceptar o rechazar una o más cancelaciones puedes generar el xml de aceptación/rechazo.
- Folios (UUID, Respuesta)
- RFC emisor
- Password del archivo key
using SW.Tools.Services.Sign;
using System;
using System.Xml;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
var pfx = Sign.CrearPFX(_build.BytesCer, _build.BytesKey, _build.CerPassword);
List<AceptacionRechazo> folios = new List<AceptacionRechazo>();
folios.Add(new AceptacionRechazo()
{
Folio = Guid.Parse("FD74D156-B9B0-44A5-9906-E08182E8363E"),
Respuesta = AceptacionRechazoRespuesta.Aceptacion
});
var result = Sign.SellarAceptacionRechazo(folios, _build.RfcEmisor, pfx, _build.CerPassword);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Mediante esta función pudes consultar si un RFC es válido o no, esta función no es una consulta a la LCO ni retorna ningún dato e información del RFC a consultar. La función recibe los siguientes paramétros:
- RFC emisor
using System;
using SW.Tools.Services.Fiscal;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Llamamos a la función indicandole como parámetro el RFC a validar
var result = Fiscal.ValidarRfc("COSE860610K59");
Console.WriteLine(result);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Para calcular el número de semanas en que el empleado ha mantenido relación laboral con el empleador puedes utilizar la siguiente función. Los parametros que recibe son:
- Fecha de inicio laboral
- Fecha fin de pago
using System;
using SW.Tools.Services.Fiscal;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Definimos las variables de inicio y de fin
string dateFrom = "01/08/2008";
DateTime dtFrom = Convert.ToDateTime(dateFrom);
string dateTo = "01/08/2008";
DateTime dtTo = Convert.ToDateTime(dateTo);
var result = Fiscal.AntiguedadSemanas(dtFrom, dtTo);
Console.WriteLine(result);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Para calcular el el periodo de años, meses y días (año calendario) en que el empleado ha mantenido relación laboral con el empleador puedes utilizar la siguiente función. Los parametros que recibe son:
- Fecha de inicio laboral
- Fecha fin de pago
using System;
using SW.Tools.Services.Fiscal;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//Definimos las variables de inicio y de fin
string dateFrom = "01/08/2008";
DateTime dtFrom = Convert.ToDateTime(dateFrom);
string dateTo = "01/08/2008";
DateTime dtTo = Convert.ToDateTime(dateTo);
var result = Fiscal.AntiguedadAnosMesesDias(dtFrom, dtTo);
Console.WriteLine(result);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Puedes generar un archivo PFX mediante tus CSD con la siguiente fución, Los parámetros a recibir son:
- Certificado (.cer) en Base64
- Key (.key) en Base64
- Password del archivo key
using System;
using System.IO;
using System.Text;
using SW.Tools.Services.Sign;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
byte[] bytesCer = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.cer");
byte[] bytesKey = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.key");
string password = "12345678a";
var pfx = Sign.CrearPFX(bytesCer, bytesKey, password);
Console.WriteLine(result);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Mediante la siguiente función podrás validar si un certificado(.cer) es de tipo FIEL o de tipo CSD.
- Certificado (.cer) en Base64
- Key (.key) en Base64
- Password del archivo key
using System;
using System.IO;
using System.Text;
using SW.Tools.Services.Certificate;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//La función retornará una respuesta indicando si es de tipo CSD o FIEL
//Es necesario convertir el archivo .cer a base64
byte[] bytesCer = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.cer");
var result = Certificate.VerificarTipoCertificado(bytesCer);
Console.WriteLine(result);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Puedes leer un certificado(.cer) para obtener los detalles del mismo como:
- Número de serie
- Autoridad de certificación
- Nombre del certificado
- Número de certificado
using System;
using System.IO;
using System.Text;
using SW.Tools.Services.Certificate;
namespace ExampleSDK
{
class Program
{
static void Main(string[] args)
{
try
{
//La función recibe como parámetro el certificado en base64
byte[] bytesCer = File.ReadAllBytes(@"Resources\CSD_Pruebas_CFDI_EKU9003173C9.cer");
var result = Certificate.LeerCertificado(bytesCer);
Console.WriteLine(result.data.serialNumber);
Console.WriteLine(result.data.issuer);
Console.WriteLine(result.data.certificateNumber);
Console.WriteLine(result.data.commonName);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
- Aeyrton Villalobos Sánchez - SwAeyrton.
- David Ernesto Reyes Ayala - ReyesSW.
- Martin Flores Navarrete - martinfnsw.