/// <summary> /// Sets the type of the workflow activity. /// </summary> /// <param name="value">The value.</param> public void SetForm(RegistrationTemplateForm value) { EnsureChildControls(); _hfFormGuid.Value = value.Guid.ToString(); _hfFormId.Value = value.Id.ToString(); _tbFormName.Text = value.Name; }
/// <summary> /// Gets or sets the type of the workflow activity. /// </summary> /// <value> /// The type of the workflow activity. /// </value> public RegistrationTemplateForm GetForm(bool expandInvalid) { EnsureChildControls(); RegistrationTemplateForm result = new RegistrationTemplateForm(); result.Id = _hfFormId.ValueAsInt(); result.Guid = new Guid(_hfFormGuid.Value); result.Name = _tbFormName.Text; if (expandInvalid && !Expanded && !result.IsValid) { Expanded = true; } return(result); }
/// <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> /// 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> /// Builds the form control. /// </summary> /// <param name="parentControl">The parent control.</param> /// <param name="setValues">if set to <c>true</c> [set values].</param> /// <param name="form">The form.</param> /// <param name="activeFormGuid">The active form unique identifier.</param> /// <param name="showInvalid">if set to <c>true</c> [show invalid].</param> private void BuildFormControl( Control parentControl, bool setValues, RegistrationTemplateForm form, Guid? activeFormGuid = null, bool showInvalid = false ) { var control = new RegistrationTemplateFormEditor(); control.ID = form.Guid.ToString( "N" ); parentControl.Controls.Add( control ); control.ValidationGroup = btnSave.ValidationGroup; control.DeleteFieldClick += tfeForm_DeleteFieldClick; control.ReorderFieldClick += tfeForm_ReorderFieldClick; control.EditFieldClick += tfeForm_EditFieldClick; control.RebindFieldClick += tfeForm_RebindFieldClick; control.DeleteFormClick += tfeForm_DeleteFormClick; control.AddFieldClick += tfeForm_AddFieldClick; control.SetForm( form ); control.BindFieldsGrid( FormFieldsState[form.Guid] ); if ( setValues ) { control.Expanded = ExpandedForms.Contains( form.Guid ); if ( !control.Expanded && showInvalid && !form.IsValid) { control.Expanded = true; } if ( !control.Expanded ) { control.Expanded = activeFormGuid.HasValue && activeFormGuid.Equals( form.Guid ); } } }
/// <summary> /// Handles the Click event of the lbAddForm 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 lbAddForm_Click( object sender, EventArgs e ) { ParseControls(); var form = new RegistrationTemplateForm(); form.Guid = Guid.NewGuid(); form.Order = FormState.Any() ? FormState.Max( a => a.Order ) + 1 : 0; FormState.Add( form ); FormFieldsState.Add( form.Guid, new List<RegistrationTemplateFormField>() ); ExpandedForms.Add( form.Guid ); BuildControls( true, form.Guid ); }
/// <summary> /// Sets the type of the workflow activity. /// </summary> /// <param name="value">The value.</param> public void SetForm( RegistrationTemplateForm value ) { EnsureChildControls(); _hfFormGuid.Value = value.Guid.ToString(); _hfFormId.Value = value.Id.ToString(); _tbFormName.Text = value.Name; }
/// <summary> /// Gets or sets the type of the workflow activity. /// </summary> /// <value> /// The type of the workflow activity. /// </value> public RegistrationTemplateForm GetForm( bool expandInvalid ) { EnsureChildControls(); RegistrationTemplateForm result = new RegistrationTemplateForm(); result.Id = _hfFormId.ValueAsInt(); result.Guid = new Guid( _hfFormGuid.Value ); result.Name = _tbFormName.Text; if (expandInvalid && !Expanded && !result.IsValid) { Expanded = true; } return result; }
/// <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; } } } }
/// <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 ); } }