Beispiel #1
0
        public string getXML(Comprobante cfdi, string key, string pass, string cert, string nombre_archivo, string ruta_archivo, int inodosOrig = -1, bool bAcreditamientoIEPS10 = false, bool bPROFACT_SERVISIM = true)
        {
            XmlNode root;
            if (bAcreditamientoIEPS10)
                root = createDocument("Comprobante", "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.sat.gob.mx/acreditamiento http://www.sat.gob.mx/sitio_internet/cfd/acreditamiento/AcreditamientoIEPS10.xsd");
            else
                root = createDocument("Comprobante", "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd");

            addStringAttribute(root, "xmlns:tfd", "http://www.sat.gob.mx/TimbreFiscalDigital");

            addStringAttribute(root, "version", cfdi.version);
            addStringAttribute(root, "serie", cfdi.serie);
            addStringAttribute(root, "folio", cfdi.folio);
            addDateAttribute(root, "fecha", cfdi.fecha);
            addStringAttribute(root, "formaDePago", cfdi.formaDePago);
            addStringAttribute(root, "condicionesDePago", cfdi.condicionesDePago);
            addDoubleAttribute(root, "subTotal", cfdi.subTotal, true);
            addDoubleAttribute(root, "descuento", cfdi.descuento, false);
            addStringAttribute(root, "motivoDescuento", cfdi.motivoDescuento);
            addStringAttribute(root, "TipoCambio", cfdi.tipoCambio);
            addStringAttribute(root, "Moneda", cfdi.moneda);
            addDoubleAttribute(root, "total", cfdi.total, true);
            addStringAttribute(root, "tipoDeComprobante", cfdi.tipoDeComprobante);
            addStringAttribute(root, "metodoDePago", cfdi.metodoDePago);
            addStringAttribute(root, "LugarExpedicion", cfdi.lugarExpedicion);
            addStringAttribute(root, "NumCtaPago", cfdi.numCtaPago);
            //addStringAttribute(root, "FolioFiscalOrig", cfdi.folioFiscalOrig);
            //addStringAttribute(root, "SerieFolioFiscalOrig", cfdi.serieFolioFiscalOrig);
            // ========================================================================
            // Nuevos campos requerimiento de zambrano
            if (inodosOrig == 1)
            {
                addStringAttribute(root, "SerieFolioFiscalOrig", cfdi.serie);
                addStringAttribute(root, "FolioFiscalOrig", cfdi.folio);
                addDateAttribute(root, "FechaFolioFiscalOrig", cfdi.fecha);
                addDoubleAttribute(root, "MontoFolioFiscalOrig", cfdi.total, true);
            }
            // ========================================================================
            //addDoubleAttribute(root, "MontoFolioFiscalOrig", cfdi.montoFolioFiscalOrig, false);
            //>>> EMISOR
            XmlNode emisor = dom.CreateNode(XmlNodeType.Element, prefix, "Emisor", nameSpace);
            addStringAttribute(emisor, "rfc", cfdi.emisor.rfc);
            addStringAttribute(emisor, "nombre", cfdi.emisor.nombre);

            XmlNode domicilioFiscal = dom.CreateNode(XmlNodeType.Element, prefix, "DomicilioFiscal", nameSpace);
            addStringAttribute(domicilioFiscal, "calle", cfdi.emisor.domicilioFiscal.calle);
            addStringAttribute(domicilioFiscal, "noExterior", cfdi.emisor.domicilioFiscal.noExterior);
            addStringAttribute(domicilioFiscal, "noInterior", cfdi.emisor.domicilioFiscal.noInterior);
            addStringAttribute(domicilioFiscal, "colonia", cfdi.emisor.domicilioFiscal.colonia);
            addStringAttribute(domicilioFiscal, "localidad", cfdi.emisor.domicilioFiscal.localidad);
            addStringAttribute(domicilioFiscal, "referencia", cfdi.emisor.domicilioFiscal.referencia);
            addStringAttribute(domicilioFiscal, "municipio", cfdi.emisor.domicilioFiscal.municipio);
            addStringAttribute(domicilioFiscal, "estado", cfdi.emisor.domicilioFiscal.estado);
            addStringAttribute(domicilioFiscal, "pais", cfdi.emisor.domicilioFiscal.pais);
            addStringAttribute(domicilioFiscal, "codigoPostal", cfdi.emisor.domicilioFiscal.codigoPostal);
            emisor.AppendChild(domicilioFiscal);

            if (cfdi.emisor.expedidoEn != null)
            {
                XmlNode expedidoEn = dom.CreateNode(XmlNodeType.Element, prefix, "ExpedidoEn", nameSpace);
                addStringAttribute(expedidoEn, "calle", cfdi.emisor.expedidoEn.calle);
                addStringAttribute(expedidoEn, "noExterior", cfdi.emisor.expedidoEn.noExterior);
                addStringAttribute(expedidoEn, "noInterior", cfdi.emisor.expedidoEn.noInterior);
                addStringAttribute(expedidoEn, "colonia", cfdi.emisor.expedidoEn.colonia);
                addStringAttribute(expedidoEn, "localidad", cfdi.emisor.expedidoEn.localidad);
                addStringAttribute(expedidoEn, "referencia", cfdi.emisor.expedidoEn.referencia);
                addStringAttribute(expedidoEn, "municipio", cfdi.emisor.expedidoEn.municipio);
                addStringAttribute(expedidoEn, "estado", cfdi.emisor.expedidoEn.estado);
                addStringAttribute(expedidoEn, "pais", cfdi.emisor.expedidoEn.pais);
                addStringAttribute(expedidoEn, "codigoPostal", cfdi.emisor.expedidoEn.codigoPostal);
                emisor.AppendChild(expedidoEn);
            }

            XmlNode regimenFiscal = dom.CreateNode(XmlNodeType.Element, prefix, "RegimenFiscal", nameSpace);
            addStringAttribute(regimenFiscal, "Regimen", cfdi.emisor.regimenFiscal.regimen);
            emisor.AppendChild(regimenFiscal);

            root.AppendChild(emisor);
            //<<< EMISOR

            //>>> RECEPTOR
            XmlNode receptor = dom.CreateNode(XmlNodeType.Element, prefix, "Receptor", nameSpace);
            addStringAttribute(receptor, "rfc", cfdi.receptor.rfc);
            addStringAttribute(receptor, "nombre", cfdi.receptor.nombre);

            if (cfdi.receptor.domicilio != null)
            {
                XmlNode domicilio = dom.CreateNode(XmlNodeType.Element, prefix, "Domicilio", nameSpace);
                addStringAttribute(domicilio, "calle", cfdi.receptor.domicilio.calle);
                addStringAttribute(domicilio, "noExterior", cfdi.receptor.domicilio.noExterior);
                addStringAttribute(domicilio, "noInterior", cfdi.receptor.domicilio.noInterior);
                addStringAttribute(domicilio, "colonia", cfdi.receptor.domicilio.colonia);
                addStringAttribute(domicilio, "localidad", cfdi.receptor.domicilio.localidad);
                addStringAttribute(domicilio, "referencia", cfdi.receptor.domicilio.referencia);
                addStringAttribute(domicilio, "municipio", cfdi.receptor.domicilio.municipio);
                addStringAttribute(domicilio, "estado", cfdi.receptor.domicilio.estado);
                addStringAttribute(domicilio, "pais", cfdi.receptor.domicilio.pais);
                addStringAttribute(domicilio, "codigoPostal", cfdi.receptor.domicilio.codigoPostal);
                receptor.AppendChild(domicilio);
            }

            root.AppendChild(receptor);
            //<<< RECEPTOR

            //>>> CONCEPTOS
            XmlNode conceptos = dom.CreateNode(XmlNodeType.Element, prefix, "Conceptos", nameSpace);

            Concepto objConcepto = null;
            for (int I = 0; I < cfdi.getConceptosCount(); I++)
            {
                XmlNode concepto = dom.CreateNode(XmlNodeType.Element, prefix, "Concepto", nameSpace);
                objConcepto = cfdi.getConcepto(I);
                addDoubleAttribute(concepto, "cantidad", objConcepto.cantidad, true);
                addStringAttribute(concepto, "unidad", objConcepto.unidad);
                addStringAttribute(concepto, "noIdentificacion", objConcepto.noIdentificacion);
                addStringAttribute(concepto, "descripcion", objConcepto.descripcion);
                addDoubleAttribute(concepto, "valorUnitario", objConcepto.valorUnitario, true);
                addDoubleAttribute(concepto, "importe", objConcepto.importe, true);

                if (bAcreditamientoIEPS10 && objConcepto.complementoConcepto != null)
                {
                    XmlNode xeCC = dom.CreateNode(XmlNodeType.Element, prefix, "ComplementoConcepto", nameSpace);

                    XmlNode xeCCDetalle = dom.CreateNode(XmlNodeType.Element, "aieps", "acreditamientoIEPS", @"http://www.sat.gob.mx/acreditamiento");
                    addStringAttribute(xeCCDetalle, "Version", objConcepto.complementoConcepto.Version);
                    addStringAttribute(xeCCDetalle, "TAR", objConcepto.complementoConcepto.TAR);

                    xeCC.AppendChild(xeCCDetalle);
                    concepto.AppendChild(xeCC);
                }

                conceptos.AppendChild(concepto);
            }

            root.AppendChild(conceptos);
            //<<< CONCEPTOS

            //>>> IMPUESTOS
            XmlNode impuestos = dom.CreateNode(XmlNodeType.Element, prefix, "Impuestos", nameSpace);
            //RETENCIONES
            if (cfdi.impuestos.getRetencionesCount() > 0)
            {
                XmlNode retenciones = dom.CreateNode(XmlNodeType.Element, prefix, "Retenciones", nameSpace);
                Retencion objRetencion = null;
                for (int I = 0; I < cfdi.impuestos.getRetencionesCount(); I++)
                {
                    XmlNode Retencion = dom.CreateNode(XmlNodeType.Element, prefix, "Retencion", nameSpace);
                    objRetencion = cfdi.impuestos.getRetencion(I);
                    addStringAttribute(Retencion, "impuesto", objRetencion.impuesto);
                    addDoubleAttribute(Retencion, "importe", objRetencion.importe, true);
                    retenciones.AppendChild(Retencion);
                }
                impuestos.AppendChild(retenciones);
            }
            //TRASLADOS
            if (cfdi.impuestos.getTrasladosCount() > 0)
            {
                XmlNode traslados = dom.CreateNode(XmlNodeType.Element, prefix, "Traslados", nameSpace);
                Traslado objTraslado = null;
                for (int I = 0; I < cfdi.impuestos.getTrasladosCount(); I++)
                {
                    XmlNode Traslado = dom.CreateNode(XmlNodeType.Element, prefix, "Traslado", nameSpace);
                    objTraslado = cfdi.impuestos.getTraslado(I);
                    addStringAttribute(Traslado, "impuesto", objTraslado.impuesto);
                    addDoubleAttribute(Traslado, "tasa", objTraslado.tasa, true);
                    addDoubleAttribute(Traslado, "importe", objTraslado.importe, true);
                    traslados.AppendChild(Traslado);
                }
                impuestos.AppendChild(traslados);
            }

            addDoubleAttribute(impuestos, "totalImpuestosRetenidos", cfdi.impuestos.totalImpuestosRetenidos, false);
            addDoubleAttribute(impuestos, "totalImpuestosTrasladados", cfdi.impuestos.totalImpuestosTrasladados, false);
            root.AppendChild(impuestos);
            //<<< IMPUESTOS

            //>>> Certificado

            addStringAttribute(root, "noCertificado", Crypto.obtenerNumeroCertificado(cert));
            addStringAttribute(root, "certificado", Convert.ToBase64String(File.ReadAllBytes(cert), Base64FormattingOptions.None));

            //<<< Certificado

            dom.AppendChild(root);

            //>>> Sello
            if (!bPROFACT_SERVISIM)
            {
                byte[] original = getOriginalString(@"C:\SAT\xslt\cadenaoriginal_3_2.xslt");
                //System.Diagnostics.Debug.WriteLine(Encoding.UTF8.GetString(original));

                //string digestion = Crypto.obtenerSHA1(original);
                //System.Diagnostics.Debug.WriteLine(digestion);

                string sello = Crypto.obtenerSelloDigital(original, key, pass);
                //System.Diagnostics.Debug.WriteLine(sello);

                addStringAttribute(root, "sello", sello);
            }
            insertarAddenda();//? en vb esta comentado

            //<<< Sello
            return dom.OuterXml;
        }