Пример #1
0
 public override Timbre Timbrar(Cfdi cfdi)
 {
     this.RfcEmisor = cfdi.Emisor.RFC;
     this.RfcReceptor = cfdi.Receptor.RFC;
     return this.Timbrar(cfdi.ConstruirXml());
 }
Пример #2
0
            public static string GenerarCadenaOriginal(Cfdi cfdi)
            {
                /*
                    por ahora sólo se tomarán en cuenta los atributos
                    marcados como requeridos, por practicidad y falta
                    de tiempo, aun así la factura debe poder ser
                    timbrada sin ningún problema
                */

                string cad = "||";

                //información del comprobante
                cad += cfdi.Version + "|";
                cad += GetPipeOf(cfdi.Fecha);
                cad += GetPipeOf(cfdi.TipoDeComprobante);
                cad += GetPipeOf(cfdi.FormaDePago);
                cad += GetPipeOf(cfdi.SubTotal);
                cad += GetPipeOf(cfdi.Total);

                //información del emisor
                cad += GetPipeOf(cfdi.Emisor.RFC);
                cad += GetPipeOf(cfdi.Emisor.Nombre);

                cad += GetPipeOf(cfdi.Emisor.Domicilio.Calle);
                cad += GetPipeOf(cfdi.Emisor.Domicilio.Municipio);
                cad += GetPipeOf(cfdi.Emisor.Domicilio.Estado);
                cad += GetPipeOf(cfdi.Emisor.Domicilio.Pais);
                cad += GetPipeOf(cfdi.Emisor.Domicilio.CodigoPostal);

                //información del receptor
                cad += GetPipeOf(cfdi.Receptor.RFC);
                cad += GetPipeOf(cfdi.Receptor.Nombre); //no es obligatorio, pero sin esto (según) el pac devuelve "error de comunicación con backend" :S

                //información de conceptos
                for(int i = 0; i < cfdi.Conceptos.Contar(); i++)
                {
                    Concepto c = cfdi.Conceptos[i];
                    cad += GetPipeOf(c.Cantidad);
                    cad += GetPipeOf(c.Descripcion);
                    cad += GetPipeOf(c.ValorUnitario);
                    cad += GetPipeOf(c.Importe);
                }

                //información de impuestos
                int retentions = cfdi.Impuestos.Retenciones.Contar();
                int traslations = cfdi.Impuestos.Traslados.Contar();

                for(int i = 0; i < retentions; i++)
                {
                    Retencion r = cfdi.Impuestos.Retenciones[i];
                    cad += GetPipeOf(r.Impuesto);
                    cad += GetPipeOf(r.Importe);
                }
                cad += retentions > 0 ? GetPipeOf(cfdi.Impuestos.TotalImpuestosRetenidos) : "";

                for(int i = 0; i < traslations; i++)
                {
                    Traslado t = cfdi.Impuestos.Traslados[i];
                    cad += GetPipeOf(t.Impuesto);
                    cad += GetPipeOf(t.Tasa);
                    cad += GetPipeOf(t.Importe);
                }
                cad += traslations > 0 ? GetPipeOf(cfdi.Impuestos.TotalImpuestosTrasladados) : "";

                cad += "|";
                return cad;
            }
Пример #3
0
            public static string GenerarXml(Cfdi cfdi)
            {
                MemoryStream stream = new MemoryStream();
                System.Text.Encoding encoding = new System.Text.UTF8Encoding();
                XmlTextWriter writer = new XmlTextWriter(stream, encoding);
                writer.WriteStartDocument();

                //settings
                //writer.Namespaces = true;
                string pf = "cfdi";
                string ns = Cfdi.Namespace;

                /*
                    inicio de la generación del xml cfdi v3
                */

                writer.WriteStartElement(pf, "Comprobante", ns);
                writer.WriteAttributeString("version", cfdi.Version);
                writer.WriteAttributeString("fecha", StringOf(cfdi.Fecha));
                writer.WriteAttributeString("tipoDeComprobante", StringOf(cfdi.TipoDeComprobante));
                writer.WriteAttributeString("formaDePago", StringOf(cfdi.FormaDePago));
                writer.WriteAttributeString("subTotal", StringOf(cfdi.SubTotal));
                writer.WriteAttributeString("total", StringOf(cfdi.Total));
                writer.WriteAttributeString("sello", StringOf(cfdi.Sello));
                writer.WriteAttributeString("noCertificado", StringOf(cfdi.NoCertificado));
                writer.WriteAttributeString("certificado", StringOf(cfdi.Certificado));

                //Emisor
                writer.WriteStartElement(pf, "Emisor", ns);
                writer.WriteAttributeString("rfc", StringOf(cfdi.Emisor.RFC));
                writer.WriteAttributeString("nombre", StringOf(cfdi.Emisor.Nombre));

                //Emisor -> Domicilio Fiscal
                writer.WriteStartElement(pf, "DomicilioFiscal", ns);
                writer.WriteAttributeString("calle", StringOf(cfdi.Emisor.Domicilio.Calle));
                writer.WriteAttributeString("municipio", StringOf(cfdi.Emisor.Domicilio.Municipio));
                writer.WriteAttributeString("estado", StringOf(cfdi.Emisor.Domicilio.Estado));
                writer.WriteAttributeString("pais", StringOf(cfdi.Emisor.Domicilio.Pais));
                writer.WriteAttributeString("codigoPostal", StringOf(cfdi.Emisor.Domicilio.CodigoPostal));
                writer.WriteEndElement(); //end of Emisor -> Domicilio Fiscal
                writer.WriteEndElement(); //end of Emisor

                //Receptor
                writer.WriteStartElement(pf, "Receptor", ns);
                writer.WriteAttributeString("rfc", StringOf(cfdi.Receptor.RFC));
                writer.WriteAttributeString("nombre", StringOf(cfdi.Receptor.Nombre)); //no es obligatorio, misma razón que en cadena original
                writer.WriteEndElement(); //end of Receptor

                writer.WriteStartElement(pf, "Conceptos", ns);
                for(int i = 0; i < cfdi.Conceptos.Contar(); i++)
                {
                    Concepto c = cfdi.Conceptos[i];
                    writer.WriteStartElement(pf, "Concepto", ns);
                    writer.WriteAttributeString("cantidad", StringOf(c.Cantidad));
                    writer.WriteAttributeString("descripcion", StringOf(c.Descripcion));
                    writer.WriteAttributeString("valorUnitario", StringOf(c.ValorUnitario));
                    writer.WriteAttributeString("importe", StringOf(c.Importe));
                    writer.WriteEndElement(); //end of every Concepto c
                }
                writer.WriteEndElement(); //end of Conceptos

                int retenciones = cfdi.Impuestos.Retenciones.Contar();
                int traslados = cfdi.Impuestos.Traslados.Contar();

                if(retenciones + traslados > 0)
                {
                    writer.WriteStartElement(pf, "Impuestos", ns);
                    if(retenciones > 0)
                        writer.WriteAttributeString("totalImpuestosRetenidos", StringOf(cfdi.Impuestos.TotalImpuestosRetenidos));
                    if(traslados > 0)
                        writer.WriteAttributeString("totalImpuestosTrasladados", StringOf(cfdi.Impuestos.TotalImpuestosTrasladados));

                    if(retenciones > 0)
                    {
                        writer.WriteStartElement(pf, "Retenciones", ns);
                        for(int i = 0; i < retenciones; i++)
                        {
                            Retencion r = cfdi.Impuestos.Retenciones[i];
                            writer.WriteStartElement(pf, "Retencion", ns);
                            writer.WriteAttributeString("impuesto", StringOf(r.Impuesto));
                            writer.WriteAttributeString("importe", StringOf(r.Importe));
                            writer.WriteEndElement(); //end of every Retencion r
                        }
                        writer.WriteEndElement(); //end of retenciones
                    }

                    if(traslados > 0)
                    {
                        writer.WriteStartElement(pf, "Traslados", ns);
                        for(int i = 0; i < traslados; i++)
                        {
                            Traslado t = cfdi.Impuestos.Traslados[i];
                            writer.WriteStartElement(pf, "Traslado", ns);
                            writer.WriteAttributeString("impuesto", StringOf(t.Impuesto));
                            writer.WriteAttributeString("tasa", StringOf(t.Tasa));
                            writer.WriteAttributeString("importe", StringOf(t.Importe));
                            writer.WriteEndElement(); //end of every Traslado t
                        }
                        writer.WriteEndElement(); //end of traslados
                    }
                    writer.WriteEndElement(); //end of Impuestos
                }

                //checking if it has a 'timbrado'
                if(cfdi.Timbre != null)
                {
                    string t_pf = "tfd";
                    string t_ns = Timbre.Namespace;

                    writer.WriteStartElement(pf, "Complemento", ns);
                    writer.WriteStartElement(t_pf, "TimbreFiscalDigital", t_ns);
                    writer.WriteAttributeString("selloSAT", StringOf(cfdi.Timbre.SelloSat));
                    writer.WriteAttributeString("noCertificadoSAT", StringOf(cfdi.Timbre.NoCertificadoSat));
                    writer.WriteAttributeString("selloCFD", StringOf(cfdi.Timbre.SelloCfd));
                    writer.WriteAttributeString("FechaTimbrado", StringOf(cfdi.Timbre.FechaTimbrado));
                    writer.WriteAttributeString("UUID", StringOf(cfdi.Timbre.UUID));
                    writer.WriteAttributeString("version", StringOf(cfdi.Timbre.Version));
                    writer.WriteEndElement(); //end of TimbreFiscalDigital
                    writer.WriteEndElement(); //end of Complemento
                }

                writer.WriteEndElement(); //end of Comprobante
                writer.Flush();

                /*
                    fin de las operaciones de generación del xml
                */

                StreamReader reader = new StreamReader(stream);
                stream.Position = 0;
                string xml = reader.ReadToEnd();

                writer.Close();
                return xml;
            }
Пример #4
0
            public static Cfdi GenerarCfdi(string xml)
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
                Cfdi cfdi = new Cfdi();
                string prefix = doc.DocumentElement.GetPrefixOfNamespace(Cfdi.Namespace);
                prefix = string.IsNullOrEmpty(prefix) ? "" : prefix + ":";

                //invoice details
                XmlNode invoice = doc.DocumentElement;
                cfdi.TipoDeComprobante = GetAttr(invoice.Attributes["tipoDeComprobante"]);
                cfdi.Total = GetAttrDouble(invoice.Attributes["total"]);
                cfdi.SubTotal = GetAttrDouble(invoice.Attributes["subTotal"]);
                cfdi.Certificado = GetAttr(invoice.Attributes["certificado"]);
                cfdi.NoCertificado = GetAttr(invoice.Attributes["noCertificado"]);
                cfdi.FormaDePago = GetAttr(invoice.Attributes["formaDePago"]);
                cfdi.CondicionesDePago = GetAttr(invoice.Attributes["condicionesDePago"]);
                cfdi.Sello = GetAttr(invoice.Attributes["sello"]);
                cfdi.Fecha = GetAttrDate(invoice.Attributes["fecha"]);
                cfdi.Folio = GetAttrULong(invoice.Attributes["folio"]);

                Contribuyente[] parts = new Contribuyente[2];
                string[] parts_tags = new string[] { "Emisor", "Receptor" };
                parts[0] = cfdi.Emisor;
                parts[1] = cfdi.Receptor;

                //part_node and receiver details

                for(int i = 0; i < parts.Length; i++)
                {
                    XmlNode part_node = GetFirstChild(invoice, prefix + parts_tags[i]);
                    if(part_node != null)
                    {
                        parts[i].Nombre = GetAttr(part_node.Attributes["nombre"]);
                        parts[i].RFC = GetAttr(part_node.Attributes["rfc"]);
                        XmlNode part_addr_node = GetFirstChild(part_node, prefix + "DomicilioFiscal");
                        if(part_addr_node != null)
                        {
                            DomicilioFiscal domicilio = parts[i].Domicilio;
                            domicilio.CodigoPostal = GetAttrInt(part_addr_node.Attributes["codigoPostal"]);
                            domicilio.Pais = GetAttr(part_addr_node.Attributes["pais"]);
                            domicilio.Estado = GetAttr(part_addr_node.Attributes["estado"]);
                            domicilio.Municipio = GetAttr(part_addr_node.Attributes["municipio"]);
                            domicilio.Colonia = GetAttr(part_addr_node.Attributes["colonia"]);
                            domicilio.NoExterior = GetAttrInt(part_addr_node.Attributes["noExterior"]);
                            domicilio.Calle = GetAttr(part_addr_node.Attributes["calle"]);
                        }
                    }
                }

                XmlNode items_node = GetFirstChild(invoice, prefix + "Conceptos");
                if(items_node != null)
                {
                    XmlNodeList items_list = items_node.ChildNodes;
                    for(int i = 0; i < items_list.Count; i++)
                    {
                        XmlNode item_node = items_list[i];
                        if(item_node.Name != prefix + "Concepto")
                            continue;

                        Concepto item = new Concepto();
                        item.Cantidad = GetAttrInt(item_node.Attributes["cantidad"]);
                        item.Descripcion = GetAttr(item_node.Attributes["descripcion"]);
                        item.Importe = GetAttrDouble(item_node.Attributes["importe"]);
                        item.Unidad = GetAttr(item_node.Attributes["unidad"]);
                        item.ValorUnitario = GetAttrDouble(item_node.Attributes["valorUnitario"]);
                        item.NoIdentificacion = GetAttr(item_node.Attributes["noIdentificacion"]);
                        cfdi.Conceptos.Agregar(item);
                    }
                }

                XmlNode taxes_node = GetFirstChild(invoice, prefix + "Impuestos");
                XmlNode retentions_node = null;
                XmlNode traslations_node = null;
                if(taxes_node != null)
                {
                    retentions_node = GetFirstChild(taxes_node, prefix + "Retenciones");
                    traslations_node = GetFirstChild(taxes_node, prefix + "Traslados");
                    cfdi.Impuestos.TotalImpuestosRetenidos = GetAttrDouble(taxes_node.Attributes["totalImpuestosRetenidos"]);
                    cfdi.Impuestos.TotalImpuestosTrasladados = GetAttrDouble(taxes_node.Attributes["totalImpuestosTrasladados"]);
                }

                if(retentions_node != null)
                {
                    XmlNodeList child_nodes = retentions_node.ChildNodes;
                    for(int i = 0; i < child_nodes.Count; i++)
                    {
                        XmlNode t_node = child_nodes[i];
                        if(t_node.Name != prefix + "Retencion")
                            continue;

                        Retencion retencion = new Retencion();
                        retencion.Impuesto = GetAttr(t_node.Attributes["impuesto"]);
                        retencion.Importe = GetAttrDouble(t_node.Attributes["importe"]);
                        cfdi.Impuestos.Retenciones.Agregar(retencion);
                    }
                }

                if(traslations_node != null)
                {
                    XmlNodeList child_nodes = traslations_node.ChildNodes;
                    for(int i = 0; i < child_nodes.Count; i++)
                    {
                        XmlNode t_node = child_nodes[i];
                        if(t_node.Name != prefix + "Traslado")
                            continue;

                        Traslado traslado = new Traslado();
                        traslado.Impuesto = GetAttr(t_node.Attributes["impuesto"]);
                        traslado.Importe = GetAttrDouble(t_node.Attributes["importe"]);
                        traslado.Tasa = GetAttrDouble(t_node.Attributes["tasa"]);
                        cfdi.Impuestos.Traslados.Agregar(traslado);
                    }
                }

                return cfdi;
            }
Пример #5
0
 public static bool Validar(Cfdi cfdi)
 {
     return Validar(cfdi.ConstruirXml());
 }
Пример #6
0
 public abstract Timbre Timbrar(Cfdi cfdi);