private Int32 EmitirGuiaRendicion(Int32 AgenciaID, Int32 UnidadNegocioID, IUsuarios Usuario, Int32 RendicionHojaRutaID)
        {
            using (System.Data.SqlClient.SqlConnection conexion = new System.Data.SqlClient.SqlConnection())
            {
                conexion.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
                conexion.Open();
                System.Data.SqlClient.SqlTransaction transaccion = conexion.BeginTransaction();

                IGuiaRendicion    GuiaRendicion = GuiaRendicionFactory.GetGuiaRendicion();
                IAdministrarGuias admGuiaO      = AdministrarGuiasFactory.GetAdministrarGuias();

                IAgencia agOrigen = AgenciaFactory.GetAgencia();
                agOrigen.AgenciaID = AgenciaID;
                agOrigen.ConsultarBasico();

                admGuiaO.AgenciaOrigenID        = AgenciaID;
                admGuiaO.AgentePagoCondicionIVA = NegociosSisPackInterface.SisPack.CondicionIva.Ninguno;
                admGuiaO.CondicionPagoID        = NegociosSisPackInterface.SisPack.CondicionPago.CuentaCorriente; // Para que genere tipo guía R
                //admGuiaO.GetNroGuia();
                admGuiaO.CargarInfoComprobante((int)NegociosSisPackInterface.SisPack.TipoValidacionEmision.CAI);

                if (agOrigen.TipoImpresionGuiaId == (int)NegociosSisPackInterface.SisPack.TipoImpresionGuia.PreImpresa)
                {
                    throw new DatosInvalidosException("No se puede generar la guía debido a que es preimpresa");
                }
                else
                {
                    // La agencia es autoimpresora. Reviso si el CAI esta vencido o no
                    if (DateTime.Today > admGuiaO.FechaVencimientoCAI)
                    {
                        // El CAI esta vencido. Reviso si se puede emitir con el CAI vencido
                        IParametroUNegocio param = ParametroUNegocioFactory.GetParametroUNegocio();
                        param.UnidadNegocioID = UnidadNegocioID;
                        param.Parametro       = NegociosSisPackInterface.SisPack.Parametro.PermiteEmitirConCAIVencido;
                        param.Consultar();
                        bool permite = param.ValorString == "1" ? true : false;
                        if (permite == false)
                        {
                            // No se puede emitir con el CAI vencido.
                            throw new DatosInvalidosException("No se puede emitir la guía debido a que la fecha de vencimiento de CAI es superior a la fecha actual.");
                        }
                    }

                    // El CAI no esta vencido o se permite emitir con CAE vencido. Cargo los datos de la guía
                    ((IGuia)GuiaRendicion).NumeroCAI       = admGuiaO.NumeroCAI;
                    ((IGuia)GuiaRendicion).NroGuia         = admGuiaO.NroGuia;
                    ((IGuia)GuiaRendicion).TipoGuia        = admGuiaO.TipoGuia;
                    ((IGuia)GuiaRendicion).NroSucursalGuia = admGuiaO.NroSucursalGuia;
                }

                GuiaRendicion.AgenciaOrigenID = AgenciaID;
                GuiaRendicion.UnidadNegocioID = UnidadNegocioID;

                IParametroUNegocio parametro = ParametroUNegocioFactory.GetParametroUNegocio();
                parametro.UnidadNegocioID = UnidadNegocioID;
                parametro.Parametro       = SisPack.Parametro.AgenciaDestinoGuiaRendicion;
                parametro.Consultar();
                if (parametro.ValorString == null)
                {
                    throw new DatosInvalidosException("No hay cargado una agencia de destino para la guía de rendición");
                }

                GuiaRendicion.AgenciaDestinoID                 = Convert.ToInt32(parametro.ValorString);
                ((IGuia)GuiaRendicion).ClasificacionGuiaID     = NegociosSisPackInterface.SisPack.ClasificacionGuia.Rendicion;
                ((IGuia)GuiaRendicion).FechaEmision            = DateTime.Now;
                ((IGuia)GuiaRendicion).UsuarioID               = Usuario.UsuarioID;
                ((IGuiaFactura)GuiaRendicion).ImporteTotalGuia = 0;

                parametro.Parametro = SisPack.Parametro.ClienteGuiaRendicionHR;
                parametro.Consultar();
                if (parametro.ValorString == null)
                {
                    throw new DatosInvalidosException("No hay configurado un cliente destinatario para la guía de rendición");
                }

                ((IGuiaFactura)GuiaRendicion).DestinatarioCliente = Convert.ToInt32(parametro.ValorString);
                admGuiaO.TipoGuia = NegociosSisPackInterface.SisPack.TipoGuia("9");
                ((IGuiaFactura)GuiaRendicion).EmpresaFacturacionID = admGuiaO.ObtieneEmpresaFacturacion();

                if (GuiaRendicion.GuiasRendidas.getCount() == 0)
                {
                    IGuiaRendicionDetalle guiaConServARendir = GuiaRendicion.GuiasRendidas.AddGuiaRendicionDetalle();
                    guiaConServARendir.RendicionAgenciaID = RendicionHojaRutaID;
                }

                if (GuiaRendicion.EmitirGuiaRendicion(transaccion, Usuario) == false)
                {
                    transaccion.Rollback();
                    throw new Exception("Error al emitir guía de rendición");
                }

                IGuiaFacturaDetalle detalle = GuiaFacturaDetalleFactory.GetGuiaFacturaDetalle();
                detalle.AgenciaOrigenID = AgenciaID;
                detalle.CantidadBultos  = 0;
                detalle.GuiaID          = ((IGuia)GuiaRendicion).GuiaID;

                parametro.Parametro = SisPack.Parametro.UnidadVentaGuiaRendicionHR;
                parametro.Consultar();
                if (parametro.ValorString == null)
                {
                    transaccion.Rollback();
                    throw new DatosInvalidosException("No hay configurada una unidad de venta para la guía de rendición");
                }
                detalle.UnidadVentaID = Convert.ToInt32(parametro.ValorString);
                if (detalle.Guardar(transaccion) == false)
                {
                    transaccion.Rollback();
                    throw new Exception("Error al guardar el detalle de la guía de rendición");
                }

                transaccion.Commit();

                return(((IGuia)GuiaRendicion).GuiaID);
            }
        }