Exemplo n.º 1
0
        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"));
            }
        }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 5
0
        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());
        }
Exemplo n.º 6
0
        //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"));
            };
        }
Exemplo n.º 7
0
        //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);
        }
Exemplo n.º 8
0
        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));
            }
        }
Exemplo n.º 9
0
        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);
                }
            }
        }
Exemplo n.º 10
0
 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);
     }
 }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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);
        }
Exemplo n.º 14
0
        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"));
            }
        }
Exemplo n.º 15
0
        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));
        }
Exemplo n.º 16
0
        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);
        }
Exemplo n.º 17
0
        /// <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);
            }
        }
Exemplo n.º 18
0
        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);
        }
Exemplo n.º 19
0
        /// <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);
            }
        }
Exemplo n.º 20
0
        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);
        }