public ActionResult DadosGerais(int id, int versao, string nome, string nif, int tipoFuncionario)
        {
            var criarNovoFuncionario            = id == 0 && versao == 0;
            IEnumerable <TipoFuncionario> tipos = null;
            FuncionarioDto funcionario          = null;
            MsgGravacao    msg  = null;
            var            novo = true;

            using (var tran = _session.BeginTransaction()) {
                try {
                    tipos = _session.QueryOver <TipoFuncionario>().List <TipoFuncionario>();
                    var tipo = tipos.FirstOrDefault(t => t.Id == tipoFuncionario);
                    Contract.Assert(tipo != null, Msg.Tipo_funcionario_inexistente);

                    if (!criarNovoFuncionario)
                    {
                        var comando = new ModificaDadosGeraisFuncionario(id, versao, nome, nif, tipo);
                        msg = _processador.Trata(comando);
                    }
                    else
                    {
                        var comando = new CriaFuncionario(nome, nif, tipo);
                        msg  = _processador.Trata(comando);
                        novo = !msg.GravadaComSucesso();
                        id   = msg.Id;
                    }

                    tran.Commit();
                }
                catch (Exception ex) {
                    ModelState.AddModelError("total", ex.Message);
                }
            }
            return(View("Funcionario", new DadosFormularioFuncionario {
                Funcionario = !criarNovoFuncionario || !novo ? _session.Load <FuncionarioDto>(id) : CriaFuncionarioDtoVazio(tipos),
                Novo = criarNovoFuncionario && novo,
                TiposFuncionario = tipos
            }));
        }
 private static bool Novo(FuncionarioDto funcionario)
 {
     return(funcionario != null && funcionario.Id == 0 && funcionario.Versao == 0);
 }