internal static HttpResponseMessage CancelPurchase(LatitudePayCancelPurchaseRequest request)
        {
            var existingPayment = (from p in _Payments where request.PaymentPlanToken == p.InitialResponse.Token select p).FirstOrDefault();

            if (existingPayment == null)
            {
                return(ToJsonHttpResponse(HttpStatusCode.NotFound, new { error = "Payment not found" }));
            }

            if (existingPayment.IsCancelled || existingPayment.CurrentPaymentStatus == LatitudePayConstants.StatusDeclined)
            {
                return(ToJsonHttpResponse(HttpStatusCode.NotFound, new { error = "Payment is already declined" }));
            }

            existingPayment.IsCancelled          = true;
            existingPayment.CurrentPaymentStatus = LatitudePayConstants.StatusDeclined;
            existingPayment.StatusMessage        = "Cancelled by merchant";
            existingPayment.CancelledDate        = DateTimeOffset.Now;

            return(ToJsonHttpResponse(existingPayment.InitialResponseStatus, new LatitudePayCancelPurchaseResponse()
            {
                CancelledDate = existingPayment.CancelledDate.Date, Token = existingPayment.InitialResponse.Token
            }));
        }
        public async Task Cancel()
        {
            using (var client = TestUtils.GetMockClient())
            {
                var request = new LatitudePayCreatePosPurchaseRequest()
                {
                    Reference      = "TBC-" + System.Guid.NewGuid().ToString(),
                    BillingAddress = new LatitudePayAddress()
                    {
                        AddressLine1 = "124 Fifth Avenue",
                        Suburb       = "Auckland",
                        CityTown     = "Auckland",
                        State        = "Auckland",
                        Postcode     = "1010",
                        CountryCode  = "NZ"
                    },
                    ShippingAddress = new LatitudePayAddress()
                    {
                        AddressLine1 = "124 Fifth Avenue",
                        Suburb       = "Auckland",
                        CityTown     = "Auckland",
                        State        = "Auckland",
                        Postcode     = "1010",
                        CountryCode  = "NZ"
                    },
                    Customer = new LatitudePayCustomer()
                    {
                        Address = new LatitudePayAddress()
                        {
                            AddressLine1 = "124 Fifth Avenue",
                            Suburb       = "Auckland",
                            CityTown     = "Auckland",
                            State        = "Auckland",
                            Postcode     = "1010",
                            CountryCode  = "NZ"
                        },
                        FirstName    = "John",
                        Surname      = "Doe",
                        MobileNumber = Environment.GetEnvironmentVariable("LatitudePay_TestMobileNumber")
                    },
                    Products = new List <LatitudePayProduct>()
                    {
                        new LatitudePayProduct()
                        {
                            Name        = "Tennis Ball Multipack",
                            Price       = new LatitudePayMoney(30, "NZD"),
                            Sku         = "abc123",
                            Quantity    = 1,
                            TaxIncluded = true
                        }
                    },
                    ShippingLines = new List <LatitiudePayShippingLine>()
                    {
                        new LatitiudePayShippingLine()
                        {
                            Carrier = "NZ Post",
                            Price   = new LatitudePayMoney(5.5M, "NZD")
                        }
                    },
                    TaxAmount   = new LatitudePayMoney(5.325M, "NZD"),
                    TotalAmount = new LatitudePayMoney(35.5M, "NZD"),
                    ReturnUrls  = new LatitudePayReturnUrls()
                    {
                        SuccessUrl  = new Uri("http://genoapay.com/success"),
                        FailUrl     = new Uri("http://genoapay.com/fail"),
                        CallbackUrl = new Uri("http://genoapay.com/fail-safe-callback")
                    }
                };

                var purchaseResponse = await client.CreatePosPurchaseAsync(request);

                Assert.IsNotNull(purchaseResponse);
                Assert.IsFalse(String.IsNullOrWhiteSpace(purchaseResponse.Token));
                Assert.IsNotNull(purchaseResponse.StatusUrl);

                //Wait until payment enters final status
                var cancelRequest = new LatitudePayCancelPurchaseRequest()
                {
                    PaymentPlanToken = purchaseResponse.Token
                };

                await Task.Delay(5000).ConfigureAwait(false);

                var cancelResponse = await client.CancelPurchaseAsync(cancelRequest).ConfigureAwait(false);

                Assert.IsNotNull(cancelResponse);
                Assert.IsFalse(String.IsNullOrWhiteSpace(cancelResponse.Token));

                var statusRequest = new LatitudePayPurchaseStatusRequest()
                {
                    PaymentPlanToken = purchaseResponse.Token
                };
                var paymentStatus = await client.GetPurchaseStatusAsync(statusRequest).ConfigureAwait(false);

                Assert.IsNotNull(paymentStatus);
                Assert.AreEqual(LatitudePayConstants.StatusDeclined, paymentStatus.Status);
            }
        }