private EstadoPedido DevolverPeliculaInternal(string nifSocio, string peliculaCodBarras, out Historico historico)
        {
            Alquiler     alquiler;
            Pelicula     pelicula, peliculaOriginal;
            Socio        socio, socioOriginal;
            AlquileresAD alquileresAD = new AlquileresAD();
            HistoricosAD historicosAD = new HistoricosAD();
            PeliculasAD  peliculasAD  = new PeliculasAD();
            UsuariosAD   usuariosAD   = new UsuariosAD();

            historico = null;
            using (TransactionScope tx = new TransactionScope())
            {
                // Buscamos alquiler pendiente de devolver
                alquiler = alquileresAD.ObtenerAlquilerSinDevolverPorSocioPelicula(nifSocio, peliculaCodBarras);
                if (alquiler == null)
                {
                    throw new ArgumentException();
                }

                // Actualización de stock
                pelicula         = peliculasAD.ObtenerPeliculaPorCodBarras(peliculaCodBarras, false, false);
                peliculaOriginal = (Pelicula)OperacionesEntidad.CreateDataCopy(pelicula, false);
                pelicula.UnidadesAlquiladas--;
                try
                {
                    peliculasAD.ActualizarPelicula(pelicula, peliculaOriginal);
                }
                catch (ChangeConflictException)
                {
                    // Error de concurrencia
                    return(EstadoPedido.ErrorConcurrencia);
                }

                // Almacenamos en históricos
                historico                 = new Historico();
                historico.PeliculaID      = alquiler.PeliculaID;
                historico.SocioID         = alquiler.SocioID;
                historico.Fecha           = alquiler.FechaAlquiler;
                historico.FechaRecogida   = alquiler.FechaRecogida;
                historico.FechaDevolucion = DateTime.Now;
                historico.TipoOperacion   = TipoOperacion.Devolucion;
                historico.Precio          = CalcularPrecio(alquiler.FechaAlquiler, alquiler.FechaRecogida.Value, historico.FechaDevolucion.Value);
                historicosAD.AgregarHistorico(historico);

                // Borrado alquiler
                try
                {
                    alquileresAD.EliminarAlquiler(alquiler);
                }
                catch (ChangeConflictException)
                {
                    // Error de concurrencia
                    return(EstadoPedido.ErrorConcurrencia);
                }

                // Actualización saldo
                socio         = usuariosAD.ObtenerSocioPorNIF(nifSocio);
                socioOriginal = (Socio)OperacionesEntidad.CreateDataCopy(socio, false);
                socio.Saldo  -= historico.Precio;
                if (socio.Saldo < 0)
                {
                    return(EstadoPedido.SaldoInsuficiente);
                }
                try
                {
                    usuariosAD.ActualizarUsuario(socio, socioOriginal);
                }
                catch (ChangeConflictException)
                {
                    // Error de concurrencia
                    return(EstadoPedido.ErrorConcurrencia);
                }

                tx.Complete();
            }

            return(EstadoPedido.Realizado);
        }