public HttpResponseMessage GerarAgenda(GerarAgendaViewModel model) { try { _serviceAgenda.GerarAgenda(model, base.GetUsuarioLogado().IdClinica, base.GetUsuarioLogado()); return(Request.CreateResponse(HttpStatusCode.OK)); } catch (Exception ex) { return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message)); } }
public void GerarAgenda(GerarAgendaViewModel model, int idClinica, Usuario usuario) { TimeSpan ts = (model.DataFim - model.DataInicio); if (ts.Days > 365) { throw new Exception(" Somente permitido informar períodos menores ou igual a um ano!"); } if (ts.Days <= 0) { throw new Exception(" Período inválido "); } //verifica se tem bloqueio de data para gerar a agenda // _repository.ObterBloqueioAgenda() //verifico se tem agenda cadastrada no periodo selecionado var agenda = _repository.PesquisarAgenda(null, model.IdProfissional, string.Empty, model.DataInicio, model.DataFim, idClinica, model.IdUnidadeAtendimento, string.Empty).ToList(); if (agenda.Count > 0) { var aguardando = agenda.Where(x => x.Situacao == "Marcado" && x.Situacao == "Realizado"); //excluo a agenda e crio novamente, depois marco os horários que já estavam selecionado _repository.ExcluirAgenda(agenda); var datasSemana = new List <DateTime>(); while (model.DataInicio <= model.DataFim) { datasSemana.Add(model.DataInicio); model.DataInicio = model.DataInicio.AddDays(1); } //obtem o profissional da agenda var profissional = _caRepository.ObterFuncionarioById(model.IdProfissional); //obtem a clinica da agenda var clinica = _caRepository.ObterClinicaById(idClinica); var novo = new List <Agenda>(); foreach (var item in model.AgendaMedica) { var HoraInicio = item.HoraInicio.ToString().Split(':'); var HoraTermino = item.HoraTermino.ToString().Split(':'); DateTime TempoInicio = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(HoraInicio[0]), Convert.ToInt32(HoraInicio[1]), 00); DateTime TempoTermino = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(HoraTermino[0]), Convert.ToInt32(HoraTermino[1]), 00); double intervaloMinutos = item.IntervaloMinutos; List <DateTime> arrHorario = new List <DateTime>(); while (TempoInicio <= TempoTermino) { arrHorario.Add(TempoInicio); TempoInicio = TempoInicio.AddHours(0).AddMinutes(intervaloMinutos).AddSeconds(0); } if (item.IntervaloInicio != null && item.IntervaloTermino != null) { var IntInicio = item.IntervaloInicio.ToString().Split(':'); var Inttermino = item.IntervaloTermino.ToString().Split(':'); DateTime IntervaloInicio = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(IntInicio[0]), Convert.ToInt32(IntInicio[1]), 00); DateTime IntervaloTermino = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(Inttermino[0]), Convert.ToInt32(Inttermino[1]), 00); List <DateTime> arrIntervalo = new List <DateTime>(); while (IntervaloInicio < IntervaloTermino) { arrIntervalo.Add(IntervaloInicio); IntervaloInicio = IntervaloInicio.AddHours(0).AddMinutes(intervaloMinutos).AddSeconds(0); } var listaAgendaAguardando = arrHorario.Where(x => !arrIntervalo.Contains(x)).ToList(); //aqui só pego as datas(ex: somentes as segundas entre as datas selecionadas) referentes ao dia da semana escolhido var datadodia = datasSemana.Where(s => s.DayOfWeek == RetornaDiaSemana(item.Dia)); if (model.IdUnidadeAtendimento > 0) { var unidade = _caRepository.ObterUnidadeAtendimentoPorId(model.IdUnidadeAtendimento); foreach (var data in datadodia) { foreach (var _item in listaAgendaAguardando) { novo.Add(new Agenda(data, _item.TimeOfDay, profissional, clinica, usuario, unidade)); } } } else { foreach (var data in datadodia) { foreach (var _item in listaAgendaAguardando) { novo.Add(new Agenda(data, _item.TimeOfDay, profissional, clinica, usuario)); } } } } else { var listaAgendaAguardando = arrHorario.ToList(); var datadodia = datasSemana.Where(s => s.DayOfWeek == RetornaDiaSemana(item.Dia)); if (model.IdUnidadeAtendimento > 0) { var unidade = _caRepository.ObterUnidadeAtendimentoPorId(model.IdUnidadeAtendimento); foreach (var data in datadodia) { foreach (var _item in listaAgendaAguardando) { novo.Add(new Agenda(data, _item.TimeOfDay, profissional, clinica, usuario, unidade)); } } } else { foreach (var data in datadodia) { foreach (var _item in listaAgendaAguardando) { novo.Add(new Agenda(data, _item.TimeOfDay, profissional, clinica, usuario)); } } } } } //agora pego a nova agenda e coloco os horarios que estavam marcados anteriormente foreach (var item in aguardando) { var horariomarcado = novo.Where(x => x.Data == item.Data && x.Hora == item.Hora).FirstOrDefault(); if (horariomarcado != null) { horariomarcado.SetSituacao("Marcado"); horariomarcado.SetUsuarioMarcado(item.UsuarioMarcado); horariomarcado.DataMarcado = DateTime.Now; horariomarcado.SetPaciente(item.Paciente); horariomarcado.SetProfissionalSaude(item.ProfissionalSaude); horariomarcado.SetEspecialidade(item.Especialidade); horariomarcado.SetProcedimento(item.Procedimento); horariomarcado.SetValor((decimal)item.Valor); horariomarcado.SetTipoAgendamento(item.Tipo); horariomarcado.SetValorProfissional((decimal)item.ValorProfissional); horariomarcado.SetTipoAtendimento(item.TipoAtendimento); horariomarcado.SetObservacao(item.Observacao); horariomarcado.SetConvenio(item.Convenio); horariomarcado.SetSalaEspera("Nao"); } } _repository.SalvarAgendaCompleta(novo); } else { var datasSemana = new List <DateTime>(); while (model.DataInicio <= model.DataFim) { datasSemana.Add(model.DataInicio); model.DataInicio = model.DataInicio.AddDays(1); } //obtem o profissional da agenda var profissional = _caRepository.ObterFuncionarioById(model.IdProfissional); //obtem a clinica da agenda var clinica = _caRepository.ObterClinicaById(idClinica); var novo = new List <Agenda>(); foreach (var item in model.AgendaMedica) { var HoraInicio = item.HoraInicio.ToString().Split(':'); var HoraTermino = item.HoraTermino.ToString().Split(':'); DateTime TempoInicio = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(HoraInicio[0]), Convert.ToInt32(HoraInicio[1]), 00); DateTime TempoTermino = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(HoraTermino[0]), Convert.ToInt32(HoraTermino[1]), 00); double intervaloMinutos = item.IntervaloMinutos; List <DateTime> arrHorario = new List <DateTime>(); while (TempoInicio <= TempoTermino) { arrHorario.Add(TempoInicio); TempoInicio = TempoInicio.AddHours(0).AddMinutes(intervaloMinutos).AddSeconds(0); } if (item.IntervaloInicio != null && item.IntervaloTermino != null) { var IntInicio = item.IntervaloInicio.ToString().Split(':'); var Inttermino = item.IntervaloTermino.ToString().Split(':'); DateTime IntervaloInicio = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(IntInicio[0]), Convert.ToInt32(IntInicio[1]), 00); DateTime IntervaloTermino = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(Inttermino[0]), Convert.ToInt32(Inttermino[1]), 00); List <DateTime> arrIntervalo = new List <DateTime>(); while (IntervaloInicio < IntervaloTermino) { arrIntervalo.Add(IntervaloInicio); IntervaloInicio = IntervaloInicio.AddHours(0).AddMinutes(intervaloMinutos).AddSeconds(0); } var listaAgendaAguardando = arrHorario.Where(x => !arrIntervalo.Contains(x)).ToList(); //aqui só pego as datas(ex: somentes as segundas entre as datas selecionadas) referentes ao dia da semana escolhido var datadodia = datasSemana.Where(s => s.DayOfWeek == RetornaDiaSemana(item.Dia)).ToList(); if (model.IdUnidadeAtendimento > 0) { var unidade = _caRepository.ObterUnidadeAtendimentoPorId(model.IdUnidadeAtendimento); foreach (var data in datadodia) { foreach (var _item in listaAgendaAguardando) { novo.Add(new Agenda(data, _item.TimeOfDay, profissional, clinica, usuario, unidade)); } } } else { foreach (var data in datadodia) { foreach (var _item in listaAgendaAguardando) { novo.Add(new Agenda(data, _item.TimeOfDay, profissional, clinica, usuario)); } } } } else { var listaAgendaAguardando = arrHorario.ToList(); var datadodia = datasSemana.Where(s => s.DayOfWeek == RetornaDiaSemana(item.Dia)); if (model.IdUnidadeAtendimento > 0) { var unidade = _caRepository.ObterUnidadeAtendimentoPorId(model.IdUnidadeAtendimento); foreach (var data in datadodia) { foreach (var _item in listaAgendaAguardando) { novo.Add(new Agenda(data, _item.TimeOfDay, profissional, clinica, usuario, unidade)); } } } else { foreach (var data in datadodia) { foreach (var _item in listaAgendaAguardando) { novo.Add(new Agenda(data, _item.TimeOfDay, profissional, clinica, usuario)); } } } } //_repository.SalvarAgendaCompleta(novo); } _repository.SalvarAgendaCompleta(novo); } }