コード例 #1
0
        public async Task <IActionResult> SearchAvailabilityOfResource([FromBody] AvailabilitySerachModel availabilitySearch)
        {
            var token = HttpContext.Request.Headers["Authentication"];

            return(await this.exceptionHandler.SendResponse(this, this.availabilitySearchContext.SearchAvailabilityAsync(availabilitySearch, token)));
        }
コード例 #2
0
        public async Task <MarsResponse> SearchAvailabilityAsync(AvailabilitySerachModel availabilitySearch, String token)
        {
            string errMsg = string.Empty;

            //Validate input
            errMsg = await ValidateAvailabilitySearchCriteriaAsync(availabilitySearch.PatientId, availabilitySearch.AppointmentDate);

            if (!string.IsNullOrEmpty(errMsg))
            {
                var errResp = MarsResponse.GetResponse(string.Empty, HttpStatusCode.BadRequest);
                errResp.Error = new MarsException(errMsg);
                return(errResp);
            }

            //Fetch prefered doctor for given patient id from marsstorage.[dbo].[Patients] tablle.
            string patientsUrl = ServiceAddress.PatientsBaseUrl + availabilitySearch.PatientId;
            var    patient     = await InterServiceCommunication.GetAsync(patientsUrl, token);

            int prefDoctorID = 0;

            if (patient != null)
            {
                dynamic patientData = JsonConvert.DeserializeObject(patient);
                var     data        = patientData["data"];

                if (data["pref_doctor"] != null)
                {
                    prefDoctorID = data["pref_doctor"];
                }
            }

            //Fetch doctor availability from marspoc.dbo.[Availability]
            string resourcesUrl = ServiceAddress.AvailabilityBaseUrl;   //"http://localhost:5000/api/resource/availability/";   //
            var    availability = string.Empty;

            if (prefDoctorID > 0)
            {
                var body = new AvailabilityRequest
                {
                    Id         = 0,
                    Date       = availabilitySearch.AppointmentDate.Date,
                    StartTime  = new TimeSpan(),
                    EndTime    = new TimeSpan(),
                    ResourceId = prefDoctorID
                };

                availability = await InterServiceCommunication.PostAsync(resourcesUrl, token, body);
            }
            dynamic availabilityData = JsonConvert.DeserializeObject(availability);
            dynamic avData           = null;

            if (!string.IsNullOrEmpty(availability))
            {
                avData = availabilityData["data"];
            }

            if (prefDoctorID == 0 || avData.First == null)
            {
                availability = await InterServiceCommunication.GetAsync(resourcesUrl, token);

                availabilityData = JsonConvert.DeserializeObject(availability);
                if (!string.IsNullOrEmpty(availability))
                {
                    avData = availabilityData["data"];
                }
            }

            DateTime startTime;// = new DateTime();
            DateTime endTime;
            String   doctorName = string.Empty;
            int      docId      = 0;
            //DateTime bookingTime;
            TimeSpan hospitalStartTime;
            TimeSpan hospitalEndTime;

            TimeSpan.TryParse(configuration.GetSection("Hospital").GetSection("StartTime").Value, out hospitalStartTime);
            TimeSpan.TryParse(configuration.GetValue <string>("Hospital:EndTime"), out hospitalEndTime);
            List <AvailabilityModel> timeslots = new List <AvailabilityModel>();

            if (!string.IsNullOrEmpty(availability) && avData.First != null)
            {
                //Fetch default time for given appointment type from master data(mars_appointments.[dbo].[appointment_types])
                int defaultDuration = availabilitySearch.SubTypeId > 0? GetDefaultDurationOfApptType(availabilitySearch.SubTypeId) : 30;

                if (defaultDuration > 0)
                {
                    //dynamic availabilityData = JsonConvert.DeserializeObject(availability);
                    //dynamic data = availabilityData["data"];
                    //List<AvailabilityModel> availableResources = JsonConvert.DeserializeObject<List<AvailabilityModel>>(JsonConvert.SerializeObject(data));

                    foreach (dynamic d in avData)
                    {
                        if (timeslots.Count > 0)
                        {
                            break;
                        }

                        //startTime = ((DateTime)d["date"]).Add(((TimeSpan)d["startTime"] > hospitalStartTime && (TimeSpan)d["startTime"] < hospitalEndTime) ? (TimeSpan)d["startTime"] : hospitalStartTime);
                        //endTime = ((DateTime)d["date"]).Add( (TimeSpan)d["endTime"] );
                        startTime  = ((DateTime)d["date"]).Add((TimeSpan)d["startTime"]);
                        endTime    = ((DateTime)d["date"]).Add((TimeSpan)d["endTime"]);
                        docId      = d["resourceId"];
                        doctorName = d["name"];

                        //bookingTime = new DateTime(1970, 1, 1).AddMilliseconds(availabilitySearch.ClientReqTime).ToLocalTime();// .AddHours(-7);   //setting to PST time   // .ToLocalTime();
                        DateTime bookingTime = RoundUp(DateTime.Parse(DateTime.Now.ToString()), TimeSpan.FromMinutes(30));
                        if (bookingTime >= endTime)
                        {
                            continue;
                        }
                        else if (bookingTime > startTime && bookingTime < endTime)
                        {
                            //string s = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
                            //string st = String.Format("{0:s}", DateTime.Now);
                            //string st = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:00");
                            startTime = Convert.ToDateTime(bookingTime.ToString("yyyy-MM-ddTHH:mm:00"));   //startTime = startTime.Add(DateTime.Now.AddSeconds(-DateTime.Now.Second).TimeOfDay);
                            if (endTime.Subtract(startTime).TotalMinutes < defaultDuration)
                            {
                                continue;
                            }
                        }

                        //Fetch Appointments for given resource from mars_appointment.[dbo].[appointments] table
                        AppointmentModel appModel = new AppointmentModel
                        {
                            DoctorId = docId    //prefDoctorID > 0 ? prefDoctorID : docId
                        };
                        var appointments = this.appointmentContext.SearchModelByResourceIdAndDate(appModel, startTime.Date);
                        if (appointments.ToList().Count > 1)
                        {
                            appointments = appointments.Where(a => a.EndTime >= startTime && a.StartTime <= endTime).OrderBy(a => a.StartTime);
                        }


                        //Find availability based on default duration of appointment type and already booked appointments if any.
                        if (availabilitySearch.DefaultSlot)
                        {
                            timeslots = FindDefaultTimeslot(appointments.ToList(), startTime, endTime, defaultDuration);
                        }
                        else
                        {
                            timeslots = FindAllAvailableTimeslots(appointments.ToList(), startTime, endTime, defaultDuration);
                        }


                        if (timeslots != null && timeslots.Count > 0)
                        {
                            foreach (var t in timeslots)
                            {
                                t.DoctorId        = docId;
                                t.DoctorName      = doctorName;
                                t.AppointmentDate = startTime.Date;
                            }
                            //if (availabilitySearch.DefaultSlot || timeslots.Count == 1)
                            //{
                            //    timeslots.FirstOrDefault().DoctorId = prefDoctorID;
                            //    timeslots.FirstOrDefault().AppointmentDate = availabilitySearch.AppointmentDate.Date;
                            //    timeslots.FirstOrDefault().DoctorName = doctorName;
                            //}
                        }
                    }
                }
            }

            MarsResponse resp = MarsResponse.GetResponse(timeslots);

            if (timeslots == null)
            {
                resp.Code = HttpStatusCode.NotAcceptable;
            }
            else if (timeslots.Count() == 0)
            {
                //resp.Code = HttpStatusCode.Accepted;
                resp.Error = new MarsException("Time slots not found.");
            }

            return(resp);
        }