public void Add(PlacedOrder placedOrder)
 {
     using (var connection = new SqlConnection(this.connectionString))
     {
         connection.Execute("INSERT INTO PlacedOrder (OrderId, Name, Email, Address, ZipCode, City, TotalPrice, OrderDate) VALUES(@orderId, @name, @email, @address, @zipcode, @city, @totalPrice, @orderDate)", placedOrder);
     }
 }
 public IActionResult CreateOrder(PlacedOrder placedOrder)
 {
     if (ModelState.IsValid)
     {
         var menuItems   = _repo.MenuItem.GetMenuItemsByIds(placedOrder.OrderedItems.Select(x => x.MenuItemId).Distinct()).ToList();
         var orderResult = InventoryCanMakeOrder(placedOrder, menuItems);
         if (orderResult.Item1)
         {
             placedOrder.OrderedTimestamp = DateTime.Now;
             placedOrder.UserId           = this.User.FindFirst(ClaimTypes.NameIdentifier).Value;
             UpdateInventory(placedOrder, orderResult.Item3);
             _repo.PlacedOrder.CreateOrder(placedOrder);
             _repo.Save();
         }
         else
         {
             var menuItem           = menuItems.Find(x => x.Recipe.Exists(x => x.IngredientId == orderResult.Item2));
             var menuItemingredient = menuItem.Recipe.Find(x => x.IngredientId == orderResult.Item2);
             var errorMessage       = $"Sorry, we can't make {menuItem.Name} as we have don't have enough {menuItemingredient.Ingredient.Name}";
             return(Json(new { ErrorMessage = errorMessage }));
         }
         return(RedirectToAction(nameof(Index)));
     }
     return(Json(placedOrder));
 }
示例#3
0
        public bool createOrder(int orderId, PlacedOrder placedOrder)
        {
            if (orderId == 0)
            {
                return(false);
            }

            else
            {
                //Adding orderId and orderDate
                placedOrder.OrderId   = orderId;
                placedOrder.OrderDate = GetTimestamp(DateTime.Now);
                //Getting all order rows with the specified order no and sum their prices to get total price
                List <PlacedOrderRows> allPlacedOrderRows = this.placedOrderRowsRepository.Get(orderId);
                float sumAllPrices = 0;
                foreach (var placedOrderRow in allPlacedOrderRows)
                {
                    sumAllPrices += placedOrderRow.Price;
                }

                placedOrder.TotalPrice = sumAllPrices;

                this.placedOrderRepository.Add(placedOrder);
            }
            return(true);
        }
        public PlacedOrderDTO OrderToPlacedOrderDTO(PlacedOrder givenOrder)
        {
            List <ItemGroupDTO> DTOList = new List <ItemGroupDTO>();

            foreach (var item in givenOrder.OrderItems)
            {
                DTOList.Add(new ItemGroupDTO()
                {
                    ItemID                 = item.ItemID,
                    ItemAmount             = item.ItemAmount,
                    ShippingDate           = item.ShippingDate,
                    PriceOf_OrderItemGroup = item.PriceOf_OrderItemGroup,
                    PricePerItem           = item.PricePerItem
                });
            }
            return(new PlacedOrderDTO()
            {
                OrderId = givenOrder.OrderId,
                CostumerID = givenOrder.CostumerID,
                OrderDate = givenOrder.OrderDate,
                DateShipped = givenOrder.DateShipped,
                OrderItems = DTOList,
                TotalPriceOfOrder = givenOrder.TotalPriceOfOrder
            });
        }
示例#5
0
        public async Task <bool> SetCompleteOrder(PlacedOrder model)
        {
            var result  = false;
            var process = 0;

            if (model.OrderTypeId == (int)EOrderType.DineIn)
            {
                process = (int)EOrderProcess.ServingOrder;
            }
            else if (model.OrderTypeId == (int)EOrderType.Delivery || model.OrderTypeId == (int)EOrderType.ToGo)
            {
                process = (int)EOrderProcess.AvailableOrder;
            }
            var processStatus = new PlacedOrderProcessStatus()
            {
                RestaurantId   = _authenticationDto.RestaurantId,
                BranchId       = _authenticationDto.BranchId,
                PlacedOrderId  = model.Id,
                OrderProcessId = process,
                Status         = 1,
                CreatedStaffId = _authenticationDto.UserId,
                CreatedDate    = DateTime.Now
            };
            var lastProcessStatus = await _placedOrderProcessStatusBusiness.Add(processStatus);

            if (lastProcessStatus != null)
            {
                result = true;
            }

            return(result);
        }
        public async Task <PlacedOrderProcessStatus> Add(PlacedOrderProcessStatus model)
        {
            var entity = _placedOrderProcessStatusRepository.Add(model);

            if (entity != null)
            {
                var placedOrder = new PlacedOrder()
                {
                    RestaurantId   = entity.RestaurantId,
                    BranchId       = entity.BranchId,
                    Id             = entity.PlacedOrderId,
                    OrderProcessId = entity.OrderProcessId
                };

                // Update Order Process to Placed Order
                var result = await UpdateOrderProcess(placedOrder);

                if (result)
                {
                    await _placedOrderProcessStatusRepository.SaveChangeAsync();

                    return(model);
                }
            }
            return(null);
        }
示例#7
0
            public async Task <PfxCertificate> FinalizeOrder(PlacedOrder placedOrder)
            {
                await Task.Delay(500);

                OrderFinalizedCts.CancelAfter(250);

                return(new PfxCertificate(FakeCert.RawData));
            }
        public async Task <bool> SetFinishOrder(PlacedOrder model, Checkout checkout)
        {
            var result = false;
            var record = await _placedOrderRepository.Repo.FirstOrDefaultAsync(c => c.Id == model.Id);

            if (record != null)
            {
                record.TaxId          = model.TaxId;
                record.Tax            = model.Tax;
                record.DiscountType   = model.DiscountType;
                record.Discount       = model.Discount;
                record.Description    = model.Description;
                record.IsFinish       = 1;
                record.UpdatedStaffId = model.UpdatedStaffId;
                record.UpdatedDate    = DateTime.Now;

                if (record.DiscountType == (int)EDiscountType.Percent)
                {
                    record.FinalPrice = record.Price + record.Tax - ((record.Price * record.Discount) / 100);
                }
                else if (record.DiscountType == (int)EDiscountType.Money)
                {
                    record.FinalPrice = record.Price + record.Tax - record.Discount;
                }

                //modified checkout model
                //if ReceivedAmount = 0, it mean no adding record to Checkout table
                if (checkout.ReceivedAmount > 0)
                {
                    checkout.RestaurantId   = record.RestaurantId;
                    checkout.BranchId       = record.BranchId;
                    checkout.PlacedOrderId  = record.Id;
                    checkout.Amount         = record.FinalPrice;
                    checkout.CreatedStaffId = record.UpdatedStaffId;
                    checkout.CreatedDate    = DateTime.Now;

                    _checkoutRepository.Add(checkout);
                }

                //Add new process status
                var processStatus = new PlacedOrderProcessStatus()
                {
                    RestaurantId   = record.RestaurantId,
                    BranchId       = record.BranchId,
                    PlacedOrderId  = record.Id,
                    OrderProcessId = (int)EOrderProcess.PaidOrder,
                    Status         = 1,
                    CreatedStaffId = record.UpdatedStaffId,
                    CreatedDate    = DateTime.Now
                };
                _placedOrderProcessStatusRepository.Add(processStatus);

                await _unitOfWork.SaveChangesAsync();

                result = true;
            }
            return(result);
        }
示例#9
0
        public async Task <PlacedOrderDto> Post(PlacedOrder model)
        {
            PlacedOrderDto result = null;

            //if current user is Restaurant Admin, don't let them create order
            // because when update price will be wrong
            if (_authenticationDto.TypeId == (int)EAccountType.Admin || _authenticationDto.TypeId == (int)EAccountType.Mod ||
                _authenticationDto.TypeId == (int)EAccountType.RestaurantAdmin)
            {
                return(result);
            }

            if (ModelState.IsValid)
            {
                if (model.Tax == null)
                {
                    model.Tax = 0;
                }
                if (model.DiscountType == null)
                {
                    model.DiscountType = (int)EDiscountType.Money;
                }
                if (model.Discount == null)
                {
                    model.Discount = 0;
                }
                model.RestaurantId   = _authenticationDto.RestaurantId;
                model.BranchId       = _authenticationDto.BranchId;
                model.OutputTypeId   = (int)EOutputType.Order;
                model.OrderTime      = DateTime.Now;
                model.CreatedDate    = DateTime.Now;
                model.CreatedStaffId = _authenticationDto.UserId;
                model.Status         = 1;
                var modelInsert = await _placedOrderBusiness.Add(model);

                result = modelInsert;

                // add order process as a record
                // Waiting Order Status
                if (result != null)
                {
                    var processStatus = new PlacedOrderProcessStatus()
                    {
                        RestaurantId   = modelInsert.RestaurantId,
                        BranchId       = modelInsert.BranchId,
                        PlacedOrderId  = modelInsert.Id,
                        OrderProcessId = (int)EOrderProcess.WaitingOrder,
                        Status         = 1,
                        CreatedStaffId = _authenticationDto.UserId,
                        CreatedDate    = DateTime.Now
                    };
                    var lastProcessStatus = await _placedOrderProcessStatusBusiness.Add(processStatus);
                }
            }
            return(result);
        }
示例#10
0
        public Boolean PlaceOrder(PlacedOrderModel model)
        {
            var orders = new List <PlacedOrder>();
            var modelK = _kartDA.GetCustomerKart(model.Customer_ID);

            var orderNumber = _placeOrderDA.GetOrderNumber();     //Creating Order number

            if (orderNumber == 0)
            {
                orderNumber = 999;
            }
            orderNumber += 1;

            var    modelA  = _addressDA.GetAddress(model.Address_ID);  //Creating Address
            string address = "Address Line : " + modelA.AddressLine + " City : " + modelA.City + " State : " + modelA.State +
                             " Postal Code : " + modelA.PostalCode + " Address Type : " + modelA.AddressType;

            foreach (var k in modelK)
            {
                if (k.Quantity == 0)
                {
                    continue;
                }

                //common start
                var order = new PlacedOrder();
                order.Customer_ID = model.Customer_ID;
                order.PaymentType = model.PaymentType;

                order.Address  = address;
                order.DateTime = DateTime.Now;
                order.Status   = "Order Placed";

                order.OrderNumber = orderNumber;
                //common finish


                var product = _productDA.GetProduct(k.Product_ID);
                order.Quantity = k.Quantity;
                var ActualPrice = product.ProductPrice - (product.ProductPrice * product.ProductDiscount) / 100;

                order.Amount     = k.Quantity * ActualPrice;
                order.Product_ID = k.Product_ID;
                product.ProductQuantityInKart -= k.Quantity;            //releasing product IN kart value
                product.ProductQuantity       -= k.Quantity;            //Normelizing Quantity
                _kartDA.RemoveKartItem(k.ID, product);                  //remove from kart and updating product IN Kart value
                orders.Add(order);
            }
            if (_placeOrderDA.PlaceOrder(orders))
            {
                return(true);
            }
            return(false);
        }
示例#11
0
        public IActionResult Post(int orderId, [FromBody] PlacedOrder placedOrder)
        {
            var newOrder = this.placedOrderService.createOrder(orderId, placedOrder);

            if (!newOrder)
            {
                return(BadRequest());
            }

            return(Ok());
        }
示例#12
0
        public async Task <bool> Put(PlacedOrder model)
        {
            var result = false;

            if (ModelState.IsValid)
            {
                model.UpdatedStaffId = _authenticationDto.UserId;
                result = await _placedOrderBusiness.Update(model);
            }
            return(result);
        }
        public void UpdateInventory(PlacedOrder placedOrder, Dictionary <int, int> ingredientSums)
        {
            var inventoryItemsFromDb = _repo.InventoryItem.GetInventoryItemsByIngredientList(ingredientSums.Keys.ToList()).ToList();

            foreach (var inventoryItem in inventoryItemsFromDb)
            {
                var amountNeeded = ingredientSums[inventoryItem.IngredientId];
                inventoryItem.BulkPrice     -= CalculateCost(amountNeeded, inventoryItem.Ingredient.BaseUnitOfWeight, inventoryItem.Ingredient.PricePerUnit);
                inventoryItem.AmountInGrams -= amountNeeded;
                inventoryItem.IsLow          = InventoryItemIsLow(inventoryItem);
            }
            _repo.InventoryItem.UpdateRangeOfInventoryItems(inventoryItemsFromDb);
            _repo.Save();
        }
        public async Task <bool> UpdateOrderProcess(PlacedOrder model)
        {
            var result = false;
            var record = await _placedOrderRepository.Repo.FirstOrDefaultAsync(c => c.Id == model.Id);

            if (record != null)
            {
                record.OrderProcessId = model.OrderProcessId;

                await _placedOrderRepository.SaveChangeAsync();

                result = true;
            }
            return(result);
        }
        public async Task OnNoValidCertificateAvailable_ShouldRenewCertificate()
        {
            // arrange

            PersistenceService.GetPersistedSiteCertificateAsync().Returns(Task.FromResult(InvalidCert));

            var dtos = new [] { new ChallengeDto {
                                    Domains = new[] { "test.com" }, Token = "ping", Response = "pong"
                                } };
            var placedOrder = new PlacedOrder(dtos, Substitute.For <IOrderContext>(), Array.Empty <IChallengeContext>());

            LetsEncryptClient.PlaceOrder(SeqEq(new[] { "test.com" })).Returns(Task.FromResult(placedOrder));
            PersistenceService.PersistChallengesAsync(dtos).Returns(Task.CompletedTask);
            PersistenceService.DeleteChallengesAsync(dtos).Returns(Task.CompletedTask);

            var newCertBytes = SelfSignedCertificate.Make(DateTime.Now, DateTime.Now.AddDays(90)).RawData;

            LetsEncryptClient.FinalizeOrder(placedOrder).Returns(Task.FromResult(new PfxCertificate(newCertBytes)));

            var newCertificate = new LetsEncryptX509Certificate(newCertBytes) as IPersistableCertificate;

            PersistenceService.PersistSiteCertificateAsync(newCertificate).Returns(Task.CompletedTask);

            // act

            var output = await Sut.RenewCertificateIfNeeded(current : null);

            // assert

            output.Status.Should().Be(Renewed);
            ((LetsEncryptX509Certificate)output.Certificate).RawData.Should().BeEquivalentTo(newCertBytes);

            CertificateValidator.Received(1).IsCertificateValid(null);
            await PersistenceService.Received(1).GetPersistedSiteCertificateAsync();

            CertificateValidator.Received(1).IsCertificateValid(InvalidCert);
            await LetsEncryptClient.Received(1).PlaceOrder(SeqEq(new[] { "test.com" }));

            await PersistenceService.Received(1).PersistChallengesAsync(dtos);

            await PersistenceService.Received(1).DeleteChallengesAsync(dtos);

            await PersistenceService.Received(1).PersistChallengesAsync(dtos);

            await LetsEncryptClient.Received(1).FinalizeOrder(placedOrder);

            await LetsEncryptClientFactory.Received(1).GetClient();
        }
        private async Task <bool> UpdateOrderProcess(PlacedOrder model)
        {
            var result = false;
            var record = await _placedOrderRepository.Repo
                         .ToFilterByRole(f => f.RestaurantId,
                                         f => f.BranchId, model.RestaurantId, model.BranchId)
                         .FirstOrDefaultAsync(c => c.Id == model.Id);

            if (record != null)
            {
                record.OrderProcessId = model.OrderProcessId;

                await _placedOrderRepository.SaveChangeAsync();

                result = true;
            }
            return(result);
        }
        public (bool, int?, Dictionary <int, int>) InventoryCanMakeOrder(PlacedOrder placedOrder, IEnumerable <MenuItem> menuItems)
        {
            // (can we make it?, ingredientId we're out of, ingredientSums dictionary)
            (bool, int?, Dictionary <int, int>)canMake = (true, null, new Dictionary <int, int>());
            var groupedMenuItems = placedOrder.OrderedItems.GroupBy(x => x.MenuItemId).ToList();

            //Key is ingredientId
            //Value is total amount needed of that ingredient to make the order
            var ingredientSums = menuItems.SelectMany(x => x.Recipe, (x, ingredient) => ingredient.IngredientId).Distinct().ToDictionary(x => x, x => 0);
            var ingredientSumsFromInventory = new Dictionary <int, int>(ingredientSums);

            canMake.Item3 = ingredientSums;
            //build up amount of ingredients in inventory
            ingredientSumsFromInventory.Keys.ToList().ForEach(key => ingredientSumsFromInventory[key] = _repo.InventoryItem.GetSumForIngredient(key));

            // Big-O scary
            foreach (var items in groupedMenuItems)
            {
                foreach (var item in items)
                {
                    var menuItem = menuItems.Single(x => x.MenuItemId == item.MenuItemId);
                    foreach (var ingredient in menuItem.Recipe)
                    {
                        ingredientSums[ingredient.IngredientId] += ingredient.Quantity * item.Quantity;
                    }
                    ;
                }
            }


            foreach (var key in ingredientSums.Keys)
            {
                if (ingredientSums[key] > ingredientSumsFromInventory[key])
                {
                    canMake.Item1 = false;
                    canMake.Item2 = key;
                    break;
                }
            }

            return(canMake);
        }
        public async Task <bool> Update(PlacedOrder model)
        {
            var result = false;
            var record = await _placedOrderRepository.Repo.FirstOrDefaultAsync(c => c.Id == model.Id);

            if (record != null)
            {
                record.OrderTypeId     = model.OrderTypeId;
                record.CustomerId      = model.CustomerId;
                record.OrderChannelId  = model.OrderChannelId;
                record.TableId         = model.TableId;
                record.PeopleNum       = model.PeopleNum;
                record.CustomerName    = model.CustomerName;
                record.CustomerPhone   = model.CustomerPhone;
                record.OrderTime       = model.OrderTime;
                record.DeliveryTime    = model.DeliveryTime;
                record.DeliveryAddress = model.DeliveryAddress;
                record.Tax             = model.Tax;
                record.DiscountType    = model.DiscountType;
                record.Discount        = model.Discount;
                record.Description     = model.Description;
                record.UpdatedStaffId  = model.UpdatedStaffId;
                record.UpdatedDate     = DateTime.Now;

                if (record.DiscountType == (int)EDiscountType.Percent)
                {
                    record.FinalPrice = record.Price + record.Tax - ((record.Price * record.Discount) / 100);
                }
                else if (record.DiscountType == (int)EDiscountType.Money)
                {
                    record.FinalPrice = record.Price + record.Tax - record.Discount;
                }

                await _placedOrderRepository.SaveChangeAsync();

                result = true;
            }
            return(result);
        }
示例#19
0
        public void RegisterNewOrder(List <ItemGroup> OrderGroup, Guid givenCostumerID)
        {
            Dictionary <Guid, int> dict = new Dictionary <Guid, int>();

            foreach (var item in OrderGroup)
            {
                if (dict.ContainsKey(item.ItemID))
                {
                    var dictResult = dict.Single(itemInDict => itemInDict.Key == item.ItemID);
                    dict.Remove(dictResult.Key);
                    dict.Add(dictResult.Key, dictResult.Value + item.ItemAmount);
                }
                else
                {
                    dict.Add(item.ItemID, item.ItemAmount);
                }
            }


            var DictionaryWithItemObject = GetDictionaryWithItemObject(dict);

            CheckCostumerID(givenCostumerID);

            PlacedOrder newOrder = new PlacedOrder(DictionaryWithItemObject, givenCostumerID);

            PlacedOrderDatabase.OrderDB.Add(newOrder);

            foreach (var item in DictionaryWithItemObject)
            {
                if (item.Key.Amount < item.Value)
                {
                    item.Key.Amount = 0;
                }
                else
                {
                    item.Key.Amount -= item.Value;
                }
            }
        }
        public async Task <PlacedOrderDto> Add(PlacedOrder model)
        {
            DateTime startDateTime = DateTime.Today;                         //Today at 00:00:00
            DateTime endDateTime   = DateTime.Today.AddDays(1).AddTicks(-1); //Today at 23:59:59
            string   dateStr       = DateTime.Today.ToString("MMddyyyy");
            string   resStr        = $"{(model.RestaurantId):D4}";
            string   braStr        = $"{(model.BranchId):D4}";

            model.Code = string.Empty;

            var totalOrderToday = await _placedOrderRepository.Repo.Where(
                c => c.CreatedDate >= startDateTime && c.CreatedDate <= endDateTime).CountAsync();

            var entity = _placedOrderRepository.Add(model);
            await _unitOfWork.SaveChangesAsync();

            entity.Code = $"OD-{dateStr}{resStr}{braStr}{(totalOrderToday + 1):D5}";
            await _unitOfWork.SaveChangesAsync();

            model.Id   = entity.Id;
            model.Code = entity.Code;

            return(_mapper.Map <PlacedOrderDto>(model));
        }
 public MarketOrderResponse([JsonProperty("payload")] PlacedOrder marketOrder)
 {
     Order = marketOrder;
 }
        public ActionResult Checkout(string FullName, string PhoneNo, string ShippingAddress, int PaymentMethod)
        {
            // validate current sub domain
            domainIndentifier = new DomainIdentifier(Request.Url.Host, Request.ServerVariables["SERVER_NAME"]);
            User User = domainIndentifier.GetUserRelatedDomain();

            UserID                   = User != null ? User.Id : 0;
            ViewBag.UserID           = UserID;
            Session["CurrentUserID"] = UserID;
            // end of validation

            //// check user is login or not
            if (string.IsNullOrEmpty(Convert.ToString(Session["WebloggedUserID"])))
            {
                return(RedirectToAction("Login"));
            }

            long ShopUserID = Convert.ToInt64(Session["WebloggedUserID"]);

            using (var Trac = db.Database.BeginTransaction())
            {
                try
                {
                    var cart = (List <CartModel>)Session["cart"];
                    if (cart == null)
                    {
                        return(RedirectToAction("Cart"));
                    }

                    double?        TotalPrice    = 0;
                    List <Product> ProductDetail = new List <Product>();
                    foreach (var item in cart)
                    {
                        var CurrentProductDetail = db.Products.FirstOrDefault(x => x.Id == item.ProductID);
                        ProductDetail.Add(CurrentProductDetail);
                        TotalPrice += CurrentProductDetail.Price * item.Quantity;
                    }

                    PlacedOrder PlacedOrder = new PlacedOrder()
                    {
                        ReceivedPersonName   = FullName,
                        ReceivedPhoneNumber  = PhoneNo,
                        ShippingAddress      = ShippingAddress,
                        TotalPrice           = TotalPrice,
                        ShopUserID           = ShopUserID,
                        OrderStatus          = (int)OrderStatus.Pending,
                        OrderCreatedDateTime = DateTime.UtcNow,
                        PaymentMethod        = (int)ShopPaymentMethod.CashOnDelivery
                    };

                    db.PlacedOrders.Add(PlacedOrder);
                    int IsPlacedOrderSaved = db.SaveChanges();      // Insert Record

                    List <Order> OrderList = new List <Order>();
                    foreach (var item in cart)
                    {
                        var ProductInfo = ProductDetail.FirstOrDefault(x => x.Id == item.ProductID);
                        if (ProductInfo != null)
                        {
                            OrderList.Add(new Order()
                            {
                                TotalPrice     = ProductInfo.Price * item.Quantity,
                                Quantity       = item.Quantity,
                                Discount       = 0,
                                Price          = ProductInfo.Price,
                                Tax            = 0,
                                ProductID      = ProductInfo.Id,
                                PlacedOrdersId = PlacedOrder.Id,
                            });
                        }
                    }
                    db.Orders.AddRange(OrderList);
                    int IsOrderSaved = db.SaveChanges();        // Insert Record
                    if (IsOrderSaved > 0 && IsPlacedOrderSaved > 0)
                    {
                        Trac.Commit();
                        TempData["CheckOutMsg"] = "<p class='text-success text-center'>Order has been Placed Succesfully!</p><b /><div class='text-center'><a href='/UserPanel/Orders/Detail'>Orders List</a></div>";
                        Session["cart"]         = null;
                        return(View());
                    }
                    TempData["CheckOutMsg"] = "<p class='text-danger text-center'>There is an error. Please try agian if you face issue again. Please Contact to Support!</p>";
                }
                catch (Exception er)
                {
                    Trac.Rollback();
                    TempData["CheckOutMsg"] = "<p class='text-danger text-center'>There is an error. Please try agian if you face issue again. Please Contact to Support!</p>";
                }
            }
            return(View());
        }
 public LimitOrderResponse([JsonProperty("payload")] PlacedOrder order)
 {
     Order = order;
 }