/// <summary>
        /// Factura que crea una receta con gastos de administracion
        /// </summary>
        /// <param name="sFolio"></param>
        /// <param name="lstDetalleFactura"></param>
        private string CrearFacturaGtoAdministrativo(string sFolio,List<MedNeg.Facturas.BlDetalleFacturaReceta> lstDetalleFactura)
        {
            //TODO: GT Paso 5: Paso opcional, aqui se genera la factura por gastos administrativos si lo eligio el usuario

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

            bool bRegistroFallido = false;
            //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();

            //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
            {
                //oFacturas.Folio = oReceta.Folio;
                oFacturas.Folio = sFolio + "-GastoAdm";
            }

            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 bitacora
                oblFacturas.ActualizarFolioFactura(sRutaArchivoConfig);


                //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.DImp1 * consdIva;
                    oFacturaPartida.Precio = renglon.DImp1;

                    //Registrar el detalle del pedido
                    if (!oblFacturas.NuevoDetallePartida(oFacturaPartida))
                    {
                        bRegistroFallido = true;
                    }
                    else
                    {
                       
                        
                    }
                }

                //TODO: GT Paso 5.1 Aqui si bRegistroFallido es false entonces aqui se generaria la factura electronica de gastos administrativos
               
                if (cmbModoFactura.SelectedValue == "2" && !bRegistroFallido)
                {
                    oblFacturas = new MedNeg.Facturas.BlFacturas();
                    oblFacturas.GenerarFacturaElectronica(oFacturas.idFactura, sRutaCertificados, Session["usuario"].ToString(), (int)Session["sIdCliente"], oFacturas.Folio);

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

                    //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();
                }
                return "";
            }
            return "";
        }
        private void Eliminar(int iIdFactura)
        {

            //Eliminar primero la partida para la integridad referencial
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            string sDatosBitacora = string.Empty;

            //Guardar los datos del pedido para la bitacora
            oFactura = new MedDAL.DAL.facturas();
            oFactura = oblFacturas.BuscarFactura(iIdFactura);

            sDatosBitacora += "Folio:" + oFactura.Folio.ToString() + " ";
            sDatosBitacora += "Fecha:" + oFactura.Fecha.ToShortDateString() + " ";
            switch (oFactura.Estatus)
            {
                case "1":
                    sDatosBitacora += "Estatus:Pedido ";
                    break;
                case "2":
                    sDatosBitacora += "Estatus:Remitido ";
                    break;
                case "3":
                    sDatosBitacora += "Estatus:Emitida ";
                    break;
                case "4":
                    sDatosBitacora += "Estatus:Cobrada ";
                    break;
                case "5":
                    sDatosBitacora += "Estatus:Cancelada ";
                    break;
            }

            //Recuperar la partida del pedido
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            var oQuery = oblFacturas.RecuperarPartidaFactura(iIdFactura);
            //Recorrer el resultado y meterlo al datagridview
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                sDatosBitacora += "Producto:" + oDetalle.productos.Nombre.ToString() + " ";
                sDatosBitacora += "Cantidad:" + oDetalle.Cantidad.ToString() + " ";
                sDatosBitacora += "IEPS:" + oDetalle.IEPS.ToString() + " ";
                sDatosBitacora += "Iva:" + oDetalle.Iva.ToString() + " ";
                sDatosBitacora += "Precio:" + oDetalle.Precio.ToString() + " ";
                sDatosBitacora += "Total:" + Convert.ToDecimal((oDetalle.Cantidad * oDetalle.Precio) + oDetalle.IEPS + oDetalle.Iva) + ", ";

            }


            if (oblFacturas.EliminarFacturaPartida(iIdFactura))
            {
                oblFacturas = new MedNeg.Facturas.BlFacturas();
                if (oblFacturas.EliminarRegistro(iIdFactura))
                {
                    //lblAviso.Text = "El usuario se ha eliminado con éxito";
                    MedDAL.DAL.bitacora oBitacora = new MedDAL.DAL.bitacora();
                    MedNeg.Bitacora.BlBitacora oblBitacora = new MedNeg.Bitacora.BlBitacora();
                    oBitacora.FechaEntradaSrv = DateTime.Now;
                    oBitacora.FechaEntradaCte = DateTime.Now;//Linea Temporal
                    oBitacora.Modulo = "Facturas";
                    oBitacora.Usuario = Session["usuario"].ToString();
                    oBitacora.Nombre = Session["nombre"].ToString();
                    oBitacora.Accion = "Eliminación de Factura";
                    oBitacora.Descripcion = sDatosBitacora;

                    if (!oblBitacora.NuevoRegistro(oBitacora))
                    {
                        lblDatos.Text = "El evento no pudo ser registrado en la bitácora";
                    }
                }
                else
                {
                    //lblAviso.Text = "El usuario no pudo ser eliminado, es posible que tenga datos relacionados";
                }

            }
            else
            {
                //lblAviso.Text = "El usuario no pudo ser eliminado, es posible que tenga datos relacionados";
            }

        }
        private string CrearFacturaSubTotales(string sFolio,decimal dSubtotalFacturar)
        {
            //TODO: GT Paso 6: Paso opcional, aqui se genera la factura por sub totales si lo eligio el usuario

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

            bool bRegistroFallido = false;
            //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();

            //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
            {
                //oFacturas.Folio = oReceta.Folio;
                oFacturas.Folio = sFolio + "-GastoAdm";
            }

            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 bitacora
                oblFacturas.ActualizarFolioFactura(sRutaArchivoConfig);


                //Insertar el detalle de factura
                    oblFacturas = new MedNeg.Facturas.BlFacturas();
                    MedDAL.DAL.facturas_partida oFacturaPartida = new MedDAL.DAL.facturas_partida();

                    oFacturaPartida.idFactura = oFacturas.idFactura;
                    oFacturaPartida.idProducto = (int)Session["sIdProductoFxR"];
                    oFacturaPartida.Cantidad = 1;
                    oFacturaPartida.IEPS = 0;
                   
                   

                    //Identificar de cuanto va a ser la factura de subtotales, si un porciento del subtotal o un monto especifico
                    if (txbMonto.Text == "" && txbPorcentaje.Text=="")
                    {
                        oFacturaPartida.Precio = dSubtotalFacturar;
                        oFacturaPartida.Iva = dSubtotalFacturar * consdIva;
                    }
                    else if (txbMonto.Text != "") //El sub total es por monto
                    {
                        oFacturaPartida.Precio = Convert.ToDecimal(txbMonto.Text);
                        oFacturaPartida.Iva = Convert.ToDecimal(txbMonto.Text) * consdIva;

                    }
                    else if(txbPorcentaje.Text!="") //El sub total es por porcentaje del monto de sub total
                    {
                        oFacturaPartida.Precio=dSubtotalFacturar*(Convert.ToDecimal(txbPorcentaje.Text)/100);
                        oFacturaPartida.Iva=consdIva*(dSubtotalFacturar*(Convert.ToDecimal(txbPorcentaje.Text)/100));
                    }
                                  

                    oFacturaPartida.Descripcion = txbProductos.Text;
                    oFacturaPartida.Observaciones = "";

                    //Registrar el detalle del pedido
                    if (!oblFacturas.NuevoDetallePartida(oFacturaPartida))
                    {
                        bRegistroFallido = true;
                    }
                    else
                    {
                      
                    }
                //TODO: GT Paso 6.1 Aqui si bRegistroFallido es false entonces aqui se generaria la factura electronica con los datos de sub totales
                    if (cmbModoFactura.SelectedValue == "2" && !bRegistroFallido)
                    {
                        oblFacturas = new MedNeg.Facturas.BlFacturas();
                        oblFacturas.GenerarFacturaElectronica(oFacturas.idFactura, sRutaCertificados, Session["usuario"].ToString(), (int)Session["sIdCliente"], oFacturas.Folio);

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

                        //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();
                    }
                    return "";
            }
            return "";
        }
        /// <summary>
        /// Cargar los datos del pedido y su partida
        /// </summary>
        /// <param name="bDatos"></param>
        protected void CargarFormulario(bool bDatos)
        {
            pnlFormulario.Visible = true;
            pnlCatalogo.Visible = false;

            if (bDatos)
            {

                //Objeto que contiene el id del pedido 
                oblFacturas = new MedNeg.Facturas.BlFacturas();
                oFactura = new MedDAL.DAL.facturas();
                oFactura = (MedDAL.DAL.facturas)oblFacturas.BuscarFactura(int.Parse(dgvDatos.SelectedDataKey[0].ToString()));

                //Llenar los campos del pedido
                txbFolio.Text = oFactura.Folio;
                txbFecha.Text = oFactura.Fecha.ToShortDateString();
                int iContador = 0;
                cmbEstatus.SelectedIndex = -1;
                foreach (ListItem elemento in cmbEstatus.Items)
                {
                    if (elemento.Value.Equals(oFactura.Estatus.ToString()))
                    {
                        elemento.Selected = true;
                    }
                    iContador++;
                }

                cmbTipoFactura.SelectedIndex = -1;
                iContador = 0;
                foreach (ListItem elemento in cmbTipoFactura.Items)
                {
                    if (elemento.Value.Equals(oFactura.TipoFactura.ToString()))
                    {
                        elemento.Selected = true;
                    }
                    iContador++;
                }

                //Llenar los campos del cliente
                txbCliente.Text = oFactura.clientes.Nombre + " " + oFactura.clientes.Apellidos;
                txbDireccion.Text = oFactura.clientes.Calle + " " + oFactura.clientes.NumeroExt;
                if (oFactura.clientes.NumeroInt != null)
                {
                    txbDireccion.Text += "Int: " + oFactura.clientes.NumeroInt;
                }

                txbPoblacion.Text = oFactura.clientes.poblaciones.Nombre.ToString() + ", " + oFactura.clientes.municipios.Nombre.ToString() + ", " + oFactura.clientes.estados.Nombre.ToString();

                //Lenar los datos de la partida del detalle
                oblFacturas = new MedNeg.Facturas.BlFacturas();

                //Recuperar la partida del pedido
                var oQuery = oblFacturas.RecuperarPartidaFactura(oFactura.idFactura);

                //Session["lstDetallePartida"] = new List<MedNeg.Facturas.BlDetallePartida>();
                if (((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Count() > 0)
                {
                    ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Clear();
                }

                //Recorrer el resultado y meterlo al datagridview
                Session["sTotalFactura"] = 0;
                foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
                {
                    oblDetallePartida = new MedNeg.Facturas.BlDetallePartida(
                        Convert.ToInt32(oDetalle.idProducto),
                        oDetalle.productos.Clave1,
                        oDetalle.productos.Nombre,
                        oDetalle.Cantidad,
                        Convert.ToDecimal(oDetalle.IEPS),
                        Convert.ToDecimal(oDetalle.Iva),
                        Convert.ToDecimal(oDetalle.Precio),
                        oDetalle.Observaciones,
                        Convert.ToDecimal((oDetalle.Precio * oDetalle.Cantidad) + oDetalle.IEPS + oDetalle.Iva));

                    ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Add(oblDetallePartida);
                    Session["sTotalFactura"] = Convert.ToDecimal(Session["sTotalFactura"]) + Convert.ToDecimal((oDetalle.Precio * oDetalle.Cantidad) + oDetalle.IEPS + oDetalle.Iva);
                }

                //Hacer el binding de la data al dgvDatos
                lblTotal.Text = "TOTAL:$" + Session["sTotalFactura"].ToString();
                dgvPartidaDetalle.DataBind();

                ////si el estatus es 1 (Pedido) aun se pueden agregar articulos de lo contario ya no
                //if (oFactura.Estatus == "3")
                //{
                //    HabilitaRemision();
                //    Deshabilita();
                //}
                //else
                //{
                    DeshabilitaRemision();
                    Deshabilita();
                    //cmbEstatus.Enabled = true;
                //}


            }
            else
            {

                //Limpia();
                //Deshabilita();

            }
        }
        /// <summary>
        /// Editar
        /// </summary>
        private void Editar()
        {
            oFactura = new MedDAL.DAL.facturas();
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            oFactura.idFactura = int.Parse(dgvDatos.SelectedDataKey.Value.ToString());
            oFactura.Estatus = cmbEstatus.SelectedValue.ToString();


            if (oblFacturas.EditarRegistro(oFactura))
            {
                //Datos de la bitacora
                string sDatosBitacora = string.Empty;
                sDatosBitacora += "Tipo:" + cmbTipoFactura.SelectedValue.ToString() + " ";
                sDatosBitacora += "Folio:" + txbFolio.Text + " ";
                sDatosBitacora += "Fecha:" + txbFecha.Text + " ";
                sDatosBitacora += "Estatus:" + cmbEstatus.SelectedItem.ToString() + " ";
                sDatosBitacora += "Cliente:" + txbCliente.Text + " ";

                oblFacturas = new MedNeg.Facturas.BlFacturas();
                if (oblFacturas.EliminarFacturaPartida(oFactura.idFactura))
                {
                    bool bRegistroFallido = false;

                    //Recorrer el objeto de sesion lstDetallePartida que contiene los datos de la partida
                    foreach (MedNeg.Facturas.BlDetallePartida facturaDetalle in (List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"])
                    {
                        oblFacturas = new MedNeg.Facturas.BlFacturas();
                        MedDAL.DAL.facturas_partida oFacturaPartida = new MedDAL.DAL.facturas_partida();

                        oFacturaPartida.idFactura = oFactura.idFactura;
                        oFacturaPartida.idProducto = facturaDetalle.iIdProducto;
                        oFacturaPartida.Cantidad = facturaDetalle.dCantidad;
                        oFacturaPartida.IEPS = facturaDetalle.dIeps;
                        oFacturaPartida.Iva = facturaDetalle.dIva;
                        oFacturaPartida.Precio = facturaDetalle.dPrecio;

                        //Registrar el detalle del pedido
                        if (!oblFacturas.NuevoDetallePartida(oFacturaPartida))
                        {
                            bRegistroFallido = true;
                        }
                        else
                        {
                            sDatosBitacora += "Producto:" + facturaDetalle.iIdProducto.ToString() + " ";
                            sDatosBitacora += "Cant:" + facturaDetalle.dCantidad.ToString() + " ";
                            sDatosBitacora += "IEPS:" + facturaDetalle.dIeps.ToString() + " ";
                            sDatosBitacora += "Iva:" + facturaDetalle.dIva.ToString() + " ";
                            sDatosBitacora += "Precio:" + facturaDetalle.dPrecio.ToString() + " ";
                            sDatosBitacora += "Total:" + Convert.ToDecimal((facturaDetalle.dCantidad * facturaDetalle.dPrecio) + facturaDetalle.dIeps + facturaDetalle.dIva) + ", ";
                        }
                    }


                    //Anotar en la bitacora la modificación al pedido
                    oBitacora = new MedDAL.DAL.bitacora();
                    oblBitacora = new MedNeg.Bitacora.BlBitacora();
                    oBitacora.FechaEntradaSrv = DateTime.Now;
                    oBitacora.FechaEntradaCte = DateTime.Now;//Linea Temporal
                    oBitacora.Modulo = "Facturas";
                    oBitacora.Usuario = Session["usuario"].ToString();
                    oBitacora.Nombre = Session["nombre"].ToString();
                    oBitacora.Accion = "Edición de Factura";
                    oBitacora.Descripcion = sDatosBitacora;
                    if (!oblBitacora.NuevoRegistro(oBitacora))
                    {
                        lblDatos.Text = "El evento no pudo ser registrado en la bitácora";
                    }
                }


            }

        }
        /// <summary>
        /// Editar
        /// </summary>
        private void Editar()
        {
            oFactura = new MedDAL.DAL.facturas();
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            //oFactura.idFactura = int.Parse(dgvDatos.SelectedDataKey.Value.ToString());
            oFactura = oblFacturas.BuscarFacturasFolio(txbFolio.Text);
            oFactura.Estatus = cmbEstatus.SelectedValue.ToString();

            oblFacturas = new MedNeg.Facturas.BlFacturas();
            if(oblFacturas.EditarRegistro(oFactura))
            {
                //Datos de la bitacora
                string sDatosBitacora = string.Empty;
                sDatosBitacora += "Tipo:" + cmbTipoFactura.SelectedValue.ToString() + " ";
                sDatosBitacora += "Folio:" + txbFolio.Text + " ";
                sDatosBitacora += "Fecha:" + txbFecha.Text + " ";
                sDatosBitacora += "Estatus:" + cmbEstatus.SelectedItem.ToString() + " ";
                sDatosBitacora += "Cliente:" + txbCliente.Text + " ";

                oblFacturas = new MedNeg.Facturas.BlFacturas();
                if (oblFacturas.EliminarFacturaPartida(oFactura.idFactura))
                {
                    bool bRegistroFallido = false;

                    //Recorrer el objeto de sesion lstDetallePartida que contiene los datos de la partida
                    foreach (MedNeg.Facturas.BlDetallePartida facturaDetalle in (List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"])
                    {
                        //Saber si es un ensamble el que se esta registrando
                        if (facturaDetalle.bEsEnsamble == true)
                        {
                            AgregarDetalleEnsamble(facturaDetalle, oFactura.idFactura);
                        }
                        else
                        {
                            oblFacturas = new MedNeg.Facturas.BlFacturas();
                            MedDAL.DAL.facturas_partida oFacturaPartida = new MedDAL.DAL.facturas_partida();

                            oFacturaPartida.idFactura = oFactura.idFactura;
                            oFacturaPartida.idProducto = facturaDetalle.iIdProducto;
                            oFacturaPartida.Cantidad = facturaDetalle.dCantidad;
                            oFacturaPartida.IEPS = facturaDetalle.dIeps;
                            oFacturaPartida.Iva = facturaDetalle.dIva;
                            oFacturaPartida.Precio = facturaDetalle.dPrecio;

                            //Registrar el detalle del pedido
                            if (!oblFacturas.NuevoDetallePartida(oFacturaPartida))
                            {
                                bRegistroFallido = true;
                            }
                            else
                            {
                                sDatosBitacora += "Producto:" + facturaDetalle.iIdProducto.ToString() + " ";
                                sDatosBitacora += "Cant:" + facturaDetalle.dCantidad.ToString() + " ";
                                sDatosBitacora += "IEPS:" + facturaDetalle.dIeps.ToString() + " ";
                                sDatosBitacora += "Iva:" + facturaDetalle.dIva.ToString() + " ";
                                sDatosBitacora += "Precio:" + facturaDetalle.dPrecio.ToString() + " ";
                                sDatosBitacora += "Total:" + Convert.ToDecimal((facturaDetalle.dCantidad * facturaDetalle.dPrecio) + facturaDetalle.dIeps + facturaDetalle.dIva) + ", ";
                            }
                        }
                    }
                    
                    /****** GT: Modificar las existencias de los productos nuevos ***************/

                    MedNeg.Usuarios.BlUsuarios oblUsuario = new MedNeg.Usuarios.BlUsuarios();
                    MedDAL.DAL.usuarios oUsuario = new MedDAL.DAL.usuarios();

                    oUsuario = (MedDAL.DAL.usuarios)oblUsuario.Buscar(Session["usuario"].ToString());

                    //oblRemision = new MedNeg.Remisiones.BlRemisiones();
                    oblFacturas = new MedNeg.Facturas.BlFacturas();
                    foreach (MedNeg.Facturas.BlDetallePartida remisionDetalleNuevos in (List<MedNeg.Facturas.BlDetallePartida>)Session["lstremisionespartidaedicion"])
                    {
                        oblFacturas.ModificarExistenciaProducto(oUsuario.idAlmacen, remisionDetalleNuevos.iIdProducto, remisionDetalleNuevos.dCantidad, 1);

                    }

                    /****** GT: Modificar las existencias de los productos nuevos ***************/


                    //Anotar en la bitacora la modificación a la factura
                    oBitacora = new MedDAL.DAL.bitacora();
                    oblBitacora = new MedNeg.Bitacora.BlBitacora();
                    oBitacora.FechaEntradaSrv = DateTime.Now;
                    oBitacora.FechaEntradaCte = DateTime.Now;//Linea Temporal
                    oBitacora.Modulo = "Facturas";
                    oBitacora.Usuario = Session["usuario"].ToString();
                    oBitacora.Nombre = Session["nombre"].ToString();
                    oBitacora.Accion = "Edición de Factura";
                    oBitacora.Descripcion = sDatosBitacora;
                    if (!oblBitacora.NuevoRegistro(oBitacora))
                    {
                        lblDatos.Text = "El evento no pudo ser registrado en la bitácora";
                    }

                    if (oFactura.Estatus == "5")
                    {
                        string sRutaArchivoConfig = Server.MapPath("~/Archivos/Configuracion.xml");
                        string sRutaCertificados = Server.MapPath("~/Archivos/");
                        string[] sUUID = new string[1];
                        string sMensaje = "";
                        bool bEncontrado = false;

                        XmlTextReader oXMLReader = new XmlTextReader(sRutaCertificados + "/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".xml");
                        while (oXMLReader.Read())
                        {
                            switch (oXMLReader.NodeType)
                            {
                                case XmlNodeType.Element:
                                    if (oXMLReader.Name == "tfd:TimbreFiscalDigital")
                                    {
                                        sUUID[0] = oXMLReader.GetAttribute("UUID");
                                        bEncontrado = true;
                                        break;
                                    }
                                    break;
                            }
                        }

                        if (bEncontrado)
                        {
                            int iResultado = oblFacturas.CancelarFacturaElectronica(sUUID, sRutaCertificados, out sMensaje);

                            if (iResultado == 0)
                            {
                                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarCancelacionFacturas(0);", true);

                                System.IO.FileInfo fFactura = new System.IO.FileInfo(Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + sUUID[0] + ".xml"));

                                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", "alertarCancelacionFacturas(1);", true);
                            }
                        }
                    }
                }
            }

        }
        /// <summary>
        /// Registrar nuevo pedido
        /// </summary>
        private void Nuevo()
        {

            string sRutaArchivoConfig = Server.MapPath("~/Archivos/Configuracion.xml");
            string sRutaCertificados = Server.MapPath("~/Archivos/");

            oFactura = new MedDAL.DAL.facturas();
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            oFactura.idCliente = (int)Session["sIdCliente"];

            if ((bool)Session["sEsDePedido"] == true)
                oFactura.idPedido = (int)Session["sIdPedido"];

            if ((bool)Session["sEsDeRemision"] == true)
                oFactura.idRemision = (int)Session["sIdRemision"];

            if ((bool)Session["sEsDeReceta"] == true)
                oFactura.idReceta = (int)Session["sIdReceta"];

            oFactura.TipoFactura = cmbTipoFactura.SelectedValue.ToString();
            oFactura.Fecha = DateTime.Now;
            oFactura.Estatus = cmbEstatus.SelectedValue;

            //Validar Folio Repetido
            if (ValidaFolioRepetido())
            {

                //Validar si se esta respetando el folio automatico y verificar si aun es el mismo o cambio su valor
                if (Session["iFolioAutomatico"].Equals(txbFolio.Text))
                {
                    oFactura.Folio = oblFacturas.RecuperaFolioAutomatico(sRutaArchivoConfig).ToString();
                }
                else
                {
                    oFactura.Folio = txbFolio.Text;
                }

                if (oblFacturas.NuevoRegistro(oFactura))
                {
                    //Datos de la bitacora
                    string sDatosBitacora = string.Empty;
                    sDatosBitacora += "Tipo:" + cmbTipoFactura.SelectedValue.ToString() + " ";
                    sDatosBitacora += "Folio:" + txbFolio.Text + " ";
                    sDatosBitacora += "Fecha:" + txbFecha.Text + " ";
                    sDatosBitacora += "Estatus:" + cmbEstatus.SelectedItem.ToString() + " ";
                    sDatosBitacora += "Cliente:" + txbCliente.Text + " ";


                    // Registrar la partida de la remision
                    oFactura = new MedDAL.DAL.facturas();
                    oFactura = oblFacturas.BuscarFacturasFolio(txbFolio.Text);
                    int iIdFactura = oFactura.idFactura;
                    bool bRegistroFallido = false;

                    //Recorrer el objeto de sesion lstDetallePartida que contiene los datos de la partida
                    foreach (MedNeg.Facturas.BlDetallePartida facturaDetalle in (List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"])
                    {
                        oblFacturas = new MedNeg.Facturas.BlFacturas();
                        MedDAL.DAL.facturas_partida oFacturaPartida = new MedDAL.DAL.facturas_partida();

                        oFacturaPartida.idFactura = iIdFactura;
                        oFacturaPartida.idProducto = facturaDetalle.iIdProducto;
                        oFacturaPartida.Cantidad = facturaDetalle.dCantidad;
                        oFacturaPartida.IEPS = facturaDetalle.dIeps;
                        oFacturaPartida.Iva = facturaDetalle.dIva;
                        oFacturaPartida.Precio = facturaDetalle.dPrecio;
                        oFacturaPartida.Descripcion = facturaDetalle.SProducto;

                        //Registrar el detalle del pedido
                        if (!oblFacturas.NuevoDetallePartida(oFacturaPartida))
                        {
                            bRegistroFallido = true;
                        }
                        else
                        {
                            sDatosBitacora += "Producto:" + facturaDetalle.iIdProducto.ToString() + " ";
                            sDatosBitacora += "Cant:" + facturaDetalle.dCantidad.ToString() + " ";
                            sDatosBitacora += "IEPS:" + facturaDetalle.dIeps.ToString() + " ";
                            sDatosBitacora += "Iva:" + facturaDetalle.dIva.ToString() + " ";
                            sDatosBitacora += "Precio:" + facturaDetalle.dPrecio.ToString() + " ";
                            sDatosBitacora += "Total:" + Convert.ToDecimal((facturaDetalle.dCantidad * facturaDetalle.dPrecio) + facturaDetalle.dIeps + facturaDetalle.dIva) + ", ";
                        }
                    }

                    //Registrar datos de la remision en la bitacora
                    //lblAviso.Text = "El usuario se ha registrado con éxito";
                    oBitacora = new MedDAL.DAL.bitacora();
                    oblBitacora = new MedNeg.Bitacora.BlBitacora();
                    oBitacora.FechaEntradaSrv = DateTime.Now;
                    oBitacora.FechaEntradaCte = DateTime.Now;//Linea Temporal
                    oBitacora.Modulo = "Factura";
                    oBitacora.Usuario = Session["usuario"].ToString();
                    oBitacora.Nombre = Session["nombre"].ToString();
                    oBitacora.Accion = "Nueva Factura";
                    oBitacora.Descripcion = sDatosBitacora;
                    if (!oblBitacora.NuevoRegistro(oBitacora))
                    {
                        lblDatos.Text = "El evento no pudo ser registrado en la bitácora";
                    }

                    //Actualizar el consecutivo en la bitacora
                    oblFacturas.ActualizarFolioFactura(sRutaArchivoConfig);

                    //Generar la factura electronica
                    if (cmbModoFactura.SelectedValue == "2")
                    {
                        oblFacturas = new MedNeg.Facturas.BlFacturas();
                        oblFacturas.GenerarFacturaElectronica(iIdFactura, sRutaCertificados, Session["usuario"].ToString(), (int)Session["sIdCliente"], txbFolio.Text);

                        System.IO.FileInfo fFactura = new System.IO.FileInfo(Server.MapPath("~/Archivos/FacturasElectronicas/FacturaE-" + txbFolio.Text + ".xml"));

                        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();
                    }

                    //Saber si se va a actualizar el estatus del pedido
                    if ((bool)Session["sEsDePedido"] == true)
                    {
                        //Actualizar el estatus del pedido en caso de que se haya hecho la remision a partir de un pedido
                        MedDAL.DAL.pedidos oPedido = new MedDAL.DAL.pedidos();
                        MedNeg.Pedidos.BlPedidos oblPedido = new MedNeg.Pedidos.BlPedidos();

                        //Actualizar el estatus del pedido
                        oPedido = oblPedido.BuscarPedido((int)Session["sIdPedido"]);
                        oPedido.Estatus = "3";

                        if (!oblPedido.EditarRegistro(oPedido))
                        {
                            lblDatos.Text = "No se pudo cambiar el estatus del pedido, contacte al administrador";
                        }
                    }

                    //Saber si se va a actualizar el estatus de la remision
                    if ((bool)Session["sEsDeRemision"] == true)
                    {
                        //Actualizar el estatus del pedido
                        MedDAL.DAL.remisiones oRemision = new MedDAL.DAL.remisiones();
                        MedNeg.Remisiones.BlRemisiones oblRemision = new MedNeg.Remisiones.BlRemisiones();

                        oRemision = oblRemision.BuscarRemision((int)Session["sIdRemision"]);
                        oRemision.Estatus = "3";

                        if (!oblRemision.EditarRegistro(oRemision))
                        {
                            lblDatos.Text = "No se pudo cambiar el estatus de la remisión, contacte al administrador";
                        }
                    }

                    //Saber si se va a actualizar el estatus de la remision
                    if ((bool)Session["sEsDeReceta"] == true)
                    {
                        //Actualizar el estatus del pedido
                        MedDAL.DAL.remisiones oRemision = new MedDAL.DAL.remisiones();
                        MedNeg.Remisiones.BlRemisiones oblRemision = new MedNeg.Remisiones.BlRemisiones();

                        MedDAL.DAL.recetas oReceta = new MedDAL.DAL.recetas();
                        MedNeg.Recetas.BlRecetas oblRecetas = new MedNeg.Recetas.BlRecetas();

                        oReceta = oblRecetas.BuscarReceta((int)Session["sIdReceta"]);
                        oReceta.Estatus = "2";

                        if (!oblRecetas.EditarRegistro(oReceta))
                        {
                            lblDatos.Text = "No se pudo cambiar el estatus de la receta, contacte al administrador";
                        }
                    }

                }
                else
                {

                }

            }
            else  //si es folio repetido
            {
                lblDatos.Text = "Folio Repetido, no se puede generar el pedido";

            }
        }
Exemple #8
0
        /// <summary>
        /// Generacion de factura electronica
        /// </summary>
        /// <param name="iIdFactura"></param>
        /// <param name="sRutaArchivos"></param>
        /// <param name="sUsuario"></param>
        /// <param name="iIdCliente"></param>
        /// <param name="?"></param>
        /// <param name="sFolioFactura"></param>
        public int GenerarFacturaElectronica(int iIdFactura, string sRutaArchivos, string sUsuario, int iIdCliente, string sFolioFactura)
        {
            int iResultado = 0;

            //Datos de la factura
            MedNeg.Facturas.BlFacturas oblFactura = new BlFacturas();
            MedDAL.DAL.facturas        oFactura   = new MedDAL.DAL.facturas();

            //Datos de la factura
            oFactura = oblFactura.BuscarFactura(iIdFactura);

            //Recuperar la partida de la factura
            List <MedDAL.DAL.facturas_partida> oQuery = new List <MedDAL.DAL.facturas_partida>();

            oQuery.AddRange(oblFactura.RecuperarPartidaFactura(oFactura.idFactura));
            decimal dSubtotal             = 0;
            decimal dImpuestosTrasladados = 0;
            decimal dTotal = 0;

            //Recorrer el resultado de la partida para obtener el total
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                dSubtotal             += oDetalle.Cantidad * oDetalle.Precio;
                dImpuestosTrasladados += (decimal)oDetalle.Iva + (decimal)oDetalle.IEPS;
            }
            //Total
            dTotal = dSubtotal + dImpuestosTrasladados;

            DateTime dtFechaTest = DateTime.Now;
            string   sNumeroCertificado = "";
            string   sA, sB, sC;

            //Leer archivo de configuracion
            MedNeg.Configuracion.BlConfiguracion  oblConfiguracion  = new MedNeg.Configuracion.BlConfiguracion();
            MedDAL.Configuracion.DALConfiguracion odalConfiguracion = new MedDAL.Configuracion.DALConfiguracion();

            odalConfiguracion = (MedDAL.Configuracion.DALConfiguracion)oblConfiguracion.CargaDatos(sRutaArchivos + "/Configuracion.xml");

            //Comprobante.SelloDigital.leerCER(sRutaArchivos + "/Certificados/aaa010101aaa_csd_06.cer", out sA, out sB, out sC, out sNumeroCertificado);
            Comprobante.SelloDigital.leerCER(sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaCertificado, out sA, out sB, out sC, out sNumeroCertificado);

            //Establecer el numero de cuenta
            string sNumeroCuenta = null;

            if (oFactura.metodo_pago.MetodoPago.Equals("depósito en cuenta", StringComparison.InvariantCultureIgnoreCase) ||
                oFactura.metodo_pago.MetodoPago.Equals("traspaso", StringComparison.InvariantCultureIgnoreCase))
            {
                sNumeroCuenta = oFactura.NumeroCuentaPago;
            }


            //Debo validar la vigencia del certificado con sa <= FechaEmision <= sB

            #region generarcomprobante

            //Construir objeto factura
            Comprobante.ComprobanteFiscalDigital oComprobanteFiscalDigital = new Comprobante.ComprobanteFiscalDigital(
                "",                                                             //Serie
                sFolioFactura,                                                  //Folio
                dtFechaTest.ToString("yyyy-MM-ddThh:mm:ss"),                    //Fecha
                oFactura.tipo_forma_pago.FormaPago,                             //FormaDePago
                sNumeroCertificado,                                             //NoCertificado
                "",                                                             //"Condiciones de pago",
                dSubtotal.ToString(),                                           //SubTotal
                "0",                                                            //Descuento
                "",                                                             //Motivo del descuento
                dTotal.ToString(),                                              //Total
                oFactura.metodo_pago.MetodoPago,                                //Metodo de pago
                "Ingreso",                                                      //Tipo de comprobante
                null,                                                           //noAprobacion
                null,                                                           //anoAprobacion
                "3.2",                                                          //version
                null,                                                           //TipoCambio
                null,                                                           //Moneda
                odalConfiguracion.sEstado + "," + odalConfiguracion.sMunicipio, //LugarExpedicion
                sNumeroCuenta                                                   //NumCtaPago
                );

            //Pendiente la parte de pagos parciales

            //Empresa o razon social y direccion fiscal
            Comprobante.t_Emisor Emisor = new Comprobante.t_Emisor(
                odalConfiguracion.sRfc,
                odalConfiguracion.sRazonSocial,
                odalConfiguracion.sDomicilio, //Calle
                "",                           //No exterior
                "",                           //No interior
                "",                           //Colonia
                "",                           //Localidad
                "",                           //Emisor Referencia
                odalConfiguracion.sMunicipio,
                odalConfiguracion.sEstado,
                odalConfiguracion.sPais,
                odalConfiguracion.sCodigoPostal
                );

            Emisor.addRegimenFiscal(odalConfiguracion.sRegimenFiscal);

            oComprobanteFiscalDigital.setEmisor(Emisor);

            //Establece la expedición de la factura, se toman lo datos del almacen
            MedDAL.DAL.usuarios        oUsuario   = new MedDAL.DAL.usuarios();
            MedNeg.Usuarios.BlUsuarios oblUsuario = new Usuarios.BlUsuarios();
            oUsuario = (MedDAL.DAL.usuarios)oblUsuario.Buscar(sUsuario);

            oComprobanteFiscalDigital.setExpedicion(
                oUsuario.almacenes.Calle.ToString(),              //Calle
                oUsuario.almacenes.NumeroExt.ToString(),          //NoExt
                "",                                               //NoInt
                oUsuario.almacenes.colonias.Nombre,               //Colonia
                oUsuario.almacenes.poblaciones.Nombre.ToString(), //Población
                "",                                               //Emisor Referencia Expedicion
                oUsuario.almacenes.municipios.Nombre.ToString(),  //Municipio
                oUsuario.almacenes.estados.Nombre.ToString(),     //Estado
                oUsuario.almacenes.Pais.ToString(),               //Pais
                oUsuario.almacenes.CodigoPostal.ToString());      //CP

            //Establecer los datos del cliente
            MedDAL.DAL.clientes          oCliente    = new MedDAL.DAL.clientes();
            MedNeg.BlClientes.BlClientes oblClientes = new BlClientes.BlClientes();
            oCliente = oblClientes.BuscarCliente(iIdCliente);

            oComprobanteFiscalDigital.setReceptor(
                oCliente.Rfc.ToString(),                                          //RFC
                oCliente.Nombre.ToString() + " " + oCliente.Apellidos.ToString(), //Nombre
                oCliente.Calle.ToString(),                                        //Calle
                oCliente.NumeroExt.ToString(),                                    //No ext
                oCliente.NumeroInt.ToString(),                                    //No int
                oCliente.colonias.Nombre.ToString(),                              //Colo
                oCliente.poblaciones.Nombre.ToString(),                           //Ciudad
                "",                                                               //ReferenciaReceptor
                oCliente.municipios.Nombre.ToString(),                            //Municipio
                oCliente.estados.Nombre.ToString(),                               //Estado
                "Mexico",                                                         //Pais
                oCliente.CodigoPostal.ToString()                                  //Codigo postal
                );


            //Recorrer el resultado de la partida para obtener el total
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                string Cantidad, Codigo, Descripcion, Unidad, PrecioUnitario, Importe, ImporteNeto;

                decimal dImporte = 0;
                Cantidad = oDetalle.Cantidad.ToString();
                //Codigo = oDetalle.productos.Clave1.ToString();
                //Descripcion = oDetalle.productos.Nombre.ToString();
                //0087 Identificar si es un producto o un ensamble
                if (oDetalle.idEnsamble.Equals(null))
                {
                    //Datos del producto
                    Codigo = oDetalle.productos.Clave1.ToString();
                }
                else
                {
                    //Datos del ensamble
                    Codigo = oDetalle.ensamble.ClaveBom.ToString();
                }

                Descripcion    = oDetalle.Descripcion.ToString();
                Unidad         = oDetalle.productos.UnidadMedida;
                PrecioUnitario = oDetalle.Precio.ToString();
                dImporte       = oDetalle.Cantidad * oDetalle.Precio;
                Importe        = dImporte.ToString();


                Comprobante.Concepto C = new Comprobante.Concepto(
                    Cantidad,
                    Unidad,
                    Codigo,
                    Descripcion,
                    PrecioUnitario,
                    Importe);
                oComprobanteFiscalDigital.addConcepto(C);//aqui agregas el elemento a la partida
            }



            #endregion

            //Commpruebo que sea válido
            if (oComprobanteFiscalDigital.Valido() == true)
            {
                string sCadenaOriginal = oComprobanteFiscalDigital.CadenaOriginal();
                oComprobanteFiscalDigital.Sellar(sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaLlave.ToString(), sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaCertificado.ToString(), odalConfiguracion.sContraseña.ToString());
                oComprobanteFiscalDigital.XML().Save(sRutaArchivos + "/FacturasElectronicas/FacturaE-" + sFolioFactura + ".xml");
                //return a.XML();

                /*
                 * Modificaciones de POJO: 1 de Noviembre 2011 : Agregando el webservice para timbrado, guardaré los archivos en /Facturacion/Timbrados/
                 */
                FacturaService.TimbradoClient svcT          = new FacturaService.TimbradoClient();
                FacturaService.RespuestaCFDi  RespuestaCFDi = new FacturaService.RespuestaCFDi();

                //Aquí, cambiar la funcion a svcT.Timbrar cuando vayan a mostrarlo en producción, de otra manera, no serán válidos los cfdi's que emitan.
                try
                {
                    byte [] aArchivo = File.ReadAllBytes(sRutaArchivos + "/FacturasElectronicas/FacturaE-" + sFolioFactura + ".xml");
                    RespuestaCFDi = svcT.Timbrar("pojo", "a", aArchivo);
                    File.WriteAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".xml", RespuestaCFDi.Documento);
                    RespuestaCFDi = svcT.PDF("pojo", "a", File.ReadAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".xml"), null);
                    File.WriteAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".pdf", RespuestaCFDi.Documento);
                    return(0);
                }
                catch (System.Net.WebException ex)
                {
                    //Sale cuando no encuentra al server
                    return(1);
                }
                catch (System.Web.Services.Protocols.SoapHeaderException ex)
                {
                    return(3);
                }
                catch (Exception ex)
                {
                    //Para excepciones no conocidas
                    return(4);
                }

                /*
                 * Falta: Revisar errores con PAC (¿Cómo los regresas? ¿Qué pasa si algo está mal? ¿el xml fue correctamente construido?¿Una función nueva?)
                 */
            }
            else
            {
                //Sale cuando el certificado no es valido
                return(2);
            }
        }
Exemple #9
0
 /// <summary>
 /// BL - Nuevo registro
 /// </summary>
 /// <param name="oFactura"></param>
 /// <returns></returns>
 public bool NuevoRegistro(MedDAL.DAL.facturas oFactura)
 {
     return(odalFacturas.NuevoRegistro(oFactura));
 }
        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;
        }
Exemple #11
0
 /// <summary>
 /// Editar Factura
 /// </summary>
 /// <param name="oFactura"></param>
 /// <returns></returns>
 public bool EditarRegistro(MedDAL.DAL.facturas oFactura)
 {
     return(odalFacturas.EditarRegistro(oFactura));
 }
        /// <summary>
        /// 2013/03/10 Jorge Ibarra
        /// Crea una instancia de factura, la guarda, y en caso de ser electrónica la procesa para ser timbrada
        /// </summary>
        private bool AddFactura()
        {
            string sRutaArchivoConfig = Server.MapPath("~/Archivos/Configuracion.xml");            
            MedDAL.Facturas.DALFacturas oDALFacturas = new MedDAL.Facturas.DALFacturas();
            oblFacturas = new MedNeg.Facturas.BlFacturas();

            oFactura = SetObjetoFactura();
            //Coloca la partida en la factura y además resta las existencias en el almacén correspondiente
            if (!SetObjetoFacturaPartida(ref oFactura, oDALFacturas.MedicuriEntities))
            {
                Page.ClientScript.RegisterStartupScript(this.GetType(), "alert",
                    "alert(Ha ocurrido un error: \n" + oDALFacturas.GetError() + ")", true);
                return false;
            }

            if (!oDALFacturas.Add(oFactura, oDALFacturas.MedicuriEntities))
            {
                Page.ClientScript.RegisterStartupScript(this.GetType(), "alert",
                    "alert(Ha ocurrido un error: \n" + oDALFacturas.GetError() + ")", true);
                return false;
            }

            //Saber si se va a actualizar el estatus del pedido
            if ((bool)Session["sEsDePedido"] == true)
            {
                oFactura.pedidos.Estatus = "3";                
            }

            //Saber si se va a actualizar el estatus de la remision
            if ((bool)Session["sEsDeRemision"] == true)
            {
                oFactura.remisiones.Estatus = "3";                
            }

            //Saber si se va a actualizar el estatus de la remision
            if ((bool)Session["sEsDeReceta"] == true)
            {
                oFactura.recetas.Estatus = "2";                
            }

            if (oDALFacturas.SaveChanges(oDALFacturas.MedicuriEntities))
            {
                oBitacora = new MedDAL.DAL.bitacora();
                oblBitacora = new MedNeg.Bitacora.BlBitacora();
                oBitacora.FechaEntradaSrv = DateTime.Now;
                oBitacora.FechaEntradaCte = DateTime.Now;//Linea Temporal
                oBitacora.Modulo = "Factura";
                oBitacora.Usuario = Session["usuario"].ToString();
                oBitacora.Nombre = Session["nombre"].ToString();
                oBitacora.Accion = "Nueva Factura";
                oBitacora.Descripcion = sDatosBitacora;
                if (!oblBitacora.NuevoRegistro(oBitacora))
                {
                    lblDatos.Text = "El evento no pudo ser registrado en la bitácora";
                }

                oblFacturas.ActualizarFolioFactura(sRutaArchivoConfig);

                return true;
            }
            else
            {
                Page.ClientScript.RegisterStartupScript(this.GetType(), "alert",
                    "alert(Ha ocurrido un error: \n" + oDALFacturas.GetError() + ")", true);
                return false;
            }
        }
        /// <summary>
        /// 2013/03/10 Jorge Ibarra
        /// Carga los datos que debe de contener un objeto factura
        /// </summary>
        /// <returns></returns>
        private MedDAL.DAL.facturas SetObjetoFactura()
        {
            string sRutaArchivoConfig = Server.MapPath("~/Archivos/Configuracion.xml");

            if (Session["ObjetoFactura"] == null)
            {
                oFactura = new MedDAL.DAL.facturas();
            }
            else
            {
                oFactura = (MedDAL.DAL.facturas)Session["ObjetoFactura"];
            }

            oFactura.idCliente = (int)Session["sIdCliente"];

            if ((bool)Session["sEsDePedido"] == true)
                oFactura.idPedido = (int)Session["sIdPedido"];

            if ((bool)Session["sEsDeRemision"] == true)
                oFactura.idRemision = (int)Session["sIdRemision"];

            if ((bool)Session["sEsDeReceta"] == true)
                oFactura.idReceta = (int)Session["sIdReceta"];

            oFactura.TipoFactura = cmbTipoFactura.SelectedValue.ToString();
            oFactura.Fecha = DateTime.Now;
            oFactura.FechaAplicacion = DateTime.Now;
            oFactura.Estatus = cmbEstatus.SelectedValue;
            oFactura.idUsuario = Convert.ToInt32(Session["usuarioid"]);
            oFactura.Vendedor = Session["nombre"].ToString();
            //2013 02 19 Nuevos campos para factura 3.2
            oFactura.idMetodoPago = Convert.ToInt32(cmbMetodoPago.SelectedValue);
            oFactura.idTipoFormaPago = Convert.ToInt32(cmbFormaPago.SelectedValue);
            oFactura.NumeroCuentaPago = txbCuentaPago.Text;

            //Validar si se esta respetando el folio automatico y verificar si aun es el mismo o cambio su valor
            if (Session["iFolioAutomatico"].Equals(txbFolio.Text))
            {
                oFactura.Folio = oblFacturas.RecuperaFolioAutomatico(sRutaArchivoConfig).ToString();
            }
            else
            {
                oFactura.Folio = txbFolio.Text;
            }

            //2013/03/10 JID Se colocan los datos que van a la bitácora
            sDatosBitacora += "Tipo:" + cmbTipoFactura.SelectedValue.ToString() + " ";
            sDatosBitacora += "Folio:" + txbFolio.Text + " ";
            sDatosBitacora += "Fecha:" + txbFecha.Text + " ";
            sDatosBitacora += "Estatus:" + cmbEstatus.SelectedItem.ToString() + " ";
            sDatosBitacora += "Cliente:" + txbCliente.Text + " ";

            return oFactura;
        }
        private void Reimprimir(int iIdFactura)
        {
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            oFactura = new MedDAL.DAL.facturas();
            oFactura = oblFacturas.BuscarFactura(iIdFactura);

            if (System.IO.File.Exists(Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".zip")))
            {
                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
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(5);", true);
            }
        }
         /// <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);
                    }
                }
            }

            

        }
        protected void cmbEstatusCobranza_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Recuperar el id de la factura seleccionada y mandar el nuevo estatus
            MedDAL.DAL.facturas oFacturas = new MedDAL.DAL.facturas();
            MedNeg.Facturas.BlFacturas oblFacturas = new MedNeg.Facturas.BlFacturas();


            oFacturas = oblFacturas.BuscarFacturasFolio(dgvDatos.SelectedRow.Cells[4].Text);
            oFacturas.Estatus = ((DropDownList)dgvDatos.SelectedRow.Cells[8].FindControl("cmbEstatusCobranza")).SelectedValue;
            //Actualizar la fecha de aplicación
            oFacturas.FechaAplicacion = DateTime.Now;

            if (oblFacturas.EditarRegistro(oFacturas))
            {
                lblAviso.Text = "La aplicación de la factura:" + dgvDatos.SelectedRow.Cells[4].Text + " fue correcta.";
                
                //Datos de la bitacora
                string sDatosBitacora = string.Empty;
                sDatosBitacora += "Folio:" + oFacturas.Folio + " ";
                sDatosBitacora += "Estatus Cambiado A: " + ((DropDownList)dgvDatos.SelectedRow.Cells[8].FindControl("cmbEstatusCobranza")).SelectedItem.ToString() + " ";
                sDatosBitacora += "Cliente:" + oFacturas.clientes.Nombre + " "+ oFacturas.clientes.Apellidos+" ";
                sDatosBitacora += "RFC:" + oFacturas.clientes.Rfc;

                //Registrar en la bitacora
                RegistrarEnBitacora(sDatosBitacora);
                MostrarLista();
               
            }
            else
            {
                lblAviso.Text = "La aplicación de la factura:" + dgvDatos.SelectedRow.Cells[4].Text + " fue incorrecta, por favor intentelo de nuevo.";
                MostrarLista();
                
            }
        }
Exemple #17
0
        /// <summary>
        /// Generacion de factura electronica
        /// </summary>
        /// <param name="iIdFactura"></param>
        /// <param name="sRutaArchivos"></param>
        /// <param name="sUsuario"></param>
        /// <param name="iIdCliente"></param>
        /// <param name="?"></param>
        /// <param name="sFolioFactura"></param>
        public int GenerarFacturaElectronica(int iIdFactura, string sRutaArchivos, string sUsuario,int iIdCliente,string sFolioFactura)
        {
            int iResultado = 0;
            //Datos de la factura
            MedNeg.Facturas.BlFacturas oblFactura = new BlFacturas();
            MedDAL.DAL.facturas oFactura = new MedDAL.DAL.facturas();

            //Datos de la factura
            oFactura = oblFactura.BuscarFactura(iIdFactura);            
            
            //Recuperar la partida de la factura
            List<MedDAL.DAL.facturas_partida> oQuery = new List<MedDAL.DAL.facturas_partida>();
            oQuery.AddRange(oblFactura.RecuperarPartidaFactura(oFactura.idFactura));
            decimal dSubtotal = 0;
            decimal dImpuestosTrasladados = 0;
            decimal dTotal = 0;

            //Recorrer el resultado de la partida para obtener el total
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                dSubtotal += oDetalle.Cantidad * oDetalle.Precio;
                dImpuestosTrasladados += (decimal)oDetalle.Iva + (decimal)oDetalle.IEPS;
            }
            //Total
            dTotal = dSubtotal + dImpuestosTrasladados;

            DateTime dtFechaTest = DateTime.Now;
            string sNumeroCertificado = "";
            string sA, sB, sC;

            //Leer archivo de configuracion
            MedNeg.Configuracion.BlConfiguracion oblConfiguracion = new MedNeg.Configuracion.BlConfiguracion();
            MedDAL.Configuracion.DALConfiguracion odalConfiguracion = new MedDAL.Configuracion.DALConfiguracion();

            odalConfiguracion = (MedDAL.Configuracion.DALConfiguracion)oblConfiguracion.CargaDatos(sRutaArchivos+"/Configuracion.xml");
            
            //Comprobante.SelloDigital.leerCER(sRutaArchivos + "/Certificados/aaa010101aaa_csd_06.cer", out sA, out sB, out sC, out sNumeroCertificado);
            Comprobante.SelloDigital.leerCER(sRutaArchivos + "/Facturacion/"+odalConfiguracion.sRutaCertificado, out sA, out sB, out sC, out sNumeroCertificado);

            //Establecer el numero de cuenta
            string sNumeroCuenta = null;
            if (oFactura.metodo_pago.MetodoPago.Equals("depósito en cuenta", StringComparison.InvariantCultureIgnoreCase) ||
                oFactura.metodo_pago.MetodoPago.Equals("traspaso", StringComparison.InvariantCultureIgnoreCase))
            {
                sNumeroCuenta = oFactura.NumeroCuentaPago;
            }
            

            //Debo validar la vigencia del certificado con sa <= FechaEmision <= sB

            #region generarcomprobante

            //Construir objeto factura
            Comprobante.ComprobanteFiscalDigital oComprobanteFiscalDigital = new Comprobante.ComprobanteFiscalDigital(
                   "", //Serie 
                   sFolioFactura, //Folio 
                   dtFechaTest.ToString("yyyy-MM-ddThh:mm:ss"), //Fecha
                   oFactura.tipo_forma_pago.FormaPago, //FormaDePago
                   sNumeroCertificado, //NoCertificado
                   "",//"Condiciones de pago",
                   dSubtotal.ToString(), //SubTotal
                   "0",//Descuento
                   "",//Motivo del descuento
                   dTotal.ToString(), //Total
                   oFactura.metodo_pago.MetodoPago, //Metodo de pago
                   "Ingreso", //Tipo de comprobante
                   null, //noAprobacion
                   null, //anoAprobacion
                   "3.2", //version
                   null,//TipoCambio
                   null, //Moneda
                   odalConfiguracion.sEstado + "," + odalConfiguracion.sMunicipio, //LugarExpedicion
                   sNumeroCuenta //NumCtaPago
                   );

            //Pendiente la parte de pagos parciales

            //Empresa o razon social y direccion fiscal
            Comprobante.t_Emisor Emisor = new Comprobante.t_Emisor(
                odalConfiguracion.sRfc,
                    odalConfiguracion.sRazonSocial,
                    odalConfiguracion.sDomicilio, //Calle
                    "", //No exterior
                    "", //No interior
                    "", //Colonia
                    "", //Localidad
                    "",//Emisor Referencia
                    odalConfiguracion.sMunicipio,
                    odalConfiguracion.sEstado,
                    odalConfiguracion.sPais,
                    odalConfiguracion.sCodigoPostal
                );

            Emisor.addRegimenFiscal(odalConfiguracion.sRegimenFiscal);

            oComprobanteFiscalDigital.setEmisor(Emisor);

            //Establece la expedición de la factura, se toman lo datos del almacen
            MedDAL.DAL.usuarios oUsuario = new MedDAL.DAL.usuarios();
            MedNeg.Usuarios.BlUsuarios oblUsuario = new Usuarios.BlUsuarios();
            oUsuario = (MedDAL.DAL.usuarios)oblUsuario.Buscar(sUsuario);

            oComprobanteFiscalDigital.setExpedicion(
                    oUsuario.almacenes.Calle.ToString(),//Calle
                    oUsuario.almacenes.NumeroExt.ToString(),//NoExt
                    "", //NoInt
                    oUsuario.almacenes.colonias.Nombre, //Colonia
                    oUsuario.almacenes.poblaciones.Nombre.ToString(), //Población
                    "",//Emisor Referencia Expedicion
                    oUsuario.almacenes.municipios.Nombre.ToString(),//Municipio
                    oUsuario.almacenes.estados.Nombre.ToString(),//Estado
                    oUsuario.almacenes.Pais.ToString(),//Pais
                    oUsuario.almacenes.CodigoPostal.ToString());//CP

            //Establecer los datos del cliente
            MedDAL.DAL.clientes oCliente = new MedDAL.DAL.clientes();
            MedNeg.BlClientes.BlClientes oblClientes = new BlClientes.BlClientes();
            oCliente = oblClientes.BuscarCliente(iIdCliente);

            oComprobanteFiscalDigital.setReceptor(
                oCliente.Rfc.ToString(), //RFC
                oCliente.Nombre.ToString() + " " + oCliente.Apellidos.ToString(), //Nombre
                oCliente.Calle.ToString(), //Calle
                oCliente.NumeroExt.ToString(), //No ext
                oCliente.NumeroInt.ToString(),//No int
                oCliente.colonias.Nombre.ToString(),//Colo
                oCliente.poblaciones.Nombre.ToString(),//Ciudad
                "",//ReferenciaReceptor
                oCliente.municipios.Nombre.ToString(),//Municipio
                oCliente.estados.Nombre.ToString(),//Estado
                "Mexico",//Pais
                oCliente.CodigoPostal.ToString() //Codigo postal
                );


            //Recorrer el resultado de la partida para obtener el total
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                string Cantidad, Codigo, Descripcion, Unidad, PrecioUnitario, Importe, ImporteNeto;
                
                decimal dImporte=0;
                Cantidad = oDetalle.Cantidad.ToString();
                //Codigo = oDetalle.productos.Clave1.ToString();
                //Descripcion = oDetalle.productos.Nombre.ToString();
                //0087 Identificar si es un producto o un ensamble
                if (oDetalle.idEnsamble.Equals(null))
                {
                    //Datos del producto
                    Codigo = oDetalle.productos.Clave1.ToString();
                }
                else
                {
                    //Datos del ensamble
                    Codigo = oDetalle.ensamble.ClaveBom.ToString();
                }
                
                Descripcion = oDetalle.Descripcion.ToString();
                Unidad = oDetalle.productos.UnidadMedida;
                PrecioUnitario = oDetalle.Precio.ToString();
                dImporte=oDetalle.Cantidad * oDetalle.Precio;
                Importe = dImporte.ToString();
                

                Comprobante.Concepto C = new Comprobante.Concepto(
                    Cantidad,
                    Unidad, 
                    Codigo, 
                    Descripcion, 
                    PrecioUnitario, 
                    Importe);
                oComprobanteFiscalDigital.addConcepto(C);//aqui agregas el elemento a la partida

            }



            #endregion

            //Commpruebo que sea válido
            if (oComprobanteFiscalDigital.Valido() == true)
            {
                string sCadenaOriginal = oComprobanteFiscalDigital.CadenaOriginal();
                oComprobanteFiscalDigital.Sellar(sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaLlave.ToString(), sRutaArchivos + "/Facturacion/" + odalConfiguracion.sRutaCertificado.ToString(), odalConfiguracion.sContraseña.ToString());
                oComprobanteFiscalDigital.XML().Save(sRutaArchivos + "/FacturasElectronicas/FacturaE-" + sFolioFactura + ".xml");
                //return a.XML();
                /*
                 * Modificaciones de POJO: 1 de Noviembre 2011 : Agregando el webservice para timbrado, guardaré los archivos en /Facturacion/Timbrados/
                 */
                FacturaService.TimbradoClient svcT = new FacturaService.TimbradoClient();
                FacturaService.RespuestaCFDi RespuestaCFDi = new FacturaService.RespuestaCFDi();
                
                //Aquí, cambiar la funcion a svcT.Timbrar cuando vayan a mostrarlo en producción, de otra manera, no serán válidos los cfdi's que emitan.
                try
                {
                    byte [] aArchivo = File.ReadAllBytes(sRutaArchivos + "/FacturasElectronicas/FacturaE-" + sFolioFactura + ".xml");
                    RespuestaCFDi = svcT.Timbrar("pojo", "a", aArchivo);                    
                    File.WriteAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".xml", RespuestaCFDi.Documento);
                    RespuestaCFDi = svcT.PDF("pojo", "a", File.ReadAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".xml"), null);
                    File.WriteAllBytes(sRutaArchivos + "/FacturasElectronicasTimbradas/FacturaE-" + sFolioFactura + ".pdf", RespuestaCFDi.Documento);
                    return 0;
                }
                catch (System.Net.WebException ex)
                {
                    //Sale cuando no encuentra al server
                    return 1;
                }
                catch (System.Web.Services.Protocols.SoapHeaderException ex)
                {

                    return 3;
                }
                catch (Exception ex)
                {
                    //Para excepciones no conocidas
                    return 4;
                }
                /*
                 * Falta: Revisar errores con PAC (¿Cómo los regresas? ¿Qué pasa si algo está mal? ¿el xml fue correctamente construido?¿Una función nueva?)
                 */
            }
            else
            {
                //Sale cuando el certificado no es valido
                return 2;
            }
        }
        /// <summary>
        /// Cargar los datos del pedido y su partida
        /// </summary>
        /// <param name="bDatos"></param>
        protected void CargarFormulario(bool bDatos)
        {
            pnlFormulario.Visible = true;
            pnlCatalogo.Visible = false;
            pnlFiltroReportes.Visible = false;

            if (bDatos)
            {

                //Objeto que contiene el id del pedido 
                oblFacturas = new MedNeg.Facturas.BlFacturas();
                oFactura = new MedDAL.DAL.facturas();
                oFactura = (MedDAL.DAL.facturas)oblFacturas.BuscarFactura(int.Parse(dgvDatos.SelectedDataKey[0].ToString()));
                
                //Llenar los campos de la factura
                txbFolio.Text = oFactura.Folio;

                if (oFactura.idPedido.Equals(null))
                    txbPedido.Text = "";
                else
                    txbPedido.Text = oFactura.pedidos.Folio.ToString();

                if (oFactura.idRemision.Equals(null))
                    txbRemision.Text = "";
                else
                    txbRemision.Text = oFactura.remisiones.Folio.ToString();

                if (oFactura.idReceta.Equals(null))
                    txbReceta.Text = "";
                else
                    txbReceta.Text = oFactura.recetas.Folio.ToString();

                txbFecha.Text = oFactura.Fecha.ToShortDateString();
                int iContador = 0;
                cmbEstatus.SelectedIndex = -1;
                foreach (ListItem elemento in cmbEstatus.Items)
                {
                    if (elemento.Value.Equals(oFactura.Estatus.ToString()))
                    {
                        elemento.Selected = true;
                    }
                    iContador++;
                }

                cmbTipoFactura.SelectedIndex = -1;
                iContador = 0;
                foreach (ListItem elemento in cmbTipoFactura.Items)
                {
                    if (elemento.Value.Equals(oFactura.TipoFactura.ToString()))
                    {
                        elemento.Selected = true;
                    }
                    iContador++;
                }
                
                //Llenar los campos del cliente
                txbCliente.Text = oFactura.clientes.Nombre + " " + oFactura.clientes.Apellidos;
                txbDireccion.Text = oFactura.clientes.Calle + " " + oFactura.clientes.NumeroExt;
                if (oFactura.clientes.NumeroInt != null)
                {
                    txbDireccion.Text += "Int: " + oFactura.clientes.NumeroInt;
                }

               txbPoblacion.Text = oFactura.clientes.poblaciones.Nombre.ToString() + ", " + oFactura.clientes.municipios.Nombre.ToString() +", " + oFactura.clientes.estados.Nombre.ToString();

               //Lenar los datos de la partida del detalle
               oblFacturas = new MedNeg.Facturas.BlFacturas();

               //Recuperar la partida del pedido
               List<MedDAL.DAL.facturas_partida> oQuery = new List<MedDAL.DAL.facturas_partida>();
               oQuery.AddRange(oblFacturas.RecuperarPartidaFactura(oFactura.idFactura));

               //Session["lstDetallePartida"] = new List<MedNeg.Facturas.BlDetallePartida>();
               if (((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Count() > 0)
               {
                   ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Clear();
               }
                
               //Recorrer el resultado y meterlo al datagridview
               Session["sTotalFactura"] = 0;

               //0087 Variables para gestionar la carga de datos del producto o del ensamble
               string sClave;
               string sNombre;
               bool bEsEnsamble;

               foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
               {
                   //0087 Identificar si es un producto o un ensamble
                   if (oDetalle.idEnsamble.Equals(null))
                   {
                       //Datos del producto
                       sClave = oDetalle.productos.Clave1;
                       sNombre = oDetalle.productos.Nombre;
                       bEsEnsamble = false;
                   }
                   else
                   {
                       //Datos del ensamble
                       sClave = oDetalle.ensamble.ClaveBom;
                       sNombre = oDetalle.ensamble.Descripcion;
                       bEsEnsamble = true;
                   }

                   oblDetallePartida = new MedNeg.Facturas.BlDetallePartida(
                       Convert.ToInt32(oDetalle.idProducto),
                       //0087 Comentar para enviar las variables correspondientes que tienen la info del producto o ensamble
                       //oDetalle.productos.Clave1,
                       //oDetalle.productos.Nombre,
                       sClave,
                       sNombre,
                       oDetalle.Cantidad,
                       Convert.ToDecimal(oDetalle.IEPS),
                       Convert.ToDecimal(oDetalle.Iva),
                       Convert.ToDecimal(oDetalle.Precio),
                       oDetalle.Observaciones,
                       Convert.ToDecimal((oDetalle.Precio * oDetalle.Cantidad)+oDetalle.IEPS+oDetalle.Iva),
                       oDetalle.Descripcion,
                       bEsEnsamble //0087
                   );
                   

                     ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Add(oblDetallePartida);
                     Session["sTotalFactura"] = Convert.ToDecimal(Session["sTotalFactura"]) + Convert.ToDecimal((oDetalle.Precio * oDetalle.Cantidad) + oDetalle.IEPS + oDetalle.Iva);
               }
               
                //Hacer el binding de la data al dgvDatos
               lblTotal.Text = "TOTAL:$" + Session["sTotalFactura"].ToString();
               dgvPartidaDetalle.DataBind();

                //si el estatus es 1 (Pedido) aun se pueden agregar articulos de lo contario ya no
               if (oFactura.Estatus == "3")
               {
                   HabilitaRemision();
                   Deshabilita();
               }
               else
               {
                   DeshabilitaRemision();
                   Deshabilita();
               }


            }
            else
            {
                Session["lstDetallePartidaPedidos"] = new List<MedNeg.Facturas.BlDetallePartida>();
                dgvPartidaDetalle.DataSource = ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartidaPedidos"]);
                dgvPartidaDetalle.DataBind();
                //Limpia();
                //Deshabilita();

            }
        }