public override LSDecimal GetTaxResult(Order ThisOrder, AnonymousAddress Address, LSDecimal ShippingRate) { CommerceBuilder.Orders.Basket basket = ThisOrder.AcBasket; if (basket == null) { basket = AcHelper.GetAcBasket(ThisOrder.ShoppingCart, true); if (basket != null) { basket.Package(false); } ThisOrder.AcBasket = basket; } if (basket != null) { Orders.BasketItem basketItem = null; if (ShippingRate > 0) { //only temporarily add basket item for tax calculations basketItem = new Orders.BasketItem(); basketItem.OrderItemType = Orders.OrderItemType.Shipping; basketItem.Price = ShippingRate; basketItem.Quantity = 1; basketItem.Name = "Temp_GoogleCheckout"; //this basket item should be linked to the shipment if (basket.Shipments.Count > 0) { basketItem.BasketShipmentId = basket.Shipments[0].BasketShipmentId; } basket.Items.Add(basketItem); basketItem.BasketId = basket.BasketId; basketItem.Save(); } CommerceBuilder.Users.Address acAddress = AcHelper.GetAnonAcAddress(basket.User, Address); UpdateBillingAddress(basket.User, acAddress); foreach (Orders.BasketShipment shipment in basket.Shipments) { UpdateShipmentAddress(shipment, acAddress); } LSDecimal RetVal = Taxes.TaxCalculator.Calculate(basket); //now that the tax rate is calculated, we can remove the additional basket item if (basketItem != null) { basket.Items.Remove(basketItem); basketItem.Delete(); } return(RetVal); } else { return(0); } }
public void Process() { TraceContext trace = WebTrace.GetTraceContext(); string traceKey = "GoogleCheckout.AC.NewOrderHandler"; trace.Write(traceKey, "Begin NewOrderHandler.Process, Google order number " + N1.googleordernumber); Order order = OrderDataSource.LoadForGoogleOrderNumber(N1.googleordernumber); if (order == null) // ordernumber not already entered { trace.Write(traceKey, "Google order not present in database, get basket"); Basket basket = AcHelper.GetAcBasket(N1.shoppingcart, true); if (basket == null) { trace.Write(traceKey, "Basket could not be obtained (End NewOrderHandler.Process)"); return; } //basket is ready. check if there are any order adjustments to be made trace.Write(traceKey, "Check for order adjustments"); OrderAdjustment orderAdj = N1.orderadjustment; if (orderAdj != null) { trace.Write(traceKey, "Order adjustments present, add to basket"); OrderAdjustmentHelper.DoOrderAdjustments(orderAdj, basket); } trace.Write(traceKey, "set billing address"); Users.Address primaryAddress = basket.User.PrimaryAddress; AcHelper.PopulateAcAddress(primaryAddress, N1.buyerbillingaddress); trace.Write(traceKey, "set shipping address"); Users.Address shipAddr = AcHelper.GetAcAddress(basket.User, N1.buyershippingaddress); basket.User.Addresses.Add(shipAddr); basket.User.Save(); trace.Write(traceKey, "package the basket"); basket.Package(false); if (basket.Shipments.Count > 0) { //there are shippable items / shipments //set shipment address and shipment method trace.Write(traceKey, "shippable items present, get shipping method"); ShipMethod shipMethod = AcHelper.GetShipMethod(basket); trace.Write(traceKey, "ship method is " + shipMethod.Name + " (ID" + shipMethod.ShipMethodId.ToString() + ")"); foreach (BasketShipment shipment in basket.Shipments) { shipment.AddressId = shipAddr.AddressId; shipment.ShipMethodId = shipMethod.ShipMethodId; shipment.Save(); } //have to link the shipping charges with some shipment. //we can't know which shipment. Just link to the first. trace.Write(traceKey, "assign shipping charges to first shipment"); BasketShipment basketShipment = basket.Shipments[0]; foreach (BasketItem item in basket.Items) { if (item.OrderItemType == OrderItemType.Shipping) { item.BasketShipmentId = basketShipment.BasketShipmentId; //update the sku and shipping method name so that scrubbed name is not used item.Name = shipMethod.Name; item.Sku = string.Empty; } } } trace.Write(traceKey, "save basket"); basket.Save(); //now checkout the order with null payment. //this will alow payment to be processed later trace.Write(traceKey, "submit basket checkout"); CheckoutRequest acCheckout = new CheckoutRequest(null); CheckoutResponse acResp = basket.Checkout(acCheckout); if (acResp.Success) { trace.Write(traceKey, "checkout was successful, update the google order number for AC order number " + acResp.OrderNumber.ToString()); order = OrderDataSource.Load(acResp.OrderId, false); if (order != null) { //update email address associated with order order.BillToEmail = N1.buyerbillingaddress.email; order.GoogleOrderNumber = N1.googleordernumber; bool isPaidByGc = false; //IF THERE IS ONE PAYMENT AND IT IS A GIFT CERTIFICATE //AND IT COVERS THE BALANCE OF THE ORDER THEN THIS IS THE GOOGLE PAYMENT if (order.Payments.Count == 1) { int gcPayMethodId = PaymentEngine.GetGiftCertificatePaymentMethod().PaymentMethodId; Payment payment = order.Payments[0]; if (payment.PaymentMethodId == gcPayMethodId) { if (payment.Amount == order.TotalCharges) { isPaidByGc = true; } } } if (!isPaidByGc) { //We need to create a new payment with status of authorization pending Payment payment = new Payment(); payment.PaymentMethodId = AcHelper.GetGCPaymentMethodId(this.GatewayInstance); payment.Amount = order.GetBalance(false); payment.OrderId = order.OrderId; payment.PaymentMethodName = "GoogleCheckout"; Transaction trans = new Transaction(); trans.TransactionType = TransactionType.Authorize; trans.TransactionStatus = TransactionStatus.Pending; trans.Amount = payment.Amount; trans.PaymentGatewayId = this.GatewayInstance.PaymentGatewayId; trans.ProviderTransactionId = N1.googleordernumber; trans.TransactionDate = N1.timestamp; payment.Transactions.Add(trans); payment.PaymentStatus = PaymentStatus.AuthorizationPending; order.Payments.Add(payment); } order.Save(); } else { OrderDataSource.UpdateGoogleOrderNumber(acResp.OrderId, N1.googleordernumber); } } else { trace.Write(traceKey, "checkout failed for google order"); CommerceBuilder.Utility.Logger.Warn("GoogleCheckout : New Order Checkout Failed."); } trace.Write(traceKey, "Send AC order number back to Google"); AcNotifier.AddMerchantOrderNumber(GatewayInstance, N1.googleordernumber, acResp.OrderNumber.ToString()); } else { //order number already entered. Just send notification trace.Write(traceKey, "Google order in database, send AC order number back to Google"); AcNotifier.AddMerchantOrderNumber(GatewayInstance, N1.googleordernumber, order.OrderNumber.ToString()); } trace.Write(traceKey, "End NewOrderHandler.Process"); }
public override ShippingResult GetShippingResult(string ShipMethodName, Order ThisOrder, AnonymousAddress Address) { TraceContext trace = WebTrace.GetTraceContext(); ShippingResult RetVal = new ShippingResult(); RetVal.Shippable = false; CommerceBuilder.Orders.Basket basket = ThisOrder.AcBasket; if (basket == null) { basket = AcHelper.GetAcBasket(ThisOrder.ShoppingCart, true); if (basket != null) { basket.Package(false); } ThisOrder.AcBasket = basket; } if (basket == null || basket.Shipments.Count == 0) { return(RetVal); } ShipMethodCollection shipMethods = ThisOrder.AcShipMethods; if (shipMethods == null) { shipMethods = ShipMethodDataSource.LoadForStore(); ThisOrder.AcShipMethods = shipMethods; } if (shipMethods == null || shipMethods.Count == 0) { return(RetVal); } ShipMethod shipMethod; string methodName = ""; int shipMethodId = AcHelper.ExtractShipMethodId(ShipMethodName, out methodName); if (shipMethodId != 0) { shipMethod = AcHelper.FindShipMethod(shipMethods, shipMethodId); } else { shipMethod = AcHelper.FindShipMethod(shipMethods, methodName); } if (shipMethod == null) { return(RetVal); } CommerceBuilder.Users.Address acAddress = AcHelper.GetAnonAcAddress(basket.User, Address); if (!shipMethod.IsApplicableTo(acAddress)) { return(RetVal); } ShipRateQuote rateQuote; //TODO : should assign a default ship rate RetVal.ShippingRate = 0; bool isValid = true; foreach (Orders.BasketShipment bshipment in basket.Shipments) { bshipment.SetAddress(acAddress); if (!bshipment.IsShipMethodApplicable(shipMethod)) { isValid = false; break; } rateQuote = shipMethod.GetShipRateQuote(bshipment); if (rateQuote != null && rateQuote.TotalRate > 0) { RetVal.ShippingRate += rateQuote.TotalRate; } else if (rateQuote == null) { //this ship method is not applicable isValid = false; break; } } if (isValid) { RetVal.Shippable = true; } return(RetVal); }
public override MerchantCodeResult GetMerchantCodeResult(Order ThisOrder, AnonymousAddress Address, string MerchantCode) { MerchantCodeResult RetVal = new MerchantCodeResult(); RetVal.Valid = false; CommerceBuilder.Orders.Basket basket = ThisOrder.AcBasket; if (basket == null) { basket = AcHelper.GetAcBasket(ThisOrder.ShoppingCart); if (basket != null) { basket.Package(false); } ThisOrder.AcBasket = basket; } if (basket != null) { Marketing.Coupon coupon = AcHelper.GetAcCoupon(MerchantCode); if (coupon != null) { RetVal.Type = MerchantCodeType.Coupon; if (!Marketing.CouponCalculator.IsCouponValid(basket, coupon)) { RetVal.Message = "Coupon '" + MerchantCode + "' is not valid."; return(RetVal); } if (coupon.AllowCombine) { if (HasNoCombineCoupon(basket)) { //Basket already has a no combine coupon. RetVal.Message = "The existing coupon applied to the basket can not combine other coupons."; return(RetVal); } } else { if (basket.BasketCoupons.Count > 0) { RetVal.Message = "Coupon " + MerchantCode + " can not combine with other coupons."; return(RetVal); } } if (!Marketing.CouponCalculator.IsCouponAlreadyUsed(basket, coupon)) { //Coupon can be applied now. CommerceBuilder.Orders.BasketCoupon recentCoupon = new CommerceBuilder.Orders.BasketCoupon(basket.BasketId, coupon.CouponId); basket.BasketCoupons.Add(recentCoupon); basket.Save(); } CouponCalculator.ProcessBasket(basket, false); //basket.Recalculate(); CommerceBuilder.Orders.BasketItem couponItem = GetAppliedCouponItem(basket, coupon); if (couponItem != null) { RetVal.Valid = true; RetVal.Message = "Coupon '" + MerchantCode + "' has been applied."; RetVal.Amount = Math.Abs(couponItem.ExtendedPrice.ToDecimal(null)); } else { RetVal.Message = "Coupon '" + MerchantCode + "' could not be applied."; } return(RetVal); } else { //check giftcertificate Payments.GiftCertificate giftCert = AcHelper.GetAcGiftCert(MerchantCode); if (giftCert != null) { RetVal.Type = MerchantCodeType.GiftCertificate; RetVal.Amount = giftCert.Balance; if (DateTime.Compare(giftCert.ExpirationDate, DateTime.UtcNow) < 0) { RetVal.Valid = true; } else { RetVal.Message = "Giftcertificate '" + MerchantCode + "' is expired."; } } else { RetVal.Message = "Sorry, we didn't the recognize code '" + MerchantCode + "'."; } } } if (!RetVal.Valid) { RetVal.Message = "Sorry, we didn't the recognize code '" + MerchantCode + "'."; } return(RetVal); }