static void Main() { Log.Logger = new LoggerConfiguration() .WriteTo.File(logPath) .CreateLogger(); Log.Information("Program started"); try { // Call the Orders API to get orders that are in 'Awaiting Fulfillment' status JArray ordersAwaitingFulfillment = BigCommerceController.GetOrdersAwaitingFulfillment(); if (ordersAwaitingFulfillment.Count() == 0) { Log.Information("No orders to import"); return; } ImportOrdersToNetSuite(ordersAwaitingFulfillment); if (ordersMissingProId.Count > 0) { AlertB2BTeam(); } } catch (Exception ex) { Log.Error($"Error: {ex}"); string title = "Error in NestProOrderImporter"; string text = $"Error message: {ex.Message}"; string color = "red"; TeamsHelper teamsMessage = new TeamsHelper(title, text, color, errorLogsUrl); teamsMessage.LogToMicrosoftTeams(teamsMessage); } }
public static string GetNestProId() { RestClient client = new RestClient($@"https://api.bigcommerce.com/stores/v68kp5ifsa/v2/customers/{customerId}"); RestRequest request = BigCommerceHelper.CreateNewGetRequest(); IRestResponse customerApiResponse = client.Execute(request); BigCommerceCustomer parsedCustomer = JsonConvert.DeserializeObject <BigCommerceCustomer>(customerApiResponse.Content); string nestProId = ""; if (parsedCustomer.form_fields == null) { string errorMessage = $"No Nest Pro Id found for Big Commerce customer {customerId}"; string title = "Error in ImportOrdersToNetSuite"; string color = "red"; TeamsHelper teamsMessage = new TeamsHelper(title, errorMessage, color, Program.errorLogsUrl); teamsMessage.LogToMicrosoftTeams(teamsMessage); } else { foreach (var formField in parsedCustomer.form_fields) { if (formField.name.ToLower().Contains("nest pro id")) { nestProId = formField.value; } } } return(nestProId); }
private static void ImportOrdersToNetSuite(JArray ordersAwaitingFulfillment) { try { foreach (var order in ordersAwaitingFulfillment) { Order parsedOrder = JsonConvert.DeserializeObject <Order>(order.ToString()); if (parsedOrder.is_deleted == true) { Log.Information($"Skipping order {parsedOrder.customer_id} because it is marked as deleted/archived."); continue; } BigCommerceController.customerId = parsedOrder.customer_id; int bigCommerceOrderId = parsedOrder.id; Log.Information($"bigCommerceOrderId Id {bigCommerceOrderId}"); // Get the shipping information string shippingAddressUrl = parsedOrder.shipping_addresses.url; ShippingAddress customerShippingAddress = BigCommerceController.GetCustomerShippingAddress(shippingAddressUrl); // Format the request object to send to CreateCustomerRESTlet OrderToImport netsuiteRequest = NetSuiteController.CreateNetSuiteRequest(parsedOrder, customerShippingAddress); if (netsuiteRequest.NestProId == "") { // We alert these to B2B so they can contact the customer ordersMissingProId.Add(bigCommerceOrderId); continue; } netsuiteCustomerId = NetSuiteController.GetNetSuiteCustomerId(netsuiteRequest); netsuiteRequest.CustomerId = Convert.ToInt32(netsuiteCustomerId); // Call the Products API to get the products on the order string productsUrl = parsedOrder.products.url; netsuiteRequest.Items = BigCommerceController.GetProductsOnOrder(productsUrl); NetSuiteController.SetNetSuiteItemIdAndPersonalItemFlag(netsuiteRequest); // Import order to Netsuite string netsuiteOrderId = NetSuiteController.ImportOrderToNetSuite(netsuiteRequest); // Set the Big Commerce status to 'awaiting shipment' and add the NetSuite order ID to 'staff notes' BigCommerceController.SetOrderStatus(bigCommerceOrderId, netsuiteOrderId); } } catch (Exception ex) { Log.Error($"Error: {ex}"); string title = "Error in ImportOrdersToNetSuite"; string text = $"Error message: {ex.Message}"; string color = "red"; TeamsHelper teamsMessage = new TeamsHelper(title, text, color, errorLogsUrl); teamsMessage.LogToMicrosoftTeams(teamsMessage); } }
void UpdateSpells(double dt) { var toRemove = new List <LinearSpell>(); ActiveSpells.ForEach(s => { Vec2 before = (Vec2)s.Position.Clone(); Match.CurrentState.ApplyPhysicsUpdate(s.ID, (float)dt); Vec2 pass = (s.Position - before) / PhysicsEngine.PHYSICS_PASSES; s.Position = before; for (int i = 0; i < PhysicsEngine.PHYSICS_PASSES; ++i) { // Check for entities collisions var rect = s.CreateCollisionRectangle(); var enemyTeam = TeamsHelper.Opposite(s.Team); // Check to hit players bool remove = CheckForSpellPlayerCollisions(s, rect, enemyTeam); // Check to hit structures if (!remove) { remove = CheckForSpellStructuresCollisions(s, rect, enemyTeam == Teams.Left ? Match.LeftStructures : Match.RightStructures); } // Check to remove spells if (!remove && // don't check if we know it already has to be removed Match.CurrentState.SpellShouldDisappear(s)) { remove = true; } // The spell has to be removed if (remove) { toRemove.Add(s); break; } s.Position += pass; } }); toRemove.ForEach(s => { ActiveSpells.Remove(s); RemarkableEvents.Add(Utilities.MakePair <ServerCommand, Action <NetBuffer> >( ServerCommand.SpellDisappear, (msg) => { ulong id = s.ID; msg.Write(id); })); }); }
private static void AlertB2BTeam() { var ordersMissingProIdJSON = JsonConvert.SerializeObject(ordersMissingProId); var warningMessage = $"The following orders cannot import because the customer is missing a Nest Pro ID: {ordersMissingProIdJSON}"; Log.Warning(warningMessage); string title = "Error Importing Nest Pro Orders"; string text = warningMessage; string color = "red"; TeamsHelper teamsMessage = new TeamsHelper(title, text, color, nestTeamUrl); teamsMessage.LogToMicrosoftTeams(teamsMessage); }
public TeamsUserControl() { InitializeComponent(); using (var db = new PodaciContext()) { Teams.Teams = new ObservableCollection <TeamsHelper>(); foreach (var team in db.Teams .Include(x => x.CleanerTeams) .ThenInclude(x => x.Cleaner)) { var th = new TeamsHelper { Team = team, Name = team.Name, Color = team.Color }; if (team.CleanerTeams?.Count > 0) { th.CleanerId = team.CleanerTeams[0].CleanerId; } if (team.CleanerTeams?.Count > 1) { th.Cleaner2Id = team.CleanerTeams[1].CleanerId; } if (team.CleanerTeams?.Count > 2) { th.Cleaner3Id = team.CleanerTeams[2].CleanerId; } if (team.CleanerTeams?.Count > 3) { th.Cleaner4Id = team.CleanerTeams[3].CleanerId; } if (team.CleanerTeams?.Count > 4) { th.Cleaner5Id = team.CleanerTeams[4].CleanerId; } if (team.CleanerTeams?.Count > 5) { th.Cleaner6Id = team.CleanerTeams[5].CleanerId; } Teams.Teams.Add(th); } dataGrid.ItemsSource = Teams.Teams; } }
static void Main() { Log.Logger = new LoggerConfiguration() .WriteTo.File(logPath) .CreateLogger(); Log.Information("Program started"); try { // Pull orders in 'Awaiting Shipment' and 'Partially Shipped' status JArray ordersAwaitingShipment = BigCommerceController.GetOrdersByStatus(awaitingShipmentStatusId); JArray partiallyShippedOrders = BigCommerceController.GetOrdersByStatus(partiallyShippedStatusId); // Merge the two JArray's JArray allOrdersAwaitingShipments = MergeJArrays(ordersAwaitingShipment, partiallyShippedOrders); // Create shipments in Big Commerce if any new item fulfillments are found in NetSuite if (allOrdersAwaitingShipments.Count() == 0) { Log.Information("No shipments to import"); return; } ImportShipmentsToBigCommerce(allOrdersAwaitingShipments); return; } catch (Exception ex) { Log.Error("Error: {@ex}", ex); string title = "Error in NestProShipments"; string text = $"Error message: {ex.Message}"; string color = "red"; TeamsHelper teamsMessage = new TeamsHelper(title, text, color, teamsUrl); teamsMessage.LogToMicrosoftTeams(teamsMessage); } }
public async Task SignUpAsync_ValidTeam_SignsUp() { //Arrange var sut = CreateSut(); var newTeam = new Team() { CreatedAt = DateTime.Now, Name = "Sign Up Test Team", Participants = new List <Participant> { new Participant { Forename = "John", Surname = "Doe", Email = "*****@*****.**", CreatedAt = DateTime.Now, Token = new Token { Value = "342345hjk34hgtkj34h5kjh345", CreatedAt = DateTime.Now, IsValid = true, } }, new Participant { Forename = "Mary", Surname = "Doe", Email = "*****@*****.**", CreatedAt = DateTime.Now, Token = new Token { Value = "lfkasdlfhjlkasdhf87", CreatedAt = DateTime.Now, IsValid = true, } } } }; //Act await sut.SignUpAsync(newTeam); //Assert var teams = await TeamsHelper.GetTeamsAsync(); var team = teams.FirstOrDefault(t => t.Name == newTeam.Name); Assert.IsNotNull(team); Assert.AreEqual(newTeam.Name, team.Name); Assert.AreEqual(newTeam.CreatedAt.ToString(), team.CreatedAt.ToString()); var participants = await ParticipantsHelper.GetParticipantsInTeamAsync(team.Id); var participant = newTeam.Participants[0]; var john = participants.First(p => p.Forename == participant.Forename); Assert.IsNotNull(john); Assert.AreEqual(participant.Surname, john.Surname); Assert.AreEqual(participant.Email, john.Email); Assert.AreEqual(participant.CreatedAt.ToString(), john.CreatedAt.ToString()); Assert.AreEqual(participant.TeamId, team.Id); var johnsToken = await TokensHelper.GetTokenForParticipantAsync(john.Id); Assert.AreEqual(participant.Token.Value, johnsToken.Value); Assert.AreEqual(participant.Token.CreatedAt.ToString(), participant.Token.CreatedAt.ToString()); Assert.AreEqual(participant.Token.IsValid, participant.Token.IsValid); Assert.AreEqual(participant.Token.TeamId, team.Id); participant = newTeam.Participants[1]; var mary = participants.First(p => p.Forename == participant.Forename); Assert.IsNotNull(mary); Assert.AreEqual(participant.Surname, mary.Surname); Assert.AreEqual(participant.Email, mary.Email); Assert.AreEqual(participant.CreatedAt.ToString(), mary.CreatedAt.ToString()); Assert.AreEqual(participant.TeamId, team.Id); var marysToken = await TokensHelper.GetTokenForParticipantAsync(mary.Id); Assert.AreEqual(participant.Token.Value, marysToken.Value); Assert.AreEqual(participant.Token.CreatedAt.ToString(), participant.Token.CreatedAt.ToString()); Assert.AreEqual(participant.Token.IsValid, participant.Token.IsValid); Assert.AreEqual(participant.Token.TeamId, team.Id); }
void UpdateStructures(double dt) { Match.Structures.ForEach(s => { s.Update(TimeSpan.FromSeconds(dt)); if (s.GetHealthChangedAndClearFlag()) // the health of the structure changed { Console.WriteLine(s.Team + " " + s.Type + " - " + s.Health + " / " + s.MaxHealth); AddRemarkableEvent(ServerCommand.StructureStatsChanged, (msg) => { bool left = s.Team == Teams.Left; byte type = (byte)s.Type; float health = s.Health; msg.Write(left); msg.Write(type); msg.Write(health); }); if (!s.Alive) // the structure is destroyed { AddRemarkableEvent(ServerCommand.StructureDestroyed, (msg) => { bool left = s.Team == Teams.Left; byte type = (byte)s.Type; msg.Write(left); msg.Write(type); }); if (s.Type == StructureTypes.Base) { AddRemarkableEvent(ServerCommand.EndOfGame, (msg) => { bool winnerIsLeft = TeamsHelper.Opposite(s.Team) == Teams.Left; msg.Write(winnerIsLeft); }); Timer t = new Timer(3000); t.Elapsed += (sender, e) => Server.Exit = true; t.Start(); } } } // Check to hit entities if (StructureHelper.IsTower(s.Type) && s.Alive) { Tower t = (Tower)s; float now = (float)Server.Instance.GetTime().TotalSeconds; Vec2 towerCenter = t.SpellSpawnPosition; foreach (ServerClient client in Clients.Values) { var clientRect = client.Champion.CreateCollisionRectangle(); Vec2 clientCenter = Rect.Center(clientRect); if (t.CanPrepare(now) && // not on cooldown s.Team == TeamsHelper.Opposite(client.Champion.Team) && // is enemy client.ChampStats.Alive && // is alive Utilities.InRange(towerCenter, clientCenter, Tower.RANGE)) // in range { if (!t.IsPreparing()) { t.StartPreparation(); PrepareTower(s.Team, s.Type); } else if (t.CanShoot(now)) { CastTowerSpell(s.Team, towerCenter, clientCenter); t.OnShot(now); } } } } }); }
public static void ImportShipmentsToBigCommerce(JArray allOrdersAwaitingShipments) { try { foreach (var order in allOrdersAwaitingShipments) { Order parsedOrder = JsonConvert.DeserializeObject <Order>(order.ToString()); BigCommerceController.bigCommerceOrderId = parsedOrder.id; Log.Information($"Big Commerce Order Id: {BigCommerceController.bigCommerceOrderId}"); // Query NetSuite to get any matching item fulfillments string netsuiteSalesOrderId = parsedOrder.staff_notes; /* Get a list of NetSuite item fulfillment ids (partially shipped orders only) that already exist * in Big Commerce to exclude so we do not create duplicate shipments. */ List <string> importedItemFulfillmentIds = new List <string>(); if (parsedOrder.status.ToLower() == "partially shipped") { importedItemFulfillmentIds = BigCommerceController.GetImportedItemFulfillments(); } var itemFulfillmentGroupsToImport = NetSuiteController.GetItemFulfillmentsNotImported(netsuiteSalesOrderId, importedItemFulfillmentIds); // Skip line if no item fulfillments are found if (itemFulfillmentGroupsToImport.Count() == 0) { Log.Information($"No item fulfillments to import."); continue; } // Send each item fulfillment group to Big Commerce as a Shipment foreach (var itemFulfillmentGroupToImport in itemFulfillmentGroupsToImport) { Log.Information($"Itfil ID: {itemFulfillmentGroupToImport.Key}"); BigCommerceController.currentItemFulfillment = itemFulfillmentGroupToImport; Shipment shipmentToCreate = BigCommerceController.CreateShipmentRequest(itemFulfillmentGroupToImport); // Big Commerce will throw exception if shipment does not have a tracking number if (shipmentToCreate.TrackingNumber == "") { Log.Warning($"No tracking numbers found. Shipment not created."); continue; } // Create the Shipment in Big Commerce try { Shipment shipmentCreated = BigCommerceController.PostShipmentToBigCommerce(shipmentToCreate); Log.Information($"shipment id {shipmentCreated.ShipmentId} created."); } catch (Exception ex) { string errorMessage = $"Error Posting Shipment To Big Commerce. Error: {ex}"; Log.Error(errorMessage); string title = "Error in NestProShipments PostShipmentToBigCommerce"; string text = errorMessage; string color = "yellow"; TeamsHelper teamsMessage = new TeamsHelper(title, text, color, Program.teamsUrl); teamsMessage.LogToMicrosoftTeams(teamsMessage); } } } } catch (Exception ex) { string errorMessage = $"Error in ImportShipmentsToBigCommerce. Error: {ex}"; Log.Error(errorMessage); string title = "Error in NestProShipments ImportShipmentsToBigCommerce"; string text = errorMessage; string color = "red"; TeamsHelper teamsMessage = new TeamsHelper(title, text, color, Program.teamsUrl); teamsMessage.LogToMicrosoftTeams(teamsMessage); } }