public ActionResult PaymentPre(string orderId, string userName)
        {
            // Retrieve Work Order
            WorkOrder workOrder = woServ.Get(Convert.ToInt32(orderId));

            if (workOrder == null)
            {
                levent.Level = LogLevel.Error;
                levent.Message = "WorkOrder ID not valid Work Order. WO#:" + orderId;
                log.Log(levent);
                return View("IndexError", workOrder);
            }

            double payment = workOrder.transportFee;
            if (payment <= 0.0)
            {
                levent.Level = LogLevel.Error;
                levent.Message = "There is no transportation fee associated with this work order - there is no PayPal transaction required. WO#:" + orderId;
                log.Log(levent);
                return View("IndexError", workOrder);
            }

            PaypalExpressCheckout paypal = new PaypalExpressCheckout();

            SetExpressCheckoutResponseType response = paypal.SetExpressCheckout(payment.ToString());
            if (response != null)
            {
                // # Success values
                if (response.Ack.ToString().Trim().ToUpper().Equals("SUCCESS"))
                {
                    // # Redirecting to PayPal for authorization
                    // Once you get the "Success" response, needs to authorise the
                    // transaction by making buyer to login into PayPal. For that,
                    // need to construct redirect url using EC token from response.
                    // For example,
                    // `redirectURL="https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=" + setExpressCheckoutResponse.Token;`

                    // Save PayPal token
                    workOrder.paypalToken = response.Token;

                    // Save work order updates
                    woServ.Save(workOrder, userName);

                    object paypalConfigSection = null;
                    try
                    {
                        paypalConfigSection = System.Web.Configuration.WebConfigurationManager.GetSection("paypal");
                    }
                    catch (System.Exception ex)
                    {
                        throw new ConfigException("Unable to load 'paypal' section from *.config: " + ex.Message);
                    }

                    if (paypalConfigSection == null)
                    {
                        throw new ConfigException(
                            "Cannot parse *.Config file. Ensure you have configured the 'paypal' section correctly.");
                    }

                    NameValueConfigurationCollection paypalSettings = (NameValueConfigurationCollection)paypalConfigSection.GetType().GetProperty("Settings").GetValue(paypalConfigSection, null);

                    var paypalUrl = paypalSettings["paypalUrl"].Value;
                    var redirectUrl = paypalUrl + "_express-checkout&token=" + response.Token;

                    return new RedirectResult(redirectUrl, false);

                }
                // # Error Values
                else
                {
                    List<ErrorType> errorMessages = response.Errors;
                    foreach (ErrorType error in errorMessages)
                    {
                        levent.Level = LogLevel.Error;
                        levent.Message += error.LongMessage;
                        log.Log(levent);

                        workOrder.paypalErrors += error.ShortMessage;
                    }

                    // Save work order updates
                    woServ.Save(workOrder, userName);

                    return View("IndexError", workOrder);
                }
            }
            else
            {
                levent.Level = LogLevel.Error;
                levent.Message = "The response from PayPal SetExpressCheckoutResponseType API was null. WO#:" + orderId;
                log.Log(levent);
                return View("IndexError", workOrder);
            }
        }
        public ActionResult PaymentPost(string token, string payerId, string userName)
        {
            double payment = 0.0;

            // TODO: There was an issue with the WO returned by the first query below - the work order
            // can't be saved unless the work order is retrieved with the woServ.Get() call
            WorkOrder woAll = woServ.GetRepo().GetAllQ().Where(wo => wo.paypalToken == token).FirstOrDefault();
            WorkOrder workOrder = woServ.Get(woAll.ID);
            if (workOrder != null)
            {
                if (workOrder.transportFee <= 0.0)
                {
                    levent.Level = LogLevel.Error;
                    levent.Message = "There is no transportation fee associated with this work order - there is no PayPal transaction required. WO#:" + workOrder.ID;
                    log.Log(levent);
                    return View("IndexError", workOrder);
                }
                else
                {
                    payment = workOrder.transportFee;
                }
            }
            else
            {
                levent.Level = LogLevel.Error;
                levent.Message = "WorkOrder ID not valid Work Order. WO#:" + workOrder.ID;
                log.Log(levent);
                return View("IndexError", workOrder);
            }

            // PayPal call to get buyer details
            PaypalExpressCheckout paypal = new PaypalExpressCheckout();
            GetExpressCheckoutDetailsResponseType detailsResponse = paypal.GetExpressCheckoutDetails(token);

            if (detailsResponse != null)
            {
                // # Success values
                if (detailsResponse.Ack.ToString().Trim().ToUpper().Equals("SUCCESS"))
                {
                    if ((detailsResponse.GetExpressCheckoutDetailsResponseDetails.PaymentDetails == null) ||
                        (Convert.ToDouble(detailsResponse.GetExpressCheckoutDetailsResponseDetails.PaymentDetails[0].OrderTotal.value) != workOrder.transportFee))
                    {
                        // PayPal charge is different than transportFee in database - can't process payment
                        levent.Level = LogLevel.Error;
                        levent.Message = "Transport Fee request to PayPal is a different amount than associated with the WO in database. WO# " + workOrder.ID;
                        log.Log(levent);
                        return View("IndexError", workOrder);
                    }

                    // Unique PayPal Customer Account identification number. This value will be null unless
                    // you authorize the payment by redirecting to PayPal after `SetExpressCheckout` call.
                    workOrder.paypalPayerId = detailsResponse.GetExpressCheckoutDetailsResponseDetails.PayerInfo.PayerID;

                    woServ.Save(workOrder, userName);

                }
                // # Error Values
                else
                {
                    List<ErrorType> errorMessages = detailsResponse.Errors;
                    foreach (ErrorType error in errorMessages)
                    {
                        levent.Level = LogLevel.Error;
                        levent.Message += error.LongMessage;
                        log.Log(levent);

                        workOrder.paypalErrors += error.ShortMessage;
                    }

                    // Save work order updates
                    woServ.Save(workOrder, userName);

                    return View("IndexError", workOrder);
                }
            }
            else
            {
                levent.Level = LogLevel.Error;
                levent.Message = "The response from PayPal GetExpressCheckoutDetailsResponseType API was null. WO#:" + workOrder.ID;
                log.Log(levent);
                return View("IndexError", workOrder);
            }

            return View("IndexPostPaypal", workOrder);
        }