public async Task <DoctorDetailsDTO> GetDoctorDetailsAsync(int serviceSupplyId, Lang lang, int?centerServiceId = null, int?offerId = null) { var serviceSupply = await _serviceSupplyService.GetServiceSupplyByIdAsync(serviceSupplyId); if (serviceSupply == null) { throw new AwroNoreException(Global.Err_DoctorNotFound); } var Lng = lang; // Get all places that doctor work var suppliedSerivices = _serviceSupplyService.Table.Where(x => x.PersonId == serviceSupply.PersonId && x.IsAvailable).ToList(); var healthCentersWorkingHours = new List <DoctorCenterModel>(); foreach (var item in suppliedSerivices) { var centerName = ""; var centertype = HealthCenterType.Polyclinic; var centerAddress = ""; if (item.ShiftCenter.IsIndependent) { centerName = Lng == Lang.AR ? item.ShiftCenter.Name_Ar : Lng == Lang.KU ? item.ShiftCenter.Name_Ku : item.ShiftCenter.Name; centertype = HealthCenterType.Polyclinic; centerAddress = Lng == Lang.AR ? $"{item.ShiftCenter.City.Name_Ar}: {item.ShiftCenter.Address_Ar}" : lang == Lang.KU ? $"{item.ShiftCenter.City.Name_Ku}: {item.ShiftCenter.Address_Ku}" : $"{item.ShiftCenter.City.Name}: {item.ShiftCenter.Address}"; } else if (!item.ShiftCenter.IsIndependent && item.ShiftCenter.Clinic.IsIndependent) { centerName = Lng == Lang.AR ? item.ShiftCenter.Clinic.Name_Ar : Lng == Lang.KU ? item.ShiftCenter.Clinic.Name_Ku : item.ShiftCenter.Clinic.Name; centertype = HealthCenterType.Clinic; centerAddress = Lng == Lang.AR ? item.ShiftCenter.Clinic.City.Name_Ar : Lng == Lang.KU ? item.ShiftCenter.Clinic.City.Name_Ku + ": " + item.ShiftCenter.Clinic.Address_Ku : item.ShiftCenter.Clinic.City.Name + ": " + item.ShiftCenter.Clinic.Address; } else { centerName = Lng == Lang.AR ? item.ShiftCenter.Clinic.Hospital.Name_Ar : Lng == Lang.KU ? item.ShiftCenter.Clinic.Hospital.Name_Ku : item.ShiftCenter.Clinic.Hospital.Name; centertype = HealthCenterType.Hospital; centerAddress = Lng == Lang.AR ? $"{item.ShiftCenter.Clinic.Hospital.City.Name_Ar}: {item.ShiftCenter.Clinic.Hospital.Address_Ar}" : Lng == Lang.KU ? $"{item.ShiftCenter.Clinic.Hospital.City.Name_Ku}: {item.ShiftCenter.Clinic.Hospital.Address_Ku}" : $"{item.ShiftCenter.Clinic.Hospital.City.Name}: {item.ShiftCenter.Clinic.Hospital.Address}"; } var WorkingHours = new List <WorkingHourModel>(); var plans = item.UsualSchedulePlans.Where(x => x.ServiceSupplyId == serviceSupplyId).OrderBy(x => x.DayOfWeek).ToList(); foreach (var schedule in plans) { WorkingHours.Add(new WorkingHourModel { DayOfWeek = Utils.ConvertDayOfWeek(schedule.DayOfWeek.ToString()), Shift = schedule.Shift == ScheduleShift.Morning ? Global.Morning : Global.Evening, FromTime = schedule.StartTime, ToTime = schedule.EndTime, Service = Lng == Lang.AR ? schedule.ShiftCenterService?.Service.Name_Ar : Lng == Lang.KU ? schedule.ShiftCenterService?.Service.Name_Ku : schedule.ShiftCenterService?.Service.Name, MaxCount = schedule.MaxCount }); } healthCentersWorkingHours.Add(new DoctorCenterModel { CenterName = centerName, CenterType = centertype, CenterAddress = centerAddress, WorkingHoures = WorkingHours }); } TurnModel firstTurn = null; if (centerServiceId != null) { firstTurn = await GetNextFirstAvailableTurnAsync(serviceSupplyId, centerServiceId.Value, lang); } var firstExpertise = serviceSupply.DoctorExpertises.FirstOrDefault(); var result = new DoctorDetailsDTO { Id = serviceSupply.Id, FullName = lang == Lang.KU ? serviceSupply.Person.FullName_Ku : lang == Lang.AR ? serviceSupply.Person.FullName_Ar : serviceSupply.Person.FullName, Avatar = serviceSupply.Person.RealAvatar, ExpertiseCategory = firstExpertise != null ? lang == Lang.AR ? firstExpertise.Expertise.ExpertiseCategory.Name_Ar : lang == Lang.KU ? firstExpertise.Expertise.ExpertiseCategory.Name_Ku : firstExpertise.Expertise.ExpertiseCategory.Name : "", Address = lang == Lang.KU ? serviceSupply.ShiftCenter.Address_Ku : lang == Lang.AR ? serviceSupply.ShiftCenter.Address_Ar : serviceSupply.ShiftCenter.Address, HasEmptyTurn = firstTurn != null, Province = serviceSupply.ShiftCenter.IsIndependent ? (Lng == Lang.AR ? serviceSupply.ShiftCenter.City.Province.Name_Ar : Lng == Lang.KU ? serviceSupply.ShiftCenter.City.Province.Name_Ku : serviceSupply.ShiftCenter.City.Province.Name) : (Lng == Lang.AR ? serviceSupply.ShiftCenter.Clinic.City.Province.Name_Ar : Lng == Lang.KU ? serviceSupply.ShiftCenter.Clinic.City.Province.Name_Ku : serviceSupply.ShiftCenter.Clinic.City.Province.Name), MedicalCouncilNumber = serviceSupply.ServiceSupplyInfo?.MedicalCouncilNumber, FirstAvailableTurn = firstTurn, Latitude = serviceSupply.ShiftCenter.Location?.Y.ToString(), Longitude = serviceSupply.ShiftCenter.Location?.X.ToString(), Schedules = await GetSchedulesAsync(serviceSupply.Id, lang) }; if (serviceSupply.ShiftCenter.PhoneNumbers != null) { result.Phones = serviceSupply.ShiftCenter.PhoneNumbers.Where(p => p.IsForReserve).Select(x => new ShiftCenterPhoneModel { PhoneNumber = x.PhoneNumber, IsForReserve = x.IsForReserve }).ToList(); } result.Expertises = serviceSupply.DoctorExpertises.Select(x => Lng == Lang.AR ? x.Expertise.Name_Ar : Lng == Lang.KU ? x.Expertise.Name_Ku : x.Expertise.Name).ToList(); result.Description = Lng == Lang.AR ? serviceSupply.ShiftCenter.Description_Ar : Lng == Lang.KU ? serviceSupply.ShiftCenter.Description_Ku : serviceSupply.ShiftCenter.Description; result.Notification = Lng == Lang.AR ? serviceSupply.ShiftCenter.Notification_Ar : Lng == Lang.KU ? serviceSupply.ShiftCenter.Notification_Ku : serviceSupply.ShiftCenter.Notification; result.WorkingCenters = healthCentersWorkingHours; var photosQuery = _dbContext.Attachments.Where(x => x.Owner == FileOwner.SHIFT_CENTER && x.OwnerTableId == serviceSupply.ShiftCenterId && x.FileType == FileType.Image); result.Photos = await photosQuery.Select(x => x.Url).ToListAsync(); result.PhotosThumbs = await photosQuery.Select(x => x.ThumbnailUrl).ToListAsync(); result.Grades = serviceSupply.ServiceSupplyInfo?.DoctorScientificCategories.Select(x => Lng == Lang.AR ? x.ScientificCategory.Name_Ar : Lng == Lang.KU ? x.ScientificCategory.Name_Ku : x.ScientificCategory.Name).ToList(); result.Bio = Lng == Lang.EN ? serviceSupply.ServiceSupplyInfo?.Bio : Lng == Lang.AR ? serviceSupply.ServiceSupplyInfo?.Bio_Ar : serviceSupply.ServiceSupplyInfo?.Bio_Ku; if (offerId != null) { var offer = await _dbContext.Offers.FindAsync(offerId); if (offer != null) { offer.VisitsCount += 1; _dbContext.Attach(offer); _dbContext.Entry(offer).State = EntityState.Modified; _dbContext.Offers.Update(offer); await _dbContext.SaveChangesAsync(); } } return(result); }