/// <summary>
        /// PreparedPayment contacts the server with the payment request data, and returns a GET URL to that
        /// payment. This is convenient for creating an order and then sending the URL e.g. in an email.
        /// </summary>
        /// <returns>PaymentLink</returns>
        public Uri PreparePayment(String ipAddress)
        {
            IpAddress = ipAddress;
            CalculateRequestValues();
            var    xmlBuilder = new HostedXmlBuilder();
            string xml        = xmlBuilder.GetXml(this);

            var secretWord = CrOrderBuilder.GetConfig()
                             .GetSecretWord(PaymentType.HOSTED, CrOrderBuilder.GetCountryCode());
            var sentMerchantId = CrOrderBuilder.GetConfig()
                                 .GetMerchantId(PaymentType.HOSTED, CrOrderBuilder.GetCountryCode());
            var payPageUrl = CrOrderBuilder.GetConfig()
                             .GetEndPoint(PaymentType.HOSTED);

            var baseUrl = payPageUrl.Replace("/payment", "");

            var hostedRequest = new HostedAdminRequest(xml, secretWord, sentMerchantId, baseUrl);

            var targetAddress = baseUrl + "/rest/preparepayment";

            var message    = HostedAdminRequest.HostedAdminCall(targetAddress, hostedRequest).Message;
            var messageDoc = new XmlDocument();

            messageDoc.LoadXml(message);
            var paymentId = messageDoc.SelectSingleNode("//id").InnerText;

            return(new Uri(baseUrl + "/preparedpayment/" + paymentId));
        }
        public void TestRecur()
        {
            const string customerRefNo       = "Customer reference number or client order number";
            const string subscriptionId      = "The subscription id";
            const long   amount              = 66600L;
            var          hostedActionRequest = new HostedAdmin(SveaConfig.GetDefaultConfig(), CountryCode.SE)
                                               .Recur(new Recur(
                                                          customerRefNo: customerRefNo,
                                                          subscriptionId: subscriptionId,
                                                          currency: Currency.SEK,
                                                          amount: amount
                                                          ));

            HostedAdminRequest hostedAdminRequest = hostedActionRequest.PrepareRequest();

            Assert.That(hostedAdminRequest.MessageXmlDocument.SelectSingleNode("/recur/currency").InnerText, Is.EqualTo(Currency.SEK.ToString()));
            Assert.That(hostedAdminRequest.MessageXmlDocument.SelectSingleNode("/recur/amount").InnerText, Is.EqualTo(amount + ""));
            Assert.That(hostedAdminRequest.MessageXmlDocument.SelectSingleNode("/recur/customerrefno").InnerText, Is.EqualTo(customerRefNo));
            Assert.That(hostedAdminRequest.MessageXmlDocument.SelectSingleNode("/recur/subscriptionid").InnerText, Is.EqualTo(subscriptionId));

            var hostedAdminResponse = hostedActionRequest.DoRequest <HostedAdminResponse>();

            //Call to non-existing subscription
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/statuscode").InnerText, Is.EqualTo("322"));
        }
        public void TestQueryCustomerRefNoDirectPayment()
        {
            var customerRefNo = CreateCustomerRefNo();
            var payment       = MakePreparedPayment(PrepareRegularPayment(PaymentMethod.NORDEASE, customerRefNo));
            var now           = DateTime.Now;

            var hostedActionRequest = new HostedAdmin(SveaConfig.GetDefaultConfig(), CountryCode.SE)
                                      .Query(new QueryByCustomerRefNo(
                                                 customerRefNo: customerRefNo
                                                 ));

            HostedAdminRequest hostedAdminRequest = hostedActionRequest.PrepareRequest();

            Assert.That(hostedAdminRequest.MessageXmlDocument.SelectSingleNode("/query/customerrefno").InnerText, Is.EqualTo(customerRefNo));

            var hostedAdminResponse = hostedActionRequest.DoRequest <HostedAdminResponse>();

            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/statuscode").InnerText, Is.EqualTo("0"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/customerrefno").InnerText, Is.EqualTo(customerRefNo));
        }
        public void TestQueryTransactionIdDirectPayment()
        {
            var customerRefNo = CreateCustomerRefNo();
            var payment       = MakePreparedPayment(PrepareRegularPayment(PaymentMethod.NORDEASE, customerRefNo));
            var now           = DateTime.Now;

            var hostedActionRequest = new HostedAdmin(SveaConfig.GetDefaultConfig(), CountryCode.SE)
                                      .Query(new QueryByTransactionId(
                                                 transactionId: payment.TransactionId
                                                 ));

            HostedAdminRequest hostedAdminRequest = hostedActionRequest.PrepareRequest();

            Assert.That(hostedAdminRequest.MessageXmlDocument.SelectSingleNode("/query/transactionid").InnerText, Is.EqualTo(payment.TransactionId + ""));

            var hostedAdminResponse = hostedActionRequest.DoRequest <HostedAdminResponse>();

            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/statuscode").InnerText, Is.EqualTo("0"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/customerrefno").InnerText, Is.EqualTo(customerRefNo));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/merchantid").InnerText, Is.EqualTo("1130"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/status").InnerText, Is.EqualTo("SUCCESS"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/amount").InnerText, Is.EqualTo("25000"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/currency").InnerText, Is.EqualTo("SEK"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/vat").InnerText, Is.EqualTo("5000"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/capturedamount").InnerText, Is.EqualTo("25000"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/authorizedamount").InnerText, Is.EqualTo("25000"));

            var created = DateTime.Parse(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/created").InnerText);

            Assert.That(created.Year, Is.EqualTo(now.Year));
            Assert.That(created.Month, Is.EqualTo(now.Month));
            Assert.That(created.Day, Is.EqualTo(now.Day));

            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/creditstatus").InnerText, Is.EqualTo("CREDNONE"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/creditedamount").InnerText, Is.EqualTo("0"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/merchantresponsecode").InnerText, Is.EqualTo("0"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/paymentmethod").InnerText, Is.EqualTo("DBNORDEASE"));

            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/customer/firstname").InnerXml, Is.EqualTo("TestCompagniet"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/customer/ssn").InnerXml, Is.EqualTo("2345234"));
        }
        public void TestLowerAmount()
        {
            var customerRefNo = CreateCustomerRefNo();
            var payment       = MakePreparedPayment(PrepareRegularPayment(PaymentMethod.KORTCERT, customerRefNo));

            var hostedActionRequest = new HostedAdmin(SveaConfig.GetDefaultConfig(), CountryCode.SE)
                                      .LowerAmount(new LowerAmount(
                                                       transactionId: payment.TransactionId,
                                                       amountToLower: 666
                                                       ));

            HostedAdminRequest hostedAdminRequest = hostedActionRequest.PrepareRequest();

            Assert.That(hostedAdminRequest.MessageXmlDocument.SelectSingleNode("/loweramount/transactionid").InnerText, Is.EqualTo(payment.TransactionId + ""));
            Assert.That(hostedAdminRequest.MessageXmlDocument.SelectSingleNode("/loweramount/amounttolower").InnerText, Is.EqualTo("666"));

            var hostedAdminResponse = hostedActionRequest.DoRequest <HostedAdminResponse>();

            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/statuscode").InnerText, Is.EqualTo("0"));
            Assert.That(hostedAdminResponse.MessageXmlDocument.SelectSingleNode("/response/transaction/customerrefno").InnerText, Is.EqualTo(customerRefNo));
        }