public string gfCreaCFDI(string sNombreDB, int iNumeroFactura, int iTipoFacturaNotaCredito, int iNumeroCompania, int iNumeroPersona, string sParametroOpcional)
        {
            CFDIV3_2 dsPF = new CFDIV3_2();



            Parametros objPar = new Parametros();

            if (FacturaController.gfValidaSiEsFactura(sNombreDB, iNumeroFactura, iNumeroCompania.ToString(), iTipoFacturaNotaCredito) > 0)
                FacturaController.gfb_GetDatosGenerales(sNombreDB, iNumeroCompania, iNumeroFactura, iTipoFacturaNotaCredito, ref objPar);
            else
                FacturaController.gfb_GetDatosGenerales(sNombreDB, iNumeroCompania, iNumeroFactura, 1, ref objPar);

            #region Variables
            string sPAC = string.Empty;
            string sTempParam = string.Concat("iNumeroFactura=", iNumeroFactura.ToString(), "|iTipoFacturaNotaCredito=", iTipoFacturaNotaCredito.ToString(), "|sDataBaseName=", sNombreDB, "|iNumeroCompania=", iNumeroCompania.ToString(), "|iNumeroPersona=", iNumeroPersona, "|sParametroOpcional=", sParametroOpcional);
            string sRutaArchivos = string.Empty, sUUID = string.Empty, sPATH = string.Empty, sMensaje = string.Empty, sResultado = string.Empty, sTempPath = string.Empty, strDestino48 = string.Empty;
            string lfservicioQR = "http://zxing.org/w/chart?cht=qr&chs=230x230&chld=L&choe=UTF-8&chl=", strDestino = ConfigurationManager.AppSettings["strDestino"];
            string sReporte_CDFI = string.Empty, sAnio_Mes = string.Empty, sNombre_ArchivoTMP = string.Empty, spathString = string.Empty;
            int icontabilizada = 1, idocumenttype = -59, idocumentinternet = 1, mes = 0, idError = -1;
            DataTable table = new DataTable(), tableadenda = new DataTable(), tablequote = new DataTable();
            string Error = string.Empty, uuid = string.Empty, xmlTimbrado = string.Empty;
            objPar.companynumber = iNumeroCompania;
            objPar.Persona = iNumeroPersona.ToString();
            FacturaController ctrl = new FacturaController();
            ICFD objCFDi = new CFDI32();
            DateTime fechaTimbre = new DateTime();
            bool banderaPAC = false;
            //string sPAC = "PROFACT";
            string noCertificadoSAT = string.Empty;
            string noCertificado = string.Empty;
            string selloSAT = string.Empty;
            string selloCFD = string.Empty;
            string sCbb = string.Empty;
            #endregion
            try
            {
                Comprobante cfdi = new Comprobante();
                cfdi.version = "3.2";
                cfdi.serie = objPar.serie;// sCfdi_Serie;
                cfdi.folio = objPar.folio;
                cfdi.fecha = DateTime.Now;
                cfdi.formaDePago = objPar.formaDePago;
                cfdi.condicionesDePago = objPar.condicionesDePago;
                cfdi.tipoCambio = objPar.tipoCambio;
                cfdi.moneda = objPar.moneda;
                cfdi.tipoDeComprobante = objPar.tipoDeComprobante;
                cfdi.metodoDePago = objPar.metodoDePago;
                cfdi.lugarExpedicion = objPar.lugarExpedicion;
                cfdi.numCtaPago = (objPar.numCtaPago.Length == 3) ? objPar.numCtaPago.PadLeft(4, '0') : objPar.numCtaPago;
                cfdi.emisor.rfc = objPar.emisor_rfc;
                cfdi.emisor.nombre = objPar.emisor_nombre;
                cfdi.emisor.regimenFiscal.regimen = objPar.emisor_regimenFiscal_regimen;
                cfdi.emisor.domicilioFiscal.calle = objPar.emisor_domicilioFiscal_calle;
                cfdi.emisor.domicilioFiscal.colonia = objPar.emisor_domicilioFiscal_colonia;
                cfdi.emisor.domicilioFiscal.municipio = objPar.emisor_domicilioFiscal_municipio;
                cfdi.emisor.domicilioFiscal.estado = objPar.emisor_domicilioFiscal_estado;
                cfdi.emisor.domicilioFiscal.pais = objPar.emisor_expedidoEn_pais;
                cfdi.emisor.domicilioFiscal.codigoPostal = objPar.emisor_domicilioFiscal_codigoPostal;
                /********************************************************************/
                //Comprobante 
                //INTEGRAReports.dsPersonasFisicas dsPF = new dsPersonasFisicas();
                DataRow _comprobante = dsPF.Comprobante.NewRow();
                _comprobante["version"] = "3.2";
                _comprobante["serie"] = objPar.serie;
                _comprobante["folio"] = objPar.folio;
                _comprobante["fecha"] = DateTime.Now.ToString("dd'/'MM'/'yyyy HH:mm:ss");
                _comprobante["formaDePago"] = objPar.formaDePago;
                _comprobante["condicionesDePago"] = objPar.condicionesDePago;
                _comprobante["tipoCambio"] = objPar.tipoCambio;
                _comprobante["moneda"] = objPar.moneda;
                _comprobante["tipoDeComprobante"] = objPar.tipoDeComprobante.ToUpper();
                _comprobante["metodoDePago"] = objPar.metodoDePago;
                _comprobante["lugarExpedicion"] = objPar.lugarExpedicion;
                _comprobante["numCtaPago"] = objPar.numCtaPago;

                /********************************************************************/
                //Emisor
                DataRow _emisor = dsPF.Emisor.NewRow();
                _emisor["rfc"] = objPar.emisor_rfc;
                _emisor["nombre"] = objPar.emisor_nombre;
                objPar.emisor_logo = objPar.emisor_logo.Replace(@ConfigurationManager.AppSettings["emisor_logo_Origen"], @ConfigurationManager.AppSettings["emisor_logo_Destino"]);
                _emisor["logo"] = objPar.emisor_logo;
                dsPF.Emisor.Rows.Add(_emisor);
                /********************************************************************/
                //Emisor regimenFiscal
                DataRow _regimenFiscal = dsPF.RegimenFiscal.NewRow();
                _regimenFiscal["Regimen"] = objPar.emisor_regimenFiscal_regimen;
                dsPF.RegimenFiscal.Rows.Add(_regimenFiscal);
                /********************************************************************/
                //Emisor domicilioFiscal
                DataRow _domicilioFiscal = dsPF.DomicilioFiscal.NewRow();
                _domicilioFiscal["calle"] = objPar.emisor_domicilioFiscal_calle;
                _domicilioFiscal["colonia"] = objPar.emisor_domicilioFiscal_colonia;
                _domicilioFiscal["municipio"] = objPar.emisor_domicilioFiscal_municipio;
                _domicilioFiscal["estado"] = objPar.emisor_domicilioFiscal_estado;
                _domicilioFiscal["pais"] = objPar.emisor_domicilioFiscal_pais;
                _domicilioFiscal["codigoPostal"] = objPar.emisor_domicilioFiscal_codigoPostal;
                dsPF.DomicilioFiscal.Rows.Add(_domicilioFiscal);
                /********************************************************************/
                if (objPar.emisor_expedidoEn_calle != "")
                {
                    cfdi.emisor.expedidoEn = new Ubicacion();
                    cfdi.emisor.expedidoEn.calle = objPar.emisor_expedidoEn_calle;
                    cfdi.emisor.expedidoEn.noExterior = objPar.emisor_expedidoEn_noExterior;
                    cfdi.emisor.expedidoEn.noInterior = objPar.emisor_expedidoEn_noInterior;
                    cfdi.emisor.expedidoEn.colonia = objPar.emisor_expedidoEn_colonia;
                    cfdi.emisor.expedidoEn.localidad = objPar.emisor_expedidoEn_localidad;
                    cfdi.emisor.expedidoEn.referencia = objPar.emisor_expedidoEn_referencia;
                    cfdi.emisor.expedidoEn.municipio = objPar.emisor_expedidoEn_municipio;
                    cfdi.emisor.expedidoEn.estado = objPar.emisor_expedidoEn_estado;
                    cfdi.emisor.expedidoEn.pais = objPar.emisor_expedidoEn_pais;
                    cfdi.emisor.expedidoEn.codigoPostal = objPar.emisor_expedidoEn_codigoPostal;
                    //sSucursal_Tmp = string.Empty;
                    objPar.sRuta_ArchivoTMP = "";
                    cfdi.lugarExpedicion = objPar.lugarExpedicion;
                    /********************************************************************/
                    //expedidoEn
                    DataRow _expedidoEn = dsPF.ExpedidoEn.NewRow();
                    _expedidoEn["calle"] = objPar.emisor_domicilioFiscal_calle;
                    _expedidoEn["colonia"] = objPar.emisor_domicilioFiscal_colonia;
                    _expedidoEn["localidad"] = objPar.emisor_expedidoEn_localidad;
                    _expedidoEn["referencia"] = objPar.emisor_expedidoEn_referencia;
                    _expedidoEn["municipio"] = objPar.emisor_domicilioFiscal_municipio;
                    _expedidoEn["estado"] = objPar.emisor_domicilioFiscal_estado;
                    _expedidoEn["pais"] = objPar.emisor_domicilioFiscal_pais;
                    _expedidoEn["codigoPostal"] = objPar.emisor_domicilioFiscal_codigoPostal;
                    dsPF.ExpedidoEn.Rows.Add(_expedidoEn);
                    /********************************************************************/
                }
                else
                {
                    cfdi.lugarExpedicion = objPar.lugarExpedicion;
                    _comprobante["lugarExpedicion"] = objPar.lugarExpedicion;
                }

                cfdi.receptor.rfc = objPar.receptor_rfc;
                cfdi.receptor.nombre = objPar.receptor_nombre;
                /********************************************************************/
                //receptor
                DataRow _receptor = dsPF.Receptor.NewRow();
                _receptor["rfc"] = objPar.receptor_rfc;
                _receptor["nombre"] = objPar.receptor_nombre;
                dsPF.Receptor.Rows.Add(_receptor);
                /********************************************************************/

                cfdi.receptor.domicilio = new Ubicacion();
                cfdi.receptor.domicilio.calle = objPar.receptor_domicilio_calle;
                cfdi.receptor.domicilio.noExterior = objPar.receptor_domicilio_noExterior;
                cfdi.receptor.domicilio.noInterior = objPar.receptor_domicilio_noInterior;
                cfdi.receptor.domicilio.colonia = objPar.receptor_domicilio_colonia;
                cfdi.receptor.domicilio.localidad = objPar.receptor_domicilio_localidad;
                cfdi.receptor.domicilio.referencia = objPar.receptor_domicilio_referencia;
                cfdi.receptor.domicilio.municipio = objPar.receptor_domicilio_municipio;
                cfdi.receptor.domicilio.estado = objPar.receptor_domicilio_estado;
                cfdi.receptor.domicilio.pais = objPar.receptor_domicilio_pais;
                cfdi.receptor.domicilio.codigoPostal = objPar.receptor_domicilio_codigoPostal;
                /********************************************************************/
                //domicilio
                DataRow _domicilio = dsPF.Domicilio.NewRow();
                _domicilio["calle"] = objPar.receptor_domicilio_calle;
                _domicilio["noExterior"] = objPar.receptor_domicilio_noExterior;
                _domicilio["noInterior"] = objPar.receptor_domicilio_noInterior;
                _domicilio["colonia"] = objPar.receptor_domicilio_colonia;
                _domicilio["localidad"] = objPar.receptor_domicilio_localidad;
                _domicilio["referencia"] = objPar.receptor_domicilio_referencia;
                _domicilio["municipio"] = objPar.receptor_domicilio_municipio;
                _domicilio["estado"] = objPar.receptor_domicilio_estado;
                _domicilio["pais"] = objPar.receptor_domicilio_pais;
                _domicilio["codigoPostal"] = objPar.receptor_domicilio_codigoPostal;
                dsPF.Domicilio.Rows.Add(_domicilio);

                /********************************************************************/
                // Obtiene origen de partidas acorde ala base de datos                 
                switch (sNombreDB)
                {
                    case "INTEGRA_TDS":
                        table = TDSController.GetPartidasTDS(sNombreDB, iNumeroFactura, iTipoFacturaNotaCredito, objPar.companynumber, icontabilizada, idocumenttype, idocumentinternet);
                        sReporte_CDFI = "CFDi_TDS.Rpt";
                        break;
                    case "INTEGRA_CARTON":
                        table = CartonController.GetPartidasCarton(sNombreDB, iNumeroFactura, iTipoFacturaNotaCredito, objPar.companynumber, icontabilizada, idocumenttype, idocumentinternet);
                        sReporte_CDFI = "CFDi_CARTON.Rpt";
                        break;
                    case "INTEGRA_CPAE":
                        table = TDSController.GetPartidasTDS(sNombreDB, iNumeroFactura, iTipoFacturaNotaCredito, objPar.companynumber, icontabilizada, idocumenttype, idocumentinternet);
                        sReporte_CDFI = "CFDi_CPAE.Rpt";
                        break;
                    case "INTEGRA_CIRRUS":
                        table = CirrusController.GetPartidasCirrus(sNombreDB, iNumeroFactura, iTipoFacturaNotaCredito, objPar.companynumber, icontabilizada, idocumenttype, idocumentinternet);
                        sReporte_CDFI = "cfdi.Rpt";
                        break;
                    case "INTEGRA_INTEGRAGMC":
                        table = FacturaController.GetPartidasGeneral(sNombreDB, iNumeroFactura, iTipoFacturaNotaCredito, objPar.companynumber, icontabilizada, idocumenttype, idocumentinternet);
                        sReporte_CDFI = "CFDi_CARTON.Rpt";
                        break;
                    default:
                        table = FacturaController.GetPartidasGeneral(sNombreDB, iNumeroFactura, iTipoFacturaNotaCredito, objPar.companynumber, icontabilizada, idocumenttype, idocumentinternet);
                        break;
                }
                /********************************************************************/
                Concepto objConcepto = null;
                if (table.Rows.Count > 0)
                {
                    foreach (DataRow row in table.Rows)
                    {
                        objConcepto = new Concepto();
                        objConcepto.noIdentificacion = row[4].ToString();
                        objConcepto.descripcion = string.IsNullOrEmpty(row[5].ToString()) ? "-" : row[5].ToString();
                        objConcepto.unidad = row[6].ToString();
                        objConcepto.valorUnitario = Convert.ToDouble(row[8]);
                        objConcepto.cantidad = Convert.ToDouble(row[7]);
                        objConcepto.importe = objConcepto.cantidad * objConcepto.valorUnitario;
                        cfdi.addConcepto(objConcepto);
                        /********************************************************************/
                        //concepto
                        DataRow _concepto = dsPF.Concepto.NewRow();
                        _concepto["noIdentificacion"] = row[4].ToString();
                        _concepto["descripcion"] = string.IsNullOrEmpty(row[5].ToString()) ? "-" : row[5].ToString();
                        _concepto["unidad"] = row[6].ToString();
                        _concepto["valorUnitario"] = Convert.ToDouble(row[8]).ToString("G");
                        _concepto["cantidad"] = Convert.ToDouble(row[7]);
                        _concepto["importe"] = (objConcepto.cantidad * objConcepto.valorUnitario).ToString("G");
                        dsPF.Concepto.Rows.Add(_concepto);
                        /********************************************************************/
                        // GET RETENCIONES
                        objPar.impuestos_dRETIVA = (decimal)row["RET_IVA"];
                        objPar.impuestos_dRETISR = (decimal)row["RET_ISR"];
                        objPar.impuestos_dCfdi_ImporteIVA = (decimal)row["Iva"];
                        //objPar.total = (decimal)row["TOTALTOTAL"];
                    }
                }
                else
                    throw new Exception("*Sin detalle de partidas");
                /********************************************************************/
                //Agregar RET IVA
                Retencion objReteII = new Retencion();
                objReteII.importe = (double)objPar.impuestos_dRETIVA;
                objReteII.impuesto = "IVA";
                cfdi.impuestos.addRetencion(objReteII);

                //Retencion IVA
                DataRow _Retencion = dsPF.Retencion.NewRow();
                _Retencion["importe"] = objPar.impuestos_dRETIVA.ToString("0.##");
                _Retencion["impuesto"] = "RETENCION IVA";
                dsPF.Retencion.Rows.Add(_Retencion);
                /********************************************************************/
                ////Agregar RET ISR 
                Retencion objRete = new Retencion();
                objRete.importe = (double)objPar.impuestos_dRETISR;
                objRete.impuesto = "ISR";
                cfdi.impuestos.addRetencion(objRete);
                //Retencion ISR
                DataRow _ISR = dsPF.Retencion.NewRow();
                _ISR["importe"] = objPar.impuestos_dRETISR.ToString("0.00"); ;
                _ISR["impuesto"] = "RETENCION ISR";
                dsPF.Retencion.Rows.Add(_ISR);
                //******************************************************************/
                //Traslado
                Traslado objTraslado = new Traslado();
                objTraslado.tasa = (double)objPar.traslado_tasa;
                objTraslado.impuesto = "IVA";
                objTraslado.importe = (double)objPar.impuestos_dCfdi_ImporteIVA;
                cfdi.impuestos.addTraslado(objTraslado);
                cfdi.subTotal = (double)objPar.subtotal;
                DataRow _Traslado = dsPF.Traslado.NewRow();
                _Traslado["tasa"] = objPar.traslado_tasa;
                _Traslado["impuesto"] = objPar.traslado_impuesto;
                _Traslado["importe"] = objPar.traslado_importe;
                dsPF.Traslado.Rows.Add(_Traslado);
                DataRow _Impuestos = dsPF.Impuestos.NewRow();
                _Impuestos["totalImpuestosRetenidos"] = (objPar.impuestos_dRETISR + objPar.impuestos_dRETIVA).ToString("0.##");
                _Impuestos["totalImpuestosTrasladados"] = objPar.impuestos_dCfdi_ImporteIVA.ToString("0.##");
                dsPF.Impuestos.Rows.Add(_Impuestos);
                _comprobante["subTotal"] = (double)objPar.subtotal;
                /********************************************************************/
                // Z detalles
                DataRow _z = dsPF.Z.NewRow();
                _z["Observaciones"] = string.IsNullOrEmpty(objPar.sObservaciones) ? " " : objPar.sObservaciones;
                _z["subtotal"] = ((double)objPar.subtotal + (double)objPar.impuestos_dCfdi_ImporteIVA).ToString();
                _z["DomicilioEstablecimiento"] = FacturaController.lfDomicilioEstablecimientoGet(sNombreDB, objPar.iDatoSucursal, objPar.companynumber);

                if (string.IsNullOrEmpty(objPar.descuento))
                {
                    cfdi.descuento = 0.00000000000001;
                    _comprobante["descuento"] = "0.00";
                }
                else
                {
                    cfdi.descuento = double.Parse(objPar.descuento);
                    _comprobante["descuento"] = objPar.descuento;
                }

                double temp = ((double)objPar.subtotal + (double)objPar.impuestos_dCfdi_ImporteIVA);
                temp = temp - (double)objPar.impuestos_dRETISR - (double)objPar.impuestos_dRETIVA;
                objPar.total = (decimal)temp;

                cfdi.total = (double)objPar.total;
                _comprobante["total"] = (double)objPar.total;

                string sImporteConLetra = FacturaController.import_to_string(sNombreDB, objPar.companynumber, objPar.total, 1, iNumeroFactura, iTipoFacturaNotaCredito).Rows[0][0].ToString();
                _z["ImporteConLetra"] = sImporteConLetra;
                _z["D1"] = objPar.sCfdi_Condiciones.ToUpper();
                dsPF.Z.Rows.Add(_z);

                mes = DateTime.Today.Month;
                string smes;
                smes = Convert.ToString(mes);

                if (smes.Length == 1)
                    sAnio_Mes = DateTime.Today.Year + "-0" + mes;
                else
                    sAnio_Mes = DateTime.Today.Year + "-" + mes;

                sNombre_ArchivoTMP = objPar.emisor_rfc + "-" + objPar.serie + "" + objPar.folio;
                string sfecha = Convert.ToString(DateTime.Now.Year + "-" + DateTime.Now.Month.ToString("d2"));
                string suser = objPar.Persona;
                string sTemp = string.Empty;

                if (!string.IsNullOrEmpty(objPar.sSucursal_Nombre))
                {
                    sTemp = Path.Combine("RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha, objPar.sSucursal_Nombre);
                    spathString = Path.Combine(strDestino, "RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha, objPar.sSucursal_Nombre);
                }
                else
                {
                    sTemp = System.IO.Path.Combine("RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha);
                    spathString = System.IO.Path.Combine(strDestino, "RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha);
                }
                sRutaArchivos = sTemp;
                try
                {
                    if (!Directory.Exists(@spathString))
                        Directory.CreateDirectory(@spathString);
                }
                catch (Exception ex)
                {
                    BitacoraController.gfLogFacturaRegistroError("CreacionCarpetaPersonaFisica", string.Concat("gfs_generaComprobanteFisica|CreateDirectory|", ex.Message), sTempParam);
                    sResultado = string.Concat("sMensaje:", "Error,", ex.Message, "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                    throw new Exception(sResultado);
                }

                objPar.sRuta_Cer = objPar.sRuta_Cer.Replace(@ConfigurationManager.AppSettings["sRuta_Cer_Replace_Origen"], @ConfigurationManager.AppSettings["sRuta_Cer_Replace_Destino"]);
                objPar.sRuta_Key = objPar.sRuta_Key.Replace(@ConfigurationManager.AppSettings["sRuta_Key_Replace_Origen"], @ConfigurationManager.AppSettings["sRuta_Key_Replace_Destino"]);

                // Construye el XML con el certificado
                string xml = string.Empty;
                try
                {
                    xml = objCFDi.getXML(cfdi, objPar.sRuta_Key, objPar.sContrasenia_Key, objPar.sRuta_Cer, sNombre_ArchivoTMP, spathString);
                }
                catch (Exception ex)
                {
                    return string.Concat("sMensaje:", " Incidencia ,", ex.Message, ", " + ex.InnerException.ToString() + "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                }

                XmlDocument xDoc1 = new XmlDocument();
                xDoc1.LoadXml(xml);
                try
                {
                    xDoc1.Save(spathString + "\\" + sNombre_ArchivoTMP + ".xml");
                    sRutaArchivos += "|" + spathString + "\\" + sNombre_ArchivoTMP + ".xml";
                }
                catch (Exception ex)
                {
                    BitacoraController.gfLogFacturaRegistroError("GuardarArchivoPersonaFisica", string.Concat("gfs_generaComprobanteFisica|", "No logro timbrar , detalle al guardarlo xml para enviar xml a timbrar" + ex.Message + ex.InnerException), sTempParam);
                    sResultado = string.Concat("sMensaje:", "Error,", ex.Message, "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                    throw new Exception(sResultado);
                }
                sPAC = "PROFACT";
                #region  Swicht de PAC
                banderaPAC = new PACController().lfPROFACTCreaCFDI(spathString, sNombre_ArchivoTMP, objPar.emisor_rfc, objPar.serie, objPar.folio, ref idError, ref Error, ref uuid, ref fechaTimbre, ref xmlTimbrado, sTempParam, objPar.sRuta_Cer, objPar.sRuta_Key, objPar.sContrasenia_Key);
                FacturaController ctrlfactura = new FacturaController();
                if (banderaPAC == false)
                {
                    xml = objCFDi.getXML(cfdi, objPar.sRuta_Key, objPar.sContrasenia_Key, objPar.sRuta_Cer, sNombre_ArchivoTMP, spathString, -1, false, false);
                    xDoc1 = new XmlDocument();
                    xDoc1.LoadXml(xml);
                    xDoc1.Save(spathString + "\\" + sNombre_ArchivoTMP + ".xml");
                    new PACController().lfSERVISIMCreaCFDI(spathString, sNombre_ArchivoTMP, objPar.emisor_rfc, objPar.serie, objPar.folio, ref idError, ref Error, ref uuid, ref fechaTimbre, ref xmlTimbrado, sTempParam);
                    sPAC = "SERVISIM";
                }

                #endregion

                if (idError != 0)
                {
                    BitacoraController.gfLogFacturaRegistroError("SERVICIO_CFDI", Error, sTempParam);
                    FacturaController.gfEmailSend(string.Concat("Incidencia en ServicioWeb |Incidencia", Error, "|BD:", sNombreDB, "|Parametros:" + sTempParam), FacturaController.listaContactosIncidenciaEmail, "INCIDENCIA");
                    sMensaje = "Error";
                    uuid = "";
                    sPATH = "ErrorAltimbrar";
                    return string.Concat("sMensaje:", "Error,", Error, "|sUUID:", Error, "|", "sPATH:", sPATH);
                }
                else
                {
                    ctrlfactura.gfXMLConsultaElementos(xmlTimbrado, ref noCertificadoSAT, ref noCertificado, ref selloSAT, ref selloCFD);

                    sCbb = string.Concat("?re=", objPar.emisor_rfc, ";rr=", objPar.receptor_rfc, ";tt=", objPar.total, ";id=", uuid);
                    _comprobante["cbb"] = string.Concat(lfservicioQR + sCbb);
                    _comprobante["noCertificado"] = noCertificado;
                    dsPF.Comprobante.Rows.Add(_comprobante);
                    //==============================================
                    // TimbreFiscalDigital
                    DataRow _TimbreFiscalDigital = dsPF.TimbreFiscalDigital.NewRow();
                    _TimbreFiscalDigital["UUID"] = uuid;
                    _TimbreFiscalDigital["FechaTimbrado"] = fechaTimbre.ToString("dd/MM/yyyy");
                    _TimbreFiscalDigital["selloSAT"] = selloSAT;
                    _TimbreFiscalDigital["selloCFD"] = selloCFD;
                    _TimbreFiscalDigital["noCertificadoSAT"] = noCertificadoSAT;
                    //noCertificado
                    dsPF.TimbreFiscalDigital.Rows.Add(_TimbreFiscalDigital);
                    //==============================================
                    XmlDocument objXmlTimbrado = new XmlDocument();
                    xml = xmlTimbrado.ToString();
                    if (iTipoFacturaNotaCredito == 0)
                    {
                        //Ingreso //Adendas //ya
                        tableadenda = ctrl.GetAdenda(sNombreDB, iNumeroFactura, objPar.companynumber);
                        if (tableadenda != null)
                        {
                            if (tableadenda.Rows[0][0] != DBNull.Value)
                            {
                                if (Convert.ToInt32(tableadenda.Rows[0][0]) == 0)//Phillips
                                {
                                    int iTipoAdendaTemp = Convert.ToInt32(tableadenda.Rows[0][0]);
                                    switch (iTipoAdendaTemp)
                                    {
                                        //Adenda PHILLIPS
                                        case 0:
                                            if (!AddendaController.AdendaPhillips(sNombreDB, iNumeroFactura, 0, iNumeroCompania, ref xml))
                                                return "false";
                                            break;
                                        //Adenda METALSA
                                        case 1:
                                            if (!AddendaController.AdendaMetalsa(sNombreDB, iNumeroFactura, 0, iNumeroCompania, sNombre_ArchivoTMP + ".pdf", ref xml))
                                                return "false";
                                            break;
                                        // Adenda  HP
                                        case 2:
                                            if (!AddendaController.AdendaHP(sNombreDB, iNumeroFactura, iNumeroCompania, ref xml))
                                                return "false";
                                            break;
                                        default:
                                            break;
                                    }
                                }
                            }
                        }
                        objXmlTimbrado.LoadXml(xml);
                        objPar.sArchivo = spathString + "\\" + objPar.serie + "" + objPar.folio + "ingreso.xml";
                        strDestino = objPar.sArchivo;
                        try
                        {
                            sRutaArchivos += "|" + strDestino;
                            objXmlTimbrado.Save(strDestino);
                            BitacoraController.gfLogFacturaOK(uuid, strDestino, (sTempParam), objPar.emisor_rfc);
                        }
                        catch (Exception ex)
                        {
                            BitacoraController.gfLogFacturaRegistroError("GuardarArchivoServidor72", string.Concat("Se timbro,pero hubo una incidencia al guardar en el servidor 72|", ex.Message), sTempParam);
                            sResultado = string.Concat("sMensaje:", "Error,", ex.Message, "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                            throw new Exception(sResultado);
                        }
                    }
                    else
                    {
                        objXmlTimbrado.LoadXml(xml);
                        objPar.sArchivo = spathString + "\\" + objPar.serie + "" + objPar.folio + "egreso.xml";
                        strDestino = objPar.sArchivo;
                        try
                        {
                            sRutaArchivos += "|" + strDestino;
                            objXmlTimbrado.Save(strDestino);
                            BitacoraController.gfLogFacturaOK(uuid, strDestino, (sTempParam));
                        }
                        catch (Exception ex)
                        {
                            //BITACORA.gfLogFacturaInsertaIncidencia(string.Concat("Se timbro,pero hubo una incidencia al guardar en el servidor 72|", ex.Message), sTempParam);
                            BitacoraController.gfLogFacturaRegistroError("GuardarArchivoServidor72", string.Concat("Se timbro,pero hubo una incidencia al guardar en el servidor 72|", ex.Message), sTempParam);
                            sResultado = string.Concat("sMensaje:", "Error,", ex.Message, "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                            throw new Exception(sResultado);
                        }
                    }
                    sMensaje = "OK";
                    sTempPath = string.Concat(strDestino.Replace(".xml", ".pdf"));
                    // ============================================================
                    if (!lfCreaPDFConRetencion(sTempPath, sTempParam, dsPF))
                        return string.Concat("sMensaje:", "Error al crear PDF, cancelar factura y comunicarse a sistemas |sUUID:", " Error al crear PDF, cancelar factura y comunicarse a sistemas ", "|", "sPATH:");
                    // ============================================================
                    try
                    {
                        FacturaController.gfDatosCorreoCliente(sNombreDB, iNumeroPersona, iNumeroCompania, objPar.sArchivo, sParametroOpcional, iNumeroFactura, iTipoFacturaNotaCredito, cfdi.receptor.nombre, cfdi.receptor.rfc, cfdi.emisor.nombre, cfdi.emisor.rfc, (objPar.serie + objPar.folio), (objPar.tipoDeComprobante + " " + objPar.moneda), objPar.total.ToString());
                    }
                    catch { }

                    objPar.sArchivo = sTempPath;
                    FacturaController.gfSendFilesAllServers(sRutaArchivos, objPar.sArchivo);
                }
                strDestino48 = sTempPath.Replace(@ConfigurationManager.AppSettings["strDestino48_Origen"], @ConfigurationManager.AppSettings["strDestino48_Destino"]);
                sResultado = string.Concat("sMensaje:", sMensaje, "|sUUID:", uuid, "|", "sPATH:", strDestino48);
                return sResultado;
            }
            catch (Exception ex)
            {
                string sMensajeCancelacion = string.Empty;
                //if (Globales.sNombreDB == "INTEGRA_TABLADECO")
                //{
                //    FacturacionCancelacionController fcc = new FacturacionCancelacionController();
                //    decimal dTotal = 0;
                //    int iNumFac_TablaFactura = fcc.lfConsultaNumeroFactura(iNumeroFactura, iNumeroCompania, Globales.sNombreDB, ref iNumeroPersona, ref dTotal);
                //    fcc.lfCreaProcesoCancelacion(iNumeroFactura, iNumFac_TablaFactura, iNumeroCompania, Globales.sNombreDB, iTipoFacturaNotaCredito, Convert.ToInt32(iNumeroPersona), dTotal, ref sMensajeCancelacion);
                //}
                sResultado = string.Concat("sMensaje:", " Error facturación intente nuevamente,", sMensajeCancelacion, " ,", ex.Message, ",", ex.InnerException, " |sUUID:", " Error", "|", "sPATH:", ex.InnerException);
                return sResultado;
            }
        }
Beispiel #2
0
        public string gfCreaCFDI(string sNombreDB, int iNumeroFactura, int iTipoFacturaNotaCredito, int iNumeroCompania, int iNumeroPersona, string sParametroOpcional)
        {
            #region Variables
            CFDIV3_2 dsPM = new CFDIV3_2();
            bool bandera_tar = false;
            string noCertificadoSAT = string.Empty;
            string noCertificado = string.Empty;
            string selloSAT = string.Empty;
            string selloCFD = string.Empty;
            string sCbb = string.Empty;
            Parametros objPar = new Parametros();
            string sRutaArchivos = string.Empty;
            string sUUID = string.Empty;
            string sPATH = string.Empty;
            string sMensaje = string.Empty;
            string sResultado = string.Empty;
            string sTempPath = string.Empty;
            objPar.companynumber = iNumeroCompania;
            objPar.Persona = iNumeroPersona.ToString();
            int mes;
            FacturaController ctrl = new FacturaController();
            DataTable table = new DataTable(), tableadenda = new DataTable(), tablequote = new DataTable();
            string sReporte_CDFI = string.Empty, sAnio_Mes = string.Empty, sNombre_ArchivoTMP = string.Empty, spathString = string.Empty;
            int idError = -1;
            string Error = string.Empty, uuid = string.Empty, xmlTimbrado = string.Empty;
            DateTime fechaTimbre = new DateTime(); ;
            string lfservicioQR = "http://zxing.org/w/chart?cht=qr&chs=230x230&chld=L&choe=UTF-8&chl=";
            ICFD objCFDi = new CFDI32();
            string strDestino = @ConfigurationManager.AppSettings["strDestino"];
            string strDestino48 = string.Empty;
            string[] asParametroOpcional;
            string sTempParam = string.Concat("iNumeroFactura=", iNumeroFactura.ToString(), "|iTipoFacturaNotaCredito=", iTipoFacturaNotaCredito.ToString(), "|sDataBaseName=", sNombreDB, "|iNumeroCompania=", iNumeroCompania.ToString(), "|iNumeroPersona=", iNumeroPersona, "|sParametroOpcional=", sParametroOpcional);
            int iproviene = -1, ibanderanodosorigen = -1;
            string sreporte = string.Empty;
            int idecimal = -1;
            string simpuestoretencion = string.Empty;
            string simpuestoIEPS = string.Empty;
            decimal dImporteIEPS = -1;
            decimal dTasaIEPS = -1;
            decimal dImporteIEPSFederal = -1;
            decimal iImporteretencion = -1;
            bool banderaFacturaFisica = false, banderaPAC = false, banderaIEPS = false, banderaIEPS_FEDERAL = false;
            string sPAC = "PROFACT";

            #endregion

            if (string.IsNullOrEmpty(sParametroOpcional))
                throw new Exception("* Parametro Opcional son necesarios");

            asParametroOpcional = sParametroOpcional.Split('|');
            foreach (string item in asParametroOpcional)
            {
                string[] astemp = item.Split('=');
                switch (astemp[0].ToUpper())
                {
                    case "PROVIENE":
                        iproviene = int.Parse(astemp[1]);
                        break;
                    case "REPORTE":
                        sreporte = astemp[1];
                        break;
                    case "DECIMAL":
                        idecimal = int.Parse(astemp[1]);
                        break;
                    case "IMPUESTORETENCION":
                        simpuestoretencion = astemp[1];
                        break;
                    case "IMPORTERETENCION":
                        iImporteretencion = decimal.Parse(astemp[1]);
                        banderaFacturaFisica = true;
                        break;
                    case "NODOSORIG":
                        ibanderanodosorigen = int.Parse(astemp[1]);
                        break;
                    case "IEPS":
                        string sTempIPS = astemp[1];
                        try
                        {
                            dTasaIEPS = decimal.Parse(sTempIPS.Split(',')[0]);
                            dImporteIEPS = decimal.Parse(sTempIPS.Split(',')[1]);
                        }
                        catch
                        {
                            dTasaIEPS = 0;
                            dImporteIEPS = 0;
                        }
                        banderaIEPS = true;
                        if (banderaFacturaFisica)
                            banderaFacturaFisica = true;

                        break;
                    case "IEPS_FEDERAL":
                        string sTempIPSFEDERAL = astemp[1];
                        try
                        {
                            dImporteIEPSFederal = decimal.Parse(astemp[1]);
                        }
                        catch
                        {
                            dImporteIEPSFederal = 0;
                        }
                        banderaIEPS_FEDERAL = true;
                        if (banderaFacturaFisica)
                            banderaFacturaFisica = true;
                        break;
                    default:
                        break;
                }
            }

            if (FacturaController.gfValidaSiEsFactura(sNombreDB, iNumeroFactura, iNumeroCompania.ToString(), iTipoFacturaNotaCredito) > 0)
            {
                if (iTipoFacturaNotaCredito == 0)
                    lfb_ZambranoGetDatosGenerales(sNombreDB, iNumeroCompania, iNumeroFactura, iTipoFacturaNotaCredito, ref objPar, iproviene, sreporte, idecimal, simpuestoretencion, iImporteretencion);
                else
                    lfb_ZambranoGetDatosGenerales(sNombreDB, iNumeroCompania, iNumeroFactura, iTipoFacturaNotaCredito, ref objPar, iproviene, sreporte, idecimal, simpuestoretencion, iImporteretencion);
            }
            else
                return string.Concat("sMensaje:", "OK", "|sUUID:", "", "|", "sPATH:", "");

            try
            {
                Comprobante cfdi = new Comprobante();
                cfdi.version = "3.2";
                cfdi.serie = objPar.serie;// sCfdi_Serie;
                cfdi.folio = objPar.folio;
                cfdi.fecha = DateTime.Now;
                cfdi.formaDePago = objPar.formaDePago;
                cfdi.condicionesDePago = objPar.condicionesDePago;
                cfdi.tipoCambio = objPar.tipoCambio;
                cfdi.moneda = objPar.moneda;
                cfdi.tipoDeComprobante = objPar.tipoDeComprobante;
                cfdi.metodoDePago = objPar.metodoDePago;
                cfdi.lugarExpedicion = objPar.lugarExpedicion;
                cfdi.numCtaPago = (objPar.numCtaPago.Length == 3) ? objPar.numCtaPago.PadLeft(4, '0') : objPar.numCtaPago;
                cfdi.emisor.rfc = objPar.emisor_rfc;
                cfdi.emisor.nombre = objPar.emisor_nombre;
                cfdi.emisor.regimenFiscal.regimen = objPar.emisor_regimenFiscal_regimen;
                cfdi.emisor.domicilioFiscal.calle = objPar.emisor_domicilioFiscal_calle;
                cfdi.emisor.domicilioFiscal.colonia = objPar.emisor_domicilioFiscal_colonia;
                cfdi.emisor.domicilioFiscal.municipio = objPar.emisor_domicilioFiscal_municipio;
                cfdi.emisor.domicilioFiscal.estado = objPar.emisor_domicilioFiscal_estado;
                cfdi.emisor.domicilioFiscal.pais = objPar.emisor_expedidoEn_pais;
                cfdi.emisor.domicilioFiscal.codigoPostal = objPar.emisor_domicilioFiscal_codigoPostal;
                /********************************************************************/
                //Comprobante 
                //INTEGRAReports.dsPersonasFisicas dsPM = new dsPersonasFisicas();
                DataRow _comprobante = dsPM.Comprobante.NewRow();
                _comprobante["version"] = "3.2";
                _comprobante["serie"] = objPar.serie;
                _comprobante["folio"] = objPar.folio;
                _comprobante["fecha"] = DateTime.Now.ToString("dd'/'MM'/'yyyy HH:mm:ss");
                _comprobante["formaDePago"] = objPar.formaDePago;
                _comprobante["condicionesDePago"] = objPar.condicionesDePago;
                _comprobante["tipoCambio"] = objPar.tipoCambio;
                _comprobante["moneda"] = objPar.moneda;
                _comprobante["tipoDeComprobante"] = objPar.tipoDeComprobante.ToUpper();
                _comprobante["metodoDePago"] = objPar.metodoDePago;
                _comprobante["lugarExpedicion"] = objPar.lugarExpedicion;
                _comprobante["numCtaPago"] = objPar.numCtaPago;

                /********************************************************************/
                //Emisor
                DataRow _emisor = dsPM.Emisor.NewRow();
                _emisor["rfc"] = objPar.emisor_rfc;
                _emisor["nombre"] = objPar.emisor_nombre;
                objPar.emisor_logo = objPar.emisor_logo.Replace(ConfigurationManager.AppSettings["emisor_logo_Origen"], @ConfigurationManager.AppSettings["emisor_logo_Destino"]);
                _emisor["logo"] = objPar.emisor_logo;
                dsPM.Emisor.Rows.Add(_emisor);
                /********************************************************************/
                //Emisor regimenFiscal
                DataRow _regimenFiscal = dsPM.RegimenFiscal.NewRow();
                _regimenFiscal["Regimen"] = objPar.emisor_regimenFiscal_regimen;
                dsPM.RegimenFiscal.Rows.Add(_regimenFiscal);
                /********************************************************************/
                //Emisor domicilioFiscal 
                DataRow _domicilioFiscal = dsPM.DomicilioFiscal.NewRow();
                _domicilioFiscal["calle"] = objPar.emisor_domicilioFiscal_calle;
                _domicilioFiscal["colonia"] = objPar.emisor_domicilioFiscal_colonia;
                _domicilioFiscal["municipio"] = objPar.emisor_domicilioFiscal_municipio;
                _domicilioFiscal["estado"] = objPar.emisor_domicilioFiscal_estado;
                _domicilioFiscal["pais"] = objPar.emisor_domicilioFiscal_pais;
                _domicilioFiscal["codigoPostal"] = objPar.emisor_domicilioFiscal_codigoPostal;
                dsPM.DomicilioFiscal.Rows.Add(_domicilioFiscal);
                /********************************************************************/

                if (String.IsNullOrEmpty(objPar.emisor_expedidoEn_calle))
                {
                    cfdi.emisor.expedidoEn = new Ubicacion();
                    cfdi.emisor.expedidoEn.calle = objPar.emisor_expedidoEn_calle;
                    cfdi.emisor.expedidoEn.noExterior = objPar.emisor_expedidoEn_noExterior;
                    cfdi.emisor.expedidoEn.noInterior = objPar.emisor_expedidoEn_noInterior;
                    cfdi.emisor.expedidoEn.colonia = objPar.emisor_expedidoEn_colonia;
                    cfdi.emisor.expedidoEn.localidad = objPar.emisor_expedidoEn_localidad;
                    cfdi.emisor.expedidoEn.referencia = objPar.emisor_expedidoEn_referencia;
                    cfdi.emisor.expedidoEn.municipio = objPar.emisor_expedidoEn_municipio;
                    cfdi.emisor.expedidoEn.estado = objPar.emisor_expedidoEn_estado;
                    cfdi.emisor.expedidoEn.pais = objPar.emisor_expedidoEn_pais;
                    cfdi.emisor.expedidoEn.codigoPostal = objPar.emisor_expedidoEn_codigoPostal;
                    //sSucursal_Tmp = string.Empty;
                    objPar.sRuta_ArchivoTMP = "";
                    cfdi.lugarExpedicion = objPar.lugarExpedicion;
                    /********************************************************************/
                    //expedidoEn
                    DataRow _expedidoEn = dsPM.ExpedidoEn.NewRow();

                    _expedidoEn["calle"] = objPar.emisor_domicilioFiscal_calle;
                    _expedidoEn["colonia"] = objPar.emisor_domicilioFiscal_colonia;
                    _expedidoEn["localidad"] = objPar.emisor_expedidoEn_localidad;
                    _expedidoEn["referencia"] = objPar.emisor_expedidoEn_referencia;
                    _expedidoEn["municipio"] = objPar.emisor_domicilioFiscal_municipio;
                    _expedidoEn["estado"] = objPar.emisor_domicilioFiscal_estado;
                    _expedidoEn["pais"] = objPar.emisor_domicilioFiscal_pais;
                    _expedidoEn["codigoPostal"] = objPar.emisor_domicilioFiscal_codigoPostal;
                    dsPM.ExpedidoEn.Rows.Add(_expedidoEn);
                    /********************************************************************/
                }
                else
                {
                    cfdi.lugarExpedicion = objPar.lugarExpedicion;
                    _comprobante["lugarExpedicion"] = objPar.lugarExpedicion;
                }

                cfdi.receptor.rfc = objPar.receptor_rfc;
                cfdi.receptor.nombre = objPar.receptor_nombre;
                /********************************************************************/
                //receptor
                DataRow _receptor = dsPM.Receptor.NewRow();
                _receptor["rfc"] = objPar.receptor_rfc;
                _receptor["nombre"] = objPar.receptor_nombre;
                dsPM.Receptor.Rows.Add(_receptor);
                /********************************************************************/

                cfdi.receptor.domicilio = new Ubicacion();
                cfdi.receptor.domicilio.calle = objPar.receptor_domicilio_calle;
                cfdi.receptor.domicilio.noExterior = objPar.receptor_domicilio_noExterior;
                cfdi.receptor.domicilio.noInterior = objPar.receptor_domicilio_noInterior;
                cfdi.receptor.domicilio.colonia = objPar.receptor_domicilio_colonia;
                cfdi.receptor.domicilio.localidad = objPar.receptor_domicilio_localidad;
                cfdi.receptor.domicilio.referencia = objPar.receptor_domicilio_referencia;
                cfdi.receptor.domicilio.municipio = objPar.receptor_domicilio_municipio;
                cfdi.receptor.domicilio.estado = objPar.receptor_domicilio_estado;
                cfdi.receptor.domicilio.pais = objPar.receptor_domicilio_pais;
                cfdi.receptor.domicilio.codigoPostal = objPar.receptor_domicilio_codigoPostal;
                /********************************************************************/
                //domicilio
                DataRow _domicilio = dsPM.Domicilio.NewRow();
                _domicilio["calle"] = objPar.receptor_domicilio_calle;
                _domicilio["noExterior"] = objPar.receptor_domicilio_noExterior;
                _domicilio["noInterior"] = objPar.receptor_domicilio_noInterior;
                _domicilio["colonia"] = objPar.receptor_domicilio_colonia;
                _domicilio["localidad"] = objPar.receptor_domicilio_localidad;
                _domicilio["referencia"] = objPar.receptor_domicilio_referencia;
                _domicilio["municipio"] = objPar.receptor_domicilio_municipio;
                _domicilio["estado"] = objPar.receptor_domicilio_estado;
                _domicilio["pais"] = objPar.receptor_domicilio_pais;
                _domicilio["codigoPostal"] = objPar.receptor_domicilio_codigoPostal;
                dsPM.Domicilio.Rows.Add(_domicilio);
                int icontabilizada, idocumenttype, idocumentinternet;
                icontabilizada = 1;
                idocumenttype = -59;
                idocumentinternet = 1;

                table = lfdt_ZambranoGetPartidasGeneral(sNombreDB,
                                                        iNumeroFactura,
                                                        icontabilizada,
                                                        idocumenttype,
                                                        idocumentinternet,
                                                        objPar.companynumber,
                                                        iTipoFacturaNotaCredito,
                                                        iproviene,
                                                        idecimal).Copy();

                Concepto objConcepto = null;
                int idPartida = 0;
                if (table.Rows.Count > 0)
                {
                    foreach (DataRow row in table.Rows)
                    {
                        objConcepto = new Concepto();
                        objConcepto.noIdentificacion = (banderaIEPS_FEDERAL) ? string.Concat("IEPS:", "%",
                                                                              (string.IsNullOrEmpty(row["ieps_porcentaje"].ToString())) ? 0 : Convert.ToDouble(row["ieps_porcentaje"]), ",$",
                                                                              (string.IsNullOrEmpty(row["ieps_precio"].ToString())) ? 0 : Convert.ToDouble(row["ieps_precio"])) : row[4].ToString();
                        objConcepto.descripcion = string.IsNullOrEmpty(row[5].ToString()) ? "-" : row[5].ToString();
                        objConcepto.unidad = row[6].ToString();
                        objConcepto.valorUnitario = (row[8] == null) ? 0 : Convert.ToDouble(row[8]);
                        objConcepto.cantidad = (row[7] == null) ? 0 : Convert.ToDouble(row[7]);
                        objConcepto.importe = (row["importe"] == null) ? 0 : Convert.ToDouble(row["importe"]);
                        objConcepto.IEPS_porcentaje = (string.IsNullOrEmpty(row["ieps_porcentaje"].ToString())) ? 0 : Convert.ToDouble(row["ieps_porcentaje"]);
                        objConcepto.IEPS_importe = (string.IsNullOrEmpty(row["ieps_precio"].ToString())) ? 0 : Convert.ToDouble(row["ieps_precio"]);

                        DataRow _concepto = dsPM.Concepto.NewRow();

                        if (row["tar_clave"] != DBNull.Value)
                            if (!string.IsNullOrEmpty(row["tar_clave"].ToString()))
                            {
                                bandera_tar = true;

                                ComplementoConcepto cco = new ComplementoConcepto();
                                cco.Version = "1.0";
                                cco.TAR = row["tar_clave"].ToString();
                                objConcepto.complementoConcepto = cco;
                                _concepto["Conceptos_Id"] = row["tar_clave"].ToString();
                            }

                        cfdi.addConcepto(objConcepto);
                        /********************************************************************/
                        //concepto

                        _concepto["Concepto_Id"] = ++idPartida;
                        _concepto["noIdentificacion"] = row[4].ToString();
                        _concepto["descripcion"] = string.IsNullOrEmpty(row[5].ToString()) ? "-" : row[5].ToString();
                        _concepto["unidad"] = row[6].ToString();
                        _concepto["valorUnitario"] = objConcepto.valorUnitario;
                        _concepto["cantidad"] = objConcepto.cantidad;
                        _concepto["importe"] = objConcepto.importe;
                        _concepto["concepto_id"] = row["dato_partida"].ToString();
                        dsPM.Concepto.Rows.Add(_concepto);
                    }
                }
                else
                    throw new Exception("* Sin detalle de partidas");

                // =====================================================================
                // Factura Fisicas (con retenciones) y sin IEPS
                if (banderaFacturaFisica && banderaIEPS == false && banderaIEPS_FEDERAL == false)
                {
                    // =====================================================================
                    //Agregar RET IVA
                    objPar.impuestos_dRETIVA = iImporteretencion;
                    //objPar.traslado_importe = iImporteretencion;
                    Retencion objReteII = new Retencion();
                    objReteII.importe = (double)objPar.impuestos_dRETIVA;
                    objReteII.impuesto = "IVA";
                    cfdi.impuestos.addRetencion(objReteII);
                    //Retencion IVA
                    DataRow _Retencion = dsPM.Retencion.NewRow();
                    _Retencion["importe"] = objPar.impuestos_dRETIVA.ToString("0.##");
                    _Retencion["impuesto"] = "RETENCION IVA";
                    dsPM.Retencion.Rows.Add(_Retencion);
                    // =====================================================================
                    ////Agregar RET ISR 
                    //Retencion objRete = new Retencion();
                    //objRete.importe = (double)objPar.impuestos_dRETISR;
                    //objRete.impuesto = "ISR";
                    //cfdi.impuestos.addRetencion(objRete);
                    ////Retencion ISR
                    //DataRow _ISR = dsPF.Retencion.NewRow();
                    //_ISR["importe"] = objPar.impuestos_dRETISR.ToString("0.00"); ;
                    //_ISR["impuesto"] = "RETENCION ISR";
                    //dsPF.Retencion.Rows.Add(_ISR);
                    //******************************************************************/
                    //Traslado
                    Traslado objTraslado = new Traslado();
                    objTraslado.tasa = (double)objPar.traslado_tasa;
                    objTraslado.impuesto = "IVA";
                    objTraslado.importe = (double)objPar.impuestos_dCfdi_ImporteIVA;
                    cfdi.impuestos.addTraslado(objTraslado);
                    //cfdi.impuestos.totalImpuestosTrasladados = Convert.ToDouble(dCfdi_ImporteIVA); aparece como de solo lectura
                    cfdi.subTotal = (double)objPar.subtotal;
                    DataRow _Traslado = dsPM.Traslado.NewRow();
                    _Traslado["tasa"] = objPar.traslado_tasa;
                    _Traslado["impuesto"] = objPar.traslado_impuesto;
                    _Traslado["importe"] = objPar.traslado_importe;
                    dsPM.Traslado.Rows.Add(_Traslado);
                    DataRow _Impuestos = dsPM.Impuestos.NewRow();
                    _Impuestos["totalImpuestosRetenidos"] = (iImporteretencion == -1) ? 0 : iImporteretencion;
                    _Impuestos["totalImpuestosTrasladados"] = objPar.impuestos_dCfdi_ImporteIVA.ToString("0.##");
                    dsPM.Impuestos.Rows.Add(_Impuestos);
                    _comprobante["subTotal"] = (double)objPar.subtotal;
                    goto Termina;
                }

                // =====================================================================
                // Factura IEPS(sin retenciones)
                if (banderaIEPS || banderaIEPS_FEDERAL && banderaFacturaFisica == false)
                {
                    Traslado objTraslado = new Traslado();
                    objTraslado.tasa = (double)objPar.traslado_tasa;
                    objTraslado.impuesto = "IVA";
                    objTraslado.importe = (double)objPar.impuestos_dCfdi_ImporteIVA;
                    cfdi.impuestos.addTraslado(objTraslado);
                    //******************************************************************/
                    if ((double)dImporteIEPS > 0 && banderaIEPS_FEDERAL == false)
                    {
                        //Traslado IEPS 
                        Traslado objTrasladoIEPS = new Traslado();
                        objTrasladoIEPS.tasa = (double)dTasaIEPS;
                        objTrasladoIEPS.impuesto = "IEPS";
                        objTrasladoIEPS.importe = (double)dImporteIEPS;
                        cfdi.impuestos.addTraslado(objTrasladoIEPS);

                        DataRow _IEPS = dsPM.Deducciones.NewRow();
                        _IEPS["TotalGravado"] = objTrasladoIEPS.tasa.ToString();
                        _IEPS["TotalExento"] = objTrasladoIEPS.importe.ToString();
                        dsPM.Deducciones.Rows.Add(_IEPS);
                    }
                    else
                    {
                        //Traslado IEPS  ESTATAL 
                        Traslado objTrasladoIEPS = new Traslado();
                        objTrasladoIEPS.tasa = (double)dTasaIEPS;
                        objTrasladoIEPS.impuesto = "IEPS";
                        objTrasladoIEPS.importe = (double)dImporteIEPS;
                        cfdi.impuestos.addTraslado(objTrasladoIEPS);
                        DataRow _IEPS = dsPM.Deducciones.NewRow();
                        _IEPS["TotalGravado"] = objTrasladoIEPS.tasa.ToString();
                        _IEPS["TotalExento"] = objTrasladoIEPS.importe.ToString();
                        dsPM.Deducciones.Rows.Add(_IEPS);

                        //Traslado IEPS  FEDERAL
                        objTrasladoIEPS = new Traslado();
                        objTrasladoIEPS.tasa = objConcepto.IEPS_porcentaje;
                        objTrasladoIEPS.impuesto = "IEPS";
                        objTrasladoIEPS.importe = (double)dImporteIEPSFederal;
                        cfdi.impuestos.addTraslado(objTrasladoIEPS);
                    }

                    //cfdi.impuestos.totalImpuestosTrasladados = Convert.ToDouble(dCfdi_ImporteIVA); aparece como de solo lectura
                    cfdi.subTotal = (double)objPar.subtotal;
                    DataRow _Traslado = dsPM.Traslado.NewRow();
                    _Traslado["tasa"] = objPar.traslado_tasa;
                    _Traslado["impuesto"] = objPar.traslado_impuesto;
                    _Traslado["importe"] = objPar.traslado_importe;
                    dsPM.Traslado.Rows.Add(_Traslado);
                    DataRow _Impuestos = dsPM.Impuestos.NewRow();
                    _Impuestos["totalImpuestosRetenidos"] = (iImporteretencion == -1) ? 0 : iImporteretencion;
                    _Impuestos["totalImpuestosTrasladados"] = objPar.impuestos_dCfdi_ImporteIVA.ToString("0.##");
                    dsPM.Impuestos.Rows.Add(_Impuestos);
                    _comprobante["subTotal"] = (double)objPar.subtotal;
                    goto Termina;
                }
                if (banderaIEPS == false && banderaFacturaFisica == false)
                {
                    // *****************************************************************
                    // Factura Morales (sin retenciones)
                    //Traslado
                    Traslado objTraslado = new Traslado();
                    objTraslado.tasa = (double)objPar.traslado_tasa;
                    objTraslado.impuesto = "IVA";
                    objTraslado.importe = (double)objPar.impuestos_dCfdi_ImporteIVA;
                    cfdi.impuestos.addTraslado(objTraslado);
                    cfdi.subTotal = (double)objPar.subtotal;

                    DataRow _Traslado = dsPM.Traslado.NewRow();
                    _Traslado["tasa"] = objPar.traslado_tasa;
                    _Traslado["impuesto"] = objPar.traslado_impuesto;
                    _Traslado["importe"] = objPar.traslado_importe;
                    dsPM.Traslado.Rows.Add(_Traslado);

                    DataRow _Impuestos = dsPM.Impuestos.NewRow();
                    //_Impuestos["totalImpuestosRetenidos"] = (objPar.impuestos_dRETISR + objPar.impuestos_dRETIVA).ToString("0.##");
                    _Impuestos["totalImpuestosRetenidos"] = (iImporteretencion == -1) ? 0 : iImporteretencion;
                    _Impuestos["totalImpuestosTrasladados"] = objPar.impuestos_dCfdi_ImporteIVA.ToString("0.##");
                    dsPM.Impuestos.Rows.Add(_Impuestos);
                    _comprobante["subTotal"] = (double)objPar.subtotal;
                    /********************************************************************/
                    goto Termina;
                }
                Termina:
                // Z detalles
                DataRow _z = dsPM.Z.NewRow();
                _z["Observaciones"] = string.IsNullOrEmpty(objPar.sObservaciones) ? " " : objPar.sObservaciones;
                _z["subtotal"] = objPar.subtotal.ToString();
                _z["DomicilioEstablecimiento"] = FacturaController.lfDomicilioEstablecimientoGet(sNombreDB, objPar.iDatoSucursal, objPar.companynumber);
                string sImporteConLetra = FacturaController.import_to_string(sNombreDB, objPar.companynumber, objPar.total, 0, iNumeroFactura, iTipoFacturaNotaCredito).Rows[0][0].ToString();
                _z["ImporteConLetra"] = sImporteConLetra;
                _z["D1"] = (objPar.sCfdi_Condiciones != null) ? objPar.sCfdi_Condiciones.ToUpper() : "";
                _z["D2"] = objPar.domicilio_completo;
                // IEPS  FEDERAL 
                _z["IEPS_FEDERAL_PORCENTAJE"] = objConcepto.IEPS_porcentaje;
                _z["IEPS_FEDERAL_IMPORTE"] = objConcepto.IEPS_importe;
                _z["IEPS_FEDERAL_PRECIO"] = dImporteIEPSFederal;
                dsPM.Z.Rows.Add(_z);
                /********************************************************************/

                if (string.IsNullOrEmpty(objPar.descuento))
                {
                    cfdi.descuento = 0.00000000000001;
                    _comprobante["descuento"] = "0.00";
                }
                else
                {
                    cfdi.descuento = double.Parse(objPar.descuento);
                    _comprobante["descuento"] = objPar.descuento;
                }
                _comprobante["total"] = (double)objPar.total;


                if (idecimal == 1)
                    sreporte = string.Concat(sreporte, "?2DECIMALES");


                if (string.IsNullOrEmpty(objPar.descuento))
                {
                    cfdi.descuento = 0.00000000000001;
                    _comprobante["descuento"] = "0.00";
                }
                else
                {
                    cfdi.descuento = double.Parse(objPar.descuento);
                    _comprobante["descuento"] = objPar.descuento;
                }

                cfdi.total = (double)objPar.total;
                _comprobante["total"] = (double)objPar.total;

                mes = DateTime.Today.Month;
                string smes;
                smes = Convert.ToString(mes);

                if (smes.Length == 1)
                    sAnio_Mes = DateTime.Today.Year + "-0" + mes;
                else
                    sAnio_Mes = DateTime.Today.Year + "-" + mes;

                sNombre_ArchivoTMP = objPar.emisor_rfc + "-" + objPar.serie + "" + objPar.folio;
                string sfecha = Convert.ToString(DateTime.Now.Year + "-" + DateTime.Now.Month.ToString("d2"));
                string suser = objPar.Persona;

                string sTemp = string.Empty;
                if (!string.IsNullOrEmpty(objPar.sSucursal_Nombre))
                {
                    sTemp = Path.Combine("RPT_" + sNombreDB.Replace("KONEXUS_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha, objPar.sSucursal_Nombre);
                    sTemp = Path.Combine("RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha, objPar.sSucursal_Nombre);
                    spathString = Path.Combine(strDestino, "RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha, objPar.sSucursal_Nombre);
                }
                else
                {
                    sTemp = System.IO.Path.Combine("RPT_" + sNombreDB.Replace("KONEXUS_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha);
                    sTemp = System.IO.Path.Combine("RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha);
                    spathString = System.IO.Path.Combine(strDestino, "RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha);

                }
                sRutaArchivos = sTemp;
                try
                {
                    if (!Directory.Exists(@spathString))
                        Directory.CreateDirectory(@spathString);
                }
                catch (Exception ex)
                {
                    BitacoraController.gfLog("Servicio.CreateDirectory", "DB=" + sNombreDB + "|Empresa" + iNumeroCompania.ToString() + " *Factura " + iNumeroFactura.ToString() + " no  timbro,error al crear directorio " + spathString + ex.Message, "gfs_generaComprobantteFisica", "Servicio.asmx");
                    sResultado = string.Concat("sMensaje:", "Error", "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                    throw new Exception(sResultado);
                }

                objPar.sRuta_Cer = objPar.sRuta_Cer.Replace(@ConfigurationManager.AppSettings["sRuta_Cer_Replace_Origen"], @ConfigurationManager.AppSettings["sRuta_Cer_Replace_Destino"]);
                objPar.sRuta_Key = objPar.sRuta_Key.Replace(@ConfigurationManager.AppSettings["sRuta_Key_Replace_Origen"], @ConfigurationManager.AppSettings["sRuta_Key_Replace_Destino"]);

                string xml = string.Empty;
                try
                {
                    xml = objCFDi.getXML(cfdi, objPar.sRuta_Key, objPar.sContrasenia_Key, objPar.sRuta_Cer, sNombre_ArchivoTMP, spathString, ibanderanodosorigen, bandera_tar);
                }
                catch (Exception ex)
                {
                    return string.Concat("sMensaje:", " Incidencia ,", ex.Message, ", " + ex.InnerException.ToString() + "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                }


                XmlDocument xDoc1 = new XmlDocument();
                xDoc1.LoadXml(xml);
                try
                {
                    xDoc1.Save(spathString + "\\" + sNombre_ArchivoTMP + ".xml");
                    sRutaArchivos += "|" + spathString + "\\" + sNombre_ArchivoTMP + ".xml";
                }
                catch (Exception ex)
                {
                    BitacoraController.gfLog("Servicio.Save", "DB=" + sNombreDB + "|Empresa" + iNumeroCompania.ToString() + " *Factura " + iNumeroFactura + " no logro timbrar , detalle al guardarlo xml para enviar xml a timbrar" + ex.Message, "gfs_generaComprobantteFisica", "Servicio.asmx");
                    sResultado = string.Concat("sMensaje:", "Error", "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                }

                #region  Swicht de PAC
                banderaPAC = new PACController().lfPROFACTCreaCFDI(spathString, sNombre_ArchivoTMP, objPar.emisor_rfc, objPar.serie, objPar.folio, ref idError, ref Error, ref uuid, ref fechaTimbre, ref xmlTimbrado, sTempParam, objPar.sRuta_Cer, objPar.sRuta_Key, objPar.sContrasenia_Key);

                if (banderaPAC == false)
                {
                    xml = objCFDi.getXML(cfdi, objPar.sRuta_Key, objPar.sContrasenia_Key, objPar.sRuta_Cer, sNombre_ArchivoTMP, spathString, -1, false, false);
                    xDoc1 = new XmlDocument();
                    xDoc1.LoadXml(xml);
                    xDoc1.Save(spathString + "\\" + sNombre_ArchivoTMP + ".xml");
                    new PACController().lfSERVISIMCreaCFDI(spathString, sNombre_ArchivoTMP, objPar.emisor_rfc, objPar.serie, objPar.folio, ref idError, ref Error, ref uuid, ref fechaTimbre, ref xmlTimbrado, sTempParam);
                    sPAC = "SERVISIM";
                }
                #endregion

                if (idError != 0)
                {
                    FacturaController.gfEmailSend(string.Concat("ZambranoController,gfCreaCFDI", sPAC, " El tiempo de espera es demasiado |Incidencia", Error, "|BD:", sNombreDB, "|Parametros:" + sTempParam), FacturaController.listaContactosIncidenciaEmail, "INCIDENCIA FACTURACIÓN");
                    sMensaje = "Error";
                    uuid = Error;
                    sPATH = "ErrorAltimbrar";
                    return string.Concat("sMensaje:", "Error", "|sUUID:", Error, "|", "sPATH:", sPATH);
                }
                else
                {
                    // =============================================================
                    // Busca elementos dentro del string ya timbrado
                    new FacturaController().gfXMLConsultaElementos(xmlTimbrado, ref noCertificadoSAT, ref noCertificado, ref selloSAT, ref selloCFD);
                    sCbb = string.Concat("?re=", objPar.emisor_rfc, ";rr=", objPar.receptor_rfc, ";tt=", objPar.total, ";id=", uuid);
                    _comprobante["cbb"] = string.Concat(lfservicioQR + sCbb);
                    _comprobante["noCertificado"] = noCertificado;
                    dsPM.Comprobante.Rows.Add(_comprobante);
                    /********************************************************************/

                    // TimbreFiscalDigital
                    DataRow _TimbreFiscalDigital = dsPM.TimbreFiscalDigital.NewRow();
                    _TimbreFiscalDigital["UUID"] = uuid;
                    _TimbreFiscalDigital["FechaTimbrado"] = fechaTimbre.ToString("dd/MM/yyyy");
                    _TimbreFiscalDigital["selloSAT"] = selloSAT;
                    _TimbreFiscalDigital["selloCFD"] = selloCFD;
                    _TimbreFiscalDigital["noCertificadoSAT"] = noCertificadoSAT;
                    //noCertificado
                    dsPM.TimbreFiscalDigital.Rows.Add(_TimbreFiscalDigital);
                    //==============================================
                    XmlDocument objXmlTimbrado = new XmlDocument();
                    xml = xmlTimbrado.ToString();
                    //objXmlTimbrado.LoadXml(xml);

                    if (iTipoFacturaNotaCredito == 0)
                    {

                        tableadenda = ctrl.GetAdenda(sNombreDB, iNumeroFactura, objPar.companynumber);
                        if (tableadenda != null)
                        {
                            if (tableadenda.Rows[0][0] != DBNull.Value)
                            {
                                int iTipoAdendaTemp = Convert.ToInt32(tableadenda.Rows[0][0]);
                                switch (iTipoAdendaTemp)
                                {
                                    //Adenda PHILLIPS
                                    case 0:
                                        if (!AddendaController.AdendaPhillips(sNombreDB, iNumeroFactura, 0, iNumeroCompania, ref xml))
                                            return "false";
                                        break;
                                    //Adenda METALSA
                                    case 1:
                                        if (!AddendaController.AdendaMetalsa(sNombreDB, iNumeroFactura, 0, iNumeroCompania, sNombre_ArchivoTMP + ".pdf", ref xml))
                                            return "false";
                                        break;
                                    // Adenda  HP
                                    case 2:
                                        if (!AddendaController.AdendaHP(sNombreDB, iNumeroFactura, iNumeroCompania, ref xml))
                                            return "false";
                                        break;
                                    default:
                                        break;
                                }
                            }
                        }
                        objXmlTimbrado.LoadXml(xml);
                        objPar.sArchivo = spathString + "\\" + objPar.serie + "" + objPar.folio + "ingreso.xml";
                        strDestino = objPar.sArchivo;

                        try
                        {
                            sRutaArchivos += "|" + strDestino;
                            objXmlTimbrado.Save(strDestino);
                            BitacoraController.gfLogFacturaOK(uuid, strDestino, sTempParam, objPar.emisor_rfc);
                        }
                        catch (Exception ex)
                        {
                            BitacoraController.gfLog("Servicio.objXmlTimbrado.Save", "DB=" + sNombreDB + "|Empresa" + iNumeroCompania.ToString() + " *Factura " + iNumeroFactura.ToString() + "se timbro,pero hubo una incidencia al guardar en el servidor 19," + sTempParam + ex.Message, "gfs_generaComprobanteFisica", "Servicio.asmx");
                            sResultado = string.Concat("sMensaje:", "Error", "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                            throw new Exception(sResultado);
                        }
                    }
                    else
                    {
                        objXmlTimbrado.LoadXml(xml);
                        objPar.sArchivo = spathString + "\\" + objPar.serie + "" + objPar.folio + "egreso.xml";
                        strDestino = objPar.sArchivo;

                        try
                        {
                            sRutaArchivos += "|" + strDestino;
                            objXmlTimbrado.Save(strDestino);
                            BitacoraController.gfLogFacturaOK(uuid, strDestino, sTempParam);

                        }
                        catch (Exception ex)
                        {
                            BitacoraController.gfLog("Servicio.objXmlTimbrado.Save", "DB=" + sNombreDB + "|Empresa" + iNumeroCompania.ToString() + " *Factura " + iNumeroFactura.ToString() + "se timbro,pero hubo una incidencia al guardar en el servidor 19," + sTempParam + ex.Message, "gfs_generaComprobanteFisica", "Servicio.asmx");
                            sResultado = string.Concat("sMensaje:", "Error", "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                            throw new Exception(sResultado);
                        }
                    }

                    sMensaje = "OK";
                    sTempPath = string.Concat(strDestino.Replace(".xml", ".pdf"));
                    if (idecimal == 1)
                        sreporte = string.Concat(sreporte, "?2DECIMALES");
                    if (dImporteIEPS > 0)
                        sreporte = string.Concat(sreporte, "?IEPS");
                    if (banderaIEPS_FEDERAL)
                        sreporte = string.Concat(sreporte, "?FEDERAL");
                    if (bandera_tar)
                        sreporte = string.Concat(sreporte, "?CONTIENE_TAR");
                    // ================================================================================================
                    if (!lfCreaPDFZambrano(sreporte, sNombreDB, sTempPath, sTempParam, dsPM))
                        return string.Concat("sMensaje:", "Error al crear PDF, cancelar factura y comunicarse a sistemas |sUUID:", " Error al crear PDF, cancelar factura y comunicarse a sistemas ", "|", "sPATH:");
                    // ================================================================================================
                    try
                    {

                        FacturaController.gfDatosCorreoCliente(sNombreDB, iNumeroPersona, iNumeroCompania, objPar.sArchivo, sParametroOpcional, iNumeroFactura, iTipoFacturaNotaCredito, cfdi.receptor.nombre, cfdi.receptor.rfc, cfdi.emisor.nombre, cfdi.emisor.rfc, (objPar.serie + objPar.folio), (objPar.tipoDeComprobante + " " + objPar.moneda), objPar.total.ToString());
                    }
                    catch { }

                    FacturaController.gfSendFilesAllServers(sRutaArchivos, objPar.sArchivo);
                }
                strDestino48 = sTempPath.Replace(@ConfigurationManager.AppSettings["strDestino48_Origen"], @ConfigurationManager.AppSettings["strDestino48_Destino"]);
                // strDestino48 = sTempPath.Replace(@"\\VMS00001392", @"D:\Program files");
                sResultado = string.Concat("sMensaje:", sMensaje, "|sUUID:", uuid, "|", "sPATH:", strDestino48);
                return sResultado;
            }
            catch (Exception ex)
            {
                string sMensajeCancelacion = string.Empty;
                //FacturacionCancelacionController fcc = new FacturacionCancelacionController();
                //decimal dTotal = 0;
                //int iNumFac_TablaFactura = fcc.lfConsultaNumeroFactura(iNumeroFactura, iNumeroCompania, Globales.sNombreDB, ref iNumeroPersona, ref dTotal);
                //fcc.lfCreaProcesoCancelacion(iNumeroFactura, iNumFac_TablaFactura, iNumeroCompania, Globales.sNombreDB, iTipoFacturaNotaCredito, Convert.ToInt32(iNumeroPersona), dTotal, ref sMensajeCancelacion);

                //if (!string.IsNullOrEmpty(uuid))
                //    sResultado = string.Concat("sMensaje:", "OK", "|sUUID:", uuid, "|", "sPATH:", sTempPath.Replace(@WebConfigurationManager.AppSettings["strDestino48_Origen"], @WebConfigurationManager.AppSettings["strDestino48_Destino"]));
                //else
                sResultado = string.Concat("sMensaje:", " Error facturación intente nuevamente,", sMensajeCancelacion, " ,", ex.Message, ",", ex.InnerException, " |sUUID:", " Error", "|", "sPATH:", ex.InnerException);
                return sResultado;
            }

        }
        /// <summary>
        /// Genera pre-xml para mandar petición de 'timbrado' al SAT y regresa el XML autorizado del cual se genera un pdf de la factura concebida
        /// </summary>
        /// <param name="iNumeroFactura">Número de factura</param>
        /// <param name="iTipoFacturaNotaCredito">0 Factura , 1 Nota de credito</param>
        /// <param name="sDataBaseName">Nombre de la Base de datos</param>
        /// <param name="iNumeroCompania">Numero de Empresa</param>
        /// <param name="iNumeroPersona">Persona a enviar email o persona del cual tomar contactos y enviar el email</param>
        /// <param name="sParametroOpcional">Parametros opcionales</param>
        /// <returns>Resultado</returns>
        public string gfCreaCFDI(string sNombreDB, int iNumeroFactura, int iTipoFacturaNotaCredito, int iNumeroCompania, int iNumeroPersona, string sParametroOpcional)
        {
            #region Variables
            CFDIV3_2 dsPM = new CFDIV3_2();
            string sTempParam = string.Concat("iNumeroFactura=", iNumeroFactura.ToString(), "|iTipoFacturaNotaCredito=", iTipoFacturaNotaCredito.ToString(), "|sDataBaseName=", sNombreDB, "|iNumeroCompania=", iNumeroCompania.ToString(), "|iNumeroPersona=", iNumeroPersona, "|sParametroOpcional=", sParametroOpcional);
            string sNombreTipoDocumento = (iTipoFacturaNotaCredito == 0) ? "ingreso" : "egreso";
            string sRutaArchivos = string.Empty, sUUID = string.Empty, sPATH = string.Empty, sMensaje = string.Empty, sResultado = string.Empty, sTempPath = string.Empty, sPAC = "PROFACT";
            string sReporte_CDFI = string.Empty, sAnio_Mes = string.Empty, sNombre_ArchivoTMP = string.Empty, spathString = string.Empty;
            DataTable table = new DataTable(), tableadenda = new DataTable(), tablequote = new DataTable();
            string Error = string.Empty, uuid = string.Empty, xmlTimbrado = string.Empty;
            string lfservicioQR = "http://zxing.org/w/chart?cht=qr&chs=230x230&chld=L&choe=UTF-8&chl=";
            string strDestino = ConfigurationManager.AppSettings["strDestino"];
            ICFD objCFDi = new CFDI32();
            Parametros objPar = new Parametros();
            FacturaController ctrl = new FacturaController();
            objPar.companynumber = iNumeroCompania;
            objPar.Persona = iNumeroPersona.ToString();
            int mes = 0, idError = -1;
            bool banderaFacturaLibre = false, banderaPAC = false;
            DateTime fechaTimbre = new DateTime();
            string strDestino48 = string.Empty;
            int icontabilizada = 1, idocumenttype = -59, idocumentinternet = 1;
            Concepto objConcepto = null;
            string noCertificadoSAT = string.Empty;
            string noCertificado = string.Empty;
            string selloSAT = string.Empty;
            string selloCFD = string.Empty;
            string sCbb = string.Empty;

            #endregion

            if (FacturaController.gfValidaSiEsFactura(sNombreDB, iNumeroFactura, iNumeroCompania.ToString(), iTipoFacturaNotaCredito) > 0)
            {
                if (iTipoFacturaNotaCredito == 0)
                    FacturaController.gfb_GetDatosGenerales(sNombreDB, iNumeroCompania, iNumeroFactura, iTipoFacturaNotaCredito, ref objPar);
                else
                    FacturaController.gfb_GetDatosGenerales(sNombreDB, iNumeroCompania, iNumeroFactura, 1, ref objPar);
            }
            else
                return string.Concat("sMensaje:", "OK", "|sUUID:", "", "|", "sPATH:", "");
            try
            {
                Comprobante cfdi = new Comprobante();
                cfdi.version = "3.2";
                cfdi.serie = objPar.serie;
                cfdi.folio = objPar.folio;
                cfdi.fecha = DateTime.Now;
                cfdi.formaDePago = objPar.formaDePago;
                cfdi.condicionesDePago = objPar.condicionesDePago;
                cfdi.tipoCambio = objPar.tipoCambio;
                cfdi.moneda = objPar.moneda;
                cfdi.tipoDeComprobante = objPar.tipoDeComprobante;
                cfdi.metodoDePago = objPar.metodoDePago;
                cfdi.lugarExpedicion = objPar.lugarExpedicion;
                cfdi.numCtaPago = (objPar.numCtaPago.Length == 3) ? objPar.numCtaPago.PadLeft(4, '0') : objPar.numCtaPago;
                cfdi.emisor.rfc = objPar.emisor_rfc;
                cfdi.emisor.nombre = objPar.emisor_nombre;
                cfdi.emisor.regimenFiscal.regimen = objPar.emisor_regimenFiscal_regimen;
                cfdi.emisor.domicilioFiscal.calle = objPar.emisor_domicilioFiscal_calle;
                cfdi.emisor.domicilioFiscal.colonia = objPar.emisor_domicilioFiscal_colonia;
                cfdi.emisor.domicilioFiscal.municipio = objPar.emisor_domicilioFiscal_municipio;
                cfdi.emisor.domicilioFiscal.estado = objPar.emisor_domicilioFiscal_estado;
                cfdi.emisor.domicilioFiscal.pais = objPar.emisor_expedidoEn_pais;
                cfdi.emisor.domicilioFiscal.codigoPostal = objPar.emisor_domicilioFiscal_codigoPostal;
                /********************************************************************/
                //Comprobante 
                DataRow _comprobante = dsPM.Comprobante.NewRow();
                _comprobante["version"] = "3.2";
                _comprobante["serie"] = objPar.serie;
                _comprobante["folio"] = objPar.folio;
                _comprobante["fecha"] = DateTime.Now.ToString("dd'/'MM'/'yyyy HH:mm:ss");
                _comprobante["formaDePago"] = objPar.formaDePago;
                _comprobante["condicionesDePago"] = objPar.condicionesDePago;
                _comprobante["tipoCambio"] = objPar.tipoCambio;
                _comprobante["moneda"] = objPar.moneda;
                _comprobante["tipoDeComprobante"] = objPar.tipoDeComprobante.ToUpper();
                _comprobante["metodoDePago"] = objPar.metodoDePago;
                _comprobante["lugarExpedicion"] = objPar.lugarExpedicion;
                _comprobante["numCtaPago"] = objPar.numCtaPago;
                /********************************************************************/
                //Emisor
                DataRow _emisor = dsPM.Emisor.NewRow();
                _emisor["rfc"] = objPar.emisor_rfc;
                _emisor["nombre"] = objPar.emisor_nombre;
                objPar.emisor_logo = objPar.emisor_logo.Replace(@ConfigurationManager.AppSettings["emisor_logo_Origen"], @ConfigurationManager.AppSettings["emisor_logo_Destino"]);
                _emisor["logo"] = objPar.emisor_logo;
                dsPM.Emisor.Rows.Add(_emisor);
                /********************************************************************/
                //Emisor regimenFiscal
                DataRow _regimenFiscal = dsPM.RegimenFiscal.NewRow();
                _regimenFiscal["Regimen"] = objPar.emisor_regimenFiscal_regimen;
                dsPM.RegimenFiscal.Rows.Add(_regimenFiscal);
                /********************************************************************/
                //Emisor domicilioFiscal
                DataRow _domicilioFiscal = dsPM.DomicilioFiscal.NewRow();
                _domicilioFiscal["calle"] = objPar.emisor_domicilioFiscal_calle;
                _domicilioFiscal["colonia"] = objPar.emisor_domicilioFiscal_colonia;
                _domicilioFiscal["municipio"] = objPar.emisor_domicilioFiscal_municipio;
                _domicilioFiscal["estado"] = objPar.emisor_domicilioFiscal_estado;
                _domicilioFiscal["pais"] = objPar.emisor_domicilioFiscal_pais;
                _domicilioFiscal["codigoPostal"] = objPar.emisor_domicilioFiscal_codigoPostal;
                dsPM.DomicilioFiscal.Rows.Add(_domicilioFiscal);

                //if (objPar.emisor_expedidoEn_calle != "")
                DataRow _expedidoEn = dsPM.ExpedidoEn.NewRow();

                if (!string.IsNullOrEmpty(objPar.emisor_expedidoEn_calle))
                {
                    cfdi.emisor.expedidoEn = new Ubicacion();
                    cfdi.emisor.expedidoEn.calle = objPar.emisor_expedidoEn_calle;
                    cfdi.emisor.expedidoEn.noExterior = objPar.emisor_expedidoEn_noExterior;
                    cfdi.emisor.expedidoEn.noInterior = objPar.emisor_expedidoEn_noInterior;
                    cfdi.emisor.expedidoEn.colonia = objPar.emisor_expedidoEn_colonia;
                    cfdi.emisor.expedidoEn.localidad = objPar.emisor_expedidoEn_localidad;
                    cfdi.emisor.expedidoEn.referencia = objPar.emisor_expedidoEn_referencia;
                    cfdi.emisor.expedidoEn.municipio = objPar.emisor_expedidoEn_municipio;
                    cfdi.emisor.expedidoEn.estado = objPar.emisor_expedidoEn_estado;
                    cfdi.emisor.expedidoEn.pais = objPar.emisor_expedidoEn_pais;
                    cfdi.emisor.expedidoEn.codigoPostal = objPar.emisor_expedidoEn_codigoPostal;
                    objPar.sRuta_ArchivoTMP = "";
                    cfdi.lugarExpedicion = objPar.lugarExpedicion;
                    /********************************************************************/
                    //expedidoEn
                    _expedidoEn["calle"] = objPar.emisor_domicilioFiscal_calle;
                    _expedidoEn["colonia"] = objPar.emisor_domicilioFiscal_colonia;
                    _expedidoEn["localidad"] = objPar.emisor_expedidoEn_localidad;
                    _expedidoEn["referencia"] = objPar.emisor_expedidoEn_referencia;
                    _expedidoEn["municipio"] = objPar.emisor_domicilioFiscal_municipio;
                    _expedidoEn["estado"] = objPar.emisor_domicilioFiscal_estado;
                    _expedidoEn["pais"] = objPar.emisor_domicilioFiscal_pais;
                    _expedidoEn["codigoPostal"] = objPar.emisor_domicilioFiscal_codigoPostal;
                    dsPM.ExpedidoEn.Rows.Add(_expedidoEn);
                    /********************************************************************/
                }
                else
                {
                    cfdi.lugarExpedicion = objPar.lugarExpedicion;
                    _comprobante["lugarExpedicion"] = objPar.lugarExpedicion;

                    _expedidoEn["calle"] = string.Concat(objPar.emisor_domicilioFiscal_calle, " ", objPar.emisor_domicilioFiscal_colonia, " ", objPar.emisor_domicilioFiscal_municipio, " ", objPar.emisor_domicilioFiscal_estado, " ", objPar.emisor_domicilioFiscal_codigoPostal);
                    dsPM.ExpedidoEn.Rows.Add(_expedidoEn);
                }

                //if (sNombreDB == "INTEGRA_CPAE" || sNombreDB == "INTEGRA_TDS" && string.IsNullOrEmpty(objPar.emisor_expedidoEn_calle))
                //{

                //    parametros.lugarExpedicion = string.Concat(parametros.emisor_domicilioFiscal_calle, " ", parametros.emisor_domicilioFiscal_colonia, " ", parametros.emisor_domicilioFiscal_municipio, " ", parametros.emisor_domicilioFiscal_estado, " ", parametros.emisor_domicilioFiscal_codigoPostal);
                //}


                cfdi.receptor.rfc = objPar.receptor_rfc;
                cfdi.receptor.nombre = objPar.receptor_nombre;
                /********************************************************************/
                //receptor
                DataRow _receptor = dsPM.Receptor.NewRow();
                _receptor["rfc"] = objPar.receptor_rfc;
                _receptor["nombre"] = objPar.receptor_nombre;
                dsPM.Receptor.Rows.Add(_receptor);
                /********************************************************************/
                cfdi.receptor.domicilio = new Ubicacion();
                cfdi.receptor.domicilio.calle = objPar.receptor_domicilio_calle;
                cfdi.receptor.domicilio.noExterior = objPar.receptor_domicilio_noExterior;
                cfdi.receptor.domicilio.noInterior = objPar.receptor_domicilio_noInterior;
                cfdi.receptor.domicilio.colonia = objPar.receptor_domicilio_colonia;
                cfdi.receptor.domicilio.localidad = objPar.receptor_domicilio_localidad;
                cfdi.receptor.domicilio.referencia = objPar.receptor_domicilio_referencia;
                cfdi.receptor.domicilio.municipio = objPar.receptor_domicilio_municipio;
                cfdi.receptor.domicilio.estado = objPar.receptor_domicilio_estado;
                cfdi.receptor.domicilio.pais = objPar.receptor_domicilio_pais;
                cfdi.receptor.domicilio.codigoPostal = objPar.receptor_domicilio_codigoPostal;
                /********************************************************************/
                //domicilio
                DataRow _domicilio = dsPM.Domicilio.NewRow();
                _domicilio["calle"] = objPar.receptor_domicilio_calle;
                _domicilio["noExterior"] = objPar.receptor_domicilio_noExterior;
                _domicilio["noInterior"] = objPar.receptor_domicilio_noInterior;
                _domicilio["colonia"] = objPar.receptor_domicilio_colonia;
                _domicilio["localidad"] = objPar.receptor_domicilio_localidad;
                _domicilio["referencia"] = objPar.receptor_domicilio_referencia;
                _domicilio["municipio"] = objPar.receptor_domicilio_municipio;
                _domicilio["estado"] = objPar.receptor_domicilio_estado;
                _domicilio["pais"] = objPar.receptor_domicilio_pais;
                _domicilio["codigoPostal"] = objPar.receptor_domicilio_codigoPostal;
                dsPM.Domicilio.Rows.Add(_domicilio);
                // Consulta Partidas de factura
                table = FacturaController.GetPartidasGeneral(sNombreDB, iNumeroFactura, iTipoFacturaNotaCredito, objPar.companynumber, icontabilizada, idocumenttype, idocumentinternet);

                if (table.Rows.Count > 0)
                {
                    if (sNombreDB == "INTEGRA_TABLADECO")
                        banderaFacturaLibre = (Convert.ToInt32(table.Rows[0]["FACTURADESCRIPCION"]) == -105) ? true : false;

                    if (sNombreDB == "INTEGRA_CPAE" && table.Rows[0]["Caracteristicas"] != DBNull.Value)
                        sTempParam = string.Concat(sParametroOpcional, "PDFNORMAL");

                    foreach (DataRow row in table.Rows)
                    {

                        string sTempCadena = string.IsNullOrEmpty(row[5].ToString()) ? "-" : row[5].ToString();
                        // PARCHE PARA CPAE
                        sTempCadena = (sTempCadena == "-" && sNombreDB == "INTEGRA_CPAE") ? row["Caracteristicas"].ToString() : sTempCadena;

                        objConcepto = new Concepto();
                        objConcepto.noIdentificacion = row[4].ToString();
                        objConcepto.descripcion = sTempCadena;
                        objConcepto.unidad = row[6].ToString();
                        objConcepto.valorUnitario = Convert.ToDouble(row[8]);
                        objConcepto.cantidad = Convert.ToDouble(row[7]);
                        objConcepto.importe = objConcepto.cantidad * objConcepto.valorUnitario;
                        cfdi.addConcepto(objConcepto);
                        /********************************************************************/
                        //concepto
                        DataRow _concepto = dsPM.Concepto.NewRow();
                        _concepto["noIdentificacion"] = row[4].ToString();
                        _concepto["descripcion"] = sTempCadena;
                        _concepto["unidad"] = row[6].ToString();
                        _concepto["valorUnitario"] = Convert.ToDouble(row[8]).ToString("G");
                        _concepto["cantidad"] = Convert.ToDouble(row[7]);
                        _concepto["importe"] = (objConcepto.cantidad * objConcepto.valorUnitario).ToString("G");
                        dsPM.Concepto.Rows.Add(_concepto);
                        /********************************************************************/
                    }
                }
                else
                    throw new Exception("*Sin detalle de partidas");

                // Consulta traslados (impuestos) IVA E IEPS
                DataTable dtTraslados = FacturaController.ConsultaTrasladosxIDFactura(sNombreDB, iNumeroCompania, iNumeroFactura);
                if (dtTraslados != null)
                {
                    foreach (DataRow item in dtTraslados.Rows)
                    {
                        if (item["Operacion"].ToString() == "+")
                        {
                            Traslado ot = new Traslado();
                            ot.tasa = Convert.ToDouble(item["tasa"]);
                            ot.impuesto = item["impuesto"].ToString();
                            ot.importe = Convert.ToDouble(item["importe"]); ;
                            cfdi.impuestos.addTraslado(ot);
                            cfdi.subTotal = (double)objPar.subtotal;
                            //=============================================
                            // PARCHE TABLADECO

                            if (sNombreDB == "INTEGRA_TABLADECO")
                                sTempParam = string.Concat(sTempParam, "PDFRETENCION");

                            DataRow _Traslado = dsPM.Traslado.NewRow();
                            _Traslado["tasa"] = objPar.traslado_tasa;
                            _Traslado["impuesto"] = objPar.traslado_impuesto;
                            _Traslado["importe"] = objPar.traslado_importe;
                            dsPM.Traslado.Rows.Add(_Traslado);

                            //MEGA PARCHE
                            DataRow _Impuestos = dsPM.Impuestos.NewRow();
                            //_Impuestos["totalImpuestosRetenidos"] = ot.importe
                            _Impuestos["totalImpuestosTrasladados"] = ot.importe.ToString("0.##");
                            dsPM.Impuestos.Rows.Add(_Impuestos);
                            _comprobante["subTotal"] = (double)objPar.subtotal;

                            //}
                            //else 
                            //{
                            //    //DataRow _Traslado2 = dsPM.Traslado.NewRow();
                            //_Traslado2["tasa"] = objPar.traslado_tasa;
                            //_Traslado2["impuesto"] = objPar.traslado_impuesto;
                            //_Traslado2["importe"] = objPar.traslado_importe;
                            //dsPM.Traslado.Rows.Add(_Traslado2);
                            //_comprobante["subTotal"] = (double)objPar.subtotal;

                            //DataRow _Impuestos2 = dsPM.Impuestos.NewRow();
                            ////_Impuestos2["totalImpuestosRetenidos"] = (objPar.impuestos_dRETISR + objPar.impuestos_dRETIVA).ToString("0.##");
                            //_Impuestos2["totalImpuestosTrasladados"] = objPar.impuestos_dCfdi_ImporteIVA.ToString("0.##");
                            //dsPM.Impuestos.Rows.Add(_Impuestos2);
                            //}
                            //====================================================================
                        }
                        if (item["Operacion"].ToString() == "-")
                        {
                            Retencion or = new Retencion();
                            or.impuesto = item["impuesto"].ToString();
                            or.importe = Convert.ToDouble(item["importe"]);
                            cfdi.impuestos.addRetencion(or);
                            cfdi.subTotal = (double)objPar.subtotal;

                            DataRow _Retencion = dsPM.Retencion.NewRow();
                            // ====================================================================================
                            //MEGA PARCHE

                            if (sNombreDB == "INTEGRA_TABLADECO")
                                _Retencion["impuesto"] = "RETENCION " + or.impuesto.ToString() + " 4%";
                            else
                                _Retencion["impuesto"] = or.impuesto.ToString();
                            // ====================================================================================
                            _Retencion["importe"] = or.importe.ToString("0.##");
                            dsPM.Retencion.Rows.Add(_Retencion);
                        }
                    }


                }
                else
                {
                    Traslado objTraslado = new Traslado();
                    objTraslado.tasa = (double)objPar.traslado_tasa;
                    objTraslado.impuesto = "IVA";
                    objTraslado.importe = (double)objPar.impuestos_dCfdi_ImporteIVA;
                    cfdi.impuestos.addTraslado(objTraslado);
                    cfdi.subTotal = (double)objPar.subtotal;

                    DataRow _Traslado = dsPM.Traslado.NewRow();
                    _Traslado["tasa"] = objPar.traslado_tasa;
                    _Traslado["impuesto"] = objPar.traslado_impuesto;
                    _Traslado["importe"] = objPar.traslado_importe;
                    dsPM.Traslado.Rows.Add(_Traslado);

                    DataRow _Impuestos = dsPM.Impuestos.NewRow();
                    _Impuestos["totalImpuestosRetenidos"] = (objPar.impuestos_dRETISR + objPar.impuestos_dRETIVA).ToString("0.##");
                    _Impuestos["totalImpuestosTrasladados"] = objPar.impuestos_dCfdi_ImporteIVA.ToString("0.##");
                    dsPM.Impuestos.Rows.Add(_Impuestos);
                    _comprobante["subTotal"] = (double)objPar.subtotal;

                }



                /********************************************************************/
                // Z detalles
                DataRow _z = dsPM.Z.NewRow();
                _z["Observaciones"] = string.IsNullOrEmpty(objPar.sObservaciones) ? " " : objPar.sObservaciones;
                _z["subtotal"] = objPar.subtotal.ToString();
                //_z["DomicilioEstablecimiento"] = (objPar.iDatoSucursal == 0 && !string.IsNullOrEmpty(objPar.lugarExpedicion)) ? objPar.lugarExpedicion : FacturaController.lfDomicilioEstablecimientoGet(sNombreDB, objPar.iDatoSucursal, objPar.companynumber);
                _z["DomicilioEstablecimiento"] = FacturaController.lfDomicilioEstablecimientoGet(sNombreDB, objPar.iDatoSucursal, objPar.companynumber);
                string sImporteConLetra = FacturaController.import_to_string(sNombreDB, objPar.companynumber, objPar.total, 0, iNumeroFactura, iTipoFacturaNotaCredito).Rows[0][0].ToString();
                _z["ImporteConLetra"] = sImporteConLetra;
                _z["D1"] = (objPar.sCfdi_Condiciones != null) ? objPar.sCfdi_Condiciones.ToUpper() : "";
                if (sNombreDB == "KONEXUS_IQELECTRONICS")
                    _z["D2"] = ctrl.ConsultaOrdendeCompra(sNombreDB, iNumeroFactura, iNumeroCompania, 0);
                dsPM.Z.Rows.Add(_z);

                if (string.IsNullOrEmpty(objPar.descuento))
                {
                    cfdi.descuento = 0.00000000000001;
                    _comprobante["descuento"] = "0.00";
                }
                else
                {
                    cfdi.descuento = double.Parse(objPar.descuento);
                    _comprobante["descuento"] = objPar.descuento;
                }

                cfdi.total = (double)objPar.total;
                _comprobante["total"] = (double)objPar.total;

                mes = DateTime.Today.Month;
                string smes;
                smes = Convert.ToString(mes);

                if (smes.Length == 1)
                    sAnio_Mes = DateTime.Today.Year + "-0" + mes;
                else
                    sAnio_Mes = DateTime.Today.Year + "-" + mes;

                sNombre_ArchivoTMP = objPar.emisor_rfc + "-" + objPar.serie + "" + objPar.folio;
                string sfecha = Convert.ToString(DateTime.Now.Year + "-" + DateTime.Now.Month.ToString("d2"));
                string suser = objPar.Persona;

                string sTemp = string.Empty;
                if (!string.IsNullOrEmpty(objPar.sSucursal_Nombre))
                {
                    sTemp = Path.Combine("RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha, objPar.sSucursal_Nombre);
                    spathString = Path.Combine(strDestino, "RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha, objPar.sSucursal_Nombre);
                }
                else
                {
                    sTemp = System.IO.Path.Combine("RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha);
                    spathString = System.IO.Path.Combine(strDestino, "RPT_" + sNombreDB.Replace("INTEGRA_", ""), "CFDI", objPar.sNombreCortoEmisor, sfecha);
                }
                sRutaArchivos = sTemp;
                try
                {
                    if (!Directory.Exists(@spathString))
                        Directory.CreateDirectory(@spathString);
                }
                catch (Exception ex)
                {
                    BitacoraController.gfLogFacturaRegistroError("CrearCarpetaPersonaMoral", string.Concat("NO TIMBRO,ERROR AL CREAR DIRECTORIO|gfs_generaComprobanteMoral|", spathString, "-", ex.Message), @sTempParam);
                    sResultado = string.Concat("sMensaje:", "Error,", ex.Message, "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                    throw new Exception(sResultado);
                }

                objPar.sRuta_Cer = objPar.sRuta_Cer.Replace(@ConfigurationManager.AppSettings["sRuta_Cer_Replace_Origen"], @ConfigurationManager.AppSettings["sRuta_Cer_Replace_Destino"]);
                objPar.sRuta_Key = objPar.sRuta_Key.Replace(@ConfigurationManager.AppSettings["sRuta_Key_Replace_Origen"], @ConfigurationManager.AppSettings["sRuta_Key_Replace_Destino"]);

                // Construye el XML con el certificado
                string xml = string.Empty;
                try
                {
                    xml = objCFDi.getXML(cfdi, objPar.sRuta_Key, objPar.sContrasenia_Key, objPar.sRuta_Cer, sNombre_ArchivoTMP, spathString);
                }
                catch (Exception ex)
                {
                    return string.Concat("sMensaje:", " Incidencia ,", ex.Message, ", " + ex.InnerException.ToString() + "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                }

                XmlDocument xDoc1 = new XmlDocument();
                xDoc1.LoadXml(xml);
                try
                {
                    //sTempPath = spathString + "\\" + sNombre_ArchivoTMP + ".xml";
                    xDoc1.Save(spathString + "\\" + sNombre_ArchivoTMP + ".xml");
                    sRutaArchivos += "|" + spathString + "\\" + sNombre_ArchivoTMP + ".xml";
                }
                catch (Exception ex)
                {
                    BitacoraController.gfLogFacturaRegistroError("GuardarXMLPersonaMoral", string.Concat("NO LOGRO TIMBRAR , DETALLE AL GUARDARLO XML PARA ENVIAR XML A TIMBRAR|gfs_generaComprobanteMoral|", "-", ex.Message), @sTempParam);
                    sResultado = string.Concat("sMensaje:", "Error,", ex.Message, "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                    throw new Exception(sResultado);
                }
                //#region Pruebas

                sCbb = string.Concat("?re=", objPar.emisor_rfc, ";rr=", objPar.receptor_rfc, ";tt=", objPar.total, ";id=", uuid);

                _comprobante["cbb"] = string.Concat(lfservicioQR + sCbb);
                dsPM.Comprobante.Rows.Add(_comprobante);

                sTempPath = spathString + "\\" + sNombre_ArchivoTMP + ".pdf";
                // =================================================================================
                FacturaController.gfCreaPDF(sNombreDB, iTipoFacturaNotaCredito, banderaFacturaLibre, sTempPath, sTempParam, dsPM);
                //#endregion

                #region  Swicht de PAC
                banderaPAC = new PACController().lfPROFACTCreaCFDI(spathString, sNombre_ArchivoTMP, objPar.emisor_rfc, objPar.serie, objPar.folio, ref idError, ref Error, ref uuid, ref fechaTimbre, ref xmlTimbrado, sTempParam, objPar.sRuta_Cer, objPar.sRuta_Key, objPar.sContrasenia_Key);
                if (banderaPAC == false)
                {
                    xml = objCFDi.getXML(cfdi, objPar.sRuta_Key, objPar.sContrasenia_Key, objPar.sRuta_Cer, sNombre_ArchivoTMP, spathString, -1, false, false);
                    xDoc1 = new XmlDocument();
                    xDoc1.LoadXml(xml);
                    xDoc1.Save(spathString + "\\" + sNombre_ArchivoTMP + ".xml");
                    new PACController().lfSERVISIMCreaCFDI(spathString, sNombre_ArchivoTMP, objPar.emisor_rfc, objPar.serie, objPar.folio, ref idError, ref Error, ref uuid, ref fechaTimbre, ref xmlTimbrado, sTempParam);
                    sPAC = "SERVISIM";
                }
                #endregion

                if (idError != 0)
                {
                    sMensaje = "Error";
                    uuid = Error;
                    sPATH = "ErrorAltimbrar";
                    return string.Concat("sMensaje:", "Error,", Error, "|sUUID:", Error, "|", "sPATH:", sPATH);
                }
                else
                {
                    // =============================================================
                    // Busca elementos dentro del string ya timbrado
                    sCbb = string.Concat("?re=", objPar.emisor_rfc, ";rr=", objPar.receptor_rfc, ";tt=", objPar.total, ";id=", uuid);
                    new FacturaController().gfXMLConsultaElementos(xmlTimbrado, ref noCertificadoSAT, ref noCertificado, ref selloSAT, ref selloCFD);

                    _comprobante["cbb"] = string.Concat(lfservicioQR + sCbb);
                    dsPM.Comprobante.Rows.Add(_comprobante);
                    /********************************************************************/
                    // TimbreFiscalDigital
                    DataRow _TimbreFiscalDigital = dsPM.TimbreFiscalDigital.NewRow();
                    _TimbreFiscalDigital["UUID"] = uuid;
                    _TimbreFiscalDigital["FechaTimbrado"] = fechaTimbre.ToString("dd/MM/yyyy");
                    _TimbreFiscalDigital["selloSAT"] = selloSAT;
                    _TimbreFiscalDigital["selloCFD"] = selloCFD;
                    _TimbreFiscalDigital["noCertificadoSAT"] = noCertificadoSAT;
                    //noCertificado
                    _comprobante["noCertificado"] = noCertificado;
                    dsPM.TimbreFiscalDigital.Rows.Add(_TimbreFiscalDigital);
                    //==============================================
                    XmlDocument objXmlTimbrado = new XmlDocument();
                    xml = xmlTimbrado.ToString();
                    if (iTipoFacturaNotaCredito == 0)
                    {
                        tableadenda = ctrl.GetAdenda(sNombreDB, iNumeroFactura, objPar.companynumber);
                        if (tableadenda.Rows[0][0] != DBNull.Value)
                        {
                            int iTipoAdendaTemp = Convert.ToInt32(tableadenda.Rows[0][0]);
                            switch (iTipoAdendaTemp)
                            {
                                //Adenda PHILLIPS
                                case 0:
                                    if (!AddendaController.AdendaPhillips(sNombreDB, iNumeroFactura, 0, iNumeroCompania, ref xml))
                                        return "false";
                                    break;
                                //Adenda METALSA
                                case 1:
                                    if (!AddendaController.AdendaMetalsa(sNombreDB, iNumeroFactura, 0, iNumeroCompania, sNombre_ArchivoTMP + ".pdf", ref xml))
                                        return "false";
                                    break;
                                // Adenda  HP
                                case 2:
                                    if (!AddendaController.AdendaHP(sNombreDB, iNumeroFactura, iNumeroCompania, ref xml))
                                        return "false";
                                    break;
                                default:
                                    break;
                            }
                        }
                        objXmlTimbrado.LoadXml(xml);
                        objPar.sArchivo = spathString + "\\" + objPar.serie + "" + objPar.folio + "" + sNombreTipoDocumento + ".xml";
                        strDestino = objPar.sArchivo;
                        try
                        {
                            sRutaArchivos += "|" + strDestino;
                            objXmlTimbrado.Save(strDestino);
                            BitacoraController.gfLogFacturaOK(uuid, strDestino, sPAC + "-" + sTempParam, objPar.emisor_rfc);
                        }
                        catch (Exception ex)
                        {
                            BitacoraController.gfLogFacturaRegistroError("CrearDirectorio", string.Concat("NO TIMBRO,ERROR AL CREAR DIRECTORIO|gfs_generaComprobanteMoral|", "-", ex.Message), @sTempParam);
                            sResultado = string.Concat("sMensaje:", "Error,", ex.Message, "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                            throw new Exception(sResultado);
                        }
                    }
                    else
                    {
                        objXmlTimbrado.LoadXml(xml);
                        objPar.sArchivo = spathString + "\\" + objPar.serie + "" + objPar.folio + "egreso.xml";
                        strDestino = objPar.sArchivo;
                        try
                        {
                            sRutaArchivos += "|" + strDestino;
                            objXmlTimbrado.Save(strDestino);
                            BitacoraController.gfLogFacturaOK(uuid, strDestino, sPAC + "-" + sTempParam);
                        }
                        catch (Exception ex)
                        {
                            BitacoraController.gfLog("Servicio.objXmlTimbrado.Save", "DB=" + sNombreDB + "|Empresa" + iNumeroCompania.ToString() + " *Factura " + iNumeroFactura.ToString() + "se timbro,pero hubo una incidencia al guardar en el servidor 19," + sTempParam + ex.Message, "gfs_generaComprobanteFisica", "Servicio.asmx");
                            sResultado = string.Concat("sMensaje:", "Error,", ex.Message, "|sUUID:", "Error", "|", "sPATH:", ex.Message);
                            throw new Exception(sResultado);
                        }
                    }
                    sMensaje = "OK";
                    sTempPath = string.Concat(strDestino.Replace(".xml", ".pdf"));
                    // =================================================================================
                    if (!FacturaController.gfCreaPDF(sNombreDB, iTipoFacturaNotaCredito, banderaFacturaLibre, sTempPath, sTempParam, dsPM))
                        return string.Concat("sMensaje:", "Error al crear PDF, cancelar factura y comunicarse a sistemas |sUUID:", " Error al crear PDF, cancelar factura y comunicarse a sistemas ", "|", "sPATH:");
                    //lfCreaPDFSinRetencion(sDataBaseName, iTipoFacturaNotaCredito, banderaFacturaLibre, sTempPath, sTempParam);
                    // =================================================================================
                    try
                    {
                        FacturaController.gfDatosCorreoCliente(sNombreDB, iNumeroPersona, iNumeroCompania, objPar.sArchivo, sParametroOpcional, iNumeroFactura, iTipoFacturaNotaCredito, cfdi.receptor.nombre, cfdi.receptor.rfc, cfdi.emisor.nombre, cfdi.emisor.rfc, (objPar.serie + objPar.folio), (objPar.tipoDeComprobante + " " + objPar.moneda), objPar.total.ToString());
                    }
                    catch { }
                    FacturaController.gfSendFilesAllServers(sRutaArchivos, objPar.sArchivo);
                }

                strDestino48 = sTempPath.Replace(@ConfigurationManager.AppSettings["strDestino48_Origen"], @ConfigurationManager.AppSettings["strDestino48_Destino"]);
                sResultado = string.Concat("sMensaje:", sMensaje, "|sUUID:", uuid, "|", "sPATH:", strDestino48);
                return sResultado;
            }
            catch (Exception ex)
            {
                string sMensajeCancelacion = string.Empty;
                //if (Globales.sNombreDB == "INTEGRA_TABLADECO")
                //{
                //    FacturacionCancelacionController fcc = new FacturacionCancelacionController();
                //    decimal dTotal = 0;
                //    int iNumFac_TablaFactura = fcc.lfConsultaNumeroFactura(iNumeroFactura, iNumeroCompania, Globales.sNombreDB, ref iNumeroPersona, ref dTotal);
                //    fcc.lfCreaProcesoCancelacion(iNumeroFactura, iNumFac_TablaFactura, iNumeroCompania, Globales.sNombreDB, iTipoFacturaNotaCredito, Convert.ToInt32(iNumeroPersona), dTotal, ref sMensajeCancelacion);
                //}
                sResultado = string.Concat("sMensaje:", " Error facturación intente nuevamente,", sMensajeCancelacion, " ,", ex.Message, ",", ex.InnerException, " |sUUID:", " Error", "|", "sPATH:", ex.InnerException);
                return sResultado;
            }
        }
Beispiel #4
0
        //private double _totalImpuestosRetenidos;
        //private double _totalImpuestosTrasladados;

        //----------------------------------------

        public void addRetencion(Retencion retencion)
        {
            retenciones.Add(retencion);
        }