public IReadOnlyCollection <Notification> RegerarListaAtual(int congregacaoAtual) { var model = new Quadro(); using (RepositorySession dalSession = new RepositorySession(Runtime.JWInstance)) { IUnitOfWork unitOfWork = dalSession.UnitOfWork; unitOfWork.Begin(); try { var congregacao = _repositoryCongregacao.ListAll(ref unitOfWork).ToList().Find(x => x.Codigo == congregacaoAtual); if (congregacao == null) { model.AddNotification("Congregacao", "Não existe nenhuma congregação cadastrada"); unitOfWork.Rollback(); return(model.Notifications); } var quadroAtual = _repositoryQuadro.ObterQuadroAtual(ref unitOfWork, congregacaoAtual); var proximoQuadro = _repositoryQuadro.ObterProximoQuadro(ref unitOfWork, congregacaoAtual); int quadro = 0; DateTime dataInicioLista; if (proximoQuadro > 0) { quadro = proximoQuadro; } else { quadro = quadroAtual; } dataInicioLista = _repositoryQuadroDetalhe.ObterDataInicioQuadro(ref unitOfWork, quadro); var tipolistas = _repositoryTipoLista.ListAll(ref unitOfWork, congregacaoAtual); DateTime dataFinalLista = _repositoryQuadroDetalhe.ObterDataFimQuadro(ref unitOfWork, quadro); //Apaga Lista Atual _repositoryQuadroDetalhe.ApagaDetalhesQuadro(ref unitOfWork, quadro); // Caso a próxima lista ainda não foi gerada, a lista atual será gerada até a última reunião antes da data atual if (proximoQuadro == 0) { // Gera lista até data atual GeraListas(ref unitOfWork, ref tipolistas, ref congregacao, dataInicioLista, quadro, DateTime.Now, true, true); // Atualiza o Controle da lista com base nas atribuições atuais dos irmãos AtualizarControleLista(ref unitOfWork, congregacao.Codigo, false); // Continua a geração da lista da data atual até o final da lista GeraListas(ref unitOfWork, ref tipolistas, ref congregacao, DateTime.Now.AddDays(1), quadro, dataFinalLista, false, false); } else { // Recupera Backup das lista foreach (var item in tipolistas) { _repositoryControleLista.RecuperaBackupListaAtual(ref unitOfWork, (int)item.Codigo, congregacaoAtual); } // Atualiza o Controle da lista com base nas atribuições atuais dos irmãos AtualizarControleLista(ref unitOfWork, congregacao.Codigo, false); // Gera lista até data atual GeraListas(ref unitOfWork, ref tipolistas, ref congregacao, dataInicioLista, quadro, dataFinalLista, true, false); } unitOfWork.Commit(); } catch { unitOfWork.Rollback(); throw; } } return(model.Notifications); }
public IReadOnlyCollection <Notification> GeraLista(int congregacaoAtual) { var model = new Quadro(); using (RepositorySession dalSession = new RepositorySession(Runtime.JWInstance)) { IUnitOfWork unitOfWork = dalSession.UnitOfWork; unitOfWork.Begin(); try { var congregacao = _repositoryCongregacao.ListAll(ref unitOfWork).ToList().Find(x => x.Codigo == congregacaoAtual); if (congregacao == null) { model.AddNotification("Congregacao", "Não existe nenhuma congregação cadastrada"); unitOfWork.Rollback(); return(model.Notifications); } DateTime dataInicioLista; if (DateTime.Now.Date < Convert.ToDateTime(congregacao.DataPrimeiraLista).Date) { dataInicioLista = Convert.ToDateTime(congregacao.DataPrimeiraLista).Date; } else { var ultimareuniao = _repositoryQuadro.ObterUltimoQuadro(ref unitOfWork, congregacao.Codigo); dataInicioLista = ultimareuniao.DataFimLista.Date.AddDays(1); } if (DateTime.Now.Date < dataInicioLista.Date.AddDays(congregacao.DiasAntecedenciaGerarLista * -1)) { model.AddNotification("Congregacao", $"A lista somente pode ser gerada a partir de + " + $"'{dataInicioLista.Date.AddDays(congregacao.DiasAntecedenciaGerarLista * -1).Date}'"); unitOfWork.Rollback(); return(model.Notifications); } var tipolistas = _repositoryTipoLista.ListAll(ref unitOfWork, congregacao.Codigo); int quadro = 0; int codQuadro = 0; if (tipolistas.Count() > 0) { quadro = _repositoryQuadro.ObterCodigoProximoQuadro(ref unitOfWork); // Incluir / retirar irmãos da lista / atualiza designações AtualizarControleLista(ref unitOfWork, congregacao.Codigo, true); } DateTime dataFinalLista = DateTime.MinValue; foreach (var itemTipoLista in tipolistas) { DateTime dataControle = dataInicioLista; _repositoryControleLista.BackupListaAtual(ref unitOfWork, (int)itemTipoLista.Codigo, dataInicioLista, itemTipoLista.CongregacaoId); codQuadro = _repositoryQuadro.InserirNovoQuadro(ref unitOfWork, congregacao.Codigo, quadro, (int)itemTipoLista.Codigo); int i = 0; while (i < itemTipoLista.QuantidadeDatas) { bool assembleia = false; switch (itemTipoLista.Codigo) { case Core.Domain.enums.eTipoLista.Indicador: if (dataControle.DayOfWeek == congregacao.DiaReuniaoSentinela || dataControle.DayOfWeek == congregacao.DiaReuniaoServico) { for (int iIndicador = 0; iIndicador < congregacao.QuantidadeIndicadores; iIndicador++) { if (!assembleia) { assembleia = InsereDetalheQuadro(ref unitOfWork, dataControle, congregacao, codQuadro, itemTipoLista); } } i++; } break; case Core.Domain.enums.eTipoLista.AudioVideo: if (dataControle.DayOfWeek == congregacao.DiaReuniaoSentinela || dataControle.DayOfWeek == congregacao.DiaReuniaoServico) { for (int iSistemaSonoro = 0; iSistemaSonoro < congregacao.QuantidadeSistemaSonoro; iSistemaSonoro++) { if (!assembleia) { assembleia = InsereDetalheQuadro(ref unitOfWork, dataControle, congregacao, codQuadro, itemTipoLista); } } i++; } break; case Core.Domain.enums.eTipoLista.Microfonista: if (dataControle.DayOfWeek == congregacao.DiaReuniaoSentinela || dataControle.DayOfWeek == congregacao.DiaReuniaoServico) { for (int iMicrofonistas = 0; iMicrofonistas < congregacao.QuantidadeMicrofonistas; iMicrofonistas++) { if (!assembleia) { assembleia = InsereDetalheQuadro(ref unitOfWork, dataControle, congregacao, codQuadro, itemTipoLista); } } i++; } break; case Core.Domain.enums.eTipoLista.OracaoFinal: case Core.Domain.enums.eTipoLista.OracaoInicial: if (dataControle.DayOfWeek == congregacao.DiaReuniaoSentinela || dataControle.DayOfWeek == congregacao.DiaReuniaoServico) { InsereDetalheQuadro(ref unitOfWork, dataControle, congregacao, codQuadro, itemTipoLista); i++; } break; case Core.Domain.enums.eTipoLista.LeitorJW: if (dataControle.DayOfWeek == congregacao.DiaReuniaoSentinela) { InsereDetalheQuadro(ref unitOfWork, dataControle, congregacao, codQuadro, itemTipoLista); i = i + 2; } break; case Core.Domain.enums.eTipoLista.LeitorELC: if (dataControle.DayOfWeek == congregacao.DiaReuniaoServico) { InsereDetalheQuadro(ref unitOfWork, dataControle, congregacao, codQuadro, itemTipoLista); i = i + 2; } break; default: break; } dataControle = dataControle.AddDays(1); } if (dataFinalLista == DateTime.MinValue) { dataFinalLista = dataControle.AddDays(-1); } } unitOfWork.Commit(); } catch { unitOfWork.Rollback(); throw; } } return(model.Notifications); }