/// <summary>
 /// Save order on web api.
 /// </summary>
 /// <param name="newOrder">New Order to be saved.</param>
 /// <returns>Tuple of bool and string, bool == true when API succeded, bool == false when API did not succeed, string == fail message.</returns>
 public Tuple<bool,string> PostOrderAsync(NewOrderInfo newOrder)
 {
     using (var client = new HttpClient())
     {
         try
         {
             client.BaseAddress = _baseAddress;
             var response = client.PostAsXmlAsync("api/order/create", newOrder, new CancellationToken()).Result;
             if (response.IsSuccessStatusCode)
             {
                 var answer = new Tuple<bool, string>(true, response.StatusCode.ToString());
                 return answer;
             }
             else //do failure thing
             {
                 var answer = new Tuple<bool, string>(false, "Could not save the created order: Error from Web api: " + response.StatusCode.ToString() + ": " + response.ReasonPhrase);
                 return answer;
             }
         }
         catch (Exception ex)
         {
             throw;
         }
     }
 }
 /// <summary>
 /// Call to save order
 /// </summary>
 /// <returns>Tuple of bool and string. bool == true if success, bool == false if it fails. String == message to show in UI if fail.</returns>
 internal Tuple<bool, string> SaveOrder()
 {
     NewOrderInfo createdOrder = new NewOrderInfo()
     {
         ItemsAndQuantity = OrderBeingCreated.ItemsAndQuantity,
         OrderType = OrderBeingCreated.OrderType,
         Customer = OrderBeingCreated.Customer,
         OrderDate = OrderBeingCreated.OrderDate,
         Notes = OrderBeingCreated.Notes,
         Table = OrderBeingCreated.Table,
         Restaurant = RestaurantLoginContainer.Instance.RestaurantId
     };
     return _APICaller.PostOrderAsync(createdOrder);
 }
Example #3
0
        /// <summary>
        /// Method to create new orders in the database.
        /// It will create a new order with the information it receives and with the DCRGraph which is currently in the xml file which the API reads from.
        /// </summary>
        /// <param name="container"></param>
        /// <param name="orderInfo"></param>
        /// <returns></returns>
        public async Task<Tuple<string, HttpStatusCode>> CreateOrder(EventAndRolesContainer container, NewOrderInfo orderInfo)
        {
            using (var db = new WebAPI.Models.DBObjects.Database())
            {
                try
                {
                    //setup a new dcrgraph
                    var graph = new DCRGraph
                    {
                        AcceptingState = false,
                        Lock = false,
                        LockTime = DateTime.Now,
                        DCREvents = container.Events,
                    };

                    //setup a new order
                    var order = new Order()
                    {
                        DCRGraph = graph,
                        OrderDate = orderInfo.OrderDate,
                        Notes = orderInfo.Notes,
                        Table = orderInfo.Table,
                        OrderDetails = new List<OrderDetail>(),
                        OrderType = orderInfo.OrderType,
                        RestaurantId = orderInfo.Restaurant
                    };

                    //put items on the order. Can only put items that exists in the database on.
                    foreach (var iq in orderInfo.ItemsAndQuantity)
                    {

                        var item =
                            db.Items
                                .FirstOrDefaultAsync(i => i.Name == iq.Key.Name).Result;
                      
                        if (!iq.Key.Name.ToLower().Equals(item.Name.ToLower()))
                        {
                            throw new Exception("Item '" + iq.Key.Name + "' did not exist in the database");
                        }

                        order.OrderDetails.Add(
                            new OrderDetail()
                            {
                                ItemId = item.Id,
                                Item = item,
                                Order = order,
                                Quantity = iq.Value
                            });
                    }



                    //Determine if there should be a customer on the order. We do not want cutstomers with the phone number 0.
                    if(orderInfo.Customer.Phone != 0)
                    {
                        //see if we already have customer with the same phone number, otherwise create a new one.
                        var customer =
                            await db.Customers
                                .FirstOrDefaultAsync(c => c.Phone == orderInfo.Customer.Phone) ?? new Customer
                                {
                                    City = orderInfo.Customer.City ?? "n/a",
                                    Email = orderInfo.Customer.Email ?? "n/a",
                                    FirstName = orderInfo.Customer.FirstAndMiddleNames ?? "n/a",
                                    LastName = orderInfo.Customer.LastName ?? "n/a",
                                    Phone = orderInfo.Customer.Phone,
                                    StreetAndNumber = orderInfo.Customer.StreetAndNumber ?? "n/a",
                                    Zipcode = orderInfo.Customer.ZipCode,
                                    Orders = new HashSet<Order> {order}
                                };

                        order.Customer = customer;
                    }
                    
                    db.Orders.Add(order);
                    db.SaveChanges();


                    //put groups on events
                    foreach (var i in container.EventGroups)
                    {


                        var group = db.Groups.FirstOrDefaultAsync(x => x.Name.Equals(i.GroupName)).Result;
                        container.Events.Find(x => x.EventId.Equals(i.EventId)).Groups.Add(group);


                    }


                    //put roles on events
                    foreach (var i in container.EventRoles)
                    {

                        var role = db.Roles.FirstOrDefaultAsync(x => x.Name.Equals(i.RoleName)).Result;
                        container.Events.Find(x => x.EventId.Equals(i.EventId)).Roles.Add(role);


                    }


                    //put inclusions on events
                    foreach (var i in container.Inclusions)
                    {
                        var fromEvent = container.Events.Find(x => x.EventId.Equals(i.fromNodeId));
                        var toEvent = container.Events.Find(x => x.EventId.Equals(i.toNodeId));
                        container.Events.Find(e => e.Id == fromEvent.Id).Includes.Add(toEvent);
                        //InsertBySqlQuery(fromEvent.Id, toEvent.Id, "Includes");

                    }

                    //put exclusions on events
                    foreach (var i in container.Exclusions)
                    {
                        var fromEvent = container.Events.Find(x => x.EventId.Equals(i.fromNodeId));
                        var toEvent = container.Events.Find(x => x.EventId.Equals(i.toNodeId));
                        container.Events.Find(e => e.Id == fromEvent.Id).Excludes.Add(toEvent);
                        //InsertBySqlQuery(fromEvent.Id, toEvent.Id, "Excludes");


                    }

                    //put responses on events
                    foreach (var i in container.Responses)
                    {
                        var fromEvent = container.Events.Find(x => x.EventId.Equals(i.fromNodeId));
                        var toEvent = container.Events.Find(x => x.EventId.Equals(i.toNodeId));
                        container.Events.Find(e => e.Id == fromEvent.Id).Responses.Add(toEvent);
                        //InsertBySqlQuery(fromEvent.Id, toEvent.Id, "Milestones");
                    }

                    //put conditions on events
                    foreach (var i in container.Conditions)
                    {
                        var fromEvent = container.Events.Find(x => x.EventId.Equals(i.fromNodeId));
                        var toEvent = container.Events.Find(x => x.EventId.Equals(i.toNodeId));
                        container.Events.Find(e => e.Id == fromEvent.Id).Conditions.Add(toEvent);
                        //InsertBySqlQuery(fromEvent.Id, toEvent.Id, "Conditions");
                    }




                    //put milestones on events
                    foreach (var i in container.Milestones)
                    {
                        var fromEvent = container.Events.Find(x => x.EventId.Equals(i.fromNodeId));
                        var toEvent = container.Events.Find(x => x.EventId.Equals(i.toNodeId));
                        container.Events.Find(e => e.Id == fromEvent.Id).Milestones.Add(toEvent);
                        //InsertBySqlQuery(fromEvent.Id, toEvent.Id, "Milestones");


                    }



                    foreach (var e in container.Events)
                    {
                        db.Entry(e).State = EntityState.Modified;
                    }
                    await db.SaveChangesAsync();

                    //needs statuscode exception handling
                    DCREvent dcrEvent;
                    switch (orderInfo.OrderType)
                    {
                        case "For serving":
                            dcrEvent = order.DCRGraph.DCREvents.FirstOrDefault(e => e.Label == "Setup graph serving");
                            if (dcrEvent != null)
                            {
                                await new DbInteractions().ExecuteEvent(dcrEvent.Id, false);
                                break;
                            }
                            return new Tuple<string, HttpStatusCode>("The DCRGraph does not contain the relvant setup event",
                            HttpStatusCode.InternalServerError);
                        case "For takeaway":
                            dcrEvent = order.DCRGraph.DCREvents.FirstOrDefault(e => e.Label == "Setup graph takeaway");
                            if (dcrEvent != null)
                            {
                                await new DbInteractions().ExecuteEvent(dcrEvent.Id, false);
                                break;
                            }

                            return new Tuple<string, HttpStatusCode>("The DCRGraph does not contain the relvant setup event",
                            HttpStatusCode.InternalServerError);
                        case "For delivery":
                            dcrEvent = order.DCRGraph.DCREvents.FirstOrDefault(e => e.Label.Contains("Setup graph delivery"));
                            if (dcrEvent != null)
                            {
                                await new DbInteractions().ExecuteEvent(dcrEvent.Id, false);
                                break;
                            }
                            return new Tuple<string, HttpStatusCode>("The DCRGraph does not contain the relvant setup event",
                            HttpStatusCode.InternalServerError);

                        case "Bulk order":
                            dcrEvent = order.DCRGraph.DCREvents.FirstOrDefault(e => e.Label.Contains("Setup bulk order"));
                            if (dcrEvent != null)
                            {
                                await new DbInteractions().ExecuteEvent(dcrEvent.Id, false);
                                break;
                            }
                            return new Tuple<string, HttpStatusCode>("The DCRGraph does not contain the relvant setup event",
                            HttpStatusCode.InternalServerError);

                        default:
                            return new Tuple<string, HttpStatusCode>("ordertype id not match - " + orderInfo.OrderType,
                                HttpStatusCode.InternalServerError);
                    }




                    //scope.Complete();
                    return new Tuple<string, HttpStatusCode>("success", HttpStatusCode.OK);

                }
                catch (Exception ex)
                {


                    return new Tuple<string, HttpStatusCode>(ex.Message, HttpStatusCode.InternalServerError);
                }

                //}

            }


        }