示例#1
0
        protected PublicOrder PrepareOrder(PublicOrderContext publicOrderContext, PaymentDataHandler paymentHandler)
        {
            var newOrder = new PublicOrder()
            {
                OrderItems = new PublicOrderItem[0],
                CustomData = new PublicOrderCustomData[0]
            };

            foreach (var handler in orderDataHandlers)
            {
                newOrder = handler.AmendOrder(newOrder, publicOrderContext);

                if (newOrder == null)
                {
                    throw new InvalidOperationException("OrderDataHandler must return a non-null order from AmendOrder.");
                }
            }

            newOrder.PaymentMethod = paymentHandler.PaymentMethodType;

            // Only run the selected payment handler.
            newOrder = paymentHandler.AmendOrder(newOrder, publicOrderContext.PaymentData);

            if (newOrder == null)
            {
                throw new InvalidOperationException("PaymentDataHandler must return a non-null order from AmendOrder.");
            }

            return newOrder;
        }
示例#2
0
        /// <summary>
        /// Amend order with "IpAddress" custom attribute for IP the order was placed from.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var request = orderContext.ExtraData.OfType <HttpRequestBase>().FirstOrDefault();

            if (request != null)
            {
                var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];

                if (!String.IsNullOrEmpty(ip))
                {
                    var ipRange = ip.Split(',');
                    var trueIp  = ipRange[0];

                    Add(order, new PublicOrderCustomData {
                        Name = "IpAddress", Value = trueIp
                    });
                }
                else
                {
                    ip = request.ServerVariables["REMOTE_ADDR"];
                    Add(order, new PublicOrderCustomData {
                        Name = "IpAddress", Value = ip
                    });
                }
            }

            return(order);
        }
        private void AddContactData(PublicOrder order, ContactModel billingContact)
        {
            order.BillingEmail = Normalize(billingContact.Email);

            order.BillingFirstName = Normalize(billingContact.FirstName);
            order.BillingLastName = Normalize(billingContact.LastName);

            order.BillingAddress = Normalize(billingContact.Address);
            order.BillingAddress2 = Normalize(billingContact.Address2);
            order.BillingZip = Normalize(billingContact.Zip);
            order.BillingCity = Normalize(billingContact.City);
            order.BillingCountry = Normalize(billingContact.Country);

            var fax = FormattingHelper.FormatPhoneNumber(billingContact.Fax, billingContact.Country);
            order.BillingFax = Normalize(fax);

            var phone = FormattingHelper.FormatPhoneNumber(billingContact.Phone, billingContact.Country);
            order.BillingPhone = Normalize(phone);

            if (billingContact.CustomerType == "individual" && billingContact.IndividualInfo != null)
            {
                order.BillingCompanyNumber = Normalize(billingContact.IndividualInfo.IdentityNumber);
            }
            else if (billingContact.CustomerType == "company" && billingContact.CompanyInfo != null)
            {
                order.BillingCompany = Normalize(billingContact.CompanyInfo.CompanyName);
                order.BillingCompanyNumber = Normalize(billingContact.CompanyInfo.IdentityNumber);
            }
        }
        /// <summary>
        /// Amends the order with the package group id whene the multipackage is enabled
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            if (_packageProvider.IsMultiPackageEnabled())
            {
                var packageGroupId = Guid.NewGuid().ToString();
                foreach (var item in order.OrderItems)
                {
                    var packageGroupIdArray = new PublicOrderItemProperty[1]
                    {
                        new PublicOrderItemProperty
                        {
                            Name  = "PackageGroupId",
                            Value = packageGroupId
                        }
                    };

                    if (item.CustomData == null)
                    {
                        item.CustomData = packageGroupIdArray;
                        continue;
                    }

                    item.CustomData = item.CustomData.Concat(packageGroupIdArray).ToArray();
                }
            }

            return(order);
        }
示例#5
0
        protected PublicOrder PrepareOrder(PublicOrderContext publicOrderContext, PaymentDataHandler paymentHandler)
        {
            var newOrder = new PublicOrder()
            {
                OrderItems = new PublicOrderItem[0],
                CustomData = new PublicOrderCustomData[0]
            };

            foreach (var handler in orderDataHandlers)
            {
                newOrder = handler.AmendOrder(newOrder, publicOrderContext);

                if (newOrder == null)
                {
                    throw new InvalidOperationException("OrderDataHandler must return a non-null order from AmendOrder.");
                }
            }

            newOrder.PaymentMethod = paymentHandler.PaymentMethodType;

            // Only run the selected payment handler.
            newOrder = paymentHandler.AmendOrder(newOrder, publicOrderContext.PaymentData);

            if (newOrder == null)
            {
                throw new InvalidOperationException("PaymentDataHandler must return a non-null order from AmendOrder.");
            }

            return(newOrder);
        }
示例#6
0
        private void AddContactData(PublicOrder order, ContactModel billingContact)
        {
            order.BillingEmail = Normalize(billingContact.Email);

            order.BillingFirstName = Normalize(billingContact.FirstName);
            order.BillingLastName  = Normalize(billingContact.LastName);

            order.BillingAddress  = Normalize(billingContact.Address);
            order.BillingAddress2 = Normalize(billingContact.Address2);
            order.BillingZip      = Normalize(billingContact.Zip);
            order.BillingCity     = Normalize(billingContact.City);
            order.BillingCountry  = Normalize(billingContact.Country);

            var fax = FormattingHelper.FormatPhoneNumber(billingContact.Fax, billingContact.Country);

            order.BillingFax = Normalize(fax);

            var phone = FormattingHelper.FormatPhoneNumber(billingContact.Phone, billingContact.Country);

            order.BillingPhone = Normalize(phone);

            if (billingContact.CustomerType == "individual" && billingContact.IndividualInfo != null)
            {
                order.BillingCompanyNumber = Normalize(billingContact.IndividualInfo.IdentityNumber);
            }
            else if (billingContact.CustomerType == "company" && billingContact.CompanyInfo != null)
            {
                order.BillingCompany       = Normalize(billingContact.CompanyInfo.CompanyName);
                order.BillingCompanyNumber = Normalize(billingContact.CompanyInfo.IdentityNumber);
            }
        }
        /// <summary>
        /// Set order currency from customer's currency preference
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var currency = currencyPreferenceProvider.GetCurrentCurrency();

            order.Currency = currency.Code;

            return(order);
        }
        /// <summary>
        /// Helper to add custom attribute to order.
        /// </summary>
        /// <param name="order">The order to add custom attribute to</param>
        /// <param name="customData">The custom attribute to add.</param>
        protected void Add(PublicOrder order, PublicOrderCustomData customData)
        {
            var customAttributes = new List<PublicOrderCustomData>(order.CustomData);

            customAttributes.Add(customData);

            order.CustomData = customAttributes.ToArray();
        }
        /// <summary>
        /// Set order currency from customer's currency preference
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var currency = currencyPreferenceProvider.GetCurrentCurrency();

            order.Currency = currency.Code;

            return order;
        }
示例#10
0
        /// <summary>
        /// Set order reseller id from current reseller
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var resellerId = resellerProvider.GetReseller().Id;

            order.ResellerId = resellerId;

            return(order);
        }
示例#11
0
        /// <summary>
        /// Add item to order.
        /// </summary>
        /// <param name="order">The order to add item to</param>
        /// <param name="item">The item to add</param>
        protected void Add(PublicOrder order, PublicOrderItem item)
        {
            var orderItems = new List<PublicOrderItem>(order.OrderItems);
            
            orderItems.Add(item);

            order.OrderItems = orderItems.ToArray();
        }
        /// <summary>
        /// Add item to order.
        /// </summary>
        /// <param name="order">The order to add item to</param>
        /// <param name="item">The item to add</param>
        protected void Add(PublicOrder order, PublicOrderItem item)
        {
            var orderItems = new List <PublicOrderItem>(order.OrderItems);

            orderItems.Add(item);

            order.OrderItems = orderItems.ToArray();
        }
        /// <summary>
        /// Add custom attribute to order.
        /// </summary>
        /// <param name="order">The order to add custom attribute to</param>
        /// <param name="item">The custom attribute to add</param>
        protected void Add(PublicOrder order, PublicOrderCustomData customData)
        {
            var customAttributes = new List <PublicOrderCustomData>(order.CustomData);

            customAttributes.Add(customData);

            order.CustomData = customAttributes.ToArray();
        }
示例#14
0
        /// <summary>
        /// Set order reseller id from current reseller
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var resellerId = resellerProvider.GetReseller().Id;

            order.ResellerId = resellerId;

            return order;
        }
        /// <summary>
        /// Amends order based on how subclass overrides virtual methods
        /// </summary>
        public sealed override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var domainItems = orderContext.ItemData.Where(i => this.HandledCategories.Intersect(i.Categories.Select(c => c.Name)).Count() > 0);

            foreach (var domainItem in domainItems)
            {
                var customData = new List<PublicOrderItemProperty>();

                var domainName = GetDomainName(domainItem);
                var connectedItem = GetConnectedItem(orderContext.ItemData, domainItem, domainName);
                
                customData.Add(new PublicOrderItemProperty { Name = "DomainName", Value = domainName });

                if (connectedItem != null)
                {
                    var atomiaService = GetAtomiaService(connectedItem);
                    customData.Add(new PublicOrderItemProperty { Name = "AtomiaService", Value = atomiaService });

                    var extraProperties = GetAtomiaServiceExtraProperties(domainItem);
                    if (!String.IsNullOrEmpty(extraProperties))
                    {
                        customData.Add(new PublicOrderItemProperty
                        {
                            Name = "AtomiaServiceExtraProperties",
                            Value = extraProperties
                        });
                    }
                }
                else
                {
                    customData.Add(new PublicOrderItemProperty { Name = "AtomiaService", Value = DefaultAtomiaService });
                }

                var domainRegContactProvider = new DomainRegContactProvider(orderContext);
                if (!string.IsNullOrEmpty(domainRegContactProvider.DomainRegContactData))
                {
                    customData.Add(new PublicOrderItemProperty { Name = "DomainRegContact", Value = domainRegContactProvider.DomainRegContactData });
                }

                foreach(var extraData in GetExtraCustomData(domainItem))
                {
                    customData.Add(extraData);
                }

                var orderItem = new PublicOrderItem
                {
                    ItemId = Guid.Empty,
                    ItemNumber = domainItem.ArticleNumber,
                    Quantity = 1,
                    RenewalPeriodId = domainItem.RenewalPeriodId,
                    CustomData = customData.ToArray()
                };

                Add(order, orderItem);
            }

            return order;
        }
        /// <summary>
        /// Create PublicPaymentTransaction and call MakePayment in Atomia Billing Public Service.
        /// </summary>
        /// <param name="publicOrderContext">Order data</param>
        /// <param name="order">The order object returned from CreateOrder call in Atomia Billing Public Service</param>
        /// <param name="paymentHandler">Handler for customer's selected payment method</param>
        /// <returns>URL to redirect to for finishing or seeing result of payment transaction.</returns>
        public string CreatePaymentTransaction(PublicOrderContext publicOrderContext, PublicOrder order, PaymentDataHandler paymentHandler)
        {
            var paymentTransaction = new PublicPaymentTransaction
            {
                GuiPluginName = paymentHandler.Id,
                Attributes = new AttributeData[0],
                CurrencyCode = order.Currency,
                TransactionReference = order.Number,
                Amount = order.Total
            };

            paymentTransaction = paymentHandler.AmendPaymentTransaction(paymentTransaction, publicOrderContext.PaymentData);

            if (paymentTransaction == null)
            {
                throw new InvalidOperationException("PaymentDataHandler must return a non-null payment transaction from AmendTransaction.");
            }

            foreach (var handler in transactionDataHandlers)
            {
                paymentTransaction = handler.AmendPaymentTransaction(paymentTransaction, publicOrderContext);

                if (paymentTransaction == null)
                {
                    throw new InvalidOperationException("ExtraTransactionDataHandlers must return a non-null payment transaction from AmendTransaction.");
                }
            }

            PublicPaymentTransaction createdTransaction;

            try
            {
                createdTransaction = BillingApi.MakePayment(paymentTransaction);
            }
            catch (SoapException ex)
            {
                logger.LogException(ex, "MakePayment failed.");

                return urlProvider.FailureUrl;
            }

            if (createdTransaction.Status.ToUpper() == "IN_PROGRESS" && !string.IsNullOrEmpty(createdTransaction.RedirectUrl))
            {
                return createdTransaction.RedirectUrl;
            }
            else if (createdTransaction.Status.ToUpper() == "OK")
            {
                return urlProvider.SuccessUrl;
            }
            else if (createdTransaction.Status.ToUpper() == "FRAUD_DETECTED" || createdTransaction.Status.ToUpper() == "FAILED")
            {
                return urlProvider.FailureUrl;
            }
            else
            {
                return createdTransaction.ReturnUrl;
            }
        }
示例#17
0
        /// <summary>
        /// Amend order with "Language" custom attribute from customer's language preference.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var language = languagePreferenceProvider.GetCurrentLanguage();

            Add(order, new PublicOrderCustomData
            {
                Name = "Language",
                Value = language.Tag
            });

            return order;
        }
        /// <summary>
        /// Amend order with "Language" custom attribute from customer's language preference.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var language = languagePreferenceProvider.GetCurrentLanguage();

            Add(order, new PublicOrderCustomData
            {
                Name  = "Language",
                Value = language.Tag
            });

            return(order);
        }
        /// <summary>
        /// Amend order with "CampaignCode" custom attribute
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            if (!String.IsNullOrEmpty(orderContext.Cart.CampaignCode))
            {
                Add(order, new PublicOrderCustomData
                {
                    Name = "CampaignCode",
                    Value = orderContext.Cart.CampaignCode
                });
            }

            return order;
        }
        /// <summary>
        /// Amend order with "CampaignCode" custom attribute
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            if (!String.IsNullOrEmpty(orderContext.Cart.CampaignCode))
            {
                Add(order, new PublicOrderCustomData
                {
                    Name  = "CampaignCode",
                    Value = orderContext.Cart.CampaignCode
                });
            }

            return(order);
        }
示例#21
0
        private void AddCustomAttributes(PublicOrder newOrder)
        {
            var customAttributes = new List <PublicOrderCustomData>(newOrder.CustomData);

            customAttributes.Add(new PublicOrderCustomData {
                Name = "ImmediateProvisioning", Value = "true"
            });
            customAttributes.Add(new PublicOrderCustomData {
                Name = "ShowHcpLandingPage", Value = "true"
            });

            newOrder.CustomData = customAttributes.ToArray();
        }
        public override PublicOrder AmendOrder(PublicOrder order, PaymentData paymentData)
        {
            var form = paymentData.PaymentForm as PayWithInvoiceForm;
            
            Add(order, new PublicOrderCustomData { Name = "PayByInvoice", Value = "true" });

            if (form.SelectedInvoiceType == "post")
            {
                Add(order, new PublicOrderCustomData { Name = "SendInvoiceByPost", Value = "true" });
            }

            return order;
        }
        /// <summary>
        /// Remove invalid VAT number from order.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            if (!string.IsNullOrEmpty(order.LegalNumber))
            {
                var validationResult = vatNumberValidator.ValidateCustomerVatNumber();

                if (!validationResult.Valid)
                {
                    order.LegalNumber = String.Empty;
                }
            }

            return(order);
        }
        /// <summary>
        /// Remove invalid VAT number from order.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            if (!string.IsNullOrEmpty(order.LegalNumber))
            {
                var validationResult = vatNumberValidator.ValidateCustomerVatNumber();

                if (!validationResult.Valid)
                {
                    order.LegalNumber = String.Empty;
                }
            }

            return order;
        }
示例#25
0
        /// <summary>
        /// Amend order with custom attributes from cart
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            if (orderContext.Cart.CustomAttributes != null)
            {
                foreach (var attr in orderContext.Cart.CustomAttributes)
                {
                    Add(order, new PublicOrderCustomData
                    {
                        Name  = attr.Name,
                        Value = attr.Value
                    });
                }
            }

            return(order);
        }
示例#26
0
        public override PublicOrder CreateOrder(PublicOrderContext publicOrderContext, PaymentDataHandler paymentHandler)
        {
            PublicOrder order = null;
            var         existingCustomerData = existingCustomerProvider.GetContactData();

            if (existingCustomerData != null)
            {
                order = existingCustomerOrderCreator.CreateOrder(publicOrderContext, paymentHandler);
            }
            else
            {
                order = simpleOrderCreator.CreateOrder(publicOrderContext, paymentHandler);
            }

            return(order);
        }
        /// <summary>
        /// Amend order with custom attributes from cart
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            if (orderContext.Cart.CustomAttributes != null)
            {
                foreach (var attr in orderContext.Cart.CustomAttributes)
                {
                    Add(order, new PublicOrderCustomData
                    {
                        Name = attr.Name,
                        Value = attr.Value
                    });
                }
            }

            return order;
        }
        /// <summary>
        /// Add any setup fees to order
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var setupFeeItems = orderContext.ItemData.Where(i => this.HandledCategories.Intersect(i.Categories.Select(c => c.Name)).Count() > 0);

            foreach (var item in setupFeeItems)
            {
                Add(order, new PublicOrderItem
                {
                    ItemId          = Guid.Empty,
                    ItemNumber      = item.ArticleNumber,
                    RenewalPeriodId = item.RenewalPeriodId,
                    Quantity        = 1
                });
            }

            return(order);
        }
示例#29
0
        /// <summary>
        /// Amend order with any items that have not been added to order yet.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var unprocessedItems = orderContext.ItemData.Where(i => !OrderItemsContain(order, i));

            foreach (var item in unprocessedItems)
            {
                Add(order, new PublicOrderItem
                {
                    ItemId          = Guid.Empty,
                    ItemNumber      = item.ArticleNumber,
                    RenewalPeriodId = item.RenewalPeriodId,
                    Quantity        = item.Quantity
                });
            }

            return(order);
        }
示例#30
0
        public override PublicOrder AmendOrder(PublicOrder order, PaymentData paymentData)
        {
            var form = paymentData.PaymentForm as PayWithInvoiceForm;

            Add(order, new PublicOrderCustomData {
                Name = "PayByInvoice", Value = "true"
            });

            if (form.SelectedInvoiceType == "post")
            {
                Add(order, new PublicOrderCustomData {
                    Name = "SendInvoiceByPost", Value = "true"
                });
            }

            return(order);
        }
示例#31
0
        /// <summary>
        /// Amend order with any items that have not been added to order yet.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var unprocessedItems = orderContext.ItemData.Where(i => !OrderItemsContain(order, i));

            foreach (var item in unprocessedItems)
            {
                Add(order, new PublicOrderItem
                {
                    ItemId = Guid.Empty,
                    ItemNumber = item.ArticleNumber,
                    RenewalPeriodId = item.RenewalPeriodId,
                    Quantity = item.Quantity
                });
            }

            return order;
        }
示例#32
0
        /// <summary>
        /// Add any setup fees to order
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var setupFeeItems = orderContext.ItemData.Where(i => this.HandledCategories.Intersect(i.Categories.Select(c => c.Name)).Count() > 0);

            foreach (var item in setupFeeItems)
            {
                Add(order, new PublicOrderItem
                {
                    ItemId = Guid.Empty,
                    ItemNumber = item.ArticleNumber,
                    RenewalPeriodId = item.RenewalPeriodId,
                    Quantity = 1
                });
            }

            return order;
        }
示例#33
0
        /// <summary>
        /// Amend order with main contact data collected from customer.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var mainContact = orderContext.ContactData.OfType <MainContactModel>().First();

            order.Email = Normalize(mainContact.Email);

            order.FirstName = Normalize(mainContact.FirstName);
            order.LastName  = Normalize(mainContact.LastName);

            order.Address  = Normalize(mainContact.Address);
            order.Address2 = Normalize(mainContact.Address2);
            order.Zip      = Normalize(mainContact.Zip);
            order.City     = Normalize(mainContact.City);
            order.Country  = Normalize(mainContact.Country);

            var fax = FormattingHelper.FormatPhoneNumber(mainContact.Fax, mainContact.Country);

            order.Fax = Normalize(fax);

            var phone = FormattingHelper.FormatPhoneNumber(mainContact.Phone, mainContact.Country);

            order.Phone = Normalize(phone);

            if (mainContact.CustomerType == "individual" && mainContact.IndividualInfo != null)
            {
                order.CompanyNumber = Normalize(mainContact.IndividualInfo.IdentityNumber);
            }
            else if (mainContact.CustomerType == "company" && mainContact.CompanyInfo != null)
            {
                order.Company       = Normalize(mainContact.CompanyInfo.CompanyName);
                order.CompanyNumber = Normalize(mainContact.CompanyInfo.IdentityNumber);
                order.LegalNumber   = Normalize(mainContact.CompanyInfo.VatNumber);
            }

            if (AtomiaCommon.Instance.SeparateUsernameAndEmail)
            {
                var customAttributes = new List <PublicOrderCustomData>(order.CustomData);
                customAttributes.Add(new PublicOrderCustomData {
                    Name = "Username", Value = Normalize(mainContact.Username)
                });
                order.CustomData = customAttributes.ToArray();
            }

            return(order);
        }
        /// <summary>
        /// Remove any item with category "PostOrder" from order items.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var postOrderItems = orderContext.ItemData.Where(i => this.HandledCategories.Intersect(i.Categories.Select(c => c.Name)).Count() > 0);
            var orderItems     = new List <PublicOrderItem>(order.OrderItems);

            foreach (var postOrderItem in postOrderItems)
            {
                var existingItem = ExistingOrderItem(order, postOrderItem);

                if (existingItem != null)
                {
                    orderItems.Remove(existingItem);
                }
            }

            order.OrderItems = orderItems.ToArray();

            return(order);
        }
示例#35
0
        /// <summary>
        /// Amend order with billing contact data collected from customer, falling back to collected main contact data.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var billingContact = orderContext.ContactData.OfType <BillingContactModel>().First();

            // Email is a required field on BillingContactModel,
            // so if it is not present it means no separate billing contact was provided.
            if (String.IsNullOrWhiteSpace(billingContact.Email))
            {
                var mainContact = orderContext.ContactData.OfType <MainContactModel>().First();

                AddContactData(order, mainContact);
            }
            else
            {
                AddContactData(order, billingContact);
            }

            return(order);
        }
        /// <summary>
        /// Remove any item with category "PostOrder" from order items.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var postOrderItems = orderContext.ItemData.Where(i => this.HandledCategories.Intersect(i.Categories.Select(c => c.Name)).Count() > 0);
            var orderItems = new List<PublicOrderItem>(order.OrderItems);

            foreach (var postOrderItem in postOrderItems)
            {
                var existingItem = ExistingOrderItem(order, postOrderItem);

                if (existingItem != null)
                {
                    orderItems.Remove(existingItem);
                }
            }

            order.OrderItems = orderItems.ToArray();

            return order;
        }
        /// <summary>
        /// Amend order with billing contact data collected from customer, falling back to collected main contact data.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var billingContact = orderContext.ContactData.OfType<BillingContactModel>().First();

            // Email is a required field on BillingContactModel,
            // so if it is not present it means no separate billing contact was provided.
            if (String.IsNullOrWhiteSpace(billingContact.Email))
            {
                var mainContact = orderContext.ContactData.OfType<MainContactModel>().First();
                
                AddContactData(order, mainContact);
            }
            else
            {
                AddContactData(order, billingContact);
            }
            
            return order;
        }
        /// <summary>
        /// Amend order with main contact data collected from customer.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var mainContact = orderContext.ContactData.OfType<MainContactModel>().First();

            order.Email = Normalize(mainContact.Email);

            order.FirstName = Normalize(mainContact.FirstName);
            order.LastName = Normalize(mainContact.LastName);

            order.Address = Normalize(mainContact.Address);
            order.Address2 = Normalize(mainContact.Address2);
            order.Zip = Normalize(mainContact.Zip);
            order.City = Normalize(mainContact.City);
            order.Country = Normalize(mainContact.Country);

            var fax = FormattingHelper.FormatPhoneNumber(mainContact.Fax, mainContact.Country);
            order.Fax = Normalize(fax);

            var phone = FormattingHelper.FormatPhoneNumber(mainContact.Phone, mainContact.Country);
            order.Phone = Normalize(phone);

            if (mainContact.CustomerType == "individual" && mainContact.IndividualInfo != null)
            {
                order.CompanyNumber = Normalize(mainContact.IndividualInfo.IdentityNumber);
            }
            else if (mainContact.CustomerType == "company" && mainContact.CompanyInfo != null)
            {
                order.Company = Normalize(mainContact.CompanyInfo.CompanyName);
                order.CompanyNumber = Normalize(mainContact.CompanyInfo.IdentityNumber);
                order.LegalNumber = Normalize(mainContact.CompanyInfo.VatNumber);
            }

            if (AtomiaCommon.Instance.SeparateUsernameAndEmail)
            {
                var customAttributes = new List<PublicOrderCustomData>(order.CustomData);
                customAttributes.Add(new PublicOrderCustomData { Name = "Username", Value = Normalize(mainContact.Username) });
                order.CustomData = customAttributes.ToArray();
            }

            return order;
        }
示例#39
0
        /// <summary>
        /// Get matching item if it exists in order already. 
        /// Must match all of the following: article number, renewal period and "DomainName" custom attributes if it exists.
        /// </summary>
        /// <param name="order">The order to check</param>
        /// <param name="item">The item to check for match in order</param>
        /// <returns>The matching order item or null</returns>
        protected PublicOrderItem ExistingOrderItem(PublicOrder order, ItemData item)
        {
            PublicOrderItem existingOrderItem = null;
            var domainAttr = item.CartItem.CustomAttributes.FirstOrDefault(ca => ca.Name == "DomainName");

            if (domainAttr != null)
            {
                existingOrderItem = order.OrderItems.FirstOrDefault(orderItem =>
                    orderItem.ItemNumber == item.ArticleNumber &&
                    orderItem.RenewalPeriodId == item.RenewalPeriodId &&
                    orderItem.CustomData.Any(x => x.Name == "DomainName" && x.Value == domainAttr.Value));
            }
            else
            {
                existingOrderItem = order.OrderItems.FirstOrDefault(orderItem =>
                    orderItem.ItemNumber == item.ArticleNumber &&
                    orderItem.RenewalPeriodId == item.RenewalPeriodId);
            }

            return existingOrderItem;
        }
        /// <summary>
        /// Get matching item if it exists in order already.
        /// Must match all of the following: article number, renewal period and "DomainName" custom attributes if it exists.
        /// </summary>
        /// <param name="order">The order to check</param>
        /// <param name="item">The item to check for match in order</param>
        /// <returns>The matching order item or null</returns>
        protected PublicOrderItem ExistingOrderItem(PublicOrder order, ItemData item)
        {
            PublicOrderItem existingOrderItem = null;
            var             domainAttr        = item.CartItem.CustomAttributes.FirstOrDefault(ca => ca.Name == "DomainName");

            if (domainAttr != null)
            {
                existingOrderItem = order.OrderItems.FirstOrDefault(orderItem =>
                                                                    orderItem.ItemNumber == item.ArticleNumber &&
                                                                    orderItem.RenewalPeriodId == item.RenewalPeriodId &&
                                                                    orderItem.CustomData.Any(x => x.Name == "DomainName" && x.Value == domainAttr.Value));
            }
            else
            {
                existingOrderItem = order.OrderItems.FirstOrDefault(orderItem =>
                                                                    orderItem.ItemNumber == item.ArticleNumber &&
                                                                    orderItem.RenewalPeriodId == item.RenewalPeriodId);
            }

            return(existingOrderItem);
        }
示例#41
0
        /// <summary>
        /// Amend order with "IpAddress" custom attribute for IP the order was placed from.
        /// </summary>
        public override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var request = orderContext.ExtraData.OfType<HttpRequestBase>().FirstOrDefault();

            if (request != null)
            {
                var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];

                if (!String.IsNullOrEmpty(ip))
                {
                    var ipRange = ip.Split(',');
                    var trueIp = ipRange[0];

                    Add(order, new PublicOrderCustomData { Name = "IpAddress", Value = trueIp });
                }
                else
                {
                    ip = request.ServerVariables["REMOTE_ADDR"];
                    Add(order, new PublicOrderCustomData { Name = "IpAddress", Value = ip });
                }
            }

            return order;
        }
 public virtual PublicOrder CalculateOrder(PublicOrder publicOrder)
 {
     return service.CalculateOrder(publicOrder);
 }
 /// <summary>
 /// Check if a matching item exists in order already.
 /// </summary>
 /// <param name="order">The order to check</param>
 /// <param name="item">The item to match</param>
 /// <returns>true if item matches, false otherwise</returns>
 protected bool OrderItemsContain(PublicOrder order, ItemData item)
 {
     return(ExistingOrderItem(order, item) != null);
 }
 /// <summary>
 /// Amend order with data from context
 /// </summary>
 /// <param name="order">The order to amend</param>
 /// <param name="orderContext">The order data</param>
 /// <returns>The amended order</returns>
 public abstract PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext);
 public virtual PublicOrder CreateOrderWithLoginToken(PublicOrder order, string resellerRootDomain, out string token)
 {
     return service.CreateOrderWithLoginToken(order, resellerRootDomain, out token);
 }
示例#46
0
        /// <summary>
        /// Amends order based on how subclass overrides virtual methods
        /// </summary>
        public sealed override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var domainItems = orderContext.ItemData.Where(i => this.HandledCategories.Intersect(i.Categories.Select(c => c.Name)).Count() > 0);

            var jsemail             = new JavaScriptSerializer();
            var mailOnOrderSettings = LocalConfigurationHelper.GetMailOnOrderSettings();

            foreach (var domainItem in domainItems)
            {
                var customData = new List <PublicOrderItemProperty>();

                var domainName             = GetDomainName(domainItem);
                var domainRegSpecificAttrs = GetDomainRegistrySpecificAttributes(domainItem);
                var connectedItem          = GetConnectedItem(orderContext.ItemData, domainItem, domainName);

                customData.Add(new PublicOrderItemProperty {
                    Name = "DomainName", Value = domainName
                });

                if (!string.IsNullOrEmpty(domainRegSpecificAttrs))
                {
                    customData.Add(new PublicOrderItemProperty {
                        Name = "DomainRegistrySpecificAttributes", Value = domainRegSpecificAttrs
                    });

                    var mailOnOrderElement = mailOnOrderSettings.FirstOrDefault(e => e.ProductId == domainItem.ArticleNumber);
                    if (mailOnOrderElement != null)
                    {
                        Dictionary <string, string> emailProps     = new Dictionary <string, string>();
                        Dictionary <string, string> domainSpecific = jsemail.Deserialize <Dictionary <string, string> >(domainRegSpecificAttrs);
                        emailProps.Add("Type", mailOnOrderElement.Email);
                        emailProps.Add("Domain", domainName ?? "");
                        emailProps.Add("Name", domainSpecific.FirstOrDefault(v => v.Key == "AcceptName").Value ?? "");
                        emailProps.Add("Time", domainSpecific.FirstOrDefault(v => v.Key == "AcceptDate").Value ?? "");
                        emailProps.Add("Orgnum", order.CompanyNumber);
                        emailProps.Add("Company", order.Company);
                        emailProps.Add("Version", domainSpecific.FirstOrDefault(v => v.Key == "AcceptVersion").Value ?? "");
                        emailProps.Add("Ccc", mailOnOrderElement.CccEmail);
                        customData.Add(new PublicOrderItemProperty {
                            Name = "MailOnOrder", Value = jsemail.Serialize(emailProps)
                        });
                    }
                }

                if (connectedItem != null)
                {
                    var atomiaService = GetAtomiaService(connectedItem);
                    customData.Add(new PublicOrderItemProperty {
                        Name = "AtomiaService", Value = atomiaService
                    });

                    var extraProperties = GetAtomiaServiceExtraProperties(domainItem);
                    if (!String.IsNullOrEmpty(extraProperties))
                    {
                        customData.Add(new PublicOrderItemProperty
                        {
                            Name  = "AtomiaServiceExtraProperties",
                            Value = extraProperties
                        });
                    }
                }
                else
                {
                    customData.Add(new PublicOrderItemProperty {
                        Name = "AtomiaService", Value = DefaultAtomiaService
                    });
                }

                var domainRegContactProvider = new DomainRegContactProvider(orderContext);
                if (!string.IsNullOrEmpty(domainRegContactProvider.DomainRegContactData))
                {
                    customData.Add(new PublicOrderItemProperty {
                        Name = "DomainRegContact", Value = domainRegContactProvider.DomainRegContactData
                    });
                }

                foreach (var extraData in GetExtraCustomData(domainItem))
                {
                    customData.Add(extraData);
                }

                var orderItem = new PublicOrderItem
                {
                    ItemId          = Guid.Empty,
                    ItemNumber      = domainItem.ArticleNumber,
                    Quantity        = 1,
                    RenewalPeriodId = domainItem.RenewalPeriodId,
                    CustomData      = customData.ToArray()
                };

                Add(order, orderItem);
            }

            return(order);
        }
示例#47
0
 /// <summary>
 /// Amend order with data from context
 /// </summary>
 /// <param name="order">The order to amend</param>
 /// <param name="orderContext">The order data</param>
 /// <returns>The amended order</returns>
 public abstract PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext);
示例#48
0
 /// <summary>
 /// Check if a matching item exists in order already.
 /// </summary>
 /// <param name="order">The order to check</param>
 /// <param name="item">The item to match</param>
 /// <returns>true if item matches, false otherwise</returns>
 protected bool OrderItemsContain(PublicOrder order, ItemData item)
 {
     return ExistingOrderItem(order, item) != null;
 }
示例#49
0
        private void AddCustomAttributes(PublicOrder newOrder)
        {
            var customAttributes = new List<PublicOrderCustomData>(newOrder.CustomData);

            customAttributes.Add(new PublicOrderCustomData { Name = "ImmediateProvisioning", Value = "true" });
            customAttributes.Add(new PublicOrderCustomData { Name = "ShowHcpLandingPage", Value = "true" });

            newOrder.CustomData = customAttributes.ToArray();
        }
 public virtual PublicOrder CreateOrder(PublicOrder order)
 {
     return service.CreateOrder(order);
 }
示例#51
0
 public virtual PublicOrder CreateOrderWithLoginToken(PublicOrder order, string resellerRootDomain, out string token)
 {
     return(service.CreateOrderWithLoginToken(order, resellerRootDomain, out token));
 }
示例#52
0
 public virtual PublicOrder CreateOrder(PublicOrder order)
 {
     return(service.CreateOrder(order));
 }
示例#53
0
 public virtual PublicOrder CalculateOrder(PublicOrder publicOrder)
 {
     return(service.CalculateOrder(publicOrder));
 }
 /// <summary>
 /// Amend order with payment method specific attributes.
 /// </summary>
 /// <param name="order">The order to amend.</param>
 public virtual PublicOrder AmendOrder(PublicOrder order, PaymentData paymentData)
 {
     return order;
 }
        /// <summary>
        /// Create PublicPaymentTransaction and call MakePayment in Atomia Billing Public Service.
        /// </summary>
        /// <param name="publicOrderContext">Order data</param>
        /// <param name="order">The order object returned from CreateOrder call in Atomia Billing Public Service</param>
        /// <param name="paymentHandler">Handler for customer's selected payment method</param>
        /// <returns>URL to redirect to for finishing or seeing result of payment transaction.</returns>
        public string CreatePaymentTransaction(PublicOrderContext publicOrderContext, PublicOrder order, PaymentDataHandler paymentHandler)
        {
            var paymentTransaction = new PublicPaymentTransaction
            {
                GuiPluginName        = paymentHandler.Id,
                Attributes           = new AttributeData[0],
                CurrencyCode         = order.Currency,
                TransactionReference = order.Number,
                Amount = order.Total
            };

            paymentTransaction = paymentHandler.AmendPaymentTransaction(paymentTransaction, publicOrderContext.PaymentData);

            if (paymentTransaction == null)
            {
                throw new InvalidOperationException("PaymentDataHandler must return a non-null payment transaction from AmendTransaction.");
            }

            foreach (var handler in transactionDataHandlers)
            {
                paymentTransaction = handler.AmendPaymentTransaction(paymentTransaction, publicOrderContext);

                if (paymentTransaction == null)
                {
                    throw new InvalidOperationException("ExtraTransactionDataHandlers must return a non-null payment transaction from AmendTransaction.");
                }
            }

            PublicPaymentTransaction createdTransaction;

            try
            {
                createdTransaction = BillingApi.MakePayment(paymentTransaction);
            }
            catch (SoapException ex)
            {
                logger.LogException(ex, "MakePayment failed.");

                return(urlProvider.FailureUrl);
            }

            if (createdTransaction.Status.ToUpper() == "IN_PROGRESS" && !string.IsNullOrEmpty(createdTransaction.RedirectUrl))
            {
                return(createdTransaction.RedirectUrl);
            }
            else if (createdTransaction.Status.ToUpper() == "OK")
            {
                return(urlProvider.SuccessUrl);
            }
            else if (createdTransaction.Status.ToUpper() == "FRAUD_DETECTED" || createdTransaction.Status.ToUpper() == "FAILED")
            {
                return(urlProvider.FailureUrl);
            }
            else
            {
                return(createdTransaction.ReturnUrl);
            }
        }
示例#56
0
        /// <summary>
        /// Amends order based on how subclass overrides virtual methods
        /// </summary>
        public sealed override PublicOrder AmendOrder(PublicOrder order, PublicOrderContext orderContext)
        {
            var domainItems = orderContext.ItemData.Where(i => this.HandledCategories.Intersect(i.Categories.Select(c => c.Name)).Count() > 0);

            foreach (var domainItem in domainItems)
            {
                var customData = new List <PublicOrderItemProperty>();

                var domainName             = GetDomainName(domainItem);
                var domainRegSpecificAttrs = GetDomainRegistrySpecificAttributes(domainItem);
                var connectedItem          = GetConnectedItem(orderContext.ItemData, domainItem, domainName);

                customData.Add(new PublicOrderItemProperty {
                    Name = "DomainName", Value = domainName
                });

                if (!string.IsNullOrEmpty(domainRegSpecificAttrs))
                {
                    customData.Add(new PublicOrderItemProperty {
                        Name = "DomainRegistrySpecificAttributes", Value = domainRegSpecificAttrs
                    });
                }

                if (connectedItem != null)
                {
                    var atomiaService = GetAtomiaService(connectedItem);
                    customData.Add(new PublicOrderItemProperty {
                        Name = "AtomiaService", Value = atomiaService
                    });

                    var extraProperties = GetAtomiaServiceExtraProperties(domainItem);
                    if (!String.IsNullOrEmpty(extraProperties))
                    {
                        customData.Add(new PublicOrderItemProperty
                        {
                            Name  = "AtomiaServiceExtraProperties",
                            Value = extraProperties
                        });
                    }
                }
                else
                {
                    customData.Add(new PublicOrderItemProperty {
                        Name = "AtomiaService", Value = DefaultAtomiaService
                    });
                }

                var domainRegContactProvider = new DomainRegContactProvider(orderContext);
                if (!string.IsNullOrEmpty(domainRegContactProvider.DomainRegContactData))
                {
                    customData.Add(new PublicOrderItemProperty {
                        Name = "DomainRegContact", Value = domainRegContactProvider.DomainRegContactData
                    });
                }

                foreach (var extraData in GetExtraCustomData(domainItem))
                {
                    customData.Add(extraData);
                }

                var orderItem = new PublicOrderItem
                {
                    ItemId          = Guid.Empty,
                    ItemNumber      = domainItem.ArticleNumber,
                    Quantity        = 1,
                    RenewalPeriodId = domainItem.RenewalPeriodId,
                    CustomData      = customData.ToArray()
                };

                Add(order, orderItem);
            }

            return(order);
        }
 /// <summary>
 /// Amend order with payment method specific attributes.
 /// </summary>
 /// <param name="order">The order to amend.</param>
 public virtual PublicOrder AmendOrder(PublicOrder order, PaymentData paymentData)
 {
     return(order);
 }