/// <summary>
        /// Generates the sales activity.
        /// </summary>
        /// <param name="order">The order.</param>
        /// <param name="existingPayment">The existingPayment.</param>
        /// <param name="paymentToRefund">The payment to refund</param>
        /// <param name="refundTransactionId">The refund transaction identifier.</param>
        /// <param name="context">The context.</param>
        /// <returns>
        /// A <see cref="Task" />
        /// </returns>
        protected virtual async Task GenerateSalesActivity(Order order, PaymentComponent existingPayment, PaymentComponent paymentToRefund, string refundTransactionId, CommercePipelineExecutionContext context)
        {
            var salesActivity = new SalesActivity
            {
                Id             = $"{CommerceEntity.IdPrefix<SalesActivity>()}{Guid.NewGuid():N}",
                ActivityAmount = new Money(existingPayment.Amount.CurrencyCode, paymentToRefund.Amount.Amount * -1),
                Customer       = new EntityReference
                {
                    EntityTarget = order.EntityComponents.OfType <ContactComponent>().FirstOrDefault()?.CustomerId
                },
                Order = new EntityReference
                {
                    EntityTarget         = order.Id,
                    EntityTargetUniqueId = order.UniqueId
                },
                Name          = "Refund the Federated Payment",
                PaymentStatus = context.GetPolicy <KnownSalesActivityStatusesPolicy>().Completed
            };

            salesActivity.SetComponent(new ListMembershipsComponent
            {
                Memberships = new List <string>
                {
                    CommerceEntity.ListName <SalesActivity>(),
                    context.GetPolicy <KnownOrderListsPolicy>().SalesCredits,
                    string.Format(CultureInfo.InvariantCulture, context.GetPolicy <KnownOrderListsPolicy>().OrderSalesActivities, order.FriendlyId)
                }
            });

            if (existingPayment.Amount.Amount != paymentToRefund.Amount.Amount)
            {
                salesActivity.SetComponent(existingPayment);
            }

            if (!string.IsNullOrEmpty(refundTransactionId))
            {
                salesActivity.SetComponent(new TransactionInformationComponent(refundTransactionId));
            }

            var salesActivities = order.SalesActivity.ToList();

            salesActivities.Add(new EntityReference
            {
                EntityTarget         = salesActivity.Id,
                EntityTargetUniqueId = salesActivity.UniqueId
            });
            order.SalesActivity = salesActivities;

            await _persistPipeline.Run(new PersistEntityArgument(salesActivity), context).ConfigureAwait(false);
        }
        private async Task GenerateSalesActivity(Order order,
                                                 PaymentComponent existingPayment,
                                                 PaymentComponent paymentToRefund,
                                                 CommercePipelineExecutionContext context)
        {
            var salesActivity = new SalesActivity
            {
                Id             = $"{CommerceEntity.IdPrefix<SalesActivity>()}{Guid.NewGuid():N}",
                ActivityAmount = new Money(existingPayment.Amount.CurrencyCode, paymentToRefund.Amount.Amount * -1),
                Customer       = new EntityReference
                {
                    EntityTarget = order.EntityComponents.OfType <ContactComponent>().FirstOrDefault()?.CustomerId
                },
                Order = new EntityReference
                {
                    EntityTarget = order.Id
                },
                Name          = "Simple Payment Refund",
                PaymentStatus = context.GetPolicy <KnownSalesActivityStatusesPolicy>().Completed
            };

            // Add the new sales activity to the OrderSalesActivities list
            salesActivity.SetComponent(new ListMembershipsComponent
            {
                Memberships = new List <string>
                {
                    CommerceEntity.ListName <SalesActivity>(),
                    context.GetPolicy <KnownOrderListsPolicy>().SalesCredits,
                    string.Format(context.GetPolicy <KnownOrderListsPolicy>().OrderSalesActivities, order.FriendlyId)
                }
            });

            if (existingPayment.Amount.Amount != paymentToRefund.Amount.Amount)
            {
                salesActivity.SetComponent(existingPayment);
            }

            var salesActivities = order.SalesActivity.ToList();

            salesActivities.Add(new EntityReference {
                EntityTarget = salesActivity.Id
            });
            order.SalesActivity = salesActivities;

            await Commander.PersistEntity(context.CommerceContext, salesActivity);
        }
        /// <summary>
        /// Generates the sales activity.
        /// </summary>
        /// <param name="order">The order.</param>
        /// <param name="payment">The payment.</param>
        /// <param name="context">The context.</param>
        /// <returns>A <see cref="Task"/></returns>
        protected virtual async Task GenerateSalesActivity(Order order, PaymentComponent payment, CommercePipelineExecutionContext context)
        {
            var salesActivity = new SalesActivity
            {
                Id             = CommerceEntity.IdPrefix <SalesActivity>() + Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture),
                ActivityAmount = new Money(payment.Amount.CurrencyCode, 0),
                Customer       = new EntityReference
                {
                    EntityTarget = order.EntityComponents.OfType <ContactComponent>().FirstOrDefault()?.CustomerId
                },
                Order = new EntityReference
                {
                    EntityTarget         = order.Id,
                    EntityTargetUniqueId = order.UniqueId
                },
                Name          = "Void the Federated payment",
                PaymentStatus = context.GetPolicy <KnownSalesActivityStatusesPolicy>().Void
            };

            salesActivity.SetComponent(new ListMembershipsComponent
            {
                Memberships = new List <string>
                {
                    CommerceEntity.ListName <SalesActivity>(),
                    string.Format(CultureInfo.InvariantCulture, context.GetPolicy <KnownOrderListsPolicy>().OrderSalesActivities, order.FriendlyId)
                }
            });

            salesActivity.SetComponent(payment);

            var salesActivities = order.SalesActivity.ToList();

            salesActivities.Add(new EntityReference
            {
                EntityTarget         = salesActivity.Id,
                EntityTargetUniqueId = salesActivity.UniqueId
            });
            order.SalesActivity = salesActivities;

            await _persistEntityPipeline.Run(new PersistEntityArgument(salesActivity), context).ConfigureAwait(false);
        }
        protected async virtual Task GenerateSalesActivity(Order order, PaymentComponent payment, CommercePipelineExecutionContext context)
        {
            var salesActivity = new SalesActivity
            {
                Id             = CommerceEntity.IdPrefix <SalesActivity>() + Guid.NewGuid().ToString("N"),
                ActivityAmount = new Money(payment.Amount.CurrencyCode, payment.Amount.Amount),
                Customer       = new EntityReference
                {
                    EntityTarget = order.Components.OfType <ContactComponent>().FirstOrDefault()?.CustomerId
                },
                Order = new EntityReference
                {
                    EntityTarget = order.Id
                },
                Name          = "Refund the Federated Payment",
                PaymentStatus = "Completed"
            };

            salesActivity.SetComponent(new ListMembershipsComponent
            {
                Memberships = new List <string>
                {
                    CommerceEntity.ListName <SalesActivity>(),
                    context.GetPolicy <KnownOrderListsPolicy>().SalesCredits,
                    string.Format(context.GetPolicy <KnownOrderListsPolicy>().OrderSalesActivities, order.FriendlyId)
                }
            });

            salesActivity.SetComponent(payment);

            var salesActivities = order.SalesActivity.ToList();

            salesActivities.Add(new EntityReference {
                EntityTarget = salesActivity.Id
            });
            order.SalesActivity = salesActivities;

            await this._persistPipeline.Run(new PersistEntityArgument(salesActivity), context);
        }