protected virtual void AntesDePersistirValidarRegistro(TRegistro registro, ParametrosDeNegocio parametros)
        {
            var negocio = NegociosDeSe.NegocioDeUnDtm(registro.GetType().FullName);

            if (!Contexto.DatosDeConexion.CreandoModelo && (!parametros.Parametros.ContainsKey(NegociosDeSe.ValidarSeguridad) || (bool)parametros.Parametros[NegociosDeSe.ValidarSeguridad]))
            {
                ValidarPermisosDePersistencia(parametros.Operacion, negocio, registro);
            }

            if ((parametros.Operacion == enumTipoOperacion.Insertar || parametros.Operacion == enumTipoOperacion.Modificar) && registro.ImplementaNombre())
            {
                var propiedades = registro.PropiedadesDelObjeto();
                foreach (var propiedad in propiedades)
                {
                    if (propiedad.Name == nameof(INombre.Nombre))
                    {
                        if (((string)propiedad.GetValue(registro)).IsNullOrEmpty())
                        {
                            GestorDeErrores.Emitir($"El nombre del objeto {typeof(TRegistro).Name} es obligatorio");
                        }
                        break;
                    }
                }
            }

            if (parametros.Operacion == enumTipoOperacion.Modificar || parametros.Operacion == enumTipoOperacion.Eliminar)
            {
            }
        }
        public List <TRegistro> LeerRegistros(int posicion, int cantidad, List <ClausulaDeFiltrado> filtros = null, List <ClausulaDeOrdenacion> orden = null, List <ClausulaDeJoin> joins = null, ParametrosDeNegocio parametros = null)
        {
            List <TRegistro> elementosDeBd;

            if (parametros == null)
            {
                parametros = new ParametrosDeNegocio(enumTipoOperacion.LeerSinBloqueo);
            }

            IQueryable <TRegistro> registros = DefinirConsulta(posicion, cantidad, filtros, orden, joins, parametros);

            if (!Contexto.HayTransaccion && parametros.Operacion == enumTipoOperacion.LeerSinBloqueo)
            {
                var transactionOptions = new System.Transactions.TransactionOptions();
                transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
                using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions))
                {
                    elementosDeBd = parametros.LeerParaActualizar ? registros.ToList() : registros.AsNoTracking().ToList();
                    transactionScope.Complete();
                }
            }
            else
            {
                elementosDeBd = parametros.LeerParaActualizar ? registros.ToList() : registros.AsNoTracking().ToList();
            }

            return(elementosDeBd);
        }
        protected virtual void DespuesDePersistir(TRegistro registro, ParametrosDeNegocio parametros)
        {
            var indice = typeof(TRegistro).FullName;

            _CacheDeRecuentos[indice] = true;

            var propiedades = registro.PropiedadesDelObjeto();

            foreach (var propiedad in propiedades)
            {
                if (typeof(TRegistro).ImplementaNombre() && propiedad.Name == nameof(INombre.Nombre))
                {
                    ServicioDeCaches.EliminarElemento(typeof(TRegistro).FullName, $"{nameof(INombre.Nombre)}-{registro.ValorPropiedad(nameof(INombre.Nombre))}-1");
                    ServicioDeCaches.EliminarElemento(typeof(TRegistro).FullName, $"{nameof(INombre.Nombre)}-{registro.ValorPropiedad(nameof(INombre.Nombre))}-0");
                }

                if (propiedad.Name == nameof(registro.Id))
                {
                    ServicioDeCaches.EliminarElemento(typeof(TRegistro).FullName, $"{nameof(registro.Id)}-{registro.Id}-1");
                    ServicioDeCaches.EliminarElemento(typeof(TRegistro).FullName, $"{nameof(registro.Id)}-{registro.Id}-0");
                }
            }

            ServicioDeCaches.EliminarCache($"{typeof(TRegistro).FullName}-ak");
        }
 protected virtual void AntesMapearRegistroParaModificar(TElemento elemento, ParametrosDeNegocio opciones)
 {
     if (elemento.Id == 0)
     {
         GestorDeErrores.Emitir($"No puede modificar un elemento {typeof(TElemento).Name} con id 0");
     }
 }
        public void PersistirElementoDto(TElemento elementoDto, ParametrosDeNegocio parametros)
        {
            TRegistro registro = MapearRegistro(elementoDto, parametros);

            PersistirRegistro(registro, parametros);
            elementoDto.Id = registro.Id;
        }
 public void PersistirElementosDto(List <TElemento> elementosDto, ParametrosDeNegocio parametros)
 {
     foreach (var elementoDto in elementosDto)
     {
         PersistirElementoDto(elementoDto, parametros);
     }
 }
        public TRegistro LeerRegistro(List <ClausulaDeFiltrado> filtros, ParametrosDeNegocio parametros, bool errorSiNoHay, bool errorSiHayMasDeUno)
        {
            List <TRegistro> registros = LeerRegistros(0, -1, filtros, null, null, parametros);

            if (errorSiNoHay && registros.Count == 0)
            {
                GestorDeErrores.Emitir($"No se ha localizado el registro solicitada para los filtros indicados en la clase {typeof(TRegistro).Name}");
            }

            if (errorSiHayMasDeUno && registros.Count > 1)
            {
                GestorDeErrores.Emitir($"Hay más de un registro para los filtros indicados en la clase {typeof(TRegistro).Name}");
            }

            if (registros.Count == 0)
            {
                return(null);
            }

            if (registros.Count > 1)
            {
                return(registros[0]);
            }

            return(registros[0]);
        }
 protected virtual void AntesMapearRegistroParaInsertar(TElemento elemento, ParametrosDeNegocio opciones)
 {
     if (elemento.Id > 0)
     {
         GestorDeErrores.Emitir($"No puede crear un elemento {typeof(TElemento).Name} con id {elemento.Id}");
     }
 }
 protected bool HacerJoinCon(ParametrosDeNegocio parametros, string join)
 {
     if (!parametros.Parametros.ContainsKey(join))
     {
         return(true);
     }
     return((bool)parametros.Parametros[join]);
 }
        protected async Task ModificarRegistroAsync(TRegistro registro, ParametrosDeNegocio parametros = null)
        {
            if (parametros == null)
            {
                parametros = new ParametrosDeNegocio(enumTipoOperacion.Modificar);
            }

            Contexto.Update(registro);
            await Contexto.SaveChangesAsync();
        }
        public async Task ModificarElementoAsync(TElemento elemento, ParametrosDeNegocio parametros = null)
        {
            if (parametros == null)
            {
                parametros = new ParametrosDeNegocio(enumTipoOperacion.Modificar);
            }

            TRegistro registro = MapearRegistro(elemento, parametros);

            await ModificarRegistroAsync(registro);
        }
        public List <TRegistro> MapearRegistros(List <TElemento> elementos, ParametrosDeNegocio opciones)
        {
            var registros = new List <TRegistro>();

            foreach (var elemento in elementos)
            {
                var registro = MapearRegistro(elemento, opciones);
                registros.Add(registro);
            }
            return(registros);
        }
        public async Task InsertarElementoAsync(TElemento elemento, ParametrosDeNegocio parametros = null)
        {
            if (parametros == null)
            {
                parametros = new ParametrosDeNegocio(enumTipoOperacion.Insertar);
            }

            TRegistro elementoBD = MapearRegistro(elemento, parametros);

            Contexto.Add(elementoBD);
            await Contexto.SaveChangesAsync();
        }
        public TRegistro MapearRegistro(TElemento elemento, ParametrosDeNegocio opciones)
        {
            var registro = Mapeador.Map <TElemento, TRegistro>(elemento,
                                                               opt =>
            {
                opt.BeforeMap((src, dest) => AntesMapearRegistro(elemento, opciones));
                opt.AfterMap((src, dest) => DespuesDeMapearRegistro(elemento, dest, opciones));
            }
                                                               );

            return(registro);
        }
        public TRegistro PersistirRegistro(TRegistro registro, ParametrosDeNegocio parametros)
        {
            if (parametros.Operacion != enumTipoOperacion.Insertar)
            {
                parametros.registroEnBd = LeerRegistroPorId(registro.Id, false, false, false, aplicarJoin: false);
            }

            var transaccion = Contexto.IniciarTransaccion();

            try
            {
                AntesDePersistir(registro, parametros);

                if (parametros.Operacion == enumTipoOperacion.Insertar)
                {
                    Contexto.Add(registro);
                }
                else
                if (parametros.Operacion == enumTipoOperacion.Modificar)
                {
                    Contexto.Update(registro);
                }
                else
                if (parametros.Operacion == enumTipoOperacion.Eliminar)
                {
                    Contexto.Remove(registro);
                }
                else
                {
                    throw new Exception($"Solo se pueden persistir operaciones del tipo {enumTipoOperacion.Insertar} o  {enumTipoOperacion.Modificar} o {enumTipoOperacion.Eliminar}");
                }

                Contexto.SaveChanges();

                if (Auditoria.ImplementaAuditoria(typeof(TRegistro)))
                {
                    var negocio = NegociosDeSe.NegocioDeUnDtm(typeof(TRegistro).FullName);
                    var auditar = parametros.Operacion == enumTipoOperacion.Modificar ? parametros.registroEnBd : registro;
                    AuditoriaDeElementos.RegistrarAuditoria(Contexto, negocio, parametros.Operacion, (IElementoDtm)auditar);
                }

                DespuesDePersistir(registro, parametros);
                Contexto.Commit(transaccion);
            }
            catch (Exception)
            {
                Contexto.Rollback(transaccion);
                throw;
            }
            return(registro);
        }
        public int Contar(List <ClausulaDeFiltrado> filtros, List <ClausulaDeJoin> joins = null, ParametrosDeNegocio parametros = null)
        {
            if (parametros == null)
            {
                parametros = new ParametrosDeNegocio(enumTipoOperacion.Contar);
            }

            var registros = DefinirConsulta(0, -1, filtros, null, joins, parametros);
            var total     = registros.Count();

            _CacheDeRecuentos[typeof(TRegistro).FullName] = false;

            return(total);
        }
 private void AntesMapearRegistro(TElemento elemento, ParametrosDeNegocio opciones)
 {
     if (opciones.Operacion == enumTipoOperacion.Insertar)
     {
         AntesMapearRegistroParaInsertar(elemento, opciones);
     }
     else
     if (opciones.Operacion == enumTipoOperacion.Modificar)
     {
         AntesMapearRegistroParaModificar(elemento, opciones);
     }
     else
     if (opciones.Operacion == enumTipoOperacion.Eliminar)
     {
         AntesMapearRegistroParaEliminar(elemento, opciones);
     }
 }
        protected void PersistirRegistros(List <TRegistro> registros, ParametrosDeNegocio parametros)
        {
            var transaccion = Contexto.IniciarTransaccion();

            try
            {
                foreach (var registro in registros)
                {
                    PersistirRegistro(registro, parametros);
                }

                Contexto.Commit(transaccion);
            }
            catch (Exception)
            {
                Contexto.Rollback(transaccion);
                throw;
            }
        }
        public TRegistro LeerUltimoRegistro(List <ClausulaDeFiltrado> filtros = null, List <ClausulaDeJoin> joins = null, ParametrosDeNegocio parametros = null)
        {
            if (parametros == null)
            {
                parametros = new ParametrosDeNegocio(enumTipoOperacion.LeerSinBloqueo);
            }

            var orden = new ClausulaDeOrdenacion()
            {
                OrdenarPor = nameof(IRegistro.Id), Modo = ModoDeOrdenancion.descendente
            };

            var registros = DefinirConsulta(0, -1, filtros, new List <ClausulaDeOrdenacion> {
                orden
            }, joins, parametros);

            var registro = parametros.LeerParaActualizar ? registros.FirstOrDefault() : registros.AsNoTracking().FirstOrDefault();

            return(registro);
        }
        public IEnumerable <TElemento> LeerElementos(int posicion, int cantidad, List <ClausulaDeFiltrado> filtros, List <ClausulaDeOrdenacion> orden, Dictionary <string, object> opcionesDeMapeo)
        {
            if (!opcionesDeMapeo.ContainsKey(nameof(ParametrosDeNegocio.Operacion)))
            {
                opcionesDeMapeo.Add(nameof(ParametrosDeNegocio.Operacion), enumTipoOperacion.LeerSinBloqueo.ToString());
            }

            var to          = opcionesDeMapeo[nameof(ParametrosDeNegocio.Operacion)].ToTipoOperacion();
            var aplicarJoin = opcionesDeMapeo.ContainsKey(nameof(ParametrosDeNegocio.AplicarJoin)) ? (bool)opcionesDeMapeo[nameof(ParametrosDeNegocio.AplicarJoin)] : true;
            var p           = new ParametrosDeNegocio(to, aplicarJoin);

            List <TRegistro> elementosDeBd = LeerRegistros(posicion, cantidad, filtros, orden, null, p);

            ParametrosDeMapeo parametrosDelMapeo = opcionesDeMapeo.Count > 0 ? new ParametrosDeMapeo()
            {
                Opciones = opcionesDeMapeo
            } : null;

            return(MapearElementos(elementosDeBd, parametrosDelMapeo));
        }
        public List <TRegistro> LeerRegistrosPorNombre(int posicion, int cantidad, List <ClausulaDeFiltrado> filtros = null, ParametrosDeNegocio parametros = null)
        {
            if (!typeof(TRegistro).ImplementaNombre())
            {
                throw new Exception($"se ha solicitado leer registros por nombre, el tipo {typeof(TRegistro).Name} no tiene dicho campo");
            }

            List <ClausulaDeOrdenacion> orden = new List <ClausulaDeOrdenacion>();

            orden.Add(new ClausulaDeOrdenacion()
            {
                OrdenarPor = nameof(INombre.Nombre), Modo = ModoDeOrdenancion.ascendente
            });

            if (parametros == null)
            {
                parametros = new ParametrosDeNegocio(enumTipoOperacion.LeerSinBloqueo, aplicarJoin: false);
            }

            return(LeerRegistros(posicion, cantidad, filtros, orden, null, parametros));
        }
        protected virtual void AntesDePersistir(TRegistro registro, ParametrosDeNegocio parametros)
        {
            AntesDePersistirValidarRegistro(registro, parametros);

            if (registro.ImplementaUnElemento())
            {
                var elemento = (IElementoDtm)registro;
                if (parametros.Operacion == enumTipoOperacion.Insertar)
                {
                    elemento.IdUsuaCrea    = Contexto.DatosDeConexion.IdUsuario;
                    elemento.FechaCreacion = DateTime.Now;
                }
                else
                if (parametros.Operacion == enumTipoOperacion.Modificar)
                {
                    elemento.IdUsuaCrea        = ((IElementoDtm)parametros.registroEnBd).IdUsuaCrea;
                    elemento.FechaCreacion     = ((IElementoDtm)parametros.registroEnBd).FechaCreacion;
                    elemento.IdUsuaModi        = Contexto.DatosDeConexion.IdUsuario;
                    elemento.FechaModificacion = DateTime.Now;
                }
            }
        }
        private List <TRegistro> LeerRegistroInterno(string propiedad, string valor, bool traqueado, bool ConBloqueo, bool aplicarJoin)
        {
            var filtro = new ClausulaDeFiltrado()
            {
                Criterio = CriteriosDeFiltrado.igual,
                Clausula = propiedad,
                Valor    = valor
            };
            var filtros = new List <ClausulaDeFiltrado>()
            {
                filtro
            };

            var parametros = new ParametrosDeNegocio(ConBloqueo ? enumTipoOperacion.LeerConBloqueo : enumTipoOperacion.LeerSinBloqueo, aplicarJoin);
            IQueryable <TRegistro> registros = DefinirConsulta(0, -1, filtros, null, null, parametros);

            if (!traqueado)
            {
                return(registros.AsNoTracking().ToList());
            }

            return(registros.ToList());
        }
 protected virtual void DespuesDeMapearRegistro(TElemento elemento, TRegistro registro, ParametrosDeNegocio opciones)
 {
     if (enumTipoOperacion.Insertar == opciones.Operacion)
     {
         registro.Id = 0;
     }
 }
        public int Recontar(List <ClausulaDeFiltrado> filtros, List <ClausulaDeJoin> joins = null, ParametrosDeNegocio parametros = null)
        {
            if (!_CacheDeRecuentos.ContainsKey(typeof(TRegistro).FullName) || _CacheDeRecuentos[typeof(TRegistro).FullName])
            {
                return(Contar(filtros, joins, parametros));
            }

            return(0);
        }
 protected virtual IQueryable <TRegistro> AplicarJoins(IQueryable <TRegistro> registros, List <ClausulaDeFiltrado> filtros, List <ClausulaDeJoin> joins, ParametrosDeNegocio parametros)
 {
     if (ApiDeRegistro.ImplementaUnElemento(typeof(TRegistro)) && HacerJoinCon(parametros, ltrJoinAudt.IncluirUsuarioDtm))
     {
         registros = registros.Include(e => ((IElementoDtm)e).UsuarioCreador);
         registros = registros.Include(e => ((IElementoDtm)e).UsuarioModificador);
     }
     return(registros);
 }
        protected virtual IQueryable <TRegistro> AplicarFiltros(IQueryable <TRegistro> registros, List <ClausulaDeFiltrado> filtros, ParametrosDeNegocio parametros)
        {
            foreach (ClausulaDeFiltrado filtro in filtros)
            {
                if (filtro.Clausula.ToLower() == nameof(IRegistro.Id).ToLower() && filtro.Criterio == CriteriosDeFiltrado.igual)
                {
                    HayFiltroPorId = filtro.Criterio == CriteriosDeFiltrado.igual;
                    return(registros.AplicarFiltroPorIdentificador(filtro, nameof(IRegistro.Id)));
                }
            }

            return(registros.AplicarFiltroPorPropiedades(filtros));
        }
        private IQueryable <TRegistro> DefinirConsulta(int posicion, int cantidad, List <ClausulaDeFiltrado> filtros, List <ClausulaDeOrdenacion> orden, List <ClausulaDeJoin> joins, ParametrosDeNegocio parametros)
        {
            if (joins == null)
            {
                joins = new List <ClausulaDeJoin>();
            }

            if (filtros == null)
            {
                filtros = new List <ClausulaDeFiltrado>();
            }

            IQueryable <TRegistro> registros = Contexto.Set <TRegistro>();

            if (parametros.AplicarJoin)
            {
                registros = AplicarJoins(registros, filtros, joins, parametros);
            }

            if (filtros.Count > 0)
            {
                registros = AplicarFiltros(registros, filtros, parametros);
            }

            if (parametros.Operacion == enumTipoOperacion.LeerSinBloqueo)
            {
                if (orden == null)
                {
                    orden = new List <ClausulaDeOrdenacion>();
                }
                registros = AplicarOrden(registros, orden);
            }

            registros = registros.Skip(posicion);

            if (cantidad > 0)
            {
                registros = registros.Take(cantidad);
            }

            return(registros);
        }
        public List <TElemento> ProyectarElementos(int posicion, int cantidad, List <ClausulaDeFiltrado> filtros, List <ClausulaDeOrdenacion> orden, ParametrosDeNegocio parametros = null)
        {
            IQueryable <TRegistro> registros = DefinirConsulta(posicion, cantidad, filtros, orden, null, parametros);

            return(Mapeador.ProjectTo <TElemento>(registros).AsNoTracking().ToList());
        }