public void FromUiDto_AddOrUpdateProfessionalWorkingHours(string userIdString, List <ProfessionalWorkingHourUiDto> professionalWorkingHoursUiDto)
        {
            List <ProfessionalWorkingHour> professionalWorkingHours = new List <ProfessionalWorkingHour>();

            // Validation - only allow update of one professional at a time.
            List <Guid> proIds = professionalWorkingHoursUiDto.Select(i => i.ProfessionalId).ToList();

            // Need a list of companyLocationGroups for the udpate.
            AuthorizationState          authState;
            List <CompanyLocationGroup> companyLocationGroups = _companyLocationGroupQueries.GetCompanyLocationGroups(userIdString, out authState);

            // Convert to db model.
            foreach (var row in professionalWorkingHoursUiDto)
            {
                ProfessionalWorkingHour pwh = _mapper.Map <ProfessionalWorkingHourUiDto, ProfessionalWorkingHour>(row);

                var matchingLocationGroup = companyLocationGroups.FirstOrDefault(i => i.CompanyLocationGroupId == row.CompanyLocationGroupId);
                if (matchingLocationGroup == null)
                {
                    throw new InvalidOperationException("Invalid company location group found");
                }

                pwh.CompanyLocationGroup = matchingLocationGroup;
                professionalWorkingHours.Add(pwh);
            }

            // Add / Update
            AddOrUpdateProfessionalWorkingHours(userIdString, professionalWorkingHours, proIds);
        }
 public async Task <ActionResult> Edit([Bind(Include = "ProfessionalWorkingHourId,ProfessionalWorkingHourIndex,DayOfWeek,StartTime,EndTime,IncludeBankHolidays,CreatedByProfessionalId,CreatedDate,UpdatedByProfessionalId,UpdatedDate,IsDeleted,DeletedByProfessionalId,DeletedDate")] ProfessionalWorkingHour professionalWorkingHour)
 {
     if (ModelState.IsValid)
     {
         //db.Entry(professionalWorkingHour).State = EntityState.Modified;
         //await db.SaveChangesAsync();
         return(RedirectToAction("Index"));
     }
     return(View(professionalWorkingHour));
 }
        public async Task <ActionResult> Create([Bind(Include = "ProfessionalWorkingHourId,ProfessionalWorkingHourIndex,DayOfWeek,StartTime,EndTime,IncludeBankHolidays,CreatedByProfessionalId,CreatedDate,UpdatedByProfessionalId,UpdatedDate,IsDeleted,DeletedByProfessionalId,DeletedDate")] ProfessionalWorkingHour professionalWorkingHour)
        {
            if (ModelState.IsValid)
            {
                professionalWorkingHour.ProfessionalWorkingHourId = Guid.NewGuid();
                //db.ProfessionalWorkingHours.Add(professionalWorkingHour);
                //await db.SaveChangesAsync();
                return(RedirectToAction("Index"));
            }

            return(View(professionalWorkingHour));
        }
        // REMEMBER TO VALIDATE START < END Date!
        // LOOK INTO OVERPOSTING PROTECTION.
        // Cancel to post back to same page?

        // See CompanyLocationGroupsController example for shared razor and saves.



        // GET: ProfessionalWorkingHours/Details/5
        public async Task <ActionResult> Details(Guid?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            ProfessionalWorkingHour professionalWorkingHour = null;

            if (professionalWorkingHour == null)
            {
                return(HttpNotFound());
            }
            return(View(professionalWorkingHour));
        }
        /// <summary>
        /// This should handle any authorised person updating the working hours for the professional.
        /// </summary>
        /// <param name="userIdString"></param>
        /// <param name="professionalWorkingHoursToUpdate"></param>
        /// <param name="workingHoursProfessionalId">workingHoursProfessionalId must match the correspoinding index of professionalWorkingHoursToUpdate</param>
        public void AddOrUpdateProfessionalWorkingHours(string userIdString, List <ProfessionalWorkingHour> professionalWorkingHoursToUpdate, List <Guid> workingHoursProfessionalIds)
        {
            //TODO: ****Null checks at top across the board!***
            AuthorizationState authState = AuthorizationState.NotAllowed;
            DateTime           now       = DateTime.Now;

            if (String.IsNullOrWhiteSpace(userIdString) || professionalWorkingHoursToUpdate == null || !professionalWorkingHoursToUpdate.Any())
            {
                return;
            }

            Guid userId = GuidHelper.GetGuid(userIdString);

            // Get all professionals that we could theoretically update.
            List <Professional> professionalsToUpdate = _accessQueries.GetAuthorization_ProfessionalWorkingHours_ReturnProsToUpdate(userId, workingHoursProfessionalIds, out authState);

            if (authState != AuthorizationState.CreateReadUpdate)
            {
                return;
            }

            // Note the submitting professional
            Professional submittingPro = professionalsToUpdate.FirstOrDefault(i => i.ProfessionalUserId == userId);

            if (submittingPro == null)
            {
                return;
            }

            // we are not allowing deletions, so don't need to consider that case.
            int index = 0;

            foreach (var professionalWorkingHourToUpdate in professionalWorkingHoursToUpdate)
            {
                var idx = index;
                var matchingProfessional = professionalsToUpdate.FirstOrDefault(i => i.ProfessionalId == workingHoursProfessionalIds[idx]);

                if (matchingProfessional == null)
                {
                    index = index + 1;
                    continue;
                }

                ProfessionalWorkingHour matchingDbRow = null;

                if (matchingProfessional != null && matchingProfessional.ProfessionalWorkingHours != null)
                {
                    matchingDbRow = matchingProfessional.ProfessionalWorkingHours
                                    .FirstOrDefault(i => i.ProfessionalWorkingHourId != new Guid() &&
                                                    i.ProfessionalWorkingHourId == professionalWorkingHourToUpdate.ProfessionalWorkingHourId);
                }

                bool isInsert = false;
                if (matchingDbRow == null)
                {
                    // insert
                    isInsert      = true;
                    matchingDbRow = new ProfessionalWorkingHour();

                    matchingDbRow.ProfessionalWorkingHourId = Guid.NewGuid();
                    matchingDbRow.CreatedDate = now;
                    if (userId == matchingProfessional.ProfessionalUserId)
                    {
                        matchingDbRow.CreatedByProfessionalId = matchingProfessional.ProfessionalId;
                    }
                    else
                    {
                        matchingDbRow.CreatedByProfessionalId = _unitOfWork.ProfessionalsRepository.Get(i => i.ProfessionalUserId == userId).First().ProfessionalId;
                    }
                }

                matchingDbRow.DayOfWeek           = professionalWorkingHourToUpdate.DayOfWeek;
                matchingDbRow.StartTime           = professionalWorkingHourToUpdate.StartTime;
                matchingDbRow.EndTime             = professionalWorkingHourToUpdate.EndTime;
                matchingDbRow.IncludeBankHolidays = professionalWorkingHourToUpdate.IncludeBankHolidays;

                //delete + logging logic.
                if (!matchingDbRow.IsDeleted && professionalWorkingHourToUpdate.IsDeleted)
                {
                    matchingDbRow.IsDeleted = professionalWorkingHourToUpdate.IsDeleted;
                    matchingDbRow.DeletedByProfessionalId = submittingPro.ProfessionalId;
                    matchingDbRow.DeletedDate             = now;
                }
                else if (matchingDbRow.IsDeleted && !professionalWorkingHourToUpdate.IsDeleted)
                {
                    matchingDbRow.IsDeleted = professionalWorkingHourToUpdate.IsDeleted;
                    matchingDbRow.DeletedByProfessionalId = null;
                    matchingDbRow.DeletedDate             = null;
                }

                matchingDbRow.UpdatedByProfessionalId = submittingPro.ProfessionalId;
                matchingDbRow.UpdatedDate             = now;

                matchingDbRow.CompanyLocationGroup = professionalWorkingHourToUpdate.CompanyLocationGroup;

                if (isInsert)
                {
                    _unitOfWork.ProfessionalWorkingHoursRepository.Insert(matchingDbRow);
                }
                else
                {
                    _unitOfWork.ProfessionalWorkingHoursRepository.Update(matchingDbRow);
                }

                index = index + 1;
            }//end foreach

            _unitOfWork.Save();
        }