/// <summary> /// Creates the attribute field. /// </summary> /// <param name="field">The field.</param> /// <param name="setValue">if set to <c>true</c> [set value].</param> /// <param name="fieldValue">The field value.</param> private void CreateAttributeField( RegistrationTemplateFormField field, bool setValue, object fieldValue ) { if ( field.AttributeId.HasValue ) { var attribute = AttributeCache.Read( field.AttributeId.Value ); string value = string.Empty; if ( setValue && fieldValue != null ) { value = fieldValue.ToString(); } attribute.AddControl( phRegistrantControls.Controls, value, BlockValidationGroup, setValue, true, field.IsRequired, null, string.Empty ); } }
/// <summary> /// Creates the person field. /// </summary> /// <param name="field">The field.</param> /// <param name="setValue">if set to <c>true</c> [set value].</param> /// <param name="fieldValue">The field value.</param> private void CreatePersonField( RegistrationTemplateFormField field, bool setValue, object fieldValue ) { switch ( field.PersonFieldType ) { case RegistrationPersonFieldType.FirstName: { var tbFirstName = new RockTextBox(); tbFirstName.ID = "tbFirstName"; tbFirstName.Label = "First Name"; tbFirstName.Required = field.IsRequired; tbFirstName.ValidationGroup = BlockValidationGroup; tbFirstName.AddCssClass( "js-first-name" ); phRegistrantControls.Controls.Add( tbFirstName ); if ( setValue && fieldValue != null ) { tbFirstName.Text = fieldValue.ToString(); } break; } case RegistrationPersonFieldType.LastName: { var tbLastName = new RockTextBox(); tbLastName.ID = "tbLastName"; tbLastName.Label = "Last Name"; tbLastName.Required = field.IsRequired; tbLastName.ValidationGroup = BlockValidationGroup; phRegistrantControls.Controls.Add( tbLastName ); if ( setValue && fieldValue != null ) { tbLastName.Text = fieldValue.ToString(); } break; } case RegistrationPersonFieldType.Campus: { var cpHomeCampus = new CampusPicker(); cpHomeCampus.ID = "cpHomeCampus"; cpHomeCampus.Label = "Campus"; cpHomeCampus.Required = field.IsRequired; cpHomeCampus.ValidationGroup = BlockValidationGroup; cpHomeCampus.Campuses = CampusCache.All(); phRegistrantControls.Controls.Add( cpHomeCampus ); if ( setValue && fieldValue != null ) { cpHomeCampus.SelectedCampusId = fieldValue.ToString().AsIntegerOrNull(); } break; } case RegistrationPersonFieldType.Address: { var acAddress = new AddressControl(); acAddress.ID = "acAddress"; acAddress.Label = "Address"; acAddress.UseStateAbbreviation = true; acAddress.UseCountryAbbreviation = false; acAddress.Required = field.IsRequired; acAddress.ValidationGroup = BlockValidationGroup; phRegistrantControls.Controls.Add( acAddress ); if ( setValue && fieldValue != null ) { var value = fieldValue.ToString().FromJsonOrNull<Location>(); acAddress.SetValues( value ); } break; } case RegistrationPersonFieldType.Email: { var tbEmail = new EmailBox(); tbEmail.ID = "tbEmail"; tbEmail.Label = "Email"; tbEmail.Required = field.IsRequired; tbEmail.ValidationGroup = BlockValidationGroup; phRegistrantControls.Controls.Add( tbEmail ); if ( setValue && fieldValue != null ) { tbEmail.Text = fieldValue.ToString(); } break; } case RegistrationPersonFieldType.Birthdate: { var bpBirthday = new BirthdayPicker(); bpBirthday.ID = "bpBirthday"; bpBirthday.Label = "Birthday"; bpBirthday.Required = field.IsRequired; bpBirthday.ValidationGroup = BlockValidationGroup; phRegistrantControls.Controls.Add( bpBirthday ); if ( setValue && fieldValue != null ) { var value = fieldValue as DateTime?; bpBirthday.SelectedDate = value; } break; } case RegistrationPersonFieldType.Gender: { var ddlGender = new RockDropDownList(); ddlGender.ID = "ddlGender"; ddlGender.Label = "Gender"; ddlGender.Required = field.IsRequired; ddlGender.ValidationGroup = BlockValidationGroup; ddlGender.BindToEnum<Gender>( false ); // change the 'Unknow' value to be blank instead ddlGender.Items.FindByValue( "0" ).Text = string.Empty; phRegistrantControls.Controls.Add( ddlGender ); if ( setValue && fieldValue != null ) { var value = fieldValue.ToString().ConvertToEnumOrNull<Gender>() ?? Gender.Unknown; ddlGender.SetValue( value.ConvertToInt() ); } break; } case RegistrationPersonFieldType.MaritalStatus: { var ddlMaritalStatus = new RockDropDownList(); ddlMaritalStatus.ID = "ddlMaritalStatus"; ddlMaritalStatus.Label = "Marital Status"; ddlMaritalStatus.Required = field.IsRequired; ddlMaritalStatus.ValidationGroup = BlockValidationGroup; ddlMaritalStatus.BindToDefinedType( DefinedTypeCache.Read( Rock.SystemGuid.DefinedType.PERSON_MARITAL_STATUS.AsGuid() ), true ); phRegistrantControls.Controls.Add( ddlMaritalStatus ); if ( setValue && fieldValue != null ) { var value = fieldValue.ToString().AsInteger(); ddlMaritalStatus.SetValue( value ); } break; } case RegistrationPersonFieldType.MobilePhone: { var dv = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_MOBILE ); if ( dv != null ) { var ppMobile = new PhoneNumberBox(); ppMobile.ID = "ppMobile"; ppMobile.Label = dv.Value; ppMobile.Required = field.IsRequired; ppMobile.ValidationGroup = BlockValidationGroup; ppMobile.CountryCode = PhoneNumber.DefaultCountryCode(); phRegistrantControls.Controls.Add( ppMobile ); if ( setValue && fieldValue != null ) { var value = fieldValue as PhoneNumber; if ( value != null ) { ppMobile.CountryCode = value.CountryCode; ppMobile.Number = value.ToString(); } } } break; } case RegistrationPersonFieldType.HomePhone: { var dv = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_HOME ); if ( dv != null ) { var ppHome = new PhoneNumberBox(); ppHome.ID = "ppHome"; ppHome.Label = dv.Value; ppHome.Required = field.IsRequired; ppHome.ValidationGroup = BlockValidationGroup; ppHome.CountryCode = PhoneNumber.DefaultCountryCode(); phRegistrantControls.Controls.Add( ppHome ); if ( setValue && fieldValue != null ) { var value = fieldValue as PhoneNumber; if ( value != null ) { ppHome.CountryCode = value.CountryCode; ppHome.Number = value.ToString(); } } } break; } case RegistrationPersonFieldType.WorkPhone: { var dv = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_WORK ); if ( dv != null ) { var ppWork = new PhoneNumberBox(); ppWork.ID = "ppWork"; ppWork.Label = dv.Value; ppWork.Required = field.IsRequired; ppWork.ValidationGroup = BlockValidationGroup; ppWork.CountryCode = PhoneNumber.DefaultCountryCode(); phRegistrantControls.Controls.Add( ppWork ); if ( setValue && fieldValue != null ) { var value = fieldValue.ToString().FromJsonOrNull<PhoneNumber>(); if ( value != null ) { ppWork.CountryCode = value.CountryCode; ppWork.Number = value.ToString(); } } } break; } } }
/// <summary> /// Parses the attribute field. /// </summary> /// <param name="field">The field.</param> /// <returns></returns> private object ParseAttributeField( RegistrationTemplateFormField field ) { if ( field.AttributeId.HasValue ) { var attribute = AttributeCache.Read( field.AttributeId.Value ); string fieldId = "attribute_field_" + attribute.Id.ToString(); Control control = phRegistrantControls.FindControl( fieldId ); if ( control != null ) { return attribute.FieldType.Field.GetEditValue( control, attribute.QualifierValues ); } } return null; }
/// <summary> /// Parses the person field. /// </summary> /// <param name="field">The field.</param> /// <returns></returns> private object ParsePersonField( RegistrationTemplateFormField field ) { switch ( field.PersonFieldType ) { case RegistrationPersonFieldType.FirstName: { var tbFirstName = phRegistrantControls.FindControl( "tbFirstName" ) as RockTextBox; string value = tbFirstName != null ? tbFirstName.Text : null; return string.IsNullOrWhiteSpace( value ) ? null : value; } case RegistrationPersonFieldType.LastName: { var tbLastName = phRegistrantControls.FindControl( "tbLastName" ) as RockTextBox; string value = tbLastName != null ? tbLastName.Text : null; return string.IsNullOrWhiteSpace( value ) ? null : value; } case RegistrationPersonFieldType.Campus: { var cpHomeCampus = phRegistrantControls.FindControl( "cpHomeCampus" ) as CampusPicker; return cpHomeCampus != null ? cpHomeCampus.SelectedCampusId : null; } case RegistrationPersonFieldType.Address: { var location = new Location(); var acAddress = phRegistrantControls.FindControl( "acAddress" ) as AddressControl; if ( acAddress != null ) { acAddress.GetValues( location ); return string.IsNullOrWhiteSpace( location.ToString() ) ? null : location.ToJson(); } break; } case RegistrationPersonFieldType.Email: { var tbEmail = phRegistrantControls.FindControl( "tbEmail" ) as EmailBox; string value = tbEmail != null ? tbEmail.Text : null; return string.IsNullOrWhiteSpace( value ) ? null : value; } case RegistrationPersonFieldType.Birthdate: { var bpBirthday = phRegistrantControls.FindControl( "bpBirthday" ) as BirthdayPicker; return bpBirthday != null ? bpBirthday.SelectedDate : null; } case RegistrationPersonFieldType.Gender: { var ddlGender = phRegistrantControls.FindControl( "ddlGender" ) as RockDropDownList; return ddlGender != null ? ddlGender.SelectedValueAsInt() : null; } case RegistrationPersonFieldType.MaritalStatus: { var ddlMaritalStatus = phRegistrantControls.FindControl( "ddlMaritalStatus" ) as RockDropDownList; return ddlMaritalStatus != null ? ddlMaritalStatus.SelectedValueAsInt() : null; } case RegistrationPersonFieldType.MobilePhone: { var phoneNumber = new PhoneNumber(); var ppMobile = phRegistrantControls.FindControl( "ppMobile" ) as PhoneNumberBox; if ( ppMobile != null ) { phoneNumber.CountryCode = PhoneNumber.CleanNumber( ppMobile.CountryCode ); phoneNumber.Number = PhoneNumber.CleanNumber( ppMobile.Number ); return string.IsNullOrWhiteSpace( phoneNumber.Number ) ? null : phoneNumber.ToJson(); } break; } case RegistrationPersonFieldType.HomePhone: { var phoneNumber = new PhoneNumber(); var ppHome = phRegistrantControls.FindControl( "ppHome" ) as PhoneNumberBox; if ( ppHome != null ) { phoneNumber.CountryCode = PhoneNumber.CleanNumber( ppHome.CountryCode ); phoneNumber.Number = PhoneNumber.CleanNumber( ppHome.Number ); return string.IsNullOrWhiteSpace( phoneNumber.Number ) ? null : phoneNumber.ToJson(); } break; } case RegistrationPersonFieldType.WorkPhone: { var phoneNumber = new PhoneNumber(); var ppWork = phRegistrantControls.FindControl( "ppWork" ) as PhoneNumberBox; if ( ppWork != null ) { phoneNumber.CountryCode = PhoneNumber.CleanNumber( ppWork.CountryCode ); phoneNumber.Number = PhoneNumber.CleanNumber( ppWork.Number ); return string.IsNullOrWhiteSpace( phoneNumber.Number ) ? null : phoneNumber.ToJson(); } break; } } return null; }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { ParseControls( true ); var rockContext = new RockContext(); var service = new RegistrationTemplateService( rockContext ); RegistrationTemplate RegistrationTemplate = null; int? RegistrationTemplateId = hfRegistrationTemplateId.Value.AsIntegerOrNull(); if ( RegistrationTemplateId.HasValue ) { RegistrationTemplate = service.Get( RegistrationTemplateId.Value ); } bool newTemplate = false; if ( RegistrationTemplate == null ) { newTemplate = true; RegistrationTemplate = new RegistrationTemplate(); } RegistrationNotify notify = RegistrationNotify.None; foreach( ListItem li in cblNotify.Items ) { if ( li.Selected ) { notify = notify | (RegistrationNotify)li.Value.AsInteger(); } } RegistrationTemplate.IsActive = cbIsActive.Checked; RegistrationTemplate.Name = tbName.Text; RegistrationTemplate.CategoryId = cpCategory.SelectedValueAsInt(); RegistrationTemplate.GroupTypeId = gtpGroupType.SelectedGroupTypeId; RegistrationTemplate.GroupMemberRoleId = rpGroupTypeRole.GroupRoleId; RegistrationTemplate.GroupMemberStatus = ddlGroupMemberStatus.SelectedValueAsEnum<GroupMemberStatus>(); RegistrationTemplate.RequiredSignatureDocumentTemplateId = ddlSignatureDocumentTemplate.SelectedValueAsInt(); RegistrationTemplate.SignatureDocumentAction = cbDisplayInLine.Checked ? SignatureDocumentAction.Embed : SignatureDocumentAction.Email; RegistrationTemplate.RegistrationWorkflowTypeId = wtpRegistrationWorkflow.SelectedValueAsInt(); RegistrationTemplate.Notify = notify; RegistrationTemplate.AddPersonNote = cbAddPersonNote.Checked; RegistrationTemplate.LoginRequired = cbLoginRequired.Checked; RegistrationTemplate.AllowExternalRegistrationUpdates = cbAllowExternalUpdates.Checked; RegistrationTemplate.AllowGroupPlacement = cbAllowGroupPlacement.Checked; RegistrationTemplate.AllowMultipleRegistrants = cbMultipleRegistrants.Checked; RegistrationTemplate.MaxRegistrants = nbMaxRegistrants.Text.AsInteger(); RegistrationTemplate.RegistrantsSameFamily = rblRegistrantsInSameFamily.SelectedValueAsEnum<RegistrantsSameFamily>(); RegistrationTemplate.ShowCurrentFamilyMembers = cbShowCurrentFamilyMembers.Checked; RegistrationTemplate.SetCostOnInstance = !tglSetCostOnTemplate.Checked; RegistrationTemplate.Cost = cbCost.Text.AsDecimal(); RegistrationTemplate.MinimumInitialPayment = cbMinimumInitialPayment.Text.AsDecimalOrNull(); RegistrationTemplate.FinancialGatewayId = fgpFinancialGateway.SelectedValueAsInt(); RegistrationTemplate.BatchNamePrefix = txtBatchNamePrefix.Text; RegistrationTemplate.ConfirmationFromName = tbConfirmationFromName.Text; RegistrationTemplate.ConfirmationFromEmail = tbConfirmationFromEmail.Text; RegistrationTemplate.ConfirmationSubject = tbConfirmationSubject.Text; RegistrationTemplate.ConfirmationEmailTemplate = ceConfirmationEmailTemplate.Text; RegistrationTemplate.ReminderFromName = tbReminderFromName.Text; RegistrationTemplate.ReminderFromEmail = tbReminderFromEmail.Text; RegistrationTemplate.ReminderSubject = tbReminderSubject.Text; RegistrationTemplate.ReminderEmailTemplate = ceReminderEmailTemplate.Text; RegistrationTemplate.PaymentReminderFromName = tbPaymentReminderFromName.Text; RegistrationTemplate.PaymentReminderFromEmail = tbPaymentReminderFromEmail.Text; RegistrationTemplate.PaymentReminderSubject = tbPaymentReminderSubject.Text; RegistrationTemplate.PaymentReminderEmailTemplate = cePaymentReminderEmailTemplate.Text; RegistrationTemplate.PaymentReminderTimeSpan = nbPaymentReminderTimeSpan.Text.AsInteger(); RegistrationTemplate.RegistrationTerm = string.IsNullOrWhiteSpace( tbRegistrationTerm.Text ) ? "Registration" : tbRegistrationTerm.Text; RegistrationTemplate.RegistrantTerm = string.IsNullOrWhiteSpace( tbRegistrantTerm.Text ) ? "Registrant" : tbRegistrantTerm.Text; RegistrationTemplate.FeeTerm = string.IsNullOrWhiteSpace( tbFeeTerm.Text ) ? "Additional Options" : tbFeeTerm.Text; RegistrationTemplate.DiscountCodeTerm = string.IsNullOrWhiteSpace( tbDiscountCodeTerm.Text ) ? "Discount Code" : tbDiscountCodeTerm.Text; RegistrationTemplate.SuccessTitle = tbSuccessTitle.Text; RegistrationTemplate.SuccessText = ceSuccessText.Text; if ( !Page.IsValid || !RegistrationTemplate.IsValid ) { return; } foreach ( var form in FormState ) { if ( !form.IsValid ) { return; } if ( FormFieldsState.ContainsKey( form.Guid ) ) { foreach( var formField in FormFieldsState[ form.Guid ]) { if ( !formField.IsValid ) { return; } } } } // Get the valid group member attributes var group = new Group(); group.GroupTypeId = gtpGroupType.SelectedGroupTypeId ?? 0; var groupMember = new GroupMember(); groupMember.Group = group; groupMember.LoadAttributes(); var validGroupMemberAttributeIds = groupMember.Attributes.Select( a => a.Value.Id ).ToList(); // Remove any group member attributes that are not valid based on selected group type foreach( var fieldList in FormFieldsState.Select( s => s.Value ) ) { foreach( var formField in fieldList .Where( a => a.FieldSource == RegistrationFieldSource.GroupMemberAttribute && a.AttributeId.HasValue && !validGroupMemberAttributeIds.Contains( a.AttributeId.Value ) ) .ToList() ) { fieldList.Remove( formField ); } } // Perform Validation var validationErrors = new List<string>(); if ( ( ( RegistrationTemplate.SetCostOnInstance ?? false ) || RegistrationTemplate.Cost > 0 || FeeState.Any() ) && !RegistrationTemplate.FinancialGatewayId.HasValue ) { validationErrors.Add( "A Financial Gateway is required when the registration has a cost or additional fees or is configured to allow instances to set a cost." ); } if ( validationErrors.Any() ) { nbValidationError.Visible = true; nbValidationError.Text = "<ul class='list-unstyled'><li>" + validationErrors.AsDelimited( "</li><li>" ) + "</li></ul>"; } else { // Save the entity field changes to registration template if ( RegistrationTemplate.Id.Equals( 0 ) ) { service.Add( RegistrationTemplate ); } rockContext.SaveChanges(); var attributeService = new AttributeService( rockContext ); var registrationTemplateFormService = new RegistrationTemplateFormService( rockContext ); var registrationTemplateFormFieldService = new RegistrationTemplateFormFieldService( rockContext ); var registrationTemplateDiscountService = new RegistrationTemplateDiscountService( rockContext ); var registrationTemplateFeeService = new RegistrationTemplateFeeService( rockContext ); var registrationRegistrantFeeService = new RegistrationRegistrantFeeService( rockContext ); var groupService = new GroupService( rockContext ); // delete forms that aren't assigned in the UI anymore var formUiGuids = FormState.Select( f => f.Guid ).ToList(); foreach ( var form in registrationTemplateFormService .Queryable() .Where( f => f.RegistrationTemplateId == RegistrationTemplate.Id && !formUiGuids.Contains( f.Guid ) ) ) { foreach( var formField in form.Fields.ToList() ) { form.Fields.Remove( formField ); registrationTemplateFormFieldService.Delete( formField ); } registrationTemplateFormService.Delete( form ); } // delete fields that aren't assigned in the UI anymore var fieldUiGuids = FormFieldsState.SelectMany( a => a.Value).Select( f => f.Guid ).ToList(); foreach ( var formField in registrationTemplateFormFieldService .Queryable() .Where( a => formUiGuids.Contains( a.RegistrationTemplateForm.Guid ) && !fieldUiGuids.Contains( a.Guid ) ) ) { registrationTemplateFormFieldService.Delete( formField ); } // delete discounts that aren't assigned in the UI anymore var discountUiGuids = DiscountState.Select( u => u.Guid ).ToList(); foreach ( var discount in registrationTemplateDiscountService .Queryable() .Where( d => d.RegistrationTemplateId == RegistrationTemplate.Id && !discountUiGuids.Contains( d.Guid ) ) ) { registrationTemplateDiscountService.Delete( discount ); } // delete fees that aren't assigned in the UI anymore var feeUiGuids = FeeState.Select( u => u.Guid ).ToList(); var deletedfees = registrationTemplateFeeService .Queryable() .Where( d => d.RegistrationTemplateId == RegistrationTemplate.Id && !feeUiGuids.Contains( d.Guid ) ) .ToList(); var deletedFeeIds = deletedfees.Select( f => f.Id ).ToList(); foreach ( var registrantFee in registrationRegistrantFeeService .Queryable() .Where( f => deletedFeeIds.Contains( f.RegistrationTemplateFeeId ) ) .ToList() ) { registrationRegistrantFeeService.Delete( registrantFee ); } foreach ( var fee in deletedfees ) { registrationTemplateFeeService.Delete( fee ); } int? entityTypeId = EntityTypeCache.Read( typeof( Rock.Model.RegistrationRegistrant ) ).Id; var qualifierColumn = "RegistrationTemplateId"; var qualifierValue = RegistrationTemplate.Id.ToString(); // Get the registration attributes still in the UI var attributesUI = FormFieldsState .SelectMany( s => s.Value.Where( a => a.FieldSource == RegistrationFieldSource.RegistrationAttribute && a.Attribute != null ) ) .Select( f => f.Attribute ) .ToList(); var selectedAttributeGuids = attributesUI.Select( a => a.Guid ); // Delete the registration attributes that were removed from the UI var attributesDB = attributeService.Get( entityTypeId, qualifierColumn, qualifierValue ); foreach ( var attr in attributesDB.Where( a => !selectedAttributeGuids.Contains( a.Guid ) ).ToList() ) { attributeService.Delete( attr ); Rock.Web.Cache.AttributeCache.Flush( attr.Id ); } rockContext.SaveChanges(); // Save all of the registration attributes still in the UI foreach ( var attr in attributesUI ) { Helper.SaveAttributeEdits( attr, entityTypeId, qualifierColumn, qualifierValue, rockContext ); } // add/updated forms/fields foreach ( var formUI in FormState ) { var form = RegistrationTemplate.Forms.FirstOrDefault( f => f.Guid.Equals( formUI.Guid ) ); if ( form == null ) { form = new RegistrationTemplateForm(); form.Guid = formUI.Guid; RegistrationTemplate.Forms.Add( form ); } form.Name = formUI.Name; form.Order = formUI.Order; if ( FormFieldsState.ContainsKey( form.Guid ) ) { foreach ( var formFieldUI in FormFieldsState[form.Guid] ) { var formField = form.Fields.FirstOrDefault( a => a.Guid.Equals( formFieldUI.Guid ) ); if ( formField == null ) { formField = new RegistrationTemplateFormField(); formField.Guid = formFieldUI.Guid; form.Fields.Add( formField ); } formField.AttributeId = formFieldUI.AttributeId; if ( !formField.AttributeId.HasValue && formFieldUI.FieldSource == RegistrationFieldSource.RegistrationAttribute && formFieldUI.Attribute != null ) { var attr = AttributeCache.Read( formFieldUI.Attribute.Guid, rockContext ); if ( attr != null ) { formField.AttributeId = attr.Id; } } formField.FieldSource = formFieldUI.FieldSource; formField.PersonFieldType = formFieldUI.PersonFieldType; formField.IsInternal = formFieldUI.IsInternal; formField.IsSharedValue = formFieldUI.IsSharedValue; formField.ShowCurrentValue = formFieldUI.ShowCurrentValue; formField.PreText = formFieldUI.PreText; formField.PostText = formFieldUI.PostText; formField.IsGridField = formFieldUI.IsGridField; formField.IsRequired = formFieldUI.IsRequired; formField.Order = formFieldUI.Order; } } } // add/updated discounts foreach ( var discountUI in DiscountState ) { var discount = RegistrationTemplate.Discounts.FirstOrDefault( a => a.Guid.Equals( discountUI.Guid ) ); if ( discount == null ) { discount = new RegistrationTemplateDiscount(); discount.Guid = discountUI.Guid; RegistrationTemplate.Discounts.Add( discount ); } discount.Code = discountUI.Code; discount.DiscountPercentage = discountUI.DiscountPercentage; discount.DiscountAmount = discountUI.DiscountAmount; discount.Order = discountUI.Order; } // add/updated fees foreach ( var feeUI in FeeState ) { var fee = RegistrationTemplate.Fees.FirstOrDefault( a => a.Guid.Equals( feeUI.Guid ) ); if ( fee == null ) { fee = new RegistrationTemplateFee(); fee.Guid = feeUI.Guid; RegistrationTemplate.Fees.Add( fee ); } fee.Name = feeUI.Name; fee.FeeType = feeUI.FeeType; fee.CostValue = feeUI.CostValue; fee.DiscountApplies = feeUI.DiscountApplies; fee.AllowMultiple = feeUI.AllowMultiple; fee.Order = feeUI.Order; } rockContext.SaveChanges(); AttributeCache.FlushEntityAttributes(); // If this is a new template, give the current user and the Registration Administrators role administrative // rights to this template, and staff, and staff like roles edit rights if ( newTemplate ) { RegistrationTemplate.AllowPerson( Authorization.ADMINISTRATE, CurrentPerson, rockContext ); var registrationAdmins = groupService.Get( Rock.SystemGuid.Group.GROUP_EVENT_REGISTRATION_ADMINISTRATORS.AsGuid() ); RegistrationTemplate.AllowSecurityRole( Authorization.ADMINISTRATE, registrationAdmins, rockContext ); var staffLikeUsers = groupService.Get( Rock.SystemGuid.Group.GROUP_STAFF_LIKE_MEMBERS.AsGuid() ); RegistrationTemplate.AllowSecurityRole( Authorization.EDIT, staffLikeUsers, rockContext ); var staffUsers = groupService.Get( Rock.SystemGuid.Group.GROUP_STAFF_MEMBERS.AsGuid() ); RegistrationTemplate.AllowSecurityRole( Authorization.EDIT, staffUsers, rockContext ); } var qryParams = new Dictionary<string, string>(); qryParams["RegistrationTemplateId"] = RegistrationTemplate.Id.ToString(); NavigateToPage( RockPage.Guid, qryParams ); } }
/// <summary> /// Handles the SaveClick event of the dlgField control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void dlgField_SaveClick( object sender, EventArgs e ) { var formGuid = hfFormGuid.Value.AsGuid(); var attributeGuid = hfAttributeGuid.Value.AsGuid(); if ( FormFieldsState.ContainsKey( formGuid ) ) { var attributeForm = FormFieldsState[formGuid].FirstOrDefault( a => a.Guid.Equals( attributeGuid ) ); if ( attributeForm == null ) { attributeForm = new RegistrationTemplateFormField(); attributeForm.Order = FormFieldsState[formGuid].Any() ? FormFieldsState[formGuid].Max( a => a.Order ) + 1 : 0; attributeForm.Guid = attributeGuid; FormFieldsState[formGuid].Add( attributeForm ); } attributeForm.PreText = ceAttributePreText.Text; attributeForm.PostText = ceAttributePostText.Text; attributeForm.FieldSource = ddlFieldSource.SelectedValueAsEnum<RegistrationFieldSource>(); if ( ddlPersonField.Visible ) { attributeForm.PersonFieldType = ddlPersonField.SelectedValueAsEnum<RegistrationPersonFieldType>(); } attributeForm.IsInternal = cbInternalField.Checked; attributeForm.IsSharedValue = cbCommonValue.Checked; int? attributeId = null; switch ( attributeForm.FieldSource ) { case RegistrationFieldSource.PersonField: { attributeForm.ShowCurrentValue = cbUsePersonCurrentValue.Checked; attributeForm.IsGridField = cbShowOnGrid.Checked; attributeForm.IsRequired = cbRequireInInitialEntry.Checked; break; } case RegistrationFieldSource.PersonAttribute: { attributeId = ddlPersonAttributes.SelectedValueAsInt(); attributeForm.ShowCurrentValue = cbUsePersonCurrentValue.Checked; attributeForm.IsGridField = cbShowOnGrid.Checked; attributeForm.IsRequired = cbRequireInInitialEntry.Checked; break; } case RegistrationFieldSource.GroupMemberAttribute: { attributeId = ddlGroupTypeAttributes.SelectedValueAsInt(); attributeForm.ShowCurrentValue = false; attributeForm.IsGridField = cbShowOnGrid.Checked; attributeForm.IsRequired = cbRequireInInitialEntry.Checked; break; } case RegistrationFieldSource.RegistrationAttribute: { Rock.Model.Attribute attribute = new Rock.Model.Attribute(); edtRegistrationAttribute.GetAttributeProperties( attribute ); attributeForm.Attribute = attribute; attributeForm.Id = attribute.Id; attributeForm.ShowCurrentValue = false; attributeForm.IsGridField = attribute.IsGridColumn; attributeForm.IsRequired = attribute.IsRequired; break; } } if ( attributeId.HasValue ) { using ( var rockContext = new RockContext() ) { var attribute = new AttributeService( rockContext ).Get( attributeId.Value ); if ( attribute != null ) { attributeForm.Attribute = attribute.Clone( false ); attributeForm.Attribute.FieldType = attribute.FieldType.Clone( false ); attributeForm.AttributeId = attribute.Id; } } } } HideDialog(); BuildControls( true ); }
/// <summary> /// Shows the form field edit. /// </summary> /// <param name="formGuid">The form unique identifier.</param> /// <param name="formFieldGuid">The form field unique identifier.</param> private void ShowFormFieldEdit( Guid formGuid, Guid formFieldGuid ) { if ( FormFieldsState.ContainsKey( formGuid ) ) { ShowDialog( "Attributes" ); var fieldList = FormFieldsState[formGuid]; RegistrationTemplateFormField formField = fieldList.FirstOrDefault( a => a.Guid.Equals( formFieldGuid ) ); if ( formField == null ) { formField = new RegistrationTemplateFormField(); formField.Guid = formFieldGuid; formField.FieldSource = RegistrationFieldSource.PersonAttribute; } ceAttributePreText.Text = formField.PreText; ceAttributePostText.Text = formField.PostText; ddlFieldSource.SetValue( formField.FieldSource.ConvertToInt() ); ddlPersonField.SetValue( formField.PersonFieldType.ConvertToInt() ); lPersonField.Text = formField.PersonFieldType.ConvertToString(); ddlPersonAttributes.Items.Clear(); var person = new Person(); person.LoadAttributes(); foreach ( var attr in person.Attributes .OrderBy( a => a.Value.Name ) .Select( a => a.Value ) ) { if ( attr.IsAuthorized( Authorization.VIEW, CurrentPerson ) ) { ddlPersonAttributes.Items.Add( new ListItem( attr.Name, attr.Id.ToString() ) ); } } ddlGroupTypeAttributes.Items.Clear(); var group = new Group(); group.GroupTypeId = gtpGroupType.SelectedGroupTypeId ?? 0; var groupMember = new GroupMember(); groupMember.Group = group; groupMember.LoadAttributes(); foreach ( var attr in groupMember.Attributes .OrderBy( a => a.Value.Name ) .Select( a => a.Value ) ) { if ( attr.IsAuthorized( Authorization.VIEW, CurrentPerson ) ) { ddlGroupTypeAttributes.Items.Add( new ListItem( attr.Name, attr.Id.ToString() ) ); } } var attribute = new Attribute(); attribute.FieldTypeId = FieldTypeCache.Read( Rock.SystemGuid.FieldType.TEXT ).Id; if ( formField.FieldSource == RegistrationFieldSource.PersonAttribute ) { ddlPersonAttributes.SetValue( formField.AttributeId ); } else if ( formField.FieldSource == RegistrationFieldSource.GroupMemberAttribute ) { ddlGroupTypeAttributes.SetValue( formField.AttributeId ); } else if ( formField.FieldSource == RegistrationFieldSource.RegistrationAttribute ) { if ( formField.Attribute != null ) { attribute = formField.Attribute; } } edtRegistrationAttribute.SetAttributeProperties( attribute, typeof( RegistrationTemplate ) ); cbInternalField.Checked = formField.IsInternal; cbShowOnGrid.Checked = formField.IsGridField; cbRequireInInitialEntry.Checked = formField.IsRequired; cbUsePersonCurrentValue.Checked = formField.ShowCurrentValue; cbCommonValue.Checked = formField.IsSharedValue; hfFormGuid.Value = formGuid.ToString(); hfAttributeGuid.Value = formFieldGuid.ToString(); lPersonField.Visible = formField.FieldSource == RegistrationFieldSource.PersonField && ( formField.PersonFieldType == RegistrationPersonFieldType.FirstName || formField.PersonFieldType == RegistrationPersonFieldType.LastName ); SetFieldDisplay(); } BuildControls( true ); }
/// <summary> /// Loads the state details. /// </summary> /// <param name="RegistrationTemplate">The registration template.</param> /// <param name="rockContext">The rock context.</param> private void LoadStateDetails( RegistrationTemplate RegistrationTemplate, RockContext rockContext ) { if ( RegistrationTemplate != null ) { // If no forms, add at one if ( !RegistrationTemplate.Forms.Any() ) { var form = new RegistrationTemplateForm(); form.Guid = Guid.NewGuid(); form.Order = 0; form.Name = "Default Form"; RegistrationTemplate.Forms.Add( form ); } var defaultForm = RegistrationTemplate.Forms.First(); // Add first name field if it doesn't exist if ( !defaultForm.Fields .Any( f => f.FieldSource == RegistrationFieldSource.PersonField && f.PersonFieldType == RegistrationPersonFieldType.FirstName )) { var formField = new RegistrationTemplateFormField(); formField.FieldSource = RegistrationFieldSource.PersonField; formField.PersonFieldType = RegistrationPersonFieldType.FirstName; formField.IsGridField = true; formField.IsRequired = true; formField.PreText = @"<div class='row'> <div class='col-md-6'> "; formField.PostText = " </div>"; formField.Order = defaultForm.Fields.Any() ? defaultForm.Fields.Max( f => f.Order ) + 1 : 0; defaultForm.Fields.Add( formField ); } // Add last name field if it doesn't exist if ( !defaultForm.Fields .Any( f => f.FieldSource == RegistrationFieldSource.PersonField && f.PersonFieldType == RegistrationPersonFieldType.LastName ) ) { var formField = new RegistrationTemplateFormField(); formField.FieldSource = RegistrationFieldSource.PersonField; formField.PersonFieldType = RegistrationPersonFieldType.LastName; formField.IsGridField = true; formField.IsRequired = true; formField.PreText = " <div class='col-md-6'>"; formField.PostText = @" </div> </div>"; formField.Order = defaultForm.Fields.Any() ? defaultForm.Fields.Max( f => f.Order ) + 1 : 0; defaultForm.Fields.Add( formField ); } FormState = new List<RegistrationTemplateForm>(); FormFieldsState = new Dictionary<Guid, List<RegistrationTemplateFormField>>(); foreach ( var form in RegistrationTemplate.Forms.OrderBy( f => f.Order ) ) { FormState.Add( form.Clone( false ) ); FormFieldsState.Add( form.Guid, form.Fields.ToList() ); } DiscountState = RegistrationTemplate.Discounts.OrderBy( a => a.Order ).ToList(); FeeState = RegistrationTemplate.Fees.OrderBy( a => a.Order ).ToList(); } else { FormState = new List<RegistrationTemplateForm>(); FormFieldsState = new Dictionary<Guid, List<RegistrationTemplateFormField>>(); DiscountState = new List<RegistrationTemplateDiscount>(); FeeState = new List<RegistrationTemplateFee>(); } }
/// <summary> /// Adds any registration templates given in the XML file. /// </summary> /// <param name="elemFamilies"></param> /// <param name="rockContext"></param> private void AddRegistrationTemplates( XElement elemRegistrationTemplates, RockContext rockContext ) { if ( elemRegistrationTemplates == null ) { return; } // Get attribute values from RegistrationTemplateDetail block // Get instance of the attribute. string defaultConfirmationEmail = string.Empty; string defaultReminderEmail = string.Empty; string defaultSuccessText = string.Empty; string defaultPaymentReminderEmail = string.Empty; //CodeEditorFieldAttribute MyAttribute = (CodeEditorFieldAttribute)System.Attribute.GetCustomAttribute( typeof( RockWeb.Blocks.Event.RegistrationTemplateDetail ), typeof( CodeEditorFieldAttribute ) ); var blockAttributes = System.Attribute.GetCustomAttributes( typeof( RockWeb.Blocks.Event.RegistrationTemplateDetail ), typeof( CodeEditorFieldAttribute ) ); foreach ( CodeEditorFieldAttribute blockAttribute in blockAttributes ) { switch ( blockAttribute.Name ) { case "Default Confirmation Email": defaultConfirmationEmail = blockAttribute.DefaultValue; break; case "Default Reminder Email": defaultReminderEmail = blockAttribute.DefaultValue; break; case "Default Success Text": defaultSuccessText = blockAttribute.DefaultValue; break; case "Default Payment Reminder Email": defaultPaymentReminderEmail = blockAttribute.DefaultValue; break; default: break; } } RegistrationTemplateService registrationTemplateService = new RegistrationTemplateService( rockContext ); // Add a template for each... foreach ( var element in elemRegistrationTemplates.Elements( "registrationTemplate" ) ) { // skip any illegally formatted items if ( element.Attribute( "guid" ) == null ) { continue; } int categoryId = CategoryCache.Read( element.Attribute( "categoryGuid" ).Value.Trim().AsGuid() ).Id; // Find the group type and var groupType = GroupTypeCache.Read( element.Attribute( "groupTypeGuid" ).Value.Trim().AsGuid() ); RegistrantsSameFamily registrantsSameFamily; if ( element.Attribute( "registrantsInSameFamily" ) != null ) { Enum.TryParse( element.Attribute( "registrantsInSameFamily" ).Value.Trim(), out registrantsSameFamily ); } else { registrantsSameFamily = RegistrantsSameFamily.Ask; } bool setCostOnInstance = true; if ( element.Attribute( "setCostOn" ).Value.Trim() == "template" ) { setCostOnInstance = false; } RegistrationNotify notify = RegistrationNotify.None; RegistrationNotify matchNotify; foreach ( string item in element.Attribute( "notify" ).Value.SplitDelimitedValues( whitespace: false ) ) { if ( Enum.TryParse( item.Replace( " ", string.Empty ), out matchNotify ) ) { notify = notify | matchNotify; } } // Now find the matching financial gateway FinancialGatewayService financialGatewayService = new FinancialGatewayService( rockContext ); string gatewayName = element.Attribute( "financialGateway" ) != null ? element.Attribute( "financialGateway" ).Value : "Test Gateway"; var financialGateway = financialGatewayService.Queryable() .Where( g => g.Name == gatewayName ) .FirstOrDefault(); RegistrationTemplate registrationTemplate = new RegistrationTemplate() { Guid = element.Attribute( "guid" ).Value.Trim().AsGuid(), Name = element.Attribute( "name" ).Value.Trim(), IsActive = true, CategoryId = categoryId, GroupTypeId = groupType.Id, GroupMemberRoleId = groupType.DefaultGroupRoleId, GroupMemberStatus = GroupMemberStatus.Active, Notify = notify, AddPersonNote = element.Attribute( "addPersonNote" ) != null ? element.Attribute( "addPersonNote" ).Value.AsBoolean() : false, LoginRequired = element.Attribute( "loginRequired" ) != null ? element.Attribute( "loginRequired" ).Value.AsBoolean() : false, AllowExternalRegistrationUpdates = element.Attribute( "allowExternalUpdatesToSavedRegistrations" ) != null ? element.Attribute( "allowExternalUpdatesToSavedRegistrations" ).Value.AsBoolean() : false, AllowGroupPlacement = element.Attribute( "allowGroupPlacement" ) != null ? element.Attribute( "allowGroupPlacement" ).Value.AsBoolean() : false, AllowMultipleRegistrants = element.Attribute( "allowMultipleRegistrants" ) != null ? element.Attribute( "allowMultipleRegistrants" ).Value.AsBoolean() : false, MaxRegistrants = element.Attribute( "maxRegistrants" ).Value.AsInteger(), RegistrantsSameFamily = registrantsSameFamily, SetCostOnInstance = setCostOnInstance, FinancialGatewayId = financialGateway.Id, BatchNamePrefix = element.Attribute( "batchNamePrefix" ) != null ? element.Attribute( "batchNamePrefix" ).Value.Trim() : string.Empty, Cost = element.Attribute( "cost" ).Value.AsDecimal(), MinimumInitialPayment = element.Attribute( "minInitialPayment" ).Value.AsDecimal(), RegistrationTerm = element.Attribute( "registrationTerm" ) != null ? element.Attribute( "registrationTerm" ).Value.Trim() : "Registration", RegistrantTerm = element.Attribute( "registrantTerm" ) != null ? element.Attribute( "registrantTerm" ).Value.Trim() : "Registrant", FeeTerm = element.Attribute( "feeTerm" ) != null ? element.Attribute( "feeTerm" ).Value.Trim() : "Additional Options", DiscountCodeTerm = element.Attribute( "discountCodeTerm" ) != null ? element.Attribute( "discountCodeTerm" ).Value.Trim() : "Discount Code", ConfirmationFromName = "{{ RegistrationInstance.ContactPersonAlias.Person.FullName }}", ConfirmationFromEmail = "{{ RegistrationInstance.ContactEmail }}", ConfirmationSubject = "{{ RegistrationInstance.Name }} Confirmation", ConfirmationEmailTemplate = defaultConfirmationEmail, ReminderFromName = "{{ RegistrationInstance.ContactPersonAlias.Person.FullName }}", ReminderFromEmail = "{{ RegistrationInstance.ContactEmail }}", ReminderSubject = "{{ RegistrationInstance.Name }} Reminder", ReminderEmailTemplate = defaultReminderEmail, SuccessTitle = "Congratulations {{ Registration.FirstName }}", SuccessText = defaultSuccessText, PaymentReminderEmailTemplate = defaultPaymentReminderEmail, PaymentReminderFromEmail = "{{ RegistrationInstance.ContactEmail }}", PaymentReminderFromName = "{{ RegistrationInstance.ContactPersonAlias.Person.FullName }}", PaymentReminderSubject = "{{ RegistrationInstance.Name }} Payment Reminder", PaymentReminderTimeSpan = element.Attribute( "paymentReminderTimeSpan" ) != null ? element.Attribute( "paymentReminderTimeSpan" ).Value.AsInteger() : 0, CreatedDateTime = RockDateTime.Now, ModifiedDateTime = RockDateTime.Now, }; registrationTemplateService.Add( registrationTemplate ); rockContext.SaveChanges(); var x = registrationTemplate.Id; string name = element.Attribute( "name" ).Value.Trim(); bool allowExternalUpdatesToSavedRegistrations = element.Attribute( "allowExternalUpdatesToSavedRegistrations" ).Value.AsBoolean(); bool addPersonNote = element.Attribute( "addPersonNote" ).Value.AsBoolean(); bool loginRequired = element.Attribute( "loginRequired" ).Value.AsBoolean(); Guid guid = element.Attribute( "guid" ).Value.Trim().AsGuid(); // Find any Form elements and add them to the template int formOrder = 0; var registrationAttributeQualifierColumn = "RegistrationTemplateId"; int? registrationRegistrantEntityTypeId = EntityTypeCache.Read( typeof( Rock.Model.RegistrationRegistrant ) ).Id; if ( element.Elements( "forms" ).Count() > 0 ) { foreach ( var formElement in element.Elements( "forms" ).Elements( "form" ) ) { formOrder++; var form = new RegistrationTemplateForm(); form.Guid = formElement.Attribute( "guid" ).Value.Trim().AsGuid(); registrationTemplate.Forms.Add( form ); form.Name = formElement.Attribute( "name" ).Value.Trim(); form.Order = formOrder; int ffOrder = 0; if ( formElement.Elements( "formFields" ).Count() > 0 ) { foreach ( var formFieldElement in formElement.Elements( "formFields" ).Elements( "field" ) ) { ffOrder++; var formField = new RegistrationTemplateFormField(); formField.Guid = Guid.NewGuid(); formField.CreatedDateTime = RockDateTime.Now; form.Fields.Add( formField ); switch ( formFieldElement.Attribute( "source" ).Value.Trim().ToLowerInvariant() ) { case "person field": formField.FieldSource = RegistrationFieldSource.PersonField; break; case "person attribute": formField.FieldSource = RegistrationFieldSource.PersonAttribute; break; case "group member attribute": formField.FieldSource = RegistrationFieldSource.GroupMemberAttribute; break; case "registration attribute": formField.FieldSource = RegistrationFieldSource.RegistrationAttribute; //var qualifierValue = RegistrationTemplate.Id.ToString(); var attrState = new Rock.Model.Attribute(); attrState.Guid = formFieldElement.Attribute( "guid" ).Value.AsGuid(); attrState.Name = formFieldElement.Attribute( "name" ).Value.Trim(); attrState.Key = attrState.Name.RemoveSpecialCharacters().Replace( " ", string.Empty ); var type = formFieldElement.Attribute( "type" ).Value.Trim(); var fieldType = FieldTypeCache.All().Where( f => f.Name == type ).FirstOrDefault(); attrState.FieldTypeId = fieldType.Id; var attribute = Helper.SaveAttributeEdits( attrState, registrationRegistrantEntityTypeId, registrationAttributeQualifierColumn, registrationTemplate.Id.ToString(), rockContext ); //rockContext.ChangeTracker.DetectChanges(); rockContext.SaveChanges( disablePrePostProcessing: true ); formField.Attribute = attribute; break; default: throw new NotSupportedException( string.Format( "unknown form field source: {0}", formFieldElement.Attribute( "source" ).Value ) ); } formField.AttributeId = null; if ( !formField.AttributeId.HasValue && formField.FieldSource == RegistrationFieldSource.RegistrationAttribute && formField.Attribute != null ) { var attr = AttributeCache.Read( formField.Attribute.Guid, rockContext ); if ( attr != null ) { formField.AttributeId = attr.Id; } } RegistrationPersonFieldType registrationPersonFieldType; if ( formField.FieldSource == RegistrationFieldSource.PersonField && formFieldElement.Attribute( "name" ) != null && Enum.TryParse( formFieldElement.Attribute( "name" ).Value.Replace( " ", string.Empty ).Trim(), out registrationPersonFieldType ) ) { formField.PersonFieldType = registrationPersonFieldType; } formField.IsInternal = formFieldElement.Attribute( "isInternal" ) != null ? formFieldElement.Attribute( "isInternal" ).Value.AsBoolean() : false; formField.IsSharedValue = formFieldElement.Attribute( "isCommon" ) != null ? formFieldElement.Attribute( "isCommon" ).Value.AsBoolean() : false; formField.ShowCurrentValue = formFieldElement.Attribute( "showCurrentValue" ) != null ? formFieldElement.Attribute( "showCurrentValue" ).Value.AsBoolean() : false; formField.PreText = formFieldElement.Attribute( "preText" ) != null ? formFieldElement.Attribute( "preText" ).Value : string.Empty; formField.PostText = formFieldElement.Attribute( "postText" ) != null ? formFieldElement.Attribute( "postText" ).Value : string.Empty; formField.IsGridField = formFieldElement.Attribute( "showOnGrid" ) != null ? formFieldElement.Attribute( "showOnGrid" ).Value.AsBoolean() : false; formField.IsRequired = formFieldElement.Attribute( "isRequired" ) != null ? formFieldElement.Attribute( "isRequired" ).Value.AsBoolean() : false; formField.Order = ffOrder; formField.CreatedDateTime = RockDateTime.Now; } } } } // Discounts int discountOrder = 0; if ( element.Elements( "discounts" ) != null ) { foreach ( var discountElement in element.Elements( "discounts" ).Elements( "discount" ) ) { discountOrder++; var discount = new RegistrationTemplateDiscount(); discount.Guid = Guid.NewGuid(); registrationTemplate.Discounts.Add( discount ); discount.Code = discountElement.Attribute( "code" ).Value; switch ( discountElement.Attribute( "type" ).Value.Trim().ToLowerInvariant() ) { case "percentage": discount.DiscountPercentage = discountElement.Attribute( "value" ).Value.Trim().AsDecimal() * 0.01m; discount.DiscountAmount = 0.0m; break; case "amount": discount.DiscountPercentage = 0.0m; discount.DiscountAmount = discountElement.Attribute( "value" ).Value.Trim().AsDecimal(); break; default: throw new NotSupportedException( string.Format( "unknown discount type: {0}", discountElement.Attribute( "type" ).Value ) ); } discount.Order = discountOrder; } } // Fees int feeOrder = 0; if ( element.Elements( "fees" ) != null ) { foreach ( var feeElement in element.Elements( "fees" ).Elements( "fee" ) ) { feeOrder++; var fee = new RegistrationTemplateFee(); fee.Guid = Guid.NewGuid(); registrationTemplate.Fees.Add( fee ); switch ( feeElement.Attribute( "type" ).Value.Trim().ToLowerInvariant() ) { case "multiple": fee.FeeType = RegistrationFeeType.Multiple; fee.CostValue = FormatMultipleFeeCosts( feeElement.Elements( "option" ) ); break; case "single": fee.FeeType = RegistrationFeeType.Single; fee.CostValue = feeElement.Attribute( "cost" ).Value.Trim(); break; default: throw new NotSupportedException( string.Format( "unknown fee type: {0}", feeElement.Attribute( "type" ).Value ) ); } fee.Name = feeElement.Attribute( "name" ).Value.Trim(); fee.DiscountApplies = feeElement.Attribute( "discountApplies" ).Value.AsBoolean(); fee.AllowMultiple = feeElement.Attribute( "enableQuantity" ).Value.AsBoolean(); fee.Order = feeOrder; } } } }
private Control BuildRegistrantFieldControl( RegistrationTemplateFormField field, RegistrantInfo registrant, bool setValues ) { // Ignore the first/last name fields since they are displayed in the panel's heading if ( field.FieldSource == RegistrationFieldSource.PersonField && ( field.PersonFieldType == RegistrationPersonFieldType.FirstName || field.PersonFieldType == RegistrationPersonFieldType.LastName ) ) { return null; } object fieldValue = null; if ( registrant != null && registrant.FieldValues != null && registrant.FieldValues.ContainsKey( field.Id ) ) { fieldValue = registrant.FieldValues[field.Id]; } var rlField = new RockLiteral(); rlField.ID = string.Format( "rlField_{0}_{1}", registrant.Id, field.Id ); if ( fieldValue != null ) { if ( field.FieldSource == RegistrationFieldSource.PersonField ) { rlField.Label = field.PersonFieldType.ConvertToString( true ); switch ( field.PersonFieldType ) { case RegistrationPersonFieldType.Campus: { var campus = CampusCache.Read( fieldValue.ToString().AsInteger() ); rlField.Text = campus != null ? campus.Name : string.Empty; break; } case RegistrationPersonFieldType.Address: { var location = fieldValue.ToString().FromJsonOrNull<Location>(); rlField.Text = location != null ? location.ToString() : string.Empty; break; } case RegistrationPersonFieldType.Email: { rlField.Text = fieldValue.ToString(); break; } case RegistrationPersonFieldType.Birthdate: { var birthDate = fieldValue as DateTime?; rlField.Text = birthDate != null ? birthDate.Value.ToShortDateString() : string.Empty; break; } case RegistrationPersonFieldType.Gender: { var gender = fieldValue.ToString().ConvertToEnumOrNull<Gender>() ?? Gender.Unknown; rlField.Text = gender.ConvertToString(); break; } case RegistrationPersonFieldType.MaritalStatus: { var maritalStatusDv = DefinedValueCache.Read( fieldValue.ToString().AsInteger() ); rlField.Text = maritalStatusDv != null ? maritalStatusDv.Value : string.Empty; break; } case RegistrationPersonFieldType.MobilePhone: case RegistrationPersonFieldType.HomePhone: case RegistrationPersonFieldType.WorkPhone: { var pn = fieldValue as PhoneNumber; rlField.Text = pn != null ? pn.NumberFormatted : string.Empty; break; } } } else { if ( field.AttributeId.HasValue ) { var attribute = AttributeCache.Read( field.AttributeId.Value ); if ( attribute == null ) { return null; } rlField.Label = attribute.Name; rlField.Text = attribute.FieldType.Field.FormatValueAsHtml( null, fieldValue.ToString(), attribute.QualifierValues ); } } } return rlField; }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { ParseControls( true ); var rockContext = new RockContext(); var service = new RegistrationTemplateService( rockContext ); RegistrationTemplate RegistrationTemplate = null; int? RegistrationTemplateId = hfRegistrationTemplateId.Value.AsIntegerOrNull(); if ( RegistrationTemplateId.HasValue ) { RegistrationTemplate = service.Get( RegistrationTemplateId.Value ); } if ( RegistrationTemplate == null ) { RegistrationTemplate = new RegistrationTemplate(); } RegistrationNotify notify = RegistrationNotify.None; foreach( ListItem li in cblNotify.Items ) { if ( li.Selected ) { notify = notify | (RegistrationNotify)li.Value.AsInteger(); } } RegistrationTemplate.IsActive = cbIsActive.Checked; RegistrationTemplate.Name = tbName.Text; RegistrationTemplate.CategoryId = cpCategory.SelectedValueAsInt(); RegistrationTemplate.GroupTypeId = gtpGroupType.SelectedGroupTypeId; RegistrationTemplate.GroupMemberRoleId = rpGroupTypeRole.GroupRoleId; RegistrationTemplate.GroupMemberStatus = ddlGroupMemberStatus.SelectedValueAsEnum<GroupMemberStatus>(); RegistrationTemplate.Notify = notify; RegistrationTemplate.LoginRequired = cbLoginRequired.Checked; RegistrationTemplate.AllowMultipleRegistrants = cbMultipleRegistrants.Checked; RegistrationTemplate.MaxRegistrants = nbMaxRegistrants.Text.AsInteger(); RegistrationTemplate.RegistrantsSameFamily = rblRegistrantsInSameFamily.SelectedValueAsEnum<RegistrantsSameFamily>(); RegistrationTemplate.Cost = cbCost.Text.AsDecimal(); RegistrationTemplate.MinimumInitialPayment = cbMinimumInitialPayment.Text.AsDecimalOrNull(); RegistrationTemplate.FinancialGatewayId = fgpFinancialGateway.SelectedValueAsInt(); RegistrationTemplate.ConfirmationFromName = tbConfirmationFromName.Text; RegistrationTemplate.ConfirmationFromEmail = tbConfirmationFromEmail.Text; RegistrationTemplate.ConfirmationSubject = tbConfirmationSubject.Text; RegistrationTemplate.ConfirmationEmailTemplate = ceConfirmationEmailTemplate.Text; RegistrationTemplate.ReminderFromName = tbReminderFromName.Text; RegistrationTemplate.ReminderFromEmail = tbReminderFromEmail.Text; RegistrationTemplate.ReminderSubject = tbReminderSubject.Text; RegistrationTemplate.ReminderEmailTemplate = ceReminderEmailTemplate.Text; RegistrationTemplate.RegistrationTerm = string.IsNullOrWhiteSpace( tbRegistrationTerm.Text ) ? "Registration" : tbRegistrationTerm.Text; RegistrationTemplate.RegistrantTerm = string.IsNullOrWhiteSpace( tbRegistrantTerm.Text ) ? "Registrant" : tbRegistrantTerm.Text; RegistrationTemplate.FeeTerm = string.IsNullOrWhiteSpace( tbFeeTerm.Text ) ? "Additional Options" : tbFeeTerm.Text; RegistrationTemplate.DiscountCodeTerm = string.IsNullOrWhiteSpace( tbDiscountCodeTerm.Text ) ? "Discount Code" : tbDiscountCodeTerm.Text; RegistrationTemplate.SuccessTitle = tbSuccessTitle.Text; RegistrationTemplate.SuccessText = ceSuccessText.Text; if ( !Page.IsValid || !RegistrationTemplate.IsValid ) { return; } foreach ( var form in FormState ) { if ( !form.IsValid ) { return; } if ( FormFieldsState.ContainsKey( form.Guid ) ) { foreach( var formField in FormFieldsState[ form.Guid ]) { if ( !formField.IsValid ) { return; } } } } // Get the valid group member attributes var group = new Group(); group.GroupTypeId = gtpGroupType.SelectedGroupTypeId ?? 0; var groupMember = new GroupMember(); groupMember.Group = group; groupMember.LoadAttributes(); var validGroupMemberAttributeIds = groupMember.Attributes.Select( a => a.Value.Id ).ToList(); // Remove any group member attributes that are not valid based on selected group type foreach( var fieldList in FormFieldsState.Select( s => s.Value ) ) { foreach( var formField in fieldList .Where( a => a.FieldSource == RegistrationFieldSource.GroupMemberAttribute && a.AttributeId.HasValue && !validGroupMemberAttributeIds.Contains( a.AttributeId.Value ) ) .ToList() ) { fieldList.Remove( formField ); } } // Perform Validation var validationErrors = new List<string>(); if ( ( RegistrationTemplate.Cost > 0 || FeeState.Any() ) && !RegistrationTemplate.FinancialGatewayId.HasValue ) { validationErrors.Add( "A Financial Gateway is required when the registration has a cost or additional fees." ); } if ( validationErrors.Any() ) { nbValidationError.Visible = true; nbValidationError.Text = "<ul class='list-unstyled'><li>" + validationErrors.AsDelimited( "</li><li>" ) + "</li></ul>"; } else { rockContext.WrapTransaction( () => { // Save the entity field changes to registration template if ( RegistrationTemplate.Id.Equals( 0 ) ) { service.Add( RegistrationTemplate ); } rockContext.SaveChanges(); var attributeService = new AttributeService( rockContext ); var registrationTemplateFormService = new RegistrationTemplateFormService( rockContext ); var registrationTemplateFormFieldService = new RegistrationTemplateFormFieldService( rockContext ); var registrationTemplateDiscountService = new RegistrationTemplateDiscountService( rockContext ); var registrationTemplateFeeService = new RegistrationTemplateFeeService( rockContext ); // delete forms that aren't assigned in the UI anymore var formUiGuids = FormState.Select( f => f.Guid ).ToList(); foreach ( var form in registrationTemplateFormService .Queryable() .Where( f => f.RegistrationTemplateId == RegistrationTemplate.Id && !formUiGuids.Contains( f.Guid ) ) ) { registrationTemplateFormService.Delete( form ); } // delete discounts that aren't assigned in the UI anymore var discountUiGuids = DiscountState.Select( u => u.Guid ).ToList(); foreach ( var discount in registrationTemplateDiscountService .Queryable() .Where( d => d.RegistrationTemplateId == RegistrationTemplate.Id && !discountUiGuids.Contains( d.Guid ) ) ) { registrationTemplateDiscountService.Delete( discount ); } // delete fees that aren't assigned in the UI anymore var feeUiGuids = FeeState.Select( u => u.Guid ).ToList(); foreach ( var fee in registrationTemplateFeeService .Queryable() .Where( d => d.RegistrationTemplateId == RegistrationTemplate.Id && !feeUiGuids.Contains( d.Guid ) ) ) { registrationTemplateFeeService.Delete( fee ); } var attributesUI = FormFieldsState .SelectMany( s => s.Value.Where( a => a.FieldSource == RegistrationFieldSource.RegistrationAttribute && a.Attribute != null ) ) .Select( f => f.Attribute ); int? entityTypeId = EntityTypeCache.Read( typeof( Rock.Model.RegistrationRegistrant ) ).Id; var qualifierColumn = "RegistrationTemplateId"; var qualifierValue = RegistrationTemplate.Id.ToString(); // Get the existing registration attributes for this entity type and qualifier value var attributesDB = attributeService.Get( entityTypeId, qualifierColumn, qualifierValue ); // Delete any of the registration attributes that were removed in the UI var selectedAttributeGuids = attributesUI.Select( a => a.Guid ); foreach ( var attr in attributesDB.Where( a => !selectedAttributeGuids.Contains( a.Guid ) ) ) { attributeService.Delete( attr ); rockContext.SaveChanges(); Rock.Web.Cache.AttributeCache.Flush( attr.Id ); } // Update the registration attributes that were assigned in the UI foreach ( var attr in attributesUI ) { Helper.SaveAttributeEdits( attr, entityTypeId, qualifierColumn, qualifierValue, rockContext ); } // add/updated forms/fields foreach ( var formUI in FormState ) { var form = RegistrationTemplate.Forms.FirstOrDefault( f => f.Guid.Equals( formUI.Guid ) ); if ( form == null ) { form = new RegistrationTemplateForm(); form.Guid = formUI.Guid; RegistrationTemplate.Forms.Add( form ); } form.Name = formUI.Name; form.Order = formUI.Order; if ( FormFieldsState.ContainsKey( form.Guid ) ) { var fieldUiGuids = FormFieldsState[form.Guid].Select( a => a.Guid ).ToList(); foreach ( var formField in registrationTemplateFormFieldService .Queryable() .Where( a => a.RegistrationTemplateForm.Guid.Equals( form.Guid ) && !fieldUiGuids.Contains( a.Guid ) ) ) { registrationTemplateFormFieldService.Delete( formField ); } foreach ( var formFieldUI in FormFieldsState[form.Guid] ) { var formField = form.Fields.FirstOrDefault( a => a.Guid.Equals( formFieldUI.Guid ) ); if ( formField == null ) { formField = new RegistrationTemplateFormField(); formField.Guid = formFieldUI.Guid; form.Fields.Add( formField ); } formField.AttributeId = formFieldUI.AttributeId; if ( !formField.AttributeId.HasValue && formFieldUI.FieldSource == RegistrationFieldSource.RegistrationAttribute && formFieldUI.Attribute != null ) { var attr = AttributeCache.Read( formFieldUI.Attribute.Guid, rockContext ); if ( attr != null ) { formField.AttributeId = attr.Id; } } formField.FieldSource = formFieldUI.FieldSource; formField.PersonFieldType = formFieldUI.PersonFieldType; formField.IsSharedValue = formFieldUI.IsSharedValue; formField.ShowCurrentValue = formFieldUI.ShowCurrentValue; formField.PreText = formFieldUI.PreText; formField.PostText = formFieldUI.PostText; formField.IsGridField = formFieldUI.IsGridField; formField.IsRequired = formFieldUI.IsRequired; formField.Order = formFieldUI.Order; } } } // add/updated discounts foreach ( var discountUI in DiscountState ) { var discount = RegistrationTemplate.Discounts.FirstOrDefault( a => a.Guid.Equals( discountUI.Guid ) ); if ( discount == null ) { discount = new RegistrationTemplateDiscount(); discount.Guid = discountUI.Guid; RegistrationTemplate.Discounts.Add( discount ); } discount.Code = discountUI.Code; discount.DiscountPercentage = discountUI.DiscountPercentage; discount.DiscountAmount = discountUI.DiscountAmount; discount.Order = discountUI.Order; } // add/updated fees foreach ( var feeUI in FeeState ) { var fee = RegistrationTemplate.Fees.FirstOrDefault( a => a.Guid.Equals( feeUI.Guid ) ); if ( fee == null ) { fee = new RegistrationTemplateFee(); fee.Guid = feeUI.Guid; RegistrationTemplate.Fees.Add( fee ); } fee.Name = feeUI.Name; fee.FeeType = feeUI.FeeType; fee.CostValue = feeUI.CostValue; fee.DiscountApplies = feeUI.DiscountApplies; fee.AllowMultiple = feeUI.AllowMultiple; fee.Order = feeUI.Order; } rockContext.SaveChanges(); } ); var qryParams = new Dictionary<string, string>(); qryParams["RegistrationTemplateId"] = RegistrationTemplate.Id.ToString(); NavigateToPage( RockPage.Guid, qryParams ); } }