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.º 2
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);
        }