private void DisplayTickets()
 {
     if (ShowTickets && Customer.Order.Seats.Count < 10)
     {
         Application.Current.Dispatcher.Invoke((Action) delegate
         {
             foreach (Seat seat in Customer.Order.Seats)
             {
                 MemoryStream ms = GetTicketImage(Customer.Order.Id, seat.Id, 1);
                 if (ms != null)
                 {
                     Spot spot = SelectedSpots.FirstOrDefault(x => x.Id == seat.Id);
                     if (spot != null)
                     {
                         BitmapImage bi = new BitmapImage();
                         bi.BeginInit();
                         bi.StreamSource = ms;
                         bi.EndInit();
                         spot.TicketImage = bi;
                     }
                 }
             }
         });
     }
 }
        /// <summary>
        /// Handles PurchaseOrder button on OrderWindow
        /// </summary>
        private void OnPurchaseOrder()
        {
            PaymentTypeBox ptb    = new PaymentTypeBox();
            bool?          result = ptb.ShowDialog();

            if (result ?? false)
            {
                BlankStatus = String.Empty;

                Customer.Order.Seats = new List <Seat>();
                foreach (Ticket t in Tickets)
                {
                    Seat seat = new Seat()
                    {
                        Id = t.Id
                    };
                    Customer.Order.Seats.Add(seat);
                }

                Customer.Order.PaymentType =
                    (PaymentType)Enum.Parse(typeof(PaymentType), SelectedPaymentType.Key.ToString(), true);

                Customer.Order = Customer.Order = Access.ConfirmPayment(Customer.Order);
                ReloadOrder();

                if (Customer.Order != null && Customer.Order.Status == ItemStatus.Sold)
                {
                    if (ShowTickets && Customer.Order.Seats.Count < 10)
                    {
                        Application.Current.Dispatcher.Invoke((Action) delegate
                        {
                            foreach (Seat seat in Customer.Order.Seats)
                            {
                                MemoryStream ms = GetTicketImage(Customer.Order.Id, seat.Id, 1);
                                if (ms != null)
                                {
                                    Spot spot = SelectedSpots.FirstOrDefault(x => x.Id == seat.Id);
                                    if (spot != null)
                                    {
                                        BitmapImage bi = new BitmapImage();
                                        bi.BeginInit();
                                        bi.StreamSource = ms;
                                        bi.EndInit();
                                        spot.TicketImage = bi;
                                    }
                                }
                            }
                        });
                    }
                }
                else
                {
                    Customer.Order  = new Order(); // Just not to be null
                    OperationResult = String.Format("Произошла ошибка. Заказ № {0} не оплачен", Customer.Order.Id);
                }
            }
        }
 /// <summary>
 /// Keeps SelectedSpots updated
 /// </summary>
 private void PersistSelectedSpots(List <Seat> seats)
 {
     foreach (Seat seat in seats)
     {
         Spot spot = SelectedSpots.FirstOrDefault(x => x.Id == seat.Id);
         if (spot != null)
         {
             spot.Status      = seat.Status;
             spot.Result      = seat.Result;
             spot.ReserveDate = seat.ReserveDate;
         }
     }
 }
        private void OnClearSelection()
        {
            SelectedSpots.Clear();
            foreach (Spot spot in Spots)
            {
                spot.IsSelected = false;
                spot.Height     = 20;
                spot.Width      = 20;

                //if (spot.IsSelected)
                //{
                //    spot.IsSelected = false;
                //    spot.Height = 20;
                //    spot.Width = 20;
                //}
            }
        }
 private void OnRemoveSpot()
 {
     if (SelectedSpot != null)
     {
         Spot spot = SelectedSpot;
         SelectedSpots.Remove(spot);
         foreach (Spot s in Spots)
         {
             if (s.Id == spot.Id)
             {
                 s.IsSelected = false;
                 s.Width      = 20;
                 s.Height     = 20;
             }
         }
     }
 }
        private void OnRemoveTicket()
        {
            Spot            spot = SelectedSpot;
            ConfirmationBox cb   = new ConfirmationBox
            {
                Message =
                    String.Format(
                        "Вы действительно желаете удалить билет № {0}, {1}, {2}, {3} ряд, {4} место из списка билетов заказа?",
                        spot.Id, spot.SideName, spot.SectorName, spot.RowNum, spot.SeatNum)
            };


            bool?result = cb.ShowDialog();

            if (result ?? false)
            {
                //First we cancel ticket in the order
                Customer.Order.Seats = new List <Seat> {
                    new Seat()
                    {
                        Id = spot.Id
                    }
                };
                Customer.Order = Data.Access.Cancel(Customer.Order);

                // Then we remove a seat from selected seats collection
                SelectedSpots.Remove(spot);
                // and mark spot as unselected on the map
                foreach (Spot s in Spots)
                {
                    if (s.Id == spot.Id)
                    {
                        s.IsSelected = false;
                        s.Width      = 20;
                        s.Height     = 20;
                    }
                }

                // At last we again lock seats
                if (SelectedSpots.Count > 0)
                {
                    LockSeats(SelectedSpots.ToArray());
                }
            }
        }
        /// <summary>
        /// Handles CreateOrder button event and open PurchaseView in wizard
        /// </summary>
        private void OnCreateOrder()
        {
            Logger.Default.Append("OnCreateOrder Begin");
            InitCustomer();

            _worker         = new BackgroundWorker();
            _worker.DoWork += delegate
            {
                WizardProgressVisibility = Visibility.Visible;

                Customer.Order = Access.CreateOrder(Customer);

                if (Customer.Order != null)
                {
                    PersistSelectedSpots(Customer.Order.Seats);

                    OrderPrice = SelectedSpots.Where(x => x.Result == Core.OperationResult.Success).Sum(x => x.Price);

                    StatusText = OperationResult = String.Format("Заказ № {0} создан. Сумма заказа: {1}", Customer.Order.Id, OrderPrice.ToString("C"));

                    if (_wizardWindow != null)
                    {
                        WizardTitle   = "Оплата заказа";
                        ContentWindow = new PurchaseViewModel(Instance);
                    }

                    _wisardStep = WisardStep.OrderCreated;
                }
                else
                {
                    StatusText = OperationResult = "Произошла ошибка. Места не зарезервированы";
                }
            };
            _worker.RunWorkerCompleted += delegate
            {
                WizardProgressVisibility = Visibility.Collapsed;
            };
            _worker.RunWorkerAsync();

            Logger.Default.Append("OnCreateOrder End");
        }
        /// <summary>
        /// Closes wizard
        /// </summary>
        private void OnCloseWizard()
        {
            if (_wisardStep == WisardStep.Locked)
            {
                _worker     = null;
                _wisardStep = WisardStep.None;
                _wizardWindow.Close();
                ReleaseSeats(SelectedSpots.ToArray());
                OnSpotsChanged();
                StatusText = String.Empty;
            }

            if (_wisardStep == WisardStep.OrderCreated)
            {
                _worker     = null;
                _wisardStep = WisardStep.None;
                _wizardWindow.Close();
                OnSpotsChanged();
                StatusText = String.Empty;
            }

            if (_wisardStep == WisardStep.OrderPaid)
            {
                _worker     = null;
                _wisardStep = WisardStep.None;
                _wizardWindow.Close();
                OnSpotsChanged();
                StatusText = String.Empty;
            }

            if (_wisardStep == WisardStep.Printed)
            {
                _worker     = null;
                _wisardStep = WisardStep.None;
                _wizardWindow.Close();
                OnSpotsChanged();
                StatusText = String.Empty;
            }

            _wizardWindow = null;
        }
        private void OnRemoveSeat()
        {
            if (SelectedSpot != null)
            {
                Spot            spot = SelectedSpot;
                ConfirmationBox cb   = new ConfirmationBox
                {
                    Message = String.Format(
                        "Вы действительно желаете удалить место № {0}, {1}, {2}, {3} ряд, {4} место из списка выбранных мест?",
                        spot.Id, spot.SideName, spot.SectorName, spot.RowNum, spot.SeatNum)
                };
                bool?result = cb.ShowDialog();
                if (result ?? false)
                {
                    // First we release all the selected seats
                    List <Seat> seats = ReleaseSeats(SelectedSpots.ToArray());
                    if (seats != null)
                    {
                        // Then we remove a seat from selected seats collection
                        SelectedSpots.Remove(spot);
                        // and mark spot as unselected on the map
                        foreach (Spot s in Spots)
                        {
                            if (s.Id == spot.Id)
                            {
                                s.IsSelected = false;
                                s.Width      = 20;
                                s.Height     = 20;
                            }
                        }

                        // At last we again lock seats
                        if (SelectedSpots.Count > 0)
                        {
                            LockSeats(SelectedSpots.ToArray());
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Opens wizard window with ReserveSeats view
        /// Locks selected seats
        /// </summary>
        private void OnReserveSeats()
        {
            if (_wizardWindow == null)
            {
                WizardTitle   = "Создать заказ";
                FirstName     = String.Empty;
                MiddleName    = String.Empty;
                LastName      = String.Empty;
                CustomerEmail = String.Empty;
                CustomerPhone = String.Empty;
                SendSms       = false;

                LockSeats(SelectedSpots.ToArray());
                _wisardStep = WisardStep.Locked;

                _wizardWindow = new WizardWindow {
                    Owner = MetroWindow
                };

                ContentWindow = new ReserveViewModel(Instance);
                _wizardWindow.ShowDialog();
            }
        }
        /// <summary>
        /// Locks seats
        /// </summary>
        private void LockSeats(Spot[] spots)
        {
            List <Seat> seats = new List <Seat>();

            foreach (Spot spot in spots)
            {
                Seat seat = new Seat();
                seat.Id          = spot.Id;
                seat.ReserveDate = ReserveDate;
                seats.Add(seat);
            }

            List <Seat> lockedSeats = Data.Access.LockSeats(seats);

            if (lockedSeats != null)
            {
                HashSet <int> writerIds = new HashSet <int>(lockedSeats.Select(x => x.Id));
                seats.RemoveAll(x => writerIds.Contains(x.Id));

                foreach (Seat s in seats)
                {
                    SelectedSpots.Remove(SelectedSpots.Single(i => i.Id == s.Id));
                    Spots.Remove(Spots.Single(i => i.Id == s.Id));
                }

                int     counter = 0;
                decimal price   = 0;
                foreach (Spot spot in SelectedSpots)
                {
                    counter++;
                    price      += spot.Price;
                    spot.ItemId = counter;
                }
                StatusText      = String.Format("Удерживается {0} мест на сумму {1}", SeatsCount.ToString("### ##0"), SeatsAmount.ToString("C0"));
                OperationResult = String.Format("Выбрано мест {0} на сумму {1}", counter, price.ToString("C"));
            }
        }
 /// <summary>
 /// Handles PrintTickets button event and prints tickets
 /// </summary>
 private void OnPrintTickets()
 {
     ProcessPrint(SelectedSpots.ToList());
 }
        /// <summary>
        /// Handles PayOrder button event and open PrintView in wizard
        /// </summary>
        private void OnPayOrder()
        {
            BlankStatus = String.Empty;
            // if View called from orders
            if (Customer.Order.Seats == null)
            {
                Customer.Order.Seats = new List <Seat>();
                foreach (Ticket t in Tickets)
                {
                    Seat seat = new Seat()
                    {
                        Id = t.Id
                    };
                    Customer.Order.Seats.Add(seat);
                }
            }

            Customer.Order.PaymentType =
                (PaymentType)Enum.Parse(typeof(PaymentType), SelectedPaymentType.Key.ToString(), true);

            _worker         = new BackgroundWorker();
            _worker.DoWork += delegate
            {
                WizardProgressVisibility = Visibility.Visible;

                Customer.Order = Access.ConfirmPayment(Customer.Order);

                if (Customer.Order != null && Customer.Order.Status == ItemStatus.Sold)
                {
                    Blank[] blanks = Access.GetBlanks(0, Customer.Order.ItemsCount, ItemStatus.OnSale);

                    if (blanks != null)
                    {
                        if (blanks.Length != Customer.Order.ItemsCount)
                        {
                            BlankStatus = "Количество бланков недостаточно для печати заказа";
                        }
                    }
                    else
                    {
                        BlankStatus = "У вас отсутствуют бланки";
                    }

                    for (int i = 0; i < Customer.Order.Seats.Count; i++)
                    {
                        Seat seat = Customer.Order.Seats[i];
                        Spot spot = SelectedSpots.FirstOrDefault(x => x.Id == seat.Id);
                        if (spot != null)
                        {
                            spot.Status = seat.Status;
                            //spot.Result = seat.Result;
                            spot.ReserveDate = seat.ReserveDate;
                            if (blanks != null && blanks.Length > i)
                            {
                                spot.Blank = blanks[i];
                            }
                        }
                    }

                    //PersistSelectedSpots(Customer.Order.Seats);
                    StatusText          =
                        OperationResult =
                            String.Format("Заказ № {0} оплачен. Сумма заказа: {1}", Customer.Order.Id,
                                          OrderPrice.ToString("C"));

                    if (_wizardWindow != null)
                    {
                        WizardTitle   = "Печать заказа";
                        ContentWindow = new PrintViewModel(Instance);
                    }

                    _wisardStep = WisardStep.OrderPaid;

                    DisplayTickets();
                }
                else
                {
                    Customer.Order      = new Order(); // Just not to be null
                    StatusText          =
                        OperationResult = String.Format("Произошла ошибка. Заказ № {0} не оплачен", Customer.Order.Id);
                }
            };
            _worker.RunWorkerCompleted += delegate
            {
                WizardProgressVisibility = Visibility.Collapsed;
            };
            _worker.RunWorkerAsync();
        }