예제 #1
0
        public async Task <JsonResult> ObterRecursos(int id)
        {
            try
            {
                ProjectNode noh = await db.ProjectNodes
                                  .Include(x => x.UsuariosDesteNode)
                                  .Where(x => x.Id == id)
                                  .SingleOrDefaultAsync();

                return(Json(new
                {
                    Sucesso = true,
                    Mensagem = "",
                    Selecionados = noh.UsuariosDesteNode.Select(x => x.Id).ToList <int>().ToArray()
                }, JsonRequestBehavior.AllowGet));
            }
            catch (Exception err)
            {
                LogServices.LogarException(err);
                return(Json(new
                {
                    Sucesso = false,
                    Mensagem = err.Message,
                    Selecionados = new int[] { }
                }, JsonRequestBehavior.AllowGet));
            }
        }
예제 #2
0
        /// <summary>
        /// adiciona os campos de log de auditoria no registro sendo salvo
        /// conforme entrada de blog https://benjii.me/2014/03/track-created-and-modified-fields-automatically-with-entity-framework-code-first/
        /// </summary>
        private void AddTimestamps()
        {
            try
            {
                var entries = ChangeTracker.Entries().Where(x => x.Entity is TPAEntity && (x.State == EntityState.Added || x.State == EntityState.Modified));

                var currentUsername = !string.IsNullOrEmpty(System.Web.HttpContext.Current?.User?.Identity?.Name)
                    ? HttpContext.Current.User.Identity.Name
                    : "Anonymous";

                foreach (var entry in entries)
                {
                    if (entry.State == EntityState.Added)
                    {
                        ((TPAEntity)entry.Entity).MomentoInclusao = DateTime.Now;
                        ((TPAEntity)entry.Entity).UsuarioInclusao = currentUsername;
                    }

                    ((TPAEntity)entry.Entity).MomentoEdicao = DateTime.Now;
                    ((TPAEntity)entry.Entity).UsuarioEdicao = currentUsername;
                }
            }
            catch (Exception auditEx)
            {
                LogServices.LogarException(auditEx);
            }
        }
예제 #3
0
        /// <summary>
        /// copia para a ExcelWorksheet os dados de GetRelatorio_Analitico
        /// </summary>
        /// <param name="dtIni">DateTime - data inicial</param>
        /// <param name="dtFin">DateTime - data final</param>
        /// <param name="ws">ExcelWorksheet - worksheet do pacote epplus para onde vão os dados</param>
        private void ConstroiRelatorio_Analitico(DateTime dtIni, DateTime dtFin, ExcelWorksheet ws)
        {
            var dados = this.GetRelatorio_Analitico(dtIni, dtFin);

            int linha = 6;

            foreach (var d in dados)
            {
                try
                {
                    ws.Cells[linha, 1].Value  = d.Inicio.Date;
                    ws.Cells[linha, 2].Value  = d.Funcionario;
                    ws.Cells[linha, 3].Value  = d.Tipo_Atividade;
                    ws.Cells[linha, 4].Value  = d.Observacao;
                    ws.Cells[linha, 5].Value  = d.Inicio;
                    ws.Cells[linha, 6].Value  = d.Fim;
                    ws.Cells[linha, 7].Value  = d.Horas;
                    ws.Cells[linha, 8].Value  = d.Administrativo;
                    ws.Cells[linha, 9].Value  = d.Cliente_Raiz;
                    ws.Cells[linha, 10].Value = d.Cliente;
                    ws.Cells[linha, 11].Value = d.Area;
                    ws.Cells[linha, 12].Value = d.Projeto;
                    ws.Cells[linha, 13].Value = d.Entregaveis;
                    ws.Cells[linha, 14].Value = d.Etapas;

                    linha++;
                }
                catch (Exception err)
                {
                    LogServices.LogarException(err);
                }
            }
        }
예제 #4
0
        /// <summary>
        /// sobrecarrega AuthorizeCore e diz se o usuário pode acessar ou não
        /// </summary>
        /// <param name="httpContext">HttpContextBase - contexto da chamada</param>
        /// <returns>bool - true se o usuário estiver autorizado</returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if ((httpContext.Handler != null) && (httpContext.Handler is MvcHandler))
            {
                bool podeAcessar = false;
                using (TPAContext db = new TPAContext())
                {
                    ControleAcesso c = new ControleAcesso(db);

                    try
                    {
                        var    routeData  = ((MvcHandler)httpContext.Handler).RequestContext.RouteData;
                        string actionName = routeData.Values["action"].ToString();

                        string controllerName = routeData.Values["controller"].ToString();

                        podeAcessar = c.PodeAcessar(controllerName, actionName);
                    }
                    catch (Exception err)
                    {
                        LogServices.LogarException(err);
                    }
                }
                return(podeAcessar);
            }
            else
            {
                return(base.AuthorizeCore(httpContext));
            }
        }
예제 #5
0
        public async Task <ActionResult> LancaPlanilhaPost(ImportacaoPlanilhaAtividadesViewModel planmodel)
        {
            CarregaTipos();
            CarregaProjetos();
            CarregaUsuarios();

            if (ModelState.IsValid && planmodel != null && planmodel.Itens.Count > 0)
            {
                try
                {
                    ImportaPlanilhaApplication app = new ImportaPlanilhaApplication(this.db);
                    int linhas = await app.LancarAsync(planmodel);

                    MensagemParaUsuarioViewModel.MensagemSucesso(string.Format("Planilha importada com sucesso! {0} linhas da planilha importadas.", linhas), TempData);
                    return(View("Index"));
                }
                catch (Exception err)
                {
                    MensagemParaUsuarioViewModel.MensagemErro(err.Message, TempData, ModelState);
                    LogServices.LogarException(err);
                }
            }



            return(View(planmodel));
        }
예제 #6
0
        /// <summary>
        /// copia para a ExcelWorksheet os dados de GetRelatorio_Consolidado_Projeto_Funcionario_Dia
        /// </summary>
        /// <param name="dtIni">DateTime - data inicial</param>
        /// <param name="dtFin">DateTime - data final</param>
        /// <param name="ws">ExcelWorksheet - worksheet do pacote epplus para onde vão os dados</param>
        private void ConstroiRelatorio_Consolidado_Projeto_Funcionario_Dia(DateTime dtIni, DateTime dtFin, ExcelWorksheet ws)
        {
            var dados = this.GetRelatorio_Consolidado_Projeto_Funcionario_Dia(dtIni, dtFin);

            int linha = 6;

            ws.Column(1).Style.Numberformat.Format = "dd/MM/yyyy";
            ws.Column(6).Style.Numberformat.Format = "[hh]:mm";

            foreach (var d in dados)
            {
                try
                {
                    ws.Cells[linha, 1].Value = d.Dia;
                    ws.Cells[linha, 2].Value = d.Funcionario;
                    ws.Cells[linha, 3].Value = d.Cliente;
                    ws.Cells[linha, 4].Value = d.Area;
                    ws.Cells[linha, 5].Value = d.Projeto;
                    ws.Cells[linha, 6].Value = d.HorasTimeSpan;

                    linha++;
                }
                catch (Exception err)
                {
                    LogServices.LogarException(err);
                }
            }
        }
예제 #7
0
        public async Task <ActionResult> Delete(int id)
        {
            MensagemParaUsuarioViewModel result = new MensagemParaUsuarioViewModel();
            ProjectNode prj = await db.ProjectNodes.FindAsync(id);

            if (prj != null)
            {
                try
                {
                    if (prj.Filhos != null && prj.Filhos.Count > 0)
                    {
                        result.Sucesso  = false;
                        result.Mensagem = "Não se pode excluir um nó de projeto com dependentes. Exclua os itens primeiro.";
                        result.Titulo   = "Erro ao excluir nó de projeto";
                    }
                    else if (prj.Atividades != null && prj.Atividades.Count > 0)
                    {
                        result.Sucesso  = false;
                        result.Mensagem = "Este nó de projeto não pode ser excluído porque tem atividades lançadas para ele.";
                        result.Titulo   = "Erro ao excluir nó de projeto";
                    }
                    else
                    {
                        prj.UsuariosDesteNode.Clear();
                        db.ProjectNodes.Remove(prj);
                        await db.SaveChangesAsync();

                        result.Sucesso  = true;
                        result.Mensagem = "Item excluído com sucesso.";
                        result.Titulo   = "exclusão de item do projeto";
                    }
                }
                catch (Exception err)
                {
                    LogServices.LogarException(err);
                    result.Sucesso  = false;
                    result.Mensagem = err.Message;
                    if (err.InnerException != null)
                    {
                        result.Mensagem += "\r\n" + err.InnerException.Message;
                        if (err.InnerException.InnerException != null)
                        {
                            result.Mensagem += "\r\n" + err.InnerException.InnerException.Message;
                        }
                    }
                    result.Titulo = "Erro ao excluir nó de projeto";
                }
            }
            else
            {
                result.Sucesso  = false;
                result.Mensagem = "Não foi selecionado nenhum nó de projeto para exclusão.";
                result.Titulo   = "Erro ao excluir nó de projeto";
            }

            return(Json(result));
        }
예제 #8
0
 /// <summary>
 /// intercepta todos os eventos de salvar assíncronos.
 /// validações genéricas devem ser todos aqui
 /// logs genéricos devem ser todos aqui
 /// restrições de segurança genéricos (baseados em database)  devem ser todos aqui
 /// </summary>
 /// <returns></returns>
 public override async Task <int> SaveChangesAsync()
 {
     try
     {
         AddTimestamps();
         return(await base.SaveChangesAsync());
     }
     catch (Exception err)
     {
         LogServices.LogarException(err);
         throw;
     }
 }
예제 #9
0
        /// <summary>
        /// não deveria ser usado esse método caso você esteja tentando usar custom errors ou http errors, porque sempre vai cair aqui
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Application_Error(object sender, EventArgs e)
        {
            Exception err = Server.GetLastError();

            if (err != null)
            {
                LogServices.LogarException(err);
                if ((HttpContext.Current != null) && (HttpContext.Current.Session != null))
                {
                    HttpContext.Current.Session.Add("UltimoErro", err);
                }
            }
        }
예제 #10
0
 /// <summary>
 /// intercepta todos os eventos de salvar.
 /// validações genéricas devem ser todos aqui
 /// logs genéricos devem ser todos aqui
 /// restrições de segurança genéricos (baseados em database)  devem ser todos aqui
 /// </summary>
 /// <returns></returns>
 public override int SaveChanges()
 {
     try
     {
         AddTimestamps();
         return(base.SaveChanges());
     }
     catch (Exception err)
     {
         LogServices.LogarException(err);
         throw;
     }
 }
예제 #11
0
        /// <summary>
        /// Evia o alerta de lançamento em atraso para todos os usuários
        /// </summary>
        /// <param name="email">boolean - se vai receber por e-mail ou não</param>
        /// <param name="sms">boolean - se vai receber por sms ou não</param>
        /// <param name="telegram">boolean - se vai receber por telegram ou não</param>
        /// <returns></returns>
        public virtual void EnviarTodosOsAlertas(bool email = true, bool sms = false)
        {
            var modelo = this.GetUsuariosComAtrasoNoEnvio();

            if ((modelo == null) || (modelo.Count == 0))
            {
                throw new Exception("O usuário não foi encontrado");
            }


            bool   erro      = false;
            string mensagens = "";

            foreach (var x in modelo)
            {
                try
                {
                    if (email)
                    {
                        MailServices.Enviar(x.Usuario.EmailPreferencial, "Faz tempo que você não lança suas atividades", string.Format("Detectamos que faz {0} dias que você não lança suas atividades. Por favor lance hoje.", x.DiasUteisSemLancar));
                    }
                }
                catch (Exception err)
                {
                    erro       = true;
                    mensagens += "Ocorreu um erro ao enviar o alerta via e-mail para " + x.Usuario.Login + ": " + err.Message + "<br/>\r\n";
                    LogServices.LogarException(err);
                }

                string smsResult = "";
                try
                {
                    if (sms && x.Usuario.Funcionario != null && !string.IsNullOrWhiteSpace(x.Usuario.Funcionario.Celular))
                    {
                        smsResult = SMSServices.Enviar(x.Usuario.Funcionario.Celular, x.Usuario.FuncionarioNomeOuLogin, "Faz tempo que você não lança suas atividades", string.Format("Detectamos que faz {0} dias que você não lança suas atividades. Por favor lance hoje.", x.DiasUteisSemLancar));
                        LogServices.Logar(smsResult);
                    }
                }
                catch (Exception err)
                {
                    erro       = true;
                    mensagens += "Ocorreu um erro ao enviar o alerta via sms para " + x.Usuario.Login + ": " + err.Message + "<br/>\r\n";
                    LogServices.LogarException(err);
                }
            }

            if (erro)
            {
                throw new Exception("Erros ocorridos: " + mensagens);
            }
        }
예제 #12
0
 /// <summary>
 /// método estático independente com context próprio para ser executado em jobs
 /// </summary>
 public static void AtualizaAcoesCopiandoDoAssembly()
 {
     try
     {
         Type tipo = Type.GetType("TPA.Presentation.Controllers.TPAController, TPA.Presentation");
         using (TPAContext db = new TPAContext())
         {
             AcaoServices g = new AcaoServices(db);
             g.ImportarDoAssembly(tipo);
             g.AtualizaAdmin();
         }
     }
     catch (Exception err)
     {
         LogServices.LogarException(err);
     }
 }
예제 #13
0
        public async Task <JsonResult> AdicionarRecursos(NodeUsuariosViewModel nuvm)
        {
            UsuarioApplication usuApp = new UsuarioApplication(this.db);

            try
            {
                await usuApp.RemoverUsuariosForaDaLista(nuvm.IdNode, nuvm.IdsUsuarios, nuvm.AdicionarRecursivo);

                if (nuvm.IdsUsuarios != null && nuvm.IdsUsuarios.Count > 0)
                {
                    foreach (int usu in nuvm.IdsUsuarios)
                    {
                        await usuApp.AdicionarNodeAsync(new UsuarioNodeViewModel
                        {
                            AdicionarRecursivo = nuvm.AdicionarRecursivo,
                            IdNode             = nuvm.IdNode,
                            IdUsuario          = usu
                        });
                    }

                    return(Json(new
                    {
                        Sucesso = true,
                        Mensagem = "Recursos adicionados com sucesso."
                    }));
                }
                else
                {
                    return(Json(new
                    {
                        Sucesso = true,
                        Mensagem = "Recursos removidos com sucesso."
                    }));
                }
            }
            catch (Exception err)
            {
                LogServices.LogarException(err);
                return(Json(new
                {
                    Sucesso = false,
                    Mensagem = err.Message
                }));
            }
        }
예제 #14
0
        /// <summary>
        /// Evia o alerta de lançamento em atraso para um usuário
        /// </summary>
        /// <param name="idUsuario">id do usuário que vai receber o alerta</param>
        /// <param name="email">boolean - se vai receber por e-mail ou não</param>
        /// <param name="sms">boolean - se vai receber por sms ou não</param>
        /// <param name="telegram">boolean - se vai receber por telegram ou não</param>
        /// <returns></returns>
        public virtual void EnviarAlerta(int idUsuario, bool email = true, bool sms = false)
        {
            string smsResult = "";

            if (idUsuario == 0)
            {
                throw new Exception("O usuário não foi informado");
            }

            var modelo = this.GetUltimosLancamentosById(idUsuario);

            if (modelo == null)
            {
                throw new Exception("O usuário não foi encontrado");
            }


            try
            {
                if (email)
                {
                    MailServices.Enviar(modelo.Usuario.EmailPreferencial, "Faz tempo que você não lança suas atividades", string.Format("Detectamos que faz {0} dias que você não lança suas atividades. Por favor lance hoje.", modelo.DiasUteisSemLancar));
                }
            }
            catch (Exception err)
            {
                LogServices.LogarException(err);
                throw new Exception("Erro ao enviar email: " + err.Message, err);
            }


            try
            {
                if (sms && modelo.Usuario.Funcionario != null && !string.IsNullOrWhiteSpace(modelo.Usuario.Funcionario.Celular))
                {
                    smsResult = SMSServices.Enviar(modelo.Usuario.Funcionario.Celular, modelo.Usuario.FuncionarioNomeOuLogin, "Faz tempo que você não lança suas atividades", string.Format("Detectamos que faz {0} dias que você não lança suas atividades. Por favor lance hoje.", modelo.DiasUteisSemLancar));
                    LogServices.Logar(smsResult);
                }
            }
            catch (Exception err)
            {
                LogServices.LogarException(err);
                throw new Exception("Erro ao enviar sms: " + err.Message, err);
            }
        }
예제 #15
0
 /// <summary>
 /// dispara alertas de atraso nas atividades diariamente
 /// </summary>
 public static void EnviaAlertasAgendados()
 {
     try
     {
         if (!DevServices.IsDevEnv())
         {
             using (var db = new TPAContext())
             {
                 UsuarioApplication usuApp = new UsuarioApplication(db);
                 usuApp.EnviarTodosOsAlertas(true, true);
             }
         }
     }
     catch (Exception err)
     {
         LogServices.LogarException(err);
     }
 }
예제 #16
0
        public ActionResult Index(FormCollection formCollection)
        {
            CarregaTipos();
            CarregaProjetos();
            CarregaUsuarios();

            if (Request != null)
            {
                HttpPostedFileBase file = Request.Files["UploadedFile"];
                if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName) && (Path.GetExtension(file.FileName).ToUpper() == ".XLSX"))
                {
                    string fileName        = file.FileName;
                    string fileContentType = file.ContentType;


                    using (var package = new ExcelPackage(file.InputStream))
                    {
                        try
                        {
                            ImportaPlanilhaApplication app = new ImportaPlanilhaApplication(this.db);
                            var planilha = app.TransformarPlanilhaAdmin(package);
                            return(View("LancaPlanilha", planilha));
                        }
                        catch (Exception err)
                        {
                            MensagemParaUsuarioViewModel.MensagemErro(err.ToString(), TempData, ModelState);
                            LogServices.LogarException(err);
                        }
                    }
                }
                else
                {
                    MensagemParaUsuarioViewModel.MensagemErro("Faça o upload de uma planilha de horários em excel .xlsx no padrão da Tecnun.", TempData, ModelState);
                }
            }
            else
            {
                MensagemParaUsuarioViewModel.MensagemErro("Ocorreu algum erro e o request está nulo", TempData, ModelState);
            }



            return(View("Index"));
        }
예제 #17
0
        /// <summary>
        /// copia para a ExcelWorksheet os dados de GetRelatorio_Horas_Projeto
        /// </summary>
        /// <param name="dtIni">DateTime - data inicial</param>
        /// <param name="dtFin">DateTime - data final</param>
        /// <param name="ws">ExcelWorksheet - worksheet do pacote epplus para onde vão os dados</param>
        private void ConstroiRelatorio_Horas_Projeto(DateTime dtIni, DateTime dtFin, ExcelWorksheet ws)
        {
            var dados = this.GetRelatorio_Horas_Projeto(dtIni, dtFin);

            int linha = 6;

            ws.Column(2).Style.Numberformat.Format = "[hh]:mm";

            foreach (var d in dados)
            {
                try
                {
                    ws.Cells[linha, 1].Value = d.Projeto;
                    ws.Cells[linha, 2].Value = d.Horas;

                    linha++;
                }
                catch (Exception err)
                {
                    LogServices.LogarException(err);
                }
            }
        }
예제 #18
0
        public async Task <JsonResult> Mover(int id, int idNovoPai, int posicao)
        {
            if ((id == 0) || (id == idNovoPai))
            {
                return(Json(new
                {
                    Sucesso = false,
                    Mensagem = "O objeto não pode ser movido."
                }));
            }

            try
            {
                var node = await db.ProjectNodes.FindAsync(id);

                var novoPai = await db.ProjectNodes.FindAsync(idNovoPai);

                node.Pai = novoPai;

                await db.SaveChangesAsync();

                return(Json(new
                {
                    Sucesso = true,
                    Mensagem = "Movido com sucesso."
                }));
            }
            catch (Exception err)
            {
                LogServices.LogarException(err);
                return(Json(new
                {
                    Sucesso = false,
                    Mensagem = err.Message
                }));
            }
        }
예제 #19
0
        public ActionResult Index(FormCollection formCollection)
        {
            CarregaTipos();
            CarregaProjetos();
            CarregaUsuarios();


            if (Request != null)
            {
                if (formCollection["IdUsuario"] != null)
                {
                    int IdUsuario = TFWConvert.ToInteger(formCollection["IdUsuario"]);
                    if (IdUsuario > 0)
                    {
                        HttpPostedFileBase file = Request.Files["UploadedFile"];
                        if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName) && (Path.GetExtension(file.FileName).ToUpper() == ".XLSX"))
                        {
                            string fileName        = file.FileName;
                            string fileContentType = file.ContentType;

                            //byte[] fileBytes = new byte[file.ContentLength];
                            //var data = file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength));

                            using (var package = new ExcelPackage(file.InputStream))
                            {
                                try
                                {
                                    ImportaPlanilhaApplication app = new ImportaPlanilhaApplication(this.db);
                                    var planilha = app.TransformarPlanilhaUsuario(IdUsuario, package);
                                    return(View("LancaPlanilha", planilha));
                                }
                                catch (Exception err)
                                {
                                    MensagemParaUsuarioViewModel.MensagemErro(err.Message, TempData, ModelState);
                                    LogServices.LogarException(err);
                                }
                            }
                        }
                        else
                        {
                            MensagemParaUsuarioViewModel.MensagemErro("Faça o upload de uma planilha de horários em excel .xlsx no padrão da Tecnun.", TempData, ModelState);
                        }
                    }
                    else
                    {
                        MensagemParaUsuarioViewModel.MensagemErro("Selecione um usuário válido", TempData, ModelState);
                    }
                }
                else
                {
                    MensagemParaUsuarioViewModel.MensagemErro("Não foi encontrado o Id do Usuário", TempData, ModelState);
                }
            }
            else
            {
                MensagemParaUsuarioViewModel.MensagemErro("Ocorreu algum erro e o request está nulo", TempData, ModelState);
            }



            return(View("Index"));
        }
예제 #20
0
        /// <summary>
        /// posta os dados retirados da planilha e trabalhados no ImportacaoPlanilhaAtividadesViewModel
        /// </summary>
        /// <param name="planilha">ImportacaoPlanilhaAtividadesViewModel - viewmodel com os dados estruturados e editados para inserção no banco de dados</param>
        /// <returns>int - quantidade de atividades importadas</returns>
        public virtual async Task <int> LancarAsync(ImportacaoPlanilhaAtividadesViewModel planilha)
        {
            int result = 0;

            CalendarioServices cal = new CalendarioServices();

            AtividadeApplication app = new AtividadeApplication(this._db);

            foreach (var i in planilha.Itens)
            {
                try
                {
                    if ((i.Data != null) && (i.Data != DateTime.MinValue) && (cal.IsDiaUtil(i.Data)))
                    {
                        var projeto = await this._db.ProjectNodes.FindAsync(i.IdProjeto);

                        var tipo = await this._db.TiposAtividade.FindAsync(i.IdTipoAtividade);


                        if (planilha is ImportacaoPlanilhaAtividadesUsuarioViewModel)
                        {
                            i.IdUsuario = (planilha as ImportacaoPlanilhaAtividadesUsuarioViewModel).IdUsuario;
                        }

                        Usuario usuario = await this._db.Usuarios.FindAsync(i.IdUsuario);

                        if (usuario == null)
                        {
                            throw new Exception("Usuário da planilha não preenchido");
                        }

                        if (i.EntradaManha != null && i.SaidaManha != null && i.EntradaTarde != null && i.SaidaTarde != null)
                        {
                            if (i.EntradaManha > i.SaidaManha)
                            {
                                throw new Exception("A entrada do primeiro horário não pode ser maior que a saída do primeiro horário");
                            }

                            if (i.EntradaTarde > i.SaidaTarde)
                            {
                                throw new Exception("A entrada do segundo horário não pode ser maior que a saída do segundo horário");
                            }

                            if (i.EntradaManha > i.SaidaTarde)
                            {
                                throw new Exception("A entrada do primeiro horário não pode ser maior que a saída do segundo horário");
                            }

                            if (i.SaidaManha > i.EntradaTarde)
                            {
                                throw new Exception("A saída do primeiro horário não pode ser maior que a entrada do segundo horário");
                            }
                        }

                        if ((i.EntradaManha != null) && (i.SaidaManha != null) && (i.SaidaManha > i.EntradaManha))
                        {
                            await app.SalvarAsync(new Atividade
                            {
                                Observacao    = i.Descricao,
                                Inicio        = i.Data.AddHours(i.EntradaManha.Value.Hours).AddMinutes(i.EntradaManha.Value.Minutes),
                                Fim           = i.Data.AddHours(i.SaidaManha.Value.Hours).AddMinutes(i.SaidaManha.Value.Minutes),
                                ProjectNode   = projeto,
                                TipoAtividade = tipo,
                                Usuario       = usuario
                            }, false);
                        }

                        if ((i.EntradaTarde != null) && (i.SaidaTarde != null) && (i.SaidaTarde > i.EntradaTarde))
                        {
                            await app.SalvarAsync(new Atividade
                            {
                                Observacao    = i.Descricao,
                                Inicio        = i.Data.AddHours(i.EntradaTarde.Value.Hours).AddMinutes(i.EntradaTarde.Value.Minutes),
                                Fim           = i.Data.AddHours(i.SaidaTarde.Value.Hours).AddMinutes(i.SaidaTarde.Value.Minutes),
                                ProjectNode   = projeto,
                                TipoAtividade = tipo,
                                Usuario       = usuario
                            }, false);
                        }
                    }
                }
                catch (DbEntityValidationException ex)
                {
                    string exceptionMessage = LogServices.ConcatenaErrosDbEntityValidation(ex);
                    throw new Exception("Problemas com a validação das entities: " + exceptionMessage, ex);
                }
                catch (Exception err)
                {
                    LogServices.LogarException(err);
                    throw new Exception("Erro: " + err.Message, err);
                }
                finally
                {
                    result++;
                }
            }

            return(result);
        }