/// <summary>
        /// funcion que crea una factura nueva sin gastos de administracion
        /// </summary>
        /// <param name="sFolio"></param>
        /// <param name="iTipo">1-Tradicional, 2-Electronica</param>
        /// <returns></returns>
        private void CrearFactura(List<MedNeg.Facturas.BlDetalleFacturaReceta> lstDetalleFactura, int iTipo)
        {
            //TODO: GT Paso 3: Generar la factura con todo lo contabilizado de las recetas que van a conformar esta factura.

             //objeto que contiene la receta
            string sRutaArchivoConfig = Server.MapPath("~/Archivos/Configuracion.xml");
            string sRutaCertificados = Server.MapPath("~/Archivos/");
            string sFacturaAdicional = "";
            string sFacturaAdicional2 = "";

            MedDAL.DAL.recetas oReceta = new MedDAL.DAL.recetas();
            MedNeg.Recetas.BlRecetas oblReceta = new MedNeg.Recetas.BlRecetas();
            
            MedNeg.Configuracion.BlConfiguracion oblConfiguracion = new MedNeg.Configuracion.BlConfiguracion();
            MedDAL.Configuracion.DALConfiguracion odalConfiguracion = new MedDAL.Configuracion.DALConfiguracion();

            MedDAL.DAL.facturas oFacturas = new MedDAL.DAL.facturas();
            MedNeg.Facturas.BlFacturas oblFacturas = new MedNeg.Facturas.BlFacturas();
            MedDAL.DAL.FacturacionDeRecetas oFacturacionRecetas = new MedDAL.DAL.FacturacionDeRecetas();
           

            decimal dSubtotal = 0;
            int idReceta = 0;

            odalConfiguracion = (MedDAL.Configuracion.DALConfiguracion)oblConfiguracion.CargaDatos(sRutaArchivoConfig);
          
            //ID Cliente
            oFacturas.idCliente = (int)Session["sIdCliente"];

            //IDRECETA
            //oFacturas.idReceta = oReceta.idReceta;
            
            //Asiganr el folio de la factura
            if (odalConfiguracion.iFacturasAutomatico == 1)
            {
                oFacturas.Folio = odalConfiguracion.iFolioFacturas++.ToString();
            }
            else
            {
                string sFolioAux;
                sFolioAux = "FxR" + DateTime.Now.ToShortDateString() + iContadorFacturas.ToString();
                
                //Validar que no exista el folio
                while (!ValidaFolioRepetido(sFolioAux))
                    sFolioAux = "FxR" + DateTime.Now.ToShortDateString() + iContadorFacturas++.ToString();

                oFacturas.Folio = sFolioAux;
            }

            string sIdFolioFactura=oFacturas.Folio;

            //Fecha
            oFacturas.Fecha = DateTime.Now;
            oFacturas.FechaAplicacion = DateTime.Now;

            //tipo (4 por que son de receta)
            oFacturas.TipoFactura = "4";

            //Estatus (3 de emitida)
            oFacturas.Estatus = "3";

            //Id del usuario que genero la factura
            oFacturas.idUsuario = Convert.ToInt32(Session["usuarioid"]);

            //Nombre del vendedor que en este caso es el usuario
            oFacturas.Vendedor = Session["nombre"].ToString();

            //Registrar la factura
            if (oblFacturas.NuevoRegistro(oFacturas))
            {
                
                oFacturas = new MedDAL.DAL.facturas();
                oblFacturas = new MedNeg.Facturas.BlFacturas();

                ////Recuperar el id de la factura crea| da
                oFacturas = oblFacturas.BuscarFacturasFolio(sIdFolioFactura);
                
                //Actualizar el consecutivo en la configuracion
                oblFacturas.ActualizarFolioFactura(sRutaArchivoConfig);
                iContadorFacturas++;

                //Insertar el detalle de factura
                //Recorrer el objeto de sesion lstDetallePartida que contiene los datos de la partida
                foreach (MedNeg.Facturas.BlDetalleFacturaReceta renglon in lstDetalleFactura)
                {
                    oblFacturas = new MedNeg.Facturas.BlFacturas();
                    MedDAL.DAL.facturas_partida oFacturaPartida = new MedDAL.DAL.facturas_partida();

                    oFacturaPartida.idFactura = oFacturas.idFactura;
                    oFacturaPartida.idProducto = renglon.iIdProducto;
                    oFacturaPartida.Cantidad = renglon.dCantidad;
                    oFacturaPartida.IEPS = renglon.dIeps;
                    oFacturaPartida.Iva = renglon.dIva;
                    oFacturaPartida.Precio = renglon.dPrecio;

                    //Registrar el detalle del pedido
                    if (!oblFacturas.NuevoDetallePartida(oFacturaPartida))
                    {
                        //bRegistroFallido = true;
                    }
                    else
                    {
                        //Guardar el monto de las lineas
                        MedNeg.Facturas.BlFacturacionDeLineas oblFacturacionLinea = new MedNeg.Facturas.BlFacturacionDeLineas();

                        oblFacturacionLinea.DMonto = oFacturaPartida.Cantidad * oFacturaPartida.Precio;
                        oblFacturacionLinea.DtFecha = DateTime.Now;
                        oblFacturacionLinea.IIdLineaCredito = renglon.IIdLineaCredito;

                        lstTotalFacturadoPorLinea.Add(oblFacturacionLinea);

                        //Guardar el subtotal para cuando sea una facturacion de Gtos. Admon por subtotales
                        dSubtotal += oFacturaPartida.Cantidad * oFacturaPartida.Precio;

                        //Modificar el estatus de la receta
                        if (idReceta != renglon.IIdReceta)
                        {
                            MedDAL.DAL.recetas oRecetaEditar = new MedDAL.DAL.recetas();
                            MedNeg.Recetas.BlRecetas oblRecetas = new MedNeg.Recetas.BlRecetas();

                            oRecetaEditar.idReceta = renglon.IIdReceta;
                            oRecetaEditar.Estatus = "2";

                            oblRecetas = new MedNeg.Recetas.BlRecetas();
                            oblRecetas.EditarRegistro(oRecetaEditar);

                            idReceta = renglon.IIdReceta;

                        }

                        //TODO: Paso 3.1 Aqui generar la factura electronica de las recetas facturadas
                    }
                }


                if (iTipo == 2)
                {
                    oblFacturas = new MedNeg.Facturas.BlFacturas();
                    oblFacturas.GenerarFacturaElectronica(oFacturas.idFactura, sRutaCertificados, Session["usuario"].ToString(), (int)Session["sIdCliente"], oFacturas.Folio);
                }

                ///TODO
                /// Mandar a imprimir la de gastos de administración por renglones o por subtotales
                /// 1 = Renglones, 2 = Sub totales
                /// 

                //TODO: GT Paso 4: una vez generada una factura y segun como eligio el usuario se debe de hacer una factura de tipo Gasto administrativo o por sub totales A LA PAR DE LA FACTURA EMITIDA, es regla de negocio por eso por cada factura siempre existiran 2
                if (chkPanelGtosAdmon.Checked == true)
                {
                    if (rblGenerarFacturaTipo.SelectedValue == "1")
                    {
                        sFacturaAdicional = CrearFacturaGtoAdministrativo(sIdFolioFactura, lstDetalleFactura);
                        sFacturaAdicional2 = sFacturaAdicional.Replace(".xml", ".pdf");
                    }

                    if (rblGenerarFacturaTipo.SelectedValue == "2")
                    {
                        //Generar la factura agregandole el monto a la factura
                        sFacturaAdicional = CrearFacturaSubTotales(sIdFolioFactura, dSubtotal);
                        sFacturaAdicional2 = sFacturaAdicional.Replace(".xml", ".pdf");
                        dSubtotal = 0;
                    }
                }

                //Gurdar en la base de datos lo facturado por linea de credito
                foreach (MedNeg.Facturas.BlFacturacionDeLineas registro in lstTotalFacturadoPorLinea)
                {

                    oFacturacionRecetas.idLineaCredito = registro.IIdLineaCredito;
                    oFacturacionRecetas.Fecha = registro.DtFecha;
                    oFacturacionRecetas.Monto = registro.dMonto;
                    oblFacturas = new MedNeg.Facturas.BlFacturas();
                    //MedDAL.DAL.facturas_partida oFacturaPartida = new MedDAL.DAL.facturas_partida();

                    //Registrar el renglon de lo facturado
                    if(!oblFacturas.NuevoRegistroFacturacionReceta(oFacturacionRecetas))
                    {
                       //bRegistroFallido = true;
                    }
               }

                if (iTipo == 2)
                {
                    try
                    {
                        oblFacturas.CrearZip(new string[] { Server.MapPath("~/Archivos/FacturasElectronicasTimbradas"), Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFacturas.Folio + ".zip") }, Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFacturas.Folio + ".xml"), Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFacturas.Folio + ".pdf"), sFacturaAdicional, sFacturaAdicional2);

                        ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(0);", true);

                        System.IO.FileInfo fFactura = new System.IO.FileInfo(Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFacturas.Folio + ".zip"));

                        Response.Clear();
                        Response.AddHeader("Content-Disposition", "attachment; filename=" + fFactura.Name);
                        Response.AddHeader("Content-Length", fFactura.Length.ToString());
                        Response.ContentType = "application/....";
                        Response.WriteFile(fFactura.FullName);
                        Response.End();
                    }
                    catch (Exception)
                    {
                        ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarExcepcion(0);", true);
                    }
                }
            }

            

        }
        public bool Timbrar(int iIdFactura)
        {
            string sRutaCertificados = Server.MapPath("~/Archivos/");

            oblFacturas = new MedNeg.Facturas.BlFacturas();
            MedDAL.DAL.facturas oDALFacturas = new MedDAL.DAL.facturas();
            string sDatosBitacora = string.Empty;

            oFactura = new MedDAL.DAL.facturas();
            oFactura = oblFacturas.BuscarFactura(iIdFactura);

            int iResultado = oblFacturas.GenerarFacturaElectronica(iIdFactura, sRutaCertificados, Session["usuario"].ToString(), oFactura.idCliente, oFactura.Folio);

            if (iResultado == 0)
            {
                oblFacturas.CrearZip(new string[] { Server.MapPath("~/Archivos/FacturasElectronicasTimbradas"), Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".zip") }, Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".xml"), Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".pdf"));

                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(0);", true);

                System.IO.FileInfo fFactura = new System.IO.FileInfo(Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".zip"));

                Response.Clear();
                Response.AddHeader("Content-Disposition", "attachment; filename=" + fFactura.Name);
                Response.AddHeader("Content-Length", fFactura.Length.ToString());
                Response.ContentType = "application/....";
                Response.WriteFile(fFactura.FullName);
                Response.End();

            }
            else if (iResultado == 1)
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(1);", true);
            }
            else if (iResultado == 2)
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(2);", true);
            }
            else if (iResultado == 3)
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(3);", true);
            }
            else if (iResultado == 4)
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(4);", true);
            }            

            return true;
        }