protected override void HandleUnexpectedLogout(MessageFIXT1_1 message) { bool handled = false; var message42 = (MessageFIX4_2)message; if (message42.Text != null) { // If our sequences numbers don't match, Lime sends a logout with a message // telling us what we should be at. So if we can, we just use that when we reconnect. if (message42.Text.StartsWith("MsgSeqNum too low")) { var match = Regex.Match(message42.Text, "expecting (\\d+)"); int newSequenceNumber = 0; if (match.Success && int.TryParse(match.Groups[1].Value, out newSequenceNumber) && newSequenceNumber >= OrderStore.LocalSequence) { log.Error(message42.Text); OrderStore.SetSequences(OrderStore.RemoteSequence, newSequenceNumber); Socket.Dispose(); handled = true; RetryStart = 2; ignoreRetryDelay = true; } } else { base.HandleUnexpectedLogout(message); throw new LimeException(string.Format("Lime logged out with error '{0}'", message42.Text)); } } if (!handled) { base.HandleUnexpectedLogout(message); } }
protected override void TryEndRecovery() { if (debug) { log.Debug("TryEndRecovery Status " + ConnectionStatus + ", Session Status Online " + isOrderServerOnline + ", Resend Complete " + IsResendComplete); } switch (ConnectionStatus) { case Status.Recovered: case Status.PendingLogOut: case Status.PendingLogin: case Status.PendingServerResend: case Status.Disconnected: return; case Status.PendingRecovery: if (IsResendComplete && isOrderServerOnline) { OrderStore.RequestSnapshot(); EndRecovery(); //RequestPositions(); //RequestSessionUpdate(); StartPositionSync(); return; } break; default: throw new ApplicationException("Unexpected connection status for TryEndRecovery: " + ConnectionStatus); } }
public override void OnDisconnect() { HeartbeatDelay = int.MaxValue; if (ConnectionStatus == Status.PendingLogOut) { if (debug) { log.Debug("Sending RemoteShutdown confirmation back to provider manager."); } } else { OrderStore.ForceSnapshot(); var message = "LimeFIXProvider disconnected."; if (SyncTicks.Enabled) { log.Notice(message); } else { log.Error(message); } log.Info("Logging out -- Sending EndBroker event."); TrySendEndBroker(); } }
protected override async Task ExecuteLoadItemsCommand() { try { IsBusy = true; Items.Clear(); string userId = DependencyService.Get <IConnectorProvider>()?.GetToken()?.UserId; var items = await OrderStore.GetItemsAsync(); foreach (var item in items) { bool isNotCurrentUserOrder = item.AuthorId.ToString() != userId; if (isNotCurrentUserOrder) { Items.Add(item); } } } catch (Exception ex) { Debug.WriteLine(ex); } finally { IsBusy = false; } }
public void SendFill(MessageFIX4_2 packetFIX) { var clientOrderId = 0L; long.TryParse(packetFIX.ClientOrderId, out clientOrderId); var originalClientOrderId = 0L; long.TryParse(packetFIX.ClientOrderId, out originalClientOrderId); if (debug) { log.Debug("SendFill( " + packetFIX.ClientOrderId + ")"); } var symbolInfo = Factory.Symbol.LookupSymbol(packetFIX.Symbol); var timeZone = new SymbolTimeZone(symbolInfo); SymbolAlgorithm algorithm; if (!TryGetAlgorithm(symbolInfo.BinaryIdentifier, out algorithm)) { log.Info("Fill received but OrderAlgorithm not found for " + symbolInfo + ". Ignoring."); return; } var fillPosition = packetFIX.LastQuantity * SideToSign(packetFIX.Side); if (GetSymbolStatus(symbolInfo)) { CreateOrChangeOrder order; if (OrderStore.TryGetOrderById(clientOrderId, out order)) { TimeStamp executionTime; if (UseLocalFillTime) { executionTime = TimeStamp.UtcNow; } else { executionTime = new TimeStamp(packetFIX.TransactionTime); } var configTime = executionTime; configTime.AddSeconds(timeZone.UtcOffset(executionTime)); var fill = Factory.Utility.PhysicalFill(fillPosition, packetFIX.LastPrice, configTime, executionTime, order.BrokerOrder, false, packetFIX.OrderQuantity, packetFIX.CumulativeQuantity, packetFIX.LeavesQuantity, IsRecovered, true); if (debug) { log.Debug("Sending physical fill: " + fill); } algorithm.OrderAlgorithm.ProcessFill(fill); algorithm.OrderAlgorithm.ProcessOrders(); TrySendStartBroker(symbolInfo, "position sync on fill"); } else { algorithm.OrderAlgorithm.IncreaseActualPosition(fillPosition); log.Notice("Fill id " + packetFIX.ClientOrderId + " not found. Must have been a manual trade."); if (SyncTicks.Enabled) { var tickSync = SyncTicks.GetTickSync(symbolInfo.BinaryIdentifier); tickSync.RemovePhysicalFill(packetFIX.ClientOrderId); } } } }
private void cmbOrders_SelectedIndexChanged(object sender, EventArgs e) { foreach (var item in OrderStore.GetUnCompletedOrders()) { if (item.OrderId.ToString() == cmbOrders.Text) { orderSelected = item; } } }
public List <Order> ReadOrder() { var orderStore = new OrderStore() { Path = ordersPath }; var orderList = orderStore.GetCollection(); return(orderList); }
public IActionResult GetOrder(int orderId) //получение информации о заказе { if (_repository.Orders.IsOrderExists(orderId)) { OrderStore orderFromStore = _repository.Orders.GetOrder(orderId); OrderReturn orderToReturn = _mapper.Map <OrderReturn>(orderFromStore); return(Ok(orderToReturn)); } return(NotFound()); }
public override bool OnLogin() { if (debug) { log.Debug("LimeFIXProvider.Login()"); } if (OrderStore.Recover()) { // Reset the order algorithms lock (orderAlgorithmsLocker) { var symbolIds = new List <long>(); foreach (var kvp in orderAlgorithms) { symbolIds.Add(kvp.Key); } orderAlgorithms.Clear(); foreach (var symbolId in symbolIds) { CreateAlgorithm(symbolId); } } if (debug) { log.Debug("Recovered from snapshot Local Sequence " + OrderStore.LocalSequence + ", Remote Sequence " + OrderStore.RemoteSequence); } if (debug) { log.Debug("Recovered orders from snapshot: \n" + OrderStore.OrdersToString()); } if (debug) { log.Debug("Recovered symbol positions from snapshot:\n" + OrderStore.SymbolPositionsToString()); } if (debug) { log.Debug("Recovered strategy positions from snapshot:\n" + OrderStore.StrategyPositionsToString()); } RemoteSequence = OrderStore.RemoteSequence; SendLogin(OrderStore.LocalSequence); OrderStore.RequestSnapshot(); } else { if (debug) { log.Debug("Unable to recover from snapshot. Beginning full recovery."); } OrderStore.SetSequences(0, 0); OrderStore.ForceSnapshot(); SendLogin(OrderStore.LocalSequence); } return(true); }
public void ShowOrdersDropDown() { cmbOrders.Items.Clear(); string b = ""; foreach (var item in OrderStore.GetUnCompletedOrders()) { b = item.OrderId.ToString(); cmbOrders.Items.Add(b); } }
public IActionResult UpdateOrderPut(OrderUpdate orderUpdate) //полное обновление заказа { if (_repository.Orders.IsOrderExists(orderUpdate.Number)) { OrderStore orderFromStore = _repository.Orders.GetOrder(orderUpdate.Number); _mapper.Map(orderUpdate, orderFromStore); _repository.Orders.UpdateOrder(orderFromStore); return(NoContent()); } return(NotFound()); }
public void LoadOrders() { mainScrollView.Controls.Clear(); OrderContainer obj; //347 hieght int x = 5; int y = 1; foreach (var item in OrderStore.GetUnCompletedOrders()) { obj = new OrderContainer(item); obj.Location = new Point(x, y); x += 349; mainScrollView.Controls.Add(obj); } }
//TODO: Could be moved to common class private string GetOpenOrders() { var sb = new StringBuilder(); var list = OrderStore.GetOrders((x) => true); foreach (var order in list) { sb.Append(" "); sb.Append(order.BrokerOrder); sb.Append(" "); sb.Append(order); sb.AppendLine(); } return(sb.ToString()); }
private void btnKrijo_Click(object sender, EventArgs e) { if (cmbTables.Text.Length >= 1) { try { OrderStore.CreateNewOrder(new Order(tableSelected, DateTime.Now, TempEmployee.currentEmployee)); ShowOrdersDropDown(); LoadOrders(); } catch (Exception) { MessageBox.Show("Nje gabim ndodhi"); } } }
// return: // true 主要字段相同,需要合并 // false 不需要合并 public static bool Compare(OrderStore order1, OrderStore order2) { Hashtable value_table1 = GetValues(order1); Hashtable value_table2 = GetValues(order2); if ((string)value_table1["seller"] != (string)value_table2["seller"]) { return(false); } if ((string)value_table1["price"] != (string)value_table2["price"]) { return(false); } if ((string)value_table1["acceptPrice"] != (string)value_table2["acceptPrice"]) { return(false); } if ((string)value_table1["catalogNo"] != (string)value_table2["catalogNo"]) { return(false); } if ((string)value_table1["issueCount"] != (string)value_table2["issueCount"]) { return(false); } if ((string)value_table1["range"] != (string)value_table2["range"]) { return(false); } if ((int)value_table1["subcopy"] != (int)value_table2["subcopy"]) { return(false); } if (CompareAddress((string)value_table1["sellerAddress"], (string)value_table1["sellerAddress"]) != 0) { return(false); } return(true); }
public IActionResult CreateOrder(OrderCreate orderToCreate) //создание заказа { if (ModelState.IsValid) { if (!_repository.Orders.IsOrderExists(orderToCreate.Number)) { if (_repository.Postamats.IsPostamatExists(orderToCreate.PostamatNumber) && _repository.Postamats.IsPostamatActive(orderToCreate.PostamatNumber)) { OrderStore orderToStore = _mapper.Map <OrderStore>(orderToCreate); _repository.Orders.CreateOrder(orderToStore); return(NoContent()); } return(StatusCode(403)); } } return(BadRequest()); }
public IActionResult Test() { var orderStore = new OrderStore() { Path = orderPath }; var orderList = orderStore.GetCollection(); var val = orderList.Sum(x => x.Amount * x.Price); var orderCopy = orderList.GroupBy(x => x.Id).Select(y => new Order { Id = y.First().Id, Name = y.First().Name, Price = y.First().Price, Amount = y.Key }); ViewData["TotalAmount"] = val; return(View(orderList)); }
public IActionResult UpdateOrderPatch(int orderId, JsonPatchDocument <OrderUpdate> patcher) //частичное обновление заказа { if (_repository.Orders.IsOrderExists(orderId)) { OrderStore orderFromStore = _repository.Orders.GetOrder(orderId); OrderUpdate orderToPatch = _mapper.Map <OrderUpdate>(orderFromStore); patcher.ApplyTo(orderToPatch, ModelState); if (!TryValidateModel(orderToPatch)) { return(ValidationProblem(ModelState)); } _mapper.Map(orderToPatch, orderFromStore); return(NoContent()); } return(NotFound()); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var store = new OrderStore(); store.Add(new Order { Person = "Will", Item = "Hat" }); store.Add(new Order { Person = "Will", Item = "Laptop" }); store.Add(new Order { Person = "Bob", Item = "Bus" }); store.Add(new Order { Person = "Jane", Item = "Spade" }); services.AddControllers(); services.AddSingleton(store); }
// 根据 BiblioStore 对象拆分出 OrderListItem 对象数组 public static List <OrderListItem> SplitOrderListItems(BiblioStore biblio) { List <OrderListItem> results = new List <OrderListItem>(); List <OrderStore> orders = new List <OrderStore>(); // orders.AddRange(biblio.Orders); foreach (OrderStore order in biblio.Orders) { if (order.Type == "deleted") { continue; } if (string.IsNullOrEmpty(order.GetFieldValue("state"))) { orders.Add(order); } } while (orders.Count > 0) { OrderListItem item = new OrderListItem(); OrderStore start = orders[0]; item.Merge(start); orders.RemoveAt(0); for (int i = 0; i < orders.Count; i++) { OrderStore order = orders[i]; if (Compare(start, order) == true) { item.Merge(order); orders.RemoveAt(i); i--; } } results.Add(item); } return(results); }
public IActionResult Answer(int ProductID, int ID) { int ProduxtAmount = int.Parse(Request.Form["Amount"].ToString()); var productStore = new ProductStore() { Path = productPath }; var orderStore = new OrderStore() { Path = orderPath }; var productList = productStore.GetCollection(); var orderList = orderStore.GetCollection(); ViewData["ID"] = ID; ViewData["ProductID"] = ProductID; if (productList.Where(x => x.Id == ProductID).First().Amount < ProduxtAmount) { ViewData["Answer"] = "Error. We don't have so many items"; } else { var c = productList.Where(x => x.Id == ProductID).First(); int val = orderList.Where(x => x.Id == ProductID).Sum(x => x.Amount); if (val + ProduxtAmount > c.Amount) { ViewData["Answer"] = "Error. We don't have so many items"; } else { orderStore.WriteData(c.Id, c.Name, c.Price, ProduxtAmount); ViewData["Answer"] = "Ok. Your request is in process"; } } return(View()); }
protected override async Task ExecuteLoadItemsCommand() { IsBusy = true; try { Items.Clear(); var items = await OrderStore.GetCurrentUserItemsAsync(); foreach (var item in items) { Items.Add(item); } } catch (Exception ex) { Debug.WriteLine(ex); } finally { IsBusy = false; } }
private void SendCancelOrder(CreateOrChangeOrder order, bool resend) { var fixMsg = (FIXMessage4_2)(resend ? FixFactory.Create(order.Sequence) : FixFactory.Create()); order.Sequence = fixMsg.Sequence; OrderStore.SetOrder(order); var newClientOrderId = order.BrokerOrder; fixMsg.SetOriginalClientOrderId(order.OriginalOrder.BrokerOrder.ToString()); fixMsg.SetClientOrderId(newClientOrderId.ToString()); #if NOT_LIME fixMsg.SetAccount(AccountNumber); fixMsg.SetSide(GetOrderSide(order.OriginalOrder.Side)); fixMsg.SetSymbol(order.Symbol.Symbol); fixMsg.SetTransactTime(TimeStamp.UtcNow); #endif fixMsg.AddHeader("F"); if (resend) { fixMsg.SetDuplicate(true); } SendMessage(fixMsg); }
public ProviderStateMiddleware(RequestDelegate next, OrderStore store) { _next = next; _providerStates = new Dictionary <string, Action> { { "There are 2 orders in the store", () => { foreach (var order in store.GetAll()) { store.Delete(order.Id); } store.Add(new Order { Person = "person1", Item = "item1", Delivered = true }); store.Add(new Order { Person = "person2", Item = "item2", Delivered = false }); } } }; }
public bool OnCancelBrokerOrder(CreateOrChangeOrder order) { if (!IsRecovered) { return(false); } if (debug) { log.Debug("OnCancelBrokerOrder " + order + ". Connection " + ConnectionStatus + ", IsOrderServerOnline " + isOrderServerOnline); } OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); CreateOrChangeOrder createOrChangeOrder; try { createOrChangeOrder = OrderStore.GetOrderById(order.OriginalOrder.BrokerOrder); } catch (ApplicationException ex) { if (LogRecovery || !IsRecovery) { log.Info("Order probably already canceled. " + ex.Message); } if (SyncTicks.Enabled) { var tickSync = SyncTicks.GetTickSync(order.Symbol.BinaryIdentifier); tickSync.RemovePhysicalOrder(); } return(true); } createOrChangeOrder.ReplacedBy = order; if (!object.ReferenceEquals(order.OriginalOrder, createOrChangeOrder)) { throw new ApplicationException("Different objects!"); } SendCancelOrder(order, false); return(true); }
/// <summary> /// Initializes a new instance of the <see cref="OrderStoreTests"/> class. /// </summary> public OrderStoreTests() { this._sut = new OrderStore(); }
public OrderController(OrderStore store) { _store = store; }
public OrderControllerTests() { _store = new OrderStore(); _sut = new OrderController(_store); }
private void CancelRejected(MessageFIX4_2 packetFIX) { var clientOrderId = 0L; long.TryParse(packetFIX.ClientOrderId, out clientOrderId); var originalClientOrderId = 0L; long.TryParse(packetFIX.ClientOrderId, out originalClientOrderId); if (debug && (LogRecovery || !IsRecovery)) { log.Debug("CancelRejected: " + packetFIX); } string orderStatus = packetFIX.OrderStatus; switch (orderStatus) { case "2": //Filled var rejectReason = false; if (packetFIX.Text.Contains("Unknown order") || packetFIX.Text.Contains("Order is completed")) { rejectReason = true; log.Warn("RemoveOriginal=FALSE for: " + packetFIX.Text); //removeOriginal = true; } else { log.Error("Unknown text meesage in CancelReject: " + packetFIX.Text); } CreateOrChangeOrder order; if (OrderStore.TryGetOrderById(clientOrderId, out order)) { var symbol = order.Symbol; SymbolAlgorithm algorithm; if (!TryGetAlgorithm(symbol.BinaryIdentifier, out algorithm)) { log.Info("Cancel rejected but OrderAlgorithm not found for " + symbol + ". Ignoring."); break; } var retryImmediately = true; algorithm.OrderAlgorithm.RejectOrder(clientOrderId, IsRecovered, retryImmediately); } else { if (debug) { log.Debug("Order not found for " + clientOrderId + ". Probably allready filled or canceled."); } } if (!rejectReason && IsRecovered) { var message = "Order Rejected: " + packetFIX.Text + "\n" + packetFIX; var stopping = "The cancel reject error message '" + packetFIX.Text + "' was unrecognized. "; log.Warn(message); log.Error(stopping); } else { if (LogRecovery || !IsRecovery) { log.Info("CancelReject(" + packetFIX.Text + ") Removed cancel order: " + packetFIX.ClientOrderId); } } break; default: throw new ApplicationException("Unknown cancel rejected order status: '" + orderStatus + "'"); } }
private void ExecutionReport(MessageFIX4_2 packetFIX) { var clientOrderId = 0L; long.TryParse(packetFIX.ClientOrderId, out clientOrderId); var originalClientOrderId = 0L; long.TryParse(packetFIX.ClientOrderId, out originalClientOrderId); if (packetFIX.Text == "END") { throw new ApplicationException("Unexpected END in FIX Text field. Never sent a 35=AF message."); } SymbolAlgorithm algorithm = null; SymbolInfo symbolInfo = packetFIX.Symbol != null?Factory.Symbol.LookupSymbol(packetFIX.Symbol) : null; if (symbolInfo != null) { TryGetAlgorithm(symbolInfo.BinaryIdentifier, out algorithm); } string orderStatus = packetFIX.OrderStatus; switch (orderStatus) { case "0": // New if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport New: " + packetFIX); } if (algorithm == null) { log.Info("New order but OrderAlgorithm not found for " + symbolInfo + ". Ignoring."); break; } CreateOrChangeOrder order = null; OrderStore.TryGetOrderById(clientOrderId, out order); if (order != null && symbolInfo.FixSimulationType == FIXSimulationType.BrokerHeldStopOrder) // Stop Order { if (order.Type == OrderType.BuyStop || order.Type == OrderType.SellStop) { if (debug) { log.Debug("New order message for Forex Stop: " + packetFIX); } break; } } algorithm.OrderAlgorithm.ConfirmCreate(clientOrderId, IsRecovered); TrySendStartBroker(symbolInfo, "sync on confirm cancel"); OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); break; case "1": // Partial if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Partial: " + packetFIX); } //UpdateOrder(packetFIX, OrderState.Active, null); SendFill(packetFIX); OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); break; case "2": // Filled if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Filled: " + packetFIX); } if (packetFIX.CumulativeQuantity < packetFIX.LastQuantity) { log.Warn("Ignoring message due to CumQty " + packetFIX.CumulativeQuantity + " less than " + packetFIX.LastQuantity + ". This is a workaround for a MBT FIX server which sends an extra invalid fill message on occasion."); break; } SendFill(packetFIX); OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); break; case "5": // Replaced if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Replaced: " + packetFIX); } if (algorithm == null) { log.Info("ConfirmChange but OrderAlgorithm not found for " + symbolInfo + ". Ignoring."); break; } algorithm.OrderAlgorithm.ConfirmChange(clientOrderId, IsRecovered); TrySendStartBroker(symbolInfo, "sync on confirm change"); OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); break; case "4": // Canceled if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Canceled: " + packetFIX); } if (algorithm == null) { log.Info("Order Canceled but OrderAlgorithm not found for " + symbolInfo + ". Ignoring."); break; } if (clientOrderId != 0) { algorithm.OrderAlgorithm.ConfirmCancel(clientOrderId, IsRecovered); TrySendStartBroker(symbolInfo, "sync on confirm cancel"); } else if (originalClientOrderId != 0) { algorithm.OrderAlgorithm.ConfirmCancel(originalClientOrderId, IsRecovered); TrySendStartBroker(symbolInfo, "sync on confirm cancel orig order"); } OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); break; case "6": // Pending Cancel if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Pending Cancel: " + packetFIX); } if (!string.IsNullOrEmpty(packetFIX.Text) && packetFIX.Text.Contains("multifunction order")) { if (debug && (LogRecovery || IsRecovered)) { log.Debug("Pending cancel of multifunction order, so removing " + packetFIX.ClientOrderId + " and " + packetFIX.OriginalClientOrderId); } if (clientOrderId != 0L) { OrderStore.RemoveOrder(clientOrderId); } if (originalClientOrderId != 0L) { OrderStore.RemoveOrder(originalClientOrderId); } break; } OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); TryHandlePiggyBackFill(packetFIX); break; case "8": // Rejected if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Reject: " + packetFIX); } RejectOrder(packetFIX); break; case "9": // Suspended if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Suspended: " + packetFIX); } OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); break; case "A": // PendingNew if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Pending New: " + packetFIX); } if (algorithm == null) { log.Info("PendingNew but OrderAlgorithm not found for " + symbolInfo + ". Ignoring."); break; } OrderStore.TryGetOrderById(clientOrderId, out order); if (order != null && symbolInfo.FixSimulationType == FIXSimulationType.BrokerHeldStopOrder && (order.Type == OrderType.BuyStop || order.Type == OrderType.SellStop)) { if (packetFIX.ExecutionType == "D") // Restated { if (debug) { log.Debug("Ignoring restated message 150=D for Forex stop execution report 39=A."); } } else { algorithm.OrderAlgorithm.ConfirmCreate(originalClientOrderId, IsRecovered); } } else { algorithm.OrderAlgorithm.ConfirmActive(originalClientOrderId, IsRecovered); } TrySendStartBroker(symbolInfo, "sync on confirm cancel orig order"); OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); break; case "E": // Pending Replace if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Pending Replace: " + packetFIX); } OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); TryHandlePiggyBackFill(packetFIX); break; case "R": // Resumed. if (debug && (LogRecovery || !IsRecovery)) { log.Debug("ExecutionReport Resumed: " + packetFIX); } OrderStore.SetSequences(RemoteSequence, FixFactory.LastSequence); //UpdateOrder(packetFIX, OrderState.Active, null); // Ignore break; default: throw new ApplicationException("Unknown order status: '" + orderStatus + "'"); } }