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; }
public void Save(int?idAtividade, int idProjeto, int?idAtividadePredecessora, string tituloAtividade, Decimal tempoEstimado, int porcentagemCompleta, DateTime dtInicio, DateTime dtTermino, string descricao, int idUsuario, Katapoka.DAO.Tag.TagCompleta[] tags) { Katapoka.DAO.Atividade_Tb atividadeTb = null; if (idAtividade == null) { atividadeTb = new DAO.Atividade_Tb(); atividadeTb.IdUsuarioCriacao = idUsuario; atividadeTb.DtCriacao = DateTime.Now; } else { atividadeTb = GetById(idAtividade.Value); } if (atividadeTb == null) { throw new Exception("Atividade não pode ser criada."); } atividadeTb.IdProjeto = idProjeto; atividadeTb.IdAtividadePredecessora = idAtividadePredecessora; atividadeTb.DsTituloAtividade = tituloAtividade; atividadeTb.QtTempoEstimado = tempoEstimado; atividadeTb.VrCompletoPorcentagem = porcentagemCompleta; atividadeTb.DtInicio = dtInicio; atividadeTb.DtTermino = dtTermino; atividadeTb.DsAtividade = descricao; Save(atividadeTb); //Verifico quais tags eu possuo associadas para associar (apenas ID's positivas) List <Katapoka.DAO.Tag.TagCompleta> tagsReais = tags.Where(p => p.IdTag > 0).ToList(); List <Katapoka.DAO.Tag.TagCompleta> tagsNovas = tags.Where(p => p.IdTag < 0).ToList(); BLL.Tag.TagBLL tagBLL = CriarObjetoNoMesmoContexto <Tag.TagBLL>(); BLL.Tag.AtividadeTagBLL atiTagBLL = CriarObjetoNoMesmoContexto <Tag.AtividadeTagBLL>(); //Removo as que não foram postadas int[] idsPostadas = tags.Where(p => p.IdTag != null).Select(p => p.IdTag.Value).ToArray(); foreach (Katapoka.DAO.AtividadeTag_Tb ati in atividadeTb.AtividadeTag_Tb .Where(p => !idsPostadas.Contains(p.IdTag)) .ToList()) { atiTagBLL.Delete(ati); } //Cadastro as novas tags e associo à atividade foreach (Katapoka.DAO.Tag.TagCompleta tag in tagsNovas) { Katapoka.DAO.Tag_Tb newTag = new DAO.Tag_Tb() { DsTag = tag.DsTag }; tagBLL.Save(newTag); Katapoka.DAO.AtividadeTag_Tb atiTag = new DAO.AtividadeTag_Tb() { IdTag = newTag.IdTag, IdAtividade = atividadeTb.IdAtividade }; atiTagBLL.Save(atiTag); } //Adiciono as novas tags foreach (int idTag in tagsReais.Select(p => p.IdTag).ToList() .Where(p => !atividadeTb.AtividadeTag_Tb.Select(p2 => p2.IdTag).ToList().Contains(p.Value))) { Katapoka.DAO.AtividadeTag_Tb atiTag = new DAO.AtividadeTag_Tb() { IdTag = idTag, IdAtividade = atividadeTb.IdAtividade }; atiTagBLL.Save(atiTag); } Save(atividadeTb); }