public void ProcessRequest(HttpContext context)
        {
            ADXTrace.Instance.TraceInfo(TraceCategory.Application, "Start");

            var dataAdapterDependencies = new PortalConfigurationDataAdapterDependencies(PortalName, context.Request.RequestContext);

            Tuple <Guid, string> quoteAndReturnUrl;

            if (!TryGetQuoteAndReturnUrl(context.Request, dataAdapterDependencies, out quoteAndReturnUrl))
            {
                throw new HttpException((int)HttpStatusCode.BadRequest, "Unable to determine quote from request.");
            }

            try
            {
                var validation = ValidatePayment(context, dataAdapterDependencies, quoteAndReturnUrl);

                LogPaymentRequest(context, dataAdapterDependencies, quoteAndReturnUrl, validation);

                if (!validation.Success)
                {
                    ADXTrace.Instance.TraceError(TraceCategory.Application, "Start");

                    HandleUnsuccessfulPayment(context, quoteAndReturnUrl, validation.ErrorMessage);

                    return;
                }

                ADXTrace.Instance.TraceInfo(TraceCategory.Application, "Payment sucessful.");

                string receiptNumber;

                if (!TryGetReceiptNumber(context, out receiptNumber))
                {
                    ADXTrace.Instance.TraceInfo(TraceCategory.Application, "Failed to get receipt number.");
                }

                var quoteid        = quoteAndReturnUrl.Item1;
                var serviceContext = dataAdapterDependencies.GetServiceContext();
                var salesorder     =
                    serviceContext.CreateQuery("salesorder")
                    .FirstOrDefault(
                        s =>
                        s.GetAttributeValue <EntityReference>("quoteid") != null &&
                        s.GetAttributeValue <EntityReference>("quoteid").Equals(new EntityReference("quote", quoteid)));

                if (salesorder == null)
                {
                    ConvertQuoteToOrder(context, dataAdapterDependencies, quoteid, receiptNumber);
                }

                HandleSuccessfulPayment(context, quoteAndReturnUrl);
            }
            catch (Exception e)
            {
                LogPaymentRequest(context, dataAdapterDependencies, quoteAndReturnUrl, e);

                throw;
            }
        }
예제 #2
0
        protected void Page_Load(object sender, EventArgs e)
        {
            Target = GetTargetEntityReference();

            if (Target == null)
            {
                Payment.Visible             = false;
                GeneralErrorMessage.Visible = true;

                return;
            }

            Guid quoteId;

            if (IsPostBack && Guid.TryParse(QuoteId.Value, out quoteId))
            {
                WebForm.CurrentSessionHistory.QuoteId = quoteId;
            }

            var dataAdapterDependencies = new Adxstudio.Xrm.Commerce.PortalConfigurationDataAdapterDependencies(PortalName, Request.RequestContext);
            var dataAdapter             = CreatePurchaseDataAdapter(Target, CurrentStepEntityPrimaryKeyLogicalName);

            Purchasable = dataAdapter.Select();

            if (Purchasable == null)
            {
                Payment.Visible             = false;
                GeneralErrorMessage.Visible = true;

                return;
            }

            // If the session quote is not the purchase quote, update and persist the session, as
            // there won't necessarily be a postback to save the session later.
            if (WebForm.CurrentSessionHistory.QuoteId != Purchasable.Quote.Id)
            {
                WebForm.CurrentSessionHistory.QuoteId = Purchasable.Quote.Id;

                WebForm.SaveSessionHistory(dataAdapterDependencies.GetServiceContext());
            }

            QuoteId.Value = Purchasable.Quote.Id.ToString();

            if (Purchasable.TotalAmount == 0)
            {
                var portal  = PortalCrmConfigurationManager.CreatePortalContext(PortalName);
                var context = dataAdapterDependencies.GetServiceContext();
                var quote   = context.CreateQuery("quote").First(q => q.GetAttributeValue <Guid>("quoteid") == Purchasable.Quote.Id);
                var adapter = new CoreDataAdapter(portal, context);
                var status  = quote.GetAttributeValue <OptionSetValue>("statecode").Value;

                if (status != (int)QuoteState.Active)
                {
                    adapter.SetState(quote.ToEntityReference(), (int)QuoteState.Active, (int)QuoteStatusCode.InProgressActive);
                }

                if (status != (int)QuoteState.Won)
                {
                    adapter.WinQuote(quote.ToEntityReference());
                }

                adapter.CovertQuoteToSalesOrder(quote.ToEntityReference());

                dataAdapter.CompletePurchase();

                SetAttributeValuesAndSave();

                MoveToNextStep();

                return;
            }

            if (Paid)
            {
                dataAdapter.CompletePurchase();

                SetAttributeValuesAndSave();

                MoveToNextStep();

                return;
            }

            Payment.Visible             = true;
            GeneralErrorMessage.Visible = false;

            if (IsPaymentError)
            {
                SetErrorFields();
            }

            SetMerchantShippingFields(ServiceContext.CreateQuery("quote").FirstOrDefault(q => q.GetAttributeValue <Guid>("quoteid") == Purchasable.Quote.Id));

            if (IsPaymentAuthorizeNet || IsPaymentDemo)
            {
                CreditCardPaymentPanel.Visible = true;
                PayPalPaymentPanel.Visible     = false;

                SetMerchantFields();

                PopulateContactInfo(Contact);

                EnableTestMode(TestModeEnabled);

                PurchaseDiscounts.DataSource = Purchasable.Discounts;
                PurchaseDiscounts.DataBind();

                PurchaseItems.DataSource = Purchasable.Items.Where(item => item.IsSelected && item.Quantity > 0);
                PurchaseItems.DataBind();
            }
            else if (IsPaymentPaypal)
            {
                PayPalPaymentPanel.Visible     = true;
                CreditCardPaymentPanel.Visible = false;

                PayPalPurchaseDiscounts.DataSource = Purchasable.Discounts;
                PayPalPurchaseDiscounts.DataBind();

                PayPalPurchaseItems.DataSource = Purchasable.Items.Where(item => item.IsSelected && item.Quantity > 0);
                PayPalPurchaseItems.DataBind();
            }
        }