/// <summary> /// Метод формирует объект класса Product из строки DataGridView. /// </summary> /// <param name="row">Строка с данными.</param> /// <param name="receipt">Текущий чек.</param> /// <returns>Сформированный продукт.</returns> public static Product ProductFromRow(DataGridViewRow row, Receipt receipt) { try { Product product; //если продукт уже есть в составе чека if (receipt != null) { product = receipt.Products.Where(p => p.Name == row.Cells["nameCol"].Value.ToString()).FirstOrDefault(); } else { using (var db = new KassaDBContext()) { string name = row.Cells["nameCol"].Value.ToString(); int count = int.Parse(row.Cells["countCol"].Value.ToString()); product = db.Product.Where(p => p.Name == name).FirstOrDefault(); product.Quantity = count; product.RowSummCalculate(); } } return(product); } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); return(null); } }
/// <summary> /// Метод формирует строку DataGridView из объекта класса Product. /// </summary> /// <param name="product">Продукт из которого будет сформирована строка.</param> /// <param name="dgv">DataGridView в который будет добавлена строка.</param> public static void RowFromProduct(Product product, DataGridView dgv) { try { dgv.Rows.Add(product.Name, product.Quantity, product.Price, product.Discount, product.NDS, product.Row_Summ); } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод обрабатывает нажатие кнопки Ввод. /// Отвечает за проверку корректности и сохранение изменённых данных. /// </summary> /// <param name="sender">Объект, вызвавщий метод.</param> /// <param name="e">Аргументы события.</param> private void addProductB_Click(object sender, EventArgs e) { try { using (var db = new KassaDBContext()) { if (countNUD.Value != 0 && discountTB.Text != "") { //создание продукта с изменёнными данными Product product = new Product() { Id = OldProduct.Id, Name = OldProduct.Name, Quantity = (int)countNUD.Value, Price = OldProduct.Price, Discount = double.Parse(discountTB.Text), NDS = OldProduct.NDS, Department = (int)departmentNUD.Value, Type = OldProduct.Type }; product.RowSummCalculate(); product.Quantity -= OldProduct.Quantity; //если изменённое количесвто не превышает остаток if (CountController.Check(product)) { product.Quantity += OldProduct.Quantity; //изменение данных на форме Main int index = ((Main)Owner).receipt.Products.IndexOf( ((Main)Owner).receipt.Products.Where(p => p.Name == product.Name).FirstOrDefault()); ((Main)Owner).receipt.Products[index] = product; ((Main)Owner).DGV_Refresh(); //обновление данных в БД в таблице Purchase var oldP = db.Purchase.Where(pur => pur.ProductId == product.Id && pur.ReceiptId == ((Main)Owner).receipt.Id).FirstOrDefault(); oldP.Count = product.Quantity; oldP.Summa = (decimal)product.Row_Summ; db.SaveChanges(); } Close(); } else { MessageBox.Show("Заполните все данные о товаре!"); } } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод остаток товара. /// </summary> /// <returns>Остаток товара.</returns> public int GetBalance() { try { using (var db = new KassaDBContext()) { return(db.Product.Where(p => p.Id == Id).FirstOrDefault().Quantity); } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } return(-1); }
/// <summary> /// Метод отвечает за отметку чека, как оплаченного, в базе данных. /// </summary> private void MarkAsPaid() { try { using (var db = new KassaDBContext()) { var rec = db.Receipt.Where(r => r.Id == CurrentReceipt.Id).FirstOrDefault(); rec.Paid = true; //признак оплаты чека db.SaveChanges(); } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод отвечает сохранение данных по чеку в базе данных. /// </summary> private void InsertData() { try { using (var db = new KassaDBContext()) { var rec = db.Receipt.Where(r => r.Id == CurrentReceipt.Id).FirstOrDefault(); rec.Discount = CurrentReceipt.Discount; //скидка на чек rec.Summa = CurrentReceipt.Summa; //сумма по чеку rec.Payment = CurrentReceipt.Payment; //способ оплаты rec.DiscountCard = CurrentReceipt.DiscountCard; //дк db.SaveChanges(); } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод обрабатывает нажатие кнопки Настройка. /// Устанавливает настройки для фискального регистратора. /// </summary> /// <param name="sender">Объект, вызвавщий метод.</param> /// <param name="e">Аргументы события.</param> private void registrSettingsB_Click(object sender, EventArgs e) { try { var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if (comPortTB.Text != "" && exchangeSpeedTB.Text != "") { config.AppSettings.Settings["ComNumber"].Value = comPortTB.Text; //изменение сом порта config.AppSettings.Settings["BaudRate"].Value = exchangeSpeedTB.Text; // изменение скорости обмена config.Save(); ConfigurationManager.RefreshSection("appSettings"); //сохранение изменений MessageBox.Show("Настройки сохранены!"); } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
private Product OldProduct; //переданная строка для изменения /// <summary> /// Конструктор класса. /// Выполняет инициализацию формы и заполнение данных для редактирования. /// </summary> /// <param name="row">Строка, которую надо изменить.</param> public EditProduct(DataGridViewRow row) { InitializeComponent(); OldProduct = Product.ProductFromRow(row, null); try { if (OldProduct != null) { //установка полученных данных в поля формы receiptDGV.Visible = true; countNUD.Value = OldProduct.Quantity; discountTB.Text = string.Format("{0:f}", OldProduct.Discount); receiptDGV.Rows.Add(OldProduct.Name, OldProduct.Quantity, OldProduct.Price, OldProduct.Discount, OldProduct.NDS, OldProduct.Row_Summ); } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод обрабатывает нажатие кнопки Наличные. /// Отвечает за оплату покупки наличными. /// </summary> /// <param name="sender">Объект, вызвавщий метод</param> /// <param name="e">Аргументы события</param> private void cashB_Click(object sender, EventArgs e) { if (decimal.Parse(moneyTB.Text) < CurrentReceipt.Summa) { MessageBox.Show("Вносимая сумма не может быть меньше суммы по чеку!"); return; } try { messageL.Text = "Оплата наличными"; this.Enabled = false; //блокировка формы panel1.Visible = true; //показать панель сообщений using (IFiscalRegistrar fr = CurrentHardware.GetFiscalRegistrar()) { if (fr.CheckConnect() == 0) { messageL.Text = "Печать чека"; CurrentReceipt.Payment = 1; InsertData(); //замена суммы по чеку на сумму вносимых наличных CurrentReceipt.Summa = decimal.Parse(moneyTB.Text); //печать товарного чека if (fr.PrintReceipt(CurrentReceipt) == 0) { messageL.Text = "Успешно"; MarkAsPaid(); Close(); } } } panel1.Visible = false; //убрать панель сообщений this.Enabled = true; //разблокировать форму } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Конструктор класса. /// Выполняет инициализацию формы и установку текущих настроек. /// для восстановления. /// </summary> public Settings() { InitializeComponent(); driverCB.SelectedIndex = 0; var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); try { comPortTB.Text = config.AppSettings.Settings["ComNumber"].Value; exchangeSpeedTB.Text = config.AppSettings.Settings["BaudRate"].Value; if (config.AppSettings.Settings["UsedPassword"].Value == "1") { usePasswordCheckB.Checked = true; } else { usePasswordCheckB.Checked = false; } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод обрабатывает нажатие кнопки Ввод. /// Отвечает за вывод выбранного продукта в таблицу формы Main. /// </summary> /// <param name="sender">Объект, вызвавщий метод.</param> /// <param name="e">Аргументы события.</param> private void enterB_Click(object sender, EventArgs e) { try { using (var db = new KassaDBContext()) { Product product; Purchase purchase; //если продукт выбран if (productsDGV.SelectedRows.Count > 0) { foreach (DataGridViewRow r in productsDGV.SelectedRows) { //формирование продукта из строки DataGridView product = Product.ProductFromRow(r, null); if (product.ShelfLife < DateTime.Now) { if (MessageBox.Show($"Срок годности товара \"{product.Name}\" истёк {product.ShelfLife:dd.MM.yyyy}!\n\n" + $"Действительно добавить товар в чек?", "Предупреждение", MessageBoxButtons.YesNo) == DialogResult.No) { return; } } if (product != null) { product.Quantity = (int)countNUD.Value; product.RowSummCalculate(); //если количество не превышает остаток if (CountController.Check(product)) { bool added = false; //перебор содержимого состава чека на форме Main foreach (Product p in ((Main)Owner).receipt.Products) { //если товар уже добавлен в чек новая позиция не создаётся if (p.Name == product.Name) { if (p.Type == 1)//учитываются только товары, без услуг { //обновляется запись в БД в таблице Purchase var oldP = db.Purchase.Where(pur => pur.ProductId == p.Id && pur.ReceiptId == ((Main)Owner).receipt.Id).FirstOrDefault(); oldP.Count += product.Quantity; oldP.Summa += product.Row_Summ; //к существующей позиции добавляется количество и сумма p.Quantity += product.Quantity; p.Row_Summ += product.Row_Summ; ((Main)Owner).DGV_Refresh(); db.SaveChanges(); } added = true; } } //если товар не добавлен if (!added) { //создаётся новая позиция в чеке ((Main)Owner).receipt.Products.Add(product); ((Main)Owner).DGV_Refresh(); //данные добавляются в БД в таблицу Purchase purchase = new Purchase() { ProductId = product.Id, Count = product.Quantity, Summa = product.Row_Summ, Date = DateTime.Now, ReceiptId = ((Main)Owner).receipt.Id, Receipt = db.Receipt.Where(rec => rec.Id == ((Main)Owner).receipt.Id).FirstOrDefault() }; ((Main)Owner).receipt.Purchase.Add(purchase); db.Purchase.Add(purchase); db.SaveChanges(); } //обновление данных формы ViewResult(null); Close(); } } } } else { MessageBox.Show("Строка не выбрана!"); } } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод обрабатывает нажатие кнопки Банковская карта. /// Отвечает за оплату покупки по банковской карте. /// </summary> /// <param name="sender">Объект, вызвавщий метод</param> /// <param name="e">Аргументы события</param> private void nonCashB_Click(object sender, EventArgs e) { try { messageL.Text = "Идёт процесс оплаты через терминал"; this.Enabled = false; //блокировка формы panel1.Visible = true; //показать панель сообщений using (ITerminal terminal = CurrentHardware.GetTerminal()) { using (IFiscalRegistrar fr = CurrentHardware.GetFiscalRegistrar()) { if (terminal.IsEnabled()) { if (fr.CheckConnect() == 0) { //если оплата через терминал успешна if (terminal.Purchase(CurrentReceipt.Summa) == 0) { messageL.Text = "Оплата успешно!"; terminal.Unconfirmed(); //если печать чека терминала успешна if (terminal.GetReceipt() != null && fr.Print(terminal.GetReceipt(), terminal.GetReceiptName()) == 0) { messageL.Text = "Печать чеков"; CurrentReceipt.Payment = 2; InsertData(); //печать товарного чека if (fr.PrintReceipt(CurrentReceipt, null) == 0) { messageL.Text = "Успешно"; terminal.Confirmed(); MarkAsPaid(); Close(); } else { //???????????????????????? MessageBox.Show("Товарный чек не напечатан! Отмена транзакции."); terminal.CancelTransaction(); } } else { MessageBox.Show("Чек терминала не напечатан! Отмена операции."); terminal.CancelTransaction(); } } } } else { MessageBox.Show("Терминал не подключен! Проверьте подключение и повторите попытку."); } } } panel1.Visible = false; //убрать панель сообщений this.Enabled = true; //разблокировать форму } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }