예제 #1
0
        private void BindData()
        {
            RockContext rockContext = new RockContext();

            dvpRefundReason.DefinedTypeId = DefinedTypeCache.Get(Rock.SystemGuid.DefinedType.FINANCIAL_TRANSACTION_REFUND_REASON.AsGuid(), rockContext).Id;

            if (!ddlSystemCommunication.SelectedValueAsInt().HasValue)
            {
                SystemCommunicationService systemCommunicationService = new SystemCommunicationService(rockContext);
                var systemCommunications = systemCommunicationService.Queryable().Where(c => c.IsActive == true).Select(e => new { Title = e.Category.Name + " - " + e.Title, e.Id }).OrderBy(e => e.Title).ToList();
                systemCommunications.Insert(0, new { Title = "", Id = 0 });
                ddlSystemCommunication.DataSource     = systemCommunications;
                ddlSystemCommunication.DataValueField = "Id";
                ddlSystemCommunication.DataTextField  = "Title";
                ddlSystemCommunication.DataBind();
            }

            List <int> registrationTemplateIds = rtpRegistrationTemplate.ItemIds.AsIntegerList();

            registrationTemplateIds.RemoveAll(i => i.Equals(0));
            int     itemCount     = 0;
            decimal totalPayments = 0;

            if (liRegistration.Visible == true && registrationTemplateIds.Count > 0)
            {
                RegistrationTemplateService registrationTemplateService = new RegistrationTemplateService(rockContext);
                var templates = registrationTemplateService.GetByIds(rtpRegistrationTemplate.ItemIds.AsIntegerList());
                var instances = templates.SelectMany(t => t.Instances);
                if (ddlRegistrationInstance.SelectedValueAsId().HasValue&& ddlRegistrationInstance.SelectedValueAsId() > 0)
                {
                    var instanceId = ddlRegistrationInstance.SelectedValueAsId();
                    instances = instances.Where(i => i.Id == instanceId);
                }
                itemCount     = instances.SelectMany(i => i.Registrations).Count();
                totalPayments = instances.SelectMany(i => i.Registrations).ToList().SelectMany(r => r.Payments).Sum(p => p.Transaction.TotalAmount);

                if (!ddlRegistrationInstance.SelectedValueAsInt().HasValue)
                {
                    var instanceList = templates.SelectMany(t => t.Instances).OrderBy(i => i.Name).Select(i => new { i.Id, i.Name }).ToList();
                    instanceList.Insert(0, new { Id = 0, Name = "" });
                    ddlRegistrationInstance.DataSource     = instanceList;
                    ddlRegistrationInstance.DataValueField = "Id";
                    ddlRegistrationInstance.DataTextField  = "Name";
                    ddlRegistrationInstance.DataBind();
                }
            }

            if (liTransactionCodes.Visible == true && tbTransactionCodes.Text.Length > 0)
            {
                var codes = tbTransactionCodes.Text.SplitDelimitedValues();
                FinancialTransactionService financialTransactionService = new FinancialTransactionService(rockContext);
                var transactions = financialTransactionService.Queryable().Where(ft => codes.Contains(ft.TransactionCode));
                totalPayments = transactions.SelectMany(t => t.TransactionDetails).Sum(td => td.Amount);
                itemCount     = transactions.Count();
            }
            lAlert.Text = itemCount + (pnlRegistration.Visible?" Registrations - ": " Transactions - ") + totalPayments.FormatAsCurrency() + " Total";
        }
        private void BindData()
        {
            RockContext rockContext = new RockContext();

            dvpRefundReason.DefinedTypeId = DefinedTypeCache.Get(Rock.SystemGuid.DefinedType.FINANCIAL_TRANSACTION_REFUND_REASON.AsGuid(), rockContext).Id;

            if (!ddlSystemEmail.SelectedValueAsInt().HasValue)
            {
                SystemEmailService systemEmailService = new SystemEmailService(rockContext);
                var systemEmails = systemEmailService.Queryable().Select(e => new { Title = e.Category.Name + " - " + e.Title, e.Id }).OrderBy(e => e.Title).ToList();
                systemEmails.Insert(0, new { Title = "", Id = 0 });
                ddlSystemEmail.DataSource     = systemEmails;
                ddlSystemEmail.DataValueField = "Id";
                ddlSystemEmail.DataTextField  = "Title";
                ddlSystemEmail.DataBind();
            }

            List <int> registrationTemplateIds = rtpRegistrationTemplate.ItemIds.AsIntegerList();

            registrationTemplateIds.RemoveAll(i => i.Equals(0));

            if (registrationTemplateIds.Count > 0)
            {
                RegistrationTemplateService registrationTemplateService = new RegistrationTemplateService(rockContext);
                var templates = registrationTemplateService.GetByIds(rtpRegistrationTemplate.ItemIds.AsIntegerList());
                var instances = templates.SelectMany(t => t.Instances);
                if (ddlRegistrationInstance.SelectedValueAsId().HasValue&& ddlRegistrationInstance.SelectedValueAsId() > 0)
                {
                    var instanceId = ddlRegistrationInstance.SelectedValueAsId();
                    instances = instances.Where(i => i.Id == instanceId);
                }
                int registrationCount = instances.SelectMany(i => i.Registrations).Count();
                var totalPayments     = instances.SelectMany(i => i.Registrations).ToList().SelectMany(r => r.Payments).Sum(p => p.Transaction.TotalAmount);
                lAlert.Text = registrationCount + " Registrations - " + totalPayments.FormatAsCurrency() + " Total";

                if (!ddlRegistrationInstance.SelectedValueAsInt().HasValue)
                {
                    var instanceList = templates.SelectMany(t => t.Instances).OrderBy(i => i.Name).Select(i => new { i.Id, i.Name }).ToList();
                    instanceList.Insert(0, new { Id = 0, Name = "" });
                    ddlRegistrationInstance.DataSource     = instanceList;
                    ddlRegistrationInstance.DataValueField = "Id";
                    ddlRegistrationInstance.DataTextField  = "Name";
                    ddlRegistrationInstance.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();
        }
예제 #4
0
        /// <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();
        }