Ejemplo n.º 1
0
        public IList<Katapoka.DAO.Atividade.AtividadeAjaxPost> SalvarAtividades(int idProjeto, List<Katapoka.DAO.Atividade.AtividadeAjaxPost> atividades, int idUsuarioAlteracao)
        {
            Katapoka.DAO.Projeto_Tb projetoTb = GetById(idProjeto);

            Dictionary<int, Katapoka.DAO.Tag_Tb> tagsUtilizadas = new Dictionary<int, DAO.Tag_Tb>();
            Dictionary<int, Katapoka.DAO.Atividade_Tb> atividadesRelacionadas = new Dictionary<int, DAO.Atividade_Tb>();
            Dictionary<int, Katapoka.DAO.Usuario_Tb> usuariosUtilizados = new Dictionary<int, DAO.Usuario_Tb>();

            Katapoka.BLL.Atividade.AtividadeBLL atividadeBLL = CriarObjetoNoMesmoContexto<Katapoka.BLL.Atividade.AtividadeBLL>();
            Katapoka.BLL.Tag.TagBLL tagBLL = CriarObjetoNoMesmoContexto<Katapoka.BLL.Tag.TagBLL>();
            Katapoka.BLL.Tag.AtividadeTagBLL atividadeTagBLL = CriarObjetoNoMesmoContexto<Katapoka.BLL.Tag.AtividadeTagBLL>();
            Katapoka.BLL.Usuario.UsuarioBLL usuarioBLL = CriarObjetoNoMesmoContexto<Usuario.UsuarioBLL>();
            Katapoka.BLL.Atividade.AtividadeUsuarioBLL atividadeUsuarioBLL = CriarObjetoNoMesmoContexto<Atividade.AtividadeUsuarioBLL>();
            foreach (Katapoka.DAO.Atividade.AtividadeAjaxPost atividade in atividades)
            {
                #region Adiciona as atividades na "tabela de relacionamento de atividades"
                Katapoka.DAO.Atividade_Tb atividadeTb = null;
                if (atividade.IdAtividade == null)
                {
                    atividadeTb = new DAO.Atividade_Tb();
                    atividadeTb.DtCriacao = DateTime.Now;
                    atividadeTb.IdUsuarioCriacao = idUsuarioAlteracao;
                    atividadeTb.FlStatus = "A"; //Recém criada, recebe status de ativa!
                    projetoTb.Atividade_Tb.Add(atividadeTb);
                    atividadeTb.Projeto_Tb = projetoTb;
                }
                else
                {
                    atividadeTb = atividadeBLL.GetById(atividade.IdAtividade.Value);
                }
                atividadesRelacionadas.Add(atividade.IdAtividadeLocal, atividadeTb);
                #endregion
                #region Adiciona as tags na "tabela de relacionamento"
                if (atividade.Tags.Count > 0)
                {
                    foreach (Katapoka.DAO.Tag.TagCompleta tag in atividade.Tags)
                    {
                        Katapoka.DAO.Tag_Tb tagTb = null;
                        if (!tagsUtilizadas.ContainsKey(tag.IdTag.Value))
                        {
                            if (tag.IdTag.Value < 1)
                            {
                                tagTb = new DAO.Tag_Tb();
                                tagTb.DsTag = tag.DsTag;
                                Katapoka.DAO.AtividadeTag_Tb atividadeTagTb = new DAO.AtividadeTag_Tb();
                                atividadeTagTb.Tag_Tb = tagTb;
                                atividadeTagTb.Atividade_Tb = atividadeTb;
                                atividadeTb.AtividadeTag_Tb.Add(atividadeTagTb);
                                tagTb.AtividadeTag_Tb.Add(atividadeTagTb);
                            }
                            else
                            {
                                tagTb = tagBLL.GetById(tag.IdTag.Value);
                            }
                            tagsUtilizadas.Add(tag.IdTag.Value, tagTb);
                        }

                    }
                }
                #endregion
                #region Adiciona os usuários utilizados
                foreach (Katapoka.DAO.UsuarioCompleto usuarioCompleto in atividade.Usuarios)
                {
                    if (!usuariosUtilizados.ContainsKey(usuarioCompleto.IdUsuario))
                    {
                        usuariosUtilizados.Add(usuarioCompleto.IdUsuario, usuarioBLL.GetById(usuarioCompleto.IdUsuario));
                    }
                }
                #endregion
            }

            //Processamento geral
            foreach (Katapoka.DAO.Atividade.AtividadeAjaxPost atividade in atividades)
            {
                //Preencho os dados
                if(!string.IsNullOrWhiteSpace(atividade.DsNomeAtividade))
                    atividadesRelacionadas[atividade.IdAtividadeLocal].DsTituloAtividade = atividade.DsNomeAtividade;
                else
                    atividadesRelacionadas[atividade.IdAtividadeLocal].DsTituloAtividade = "Atividade sem título";
                atividadesRelacionadas[atividade.IdAtividadeLocal].DsAtividade = atividade.DsAtividade;
                atividadesRelacionadas[atividade.IdAtividadeLocal].DtInicio = !string.IsNullOrWhiteSpace(atividade.DtInicioStr) ? Convert.ToDateTime(atividade.DtInicioStr) : (DateTime?)null;
                atividadesRelacionadas[atividade.IdAtividadeLocal].DtTermino = !string.IsNullOrWhiteSpace(atividade.DtTerminoStr) ? Convert.ToDateTime(atividade.DtTerminoStr) : (DateTime?)null;
                atividadesRelacionadas[atividade.IdAtividadeLocal].QtTempoEstimado = !string.IsNullOrWhiteSpace(atividade.QtTempoEstimado) ? Katapoka.BLL.Utilitarios.Utilitario.ConvertTimeStringToDecimal(atividade.QtTempoEstimado) : (decimal?)null;
                atividadesRelacionadas[atividade.IdAtividadeLocal].VrCompletoPorcentagem = atividade.VrCompletoPorcentagem;
                //Tempo executado não está aqui pois não pode editado manualmente

                #region Relaciono as atividades com Pre e pos
                if (atividade.IdAtividadePredecessora != null)
                {
                    Katapoka.DAO.Atividade_Tb atividadePre, atividadeTb;
                    atividadeTb = atividadesRelacionadas[atividade.IdAtividadeLocal];
                    atividadePre = atividadesRelacionadas[atividade.IdAtividadePredecessora.Value];
                    atividadeTb.AtividadePredecessora_Tb = atividadePre;
                    atividadePre.AtividadesSucessoras_Tb.Add(atividadeTb);
                }
                else
                {
                    Katapoka.DAO.Atividade_Tb atividadeTb;
                    atividadeTb = atividadesRelacionadas[atividade.IdAtividadeLocal].AtividadePredecessora_Tb = null;
                }
                #endregion

                //Removo as tags que não fazem mais parte da atividade DAS ATIVIDADES PARA EDIÇÃO (IdAtividade != null)
                if (atividade.IdAtividade != null)
                {
                    int[] idsTagsAtividade = atividade.Tags.Where(p => p.IdTag != null && p.IdTag.Value > 0)
                        .Select(p => p.IdTag.Value)
                        .ToArray();
                    IList<Katapoka.DAO.AtividadeTag_Tb> tagsARemover =
                        this.Context.AtividadeTag_Tb
                            .Where(p => p.IdAtividade == atividade.IdAtividade.Value && !idsTagsAtividade.Contains(p.IdTag))
                            .ToList();
                    atividadeTagBLL.DeleteRange(tagsARemover);
                }

                //Gerenciamento dos usuários da atividade
                //Se a atividade é nova, adiciona todos os usuários, caso contrário, valida quem entra, quem fica e quem saí.
                if (atividade.IdAtividade == null)
                {
                    //Adiciona usuários
                    foreach (Katapoka.DAO.UsuarioCompleto usuarioCompleto in atividade.Usuarios)
                    {
                        Katapoka.DAO.AtividadeUsuario_Tb atividadeUsuarioTb = new DAO.AtividadeUsuario_Tb();
                        atividadeUsuarioTb.DtCriacao = DateTime.Now;
                        atividadeUsuarioTb.IdUsuarioCriacao = idUsuarioAlteracao;
                        atividadeUsuarioTb.Atividade_Tb = atividadesRelacionadas[atividade.IdAtividadeLocal];
                        atividadeUsuarioTb.Usuario_Tb = usuariosUtilizados[usuarioCompleto.IdUsuario];
                        usuariosUtilizados[usuarioCompleto.IdUsuario].AtividadeUsuario_Tb.Add(atividadeUsuarioTb);
                        atividadesRelacionadas[atividade.IdAtividadeLocal].AtividadeUsuario_Tb.Add(atividadeUsuarioTb);
                    }

                    //Adiciona tags
                    foreach (Katapoka.DAO.Tag.TagCompleta tag in atividade.Tags)
                    {
                        Katapoka.DAO.AtividadeTag_Tb atividadeTag = new DAO.AtividadeTag_Tb();
                        Katapoka.DAO.Atividade_Tb atividadeTb = atividadesRelacionadas[atividade.IdAtividadeLocal];
                        Katapoka.DAO.Tag_Tb tagTb = tagsUtilizadas[tag.IdTag.Value];

                        atividadeTag.Tag_Tb = tagTb;
                        atividadeTag.Atividade_Tb = atividadeTb;
                        tagTb.AtividadeTag_Tb.Add(atividadeTag);
                        atividadeTb.AtividadeTag_Tb.Add(atividadeTag);
                    }
                }
                else
                {
                    #region Trata usuários
                    int[] idsEnviadas = atividade.Usuarios.Select(p => p.IdUsuario).ToArray();
                    int[] idsUsuariosJaAssociados = atividadesRelacionadas[atividade.IdAtividadeLocal].AtividadeUsuario_Tb
                        .Select(p => p.IdUsuario).ToArray();
                    //Insere novos
                    foreach (int idUsuarioInserir in idsEnviadas.Where(p => !idsUsuariosJaAssociados.Contains(p)).ToArray())
                    {
                        Katapoka.DAO.Usuario_Tb usuarioTb = usuariosUtilizados[idUsuarioInserir];
                        Katapoka.DAO.Atividade_Tb atividadeTb = atividadesRelacionadas[atividade.IdAtividadeLocal];
                        Katapoka.DAO.AtividadeUsuario_Tb atividadeUsuarioTb = new DAO.AtividadeUsuario_Tb();
                        atividadeUsuarioTb.DtCriacao = DateTime.Now;
                        atividadeUsuarioTb.IdUsuarioCriacao = idUsuarioAlteracao;
                        atividadeUsuarioTb.Usuario_Tb = usuarioTb;
                        atividadeUsuarioTb.Atividade_Tb = atividadeTb;
                        atividadeTb.AtividadeUsuario_Tb.Add(atividadeUsuarioTb);
                        usuarioTb.AtividadeUsuario_Tb.Add(atividadeUsuarioTb);
                    }

                    //Remove não associados
                    IList<Katapoka.DAO.AtividadeUsuario_Tb> usuariosRemover = this.Context.AtividadeUsuario_Tb
                        .Where(p => p.IdAtividade == atividade.IdAtividade.Value && !idsEnviadas.Contains(p.IdUsuario))
                        .ToList();
                    atividadeUsuarioBLL.DeleteRange(usuariosRemover);
                    #endregion
                    #region Trata tags
                    int[] idsTagsEnviadas = atividade.Tags.Where(p => p.IdTag != null && p.IdTag.Value > 0)
                        .Select(p => p.IdTag.Value)
                        .ToArray();
                    int[] idsTagsEmUso = atividadesRelacionadas[atividade.IdAtividadeLocal].AtividadeTag_Tb
                        .Select(p => p.IdTag).ToArray();
                    //Insere as novas
                    foreach (int idTagInserir in idsTagsEnviadas.Where(p => !idsTagsEmUso.Contains(p)).ToArray())
                    {
                        Katapoka.DAO.AtividadeTag_Tb atividadeTagTb = new DAO.AtividadeTag_Tb();
                        atividadeTagTb.Tag_Tb = tagsUtilizadas[idTagInserir];
                        atividadeTagTb.Atividade_Tb = atividadesRelacionadas[atividade.IdAtividadeLocal];
                        atividadesRelacionadas[atividade.IdAtividadeLocal].AtividadeTag_Tb.Add(atividadeTagTb);
                        tagsUtilizadas[idTagInserir].AtividadeTag_Tb.Add(atividadeTagTb);
                    }

                    //Deleta as que não existe mais
                    IList<Katapoka.DAO.AtividadeTag_Tb> atividadesARemover = this.Context.AtividadeTag_Tb
                        .Where(p => p.IdAtividade == atividade.IdAtividade.Value && !idsTagsEnviadas.Contains(p.IdTag))
                        .ToList();
                    atividadeTagBLL.DeleteRange(atividadesARemover);

                    //Katapoka.DAO.AtividadeTag_Tb atividadeTagTb = new DAO.AtividadeTag_Tb();
                    //atividadeTagTb.Tag_Tb = tagTb;
                    //atividadeTagTb.Atividade_Tb = atividadeTb;
                    //atividadeTb.AtividadeTag_Tb.Add(atividadeTagTb);
                    //tagTb.AtividadeTag_Tb.Add(atividadeTagTb);
                    #endregion
                }

            }


            //Removo as atividades que não mais fazem parte do projeto
            int[] idsAtividadesProjeto = atividades.Where(p => p.IdAtividade != null)
                .Select(p => p.IdAtividade.Value).ToArray(); //Ids que AINDA FAZEM PARTE do projeto
            IList<Katapoka.DAO.Atividade_Tb> atividadesRemover =
                this.Context.Atividade_Tb.Where(p => p.IdProjeto == idProjeto && !idsAtividadesProjeto.Contains(p.IdAtividade))
                .ToList();
            //atividadeBLL.DeleteRange(atividadesRemover);
            foreach (Katapoka.DAO.Atividade_Tb atividadeRemover in atividadesRemover)
            {
                atividadeRemover.FlStatus = "L";
                atividadeRemover.IdAtividadePredecessora = null; //Se a atividade foi removida eu removo o vínculo dela com qualquer outra para evitar que de problemas futuros de integridade
                //atividadeRemover.AtividadePredecessora_Tb = null;
            }

            //Reza pra não dar pau e tenta salvar tudo
            Save(projetoTb);

            //Atualiza as IDS de atividade e atualiza as IDS de tags e retorna
            for (int i = 0; i < atividades.Count; i++)
            {
                Katapoka.DAO.Atividade_Tb atividadeTb = atividadesRelacionadas[atividades[i].IdAtividadeLocal];
                atividades[i].IdAtividade = atividadeTb.IdAtividade;
                atividades[i].DsNomeAtividade = atividadeTb.DsTituloAtividade;
                TimeSpan tempoExecutado = TimeSpan.FromHours((double)atividadeTb.QtTempoExecutado);
                atividades[i].QtTempoExecutado = string.Format("{0:000}:{1:00}", Math.Floor(tempoExecutado.TotalHours), tempoExecutado.Minutes);

                //Re-gero as tags utilizadas
                //atividades[i].Tags = atividadeTb.AtividadeTag_Tb
                //    .Select(p => new Katapoka.DAO.Tag.TagCompleta()
                //    {
                //        DsTag = p.Tag_Tb.DsTag,
                //        IdTag = p.IdTag
                //    }).ToList();
                //
                ////Re-gero os usuários
                //atividades[i].Usuarios = atividadeTb.AtividadeUsuario_Tb.Select(p => new Katapoka.DAO.UsuarioCompleto()
                //{
                //    DsNome = p.Usuario_Tb.DsNome,
                //    IdUsuario = p.IdUsuario
                //}).ToList();
            }
            return atividades;
        }
Ejemplo n.º 2
0
        public void Salvar(int idProjeto, Katapoka.DAO.Atividade.AtividadeCompleta[] atividades, int idUsuarioCriacao)
        {
            using (TransactionScope scopeTran = new TransactionScope())
            {
                //Monta o mapa para relacionamentos!
                Dictionary <int, Katapoka.DAO.Atividade_Tb> relacoes = new Dictionary <int, DAO.Atividade_Tb>();
                foreach (Katapoka.DAO.Atividade.AtividadeCompleta atividade in atividades)
                {
                    if (atividade.IdAtividade == null)
                    {
                        relacoes[atividade.IdAtividadeLocal] = new DAO.Atividade_Tb();
                    }
                    else
                    {
                        relacoes[atividade.IdAtividadeLocal] = GetById(atividade.IdAtividade.Value);
                    }
                }

                //Cria os relacionamentos (ou atualiza) e remove (ou adiciona) os usuários da task
                Atividade.AtividadeUsuarioBLL atividadeUsuarioBLL = CriarObjetoNoMesmoContexto <Atividade.AtividadeUsuarioBLL>();
                foreach (Katapoka.DAO.Atividade.AtividadeCompleta atividade in atividades)
                {
                    relacoes[atividade.IdAtividadeLocal].DsAtividade       = string.Empty;
                    relacoes[atividade.IdAtividadeLocal].DsTituloAtividade = atividade.DsNomeAtividade;
                    relacoes[atividade.IdAtividadeLocal].DtCriacao         = DateTime.Now;
                    relacoes[atividade.IdAtividadeLocal].DtInicio          = DateTime.Now;
                    relacoes[atividade.IdAtividadeLocal].DtTermino         = DateTime.Now.Add(TimeSpan.FromHours((double)atividade.QtHoras));
                    relacoes[atividade.IdAtividadeLocal].IdProjeto         = idProjeto;
                    relacoes[atividade.IdAtividadeLocal].IdUsuarioCriacao  = idUsuarioCriacao;

                    // TODO: Converter o TipoAtividade para Decimal tbm
                    relacoes[atividade.IdAtividadeLocal].QtTempoEstimado       = atividade.QtHoras;
                    relacoes[atividade.IdAtividadeLocal].QtTempoExecutado      = new Decimal(0);
                    relacoes[atividade.IdAtividadeLocal].VrCompletoPorcentagem = 0;

                    //Save(relacoes[atividade.IdAtividadeLocal]);
                    //Insere os novos usuários da atividade (Selecione apenas os que já não estão na lista
                    foreach (int idUsuario in atividade.IdUsuariosResponsaveis
                             .Where(p => !relacoes[atividade.IdAtividadeLocal].AtividadeUsuario_Tb
                                    .Select(p2 => p2.IdUsuario).Contains(p)))
                    {
                        Katapoka.DAO.AtividadeUsuario_Tb atividadeUsuarioTb = new DAO.AtividadeUsuario_Tb();
                        atividadeUsuarioTb.DtCriacao        = DateTime.Now;
                        atividadeUsuarioTb.IdUsuario        = idUsuario;
                        atividadeUsuarioTb.IdUsuarioCriacao = idUsuarioCriacao;
                        relacoes[atividade.IdAtividadeLocal].AtividadeUsuario_Tb.Add(atividadeUsuarioTb);
                    }
                }

                foreach (Katapoka.DAO.Atividade.AtividadeCompleta atividade in atividades)
                {
                    if (atividade.IdPreAtividade != null)
                    {
                        relacoes[atividade.IdAtividadeLocal].AtividadePredecessora_Tb = relacoes[atividade.IdPreAtividade.Value];
                    }
                    Save(relacoes[atividade.IdAtividadeLocal]);
                }

                this.Context.SaveChanges();
                scopeTran.Complete();
            }
        }