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; }
public void Delete(Order order) { using (var s = m_dbManger.OpenSession()) { using (var t = s.BeginTransaction()) { s.Delete(order); t.Commit(); DeleteFromCache(order); } } }
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); }
private void UpdateInCache(Order o) { if (s_idToOrderCache.ContainsKey(o.Id)) s_idToOrderCache[o.Id] = o; }
private void DeleteFromCache(Order o) { if (s_idToOrderCache.ContainsKey(o.Id)) s_idToOrderCache.Remove(o.Id); }
private void AddToCache(Order o) { if (!s_idToOrderCache.ContainsKey(o.Id)) s_idToOrderCache.Add(o.Id, o); }
public void Update(Order order) { using (var s = m_dbManger.OpenSession()) { using (var t = s.BeginTransaction()) { s.Update(order); t.Commit(); UpdateInCache(order); } } }