/// <summary> /// Handles the Click event of the btnSendReminders 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 btnSendReminders_Click(object sender, EventArgs e) { var registrationsSelected = new List <int>(); int sendCount = 0; gRegistrations.SelectedKeys.ToList().ForEach(r => registrationsSelected.Add(r.ToString().AsInteger())); if (registrationsSelected.Any()) { if (_registrationInstance == null) { int?registrationInstanceId = PageParameter("RegistrationInstanceId").AsIntegerOrNull(); using (RockContext rockContext = new RockContext()) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); _registrationInstance = registrationInstanceService.Queryable("RegistrationTemplate").AsNoTracking() .Where(r => r.Id == registrationInstanceId).FirstOrDefault(); } foreach (var registrationId in registrationsSelected) { // use a new rockContext for each registration so that ChangeTracker doesn't get bogged down using (RockContext rockContext = new RockContext()) { var registrationService = new RegistrationService(rockContext); var registration = registrationService.Get(registrationId); if (registration != null && !string.IsNullOrWhiteSpace(registration.ConfirmationEmail)) { Dictionary <string, object> mergeObjects = new Dictionary <string, object>(); mergeObjects.Add("Registration", registration); mergeObjects.Add("RegistrationInstance", _registrationInstance); var emailMessage = new RockEmailMessage(GetAttributeValue("ConfirmAccountTemplate").AsGuid()); emailMessage.AdditionalMergeFields = mergeObjects; emailMessage.FromEmail = txtFromEmail.Text; emailMessage.FromName = txtFromName.Text; emailMessage.Subject = txtFromSubject.Text; emailMessage.AddRecipient(registration.GetConfirmationRecipient(mergeObjects)); emailMessage.Message = ceEmailMessage.Text; emailMessage.AppRoot = ResolveRockUrl("~/"); emailMessage.ThemeRoot = ResolveRockUrl("~~/"); emailMessage.CreateCommunicationRecord = true; emailMessage.Send(); registration.LastPaymentReminderDateTime = RockDateTime.Now; rockContext.SaveChanges(); sendCount++; } } } } } pnlSend.Visible = false; pnlComplete.Visible = true; nbResult.Text = string.Format("Payment reminders have been sent to {0}.", "individuals".ToQuantity(sendCount)); }
/// <summary> /// Binds the Registrations (people who registered) using the RegistrationInstances. /// </summary> /// <param name="rockContext">The RockContext.</param> /// <param name="registrationInstanceId">The id of a RegistrationInstance.</param> /// <param name="setUserPreference">Set to true if you want to remember the item in the users preferences</param> private void BindRegistrationInstances(RockContext rockContext, int?registrationInstanceId) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); var registrationInstances = registrationInstanceService.Queryable().AsNoTracking().ToList(); ddlRegistrationInstances.DataSource = registrationInstances; RegistrationInstance emptyRegistrationInstance = new RegistrationInstance { Id = -1, Name = "" }; registrationInstances.Insert(0, emptyRegistrationInstance); ddlRegistrationInstances.DataBind(); // Select the given registrationInstanceId if it still exists in the list if (ddlRegistrationInstances.Items.FindByValue(registrationInstanceId.ToStringSafe()) != null) { ddlRegistrationInstances.SelectedValue = registrationInstanceId.ToStringSafe(); } if (registrationInstances.Count >= 1) { BindRegistrationsUsingRegistrationInstances(registrationInstanceId); } }
/// <summary> /// Binds the dropdown menus /// </summary> private void BindData() { using (var rockContext = new RockContext()) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); var registrationInstances = registrationInstanceService.Queryable().Where(ri => ri.IsActive == true).AsNoTracking().ToList(); ddlRegistrationInstances.DataSource = registrationInstances; RegistrationInstance emptyRegistrationInstance = new RegistrationInstance { Id = -1, Name = "" }; registrationInstances.Insert(0, emptyRegistrationInstance); ddlRegistrationInstances.DataBind(); var entityTypes = new EntityTypeService(new RockContext()).GetEntities() .Where(t => t.Guid.ToString() == Rock.SystemGuid.EntityType.GROUP.ToLower() || t.Guid.ToString() == "5cd9c0c8-c047-61a0-4e36-0fdb8496f066" || t.Guid.ToString() == Rock.SystemGuid.EntityType.DATAVIEW.ToLower()) .OrderBy(t => t.FriendlyName) .ToList(); entityTypes.Insert(0, new EntityType() { Id = -1, FriendlyName = "Select One" }); ddlEntityType.DataSource = entityTypes; ddlEntityType.DataBind(); } }
/// <summary> /// Gets the expression. /// </summary> /// <param name="entityType">Type of the entity.</param> /// <param name="serviceInstance">The service instance.</param> /// <param name="parameterExpression">The parameter expression.</param> /// <param name="selection">The selection.</param> /// <returns></returns> public override Expression GetExpression(Type entityType, IService serviceInstance, ParameterExpression parameterExpression, string selection) { string[] selectionValues = selection.Split('|'); if (selectionValues.Length >= 1) { List <Guid> registrationTemplateGuids = selectionValues[0].Split(',').AsGuidList(); var registrationInstanceService = new RegistrationInstanceService((RockContext)serviceInstance.Context); var registrationInstanceIds = registrationInstanceService.Queryable().Where(ri => registrationTemplateGuids.Contains(ri.RegistrationTemplate.Guid)).Select(ri => ri.Id).Distinct().ToList(); RegistrationRegistrantService registrationRegistrantService = new RegistrationRegistrantService((RockContext)serviceInstance.Context); bool includeInactiveRegistrationInstances = false; if (selectionValues.Length >= 2) { includeInactiveRegistrationInstances = selectionValues[1].AsBooleanOrNull() ?? true;; } else { // if options where saved before this option was added, set to false, even though it would have included inactive before includeInactiveRegistrationInstances = false; } var registrationRegistrantServiceQry = registrationRegistrantService.Queryable(); if (registrationTemplateGuids.Count > 0) { registrationRegistrantServiceQry = registrationRegistrantServiceQry.Where(xx => registrationInstanceIds.Contains(xx.Registration.RegistrationInstanceId)); } if (selectionValues.Length >= 3) { string slidingDelimitedValues = selectionValues[2].Replace(',', '|'); DateRange dateRange = SlidingDateRangePicker.CalculateDateRangeFromDelimitedValues(slidingDelimitedValues); if (dateRange.Start.HasValue) { registrationRegistrantServiceQry = registrationRegistrantServiceQry.Where(xx => xx.CreatedDateTime >= dateRange.Start.Value); } if (dateRange.End.HasValue) { registrationRegistrantServiceQry = registrationRegistrantServiceQry.Where(xx => xx.CreatedDateTime < dateRange.End.Value); } } var qry = new PersonService((RockContext)serviceInstance.Context).Queryable() .Where(p => registrationRegistrantServiceQry.Any(xx => xx.PersonAlias.PersonId == p.Id)); Expression extractedFilterExpression = FilterExpressionExtractor.Extract <Rock.Model.Person>(qry, parameterExpression, "p"); return(extractedFilterExpression); } return(null); }
/// <summary> /// Loads the registration. /// </summary> private void LoadData() { int?registrationInstanceId = PageParameter("RegistrationInstanceId").AsIntegerOrNull(); if (registrationInstanceId.HasValue) { using (RockContext rockContext = new RockContext()) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); // NOTE: Do not use AsNoTracking because lava might need to lazy load some stuff _registrationInstance = registrationInstanceService.Queryable("RegistrationTemplate") .Where(r => r.Id == registrationInstanceId).FirstOrDefault(); var registrationSample = _registrationInstance.Registrations.Where(r => r.BalanceDue > 0).FirstOrDefault(); if (registrationSample != null) { Dictionary <string, object> mergeObjects = new Dictionary <string, object>(); mergeObjects.Add("Registration", registrationSample); mergeObjects.Add("RegistrationInstance", _registrationInstance); ceEmailMessage.Text = _registrationInstance.RegistrationTemplate.PaymentReminderEmailTemplate; ifEmailPreview.Attributes["srcdoc"] = _registrationInstance.RegistrationTemplate.PaymentReminderEmailTemplate.ResolveMergeFields(mergeObjects); // needed to work in IE ifEmailPreview.Src = "javascript: window.frameElement.getAttribute('srcdoc');"; txtFromEmail.Text = _registrationInstance.RegistrationTemplate.PaymentReminderFromEmail.ResolveMergeFields(mergeObjects); txtFromName.Text = _registrationInstance.RegistrationTemplate.PaymentReminderFromName.ResolveMergeFields(mergeObjects); txtFromSubject.Text = _registrationInstance.RegistrationTemplate.PaymentReminderSubject.ResolveMergeFields(mergeObjects); if (_registrationInstance.RegistrationTemplate.PaymentReminderTimeSpan.HasValue) { lBalanceInstructions.Text = string.Format("<p>Below is a list of registrations with outstanding balances. Individuals who have not been reminded of their balance in {0} days have been pre-selected. Those who have been recently added or notified of their balance are greyed out. They can be still be included by either selecting them or selecting all transactions.</p>", _registrationInstance.RegistrationTemplate.PaymentReminderTimeSpan.Value); } } else { pnlPreview.Visible = false; nbMessages.Text = "<strong>Good News!</strong> No registrations have an outstanding balance at this time."; } LoadOutstandingBalances(); } } }
/// <summary> /// Handles the CheckedChanged event of the tglEmailBodyView 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 tglEmailBodyView_CheckedChanged(object sender, EventArgs e) { if (tglEmailBodyView.Checked) { ceEmailMessage.Visible = false; ifEmailPreview.Visible = true; // reload preview int?registrationInstanceId = PageParameter("RegistrationInstanceId").AsIntegerOrNull(); if (registrationInstanceId.HasValue) { using (RockContext rockContext = new RockContext()) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); // NOTE: Do not use AsNoTracking because lava might need to lazy load some stuff _registrationInstance = registrationInstanceService.Queryable("RegistrationTemplate") .Where(r => r.Id == registrationInstanceId).FirstOrDefault(); var registrationSample = _registrationInstance.Registrations.Where(r => r.BalanceDue > 0).FirstOrDefault(); if (registrationSample != null) { Dictionary <string, object> mergeObjects = new Dictionary <string, object>(); mergeObjects.Add("Registration", registrationSample); mergeObjects.Add("RegistrationInstance", _registrationInstance); ifEmailPreview.Attributes["srcdoc"] = ceEmailMessage.Text.ResolveMergeFields(mergeObjects); // needed to work in IE ifEmailPreview.Src = "javascript: window.frameElement.getAttribute('srcdoc');"; } } } } else { ceEmailMessage.Visible = true; ifEmailPreview.Visible = false; } }
/// <summary> /// Binds the instances grid. /// </summary> protected void BindInstancesGrid() { pnlInstances.Visible = true; using (var rockContext = new RockContext()) { RegistrationInstanceService instanceService = new RegistrationInstanceService(rockContext); var qry = instanceService.Queryable() .Where(i => (i.StartDateTime <= RockDateTime.Now || !i.StartDateTime.HasValue) && (i.EndDateTime > RockDateTime.Now || !i.EndDateTime.HasValue) && i.IsActive) .AsEnumerable() .Where(g => g.IsAuthorized(Rock.Security.Authorization.VIEW, CurrentPerson)) .AsQueryable() .OrderBy(i => i.StartDateTime); var sortProperty = gRegInstances.SortProperty; if (sortProperty != null) { qry = qry.Sort(sortProperty); } var qryResult = qry .Select(i => new { i.Id, i.Guid, i.Name, i.StartDateTime, i.EndDateTime, i.IsActive, i.Details, Registrants = i.Registrations.Where(r => !r.IsTemporary).SelectMany(r => r.Registrants).Count() }); gRegInstances.SetLinqDataSource(qryResult); gRegInstances.DataBind(); } }
/// <summary> /// Handles the CheckedChanged event of the tglEmailBodyView 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 tglEmailBodyView_CheckedChanged(object sender, EventArgs e) { if (tglEmailBodyView.Checked) { ceEmailMessage.Visible = false; ifEmailPreview.Visible = true; // reload preview int?registrationInstanceId = PageParameter("RegistrationInstanceId").AsIntegerOrNull(); if (registrationInstanceId.HasValue) { using (RockContext rockContext = new RockContext()) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); _registrationInstance = registrationInstanceService.Queryable("RegistrationTemplate").AsNoTracking() .Where(r => r.Id == registrationInstanceId).FirstOrDefault(); var registrationSample = _registrationInstance.Registrations.Where(r => r.BalanceDue > 0).FirstOrDefault(); if (registrationSample != null) { Dictionary <string, object> mergeObjects = new Dictionary <string, object>(); mergeObjects.Add("Registration", registrationSample); mergeObjects.Add("RegistrationInstance", _registrationInstance); ifEmailPreview.Attributes["srcdoc"] = ceEmailMessage.Text.ResolveMergeFields(mergeObjects); } } } } else { ceEmailMessage.Visible = true; ifEmailPreview.Visible = false; } }
/// <summary> /// Binds the instances grid. /// </summary> protected void BindInstancesGrid() { pnlInstances.Visible = true; using ( var rockContext = new RockContext() ) { RegistrationInstanceService instanceService = new RegistrationInstanceService( rockContext ); var qry = instanceService.Queryable() .Where( i => i.StartDateTime <= RockDateTime.Now && i.EndDateTime > RockDateTime.Now && i.IsActive ) .OrderBy( i => i.StartDateTime ); var sortProperty = gRegInstances.SortProperty; if ( sortProperty != null ) { qry = qry.Sort( sortProperty ); } var qryResult = qry .Select( i => new { i.Id, i.Guid, i.Name, i.StartDateTime, i.EndDateTime, i.IsActive, i.Details, Registrants = i.Registrations.Where( r => !r.IsTemporary ).SelectMany( r => r.Registrants ).Count() } ); gRegInstances.SetLinqDataSource( qryResult ); gRegInstances.DataBind(); } }
/// <summary> /// Starts the refund process. /// </summary> private void StartRefunds() { long totalMilliseconds = 0; var importTask = new Task(() => { // wait a little so the browser can render and start listening to events System.Threading.Thread.Sleep(1000); _hubContext.Clients.All.showButtons(this.SignalRNotificationKey, false); Stopwatch stopwatch = Stopwatch.StartNew(); List <int> registrationTemplateIds = rtpRegistrationTemplate.ItemIds.AsIntegerList(); registrationTemplateIds.RemoveAll(i => i.Equals(0)); if (registrationTemplateIds.Count > 0) { RockContext rockContext = new RockContext(); List <int> registrationInstanceIds = new List <int>(); if (ddlRegistrationInstance.SelectedValueAsId().HasValue&& ddlRegistrationInstance.SelectedValueAsId() > 0) { registrationInstanceIds.Add(ddlRegistrationInstance.SelectedValueAsId().Value); } else { RegistrationTemplateService registrationTemplateService = new RegistrationTemplateService(rockContext); var templates = registrationTemplateService.GetByIds(rtpRegistrationTemplate.ItemIds.AsIntegerList()); int registrationCount = templates.SelectMany(t => t.Instances).SelectMany(i => i.Registrations).Count(); registrationInstanceIds.AddRange(templates.SelectMany(t => t.Instances).OrderBy(i => i.Name).Select(i => i.Id)); } RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); SystemEmailService systemEmailService = new SystemEmailService(rockContext); // Load the registration instance and then iterate through all registrations. var registrations = registrationInstanceService.Queryable().Where(ri => registrationInstanceIds.Contains(ri.Id)).SelectMany(ri => ri.Registrations); int j = 1; foreach (Registration registration in registrations) { bool issuedRefund = false; OnProgress("Processing registration refund " + j + " of " + registrations.Count()); foreach (var payment in registration.GetPayments(rockContext)) { decimal refundAmount = payment.Amount + payment.Transaction.Refunds.Sum(r => r.FinancialTransaction.TotalAmount); // If refunds totalling the amount of the payments have not already been issued if (payment.Amount > 0 && refundAmount > 0) { string errorMessage; using (var refundRockContext = new RockContext()) { var financialTransactionService = new FinancialTransactionService(refundRockContext); var refundTransaction = financialTransactionService.ProcessRefund(payment.Transaction, refundAmount, dvpRefundReason.SelectedDefinedValueId, tbRefundSummary.Text, true, string.Empty, out errorMessage); if (refundTransaction != null) { refundRockContext.SaveChanges(); } if (!string.IsNullOrWhiteSpace(errorMessage)) { results["Fail"] += string.Format("Failed refund for registration {0}: {1}", registration.FirstName + " " + registration.LastName, errorMessage) + Environment.NewLine; } else { results["Success"] += string.Format("Successfully issued {0} refund for registration {1} payment {2} ({3}) - Refund Transaction Id: {4}, Amount: {5}", refundAmount < payment.Amount?"Partial":"Full", registration.FirstName + " " + registration.LastName, payment.Transaction.TransactionCode, payment.Transaction.TotalAmount, refundTransaction.TransactionCode, refundTransaction.TotalAmount.FormatAsCurrency()) + Environment.NewLine; issuedRefund = true; } } System.Threading.Thread.Sleep(2500); } else if (payment.Transaction.Refunds.Count > 0) { results["Success"] += string.Format("Refund already issued for registration {0} payment {1} ({2})", registration.FirstName + " " + registration.LastName, payment.Transaction.TransactionCode, payment.Transaction.TotalAmount) + Environment.NewLine; } } j++; // Send an email if applicable if (issuedRefund && !string.IsNullOrWhiteSpace(registration.ConfirmationEmail) && ddlSystemEmail.SelectedValueAsInt().HasValue&& ddlSystemEmail.SelectedValueAsInt() > 0) { var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage); mergeFields.Add("Registration", registration); SystemEmail systemEmail = systemEmailService.Get(ddlSystemEmail.SelectedValueAsInt().Value); var emailMessage = new RockEmailMessage(systemEmail); emailMessage.AdditionalMergeFields = mergeFields; emailMessage.AddRecipient(new RecipientData(registration.ConfirmationEmail, mergeFields)); emailMessage.CreateCommunicationRecord = true; emailMessage.Send(); } } } stopwatch.Stop(); totalMilliseconds = stopwatch.ElapsedMilliseconds; _hubContext.Clients.All.showButtons(this.SignalRNotificationKey, true); }); importTask.ContinueWith((t) => { if (t.IsFaulted) { foreach (var exception in t.Exception.InnerExceptions) { LogException(exception); } OnProgress("ERROR: " + t.Exception.Message); } else { OnProgress(string.Format("{0} Complete: [{1}ms]", "All refunds have been issued.", totalMilliseconds)); } }); importTask.Start(); }
/// <summary> /// Gets the expression. /// </summary> /// <param name="entityType">Type of the entity.</param> /// <param name="serviceInstance">The service instance.</param> /// <param name="parameterExpression">The parameter expression.</param> /// <param name="selection">The selection.</param> /// <returns></returns> public override Expression GetExpression( Type entityType, IService serviceInstance, ParameterExpression parameterExpression, string selection ) { string[] selectionValues = selection.Split( '|' ); if ( selectionValues.Length >= 1 ) { List<Guid> registrationTemplateGuids = selectionValues[0].Split( ',' ).AsGuidList(); var registrationInstanceService = new RegistrationInstanceService( (RockContext)serviceInstance.Context ); var registrationInstanceIds = registrationInstanceService.Queryable().Where( ri => registrationTemplateGuids.Contains( ri.RegistrationTemplate.Guid ) ).Select( ri => ri.Id ).Distinct().ToList(); RegistrationRegistrantService registrationRegistrantService = new RegistrationRegistrantService( (RockContext)serviceInstance.Context ); bool includeInactiveRegistrationInstances = false; if ( selectionValues.Length >= 2 ) { includeInactiveRegistrationInstances = selectionValues[1].AsBooleanOrNull() ?? true; ; } else { // if options where saved before this option was added, set to false, even though it would have included inactive before includeInactiveRegistrationInstances = false; } var registrationRegistrantServiceQry = registrationRegistrantService.Queryable(); if ( registrationTemplateGuids.Count > 0 ) { registrationRegistrantServiceQry = registrationRegistrantServiceQry.Where( xx => registrationInstanceIds.Contains( xx.Registration.RegistrationInstanceId ) ); } if ( selectionValues.Length >= 3 ) { string slidingDelimitedValues = selectionValues[2].Replace( ',', '|' ); DateRange dateRange = SlidingDateRangePicker.CalculateDateRangeFromDelimitedValues( slidingDelimitedValues ); if ( dateRange.Start.HasValue ) { registrationRegistrantServiceQry = registrationRegistrantServiceQry.Where( xx => xx.CreatedDateTime >= dateRange.Start.Value ); } if ( dateRange.End.HasValue ) { registrationRegistrantServiceQry = registrationRegistrantServiceQry.Where( xx => xx.CreatedDateTime < dateRange.End.Value ); } } var qry = new PersonService( (RockContext)serviceInstance.Context ).Queryable() .Where( p => registrationRegistrantServiceQry.Any( xx => xx.PersonAlias.PersonId == p.Id ) ); Expression extractedFilterExpression = FilterExpressionExtractor.Extract<Rock.Model.Person>( qry, parameterExpression, "p" ); return extractedFilterExpression; } return null; }
/// <summary> /// Handles the Click event of the btnSendReminders 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 btnSendReminders_Click( object sender, EventArgs e ) { var registrationsSelected = new List<int>(); int sendCount = 0; gRegistrations.SelectedKeys.ToList().ForEach( r => registrationsSelected.Add( r.ToString().AsInteger() ) ); if ( registrationsSelected.Any() ) { var appRoot = Rock.Web.Cache.GlobalAttributesCache.Read().GetValue( "ExternalApplicationRoot" ); if ( _registrationInstance == null ) { int? registrationInstanceId = PageParameter( "RegistrationInstanceId" ).AsIntegerOrNull(); using ( RockContext rockContext = new RockContext() ) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService( rockContext ); _registrationInstance = registrationInstanceService.Queryable( "RegistrationTemplate" ).AsNoTracking() .Where( r => r.Id == registrationInstanceId ).FirstOrDefault(); } foreach( var registrationId in registrationsSelected ) { // use a new rockContext for each registration so that ChangeTracker doesn't get bogged down using ( RockContext rockContext = new RockContext() ) { var registrationService = new RegistrationService( rockContext ); var registration = registrationService.Get( registrationId ); if ( registration != null && !string.IsNullOrWhiteSpace(registration.ConfirmationEmail) ) { var recipients = new List<string>(); Dictionary<string, object> mergeObjects = new Dictionary<string, object>(); mergeObjects.Add( "Registration", registration ); mergeObjects.Add( "RegistrationInstance", _registrationInstance ); recipients.Add( registration.ConfirmationEmail ); string message = ceEmailMessage.Text.ResolveMergeFields( mergeObjects ); Email.Send( txtFromEmail.Text, txtFromName.Text, txtFromSubject.Text, recipients, message, appRoot ); registration.LastPaymentReminderDateTime = RockDateTime.Now; rockContext.SaveChanges(); sendCount++; } } } } } pnlSend.Visible = false; pnlComplete.Visible = true; nbResult.Text = string.Format("Payment reminders have been sent to {0}.", "individuals".ToQuantity( sendCount )); }
/// <summary> /// Loads the outstanding balances. /// </summary> private void LoadOutstandingBalances() { using ( RockContext rockContext = new RockContext() ) { if ( _registrationInstance == null ) { int? registrationInstanceId = PageParameter( "RegistrationInstanceId" ).AsIntegerOrNull(); RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService( rockContext ); _registrationInstance = registrationInstanceService.Queryable( "RegistrationTemplate" ).AsNoTracking() .Where( r => r.Id == registrationInstanceId ).FirstOrDefault(); } var outstandingBalances = _registrationInstance.Registrations.Where( r => r.BalanceDue > 0 ); var sortProperty = gRegistrations.SortProperty; if ( sortProperty != null ) { switch ( sortProperty.Property ) { case "BalanceDue": { if ( sortProperty.Direction == SortDirection.Ascending ) { outstandingBalances = outstandingBalances.OrderBy( b => b.BalanceDue ); } else { outstandingBalances = outstandingBalances.OrderByDescending( b => b.BalanceDue ); } break; } case "LastPaymentReminderDateTime": { if ( sortProperty.Direction == SortDirection.Ascending ) { outstandingBalances = outstandingBalances.OrderBy( b => b.LastPaymentReminderDateTime ); } else { outstandingBalances = outstandingBalances.OrderByDescending( b => b.LastPaymentReminderDateTime ); } break; } case "CreatedDateTime": { if ( sortProperty.Direction == SortDirection.Ascending ) { outstandingBalances = outstandingBalances.OrderBy( b => b.CreatedDateTime ); } else { outstandingBalances = outstandingBalances.OrderByDescending( b => b.CreatedDateTime ); } break; } case "Name": { if ( sortProperty.Direction == SortDirection.Ascending ) { outstandingBalances = outstandingBalances.OrderBy( b => b.LastName ).ThenBy(b=> b.FirstName); } else { outstandingBalances = outstandingBalances.OrderByDescending( b => b.LastName ).ThenBy( b => b.FirstName ); } break; } } } gRegistrations.DataSource = outstandingBalances; gRegistrations.DataBind(); } }
/// <summary> /// Loads the registration. /// </summary> private void LoadData() { int? registrationInstanceId = PageParameter( "RegistrationInstanceId" ).AsIntegerOrNull(); if ( registrationInstanceId.HasValue ) { using ( RockContext rockContext = new RockContext() ) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService( rockContext ); _registrationInstance = registrationInstanceService.Queryable( "RegistrationTemplate" ).AsNoTracking() .Where( r => r.Id == registrationInstanceId ).FirstOrDefault(); var registrationSample = _registrationInstance.Registrations.Where( r => r.BalanceDue > 0 ).FirstOrDefault(); if ( registrationSample != null ) { Dictionary<string, object> mergeObjects = new Dictionary<string, object>(); mergeObjects.Add( "Registration", registrationSample ); mergeObjects.Add( "RegistrationInstance", _registrationInstance ); ceEmailMessage.Text = _registrationInstance.RegistrationTemplate.PaymentReminderEmailTemplate; ifEmailPreview.Attributes["srcdoc"] = _registrationInstance.RegistrationTemplate.PaymentReminderEmailTemplate.ResolveMergeFields( mergeObjects ); txtFromEmail.Text = _registrationInstance.RegistrationTemplate.PaymentReminderFromEmail.ResolveMergeFields( mergeObjects ); txtFromName.Text = _registrationInstance.RegistrationTemplate.PaymentReminderFromName.ResolveMergeFields( mergeObjects ); txtFromSubject.Text = _registrationInstance.RegistrationTemplate.PaymentReminderSubject.ResolveMergeFields( mergeObjects ); if ( _registrationInstance.RegistrationTemplate.PaymentReminderTimeSpan.HasValue ) { lBalanceInstructions.Text = string.Format( "<p>Below is a list of registrations with outstanding balances. Individuals who have not been reminded of their balance in {0} days have been pre-selected. Those who have been recently added or notified of their balance are greyed out. They can be still be included by either selecting them or selecting all transactions.</p>", _registrationInstance.RegistrationTemplate.PaymentReminderTimeSpan.Value ); } } else { pnlPreview.Visible = false; nbMessages.Text = "<strong>Good News!</strong> No registrations have an outstanding balance at this time."; } LoadOutstandingBalances(); } } }
/// <summary> /// Handles the CheckedChanged event of the tglEmailBodyView 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 tglEmailBodyView_CheckedChanged( object sender, EventArgs e ) { if ( tglEmailBodyView.Checked ) { ceEmailMessage.Visible = false; ifEmailPreview.Visible = true; // reload preview int? registrationInstanceId = PageParameter( "RegistrationInstanceId" ).AsIntegerOrNull(); if ( registrationInstanceId.HasValue ) { using ( RockContext rockContext = new RockContext() ) { RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService( rockContext ); _registrationInstance = registrationInstanceService.Queryable( "RegistrationTemplate" ).AsNoTracking() .Where( r => r.Id == registrationInstanceId ).FirstOrDefault(); var registrationSample = _registrationInstance.Registrations.Where( r => r.BalanceDue > 0 ).FirstOrDefault(); if ( registrationSample != null ) { Dictionary<string, object> mergeObjects = new Dictionary<string, object>(); mergeObjects.Add( "Registration", registrationSample ); mergeObjects.Add( "RegistrationInstance", _registrationInstance ); ifEmailPreview.Attributes["srcdoc"] = ceEmailMessage.Text.ResolveMergeFields( mergeObjects ); } } } } else { ceEmailMessage.Visible = true; ifEmailPreview.Visible = false; } }
/// <summary> /// Binds the group members grid. /// </summary> protected void BindInstancesGrid() { if ( _template != null ) { pnlInstances.Visible = true; lHeading.Text = string.Format( "{0} Instances", _template.Name ); var rockContext = new RockContext(); RegistrationInstanceService instanceService = new RegistrationInstanceService( rockContext ); var qry = instanceService.Queryable().AsNoTracking() .Where( i => i.RegistrationTemplateId == _template.Id ); // Date Range var drp = new DateRangePicker(); drp.DelimitedValues = rFilter.GetUserPreference( "Date Range" ); if ( drp.LowerValue.HasValue ) { qry = qry.Where( i => i.StartDateTime >= drp.LowerValue.Value ); } if ( drp.UpperValue.HasValue ) { DateTime upperDate = drp.UpperValue.Value.Date.AddDays( 1 ); qry = qry.Where( i => i.StartDateTime < upperDate ); } string statusFilter = rFilter.GetUserPreference( "Active Status" ); if ( !string.IsNullOrWhiteSpace(statusFilter)) { if ( statusFilter == "inactive") { qry = qry.Where( i => i.IsActive == false ); } else { qry = qry.Where( i => i.IsActive == true ); } } SortProperty sortProperty = gInstances.SortProperty; if ( sortProperty != null ) { qry = qry.Sort( sortProperty ); } else { qry = qry.OrderByDescending( a => a.StartDateTime ); } var instanceQry = qry.Select( i => new { i.Id, i.Guid, i.Name, i.StartDateTime, i.EndDateTime, i.IsActive, Details = string.Empty, Registrants = i.Registrations.SelectMany( r => r.Registrants ).Count() }); gInstances.SetLinqDataSource( instanceQry ); gInstances.DataBind(); } else { pnlInstances.Visible = false; } }
/// <summary> /// Loads the outstanding balances. /// </summary> private void LoadOutstandingBalances() { using (RockContext rockContext = new RockContext()) { if (_registrationInstance == null) { int?registrationInstanceId = PageParameter("RegistrationInstanceId").AsIntegerOrNull(); RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); _registrationInstance = registrationInstanceService.Queryable("RegistrationTemplate").AsNoTracking() .Where(r => r.Id == registrationInstanceId).FirstOrDefault(); } var outstandingBalances = _registrationInstance.Registrations.Where(r => r.BalanceDue > 0); var sortProperty = gRegistrations.SortProperty; if (sortProperty != null) { switch (sortProperty.Property) { case "BalanceDue": { if (sortProperty.Direction == SortDirection.Ascending) { outstandingBalances = outstandingBalances.OrderBy(b => b.BalanceDue); } else { outstandingBalances = outstandingBalances.OrderByDescending(b => b.BalanceDue); } break; } case "LastPaymentReminderDateTime": { if (sortProperty.Direction == SortDirection.Ascending) { outstandingBalances = outstandingBalances.OrderBy(b => b.LastPaymentReminderDateTime); } else { outstandingBalances = outstandingBalances.OrderByDescending(b => b.LastPaymentReminderDateTime); } break; } case "CreatedDateTime": { if (sortProperty.Direction == SortDirection.Ascending) { outstandingBalances = outstandingBalances.OrderBy(b => b.CreatedDateTime); } else { outstandingBalances = outstandingBalances.OrderByDescending(b => b.CreatedDateTime); } break; } case "Name": { if (sortProperty.Direction == SortDirection.Ascending) { outstandingBalances = outstandingBalances.OrderBy(b => b.LastName).ThenBy(b => b.FirstName); } else { outstandingBalances = outstandingBalances.OrderByDescending(b => b.LastName).ThenBy(b => b.FirstName); } break; } } } gRegistrations.DataSource = outstandingBalances; gRegistrations.DataBind(); } }
/// <summary> /// Starts the refund process. /// </summary> private void StartRefunds() { long totalMilliseconds = 0; var importTask = new Task(() => { // wait a little so the browser can render and start listening to events System.Threading.Thread.Sleep(1000); _hubContext.Clients.All.showButtons(this.SignalRNotificationKey, false); Stopwatch stopwatch = Stopwatch.StartNew(); List <int> registrationTemplateIds = rtpRegistrationTemplate.ItemIds.AsIntegerList(); registrationTemplateIds.RemoveAll(i => i.Equals(0)); RockContext rockContext = new RockContext(); SystemCommunicationService systemCommunicationService = new SystemCommunicationService(rockContext); if (pnlRegistration.Visible && registrationTemplateIds.Count > 0) { List <int> registrationInstanceIds = new List <int>(); if (ddlRegistrationInstance.SelectedValueAsId().HasValue&& ddlRegistrationInstance.SelectedValueAsId() > 0) { registrationInstanceIds.Add(ddlRegistrationInstance.SelectedValueAsId().Value); } else { RegistrationTemplateService registrationTemplateService = new RegistrationTemplateService(rockContext); var templates = registrationTemplateService.GetByIds(rtpRegistrationTemplate.ItemIds.AsIntegerList()); int registrationCount = templates.SelectMany(t => t.Instances).SelectMany(i => i.Registrations).Count(); registrationInstanceIds.AddRange(templates.SelectMany(t => t.Instances).OrderBy(i => i.Name).Select(i => i.Id)); } RegistrationInstanceService registrationInstanceService = new RegistrationInstanceService(rockContext); // Load the registration instance and then iterate through all registrations. var registrations = registrationInstanceService.Queryable().Where(ri => registrationInstanceIds.Contains(ri.Id)).SelectMany(ri => ri.Registrations); int j = 1; foreach (Registration registration in registrations) { bool issuedRefund = false; OnProgress("Processing registration refund " + j + " of " + registrations.Count()); foreach (var payment in registration.GetPayments(rockContext)) { issuedRefund = issueRefund(payment.Transaction, "Registration", registration.FirstName + " " + registration.LastName); } j++; // Send an email if applicable if (issuedRefund && !string.IsNullOrWhiteSpace(registration.ConfirmationEmail) && ddlSystemCommunication.SelectedValueAsInt().HasValue&& ddlSystemCommunication.SelectedValueAsInt() > 0) { var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage); mergeFields.Add("Registration", registration); SystemCommunication systemCommunication = systemCommunicationService.Get(ddlSystemCommunication.SelectedValueAsInt().Value); var emailMessage = new RockEmailMessage(systemCommunication); emailMessage.AdditionalMergeFields = mergeFields; emailMessage.AddRecipient(RockEmailMessageRecipient.CreateAnonymous(registration.ConfirmationEmail, mergeFields)); emailMessage.CreateCommunicationRecord = true; emailMessage.Send(); } } } if (pnlTransactionCodes.Visible && tbTransactionCodes.Text.Length > 0) { var codes = tbTransactionCodes.Text.SplitDelimitedValues(); FinancialTransactionService financialTransactionService = new FinancialTransactionService(rockContext); var transactions = financialTransactionService.Queryable().Where(ft => codes.Contains(ft.TransactionCode)); int j = 0; foreach (var transaction in transactions) { OnProgress("Processing transaction refund " + j + " of " + transactions.Count()); var issuedRefund = issueRefund(transaction, "Transaction", transaction.AuthorizedPersonAlias != null ? transaction.AuthorizedPersonAlias.Person.FullName : "Unknown"); // Send an email if applicable if (issuedRefund && transaction.AuthorizedPersonAlias != null && !string.IsNullOrWhiteSpace(transaction.AuthorizedPersonAlias.Person.Email) && ddlSystemCommunication.SelectedValueAsInt().HasValue&& ddlSystemCommunication.SelectedValueAsInt() > 0) { var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage); mergeFields.Add("Transaction", transaction); SystemCommunication systemCommunication = systemCommunicationService.Get(ddlSystemCommunication.SelectedValueAsInt().Value); var emailMessage = new RockEmailMessage(systemCommunication); emailMessage.AdditionalMergeFields = mergeFields; emailMessage.FromEmail = ebEmail.Text; emailMessage.AddRecipient(new RockEmailMessageRecipient(transaction.AuthorizedPersonAlias.Person, mergeFields)); emailMessage.CreateCommunicationRecord = true; emailMessage.Send(); } } } stopwatch.Stop(); totalMilliseconds = stopwatch.ElapsedMilliseconds; _hubContext.Clients.All.showButtons(this.SignalRNotificationKey, true); }); importTask.ContinueWith((t) => { if (t.IsFaulted) { foreach (var exception in t.Exception.InnerExceptions) { LogException(exception); } OnProgress("ERROR: " + t.Exception.Message); } else { OnProgress(string.Format("{0} Complete: [{1}ms]", "All refunds have been issued.", totalMilliseconds)); } }); importTask.Start(); }
/// <summary> /// Binds the group members grid. /// </summary> protected void BindInstancesGrid() { if (_template != null) { pnlInstances.Visible = true; lHeading.Text = string.Format("{0} Instances", _template.Name); var rockContext = new RockContext(); var template = new RegistrationTemplateService(rockContext).Get(_template.Id); var waitListCol = gInstances.ColumnsOfType <RockBoundField>().Where(f => f.DataField == "WaitList").First(); waitListCol.Visible = template != null && template.WaitListEnabled; var instanceService = new RegistrationInstanceService(rockContext); var qry = instanceService.Queryable().AsNoTracking() .Where(i => i.RegistrationTemplateId == _template.Id); // Date Range var drp = new DateRangePicker(); drp.DelimitedValues = rFilter.GetUserPreference("Date Range"); if (drp.LowerValue.HasValue) { qry = qry.Where(i => i.StartDateTime >= drp.LowerValue.Value); } if (drp.UpperValue.HasValue) { DateTime upperDate = drp.UpperValue.Value.Date.AddDays(1); qry = qry.Where(i => i.StartDateTime < upperDate); } string statusFilter = rFilter.GetUserPreference("Active Status"); if (!string.IsNullOrWhiteSpace(statusFilter)) { if (statusFilter == "inactive") { qry = qry.Where(i => i.IsActive == false); } else { qry = qry.Where(i => i.IsActive == true); } } SortProperty sortProperty = gInstances.SortProperty; if (sortProperty != null) { qry = qry.Sort(sortProperty); } else { qry = qry.OrderByDescending(a => a.StartDateTime); } var instanceQry = qry.Select(i => new { i.Id, i.Guid, i.Name, i.StartDateTime, i.EndDateTime, i.IsActive, Registrants = i.Registrations.Where(r => !r.IsTemporary).SelectMany(r => r.Registrants).Where(r => !r.OnWaitList).Count(), WaitList = i.Registrations.Where(r => !r.IsTemporary).SelectMany(r => r.Registrants).Where(r => r.OnWaitList).Count() }); gInstances.SetLinqDataSource(instanceQry); gInstances.DataBind(); } else { pnlInstances.Visible = false; } }