Ejemplo n.º 1
0
        /// <summary>
        /// Settle a sales activity
        /// </summary>
        /// <param name="salesActivity">The sales activity</param>
        /// <param name="context">The pipeline context</param>
        /// <returns>A <see cref="Task"/></returns>
        protected virtual async Task SettleSalesActivity(SalesActivity salesActivity, CommercePipelineExecutionContext context)
        {
            var knownSalesActivityStatuses = context.GetPolicy <KnownSalesActivityStatusesPolicy>();

            if (!salesActivity.PaymentStatus.Equals(knownSalesActivityStatuses.Pending, StringComparison.OrdinalIgnoreCase))
            {
                salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                await context.CommerceContext.AddMessage(
                    context.GetPolicy <KnownResultCodes>().Warning,
                    "InvalidSalesActivityPaymentStatus",
                    new object[] { salesActivity.Id },
                    $"Sales activity '{salesActivity.Id}' has an invalid payment state '{salesActivity.PaymentStatus}', payment status should be '{knownSalesActivityStatuses.Pending}'.")
                .ConfigureAwait(false);

                return;
            }

            var payment = salesActivity.GetComponent <FederatedPaymentComponent>();

            if (string.IsNullOrEmpty(payment.TransactionId))
            {
                salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                await context.CommerceContext.AddMessage(
                    context.GetPolicy <KnownResultCodes>().Error,
                    "InvalidOrMissingPropertyValue",
                    new object[] { "TransactionId" },
                    "Invalid or missing value for property 'TransactionId'.").ConfigureAwait(false);

                return;
            }

            payment.TransactionStatus   = "Success";
            salesActivity.PaymentStatus = knownSalesActivityStatuses.Settled;
        }
        public ActionResult DeleteConfirmed(int id)
        {
            SalesActivity salesActivity = db.SalesActivities.Find(id);

            db.SalesActivities.Remove(salesActivity);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
 public ActionResult Edit([Bind(Include = "Id,SalesLeadId,SalesActCodeId,Particulars,DtActivity,SalesActStatusId,DtEntered,EnteredBy")] SalesActivity salesActivity)
 {
     if (ModelState.IsValid)
     {
         db.Entry(salesActivity).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     ViewBag.SalesActCodeId   = new SelectList(db.SalesActCodes, "Id", "Name", salesActivity.SalesActCodeId);
     ViewBag.SalesLeadId      = new SelectList(db.SalesLeads, "Id", "Details", salesActivity.SalesLeadId);
     ViewBag.SalesActStatusId = new SelectList(db.SalesActStatus, "Id", "Name", salesActivity.SalesActStatusId);
     return(View(salesActivity));
 }
        /// <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);
        }
        // GET: SalesActivities/Details/5
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            SalesActivity salesActivity = db.SalesActivities.Find(id);

            if (salesActivity == null)
            {
                return(HttpNotFound());
            }
            return(View(salesActivity));
        }
Ejemplo n.º 6
0
        public ActionResult AddActivityCode([Bind(Include = "Id,SalesLeadId,SalesActCodeId,Particulars,DtActivity,SalesActStatusId,DtEntered,EnteredBy")] SalesActivity salesActivity)
        {
            if (ModelState.IsValid)
            {
                db.SalesActivities.Add(salesActivity);
                db.SaveChanges();
                return(RedirectToAction("Index", new { leadId = salesActivity.SalesLeadId }));
            }

            ViewBag.SalesActCodeId   = new SelectList(db.SalesActCodes, "Id", "Name", salesActivity.SalesActCodeId);
            ViewBag.SalesLeadId      = new SelectList(db.SalesLeads, "Id", "Details", salesActivity.SalesLeadId);
            ViewBag.SalesActStatusId = new SelectList(db.SalesActStatus, "Id", "Name", salesActivity.SalesActStatusId);
            return(View(salesActivity));
        }
        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);
        }
        // GET: SalesActivities/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            SalesActivity salesActivity = db.SalesActivities.Find(id);

            if (salesActivity == null)
            {
                return(HttpNotFound());
            }
            ViewBag.SalesActCodeId   = new SelectList(db.SalesActCodes, "Id", "Name", salesActivity.SalesActCodeId);
            ViewBag.SalesLeadId      = new SelectList(db.SalesLeads, "Id", "Details", salesActivity.SalesLeadId);
            ViewBag.SalesActStatusId = new SelectList(db.SalesActStatus, "Id", "Name", salesActivity.SalesActStatusId);
            return(View(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);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Settle a sales activity
        /// </summary>
        /// <param name="salesActivity">The sales activity</param>
        /// <param name="context">The pipeline context</param>
        /// <returns>A <see cref="Task"/></returns>
        protected virtual async Task SettleSalesActivity(SalesActivity salesActivity, CommercePipelineExecutionContext context)
        {
            var knownSalesActivityStatuses = context.GetPolicy <KnownSalesActivityStatusesPolicy>();

            if (!salesActivity.PaymentStatus.Equals(knownSalesActivityStatuses.Pending, StringComparison.OrdinalIgnoreCase))
            {
                salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                await context.CommerceContext.AddMessage(
                    context.GetPolicy <KnownResultCodes>().Warning,
                    "InvalidSalesActivityPaymentStatus",
                    new object[]
                {
                    salesActivity.Id
                },
                    $"Sales activity '{salesActivity.Id}' has an invalid payment state '{salesActivity.PaymentStatus}', payment status should be '{knownSalesActivityStatuses.Pending}'.")
                .ConfigureAwait(false);

                return;
            }

            var payment = salesActivity.GetComponent <FederatedPaymentComponent>();

            if (string.IsNullOrEmpty(payment.TransactionId))
            {
                salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                await context.CommerceContext.AddMessage(
                    context.GetPolicy <KnownResultCodes>().Error,
                    "InvalidOrMissingPropertyValue",
                    new object[]
                {
                    "TransactionId"
                },
                    "Invalid or missing value for property 'TransactionId'.").ConfigureAwait(false);

                return;
            }

            var braintreeClientPolicy = context.GetPolicy <BraintreeClientPolicy>();

            if (!await braintreeClientPolicy.IsValid(context.CommerceContext).ConfigureAwait(false))
            {
                salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                return;
            }

            try
            {
                var gateway =
                    new BraintreeGateway(
                        braintreeClientPolicy.Environment,
                        braintreeClientPolicy.MerchantId,
                        braintreeClientPolicy.PublicKey,
                        braintreeClientPolicy.PrivateKey);

                var transaction = await gateway.Transaction.FindAsync(payment.TransactionId).ConfigureAwait(false);

                if (transaction.Status != TransactionStatus.AUTHORIZED)
                {
                    salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                    await context.CommerceContext.AddMessage(
                        context.GetPolicy <KnownResultCodes>().Error,
                        "SettlePaymentFailed",
                        null,
                        $"{Name}. Can not submit transaction '{payment.TransactionId}' for settlement because its status is not Authorized. Sales Activity: {salesActivity.Id}. Order: {salesActivity.Order.EntityTarget}")
                    .ConfigureAwait(false);

                    return;
                }

                var result = await gateway.Transaction.SubmitForSettlementAsync(payment.TransactionId).ConfigureAwait(false);

                if (result.IsSuccess())
                {
                    transaction = result.Target;

                    if (transaction.Status == TransactionStatus.SUBMITTED_FOR_SETTLEMENT && braintreeClientPolicy.Environment.Equals("sandbox", StringComparison.OrdinalIgnoreCase))
                    {
                        transaction = await gateway.TestTransaction.SettleAsync(payment.TransactionId).ConfigureAwait(false);
                    }

                    switch (transaction.Status.ToString())
                    {
                    case "submitted_for_settlement":
                    case "settling":
                    case "settled":
                        salesActivity.PaymentStatus = knownSalesActivityStatuses.Settled;
                        context.Logger.LogInformation($"{Name}: Sales Activity '{salesActivity.Id}' was settled. Environment: {context.CommerceContext.Environment.Name}");
                        break;

                    default:
                        salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                        await context.CommerceContext.AddMessage(
                            context.GetPolicy <KnownResultCodes>().Error,
                            "SettlePaymentFailed",
                            null,
                            $"{Name}. Settle payment failed for '{payment.TransactionId}': {transaction.ProcessorResponseText}. Transaction's status is not settle or settling. Sales Activity: {salesActivity.Id}. Order: {salesActivity.Order.EntityTarget}")
                        .ConfigureAwait(false);

                        break;
                    }

                    payment.TransactionStatus = transaction.Status.ToString();
                }
                else
                {
                    salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                    var errorMessages = result.Errors.DeepAll().Aggregate(string.Empty, (current, error) => current + ("Error: " + (int)error.Code + " - " + error.Message + "\n"));
                    await context.CommerceContext.AddMessage(
                        context.GetPolicy <KnownResultCodes>().Error,
                        "SettlePaymentFailed",
                        null,
                        $"{Name}. Transaction '{payment.TransactionId}' failed to submit for settlement: {errorMessages}. Sales Activity: {salesActivity.Id}. Order: {salesActivity.Order.EntityTarget}")
                    .ConfigureAwait(false);
                }
            }
            catch (NotFoundException ex)
            {
                salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                await context.CommerceContext.AddMessage(
                    context.GetPolicy <KnownResultCodes>().Error,
                    "SettlePaymentFailed",
                    new object[]
                {
                    ex
                },
                    $"{Name}. Transaction '{payment.TransactionId}' not found. Sales Activity: {salesActivity.Id}. Order: {salesActivity.Order.EntityTarget}")
                .ConfigureAwait(false);
            }

            catch (NullReferenceException ex)
            {
                salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                await context.CommerceContext.AddMessage(
                    context.GetPolicy <KnownResultCodes>().Error,
                    "SettlePaymentFailed",
                    new object[]
                {
                    ex
                },
                    $"{Name}. Transaction '{payment.TransactionId}' set. Sales Activity: {salesActivity.Id}. Order: {salesActivity.Order.EntityTarget}")
                .ConfigureAwait(false);
            }
            catch (BraintreeException ex)
            {
                salesActivity.PaymentStatus = knownSalesActivityStatuses.Problem;
                await context.CommerceContext.AddMessage(
                    context.GetPolicy <KnownResultCodes>().Error,
                    "SettlePaymentFailed",
                    new object[]
                {
                    ex
                },
                    $"{Name}. A Braintree exception occurred when trying to settle transaction '{payment.TransactionId}'. Sales Activity: {salesActivity.Id}. Order: {salesActivity.Order.EntityTarget}")
                .ConfigureAwait(false);
            }
        }