public OrderListViewItem(Order orderInfo, ManagedRate comission)
        {
            m_orderInfo = orderInfo;
            m_productInfo = orderInfo.GetOrderedProduct();
            m_comission = comission;

            m_orderInfo.PropertyChanged += OrderInfoOnPropertyChanged;
        }
        public ChangeAmountWindow(Window owner, Order order)
        {
            m_order = order;
            m_logger = log4net.LogManager.GetLogger("ManagerMainWindow");

            InitializeComponent();
            KeyUp += OnKeyUp;

            textBox1.Text = m_order.Amount.ToString();

            Owner = owner;
        }
Example #3
0
 public void Delete(Order order)
 {
     using (var s = m_dbManger.OpenSession())
     {
         using (var t = s.BeginTransaction())
         {
             s.Delete(order);
             t.Commit();
             DeleteFromCache(order);
         }
     }
 }
Example #4
0
 public void Add(Order order)
 {
     using (var s = m_dbManger.OpenSession())
     {
         using (var t = s.BeginTransaction())
         {
             s.Save(order);
             t.Commit();
             AddToCache(order);
         }
     }
 }
        public CommentCheckWindow(Window owner, string sourceMessage, Customer sender, Order order, Product product, OrderOperation requestedOperation)
        {
            InitializeComponent();

            Owner = owner;
            m_order = order;
            m_requestedOperation = requestedOperation;

            tbOriginalText.IsReadOnly = true;
            tbOriginalText.Text = sourceMessage;
            tbAmount.Text = order.Amount.ToString();
            lblPrice.Content = product.Price.ToString("C", CultureInfo.CurrentCulture);
            lblMin.Content = product.MinAmount.ToString("");
            tbTitle.Text = product.Title;
            lblCustomer.Content = sender.GetFullName();

            switch (requestedOperation)
            {
                case OrderOperation.Add:
                    rbAppendOrder.IsChecked = true;
                    break;
                case OrderOperation.Remove:
                    rbRemovePosition.IsChecked = true;
                    break;
                case OrderOperation.Decrease:
                    rbSkipComment.IsChecked = true;
                    break;
                default:
                    throw new ArgumentOutOfRangeException("requestedOperation");
            }

            if (!String.IsNullOrEmpty(product.ImageFile)
                && System.IO.File.Exists(System.IO.Path.Combine(RegistrySettings.GetInstance().GalleryPath, product.ImageFile)))
            {
                image1.Source =
                    new BitmapImage(new Uri(String.Format("file://{0}",
                        System.IO.Path.Combine(RegistrySettings.GetInstance().GalleryPath, product.ImageFile))));
            }
            else
            {
                // set default image
                image1.Source =
                    new BitmapImage(new Uri("pack://application:,,,/Images/default.png"));
            }
        }
        private void UpdatePhotosInAlbumThreadProc(object sender, DoWorkEventArgs args)
        {
            var worker = sender as BackgroundWorker;
            var album = args.Argument as Album;
            if (album == null) return;

            var vkWraper = new VkObjectsWrapper();
            var photosMgr = new PhotosManager(m_settings.AccessToken);
            var usersMgr = new UsersManager(m_settings.AccessToken);

            var commentsRepo = DbManger.GetInstance().GetCommentsRepository();
            var customersRepo = DbManger.GetInstance().GetCustomersRepository();
            var ordersRepo = DbManger.GetInstance().GetOrderRepository();
            var prodsRepo = DbManger.GetInstance().GetProductRepository();

            var workGroup = vkWraper.GetVkGroupObject(m_settings.WorkGroupId, m_settings.LoggedUserId);
            List<VkPhoto> vkPhotos;
            try
            {
                worker.ReportProgress(0, "Загрузка фотографий альбома");
                vkPhotos = photosMgr.GetAlbumPhotos(vkWraper.GetVkGroupAlbum(workGroup, album.VkId));
            }
            catch (VkMethodInvocationException vkError)
            {
                m_logger.ErrorException(vkError);
                throw new BgWorkerException(vkError.Message);
            }
            catch (Exception e)
            {
                m_logger.ErrorException(e);
                throw new BgWorkerException("Ошибка. Не удалось загрузить фотографии для альбома '" + album.Title + "'");
            }

            int total = vkPhotos.Count;
            for (var n = 0; n < vkPhotos.Count; n++)
            {
                worker.ReportProgress(0, String.Format("Обработка {0} из {1}", (n + 1), total));
                if (vkPhotos[n].CommentsCount == 0) continue;

                Product productInfo = null;
                try
                {
                    var products = prodsRepo.GetByVkId(vkPhotos[n].Id);
                    if (products.Count > 0)
                    {
                        // по этому коду найдены продукты, найдем продукт из текущего альбома
                        productInfo = products.FirstOrDefault(product => product.AlbumId == album.Id);

                        if (productInfo == null)
                        {
                            // продукты с таким кодом есть, но они не в этом альбоме -> скопируем любую (первую) запись
                            var p = products[0].CopyToAlbum(album);
                            prodsRepo.Add(p);
                            productInfo = p;

                            m_logger.DebugFormat("Создан дубликат продукта '{0}' с ID={1}", p.Title, p.Id);
                        }
                    }
                }
                catch (Exception exception)
                {
                    m_logger.ErrorException(exception);
                    throw new BgWorkerException("Ошибка. Не удалось загрузить описание продукта из БД.");
                }

                #region Добавление нового продукта в репозиторий если productInfo = null
                if (productInfo == null)
                {
                    // добавим продукт в репозиторий
                    productInfo = new Product
                    {
                        AlbumId = album.Id,
                        VkId = vkPhotos[n].Id,
                        MinAmount = 1
                    };

                    #region если есть url к изображению, надо его закачать
                    if (!String.IsNullOrEmpty(vkPhotos[n].SourceUrl))
                    {
                        var name = String.Format("{0}_{1}", album.VkId, vkPhotos[n].Id);
                        var imgExtensions = new List<string> { ".jpg", ".png", ".gif", ".bmp" };
                        foreach (string imgExtension in imgExtensions)
                        {
                            if (!vkPhotos[n].SourceUrl.EndsWith(imgExtension)) continue;
                            name += imgExtension;
                            break;
                        }
                        var remoteFile = new FileDownloader(new Uri(vkPhotos[n].SourceUrl));
                        try
                        {
                            var file = System.IO.Path.Combine(m_settings.GalleryPath, name);
                            remoteFile.DownloadTo(file);
                            productInfo.ImageFile = name;
                        }
                        catch (Exception)
                        {

                        }
                    }
                    #endregion

                    // парсинг описания
                    productInfo.ParsePhotoDescription(vkPhotos[n].Text);

                    // проверка пользователем
                    var dialogResult = ProductCheckWindow.Result.Ignore;
                    var sourceText = vkPhotos[n].Text;
                    var handler = Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                                         new Action(() =>
                                                             {
                                                                 var f = new ProductCheckWindow(this, productInfo,
                                                                                                sourceText);
                                                             f.ShowDialog();
                                                             dialogResult = f.GetResult();
                                                         }));
                    handler.Wait();

                    if (dialogResult == ProductCheckWindow.Result.Break)
                    {
                        break;
                    }
                    else if (dialogResult == ProductCheckWindow.Result.Accept)
                    {
                        try
                        {
                            prodsRepo.Add(productInfo);
                        }
                        catch (Exception e)
                        {
                            m_logger.ErrorException(e);
                            throw new BgWorkerException("Ошибка. Не удалось сохранить информацию о товаре.");
                        }
                    }
                }
                #endregion

                // загрузить комменты к этой фотографии
                List<VkComment> vkComments;
                try
                {
                    vkComments = photosMgr.GetPhotoComments(vkPhotos[n]);
                }
                catch (VkMethodInvocationException vkError)
                {
                    m_logger.ErrorException(vkError);
                    throw new BgWorkerException(vkError.Message);
                }
                catch (Exception exception)
                {
                    m_logger.ErrorException(exception);
                    throw new BgWorkerException("Не удалось получить комментарии к фото.");
                }

                foreach (VkComment vkComment in vkComments)
                {
                    // создание объекта хранимого комментария
                    var parsedComment = new ParsedComment
                    {
                        ParsingDate = DateTime.Now,
                        VkId = vkComment.Id,
                        ProductId = productInfo.Id
                    };

                    try
                    {
                        // проверка, не обрабатывался ли этот комментарий раньше
                        if (commentsRepo.Contains(parsedComment)) continue;
                    }
                    catch (Exception exception)
                    {
                        m_logger.ErrorException(exception);
                        throw new BgWorkerException("Ошибка: Не удалось получить данные из БД.");
                    }

                    // поиск юзера оставившего этот комментарий
                    Customer customer;
                    try
                    {
                        customer = customersRepo.GetByVkId(vkComment.SenderId);
                    }
                    catch (Exception exception)
                    {
                        m_logger.ErrorException(exception);
                        throw new BgWorkerException("Не удалось получить информацию о пользователе из БД!");
                    }

                    #region заведение заказчика в базе
                    if (customer == null)
                    {
                        // если нашего заказчика нет в базе, значит он заказывает первый раз - добавим его в базу
                        VkUser vkUser;
                        try
                        {
                            // скачиваем инфо из Вконтакте
                            vkUser = usersMgr.GetUserById(vkComment.SenderId);
                        }
                        catch (Exception exception)
                        {
                            m_logger.ErrorException(exception);
                            throw new BgWorkerException("Не удалось получить информацию о пользователе из Вконтакте.");
                        }
                        customer = new Customer
                        {
                            FirstName = vkUser.FirstName,
                            LastName = vkUser.LastName,
                            VkId = vkUser.Id,
                        };
                        try
                        {
                            customersRepo.Add(customer);
                        }
                        catch (Exception exception)
                        {
                            m_logger.ErrorException(exception);
                            throw new BgWorkerException("Ошибка. Не удалось сохранить информацию в БД.");
                        }

                        DispatcherOperation h = Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
                        {
                            var f = new CustomerEditWindow(this, customer);
                            f.ShowDialog();
                        }));
                        h.Wait();
                    }

                    #endregion

                    parsedComment.Message = vkComment.Message;
                    parsedComment.SenderName = customer.GetFullName();
                    parsedComment.PostingDate = vkComment.Date.ToString();

                    // начальная инициализация
                    var orderObj = new Order
                    {
                        ProductId = productInfo.Id,
                        CustomerId = customer.Id,
                        Comment = "",
                        Date = vkComment.Date,
                        Amount = 0
                    };
                    var requestedOperation = OrderOperation.Add;

                    #region парсинг текста комментария

                    /*
                     * ищем чтото типа "+N", "-N"
                     * */
                    var msg = vkComment.Message;
                    for (var i = 0; i < msg.Length; i++)
                    {
                        if (!Char.IsDigit(msg[i]) && msg[i] != '-' && msg[i] != '+' && msg[i] != ' ')
                        {
                            msg = msg.Replace(msg[i], ' ');
                        }
                    }
                    msg = msg.Replace(" ", "");
                    if (msg.Length > 0) // если чтото осталось от сообщения
                    {
                        if (msg[0] == '+')
                        {
                            // добавляем чтото к заказу
                            requestedOperation = OrderOperation.Add;
                            for (int i = 0; i < msg.Length; i++)
                            {
                                if (!Char.IsDigit(msg[i]) && msg[i] != ' ')
                                {
                                    msg = msg.Replace(msg[i], ' ');
                                }
                                msg = msg.Replace(" ", "");
                            }

                            if (msg.Length > 0)
                            {
                                try
                                {
                                    orderObj.Amount = Int32.Parse(msg);
                                }
                                catch (Exception)
                                {
                                    orderObj.Amount = 0;
                                }
                            }
                        }
                        else if (msg[0] == '-')
                        {
                            requestedOperation = OrderOperation.Remove;
                            for (int i = 0; i < msg.Length; i++)
                            {
                                if (!Char.IsDigit(msg[i]) && msg[i] != ' ')
                                {
                                    msg = msg.Replace(msg[i], ' ');
                                }
                                msg = msg.Replace(" ", "");
                            }
                            if (msg.Length > 0)
                            {
                                try{orderObj.Amount = Int32.Parse(msg);}
                                catch (Exception)
                                {
                                    orderObj.Amount = 0;
                                }
                            }
                        }
                    }

                    #endregion

                    // открыть форму проверки комметнария
                    var dialogResult = CommentCheckWindow.Result.Reject;
                    var resultAction = OrderOperation.Add;
                    msg = vkComment.Message;
                    DispatcherOperation ch = Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
                    {
                        var f = new CommentCheckWindow(this, msg, customer, orderObj, productInfo, requestedOperation);
                        f.ShowDialog();

                        dialogResult = f.GetResult();
                        resultAction = f.GetRequestedOperation();
                    }));
                    ch.Wait();

                    if (dialogResult == CommentCheckWindow.Result.Accept)
                    {
                        // сохранить объект комметария в БД
                        try
                        {
                            commentsRepo.Add(parsedComment);
                            orderObj.InitialVkCommentId = parsedComment.Id;
                        }
                        catch (Exception exception)
                        {
                            m_logger.ErrorException(exception);
                            throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                        }

                        if (resultAction == OrderOperation.Add)
                        {
                            #region сохранить заказ в БД или добавить к существующему
                            List<Order> personOrders;
                            try
                            {
                                personOrders = ordersRepo.GetOrdersForCustomerFromAlbum(customer, album);
                            }
                            catch (Exception exception)
                            {
                                m_logger.ErrorException(exception);
                                throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                            }
                            var storedOrder = personOrders.FirstOrDefault(t => t.ProductId == orderObj.ProductId);
                            if (storedOrder == null)
                            {
                                try
                                {
                                    ordersRepo.Add(orderObj);
                                }
                                catch (Exception exception)
                                {
                                    m_logger.ErrorException(exception);
                                    throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                                }
                            }
                            else
                            {
                                storedOrder.Amount += orderObj.Amount;
                                if(!String.IsNullOrEmpty(orderObj.Comment))
                                    storedOrder.Comment += String.Format("; {0}", orderObj.Comment);

                                try
                                {
                                    ordersRepo.Update(storedOrder);
                                }
                                catch (Exception exception)
                                {
                                    m_logger.ErrorException(exception);
                                    throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                                }
                            }

                            #endregion
                        }
                        else if (resultAction == OrderOperation.Remove)
                        {
                            #region удалить в БД из заказов все что связано с этим товаром у этого заказчика

                            List<Order> personOrders;
                            try
                            {
                                personOrders = ordersRepo.GetOrdersForCustomerFromAlbum(customer, album);
                            }
                            catch (Exception exception)
                            {
                                m_logger.ErrorException(exception);
                                throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                            }
                            bool clean = true;
                            for (int i = 0; i < personOrders.Count; i++)
                            {
                                if (personOrders[i].ProductId == orderObj.ProductId)
                                {
                                    try
                                    {
                                        ordersRepo.Delete(personOrders[i]);
                                    }
                                    catch (Exception exception)
                                    {
                                        m_logger.ErrorException(exception);
                                        clean = false;
                                    }
                                }
                            }
                            if (!clean)
                            {
                                throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                            }

                            #endregion
                        }
                        else if (resultAction == OrderOperation.Decrease)
                        {
                            #region уменьшить кол-во заказаного товара в позиции

                            List<Order> personOrders;
                            try
                            {
                                personOrders = ordersRepo.GetOrdersForCustomerFromAlbum(customer, album);
                            }
                            catch (Exception exception)
                            {
                                m_logger.ErrorException(exception);
                                throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                            }
                            var storedOrder = personOrders.FirstOrDefault(t => t.ProductId == orderObj.ProductId);
                            if (storedOrder != null)
                            {
                                storedOrder.Amount -= orderObj.Amount;
                                if (storedOrder.Amount > 0)
                                {
                                    try
                                    {
                                        ordersRepo.Update(storedOrder);
                                    }
                                    catch (Exception exception)
                                    {
                                        m_logger.ErrorException(exception);
                                        throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                                    }
                                }
                                else
                                {
                                    // позиция нулевая, можно удалить
                                    try
                                    {
                                        ordersRepo.Delete(storedOrder);
                                    }
                                    catch (Exception exception)
                                    {
                                        m_logger.ErrorException(exception);
                                        throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена");
                                    }
                                }
                            }
                            else
                            {
                                m_logger.DebugFormat("Внимание! Невозможно уменьшить заказ которого нет!");
                            }

                            #endregion
                        }
                        else
                        {
                            // 'Forget' action is skiped too!
                        }
                    }
                }
            }
        }
        private void AddProductsToOrderHandler(List<Product> products)
        {
            var prodsRepo = Core.Repositories.DbManger.GetInstance().GetProductRepository();
            var ordersRepo = Core.Repositories.DbManger.GetInstance().GetOrderRepository();

            foreach (Product product in products)
            {
                // если товар из другого альбома, надо создать копию в текущем
                var prodObj = product;
                if (product.AlbumId != m_album.Id)
                {
                    prodObj = product.CopyToAlbum(m_album);
                    try
                    {
                        prodsRepo.Add(prodObj);
                    }
                    catch (Exception exception)
                    {
                        //todo: log exception
                        continue;
                    }
                }
                // еще не забыть проверить, если этот товар уже есть в этом заказе
                var savedOrder = m_orders.FirstOrDefault(order => order.ProductId == prodObj.Id);
                if (savedOrder == null)
                {
                    savedOrder = new Order
                        {
                            Amount = 1,
                            ProductId = prodObj.Id,
                            InitialVkCommentId = 0,
                            Date = DateTime.Now,
                            CustomerId = m_customer.Id,
                            Comment = ""
                        };
                    try
                    {
                        ordersRepo.Add(savedOrder);
                        m_orders.Add(savedOrder);
                    }
                    catch (Exception exception)
                    {
                        //todo: log exception
                        continue;
                    }
                }
                else
                {
                    //todo: handle case where appended product is in list
                    // skip ???
                }
            }

            this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(FillOrdersTable));
        }
 public ProductCustomerListViewItem(Order orderInfo, Customer customerInfo)
 {
     m_customerInfo = customerInfo;
     m_orderInfo = orderInfo;
     m_orderInfo.PropertyChanged += OrderInfoOnPropertyChanged;
 }
        private void btnAddCutomerToProductClickHandler(object sender, RoutedEventArgs e)
        {
            var f = new CustomersSelectionWindow(this);
            f.ShowDialog();
            var selectedCustomer = f.GetSelectedCustomer();
            if (selectedCustomer == null)
            {
                //this.ShowError("Необходимо выбрать минимум одного покупателя из списка.");
                return;
            }
            var order = new Order
                        {
                            Amount = 0,
                            CustomerId = selectedCustomer.Id,
                            Date = DateTime.Now,
                            InitialVkCommentId = 0,
                            ProductId = m_product.Id,
                            Comment = ""
                        };
            var caw = new ChangeAmountWindow(this, order);
            caw.ShowDialog();

            m_bgworker = new BackgroundWorker();
            m_bgworker.DoWork += (o, args) =>
                {
                    var ord = args.Argument as Order;
                    var ordersRepo = Core.Repositories.DbManger.GetInstance().GetOrderRepository();
                    try
                    {
                        var allProductOrders = ordersRepo.GetOrdersForProduct(m_product);
                        if (allProductOrders.Any(productOrder => productOrder.CustomerId == ord.CustomerId))
                        {
                            throw new BgWorkerException("Указанный покупатель уже заказывал данный товар!");
                        }
                    }
                    catch (BgWorkerException)
                    {
                        throw;
                    }
                    catch (Exception)
                    {
                        throw new BgWorkerException("Не удалось получить данные из БД");
                    }
                    try
                    {
                        ordersRepo.Add(order);
                    }
                    catch (Exception)
                    {
                        throw new BgWorkerException("Не удалось сохранить информацию о заказе в БД");
                    }

                    args.Result = new ProductCustomerListViewItem(order, selectedCustomer);
                };
            m_bgworker.RunWorkerCompleted += (o, args) =>
                {
                    if (args.Error != null)
                    {
                        this.ShowError(args.Error.Message);
                        return;
                    }
                    var item = (ProductCustomerListViewItem) args.Result;
                    m_lvi.OrderedAmount += item.SourceOrderInfo.Amount;
                    lvOrderItems.Items.Add(item);
                };

            m_bgworker.RunWorkerAsync(order);
        }
Example #10
0
 private void UpdateInCache(Order o)
 {
     if (s_idToOrderCache.ContainsKey(o.Id)) s_idToOrderCache[o.Id] = o;
 }
Example #11
0
 private void DeleteFromCache(Order o)
 {
     if (s_idToOrderCache.ContainsKey(o.Id)) s_idToOrderCache.Remove(o.Id);
 }
Example #12
0
 private void AddToCache(Order o)
 {
     if (!s_idToOrderCache.ContainsKey(o.Id)) s_idToOrderCache.Add(o.Id, o);
 }
Example #13
0
 public void Update(Order order)
 {
     using (var s = m_dbManger.OpenSession())
     {
         using (var t = s.BeginTransaction())
         {
             s.Update(order);
             t.Commit();
             UpdateInCache(order);
         }
     }
 }