public async Task <ActionResult> InitStall(int id) { try { var stall = Models.Stall.FindById(id, _db); if (stall == null) { StallApplication.BizErrorFormat("stall {0} not exist", id); return(View("Error")); } if (!stall.UserId.Equals(CurrentUser.Id)) { StallApplication.BizErrorFormat("user id not match {0} <> {1}", stall.UserId, CurrentUser.Id); return(View("Error")); } var initResult = await stall.Init(); if (initResult.Succeeded) { return(RedirectToAction("Index")); } else { StallApplication.BizErrorFormat("Failed to init stall, {0}", initResult.Message); return(View("Error")); } } catch (Exception ex) { StallApplication.BizError("Failed to init stall", ex); return(View("Error")); } }
/// <summary> /// send image to openid /// </summary> /// <param name="openid"></param> /// <param name="fileByte"></param> /// <returns></returns> public static async Task <bool> SendMessageAsync(string openid, string message, int maxAttamptTime = 3) { try { WxJsonResult sendRst = null; for (int i = 0; i < maxAttamptTime; i++) { sendRst = await CustomApi.SendTextAsync(_appId, openid, message); if (sendRst != null && sendRst.errcode == 0) { break; } } if (sendRst == null || sendRst.errcode != 0) { StallApplication.SysError($"[MSG]failed sending to wechat {openid}:{sendRst.errcode},{sendRst.errmsg}"); return(false); } return(true); } catch (Exception ex) { StallApplication.SysError($"[MSG]failed sending to wechat {openid}:", ex); return(false); } }
public async Task <bool> SendToWechat(IList <string> openids) { try { StallApplication.SysInfoFormat($"[MSG]start sending order {Id} to wechat"); //send message var msg = OwnerAlertMessage; var result = await WeChatHelper.SendMessageAsync(openids, msg); if (result) { StallApplication.SysInfoFormat($"[MSG]succeed sending order {Id} to wechat"); } else { StallApplication.SysInfoFormat($"[MSG]failed sending order {Id} to wechat"); } return(result); } catch (Exception ex) { StallApplication.SysError("[MSG]failed to send message", ex); return(false); } }
public void TestPlatformDeliveryOptions() { var json = LoadJson(@"D:\Works\Greenspot\Greenspot.Stall\Greenspot.Stall.Tests\platform.setting.json"); var stall = new Models.Stall(); stall.SettingJson = json; var delivery = StallApplication.GetDeliveryOptions(stall, new DateTime(2016, 10, 20, 16, 30, 0), 7, "nz:auckland:auckland:auckland-city", null, null); Assert.AreEqual(3, delivery.Count); }
public ActionResult Setting(int id) { var user = Models.User.CurrentUser; var stall = Models.Stall.FindById(id, _db); if (!stall.UserId.Equals(CurrentUser.Id)) { StallApplication.SysErrorFormat("user id not match {0} <> {1}", stall.UserId, CurrentUser.Id); return(View("Error")); } ViewBag.Stall = stall; return(View()); }
//vend call back public async Task <ActionResult> Connect() { var code = Request["code"]; var prefix = Request["domain_prefix"]; var userId = Request["state"]; var accessToken = await StallApplication.GetAccessTokenAsync(prefix, code); if (!string.IsNullOrEmpty(accessToken)) { return(Content(string.Format("Vend {0} binding succeed", prefix))); } else { return(View("Error")); }; }
//public async Task<OperationResult<bool>> CreateDelivery() //{ // var result = new OperationResult(false); // //create delivery product // var pdtDelivery = new SDK.Vend.VendProduct() // { // Name = "运费", // BaseName = "运费", // Handle = "gs-delivery", // Sku = "gs-delivery", // Price = 0.0M, // Active = true // }; // var pdtResp = await SDK.Vend.VendProduct.AddProduct(Prefix, await StallApplication.GetAccessTokenAsync(Prefix), pdtDelivery); // if (pdtResp == null || pdtResp.Product == null || string.IsNullOrEmpty(pdtResp.Product.Id)) // { // result.Message = "无法创建运费"; // return result; // } // //set data // result.Succeeded = true; // return result; //} private async Task <OperationResult <bool> > CreateWebhook() { var result = new OperationResult(false); //load webhooks var webhooks = await SDK.Vend.VendWebhook.GetWebhooksAsync(Prefix, await StallApplication.GetAccessTokenAsync(Prefix)); if (!webhooks.Any(x => SDK.Vend.VendWebhook.VendWebhookTypes.ProductUpdate.Equals(x.Type))) { //create product update webhook var pdtUpdate = new SDK.Vend.VendWebhook() { Type = SDK.Vend.VendWebhook.VendWebhookTypes.ProductUpdate, Url = GreenspotConfiguration.AppSettings["webhook.product.update"].Value, Active = true }; var pdtResp = await SDK.Vend.VendWebhook.CreateVendWebhookAsync(pdtUpdate, Prefix, await StallApplication.GetAccessTokenAsync(Prefix)); if (pdtResp == null) { result.Message = "无法创建商品更新WEBHOOK"; return(result); } } if (!webhooks.Any(x => SDK.Vend.VendWebhook.VendWebhookTypes.InventoryUpdate.Equals(x.Type))) { //create inventory update webhook var stockUpdate = new SDK.Vend.VendWebhook() { Type = SDK.Vend.VendWebhook.VendWebhookTypes.InventoryUpdate, Url = GreenspotConfiguration.AppSettings["webhook.inventory.update"].Value, Active = true }; var stockResp = await SDK.Vend.VendWebhook.CreateVendWebhookAsync(stockUpdate, Prefix, await StallApplication.GetAccessTokenAsync(Prefix)); if (stockResp == null) { result.Message = "无法创建库存更新WEBHOOK"; return(result); } } //set data result.Succeeded = true; return(result); }
public async Task <ActionResult> WeChatMpLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { StallApplication.BizErrorFormat("[MSG]failed to get login info"); return(View("Error")); } // Sign in the user with this external login provider if the user already has a login var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent : false); switch (result) { case SignInStatus.Success: StallApplication.SysInfoFormat(string.Format("[MSG]signIn succeed, redirec to {0}", returnUrl)); return(Redirect(returnUrl)); case SignInStatus.LockedOut: return(View("Lockout")); case SignInStatus.RequiresVerification: return(RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false })); case SignInStatus.Failure: default: // If the user does not have an account, then prompt the user to create an account ViewBag.ReturnUrl = returnUrl; ViewBag.LoginProvider = loginInfo.Login.LoginProvider; GreenspotUser user = new GreenspotUser() { UserName = "" }; var rslt = await UserManager.CreateAsync(loginInfo, user); if (rslt.Succeeded) { await SignInManager.SignInAsync(user, isPersistent : false, rememberBrowser : false); return(Redirect(returnUrl)); } return(Redirect(returnUrl)); } }
public static int?GetDistance(string depCountry, string depCity, string depSuburb, string destCountry, string destCity, string destSuburb) { //get from db using (var db = new StallEntities()) { var id = BuilId(depCountry, depCity, depSuburb, destCountry, destCity, destSuburb); var dbResult = GetDistance(id, db); if (dbResult != null) { return(dbResult); } //call google map api var glResult = GoogleMapHelper.GetSuburbDistanceFromGoogleMapApi(depCountry, depCity, depSuburb, destCountry, destCity, destSuburb, GreenspotConfiguration.AccessAccounts["google.map"].Secret); if (glResult == null) { StallApplication.SysError($"[GOOGLE DISTANCE]failed to get distance {depCountry},{depCity},{depSuburb} to {destCountry},{destCity},{destSuburb}"); return(null); } else { //save to db var distance = new SuburbDistance() { ID = id, DepartureCountryCode = depCountry, DepartureCity = depCity, DepartureSuburb = depSuburb, DestinationCountryCode = destCountry, DestinationCity = destCity, DestinationSuburb = destSuburb, Meters = glResult.Value }; db.SuburbDistances.Add(distance); db.SaveChanges(); return(glResult.Value); } } }
public async Task <bool> SendToPrinter() { try { if (await PrintHelper.PrintOrderAsync(this)) { //update return(true); } else { StallApplication.SysError("[MSG]fail to print"); return(false); } } catch (Exception ex) { StallApplication.SysError("[MSG]fail to print", ex); return(false); } }
private async Task <OperationResult <bool> > LoadProduct() { var result = new OperationResult(false); //load stall var productResult = await VendProduct.GetProductsAsync(Prefix, await StallApplication.GetAccessTokenAsync(Prefix)); if (productResult?.Products == null) { result.Message = "无法获取VEND商品信息"; return(result); } //set products Products.Clear(); //var products = productResult?.Products.OrderBy(x => x.VariantParentId).ToList(); var vProducts = productResult?.Products; foreach (var vP in vProducts) { var p = Product.ConvertFrom(vP, Id); if (p.Handle.ToLower().Equals("vend-discount")) { DiscountProductId = p.Id; p.Active = false; } else if (p.Handle.ToLower().Equals("jdl-delivery")) { DeliveryProductId = p.Id; p.Active = false; } Products.Add(p); } //set data result.Succeeded = true; return(result); }
public ActionResult AddAddress() { OperationResult <bool> result = new OperationResult <bool>(true); Stream req = Request.InputStream; req.Seek(0, System.IO.SeekOrigin.Begin); string json = new StreamReader(req).ReadToEnd(); DeliveryAddress addr = new DeliveryAddress(); try { var clntObj = JsonConvert.DeserializeObject <dynamic>(json); addr.UserId = CurrentUser.Id; addr.Name = clntObj.FullName; addr.Mobile = clntObj.Mobile; addr.Address1 = clntObj.AddressObject.AddressLine1; addr.Address2 = clntObj.Address2; addr.Suburb = clntObj.AddressObject.Suburb; addr.City = clntObj.AddressObject.CityTown; addr.StateOrRegion = ""; addr.CountryCode = "NZ"; addr.Postcode = clntObj.AddressObject.Postcode; addr.Area = clntObj.Area; addr.Save(_db); } catch (Exception ex) { // Try and handle malformed POST body result.Succeeded = false; result.Message = ex.Message; StallApplication.SysError("[ADD ADDR]failed to address", ex); } return(Json(result, JsonRequestBehavior.AllowGet)); }
public static async Task <OperationResult> InitMultiStall(int id, StallEntities db) { var result = new OperationResult(false); var baseStall = Stall.FindById(id, db); if (baseStall == null) { result.Message = $"Stall {id} is not exist"; return(result); } //load base info var infoResult = await baseStall.LoadInfo(); if (!infoResult.Succeeded) { result.Message = infoResult.Message; return(result); } //load product var productResult = await baseStall.LoadProduct(); if (!productResult.Succeeded) { result.Message = productResult.Message; return(result); } //create webhook var webhookResult = await baseStall.CreateWebhook(); if (!webhookResult.Succeeded) { result.Message = webhookResult.Message; return(result); } //load suppliers var supplierResult = await SDK.Vend.Supplier.GetSuppliersAsync(baseStall.Prefix, await StallApplication.GetAccessTokenAsync(baseStall.Prefix)); var suppliers = supplierResult.Suppliers; if (suppliers == null || suppliers.Count == 0) { // result.Message = "无法获取VEND Supplier信息"; return(result); } //seperate by supplier var unStalledProduct = new List <Product>(); var stalls = new SortedDictionary <string, Stall>(); foreach (var p in baseStall.Products) { //loop product if (string.IsNullOrEmpty(p.SupplierName)) { //no supplier product unStalledProduct.Add(p); continue; } Stall currStall; if (stalls.ContainsKey(p.SupplierName)) { //exist stall currStall = stalls[p.SupplierName]; } else { #region new stall var supplier = suppliers.FirstOrDefault(x => x.Name.Equals(p.SupplierName)); //new stall currStall = new Stall() { UserId = baseStall.UserId, Prefix = baseStall.Prefix, StallName = p.SupplierName, RetailerId = baseStall.RetailerId, RegisterId = baseStall.RegisterId, RegisterName = baseStall.RegisterName, OutletId = baseStall.OutletId, PaymentTypeId = baseStall.PaymentTypeId, DeliveryProductId = baseStall.DeliveryProductId, DiscountProductId = baseStall.DiscountProductId, ContactName = $"{supplier.Contact.FirstName} {supplier.Contact.LastName}".Trim(), Mobile = supplier.Contact.Mobile, Phone = supplier.Contact.Phone, Address1 = supplier.Contact.PhysicalAddress1, Address2 = supplier.Contact.PhysicalAddress2, City = supplier.Contact.PhysicalCity, CountryId = supplier.Contact.PhysicalCountryId, Postcode = supplier.Contact.PhysicalPostcode, StateOrRegion = supplier.Contact.PhysicalState, Suburb = supplier.Contact.PhysicalSuburb, TimeZone = baseStall.TimeZone, Status = StallStatus.Offline }; stalls.Add(p.SupplierName, currStall); #endregion } currStall.Products.Add(p); } //save to db using (var trans = db.Database.BeginTransaction()) { //save base stall try { //keep unstalled product baseStall.Products = unStalledProduct; db.Set <Stall>().AddOrUpdate(baseStall); db.SaveChanges(); } catch (Exception ex) { result.Message = $"failed to save stall {baseStall.StallName}:{ex.ToString()}"; trans.Rollback(); return(result); } foreach (var s in stalls.Values) { try { db.Set <Stall>().AddOrUpdate(s); db.SaveChanges(); } catch (Exception ex) { result.Message = $"failed to save stall {s.StallName}:{ex.ToString()}"; trans.Rollback(); return(result); } } trans.Commit(); } result.Succeeded = true; return(result); }
public ActionResult PxPay(int id) { string paidFlag = Request["paid"]; if (paidFlag == null) { StallApplication.SysError("[MSG]pxpay callback without paid parameter"); return(View("Error")); } StallApplication.SysInfoFormat("[MSG]PxPay call back [{0}]:{1}", paidFlag, Request.Url.ToString()); bool isSuccess = "SUCCESS".Equals(paidFlag.ToUpper()); string payResultId = Request["result"]; if (string.IsNullOrEmpty(payResultId)) { StallApplication.SysError("[MSG]pxpay callback without result id"); return(View("Error")); } int paymentId = 0; if (!Accountant.VerifyPxPayPayment(payResultId, isSuccess, out paymentId)) { StallApplication.BizErrorFormat("[MSG]PxPay not verified, result id={0}", payResultId); return(View("Error")); } if (paymentId != id) { StallApplication.BizErrorFormat("[MSG]transaction not matched, px {0} <> url {1}", paymentId, id); return(View("Error")); } if (isSuccess) { if (StallApplication.IsPaymentOperating(paymentId)) { StallApplication.BizErrorFormat("[MSG]payment {0} is operating", paymentId); return(Redirect("/customer/orders")); } //set order as paid var orders = Models.Order.FindByPaymentId(paymentId, _db); foreach (var order in orders) { if (!order.HasPaid) { try { order.HasPaid = true; _db.SaveChanges(); //notify var openIds = new List <string>(); //owner var owner = UserManager.FindById(order.Stall.UserId); var ownerId = owner?.SnsInfos[WeChatClaimTypes.OpenId].InfoValue; openIds.Add(ownerId); //delivery man var deliveryMen = Models.User.GetByRole(_db, "DeliveryMan"); foreach (var d in deliveryMen) { var dId = d.SnsInfos.FirstOrDefault(x => WeChatClaimTypes.OpenId.Equals(x.InfoKey))?.InfoValue; if (!string.IsNullOrEmpty(dId)) { openIds.Add(dId); } } //await order.Notify(_db, openId); HostingEnvironment.QueueBackgroundWorkItem(x => order.Notify(_db, openIds)); } catch (Exception ex) { StallApplication.SysError($"[MSG]failed to save order {order.Id}", ex); } } } StallApplication.RemoveOperatingPayment(paymentId); return(Redirect("/customer/orders?act=paid")); } else { return(Redirect("/errorpage/payfailed")); } }
public ActionResult Pay() { OperationResult <string> result = new OperationResult <string>(true); Stream req = Request.InputStream; req.Seek(0, System.IO.SeekOrigin.Begin); string json = new StreamReader(req).ReadToEnd(); Payment payment = null; try { IList <Product> outOfStocks; var orders = ConvertToOrders(json, out outOfStocks); if (outOfStocks.Count > 0) { result.Succeeded = false; result.Message = "Some Products are out of stock"; var sb = new StringBuilder("["); var comma = ""; foreach (var p in outOfStocks) { sb.Append(string.Format("{0}{{\"StallName\":\"{1}\",\"ProductName\":\"{2}\",\"Stock\":{3}}}", comma, p.Stall.StallName, p.BaseName, p.Stock)); comma = ","; } sb.Append("]"); result.ErrorType = "OutOfStock"; result.Data = sb.ToString(); return(Json(result, JsonRequestBehavior.AllowGet)); } using (var tran = _db.Database.BeginTransaction()) { //calc total amnount, orderIds decimal amount = 0.0M; foreach (var order in orders) { amount += order.ChargeAmount; } //create payment payment = Payment.CreatePayment(_db, amount); if (payment == null) { tran.Rollback(); result.Succeeded = false; result.Message = "fail to create payment"; return(Json(result, JsonRequestBehavior.AllowGet)); } //create order string orderIds = null; foreach (var order in orders) { order.PaymentId = payment.Id; order.IsPrintOrder = order.Stall.IsPrintOrder; if (!order.Save(_db)) { tran.Rollback(); result.Succeeded = false; result.Message = "fail to create order"; return(Json(result, JsonRequestBehavior.AllowGet)); } //get order id if (string.IsNullOrEmpty(orderIds)) { orderIds = order.Id.ToString(); } else { orderIds += "," + order.Id.ToString(); } } //update payment payment.OrderIds = orderIds; payment.Save(_db); //save tran.Commit(); } //return payment url string payUrl = null; string urlSuccess = string.Format("{0}/Customer/PxPay/{1}?paid=SUCCESS", GreenspotConfiguration.RootUrl, payment.Id); string urlFail = string.Format("{0}/Customer/PxPay/{1}?paid=FAIL", GreenspotConfiguration.RootUrl, payment.Id); try { payUrl = Accountant.GeneratePayURL(payment, urlFail, urlSuccess); StallApplication.BizInfoFormat("[PAY]go to payment url:{0}", payUrl); result.Data = payUrl; } catch (Exception ex) { StallApplication.SysError("[PAY]", ex); result.Succeeded = false; result.Message = "fail to generate payment url"; } } catch (Exception ex) { // Try and handle malformed POST body StallApplication.SysError("[PAY]", ex); result.Succeeded = false; result.Message = "fail to pay"; } return(Json(result, JsonRequestBehavior.AllowGet)); }
public async Task <OperationResult <bool> > UpdateProductById(string id, StallEntities db) { var result = new OperationResult(false); //load product var productResult = await VendProduct.GetProductByIdAsync(id, Prefix, await StallApplication.GetAccessTokenAsync(Prefix)); if (productResult?.Products == null) { result.Message = string.Format("无法获取商品[{0}]信息", id); return(result); } //set products var vProducts = productResult?.Products; foreach (var vP in vProducts) { if (vP.Id.Equals(id)) { var p = Product.ConvertFrom(vP, Id); return(p.Save(db)); } } result.Message = string.Format("无法获取商品[{0}]信息", id); return(result); }
/// <summary> /// Send Order To Vend /// </summary> /// <param name="db"></param> /// <returns></returns> public async Task <bool> SendToVend() { try { //var tmpOrder = JsonConvert.DeserializeObject<Order>(JsonString); //var tmpStall = Models.Stall.FindById(StallId, db); //create vend api object var vendSale = new VendRegisterSaleRequest(); vendSale.InvoiceNumber = Id.ToString(); vendSale.RegisterId = Stall.RegisterId; vendSale.SaleDate = CreateTime.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss"); vendSale.Status = OrderStatus.CLOSED; vendSale.TotalPrice = (double)CalcTotalPriceExcludeTax(); vendSale.TotalTax = (double)CalcTotalTax(); //vendSale.TaxName = Items[0].Product.TaxName; vendSale.RegisterSaleProducts = new List <VendRegisterSaleRequest.RegisterSaleProduct>(); vendSale.RegisterSalePayments = new List <VendRegisterSaleRequest.RegisterSalePayment>(); vendSale.Note = string.Format("#{0}@{1}\n{2}\n{3}\n{4}", Id, PaymentId, Receiver, DeliveryAddress, Note); foreach (var item in Items) { var salePdt = new VendRegisterSaleRequest.RegisterSaleProduct() { ProductId = item.ProductId, Quantity = item.Quantity, Price = (double)item.Price, Tax = (double)item.Tax, TaxId = item.TaxId, TaxTotal = (double)item.Tax }; salePdt.Attributes.Add(new VendRegisterSaleRequest.Attribute() { Name = "line_note", Value = item.LineNote }); vendSale.RegisterSaleProducts.Add(salePdt); } vendSale.RegisterSalePayments.Add(new VendRegisterSaleRequest.RegisterSalePayment() { RetailerPaymentTypeId = Stall.PaymentTypeId, PaymentDate = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Payment.ResponseTime?.ToUniversalTime()), Amount = (double)StallAmount }); //do reqeust var response = await VendRegisterSale.CreateVendRegisterSalesAsync(vendSale, Stall.Prefix, await StallApplication.GetAccessTokenAsync(Stall.Prefix)); //update if (!string.IsNullOrEmpty(response.RegisterSale.Id) && OrderStatus.CLOSED.Equals(response.RegisterSale.Status)) { VendResponse = JsonConvert.SerializeObject(response); VendSaleId = response?.RegisterSale?.Id; return(true); } else { StallApplication.SysError("[MSG]fail to save to vend"); return(false); } } catch (Exception ex) { StallApplication.SysError("[MSG]fail to save to vend", ex); return(false); } }
private async Task <OperationResult <bool> > LoadInfo() { var result = new OperationResult(false); //load stall var outletResult = await VendOutlet.GetOutletsAsync(Prefix, await StallApplication.GetAccessTokenAsync(Prefix)); if (outletResult?.Outlets == null || outletResult.Outlets.Count == 0) { result.Message = "无法同步VEND商铺信息"; return(result); } //set stall info var outlet = outletResult.Outlets[0]; RetailerId = outlet.RetailerId; OutletId = outlet.Id; //Email = outlet.Email; Address1 = outlet.PhysicalAddress1; Address2 = outlet.PhysicalAddress2; City = outlet.PhysicalCity; CountryId = outlet.PhysicalCountryId; Postcode = outlet.PhysicalPostcode; StateOrRegion = outlet.PhysicalState; Suburb = outlet.PhysicalSuburb; TimeZone = outlet.TimeZone; //load payment types var paytypeResult = await VendPaymentType.GetPaymentTypetsAsync(Prefix, await StallApplication.GetAccessTokenAsync(Prefix)); if (paytypeResult?.PaymentTypes == null || paytypeResult.PaymentTypes.Count == 0) { result.Message = "无法获取VEND PAYMENT TYPE信息"; return(result); } //set payment type PaymentTypeId = null; foreach (var pt in paytypeResult.PaymentTypes) { if (pt.Name.ToUpper().Equals("JDL PAY")) { PaymentTypeId = pt.Id; break; } } if (string.IsNullOrEmpty(PaymentTypeId)) { result.Message = "无法获取名为JDL PAY的VEND PAYMENT TYPE"; return(result); } //load registers var registerResult = await VendRegister.GetRegistersAsync(Prefix, await StallApplication.GetAccessTokenAsync(Prefix)); if (registerResult?.Registers == null || registerResult.Registers.Count == 0) { result.Message = "无法获取VEND REGISTER信息"; return(result); } //set registers var reg = registerResult.Registers[0]; RegisterName = reg.Name; RegisterId = reg.Id; result.Succeeded = true; return(result); }
/// <summary> /// verify px payment match transaction /// if pay success set transaction as paid /// </summary> /// <param name="resultId"></param> /// <param name="isSuccess"></param> /// <returns></returns> public static bool VerifyPxPayPayment(string resultId, bool isSuccess, out int outPaymentId) { outPaymentId = 0; try { //check response StallApplication.BizInfoFormat("[ACCOUNTANT-PXPAY]start to get pxpay payment result={0}", resultId); ResponseOutput output = _pxPay.ProcessResponse(resultId); if (output == null) { StallApplication.BizError("[ACCOUNTANT-PXPAY]can not get pxpay payment result - resposne is null"); return(false); } if (!(isSuccess ? "1" : "0").Equals(output.Success)) { StallApplication.BizErrorFormat("[ACCOUNTANT-PXPAY]payment result not match except {0} - actual {1}", output.Success, isSuccess); StallApplication.BizErrorFormat("[ACCOUNTANT-PXPAY]{0}", output); return(false); } //set payment int paymentId = int.Parse(output.TxnId.Split('-')[0]); decimal amount = decimal.Parse(output.AmountSettlement); using (StallEntities db = new StallEntities()) { Payment payment = db.Payments.FirstOrDefault(o => o.Id == paymentId); if (payment == null) { StallApplication.BizErrorFormat("[ACCOUNTANT-PXPAY]payment {0} can not mactch payment {1}", resultId, outPaymentId); StallApplication.BizErrorFormat("[ACCOUNTANT-PXPAY]{0}", output); return(false); } payment.ResponseTime = DateTime.Now; outPaymentId = paymentId; bool result = true; if (!isSuccess) { //pay fail StallApplication.BizErrorFormat("[ACCOUNT-PAPAY]pay failed payment id={0}", payment.Id); } else { //pay success if (payment.Amount != amount) { StallApplication.BizErrorFormat("[ACCOUNT-PAPAY]pxpay amount {0} <> transaction amount {1}", amount, payment.Amount); result = false; } else { payment.HasPaid = true; } } payment.PxPayResponse = output.ToString(); db.SaveChanges(); return(result); } } catch (Exception ex) { StallApplication.SysError("can not get pxpay payment result", ex); return(false); } }
public OperationResult <IList <DeliveryOptionCollectionViewModel> > GetDeliveryOptions(int id, [FromUri] string country, [FromUri] string city, [FromUri] string suburb, [FromUri] string area, [FromUri] decimal orderAmount) { string areaStr = $"{country}:{city}:{area.Replace(' ', '-')}".ToLower(); var result = new OperationResult <IList <DeliveryOptionCollectionViewModel> >(true) { Data = new List <DeliveryOptionCollectionViewModel>() }; Models.Stall stall = null; //get stall using (var db = new StallEntities()) { stall = Models.Stall.FindById(id, db); if (stall == null) { result.Succeeded = false; result.Message = "Can not load delivery schedule for stall " + id; return(result); } } //minimum delivery order amount if (stall.Setting.Delivery.MinOrderAmount != null && orderAmount < stall.Setting.Delivery.MinOrderAmount) { return(result); } // var advDays = stall.Setting.MaxAdvancedOrderDays > StallApplication.Setting.MaxAdvancedOrderDays ? StallApplication.Setting.MaxAdvancedOrderDays : stall.Setting.MaxAdvancedOrderDays; var advMins = stall.Setting.MinDeliveryAdvancedMinutes < StallApplication.Setting.MinDeliveryAdvancedMinutes ? StallApplication.Setting.MinDeliveryAdvancedMinutes : stall.Setting.MinDeliveryAdvancedMinutes; //get distance var distance = stall.GetDistance(country, city, suburb); IList <DeliveryOrPickupOption> deliveryOpts; if (stall.Setting.Delivery.DeliveryType == Models.Settings.DeliveryTypes.StoreOnly) { //get store delivery deliveryOpts = stall.GetDeliveryOptions(DateTime.Now.AddMinutes(advMins), advDays, areaStr, distance, orderAmount); } else { //get platform deliveryOpts = StallApplication.GetDeliveryOptions(stall, DateTime.Now.AddMinutes(advMins), advDays, areaStr, distance, orderAmount); } DeliveryOptionCollectionViewModel collection = null; DateTime currDate = DateTime.MinValue.Date; foreach (var opt in deliveryOpts) { //free delivery if (stall.Setting.Delivery.FreeDeliveryOrderAmount != null && orderAmount >= stall.Setting.Delivery.FreeDeliveryOrderAmount) { opt.Fee = 0; } var optObjs = opt.Divide(); foreach (var optObj in optObjs) { if (!optObj.IsApplicableToArea(areaStr)) { //has suitable area = available continue; } if (opt.From.Date != currDate) { //new date group collection = new DeliveryOptionCollectionViewModel(); result.Data.Add(collection); currDate = opt.From.Date; } //add collection.Options.Add(optObj); } } return(result); }