public OrderRecord UpdateOrderStatus(PayPalPaymentInfo payPalPaymentInfo)
        {
            var order = GetOrderByNumber(payPalPaymentInfo.invoice);

            OrderStatus orderStatus;

            switch (payPalPaymentInfo.payment_status.ToLower())
            {
            case "completed":
                orderStatus = OrderStatus.Paid;
                break;

            default:
                orderStatus = OrderStatus.Cancelled;
                break;
            }

            //if (order.Status == orderStatus)
            //     return;

            order.Status = orderStatus;
            order.PaymentServiceProviderResponse = JsonConvert.SerializeObject(payPalPaymentInfo);
            order.PaymentReference = payPalPaymentInfo.txn_id;

            switch (order.Status)
            {
            case OrderStatus.Paid:
                order.PaidAt = _dateTimeService.Now;
                break;

            case OrderStatus.Completed:
                order.CompletedAt = _dateTimeService.Now;
                break;

            case OrderStatus.Cancelled:
                order.CancelledAt = _dateTimeService.Now;
                break;
            }

            //PayPalLog.Debug(JsonConvert.SerializeObject(order));

            // _orderRepository.Update(order);

            PayPalLog.Debug("Updated");
            return(order);
        }
        public HttpStatusCodeResult IPN(FormCollection result)
        {
            try
            {
                var payPalPaymentInfo = new PayPalPaymentInfo();

                TryUpdateModel(payPalPaymentInfo, result.ToValueProvider());

                var model = new PayPalListenerModel {
                    PayPalPaymentInfo = payPalPaymentInfo
                };

                var parameters = Request.BinaryRead(Request.ContentLength);

                if (parameters.Length > 0)
                {
                    model.GetStatus(parameters);
                    PayPalLog.Debug(payPalPaymentInfo.invoice);
                    PayPalLog.Debug(payPalPaymentInfo.payment_status);

                    try
                    {
                        var order = _orderService.GetOrderByNumber(payPalPaymentInfo.invoice);

                        OrderStatus orderStatus;

                        switch (payPalPaymentInfo.payment_status.ToLower())
                        {
                        case "completed":
                            orderStatus = OrderStatus.Paid;
                            break;

                        default:
                            orderStatus = OrderStatus.Cancelled;
                            break;
                        }

                        order.Status           = orderStatus;
                        order.PaymentReference = payPalPaymentInfo.txn_id;

                        switch (order.Status)
                        {
                        case OrderStatus.Paid:
                            order.PaidAt = DateTime.Now;
                            break;

                        case OrderStatus.Completed:
                            order.CompletedAt = DateTime.Now;
                            break;

                        case OrderStatus.Cancelled:
                            order.CancelledAt = DateTime.Now;
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        PayPalLog.Debug(string.Format("Error saving order [{0}] {1}", payPalPaymentInfo.invoice,
                                                      JsonConvert.SerializeObject(payPalPaymentInfo)));
                        PayPalLog.Error(ex);
                    }
                }
                else
                {
                    PayPalLog.Debug(string.Format("No PayPal return parameters [{0}]",
                                                  JsonConvert.SerializeObject(result)));
                }
            }
            catch (Exception ex)
            {
                PayPalLog.Debug(string.Format("Error unknown [{0}] {1}", ex.Message,
                                              result));
                PayPalLog.Error(ex);
            }
            return(new HttpStatusCodeResult(200, "Success"));
        }