elfisa-pharmacy/src/ElectronicPharmacy/UserControls/FOrders.cs
Exest e35e67849f v1.0.4: адаптация desktop к текущему buyer API
Перевести desktop-клиент на работу с текущими buyer orders и локальным SQLite-кешем, чтобы отправка заказов и синхронизация документов работали с уже развернутым сервером без старых MSSQL-зависимостей.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 11:41:00 +03:00

981 lines
40 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SQLite;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Elfisa.UI.Controls;
using Электроннаяармация.Classes;
using Электроннаяармация.HelpForms;
namespace Электроннаяармация.UserControls
{
public partial class FOrders : Form
{
public FOrders()
{
InitializeComponent();
}
BindingSource bsOrder = new BindingSource();
string currentSelectOrderType = "tabPageAllOrders";
string filter = string.Empty;
private void FOrders_Load(object sender, EventArgs e)
{
UiThemeHelper.ApplyToControlTree(this);
Tag = "chrome-child";
panelToolbar.Tag = "toolbar";
panelOrdersHeader.Padding = new Padding(8, 14, 8, 6);
dtpDateFrom.Value = DateTime.Now.AddDays(-3);
dtpDateTo.Value = DateTime.Now;
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), string.Empty);
loadSuppliers();
comboSuppliers.Visible = true;
InitOrderToolbar();
loadConsignees();
ApplyToolbarLayout();
ModernButtonStyles.ApplyClear(btnClearGoodSearch);
ModernButtonStyles.ApplyClear(btnClearOrderNumberFilter);
InitializeOrderContextMenu();
label3.BringToFront();
panelToolbar.Resize += (_, __) => ApplyToolbarLayout();
}
private void InitializeOrderContextMenu()
{
if (_ordersMenu != null)
{
return;
}
_getInvoiceMenuItem = new ToolStripMenuItem("Получить накладную");
_getInvoiceMenuItem.Click += (_, __) => RequestInvoiceForSelectedOrder();
_ordersMenu = new ContextMenuStrip();
_ordersMenu.Items.Add(_getInvoiceMenuItem);
_ordersMenu.Opening += OrdersMenu_Opening;
DGVOrders.ContextMenuStrip = _ordersMenu;
}
private void OrdersMenu_Opening(object sender, CancelEventArgs e)
{
var pt = DGVOrders.PointToClient(Cursor.Position);
var hit = DGVOrders.HitTest(pt.X, pt.Y);
if (hit.RowIndex < 0 || hit.RowIndex >= DGVOrders.Rows.Count)
{
e.Cancel = true;
return;
}
DGVOrders.ClearSelection();
DGVOrders.Rows[hit.RowIndex].Selected = true;
if (hit.ColumnIndex >= 0)
{
DGVOrders.CurrentCell = DGVOrders.Rows[hit.RowIndex].Cells[hit.ColumnIndex];
}
var status = DGVOrders.Rows[hit.RowIndex].Cells["Статус"]?.Value?.ToString();
_getInvoiceMenuItem.Enabled = string.Equals(status, "ОТПРАВЛЕН", StringComparison.OrdinalIgnoreCase);
}
private ModernComboBox _comboOrderStatus;
private ModernComboBox _comboConsignees;
private ModernButton _btnSendOrder;
private ContextMenuStrip _ordersMenu;
private ToolStripMenuItem _getInvoiceMenuItem;
private void InitOrderToolbar()
{
_comboOrderStatus = new ModernComboBox
{
Font = new Font("Segoe UI", 11.25f),
Name = "comboOrderStatus"
};
_comboOrderStatus.Items.AddRange(new object[] { "Все статусы", "НОВЫЙ", "ОТПРАВЛЕН" });
_comboOrderStatus.SelectedIndex = 0;
_comboOrderStatus.SelectionChangeCommitted += (_, __) => ApplyOrderFilters();
panelToolbar.Controls.Add(_comboOrderStatus);
_comboConsignees = new ModernComboBox
{
Font = new Font("Segoe UI", 11.25f),
Name = "comboConsigneesFilter"
};
_comboConsignees.SelectionChangeCommitted += (_, __) => ApplyOrderFilters();
panelToolbar.Controls.Add(_comboConsignees);
_btnSendOrder = new ModernButton
{
Text = "ОТПРАВИТЬ",
Name = "btnSendOrder"
};
_btnSendOrder.Click += async (_, __) => await SendSelectedOrderAsync();
panelToolbar.Controls.Add(_btnSendOrder);
UiThemeHelper.ApplyToControlTree(_comboOrderStatus);
UiThemeHelper.ApplyToControlTree(_comboConsignees);
UiThemeHelper.ApplyToControlTree(_btnSendOrder);
}
private static int FitControlWidth(int preferred, int minimum, int available)
{
return Math.Max(minimum, Math.Min(preferred, available));
}
private void ApplyToolbarLayout()
{
const int pad = 12;
const int gap = 8;
const int controlHeight = 32;
const int filterHeight = 33;
const int buttonHeight = 34;
const int rowGap = 10;
const int dateWidth = 112;
const int deleteWidth = 138;
const int sendWidth = 158;
const int clearSize = 32;
const int commentMaxWidth = 200;
const int commentMinWidth = 132;
const int textMinWidth = 108;
const int textPreferredWidth = 220;
const int statusPreferredWidth = 150;
const int supplierPreferredWidth = 170;
const int consigneePreferredWidth = 190;
var panelWidth = Math.Max(panelToolbar.ClientSize.Width, 320);
int y = 10;
int x = pad;
label2.Location = new Point(x, y + 5);
x = label2.Right + 6;
dtpDateFrom.SetBounds(x, y, dateWidth, controlHeight);
x = dtpDateFrom.Right + 6;
label1.Location = new Point(x, y + 4);
x = label1.Right + 6;
dtpDateTo.SetBounds(x, y, dateWidth, controlHeight);
int datesRight = dtpDateTo.Right;
int deleteLeft = panelWidth - pad - deleteWidth;
btnDeleteOrder.SetBounds(deleteLeft, y, deleteWidth, buttonHeight);
int sendLeft = btnDeleteOrder.Left - gap - sendWidth;
_btnSendOrder.SetBounds(sendLeft, y, sendWidth, buttonHeight);
int actionsLeft = _btnSendOrder.Left;
int middleAvailable = actionsLeft - datesRight - gap;
int statusMin = 108;
int supplierMin = 118;
int consigneeMin = 128;
int combosMin = statusMin + supplierMin + consigneeMin + gap * 2;
int combosPreferred = statusPreferredWidth + supplierPreferredWidth + consigneePreferredWidth + gap * 2;
bool wrapCombos = middleAvailable < combosMin;
comboSuppliers.Visible = true;
_comboOrderStatus.Visible = true;
_comboConsignees.Visible = true;
if (wrapCombos)
{
y += buttonHeight + rowGap;
int filterY = y + (buttonHeight - filterHeight) / 2;
int comboRowWidth = panelWidth - pad * 2;
int statusWidth;
int supplierWidth;
int consigneeWidth;
if (comboRowWidth >= combosPreferred)
{
statusWidth = statusPreferredWidth;
supplierWidth = supplierPreferredWidth;
consigneeWidth = consigneePreferredWidth;
}
else
{
float scale = (comboRowWidth - gap * 2) / (float)(statusPreferredWidth + supplierPreferredWidth + consigneePreferredWidth);
statusWidth = Math.Max(statusMin, (int)(statusPreferredWidth * scale));
supplierWidth = Math.Max(supplierMin, (int)(supplierPreferredWidth * scale));
consigneeWidth = Math.Max(consigneeMin, comboRowWidth - statusWidth - supplierWidth - gap * 2);
}
x = pad;
_comboOrderStatus.SetBounds(x, filterY, statusWidth, filterHeight);
x = _comboOrderStatus.Right + gap;
comboSuppliers.SetBounds(x, filterY, supplierWidth, filterHeight);
x = comboSuppliers.Right + gap;
_comboConsignees.SetBounds(x, filterY, consigneeWidth, filterHeight);
y += buttonHeight + rowGap;
}
else
{
int filterY = y + (buttonHeight - filterHeight) / 2;
int statusWidth = statusPreferredWidth;
int supplierWidth = supplierPreferredWidth;
int consigneeWidth = consigneePreferredWidth;
if (middleAvailable < combosPreferred)
{
float scale = middleAvailable / (float)combosPreferred;
statusWidth = Math.Max(statusMin, (int)(statusPreferredWidth * scale));
supplierWidth = Math.Max(supplierMin, (int)(supplierPreferredWidth * scale));
consigneeWidth = Math.Max(consigneeMin, middleAvailable - statusWidth - supplierWidth - gap * 2);
}
int comboRight = actionsLeft - gap;
_comboConsignees.SetBounds(comboRight - consigneeWidth, filterY, consigneeWidth, filterHeight);
comboRight = _comboConsignees.Left - gap;
comboSuppliers.SetBounds(comboRight - supplierWidth, filterY, supplierWidth, filterHeight);
comboRight = comboSuppliers.Left - gap;
_comboOrderStatus.SetBounds(comboRight - statusWidth, filterY, statusWidth, filterHeight);
y += buttonHeight + rowGap;
}
int searchY = y;
int contentWidth = panelWidth - pad * 2;
int fixedControlsWidth = clearSize * 2 + gap * 4 + commentMinWidth;
int textAreaWidth = contentWidth - fixedControlsWidth;
bool wrapComment = textAreaWidth < textMinWidth * 2;
int textWidth;
if (wrapComment)
{
int narrowTextArea = contentWidth - clearSize * 2 - gap * 2;
textWidth = FitControlWidth(textPreferredWidth, textMinWidth, narrowTextArea / 2);
}
else
{
textWidth = textPreferredWidth;
}
int commentWidth = wrapComment
? Math.Min(commentMaxWidth, contentWidth)
: commentMaxWidth;
x = pad;
txtGoodFromOrders.SetBounds(x, searchY, textWidth, controlHeight);
x = txtGoodFromOrders.Right + gap;
btnClearGoodSearch.SetBounds(x, searchY, clearSize, controlHeight);
x = btnClearGoodSearch.Right + gap;
txtOrderNumberFilter.SetBounds(x, searchY, textWidth, controlHeight);
x = txtOrderNumberFilter.Right + gap;
btnClearOrderNumberFilter.SetBounds(x, searchY, clearSize, controlHeight);
x = btnClearOrderNumberFilter.Right + gap;
if (wrapComment)
{
searchY += controlHeight + rowGap;
btnAddComment.SetBounds(pad, searchY, commentWidth, buttonHeight);
y = searchY + buttonHeight;
}
else
{
btnAddComment.SetBounds(x, searchY, commentWidth, buttonHeight);
ModernButtonStyles.FitToText(btnAddComment, buttonHeight);
y = searchY + buttonHeight;
}
ModernButtonStyles.ApplyClear(btnClearGoodSearch);
ModernButtonStyles.ApplyClear(btnClearOrderNumberFilter);
btnClearSuppliers.Visible = false;
panelToolbar.Height = y + pad + 8;
panelToolbar.Padding = new Padding(pad, 10, pad, 14);
}
private void ApplyOrderFilters()
{
var parts = new List<string>();
if (!string.IsNullOrWhiteSpace(filter))
{
parts.Add(filter.Trim());
}
if (comboSuppliers.Visible &&
comboSuppliers.SelectedItem != null &&
comboSuppliers.Text != "Поставщик" &&
!string.IsNullOrWhiteSpace(comboSuppliers.Text))
{
var supplier = comboSuppliers.Text.Replace("'", "''");
parts.Add($"SupplierName = '{supplier}'");
}
if (_comboOrderStatus != null && _comboOrderStatus.SelectedIndex > 0)
{
parts.Add($"OrderState = '{_comboOrderStatus.SelectedItem}'");
}
if (_comboConsignees != null &&
_comboConsignees.SelectedIndex > 0 &&
!string.IsNullOrWhiteSpace(_comboConsignees.Text))
{
var consignee = _comboConsignees.Text.Replace("'", "''");
parts.Add($"ConsigneeName = '{consignee}'");
}
if (_comboConsignees != null &&
_comboConsignees.SelectedIndex > 0 &&
!string.IsNullOrWhiteSpace(_comboConsignees.Text))
{
var consignee = _comboConsignees.Text.Replace("'", "''");
parts.Add($"ConsigneeName = '{consignee}'");
}
var addon = parts.Count == 0 ? string.Empty : " and " + string.Join(" and ", parts);
LoadOrders(
dtpDateFrom.Value.ToString("dd.MM.yyyy"),
dtpDateTo.Value.ToString("dd.MM.yyyy"),
addon);
}
private async Task SendSelectedOrderAsync()
{
if (DGVOrders.Rows.Count == 0 || DGVOrders.SelectedRows.Count == 0)
{
ToastNotification.ShowCustom("Выберите заказ для отправки.", Color.DarkOrange, Color.White);
return;
}
var status = DGVOrders.SelectedRows[0].Cells["Статус"]?.Value?.ToString();
if (status != "НОВЫЙ")
{
ToastNotification.ShowCustom("Отправить можно только заказ со статусом НОВЫЙ.", Color.DarkOrange, Color.White);
return;
}
var orderId = DGVOrders.SelectedRows[0].Cells["ИД заказа"].Value.ToString();
try
{
var sender = new DataSender();
await sender.SendSingleOrderAsync(orderId);
}
catch (Exception ex)
{
AppDebugLog.Error("Orders", $"Не удалось отправить заказ {orderId}", ex);
ToastNotification.ShowError($"Не удалось отправить заказ: {ex.Message}");
}
ApplyOrderFilters();
}
private void RequestInvoiceForSelectedOrder()
{
if (DGVOrders.SelectedRows.Count == 0)
{
ToastNotification.ShowCustom("Выберите отправленный заказ.", Color.DarkOrange, Color.White);
return;
}
var selectedRow = DGVOrders.SelectedRows[0];
var status = selectedRow.Cells["Статус"]?.Value?.ToString();
if (!string.Equals(status, "ОТПРАВЛЕН", StringComparison.OrdinalIgnoreCase))
{
ToastNotification.ShowCustom("Накладную можно получить только для отправленного заказа.", Color.DarkOrange, Color.White);
return;
}
var orderId = selectedRow.Cells["ИД заказа"]?.Value?.ToString();
if (string.IsNullOrWhiteSpace(orderId))
{
ToastNotification.ShowError("Не удалось определить идентификатор заказа.");
return;
}
try
{
var service = new InvoiceSyncService();
service.SyncFromServerAsync().GetAwaiter().GetResult();
ToastNotification.ShowSuccess("Накладные обновлены с сервера.");
var shell = FindForm() as ElectroPharmacy;
shell?.OpenInvoicesTab(orderId);
}
catch (Exception ex)
{
ToastNotification.ShowError($"Не удалось получить накладную: {ex.Message}");
}
}
void LoadOrders(string dateFrom, string dateTo, string filters)
{
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
string qShowMeOrders = $@"
select
[Id_Order],
[OrderNumber],
[OrderDate],
[Id_Supplier],
[SupplierName],
[OrderedCountItems],
[SummaZakaza],
[OrderState],
[Comment],
[ConsigneeName]
from Orders
where
OrderDate >= '{dateFrom}'
and OrderDate <= '{dateTo}'
{filters}
";
using (SQLiteConnection conOrders = new SQLiteConnection(connectionStringToLocalDB))
{
try
{
conOrders.Open();
SQLiteCommand cmdShowMeOrders = new SQLiteCommand(qShowMeOrders, conOrders);
DataTable tableOrders = new DataTable();
SQLiteDataAdapter daOrders = new SQLiteDataAdapter(cmdShowMeOrders);
daOrders.Fill(tableOrders);
tableOrders.Columns[0].ColumnName = "ИД заказа";
tableOrders.Columns[1].ColumnName = "Номер заказа";
tableOrders.Columns[2].ColumnName = "Дата заказа";
tableOrders.Columns[3].ColumnName = "ИД поставщика";
tableOrders.Columns[4].ColumnName = "Поставщик";
tableOrders.Columns[5].ColumnName = "Кол-во наименований";
tableOrders.Columns[6].ColumnName = "Сумма заказа";
tableOrders.Columns[7].ColumnName = "Статус";
tableOrders.Columns[8].ColumnName = "Примечание";
if (tableOrders.Columns.Count > 9)
{
tableOrders.Columns[9].ColumnName = "Грузополучатель";
}
if (tableOrders.Columns.Count > 9)
{
tableOrders.Columns[9].ColumnName = "Грузополучатель";
}
//DGVOrders.DataSource = tableOrders;
bsOrder.DataSource = tableOrders;
DGVOrders.DataSource = bsOrder;
DGVOrders.Font = new Font("Segoe UI", 10f, FontStyle.Regular);
DGVOrders.ColumnHeadersDefaultCellStyle.Font = new Font("Segoe UI Semibold", 10f, FontStyle.Bold);
DGVOrders.DefaultCellStyle.Font = new Font("Segoe UI", 10f, FontStyle.Regular);
DGVOrders.Columns[0].Visible = false;
DGVOrders.Columns[3].Visible = false;
if (DGVOrders.Rows.Count > 0 && DGVOrders.SelectedRows.Count > 0)
{
int rowIndex = DGVOrders.SelectedRows[0].Index;
string idPriceList = DGVOrders.Rows[rowIndex].Cells[0].Value.ToString();
LoadOrderItem(idPriceList);
}
else
{
dgvOrderItems.DataSource = null;
}
}
catch (Exception ex)
{
ToastNotification.ShowError($"Возникла ошибка при загрузке заказов.");
//MessageBox.Show($"Возникла ошибка при загрузке заказов. Текст ошибки:\n{ex.ToString()}", "Ошибка загрузки данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
conOrders.Close();
}
}
}
void getDatesFromCalendar()
{
string dateFrom = dtpDateFrom.Value.ToString("dd.MM.yyyy");
string dateTo = dtpDateTo.Value.ToString("dd.MM.yyyy");
string dateFromYear = dtpDateFrom.Value.ToString("yyyy");
//loadInvoicesList(dateFrom, dateTo, dateFromYear);
}
void loadConsignees()
{
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
string qShowMeConsigneesList = @"
select distinct ConsigneeName
from Orders
where trim(ifnull(ConsigneeName, '')) <> ''
order by ConsigneeName";
using (SQLiteConnection conConsignees = new SQLiteConnection(connectionStringToLocalDB))
{
try
{
conConsignees.Open();
SQLiteCommand cmdShowMeConsigneesList = new SQLiteCommand(qShowMeConsigneesList, conConsignees);
SQLiteDataAdapter daConsigneesList = new SQLiteDataAdapter(cmdShowMeConsigneesList);
DataTable tableConsignees = new DataTable();
daConsigneesList.Fill(tableConsignees);
if (_comboConsignees == null)
{
return;
}
var items = new List<string> { "Грузополучатель" };
items.AddRange(tableConsignees.Rows.Cast<DataRow>()
.Select(r => r["ConsigneeName"]?.ToString())
.Where(n => !string.IsNullOrWhiteSpace(n)));
_comboConsignees.DataSource = items;
_comboConsignees.SelectedIndex = 0;
}
catch (Exception)
{
ToastNotification.ShowError("Ошибка получения списка грузополучателей.");
}
finally
{
conConsignees.Close();
}
}
}
void loadSuppliers()
{
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
string qShowMeSuppliersList = @"
select distinct SupplierName
from Orders
where trim(ifnull(SupplierName, '')) <> ''
order by SupplierName asc";
using (SQLiteConnection conSuppliers = new SQLiteConnection(connectionStringToLocalDB))
{
try
{
conSuppliers.Open();
SQLiteCommand cmdShowMeSuppliersList = new SQLiteCommand(qShowMeSuppliersList, conSuppliers);
SQLiteDataAdapter daSuppliersList = new SQLiteDataAdapter(cmdShowMeSuppliersList);
DataTable tableSuppliers = new DataTable();
daSuppliersList.Fill(tableSuppliers);
comboSuppliers.DataSource = tableSuppliers;
comboSuppliers.DisplayMember = "SupplierName";
comboSuppliers.Text = "Поставщик";
}
catch (Exception ex)
{
ToastNotification.ShowError($"Ошибка получения списка поставщиков.");
//MessageBox.Show($"Возникла ошибка при списка поставщиков. Пожалуйста, обратитесь в службу технической поддержки.\nТекст ошибки:\n{ex.ToString()}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
conSuppliers.Close();
}
}
}
#region старые фильтры
//public void ConstructFiltersForOrder()
//{
// string dateFrom = dtpDateFrom.Value.ToString("yyyy-MM-dd");
// string dateTo = dtpDateTo.Value.ToString("yyyy-MM-dd");
// //string goodName = txtGoodFromOrders.Text;
// string filterAddons = $" and o.[OrderDate] between (select strftime('%Y-%m-%d','{dateFrom}')) and (select strftime('%Y-%m-%d','{dateTo}'))";
// //if (goodName!= "" & goodName != "Товар")
// //{
// // filterAddons += $" and i.InvoiceNumber like '%{txtInvoiceNumber.Text}%'";
// //}
// if (comboSuppliers.Text != "" & comboSuppliers.Text != "Поставщик")
// {
// filterAddons += $" and supp.SuppliersName like '%{comboSuppliers.Text}%'";
// }
// if (comboConsignees.Text != "" & comboConsignees.Text != "Грузополучатель")
// {
// filterAddons += $" and consign.ConsigneesName like '%{comboConsignees.Text}%'";
// }
// //selectedTabPage(filterAddons);
//}
#endregion
#region Старая загрузка позиций прайс-листа
// public void loadOrderItems(string OrderNumber)
// {
// string qShowMeOrderItems = $@"
//select
//oi.[GoodCode] as [Код товара],
//oi.[GoodName] as [Наименование],
//oi.[OrderedCountItems] as [Заказно],
//oi.[SupplierPrice] as [Цена],
//oi.[SumOrderedItems] as [Сумма],
//oi.[RefuseItemsCount] as [Отказано],
//oi.[BestBefore] as [Срок годности],
//oi.[ProducerName] as [Производитель]
//from OrderItems oi
//";
// string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
// if (OrderNumber != "" | OrderNumber != string.Empty)
// {
// qShowMeOrderItems += $@"
//inner join Orders on Orders.idOrder = oi.idOrder
//where Orders.OrderNumber = '{OrderNumber}'
//";
// }
// else
// {
// qShowMeOrderItems += " limit 0;";
// }
// using (SQLiteConnection conOrderItems = new SQLiteConnection(connectionStringToLocalDB))
// {
// try
// {
// conOrderItems.Open();
// SQLiteCommand cmdShowMeOrderItems = new SQLiteCommand(qShowMeOrderItems, conOrderItems);
// SQLiteDataAdapter daOrderItems = new SQLiteDataAdapter(cmdShowMeOrderItems);
// DataTable tableOrderItems = new DataTable();
// daOrderItems.Fill(tableOrderItems);
// dgvOrderItem.DataSource = tableOrderItems;
// dgvOrderItem.DefaultCellStyle.Font = new Font("Segoe UI", 10, FontStyle.Regular);
// dgvOrderItem.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
// dgvOrderItem.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
// dgvOrderItem.Columns["Наименование"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
// }
// catch (Exception ex)
// {
// MessageBox.Show(ex.ToString());
// }
// finally
// {
// conOrderItems.Close();
// }
// }
// }
#endregion
private void tabOrders_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void btnClearGoodSearch_Click(object sender, EventArgs e)
{
txtGoodFromOrders.Text = "Товар";
filter = string.Empty;
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), filter);
}
private void dtpDateFrom_ValueChanged(object sender, EventArgs e)
{
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), filter);
}
private void dtpDateTo_ValueChanged(object sender, EventArgs e)
{
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), filter);
}
private void dtpDateTo_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Enter)
{
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), filter);
}
}
private void dtpDateFrom_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Enter)
{
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), filter);
}
}
private void comboSuppliers_SelectionChangeCommitted(object sender, EventArgs e)
{
ApplyOrderFilters();
}
private void comboConsignees_SelectionChangeCommitted(object sender, EventArgs e)
{
ApplyOrderFilters();
}
private void txtGoodFromOrders_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Enter)
{
if(txtGoodFromOrders.Text != string.Empty & txtGoodFromOrders.Text != "Товар")
{
filter += $@"
and Id_Order in (select Id_Order from OrderItems where DrugName like '%{txtGoodFromOrders.Text}%')
";
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), filter);
}
}
}
private void txtGoodFromOrders_Enter(object sender, EventArgs e)
{
if (txtGoodFromOrders.Text == "Товар")
{
txtGoodFromOrders.Text = string.Empty;
}
}
private void txtGoodFromOrders_Leave(object sender, EventArgs e)
{
if (txtGoodFromOrders.Text == "")
{
txtGoodFromOrders.Text = "Товар";
}
}
private void btnClearSuppliers_Click(object sender, EventArgs e)
{
loadSuppliers();
//ConstructFiltersForOrder();
}
private void btnClearConsignees_Click(object sender, EventArgs e)
{
//loadConsignees();
//ConstructFiltersForOrder();
}
private void comboSuppliers_SelectedIndexChanged(object sender, EventArgs e)
{
ApplyOrderFilters();
}
private void comboConsignees_SelectedIndexChanged(object sender, EventArgs e)
{
//ConstructFiltersForOrder();
}
private void DGVOrders_SelectionChanged(object sender, EventArgs e)
{
if(DGVOrders.Rows.Count > 0)
{
try
{
int rowIndex = DGVOrders.SelectedRows[0].Index;
string idPriceList = DGVOrders.Rows[rowIndex].Cells[0].Value.ToString();
LoadOrderItem(idPriceList);
}
catch
{
}
}
}
void LoadOrderItem(string idPriceList)
{
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
string qShowMeOrderItems = $@"
select
[Id_Order_Item],
[Id_Order],
[guid_es],
[es_code],
[DrugName],
[Price],
[Zakaz],
[SummaZakaza],
[ExpiryPeriod],
[RefuseItemsCount],
[supplier_price_id]
from OrderItems
where [id_order] = '{idPriceList}'
";
string countOrderItems = $"select count(*) from OrderItems where id_order = '{idPriceList}'";
using (SQLiteConnection conOrderItem = new SQLiteConnection(connectionStringToLocalDB))
{
try
{
conOrderItem.Open();
SQLiteCommand cmdShowMeCountData = new SQLiteCommand(countOrderItems, conOrderItem);
SQLiteCommand cmdShowMeOrderItems = new SQLiteCommand(qShowMeOrderItems, conOrderItem);
SQLiteDataAdapter daOrderItems = new SQLiteDataAdapter(cmdShowMeOrderItems);
DataTable tableOrderItems = new DataTable();
daOrderItems.Fill(tableOrderItems);
tableOrderItems.Columns[0].ColumnName = "ИД позиц. п-л";
tableOrderItems.Columns[1].ColumnName = "ИД прайс-листа";
tableOrderItems.Columns[2].ColumnName = "ИД товара";
tableOrderItems.Columns[3].ColumnName = "Код товара";
tableOrderItems.Columns[4].ColumnName = "Наименование";
tableOrderItems.Columns[5].ColumnName = "Цена";
tableOrderItems.Columns[6].ColumnName = "Заказано";
tableOrderItems.Columns[7].ColumnName = "Сумма заказа";
tableOrderItems.Columns[8].ColumnName = "Срок годности";
tableOrderItems.Columns[9].ColumnName = "Кол-во отказано";
dataGridView1.DataSource = tableOrderItems;
dataGridView1.Font = new Font("Segoe UI", 10f, FontStyle.Regular);
dataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font("Segoe UI Semibold", 10f, FontStyle.Bold);
dataGridView1.Columns[0].Visible = false;
dataGridView1.Columns[1].Visible = false;
dataGridView1.Columns[2].Visible = false;
dataGridView1.Columns[10].Visible = false;
dataGridView1.Columns[3].Width = 140;
dataGridView1.Columns[4].Width = 750;
dataGridView1.Columns[5].Width = 90;
dataGridView1.Columns[6].Width = 140;
dataGridView1.Columns[7].Width = 90;
dataGridView1.Columns[8].Width = 140;
dataGridView1.Columns[9].Width = 140;
}
catch(Exception ex)
{
ToastNotification.ShowError($"Не удалось загрузить данные заказа");
//MessageBox.Show($"При загрузке данных о позициях заказа возникла ошибка. Текст ошибки:{ex.ToString()}", "Ошибка загрузки данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
conOrderItem.Close();
}
}
}
private void txtOrderNumberFilter_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Enter)
{
if (txtOrderNumberFilter.Text != string.Empty & txtOrderNumberFilter.Text != "Номер заказа")
{
filter += $@"
and OrderNumber like '%{txtOrderNumberFilter.Text}%'
";
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), filter);
}
}
}
private void txtOrderNumberFilter_Leave(object sender, EventArgs e)
{
if (txtOrderNumberFilter.Text == "")
{
txtOrderNumberFilter.Text = "Номер заказа";
}
}
private void txtOrderNumberFilter_Enter(object sender, EventArgs e)
{
if (txtOrderNumberFilter.Text == "Номер заказа")
{
txtOrderNumberFilter.Text = string.Empty;
}
}
private void btnClearOrderNumberFilter_Click(object sender, EventArgs e)
{
txtOrderNumberFilter.Text = "Номер заказа";
filter = string.Empty;
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), filter);
}
private void btnAddComment_Click(object sender, EventArgs e)
{
if (DGVOrders.Rows.Count > 0)
{
int rowIndex = DGVOrders.SelectedRows[0].Index;
string Id_Order = DGVOrders.Rows[rowIndex].Cells[0].Value.ToString();
string OrderNumber = DGVOrders.Rows[rowIndex].Cells[1].Value.ToString();
HF_Comment hf_comment = new HF_Comment(OrderNumber, Id_Order);
hf_comment.ShowDialog();
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), string.Empty);
}
}
private void btnDeleteOrder_Click(object sender, EventArgs e)
{
if (DGVOrders.Rows.Count > 0)
{
int rowIndex = DGVOrders.SelectedRows[0].Index;
string Id_Order = DGVOrders.Rows[rowIndex].Cells[0].Value.ToString();
string OrderNumber = DGVOrders.Rows[rowIndex].Cells[1].Value.ToString();
string OrderStatus = DGVOrders.Rows[rowIndex].Cells[7].Value.ToString();
if (OrderStatus == "НОВЫЙ")
{
DialogResult drDeleteOrder = UiDialogs.ConfirmYesNoCancel($"Вы действительно хотите удалить заказ {OrderNumber}?", "Удаление", FindForm());
if (drDeleteOrder == DialogResult.Yes)
{
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
string qDeleteOrderItems = $@"
delete from OrderItems where [id_order] = '{Id_Order}'";
string qDeleteOrder = $@"
delete from Orders where [Id_Order] = '{Id_Order}'";
using(SQLiteConnection conDeleteOrder = new SQLiteConnection(connectionStringToLocalDB))
{
try
{
conDeleteOrder.Open();
SQLiteCommand cmdDeleteOrderItems = new SQLiteCommand(qDeleteOrderItems, conDeleteOrder);
SQLiteCommand cmdDeleteOrder = new SQLiteCommand(qDeleteOrder, conDeleteOrder);
cmdDeleteOrderItems.ExecuteNonQuery();
cmdDeleteOrder.ExecuteNonQuery();
//ToastNotification.ShowCustom($"Заказ {OrderNumber} был удалён", Color.DarkOrange, Color.White);
ToastNotification.ShowSuccess($"Заказ {OrderNumber} был удалён");
//MessageBox.Show($"Заказ {OrderNumber} был успешно удалён.", "Удаление заказа", MessageBoxButtons.OK, MessageBoxIcon.Information);
LoadOrders(dtpDateFrom.Value.ToString("dd.MM.yyyy"), dtpDateTo.Value.ToString("dd.MM.yyyy"), string.Empty);
}
catch(Exception ex)
{
ToastNotification.ShowError($"Не удалось удалить заказ {OrderNumber}.\n{ex.Message}");
//MessageBox.Show($"При удалении заказа {OrderNumber} возникла ошибка. Заказ не был удалён. \nТекст ошибки:\n{ex.ToString()}", "Ошибка удаления", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
conDeleteOrder.Close();
}
}
}
}
else
{
ToastNotification.ShowCustom($"Можно удалять только неотправленные заказы", Color.DarkOrange, Color.White);
}
}
}
}
}