public ActionResult ManageAutoOrder(int id, ManageAutoOrderViewModel viewModel)
        {
            var customerID          = Identity.Customer.CustomerID;
            var apiRequests         = new List <ApiRequest>();
            var customer            = Exigo.GetCustomer(customerID);
            var market              = GlobalSettings.Markets.AvailableMarkets.Where(c => c.Countries.Contains(Identity.Customer.Country)).FirstOrDefault();
            var configuration       = market.GetConfiguration().AutoOrders;
            var warehouseID         = configuration.WarehouseID;
            var isExistingAutoOrder = id != 0;
            var paymentMethods      = Exigo.GetCustomerPaymentMethods(new GetCustomerPaymentMethodsRequest()
            {
                CustomerID = Identity.Customer.CustomerID, ExcludeIncompleteMethods = true
            });



            // Remove all items that have no quantity.
            viewModel.AutoOrder.Details = viewModel.AutoOrder.Details.Where(d => d.Quantity > 0).ToList();
            if (!viewModel.AutoOrder.Details.Any())
            {
                ModelState.AddModelError("Result", "Please select at least one product for your Auto Order.");
            }



            if (ModelState.Keys.Contains("Result"))
            {
                InflateManageAutoOrderViewModel(customerID, market, configuration, ref viewModel);

                return(View(viewModel));
            }

            // Save New Credit Card
            var isUsingNewCard = viewModel.AutoOrder.AutoOrderPaymentTypeID == 0;
            var hasPrimaryCard = paymentMethods.Where(v => v.IsComplete).Count() > 0;

            if (isUsingNewCard)
            {
                var saveCCRequest = new SetAccountCreditCardTokenRequest(viewModel.NewCreditCard);

                // If there is one or more available payment type, save the card in the secondary card slot
                if (hasPrimaryCard)
                {
                    saveCCRequest.CreditCardAccountType        = AccountCreditCardType.Secondary;
                    viewModel.AutoOrder.AutoOrderPaymentTypeID = AutoOrderPaymentTypes.SecondaryCreditCardOnFile;
                }
                else
                {
                    viewModel.AutoOrder.AutoOrderPaymentTypeID = AutoOrderPaymentTypes.PrimaryCreditCardOnFile;
                }
                saveCCRequest.CustomerID = customerID;
                apiRequests.Add(saveCCRequest);
            }


            // Prepare the auto order
            var autoOrder = viewModel.AutoOrder;
            var createAutoOrderRequest = new CreateAutoOrderRequest(autoOrder)
            {
                PriceType   = configuration.PriceTypeID,
                WarehouseID = warehouseID,
                Notes       = !string.IsNullOrEmpty(autoOrder.Notes)
                                ? autoOrder.Notes
                                : string.Format("Created with the API Auto-Delivery manager at \"{0}\" on {1:u} at IP {2} using {3} {4} ({5}).",
                                                Request.Url.AbsoluteUri,
                                                DateTime.Now.ToUniversalTime(),
                                                GlobalUtilities.GetClientIP(),
                                                HttpContext.Request.Browser.Browser,
                                                HttpContext.Request.Browser.Version,
                                                HttpContext.Request.Browser.Platform),
                CustomerID = customerID
            };

            apiRequests.Add(createAutoOrderRequest);

            try
            {
                // Process the transaction
                var transaction = new TransactionalRequest {
                    TransactionRequests = apiRequests.ToArray()
                };
                var response = Exigo.WebService().ProcessTransaction(transaction);

                return(RedirectToAction("AutoOrderList", new { success = "1" }));
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("Result", "We were unable to save your Auto-Delivery: " + ex.Message);

                InflateManageAutoOrderViewModel(customerID, market, configuration, ref viewModel);

                return(View(viewModel));
            }
        }
 /// <remarks/>
 public void ProcessTransactionAsync(TransactionalRequest TransactionalRequest, object userState) {
     if ((this.ProcessTransactionOperationCompleted == null)) {
         this.ProcessTransactionOperationCompleted = new System.Threading.SendOrPostCallback(this.OnProcessTransactionOperationCompleted);
     }
     this.InvokeAsync("ProcessTransaction", new object[] {
                 TransactionalRequest}, this.ProcessTransactionOperationCompleted, userState);
 }
    private TransactionalRequest Request_AutoshipTransaction()
    {
        TransactionalRequest request = new TransactionalRequest();
        List<ApiRequest> details = new List<ApiRequest>();


        // Add the request to create an order
        details.Add(Request_SaveAutoship());


        // Add the requests that handle the payment method for the order
        switch (Autoship.PropertyBag.PaymentType)
        {
            case AutoshipCartPropertyBag.PaymentMethodType.NewCreditCard:
                details.Add(Request_SaveNewCreditCardToAccount(Autoship.PropertyBag.CreditCardType));
                break;

            case AutoshipCartPropertyBag.PaymentMethodType.NewBankAccount:
                details.Add(Request_SaveNewBankAccountToAccount());
                break;
        }


        request.TransactionRequests = details.ToArray();
        return request;
    }
Exemple #4
0
        public ActionResult RenewSubscription(CreditCard creditcard)
        {
            var shipMethodID = OrderConfiguration.DefaultShipMethodID; // Will call or free option, since this is a virtual order
            var customerID   = CurrentCustomerID;
            var requests     = new List <ApiRequest>();
            var items        = new List <ShoppingCartItem>();
            var paymonthly   = true;
            var card         = new CreditCard();


            if (creditcard.Type != CreditCardType.New)
            {
                card = Exigo.GetCustomerPaymentMethods(new GetCustomerPaymentMethodsRequest
                {
                    CustomerID = Identity.Current.CustomerID,
                    ExcludeIncompleteMethods = true,
                    ExcludeInvalidMethods    = true
                }).Where(c => c is CreditCard && ((CreditCard)c).Type == creditcard.Type).FirstOrDefault().As <CreditCard>();
            }
            else
            {
                card = creditcard;
            }


            try
            {
                // Determine which items we need to add to the order we are creating and assemble our order request
                if (paymonthly)
                {
                    items.Add(new ShoppingCartItem {
                        ItemCode = GlobalSettings.Backoffices.MonthlySubscriptionItemCode, Quantity = 1
                    });
                }


                // We pull the customer's addresses first, if there are none we calculate with the corp address
                var customerAddresses = Exigo.GetCustomerAddresses(CurrentCustomerID);
                var address           = (customerAddresses.Count() > 0 && customerAddresses.Where(c => c.IsComplete).Count() > 0) ? customerAddresses.Where(c => c.IsComplete).FirstOrDefault().As <ShippingAddress>() : new ShippingAddress(GlobalSettings.Company.Address);


                var OrderRequest = new CreateOrderRequest(OrderConfiguration, shipMethodID, items, address)
                {
                    CustomerID = customerID
                };

                requests.Add(OrderRequest);

                // Then next step is adding the credit card payment and account update request
                if (!card.IsTestCreditCard && !Request.IsLocal)
                {
                    if (card.Type == CreditCardType.New)
                    {
                        requests.Add(new ChargeCreditCardTokenRequest(card));
                        requests.Add(new SetAccountCreditCardTokenRequest(card)
                        {
                            CustomerID = customerID, CreditCardAccountType = AccountCreditCardType.Primary
                        });
                    }
                    else
                    {
                        requests.Add(new ChargeCreditCardTokenOnFileRequest(card));
                    }
                }
                else
                {
                    OrderRequest.OrderStatus = OrderStatusType.Shipped;
                }

                // Process the transaction
                var transactionRequest = new TransactionalRequest();
                transactionRequest.TransactionRequests = requests.ToArray();
                var transactionResponse = Exigo.WebService().ProcessTransaction(transactionRequest);

                if (transactionResponse.Result.Status != ResultStatus.Success)
                {
                    //throw new Exception(transactionResponse.Result.Errors.ToString());
                    throw new Exception("Transaction failed");
                }
                else
                {
                    var httpContext = System.Web.HttpContext.Current;
                    var cookie      = httpContext.Request.Cookies[GlobalSettings.Backoffices.MonthlySubscriptionCookieName];
                    if (cookie != null)
                    {
                        cookie.Expires = DateTime.Now.AddMinutes(30);
                        Response.Cookies.Set(cookie);
                    }
                    else
                    {
                        cookie         = new HttpCookie(GlobalSettings.Backoffices.MonthlySubscriptionCookieName);
                        cookie.Value   = "true";
                        cookie.Expires = DateTime.Now.AddMinutes(30);
                        Response.Cookies.Add(cookie);
                        httpContext.Response.Cookies.Add(cookie);
                        //Invalidate the customer subscription cache
                        HttpRuntime.Cache.Remove(string.Format("exigo.customersubscriptions.{0}-{1}", customerID, Subscriptions.BackofficeFeatures));
                    }
                }


                return(new JsonNetResult(new
                {
                    success = true
                }));
            }
            catch (Exception ex)
            {
                return(new JsonNetResult(new
                {
                    success = false,
                    message = ex.Message
                }));
            }
        }
 /// <remarks/>
 public void ProcessTransactionAsync(TransactionalRequest TransactionalRequest) {
     this.ProcessTransactionAsync(TransactionalRequest, null);
 }
        public ActionResult SubmitCheckout()
        {
            if (!PropertyBag.IsSubmitting)
            {
                PropertyBag.IsSubmitting = true;
                _propertyBag             = ExigoDAL.PropertyBags.Update(PropertyBag);

                try
                {
                    // Start creating the API requests
                    var apiRequests = new List <ApiRequest>();

                    // Create the customer
                    var customerRequest = new CreateCustomerRequest(PropertyBag.Customer)
                    {
                        InsertEnrollerTree = true,
                        EnrollerID         = PropertyBag.EnrollerID,
                        CustomerType       = CustomerTypes.Distributor,
                        EntryDate          = DateTime.Now.ToCST(),
                        CustomerStatus     = CustomerStatuses.Active,
                        CanLogin           = true,
                        DefaultWarehouseID = OrderConfiguration.WarehouseID,
                        Notes = "Distributor was entered by Distributor #{0}. Created by the API Enrollment at ".FormatWith(Identity.Owner.CustomerID) + HttpContext.Request.Url.Host + HttpContext.Request.Url.LocalPath + " on " + DateTime.Now.ToCST().ToString("dddd, MMMM d, yyyy h:mmtt") + " CST at IP " + Common.GlobalUtilities.GetClientIP() + " using " + HttpContext.Request.Browser.Browser + " " + HttpContext.Request.Browser.Version + " (" + HttpContext.Request.Browser.Platform + ")."
                    };

                    ///IF Unilevel Place in Sponsor Tree Now, Binary will be placed post transactional envelope
                    if (!GlobalSettings.Exigo.UseBinary)
                    {
                        customerRequest.InsertUnilevelTree = true;
                        customerRequest.SponsorID          = customerRequest.EnrollerID;
                    }
                    apiRequests.Add(customerRequest);


                    // Set a few variables up for our shippping address, order/auto order items and the default auto order payment type
                    var shippingAddress      = PropertyBag.ShippingAddress;
                    var orderItems           = ShoppingCart.Items.Where(i => i.Type == ShoppingCartItemType.Order || i.Type == ShoppingCartItemType.EnrollmentPack).ToList();
                    var autoOrderItems       = ShoppingCart.Items.Where(i => i.Type == ShoppingCartItemType.AutoOrder || i.Type == ShoppingCartItemType.EnrollmentAutoOrderPack).ToList();
                    var autoOrderPaymentType = AutoOrderPaymentType.PrimaryCreditCard;

                    // Create initial order
                    var orderRequest = new CreateOrderRequest(OrderConfiguration, PropertyBag.ShipMethodID, orderItems, shippingAddress);

                    // Add order request now if we need to do any testing with the accepted functionality
                    apiRequests.Add(orderRequest);

                    if (PropertyBag.PaymentMethod.CanBeParsedAs <BankAccount>())
                    {
                        var bankAccount = PropertyBag.PaymentMethod.As <BankAccount>();
                        if (bankAccount.Type == ExigoService.BankAccountType.New)
                        {
                            apiRequests.Add(new DebitBankAccountRequest(bankAccount));
                        }
                        else
                        {
                            apiRequests.Add(new DebitBankAccountOnFileRequest(bankAccount));
                        }
                    }

                    // Create subscription autoorder if an autoorder has been chosen
                    if (autoOrderItems != null && autoOrderItems.Count() > 0)
                    {
                        var autoOrderRequest = new CreateAutoOrderRequest(AutoOrderConfiguration, autoOrderPaymentType, DateTime.Now.AddMonths(1).ToCST(), PropertyBag.ShipMethodID, autoOrderItems, shippingAddress);
                        autoOrderRequest.Frequency = FrequencyType.Monthly;
                        apiRequests.Add(autoOrderRequest);
                    }

                    // Create customer site
                    var customerSiteRequest = new SetCustomerSiteRequest(PropertyBag.Customer);
                    apiRequests.Add(customerSiteRequest);

                    // Add the new credit card to the customer's record and charge it for the current order
                    if (PropertyBag.PaymentMethod.CanBeParsedAs <CreditCard>())
                    {
                        var creditCard = PropertyBag.PaymentMethod.As <CreditCard>();

                        if (!creditCard.IsTestCreditCard && !Request.IsLocal)
                        {
                            var saveCCRequest = new SetAccountCreditCardTokenRequest(creditCard);
                            apiRequests.Add(saveCCRequest);

                            var chargeCCRequest = new ChargeCreditCardTokenRequest(creditCard);
                            apiRequests.Add(chargeCCRequest);
                        }
                        else
                        {
                            orderRequest.OrderStatus = GlobalUtilities.GetDefaultOrderStatusType();
                        }
                    }

                    // Process the transaction
                    var transaction = new TransactionalRequest {
                        TransactionRequests = apiRequests.ToArray()
                    };
                    var response = ExigoDAL.WebService().ProcessTransaction(transaction);

                    var newcustomerid  = 0;
                    var neworderid     = 0;
                    var newautoorderid = 0;

                    if (response.Result.Status == ResultStatus.Success)
                    {
                        foreach (var apiresponse in response.TransactionResponses)
                        {
                            if (apiresponse.CanBeParsedAs <CreateCustomerResponse>())
                            {
                                newcustomerid = apiresponse.As <CreateCustomerResponse>().CustomerID;
                            }
                            if (apiresponse.CanBeParsedAs <CreateOrderResponse>())
                            {
                                neworderid = apiresponse.As <CreateOrderResponse>().OrderID;
                            }
                            if (apiresponse.CanBeParsedAs <CreateAutoOrderResponse>())
                            {
                                newautoorderid = apiresponse.As <CreateAutoOrderResponse>().AutoOrderID;
                            }
                        }
                    }

                    ///If Binary Place Node Now
                    if (GlobalSettings.Exigo.UseBinary)
                    {
                        var placeNodeRequest = new PlaceBinaryNodeRequest
                        {
                            CustomerID    = newcustomerid,
                            ToParentID    = PropertyBag.EnrollerID,
                            PlacementType = BinaryPlacementType.EvenFill
                        };
                        ExigoDAL.WebService().PlaceBinaryNode(placeNodeRequest);
                    }

                    PropertyBag.NewCustomerID  = newcustomerid;
                    PropertyBag.NewOrderID     = neworderid;
                    PropertyBag.NewAutoOrderID = newautoorderid;
                    _propertyBag = ExigoDAL.PropertyBags.Update(PropertyBag);

                    // If the transaction was successful, then send the customer an email that will allow them to confirm thier opt in choice
                    if (PropertyBag.Customer.IsOptedIn)
                    {
                        ExigoDAL.SendEmailVerification(newcustomerid, PropertyBag.Customer.Email);
                    }

                    var token = Security.Encrypt(new
                    {
                        CustomerID  = newcustomerid,
                        OrderID     = neworderid,
                        AutoOrderID = newautoorderid
                    });

                    // Enrollment complete, now delete the Property Bag
                    ExigoDAL.PropertyBags.Delete(PropertyBag);
                    ExigoDAL.PropertyBags.Delete(ShoppingCart);

                    return(new JsonNetResult(new
                    {
                        success = true,
                        token = token
                    }));
                }
                catch (Exception exception)
                {
                    PropertyBag.OrderException = exception.Message;
                    PropertyBag.IsSubmitting   = false;
                    _propertyBag = ExigoDAL.PropertyBags.Update(PropertyBag);

                    return(new JsonNetResult(new
                    {
                        success = false,
                        message = exception.Message
                    }));
                }
            }
            else
            {
                if (PropertyBag.NewCustomerID > 0)
                {
                    var token = Security.Encrypt(new
                    {
                        CustomerID  = PropertyBag.NewCustomerID,
                        OrderID     = PropertyBag.NewOrderID,
                        AutoOrderID = PropertyBag.NewAutoOrderID
                    });

                    return(new JsonNetResult(new
                    {
                        success = true,
                        token = token
                    }));
                }
                else
                {
                    return(new JsonNetResult(new
                    {
                        success = false,
                        message = Resources.Common.YourOrderIsSubmitting
                    }));
                }
            }
        }
    private TransactionalRequest Request_OrderTransaction()
    {
        TransactionalRequest request = new TransactionalRequest();
        List<ApiRequest> details = new List<ApiRequest>();


        // Add the request to create an order
        details.Add(Request_CreateOrder());


        // Add the requests that handle the payment method for the order
        switch (Shopping.PropertyBag.PaymentType)
        {
            case ShoppingCartPropertyBag.PaymentMethodType.NewCreditCard:
                if (!IsTestCreditCard(Shopping.PropertyBag.CreditCardNumber))
                {
                    details.Add(Request_SaveNewCreditCardToAccount());
                    details.Add(Request_ChargeNewCreditCard());
                }
                break;

            case ShoppingCartPropertyBag.PaymentMethodType.PrimaryCreditCard:
                details.Add(Request_ChargeCreditCardOnFile(AccountCreditCardType.Primary));
                break;

            case ShoppingCartPropertyBag.PaymentMethodType.SecondaryCreditCard:
                details.Add(Request_ChargeCreditCardOnFile(AccountCreditCardType.Secondary));
                break;

            case ShoppingCartPropertyBag.PaymentMethodType.NewBankAccount:
                if (!IsTestBankAccountAccountNumber(Shopping.PropertyBag.BankAccountAccountNumber))
                {
                    details.Add(Request_SaveNewBankAccountToAccount());
                    details.Add(Request_ChargeNewBankAccount());
                }
                break;
                
            case ShoppingCartPropertyBag.PaymentMethodType.BankAccountOnFile:
                details.Add(Request_ChargeBankAccountOnFile());
                break;                
        }


        request.TransactionRequests = details.ToArray();
        return request;
    }
Exemple #8
0
        public ActionResult SubmitCheckout()
        {
            if (!PropertyBag.IsSubmitting)
            {
                PropertyBag.IsSubmitting = true;
                _propertyBag             = Exigo.PropertyBags.Update(PropertyBag);

                try
                {
                    // Start creating the API requests
                    var details      = new List <ApiRequest>();
                    var orderRequest = new CreateOrderRequest(OrderConfiguration, PropertyBag.ShipMethodID, ShoppingCart.Items, PropertyBag.ShippingAddress)
                    {
                        CustomerID = Identity.Current.CustomerID
                    };

                    details.Add(orderRequest);

                    // Create the payment request
                    if (PropertyBag.PaymentMethod is CreditCard)
                    {
                        var card = PropertyBag.PaymentMethod as CreditCard;
                        if (card.Type == CreditCardType.New)
                        {
                            if (!card.IsTestCreditCard && !Request.IsLocal)
                            {
                                details.Add(new ChargeCreditCardTokenRequest(card));
                            }
                            else
                            {
                                // Test Credit Card, so no need to charge card
                                ((CreateOrderRequest)details.Where(c => c is CreateOrderRequest).FirstOrDefault()).OrderStatus = GlobalUtilities.GetDefaultOrderStatusType();
                            }
                        }
                        else
                        {
                            details.Add(new ChargeCreditCardTokenOnFileRequest(card));
                        }
                    }
                    if (PropertyBag.PaymentMethod is BankAccount)
                    {
                        var account = PropertyBag.PaymentMethod as BankAccount;
                        if (account.Type == ExigoService.BankAccountType.New)
                        {
                            details.Add(new DebitBankAccountRequest(account));
                        }
                        else
                        {
                            details.Add(new DebitBankAccountOnFileRequest(account));
                        }
                    }

                    // Process the transaction
                    var transactionRequest = new TransactionalRequest();
                    transactionRequest.TransactionRequests = details.ToArray();
                    var transactionResponse = Exigo.WebService().ProcessTransaction(transactionRequest);

                    var newOrderID = 0;
                    if (transactionResponse.Result.Status == ResultStatus.Success)
                    {
                        foreach (var response in transactionResponse.TransactionResponses)
                        {
                            if (response is CreateOrderResponse)
                            {
                                var orderResponse = (CreateOrderResponse)response;
                                newOrderID = orderResponse.OrderID;

                                // Create a cookie to store our newest Order ID to ensure it shows on the Order History page
                                var orderIDCookie = new System.Web.HttpCookie("NewOrder_{0}".FormatWith(Identity.Current.CustomerID), newOrderID.ToString());
                                orderIDCookie.Expires = DateTime.UtcNow.AddMinutes(5);
                                Response.Cookies.Add(orderIDCookie);
                            }
                        }
                    }

                    PropertyBag.NewOrderID = newOrderID;
                    _propertyBag           = Exigo.PropertyBags.Update(PropertyBag);

                    return(new JsonNetResult(new
                    {
                        success = true
                    }));
                }
                catch (Exception exception)
                {
                    PropertyBag.OrderException = exception.Message;
                    PropertyBag.IsSubmitting   = false;
                    _propertyBag = Exigo.PropertyBags.Update(PropertyBag);

                    return(new JsonNetResult(new
                    {
                        success = false,
                        message = exception.Message
                    }));
                }
            }
            else
            {
                if (PropertyBag.NewOrderID > 0)
                {
                    return(new JsonNetResult(new
                    {
                        success = true
                    }));
                }
                else
                {
                    return(new JsonNetResult(new
                    {
                        success = false,
                        message = Resources.Common.YourOrderIsSubmitting
                    }));
                }
            }
        }
        public ActionResult SubmitCheckout()
        {
            if (!PropertyBag.IsSubmitting)
            {
                PropertyBag.IsSubmitting = true;
                _propertyBag             = Exigo.PropertyBags.Update(PropertyBag);

                try
                {
                    // Start creating the API requests
                    var details = new List <ApiRequest>();


                    // Create the order request, if applicable
                    var orderItems = ShoppingCart.Items.Where(c => c.Type == ShoppingCartItemType.Order);
                    var hasOrder   = orderItems.Count() > 0;

                    if (hasOrder)
                    {
                        var orderRequest = new CreateOrderRequest(OrderConfiguration, PropertyBag.ShipMethodID, orderItems, PropertyBag.ShippingAddress)
                        {
                            CustomerID = Identity.Current.CustomerID
                        };
                        details.Add(orderRequest);
                    }


                    // Create the autoorder request, if applicable
                    var autoOrderItems = ShoppingCart.Items.Where(c => c.Type == ShoppingCartItemType.AutoOrder);
                    var hasAutoOrder   = autoOrderItems.Count() > 0;

                    if (hasAutoOrder)
                    {
                        var autoOrderRequest = new CreateAutoOrderRequest(AutoOrderConfiguration, Exigo.GetAutoOrderPaymentType(PropertyBag.PaymentMethod), PropertyBag.AutoOrderStartDate, PropertyBag.ShipMethodID, autoOrderItems, PropertyBag.ShippingAddress)
                        {
                            CustomerID = Identity.Current.CustomerID,
                            Frequency  = PropertyBag.AutoOrderFrequencyType
                        };
                        details.Add(autoOrderRequest);
                    }


                    // Create the payment request
                    if (PropertyBag.PaymentMethod is CreditCard)
                    {
                        var card = PropertyBag.PaymentMethod as CreditCard;
                        if (card.Type == CreditCardType.New)
                        {
                            if (hasAutoOrder)
                            {
                                card = Exigo.SaveNewCustomerCreditCard(Identity.Current.CustomerID, card);
                                ((CreateAutoOrderRequest)details.Where(c => c is CreateAutoOrderRequest).FirstOrDefault()).PaymentType = Exigo.GetAutoOrderPaymentType(card);
                            }
                            if (hasOrder)
                            {
                                if (!card.IsTestCreditCard && !Request.IsLocal)
                                {
                                    details.Add(new ChargeCreditCardTokenRequest(card));
                                }
                                else
                                {
                                    // Test Credit Card, so no need to charge card
                                    ((CreateOrderRequest)details.Where(c => c is CreateOrderRequest).FirstOrDefault()).OrderStatus = GlobalUtilities.GetDefaultOrderStatusType();
                                }
                            }
                        }
                        else
                        {
                            if (hasOrder && !Request.IsLocal)
                            {
                                details.Add(new ChargeCreditCardTokenOnFileRequest(card));
                            }
                        }
                    }
                    if (PropertyBag.PaymentMethod is BankAccount)
                    {
                        var account = PropertyBag.PaymentMethod as BankAccount;
                        if (account.Type == ExigoService.BankAccountType.New)
                        {
                            if (hasAutoOrder)
                            {
                                account = Exigo.SaveNewCustomerBankAccount(Identity.Current.CustomerID, account);
                                ((CreateAutoOrderRequest)details.Where(c => c is CreateAutoOrderRequest).FirstOrDefault()).PaymentType = Exigo.GetAutoOrderPaymentType(account);
                            }
                            if (hasOrder)
                            {
                                details.Add(new DebitBankAccountRequest(account));
                            }
                        }
                        else
                        {
                            if (hasOrder)
                            {
                                details.Add(new DebitBankAccountOnFileRequest(account));
                            }
                        }
                    }


                    // Process the transaction
                    var transactionRequest = new TransactionalRequest();
                    transactionRequest.TransactionRequests = details.ToArray();
                    var transactionResponse = Exigo.WebService().ProcessTransaction(transactionRequest);


                    var newOrderID     = 0;
                    var newAutoOrderID = 0;
                    if (transactionResponse.Result.Status == ResultStatus.Success)
                    {
                        foreach (var response in transactionResponse.TransactionResponses)
                        {
                            if (response is CreateOrderResponse)
                            {
                                newOrderID = ((CreateOrderResponse)response).OrderID;
                            }
                            if (response is CreateAutoOrderResponse)
                            {
                                newAutoOrderID = ((CreateAutoOrderResponse)response).AutoOrderID;
                            }
                        }
                    }

                    PropertyBag.NewOrderID     = newOrderID;
                    PropertyBag.NewAutoOrderID = newAutoOrderID;
                    _propertyBag = Exigo.PropertyBags.Update(PropertyBag);

                    return(new JsonNetResult(new
                    {
                        success = true
                    }));
                }
                catch (Exception exception)
                {
                    PropertyBag.OrderException = exception.Message;
                    PropertyBag.IsSubmitting   = false;
                    _propertyBag = Exigo.PropertyBags.Update(PropertyBag);

                    return(new JsonNetResult(new
                    {
                        success = false,
                        message = exception.Message
                    }));
                }
            }
            else
            {
                if (PropertyBag.NewOrderID > 0 || PropertyBag.NewAutoOrderID > 0)
                {
                    return(new JsonNetResult(new
                    {
                        success = true
                    }));
                }
                else
                {
                    return(new JsonNetResult(new
                    {
                        success = false,
                        message = Resources.Common.OrderSubmittingMessage
                    }));
                }
            }
        }
Exemple #10
0
        ////Not being used anymore...just here for reference
        //public void CreateCustomerRecruitingRewards(int customerId)
        //{

        //    var api = Exigo.WebService();
        //    var reward = new RecruitingRewardDiscount();

        //    //Set start and expiry dates.
        //    var startDate = DateTime.Now;
        //    reward.CompletionDate = startDate.AddDays(60);

        //    //customerId = 1022;
        //    const int extendedGroupId = (int)CustomerExtendedGroup.RecruitingRewards;

        //    //Get Discount amount and check validity.
        //    reward.RewardAmount = Convert.ToDecimal(GetRecruitingReward(customerId));
        //    if (reward.DiscountAmount <= 0) return;

        //    //Check if the reward has already been added for the customer
        //    var customerEx = Exigo.GetCustomerExtendedDetails(customerId, extendedGroupId).Where(x => Convert.ToDateTime(x.Field2) == reward.CompletionDate);
        //    if (customerEx.Any()) return;

        //    var response = api.CreateCustomerExtended(new CreateCustomerExtendedRequest()
        //    {
        //        CustomerID = customerId,
        //        ExtendedGroupID = extendedGroupId,
        //        Field1 = reward.ItemCode, //Item Code
        //        Field2 = reward.CompletionDate.ToString(CultureInfo.InvariantCulture), //Completion Date
        //        Field4 = Convert.ToString(reward.RewardAmount, CultureInfo.InvariantCulture), //RewardAmount
        //        Field3 = 0.ToString(CultureInfo.InvariantCulture) //Redeemed

        //    });
        //}

        ////Also not being use at this time.
        //public decimal GetRecruitingReward(int customerId)
        //{

        //    var request = new GetPointAccountRequest()
        //    {
        //        CustomerID = customerId,
        //        PointAccountID = PointAccounts.RecruitingRewards
        //    };
        //    var rewardAmount = Exigo.GetRecruitingReward(request);

        //    return rewardAmount;
        //}

        //public IList<RecruitingRewardDiscount> GetCustomerRecruitingRewardDiscounts(int customerId)
        //{
        //    var details = Exigo.GetCustomerExtendedDetails(customerId, (int)CustomerExtendedGroup.RecruitingRewards /* Recruiting Rewards Extended Group ID */);

        //    var recruitingReward = (from d in details
        //                            select new RecruitingRewardDiscount()
        //                    {
        //                        CustomerExtendedDetailId = d.CustomerExtendedDetailID,
        //                        CompletionDate = DateTime.Parse(d.Field2),
        //                        ItemCode = d.Field1,
        //                        HasBeenRedeemed = (d.Field3 == "1"),
        //                        RewardAmount = Convert.ToDecimal(d.Field4)
        //                    }
        //     );

        //    return recruitingReward.ToList();

        //}

        #endregion Recruiting-Reward

        #region Enrollee-Reward

        //public void CreateCustomerEnrolleeRewards(int customerId)
        //{

        //    var api = Exigo.WebService();
        //    var reward = new EnrolleeRewardDiscount();

        //    //Set start and expiry dates.
        //    var startDate = DateTime.Now;
        //    reward.CompletionDate = startDate.AddDays(60);

        //    //customerId = 1022;
        //    const int extendedGroupId = (int)CustomerExtendedGroup.EnrolleeRewards;

        //    //Get Discount amount and check validity.
        //    reward.RewardAmount = Convert.ToDecimal(GetEnrolleeReward(customerId));
        //    if (reward.DiscountAmount <= 0) return;

        //    //Check if the reward has already been added for the customer
        //    var customerEx = Exigo.GetCustomerExtendedDetails(customerId, extendedGroupId).Where(x => Convert.ToDateTime(x.Field2) == reward.CompletionDate);
        //    if (customerEx.Any()) return;

        //    var response = api.CreateCustomerExtended(new CreateCustomerExtendedRequest()
        //    {
        //        CustomerID = customerId,
        //        ExtendedGroupID = extendedGroupId,
        //        Field1 = reward.CompletionDate.ToString(CultureInfo.InvariantCulture), //Completion Date
        //        Field2 = Convert.ToString(reward.RewardAmount), //RewardAmount
        //        Field3 = 0.ToString(CultureInfo.InvariantCulture) //Redeemed

        //    });
        //}

        //public decimal GetEnrolleeReward(int customerId)
        //{

        //    var request = new GetPointAccountRequest()
        //    {
        //        CustomerID = customerId,
        //        PointAccountID = PointAccounts.EnrolleeRewards
        //    };
        //    var rewardAmount = Exigo.GetEnrolleeReward(request);

        //    return rewardAmount;
        //}

        //public IList<EnrolleeRewardDiscount> GetCustomerEnrolleeRewardDiscounts(int customerId)
        //{
        //    var details = Exigo.GetCustomerExtendedDetails(customerId, (int)CustomerExtendedGroup.EnrolleeRewards /* Recruiting Rewards Extended Group ID */);

        //    var enrolleeReward = (from d in details
        //                          select new EnrolleeRewardDiscount()
        //                            {
        //                                CustomerExtendedDetailId = d.CustomerExtendedDetailID,
        //                                CompletionDate = DateTime.Parse(d.Field2),
        //                                ItemCode = d.Field3,
        //                                HasBeenRedeemed = (d.Field5 == "1")
        //                            }
        //     );

        //    return enrolleeReward.ToList();

        //}

        #endregion Enrollee-Reward


        public int CreateRewardsAutoOrder(string itemCode, int customerId, int ExtendedGroupID, int phase)
        {
            ShoppingCart.Items.Clear();
            try
            {
                Api = Exigo.WebService();

                CustomerExtendedDetails customerEx = Exigo.GetCustomerExtendedDetails(customerId, ExtendedGroupID).FirstOrDefault(x => x.Field3 == itemCode && x.Field1 == phase.ToString());
                if (customerEx != null)
                {
                    return(0);
                }
                var customer = Exigo.GetCustomer(customerId);
                // Start creating the API requests
                var details = new List <ApiRequest>();
                // Create the order request, if applicable
                ShoppingCartItem cartItem = ShoppingCartItem.Create();

                cartItem.ItemCode          = itemCode;
                cartItem.Quantity          = 1;
                cartItem.PriceEachOverride = 0;
                cartItem.PriceTypeID       = PriceTypes.Wholesale;
                cartItem.Type = ShoppingCartItemType.Order;

                ShoppingCart.Items.Add(cartItem);
                if (string.IsNullOrEmpty(itemCode))
                {
                    _log.TraceEvent(TraceEventType.Warning, 1, "IRewardService.CreateBonusKickerAutoOrder( String, int ): Entering method and ShoppingCart.Items is {0}.", (ShoppingCart.Items == null) ? "null" : "empty");
                    _nlog.Warn("IRewardService.CreateBonusKickerAutoOrder( String, int ): Entering method and ShoppingCart.Items is {0}.", (ShoppingCart.Items == null) ? "null" : "empty");
                }
                else
                {
                    _log.TraceEvent(TraceEventType.Information, 1, "IRewardService.CreateBonusKickerAutoOrder( String, int ): Entering method and ShoppingCart.Items is {0}.", ShoppingCart.Items.Count);
                    _nlog.Info("IOrderService.PlaceOrder( Shop, String ): Entering method with {0} products.", ShoppingCart.Items.Count);
                }
                // Create the autoorder request, if applicable
                var autoOrderRequest = new CreateOrderRequest(
                    AutoOrderConfiguration,
                    (int)ShipMethods.Standard,
                    string.Empty,
                    ShoppingCart.Items,
                    new ShippingAddress
                {
                    Address1    = string.IsNullOrEmpty(customer.MainAddress.Address1) ? customer.MailingAddress.Address1 : customer.MainAddress.Address1,
                    Address2    = string.IsNullOrEmpty(customer.MainAddress.Address2) ? customer.MailingAddress.Address2 : customer.MainAddress.Address2,
                    AddressType = AddressType.Mailing,
                    City        = string.IsNullOrEmpty(customer.MainAddress.City) ? customer.MailingAddress.City : customer.MainAddress.City,
                    Country     = string.IsNullOrEmpty(customer.MainAddress.Country) ? customer.MailingAddress.Country : customer.MainAddress.Country,
                    CustomerID  = customer.CustomerID,
                    Email       = customer.Email,
                    LastName    = customer.LastName,
                    FirstName   = customer.FirstName,
                    Phone       = customer.MobilePhone,
                    State       = string.IsNullOrEmpty(customer.MainAddress.State) ? customer.MailingAddress.State : customer.MainAddress.State,
                    Zip         = string.IsNullOrEmpty(customer.MainAddress.Zip) ? customer.MailingAddress.Zip : customer.MainAddress.Zip,
                },
                    shippingOverride: 0,
                    taxOverride: 0);

                autoOrderRequest.TaxRateOverride        = 0M;
                autoOrderRequest.ShippingAmountOverride = 0M;
                autoOrderRequest.CustomerID             = customerId;
                autoOrderRequest.Other15 = "1";

                details.Add(autoOrderRequest);

                // Process the transaction
                var transactionRequest = new TransactionalRequest {
                    TransactionRequests = details.ToArray()
                };
                var transactionResponse = Exigo.WebService().ProcessTransaction(transactionRequest);
                if (transactionResponse == null)
                {
                    _log.TraceEvent(TraceEventType.Error, 1, "There was no CreateOrderResponse.");
                }
                else
                {
                    _log.TraceEvent(TraceEventType.Information, 1, "ProcessTransaction.Result.TransactionKey = {0}", transactionResponse.Result.TransactionKey);
                    _log.TraceEvent(TraceEventType.Information, 1, "ProcessTransaction.Result.Reponse = {0}", transactionResponse.Result.Status);

                    if ((transactionResponse.Result.Errors != null) && (transactionResponse.Result.Errors.Length > 0))
                    {
                        _log.TraceEvent(TraceEventType.Error, 1, "ProcessTransaction.Result.Errors.Length = {0}", transactionResponse.Result.Errors.Length);
                        for (int i = 0; i < transactionResponse.Result.Errors.Length; i++)
                        {
                            _log.TraceEvent(TraceEventType.Error, 1, "ProcessTransaction.Result.Errors[{0}] = {1}", i, transactionResponse.Result.Errors[i]);
                        }
                    }
                }
                var newOrderId = 0;

                //process the response
                if (transactionResponse.Result.Status == ResultStatus.Success)
                {
                    foreach (var orderResponse in transactionResponse.TransactionResponses.OfType <CreateOrderResponse>())
                    {
                        newOrderId = orderResponse.OrderID;

                        var request = Api.CreateCustomerExtended(new CreateCustomerExtendedRequest()
                        {
                            CustomerID      = customer.CustomerID,
                            ExtendedGroupID = ExtendedGroupID,
                            Field1          = phase.ToString(),                         // phase # for bonus kicker or module for training
                            Field2          = DateTime.Now.ToString(CultureInfo.InvariantCulture),
                            Field3          = itemCode,                                 //ItemCode
                            Field4          = 100.ToString(),                           //Discount Percent
                            Field5          = 1.ToString(CultureInfo.InvariantCulture), //Redeemed
                            Field6          = newOrderId.ToString()                     // orderid
                        });
                    }

                    var updateOrder = Api.ChangeOrderStatus(new ChangeOrderStatusRequest()
                    {
                        OrderID     = newOrderId,
                        OrderStatus = OrderStatusType.Accepted
                    });
                }
                return(newOrderId);
            }
            catch (Exception ex)
            {
                return(0);
            }
        }