static void Main(string[] args)
        {
            List <FileInfo> csvfiles = EventCSV.FindCSVs(4);

            if (csvfiles == null)
            {
                Interface.WriteLine("No csv files found at a depth of 3 from .exe");
                Interface.Wait();
                return;
            }

            Interface.WriteLine("Found " + csvfiles.Count + " csv file" + (csvfiles.Count > 1 ? "s" : "") + ":", ConsoleColor.Green);
            foreach (FileInfo fi in csvfiles)
            {
                Interface.WriteLine("  - " + fi.FullName);
            }

            Tuple <string, string> credentials = GetCredentials();
            List <string>          graphs      = GetGraphIDs(credentials.Item1, credentials.Item2);

            foreach (FileInfo logfile in csvfiles)
            {
                Interface.WriteLine("Running over " + logfile.FullName, ConsoleColor.Yellow);
                EventCSV log = EventCSV.ExtractEventsFromCSV(logfile, "ID", "Event", "Title", "Date");
                foreach (string graphID in graphs)
                {
                    Interface.WriteLine("Executing on graph " + graphID, ConsoleColor.Yellow);
                    DCRGraph graph = DCRGraph.GetGraphFromServer(credentials.Item1, credentials.Item2, graphID);
                    graph.LogProgress += WriteProgress;
                    DCRGraph.ExecuteResult results = graph.ExecuteTracesInCSV(log, 5);
                    graph.LogProgress -= WriteProgress;
                    graph.WriteResult(results, logfile);
                    graph.Recover(true);
                }
                log.Events = log.Events.OrderBy(e => e.TraceID).ThenBy(e => e.Date).ToList();
                Diagnostics.Log("Writing a sorted csv back to same folder the log was found");
                log.WriteToCSV(new FileInfo(logfile.FullName.Substring(0, logfile.FullName.Length - 4) + ".scsv"));
            }
            Interface.WriteLine("Done!");
            Interface.Wait();
        }
Exemple #2
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));
                }

                //}
            }
        }