public void changes_primary_specialty()
        {
            //setup
            var request = new UpdateProviderSpecialtyRequest();
            request.Id = _existingNonPrimaryProviderSpecialtyId;
            request.IsPrimary = true;

            var handler = CreateHandler();

            //act
            var response = HandleRequest<UpdateProviderSpecialtyResponse>(handler, request);

            //assert
            using (var context = _objectContextFactory.CreateObjectContext())
            {
                context.ContextOptions.LazyLoadingEnabled = true;
                context.ContextOptions.ProxyCreationEnabled = true;
                var provider = context.CreateObjectSet<Provider>().Single(p => p.Id == _providerIdWithSpecialty);

                var otherSpecialty = provider.ProviderSpecialties.Single(ps => ps.Id == _existingProviderSpecialtyId);
                Assert.IsFalse(otherSpecialty.IsPrimary);

                var updatedSpecialty = provider.ProviderSpecialties.Single(ps => ps.Id == _existingNonPrimaryProviderSpecialtyId);
                Assert.IsTrue(updatedSpecialty.IsPrimary);
            }
        }
        public void updates_provider_specialty()
        {
            //setup
            var request = new UpdateProviderSpecialtyRequest();
            request.Id = _existingProviderSpecialtyId;
            request.IsBoardCertified = true;
            request.IsPrimary = true;

            var handler = CreateHandler();

            //act
            var response = HandleRequest<UpdateProviderSpecialtyResponse>(handler, request);

            //assert
            using (var context = _objectContextFactory.CreateObjectContext())
            {
                context.ContextOptions.LazyLoadingEnabled = true;
                context.ContextOptions.ProxyCreationEnabled = true;
                var provider = context.CreateObjectSet<Provider>().Single(p => p.Id == _providerIdWithSpecialty);

                var providerSpecialty = provider.ProviderSpecialties.Single(pe => pe.Id == _existingProviderSpecialtyId);
                Assert.AreEqual(request.IsBoardCertified, providerSpecialty.IsBoardCertified);
            }
        }
        public static void Save(ProviderAdminDetailView parent, SubEntity providerSpecialties, int providerId)
        {
            try
            {
                providerSpecialties.ErrorMessage = string.Empty;

                if (providerSpecialties.Records.Count(s => s.Fields.Any(f => f.FieldName == _isPrimary) && bool.Parse(parent.GetFieldValue(s.Fields, _isPrimary))) > 1)
                {
                    throw new BusinessException("Only one Provider Specialty can be set as the primary specialty");
                }

                //Edits
                foreach (var record in providerSpecialties.Records.Where(r => r.Action == RecordActions.Edited))
                {
                    if (parent.GetFieldValue(record.Fields, _specialtyType) == "Specialty")
                    {
                        var request = new UpdateProviderSpecialtyRequest();

                        request.Id = int.Parse(parent.GetFieldValue(record.Fields, _id));
                        request.IsPrimary = bool.Parse(parent.GetFieldValue(record.Fields, _isPrimary));
                        request.IsBoardCertified = bool.Parse(parent.GetFieldValue(record.Fields, _isBoardCertified));

                        parent.ProcessRequest<UpdateProviderSpecialtyResponse>(request);
                    }
                }

                //Existing Records Added
                foreach (var record in providerSpecialties.Records.Where(r => r.Action == RecordActions.Added))
                {
                    var request = new AddProviderSpecialtyRequest()
                    {
                        ProviderId = providerId,
                        SpecialtyId = int.Parse(parent.GetFieldValue(record.Fields, _specialtyId))
                    };

                    if (record.Fields.Any(f => f.FieldName == _isPrimary))
                        request.IsPrimary = bool.Parse(parent.GetFieldValue(record.Fields, _isPrimary));
                    if (record.Fields.Any(f => f.FieldName == _isBoardCertified))
                        request.IsBoardCertified = bool.Parse(parent.GetFieldValue(record.Fields, _isBoardCertified));

                    parent.ProcessRequest<AddProviderSpecialtyResponse>(request);
                }

                //New Records Created
                foreach (var record in providerSpecialties.Records.Where(r => r.Action == RecordActions.New))
                {
                    //Add New Specialty/Condition
                    var addSpecialtyRequest = new AddSpecialtyRequest()
                    {
                        Name = parent.GetFieldValue(record.Fields, _name),
                        SpecialtyType = parent.GetFieldValue(record.Fields, _specialtyType),
                        IsEnabled = true
                    };
                    var addedSpecialtyId = parent.ProcessRequest<AddSpecialtyResponse>(addSpecialtyRequest).Id;

                    //Add newly created specialty to provider
                    var request = new AddProviderSpecialtyRequest()
                    {
                        ProviderId = providerId,
                        SpecialtyId = addedSpecialtyId
                    };

                    if (addSpecialtyRequest.SpecialtyType == "Specialty")
                    {
                        request.IsPrimary = bool.Parse(parent.GetFieldValue(record.Fields, _isPrimary));
                        request.IsBoardCertified = bool.Parse(parent.GetFieldValue(record.Fields, _isBoardCertified));
                    }

                    parent.ProcessRequest<AddProviderSpecialtyResponse>(request);
                }

                //Records Deleted
                foreach (var record in providerSpecialties.Records.Where(r => r.Action == RecordActions.Deleted))
                {
                    var request = new DeleteProviderSpecialtyRequest()
                    {
                        ProviderId = int.Parse(parent.GetFieldValue(record.Fields, _providerId)),
                        SpecialtyId = int.Parse(parent.GetFieldValue(record.Fields, _specialtyId))
                    };
                    parent.ProcessRequest<DeleteProviderSpecialtyResponse>(request);
                }
            }
            catch (Exception ex)
            {
                providerSpecialties.ErrorMessage = ex.Message;
                throw;
            }

            providerSpecialties = BuildSpecialtiesSubEntity(parent, providerId);
        }