// Estimates the portion of other totals before report goes live private void ProcessOrderPortions(List <OrderTransaction> transactions) { if (transactions == null) { return; } List <string> orderIds = (from t in transactions select t.OrderId).Distinct().ToList(); List <OrderSnapshot> orderSnaps = MTApp.OrderServices.Orders.FindManySnapshots(orderIds); foreach (OrderTransaction t in transactions) { OrderSnapshot snap = orderSnaps.Where(y => y.bvin == t.OrderId).FirstOrDefault(); if (snap != null) { decimal percentOfTotal = 0; if (snap.TotalGrand > 0) { percentOfTotal = t.AmountAppliedToOrder / snap.TotalGrand; } t.TempEstimatedHandlingPortion = Math.Round(snap.TotalHandling * percentOfTotal, 2); t.TempEstimatedItemPortion = Math.Round(snap.TotalOrderBeforeDiscounts * percentOfTotal, 2); t.TempEstimatedItemDiscount = Math.Round(snap.TotalOrderDiscounts * percentOfTotal, 2); t.TempEstimatedShippingPortion = Math.Round(snap.TotalShippingBeforeDiscounts * percentOfTotal, 2); t.TempEstimatedShippingDiscount = Math.Round(snap.TotalShippingDiscounts * percentOfTotal, 2); t.TempEstimatedTaxPortion = Math.Round((snap.TotalTax + snap.TotalTax2) * percentOfTotal, 2); t.TempCustomerEmail = snap.UserEmail; t.TempCustomerName = snap.BillingAddress.LastName + ", " + snap.BillingAddress.FirstName; } } }
protected override void LoadSnapshot(ISnapshot snapshot) { OrderSnapshot state = (OrderSnapshot)snapshot; items.AddRange(state.Items); totalPrice = state.TotalPrice; }
public async Task PlaceOrderAsync(PlaceOrderRequest request) { var queue = await StateManager.GetOrAddAsync <IReliableQueue <OrderSnapshot> >("queue"); var state = await StateManager.GetOrAddAsync <IReliableDictionary <Guid, OrderSnapshot> >("state"); var snapshot = new OrderSnapshot { Id = request.Id, BaseCurrency = request.BaseCurrency, QuoteCurrency = request.QuoteCurrency, Side = request.Side, Price = request.Price, Amount = request.Amount, Remaining = request.Amount }; using (var transaction = StateManager.CreateTransaction()) { await queue.EnqueueAsync(transaction, snapshot); await state.AddAsync(transaction, snapshot.Id, snapshot); await transaction.CommitAsync(); } }
/// <summary> /// Submits an order to be executed by the broker /// </summary> /// <param name="order">The order to submit</param> public void SubmitOrder(Broker.Order order) { Dictionary <Broker.Order.OrderType, BasicallyMe.RobinhoodNet.OrderType> orderTypeLookup = new Dictionary <Broker.Order.OrderType, OrderType>() { { Broker.Order.OrderType.MARKET, BasicallyMe.RobinhoodNet.OrderType.Market }, { Broker.Order.OrderType.LIMIT, BasicallyMe.RobinhoodNet.OrderType.Limit }, { Broker.Order.OrderType.STOP, BasicallyMe.RobinhoodNet.OrderType.StopLoss }, { Broker.Order.OrderType.STOP_LIMIT, BasicallyMe.RobinhoodNet.OrderType.StopLoss }, }; bool isStopOrder = ((order.Type == Broker.Order.OrderType.STOP) || (order.Type == Broker.Order.OrderType.STOP_LIMIT)); NewOrderSingle newOrder = new NewOrderSingle() { AccountUrl = getAccount().AccountUrl, InstrumentUrl = Client.FindInstrument(order.Symbol).Result.First().InstrumentUrl, OrderType = orderTypeLookup[order.Type], Price = order.LimitPrice, Quantity = (int)order.Quantity, Side = ((order.BuySell == Broker.Order.BuySellType.BUY) ? Side.Buy : Side.Sell), StopPrice = (isStopOrder ? order.StopPrice : (decimal?)null), Symbol = order.Symbol, TimeInForce = TimeInForce.GoodForDay, Trigger = isStopOrder ? TriggerType.Stop : TriggerType.Immediate }; Client.PlaceOrder(newOrder).ContinueWith((result) => { OrderSnapshot orderResult = result.Result; ActiveOrders.Add(new RobinhoodOrder(order.Symbol, orderResult)); }); }
static void PlaceOrder() { //Order settings NewOrderSingle newOrder = new NewOrderSingle(CurrentStockSymbol); newOrder.AccountUrl = Setup.UserAccount.AccountUrl; newOrder.Quantity = Math.Abs(Quantity); newOrder.Side = Side.Buy; newOrder.TimeInForce = OrderDuration; if (Price == 0) { newOrder.OrderType = OrderType.Market; } else { newOrder.OrderType = OrderType.Limit; newOrder.Price = Price; } //Places the order OrderSnapshot order = new OrderSnapshot(); try { order = Setup.Client.PlaceOrder(newOrder).Result; Console.WriteLine("Order Placed"); Console.ReadKey(); } catch { Console.WriteLine("There was a problem placing the order, might be insufficent funds or shares"); Console.ReadKey(); } }
public async Task <bool> SaveOrderSnapshot(OrderSnapshot snapshot) { var streamId = $"Order:{snapshot.Id.ToString()}"; await _snapshotStore .SaveSnapshotAsync(streamId, snapshot.Version, snapshot); return(true); }
private async Task PersistChanges(Order order, OrderSnapshot initial, IReliableDictionary <Guid, OrderSnapshot> dictionary, ITransaction transaction) { var updated = await dictionary.TryUpdateAsync(transaction, order.Id, order.GetSnapshot(), initial); if (updated && order.IsClosed()) { await dictionary.TryRemoveAsync(transaction, order.Id); } }
/// <summary> /// Saves the snapshot. /// </summary> /// <param name="snapshot">The snapshot.</param> /// <param name="order">The order.</param> public void SaveSnapshot(OrderSnapshot snapshot, Order order) { var previousSnapshot = GetLatestSnapshot(order.Id); if (previousSnapshot == null || previousSnapshot.Version < snapshot.Version) { _eventStore.AddSnapshot(StreamNameFor(order.Id), snapshot); } }
protected void dgList_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { OrderSnapshot order = (OrderSnapshot)e.Item.DataItem; } if (e.Item.ItemType == ListItemType.Footer) { e.Item.Cells[0].Text = "Totals:"; e.Item.Cells[2].Text = string.Format("{0:C}", TotalSub); } }
protected void dgList_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { OrderSnapshot order = (OrderSnapshot)e.Item.DataItem; Label lblDate = (Label)e.Item.FindControl("lblDate"); if (lblDate != null) { lblDate.Text = TimeZoneInfo.ConvertTimeFromUtc(order.TimeOfOrderUtc, MTApp.CurrentStore.Settings.TimeZone).ToShortDateString(); } HyperLink lnkViewOrder = (HyperLink)e.Item.FindControl("lnkViewOrder"); if (lnkViewOrder != null) { lnkViewOrder.NavigateUrl = "~/BVAdmin/Orders/ViewOrder.aspx?id=" + order.bvin; } if (order.OrderNumber == "DayTotal") { TableCell cell = new TableCell(); cell.ColumnSpan = e.Item.Cells.Count; cell.Text = "Day Total: " + string.Format("{0:c}", order.TotalGrand); e.Item.Cells.Clear(); e.Item.Cells.Add(cell); e.Item.ControlStyle.CssClass = "separator"; } else if (order.OrderNumber == "MonthTotal") { TableCell cell = new TableCell(); cell.ColumnSpan = e.Item.Cells.Count; cell.Text = "Month Total: " + string.Format("{0:c}", order.TotalGrand); e.Item.Cells.Clear(); e.Item.Cells.Add(cell); e.Item.ControlStyle.CssClass = "separator"; } } if (e.Item.ItemType == ListItemType.Footer) { e.Item.Cells[0].Text = "Totals:"; e.Item.Cells[2].Text = string.Format("{0:C}", TotalSub); e.Item.Cells[3].Text = string.Format("{0:C}", TotalDiscounts); e.Item.Cells[4].Text = string.Format("{0:C}", TotalShip); e.Item.Cells[5].Text = string.Format("{0:C}", TotalShipDiscounts); e.Item.Cells[6].Text = string.Format("{0:C}", TotalTax); e.Item.Cells[7].Text = string.Format("{0:C}", TotalGrand); } }
public static async Task <bool> CancelOrder(OrderSnapshot order) { if (order != null) { bool isPending = order.State != null && order.State == "unconfirmed"; /// does this say pending or is there a better way /// if the order is pending or the order is partial if (isPending) { var rh = new RobinhoodClient(_token); /// cancel the order await rh.CancelOrder(order.CancelUrl).ConfigureAwait(false); return(true); } } return(false); }
public static async Task PlaceOrder(string[] args) { Debug.Print(System.Reflection.MethodBase.GetCurrentMethod().Name); var rh = new RobinhoodClient(_token); //Account account = rh.DownloadAllAccounts().Result.First(); //JToken instrumentData = null; //while (instrumentData == null) //{ // try // { // Console.Write("Symbol: "); // rh.DownloadOptionStrikeInstrument(args).Wait(); // instrumentData = rh.results; // MessageBox.Show(instrument.Name); // } // catch (Exception ex) // { // Utils.MessageBoxModal("Problem with initial order.\n\nWill try again 1 second after you hit OK.\n\nIf expiry date is today or wrong, no order will be places, /n/nsince no option instrument can be found "); // System.Threading.Thread.Sleep(1000); // } //} int qty = Convert.ToInt32(args[4]); decimal price = Convert.ToDecimal(args[5]); TimeInForce tif = TimeInForce.GoodTillCancel; //OptionInstrument instrument = new OptionInstrument() //{ // InstrumentUrl = "https://api.robinhood.com/options/instruments/5ac9f2ac-6d01-4d2d-94de-e18ae7602a81/", //new Url<OptionInstrument>(instrumentData.SelectToken("url").ToString()), // Symbol = "c277b118-58d9-4060-8dc5-a3b5898955cb" // // //instrumentData.SelectToken("chain_symbol").ToString() //}; OptionInstrument instrument = new OptionInstrument() { InstrumentUrl = new Url <OptionInstrument>("https://api.robinhood.com/options/instruments/5ac9f2ac-6d01-4d2d-94de-e18ae7602a81/"), //new Url<OptionInstrument>(instrumentData.SelectToken("url").ToString()), Symbol = "c277b118-58d9-4060-8dc5-a3b5898955cb" // //instrumentData.SelectToken("chain_symbol").ToString() }; var newOptionOrderSingle = new NewOptionOrderSingle(instrument); newOptionOrderSingle.AccountUrl = // account.AccountUrl; new Url <Account>("https://api.robinhood.com/accounts/475573473/"); // newOptionOrderSingle.Quantity = Math.Abs(qty); newOptionOrderSingle.Side = qty > 0 ? Side.Buy : Side.Sell; newOptionOrderSingle.TimeInForce = tif; if (price == 0) { newOptionOrderSingle.OrderType = OrderType.Market; } else { newOptionOrderSingle.OrderType = OrderType.Limit; newOptionOrderSingle.Price = price; } _order = rh.PlaceOptionOrder(newOptionOrderSingle).Result; Debug.Print("2:" + DateTime.Now); _resultsLabel = RobinhoodClient._ErrorMessage; // _resultsLabel = rh._ /// update lastMatch.buyAtPrice /// /// await the order response /// /// /// get reversals after /// //bool isPending = order.State != null && order.State == "unconfirmed"; /// does this say pending or is there a better way // /// if the order is pending or the order is partial //if (isPending) //{ // /// cancel the order // rh.CancelOrder(order.CancelUrl).Wait(); // /// get the order status // /// // /// replace the order //} /// if new reversal /// if not partial /// remove order from lstMatch // so a resumption will create a new turn up (this means our reversal stats are not complete) /// set lastMatch to null /// exit stage left /// /// /// else /// if partial /// record the partial order /// reset contracts /// re-order /// else // order was filled /// log the order //using (TradeLogTableAdapter ta = new TradeLogTableAdapter()) //{ // ta.Insert(args[6], Convert.ToDateTime(args[7]), order.jsonText); //} /// /// Analyse the current status /// Is the ask > buyAtPrice /// Is it more than a penny? /// Is the ask now lower than buyAtPrice i.e. the price is falling /// Has there been a reversal? /// Is BuyPrice >= Bid and <= Ask? //if (!String.IsNullOrEmpty(order.ErrorMessage)) // MessageBox.Show(order.ErrorMessage); //else //{ // MessageBox.Show(string.Format("{0}\t{1}\t{2} x {3}\t{4}", // order.Side, // instrument.Symbol, // order.Quantity, // order.Price.HasValue ? order.Price.ToString() : "mkt", // order.State)); //} //if (!String.IsNullOrEmpty(order.RejectReason)) //{ // MessageBox.Show(order.RejectReason); //} //object state = SynchronizationContext.Current; //var context = (SynchronizationContext)state; //state = new object(); //context.Post(RHCockpit.frmBot.WorkerDone, state); }
void FillList() { try { TotalSub = 0; TotalShip = 0; TotalHandling = 0; TotalTax = 0; TotalGrand = 0; TotalCount = 0; TotalDiscounts = 0; TotalShipDiscounts = 0; OrderSearchCriteria c = new OrderSearchCriteria(); // Get Local Times TimeZoneInfo timezone = MTApp.CurrentStore.Settings.TimeZone; DateTime zonedStart = this.DateRangeField.StartDateForZone(timezone); DateTime zonedEnd = this.DateRangeField.EndDateForZone(timezone); // Convert to UTC DateTime utcStart = TimeZoneInfo.ConvertTimeToUtc(zonedStart, timezone); DateTime utcEnd = TimeZoneInfo.ConvertTimeToUtc(zonedEnd, timezone); c.StartDateUtc = utcStart; c.EndDateUtc = utcEnd; List <OrderSnapshot> found = new List <OrderSnapshot>(); found = MTApp.OrderServices.Orders.FindByCriteria(c); TotalCount = found.Count; foreach (OrderSnapshot o in found) { TotalSub += o.TotalOrderBeforeDiscounts; TotalDiscounts += o.TotalOrderDiscounts; TotalShip += o.TotalShippingBeforeDiscounts; TotalShipDiscounts += o.TotalShippingDiscounts; TotalHandling += o.TotalHandling; TotalTax += o.TotalTax + o.TotalTax2; TotalGrand += o.TotalGrand; } int i = 0; string month = string.Empty; decimal monthTotal = 0m; decimal dayTotal = 0m; string day = string.Empty; if (found.Count > 0) { DateTime zonedTimeOfOrder = TimeZoneInfo.ConvertTimeFromUtc(found[0].TimeOfOrderUtc, timezone); month = zonedTimeOfOrder.Month.ToString() + ":" + zonedTimeOfOrder.Year.ToString(); day = zonedTimeOfOrder.DayOfYear.ToString() + ":" + zonedTimeOfOrder.Year.ToString(); while (i <= found.Count - 1) { DateTime zonedTime = TimeZoneInfo.ConvertTimeFromUtc(found[i].TimeOfOrderUtc, timezone); monthTotal = monthTotal + found[i].TotalGrand; dayTotal = dayTotal + found[i].TotalGrand; if (zonedTime.DayOfYear.ToString() + ":" + zonedTime.Year.ToString() != day) { day = zonedTime.DayOfYear.ToString() + ":" + zonedTime.Year.ToString(); // we need to insert a day total OrderSnapshot order = new OrderSnapshot(); order.OrderNumber = "DayTotal"; order.TotalGrand = (dayTotal - found[i].TotalGrand); dayTotal = found[i].TotalGrand; found.Insert(i, order); i += 1; } if (zonedTime.Month.ToString() + ":" + zonedTime.Year.ToString() != month) { month = zonedTime.Month.ToString() + ":" + zonedTime.Year.ToString(); // we need to insert a month total OrderSnapshot order = new OrderSnapshot(); order.OrderNumber = "MonthTotal"; order.TotalGrand = (monthTotal - found[i].TotalGrand); monthTotal = found[i].TotalGrand; found.Insert(i, order); i += 1; } i += 1; } if (dayTotal > 0) { // we need to insert a day total OrderSnapshot order = new OrderSnapshot(); order.OrderNumber = "DayTotal"; order.TotalGrand = dayTotal; found.Add(order); } if (monthTotal > 0) { OrderSnapshot order = new OrderSnapshot(); order.OrderNumber = "MonthTotal"; order.TotalGrand = monthTotal; found.Add(order); } } lblResponse.Text = "<b>" + TotalCount + "</b>"; lblResponse.Text += " Orders Totaling <b>"; lblResponse.Text += string.Format("{0:c}", TotalGrand); lblResponse.Text += "</b>"; dgList.DataSource = found; dgList.DataBind(); } catch (Exception Ex) { msg.ShowException(Ex); EventLog.LogEvent(Ex); } }
public void RenderSingleOrder(OrderSnapshot o, StringBuilder sb, bool altRow, TimeZoneInfo timezone) { string url = ResolveUrl("~/bvadmin/orders/ViewOrder.aspx?id=" + o.bvin); if (altRow) { sb.Append("<tr class=\"alternaterow\">"); } else { sb.Append("<tr class=\"row\">"); } sb.Append("<td><input class=\"pickercheck\" type=\"checkbox\" id=\"check" + o.bvin + "\" /></td>"); sb.Append("<td><a href=\"" + url + "\">" + o.OrderNumber + "</a></td>"); DateTime timeOfOrder = TimeZoneInfo.ConvertTimeFromUtc(o.TimeOfOrderUtc, timezone); DateTime currentTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timezone); sb.Append("<td><a href=\"" + url + "\">" + MerchantTribe.Web.Dates.FriendlyShortDate(timeOfOrder, currentTime.Year) + "</a></td>"); sb.Append("<td><a href=\"" + url + "\">" + string.Format("{0:c}", o.TotalGrand) + "</a></td>"); sb.Append("<td>"); sb.Append(MerchantTribe.Commerce.Utilities.MailServices.MailToLink(o.UserEmail, "Order " + o.OrderNumber, o.BillingAddress.FirstName + ",", o.BillingAddress.FirstName + " " + o.BillingAddress.LastName)); sb.Append("</td>"); string payText = MerchantTribe.Commerce.Utilities.EnumToString.OrderPaymentStatus(o.PaymentStatus); string payImage = ""; string payLink = ResolveUrl("~/bvadmin/orders/ReceivePayments.aspx?id=" + o.bvin); switch (o.PaymentStatus) { case OrderPaymentStatus.Overpaid: payImage = ResolveUrl("~/BVAdmin/Images/Lights/PaymentError.gif"); break; case OrderPaymentStatus.PartiallyPaid: payImage = ResolveUrl("~/BVAdmin/Images/Lights/PaymentAuthorized.gif"); break; case OrderPaymentStatus.Paid: payImage = ResolveUrl("~/BVAdmin/Images/Lights/PaymentComplete.gif"); break; case OrderPaymentStatus.Unknown: payImage = ResolveUrl("~/BVAdmin/Images/Lights/PaymentNone.gif"); break; case OrderPaymentStatus.Unpaid: payImage = ResolveUrl("~/BVAdmin/Images/Lights/PaymentNone.gif"); break; } sb.Append("<td><a href=\"" + payLink + "\" title=\"" + payText + "\"><img src=\"" + payImage + "\" alt=\"" + payText + "\" /></a></td>"); string shipText = MerchantTribe.Commerce.Utilities.EnumToString.OrderShippingStatus(o.ShippingStatus); string shipImage = ""; string shipLink = ResolveUrl("~/bvadmin/orders/ShipOrder.aspx?id=" + o.bvin); switch (o.ShippingStatus) { case OrderShippingStatus.FullyShipped: shipImage = ResolveUrl("~/BVAdmin/Images/Lights/ShippingShipped.gif"); break; case OrderShippingStatus.NonShipping: shipImage = ResolveUrl("~/BVAdmin/Images/Lights/ShippingNone.gif"); break; case OrderShippingStatus.PartiallyShipped: shipImage = ResolveUrl("~/BVAdmin/Images/Lights/ShippingPartially.gif"); break; case OrderShippingStatus.Unknown: shipImage = ResolveUrl("~/BVAdmin/Images/Lights/ShippingNone.gif"); break; case OrderShippingStatus.Unshipped: shipImage = ResolveUrl("~/BVAdmin/Images/Lights/ShippingNone.gif"); break; } sb.Append("<td><a href=\"" + shipLink + "\" title=\"" + shipText + "\"><img src=\"" + shipImage + "\" alt=\"" + shipText + "\" /></a></td>"); ManagerPage pageType = ManagerPage.Any; string statImage = ""; switch (o.StatusCode) { case OrderStatusCode.Completed: statImage = ResolveUrl("~/bvadmin/images/lights/OrderComplete.gif"); break; case OrderStatusCode.Received: statImage = ResolveUrl("~/bvadmin/images/lights/OrderInProcess.gif"); break; case OrderStatusCode.OnHold: statImage = ResolveUrl("~/bvadmin/images/lights/OrderOnHold.gif"); break; case OrderStatusCode.ReadyForPayment: pageType = ManagerPage.Payment; statImage = ResolveUrl("~/bvadmin/images/lights/OrderInProcess.gif"); break; case OrderStatusCode.ReadyForShipping: pageType = ManagerPage.Shipping; statImage = ResolveUrl("~/bvadmin/images/lights/OrderInProcess.gif"); break; default: statImage = ResolveUrl("~/bvadmin/images/lights/OrderInProcess.gif"); break; } sb.Append("<td><a href=\"" + url + "\"><img src=\"" + statImage + "\" alt=\"" + o.StatusName + "\" /> " + o.StatusName + "</a></td>"); switch (pageType) { case ManagerPage.Payment: sb.Append("<td><a href=\"" + payLink + "\"><img src=\"" + ResolveUrl("~/BVAdmin/Images/Buttons/Payment.png") + "\"/></a></td>"); break; case ManagerPage.Shipping: sb.Append("<td><a href=\"" + shipLink + "\"><img src=\"" + ResolveUrl("~/BVAdmin/Images/Buttons/Shipping.png") + "\"/></a></td>"); break; default: sb.Append("<td><a href=\"" + url + "\"><img src=\"" + ResolveUrl("~/BVAdmin/Images/Buttons/Details.png") + "\"/></a></td>"); break; } sb.Append("</tr>"); }
private List <OrderSnapshot> BuildReportData() { var c = new OrderSearchCriteria(); var utcStart = DateRangeField.GetStartDateUtc(HccApp); var utcEnd = DateRangeField.GetEndDateUtc(HccApp); c.StartDateUtc = utcStart; c.EndDateUtc = utcEnd; var orders = HccApp.OrderServices.Orders.FindByCriteria(c); TotalCount = orders.Count; foreach (var o in orders) { TotalSub += o.TotalOrderBeforeDiscounts; TotalDiscounts += o.TotalOrderDiscounts; TotalShip += o.TotalShippingBeforeDiscounts; TotalShipDiscounts += o.TotalShippingDiscounts; TotalHandling += o.TotalHandling; TotalTax += o.TotalTax; TotalGrand += o.TotalGrand; } var i = 0; var month = string.Empty; var monthTotal = 0m; var dayTotal = 0m; var day = string.Empty; if (orders.Count > 0) { var zonedTimeOfOrder = DateHelper.ConvertUtcToStoreTime(HccApp, orders[0].TimeOfOrderUtc); month = string.Concat(zonedTimeOfOrder.Month, ":", zonedTimeOfOrder.Year); day = string.Concat(zonedTimeOfOrder.DayOfYear, ":", zonedTimeOfOrder.Year); while (i <= orders.Count - 1) { var zonedTime = DateHelper.ConvertUtcToStoreTime(HccApp, orders[i].TimeOfOrderUtc); monthTotal = monthTotal + orders[i].TotalGrand; dayTotal = dayTotal + orders[i].TotalGrand; if (string.Concat(zonedTime.DayOfYear, ":", zonedTime.Year) != day) { day = string.Concat(zonedTime.DayOfYear, ":", zonedTime.Year); // we need to insert a day total var order = new OrderSnapshot(); order.OrderNumber = "DayTotal"; order.TotalGrand = dayTotal - orders[i].TotalGrand; dayTotal = orders[i].TotalGrand; orders.Insert(i, order); i += 1; } if (string.Concat(zonedTime.Month, ":", zonedTime.Year) != month) { month = string.Concat(zonedTime.Month, ":", zonedTime.Year); // we need to insert a month total var order = new OrderSnapshot(); order.OrderNumber = "MonthTotal"; order.TotalGrand = monthTotal - orders[i].TotalGrand; monthTotal = orders[i].TotalGrand; orders.Insert(i, order); i += 1; } i += 1; } if (dayTotal > 0) { // we need to insert a day total var order = new OrderSnapshot(); order.OrderNumber = "DayTotal"; order.TotalGrand = dayTotal; orders.Add(order); } if (monthTotal > 0) { var order = new OrderSnapshot(); order.OrderNumber = "MonthTotal"; order.TotalGrand = monthTotal; orders.Add(order); } } return(orders); }
public async Task <bool> SaveOrder(EventUserInfo eventUserInfo, Order aggregate, OrderSnapshot snapshot = null) { if (aggregate.Changes.Any()) { var streamId = aggregate.Id.ToString(); // save all events bool savedEvents = await _eventStore.AppendToStreamAsync(eventUserInfo, streamId, aggregate.Version, aggregate.Changes); // save snapshot if (savedEvents && snapshot != null && _snapshotStore != null) { await SaveOrderSnapshot(snapshot); } return(savedEvents); } return(true); }