private bool InsereDetalheQuadro(ref IUnitOfWork unitOfWork, DateTime dataControle, Congregacao item, int codigoQuadro, TipoLista itemTipoLista) { var cont = 0; ControleLista proximoLista = null; bool liberouproximo = false; QuadroDetalhe quadrodetalhe = null; DataEvento evento = _repositoryDataEvento.ListByDate(ref unitOfWork, item.Codigo, dataControle); var ultimaReuniao = _repositoryQuadroDetalhe.ObterUltimaReuniaoValida(ref unitOfWork, item.Codigo, dataControle); var proximaReuniao = _repositoryQuadroDetalhe.ObterProximaReuniaoValida(ref unitOfWork, item.Codigo, dataControle); if (evento == null || (evento.VisitaSuperintendente && itemTipoLista.Codigo != Core.Domain.enums.eTipoLista.LeitorELC && itemTipoLista.Codigo != Core.Domain.enums.eTipoLista.LeitorJW)) { if (item.FolgaParticipacao && itemTipoLista.Codigo != Core.Domain.enums.eTipoLista.OracaoFinal && itemTipoLista.Codigo != Core.Domain.enums.eTipoLista.OracaoInicial && (itemTipoLista.Codigo != Core.Domain.enums.eTipoLista.AudioVideo)) { if (itemTipoLista.Codigo == Core.Domain.enums.eTipoLista.Indicador) { cont = 16; } while (proximoLista == null) { if (cont <= 15) { proximoLista = _repositoryControleLista.ObterProximoListaSemRepetirComFolga(ref unitOfWork, (int)itemTipoLista.Codigo, (ultimaReuniao == null) ? dataControle.AddDays(-1) : ultimaReuniao.Data, dataControle, (proximaReuniao == null) ? dataControle.AddDays(1) : proximaReuniao.Data, item.Codigo); } else if (cont > 15 && cont <= 30) { proximoLista = _repositoryControleLista.ObterProximoListaSemRepetirSemFolgaParaAudioSonoro(ref unitOfWork, (int)itemTipoLista.Codigo, (ultimaReuniao == null) ? dataControle.AddDays(-1) : ultimaReuniao.Data, dataControle, (proximaReuniao == null) ? dataControle.AddDays(1) : proximaReuniao.Data, item.Codigo); } else if (cont > 30 && cont <= 50) { proximoLista = _repositoryControleLista.ObterProximoListaSemRepetirSemFolga(ref unitOfWork, (int)itemTipoLista.Codigo, dataControle, (ultimaReuniao == null) ? dataControle.AddDays(-1) : ultimaReuniao.Data, (proximaReuniao == null) ? dataControle.AddDays(1) : proximaReuniao.Data, item.Codigo); } else { throw new Exception("Não foi possivel obter um irmão da lista "); } if (proximoLista == null) { _repositoryControleLista.LiberaProximoLista(ref unitOfWork, (int)itemTipoLista.Codigo, item.Codigo); liberouproximo = true; } cont++; Task.Delay(10).Wait(); } } else if (itemTipoLista.Codigo != Core.Domain.enums.eTipoLista.OracaoFinal && itemTipoLista.Codigo != Core.Domain.enums.eTipoLista.OracaoInicial && ((itemTipoLista.Codigo == Core.Domain.enums.eTipoLista.AudioVideo) || (!item.FolgaParticipacao))) { while (proximoLista == null) { if (cont <= 25) { proximoLista = _repositoryControleLista.ObterProximoListaSemRepetirSemFolga(ref unitOfWork, (int)itemTipoLista.Codigo, dataControle, (ultimaReuniao == null) ? dataControle.AddDays(-1) : ultimaReuniao.Data, (proximaReuniao == null) ? dataControle.AddDays(1) : proximaReuniao.Data, item.Codigo); } else { proximoLista = _repositoryControleLista.ObterProximoListaSemRepetirSemFolgaParaAudioSonoro(ref unitOfWork, (int)itemTipoLista.Codigo, (ultimaReuniao == null) ? dataControle.AddDays(-1) : ultimaReuniao.Data, dataControle, (proximaReuniao == null) ? dataControle.AddDays(1) : proximaReuniao.Data, item.Codigo); } if (proximoLista == null) { _repositoryControleLista.LiberaProximoLista(ref unitOfWork, (int)itemTipoLista.Codigo, item.Codigo); liberouproximo = true; } if (cont > 50) { throw new Exception("Não foi possivel obter um irmão da lista de audio e video"); } cont++; } } else { while (proximoLista == null) { proximoLista = _repositoryControleLista.ObterProximoListaPodeRepetir(ref unitOfWork, (int)itemTipoLista.Codigo, item.Codigo, dataControle); if (proximoLista == null) { _repositoryControleLista.LiberaProximoLista(ref unitOfWork, (int)itemTipoLista.Codigo, item.Codigo); liberouproximo = true; } } } quadrodetalhe = new QuadroDetalhe() { Data = dataControle, IrmaoId = proximoLista.IrmaoId, QuadroId = codigoQuadro }; _repositoryControleLista.AtualizaPartipacaoIrmaoLista(ref unitOfWork, (int)itemTipoLista.Codigo, proximoLista.IrmaoId, liberouproximo); } else { quadrodetalhe = new QuadroDetalhe() { Data = dataControle, QuadroId = codigoQuadro, EventoId = evento.Codigo } }; _repositoryQuadroDetalhe.InsereDataQuadro(ref unitOfWork, quadrodetalhe); return((evento != null && evento.Assembleia) ? true : false); } }