/// <summary> /// Метод проверяет, хватает ли остатка товара /// при добавлении указанного количества товара в чек, если хватает, то из /// базы данных вычитается это количество. /// </summary> /// <param name="product">Продукт, остаток которого необходимо проверить.</param> /// <returns>Признак успешности выполнения операции.</returns> public static bool Check(Product product) { try { using (var db = new KassaDBContext()) { var productInDB = db.Product.Where(p => p.Name == product.Name).FirstOrDefault(); //если количество выбранного товара меньше либо равно остатку if (product.Quantity <= productInDB.Quantity) { if (productInDB.Type == 1) //услуги не отслеживаются, только товары { //вычесть количество из остатков в бд productInDB.Quantity -= product.Quantity; db.SaveChanges(); } return(true); } else { MessageBox.Show("Недостаточно товара в наличии!" + $"\nТовар: {productInDB.Name}" + $"\nОстаток: {productInDB.Quantity}"); } } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } return(false); }
/// <summary> /// Метод выводит результат поиска в таблицу формы. /// Если результат поиска равен null выводятся все продукты. /// </summary> /// <param name="products">Массив, содержащий найденные продукты.</param> private void ViewResult(IQueryable <Product> products) { using (var db = new KassaDBContext()) { productsDGV.Rows.Clear(); //если в метод не переданы данные для вывода //то выводится информация о всех товарах if (products == null) { foreach (Product p in db.Product) { productsDGV.Rows.Add(p.Name, p.Quantity, p.Price, p.Discount, p.NDS, p.Row_Summ); if (p.ShelfLife != new DateTime(1901, 1, 1) && p.ShelfLife < DateTime.Now) { productsDGV.Rows[productsDGV.Rows.Count - 1].DefaultCellStyle.BackColor = Color.Red; } } } else { foreach (Product p in products) { productsDGV.Rows.Add(p.Name, p.Quantity, p.Price, p.Discount, p.NDS, p.Row_Summ); if (p.ShelfLife != new DateTime(1901, 1, 1) && p.ShelfLife < DateTime.Now) { productsDGV.Rows[productsDGV.Rows.Count - 1].DefaultCellStyle.BackColor = Color.Red; } } } } }
/// <summary> /// Метод отвечает за восстановление остатков товаров чеков, /// в случае, если они не были отмечены в базе данных, /// как оплаченные. /// </summary> public static void ReconciliationAll() { try { using (var db = new KassaDBContext()) { var receipts = db.Receipt.Where(r => r.Paid == false); foreach (var r in receipts) { if (r.Summa == 0 || new Recovery(r).ShowDialog() == DialogResult.No) { Reconciliation(r); } else { r.Paid = true; } } db.SaveChanges(); } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод обрабатывает ввод текста в textBox. /// Формирует массив значений, подходящих под параметры запроса. /// </summary> /// <param name="sender">Объект, вызвавщий метод.</param> /// <param name="e">Аргументы события.</param> private void searchTB_TextChanged(object sender, EventArgs e) { using (var db = new KassaDBContext()) { //получение продуктов название которых //содержит введённый в поисковую строку текст var products = db.Product.Where(p => p.Name.Contains(searchTB.Text)); ViewResult(products); } }
/// <summary> /// Метод отвечает за поиск отчётов по имени. /// </summary> /// <param name="name">Название отчёта</param> private void NameFilter(string name) { using (var db = new KassaDBContext()) { //получение отчётов название которых //содержит введённый в поисковую строку текст var reports = db.Report.Where(p => p.Name.Contains(name)); ViewResult(reports); } }
/// <summary> /// Метод обрабатывает выбор даты в dateTimePicker. /// Формирует массив значений, сохранённых в выбранную дату. /// </summary> /// <param name="sender">Объект, вызвавщий метод.</param> /// <param name="e">Аргументы события.</param> private void dateSearchDTP_ValueChanged(object sender, EventArgs e) { using (var db = new KassaDBContext()) { //получение отчётов дата добавления которых //равна выбранной дате var reports = db.Report.Where(r => r.Date.Year == dateSearchDTP.Value.Year && r.Date.Month == dateSearchDTP.Value.Month && r.Date.Day == dateSearchDTP.Value.Day && r.Name.Contains(typeCB.SelectedItem.ToString())); ViewResult(reports); } }
/// <summary> /// Метод отвечает сохранение отчётов в базу данных. /// </summary> /// <param name="reportName">Имя отчёта.</param> /// <param name="template">Шаблон отчёта.</param> private void SaveReport(string reportName, string template = null) { //получить статус ккт ExecuteAndHandleError(Driver.FNGetStatus); //получить текст отчёта if (template != null || ExecuteAndHandleError(Driver.FNGetDocumentAsString, true) == 0) { try { using (var db = new KassaDBContext()) { string d = null; //сохранение шаблона //иначе готовый отчёт if (template != null) { d = template; } else if (Driver.StringForPrinting != null) { d = Driver.StringForPrinting; } if (d != null) { byte[] data = Encoding.Default.GetBytes(d);//перевод отчёта в байты Report report = new Report() { Name = reportName, ReportData = data, Date = DateTime.Now }; db.Report.Add(report); //добавление отчёта db.SaveChanges(); //сохранение отчёта GetMessage($"Отчёт \"{reportName}\" сохранён!"); } } } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { GetMessage($"Property: {validationError.PropertyName} Error: {validationError.ErrorMessage}"); } } } } }
/// <summary> /// Конструктор класса. /// Выполняет инициализацию формы и первичное заполнение таблицы товаров /// для восстановления. /// </summary> public Recovery(Receipt receipt) { InitializeComponent(); Receipt = receipt; totalL.Text = string.Format("Итог по чеку: {0:f}", receipt.Summa); using (var db = new KassaDBContext()) { foreach (var purchase in receipt.Purchase) { var product = db.Product.Where(prod => prod.Id == purchase.ProductId).FirstOrDefault(); product.Quantity = purchase.Count; product.Row_Summ = purchase.Summa; Product.RowFromProduct(product, receiptDGV); } } }
/// <summary> /// Метод отвечает за восстановление остатков товара, /// в случае, если чек не был оплачен или товар удалён из чека. /// </summary> /// <param name="id">ID продукта, остаток которого необходимо проверить.</param> /// <param name="count">Количество продукта, которое необходимо восстановить.</param> /// <returns>Признак успешности выполнения операции.</returns> public static bool Recover(int id, int count) { try { using (var db = new KassaDBContext()) { var productInDB = db.Product.Where(p => p.Id == id).FirstOrDefault(); if (productInDB.Type == 1) { //прибавить количество к остаткам в бд productInDB.Quantity += count; db.SaveChanges(); } return(true); } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } return(false); }
/// <summary> /// Метод отвечает за восстановление остатков товаров чека, /// в случае, если товары были добавлены в чек, но не были /// удалены из него до закрытия приложения. /// </summary> /// <param name="receipt">Чек, остатки продуктов /// которого необходимо восстановить.</param> public static void Reconciliation(Receipt receipt) { try { using (var db = new KassaDBContext()) { foreach (Product p in receipt.Products) { Recover(p.Id, p.Quantity); //восстановление остатков товара } if (receipt != null) { //удаление чека из бд db.Receipt.Remove(db.Receipt.Where(r => r.Id == receipt.Id).FirstOrDefault()); db.SaveChanges(); } } } catch (Exception ex) { MessageBox.Show(TextFormat.GetExceptionMessage(ex)); } }
/// <summary> /// Метод выводит результат поиска в таблицу формы. /// Если результат поиска равен null выводятся все отчёты. /// </summary> /// <param name="reports">Массив, содержащий найденные отчёты.</param> private void ViewResult(IQueryable <Report> reports) { using (var db = new KassaDBContext()) { reportsDGV.Rows.Clear(); //если в метод не переданы данные для вывода //то выводится информация о всех отчётах if (reports == null) { foreach (Report p in db.Report) { reportsDGV.Rows.Add(p.Name, p.ReportData, p.Date); } } else { foreach (Report p in reports) { reportsDGV.Rows.Add(p.Name, p.ReportData, p.Date); } } } }
/// <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)); } }