public void Ensure_order_cannot_be_marked_as_paid_when_orderStatus_is_cancelled_or_paymentStatus_is_paid_or_refunded_or_voided() { var order = new Order(); foreach (OrderStatus os in Enum.GetValues(typeof(OrderStatus))) { foreach (PaymentStatus ps in Enum.GetValues(typeof(PaymentStatus))) { foreach (ShippingStatus ss in Enum.GetValues(typeof(ShippingStatus))) { order.OrderStatus = os; order.PaymentStatus = ps; order.ShippingStatus = ss; if (os == OrderStatus.Cancelled || ps == PaymentStatus.Paid || ps == PaymentStatus.Refunded || ps == PaymentStatus.Voided) { _orderProcessingService.CanMarkOrderAsPaid(order).ShouldBeFalse(); } else { _orderProcessingService.CanMarkOrderAsPaid(order).ShouldBeTrue(); } } } } }
public void EnsureOrderCannotBeMarkedAsPaidWhenOrderStatusIsCancelledOrPaymentStatusIsPaidOrRefundedOrVoided() { var order = new Order(); foreach (OrderStatus os in Enum.GetValues(typeof(OrderStatus))) { foreach (PaymentStatus ps in Enum.GetValues(typeof(PaymentStatus))) { foreach (ShippingStatus ss in Enum.GetValues(typeof(ShippingStatus))) { order.OrderStatus = os; order.PaymentStatus = ps; order.ShippingStatus = ss; if (os == OrderStatus.Cancelled || ps == PaymentStatus.Paid || ps == PaymentStatus.Refunded || ps == PaymentStatus.Voided) { _orderProcessingService.CanMarkOrderAsPaid(order).Should().BeFalse(); } else { _orderProcessingService.CanMarkOrderAsPaid(order).Should().BeTrue(); } } } } }
public ActionResult PDTHandler(FormCollection form) { Dictionary <string, string> values; var tx = Services.WebHelper.QueryString <string>("tx"); var utcNow = DateTime.UtcNow; var orderNumberGuid = Guid.Empty; var orderNumber = string.Empty; var total = decimal.Zero; string response; var provider = PaymentService.LoadPaymentMethodBySystemName(PayPalStandardProvider.SystemName, true); var processor = provider != null ? provider.Value as PayPalStandardProvider : null; if (processor == null) { Logger.Warn(null, T("Plugins.Payments.PayPal.NoModuleLoading", "PDTHandler")); return(RedirectToAction("Completed", "Checkout", new { area = "" })); } var settings = Services.Settings.LoadSetting <PayPalStandardPaymentSettings>(); if (processor.GetPDTDetails(tx, settings, out values, out response)) { values.TryGetValue("custom", out orderNumber); try { orderNumberGuid = new Guid(orderNumber); } catch { } var order = OrderService.GetOrderByGuid(orderNumberGuid); if (order != null) { try { total = decimal.Parse(values["mc_gross"], new CultureInfo("en-US")); } catch (Exception ex) { Logger.Error(ex, T("Plugins.Payments.PayPalStandard.FailedGetGross")); } values.TryGetValue("payer_status", out string payer_status); values.TryGetValue("payment_status", out string payment_status); values.TryGetValue("pending_reason", out string pending_reason); values.TryGetValue("mc_currency", out string mc_currency); values.TryGetValue("txn_id", out string txn_id); values.TryGetValue("payment_type", out string payment_type); values.TryGetValue("payer_id", out string payer_id); values.TryGetValue("receiver_id", out string receiver_id); values.TryGetValue("invoice", out string invoice); values.TryGetValue("payment_fee", out string payment_fee); var paymentNote = T("Plugins.Payments.PayPalStandard.PaymentNote", total, mc_currency, payer_status, payment_status, pending_reason, txn_id, payment_type, payer_id, receiver_id, invoice, payment_fee); OrderService.AddOrderNote(order, paymentNote); // validate order total... you may get differences if settings.PassProductNamesAndTotals is true if (settings.PdtValidateOrderTotal) { var roundedTotal = Math.Round(total, 2); var roundedOrderTotal = Math.Round(order.OrderTotal, 2); var roundedDifference = Math.Abs(roundedTotal - roundedOrderTotal); if (!roundedTotal.Equals(roundedOrderTotal)) { var message = T("Plugins.Payments.PayPalStandard.UnequalTotalOrder", total, roundedOrderTotal.FormatInvariant(), order.OrderTotal, roundedDifference.FormatInvariant()); if (settings.PdtValidateOnlyWarn) { OrderService.AddOrderNote(order, message); } else { Logger.Error(message); return(RedirectToAction("Index", "Home", new { area = "" })); } } } // mark order as paid var newPaymentStatus = GetPaymentStatus(payment_status, pending_reason, total, order.OrderTotal); if (newPaymentStatus == PaymentStatus.Paid) { // note, order can be marked as paid through IPN if (order.AuthorizationTransactionId.IsEmpty()) { order.AuthorizationTransactionId = order.CaptureTransactionId = txn_id; order.AuthorizationTransactionResult = order.CaptureTransactionResult = "Success"; OrderService.UpdateOrder(order); } if (OrderProcessingService.CanMarkOrderAsPaid(order)) { OrderProcessingService.MarkOrderAsPaid(order); } } } return(RedirectToAction("Completed", "Checkout", new { area = "" })); } else { try { values.TryGetValue("custom", out orderNumber); orderNumberGuid = new Guid(orderNumber); var order = OrderService.GetOrderByGuid(orderNumberGuid); OrderService.AddOrderNote(order, "{0} {1}".FormatInvariant(T("Plugins.Payments.PayPalStandard.PdtFailed"), response)); } catch { } return(RedirectToAction("Index", "Home", new { area = "" })); } }