Beispiel #1
0
        /// <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));
        }
Beispiel #2
0
        /// <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);
            }
        }
Beispiel #3
0
        /// <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;
            }
        }
Beispiel #16
0
        /// <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();
        }
Beispiel #19
0
        /// <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;
            }
        }