예제 #1
0
        /// <summary>
        /// Inserir um usuário num cargo. Caso o cargo informado seja Diretoria ou Gabinere
        /// e caso exista outro usuário neste cargo, remove o usuário e insere o novo,
        /// pois não permite mais de um usuário no mesmo cargo, na mesma UF, para diretor
        /// e chefe de gabinete.
        /// </summary>
        /// <param name="usuario">Usuário a assumir o cargo.</param>
        /// <param name="cargo">Cargo a ser assumido.</param>
        /// <param name="mover">Caso true, move o usuário mesmo nos cargos repetitíveis</param>
        public void Salvar(Usuario usuario, Cargo cargo, bool mover = false)
        {
            // Executa tudo numa transação para evitar operações feitas no banco pela metade.
            using (var transacao = _repositorio.session.BeginTransaction())
            {
                try
                {
                    // Verificar se o indivíduo está em algum cargo que pode repetir várias vezes, e,
                    // caso esteja, remove suas participações nesses outros cargos, pois ele está
                    // sendo movido.
                    var todosCargosSaoRepetiveis = usuario.ListaUsuarioCargo.All(x => x.Cargo.UsuarioPodeRepetirNoCargo());

                    if (mover || (todosCargosSaoRepetiveis == false && cargo.UsuarioPodeRepetirNoCargo() == false))
                    {
                        foreach (var usuarioCargo in usuario.ListaUsuarioCargo)
                        {
                            _repositorio.session.Delete(usuarioCargo);
                        }
                    }

                    // Só remove o atual caso seja Diretor ou Chefe de gabinete.
                    if (cargo.TipoCargo == EnumTipoCargo.Diretoria || cargo.TipoCargo == EnumTipoCargo.Gabinete)
                    {
                        var posseAtual = ObterPorCargo(cargo);

                        if (posseAtual != null)
                        {
                            // Se já for o próprio usuário em posse do cargo, não faz nada.
                            if (posseAtual.Usuario.ID == usuario.ID)
                            {
                                return;
                            }

                            // Caso já exista alguém no cargo, remove e insere antes de inserir a nova pessoa.
                            _repositorio.session.Delete(posseAtual);

                            cargo.UsuariosCargos.Remove(posseAtual);
                        }
                    }

                    var novaPosse = new UsuarioCargo
                    {
                        Usuario = usuario,
                        Cargo   = cargo
                    };

                    _repositorio.session.SaveOrUpdate(novaPosse);
                    transacao.Commit();
                }
                catch (Exception ex)
                {
                    transacao.Rollback();
                    throw ex;
                }
                finally
                {
                    _repositorio.LimparSessao();
                }
            }
        }
예제 #2
0
 public void Salvar(UsuarioCargo usuarioCargo)
 {
     _repositorio.Salvar(usuarioCargo);
 }
예제 #3
0
 public void Remover(UsuarioCargo usuarioCargo)
 {
     _bmUsuarioCargo.Remover(usuarioCargo);
 }
예제 #4
0
 public void Remover(UsuarioCargo usuarioCargo)
 {
     _repositorio.Excluir(usuarioCargo);
 }
예제 #5
0
 public void Salvar(UsuarioCargo usuarioCargo)
 {
     _bmUsuarioCargo.Salvar(usuarioCargo);
 }