/// <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)); }
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); }
/// <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); } }