Compare OrderDate as real dates (dd.MM.yyyy storage broke across month boundaries) and bump AssemblyVersion so desktop picks up the Gitea release. Co-authored-by: Cursor <cursoragent@cursor.com>
989 lines
40 KiB
C#
989 lines
40 KiB
C#
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("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), 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("yyyy-MM-dd"),
|
||
dtpDateTo.Value.ToString("yyyy-MM-dd"),
|
||
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;
|
||
|
||
// OrderDate в БД исторически dd.MM.yyyy — сравниваем как даты, не как строки,
|
||
// иначе «03.08» не попадает в диапазон «с 31.07» (лексикографически).
|
||
const string orderDateIso = @"CASE
|
||
WHEN length(OrderDate)=10 AND substr(OrderDate,3,1)='.' THEN
|
||
substr(OrderDate,7,4)||'-'||substr(OrderDate,4,2)||'-'||substr(OrderDate,1,2)
|
||
ELSE OrderDate
|
||
END";
|
||
|
||
string qShowMeOrders = $@"
|
||
select
|
||
[Id_Order],
|
||
[OrderNumber],
|
||
[OrderDate],
|
||
[Id_Supplier],
|
||
[SupplierName],
|
||
[OrderedCountItems],
|
||
[SummaZakaza],
|
||
[OrderState],
|
||
[Comment],
|
||
[ConsigneeName]
|
||
from Orders
|
||
where
|
||
({orderDateIso}) >= '{dateFrom}'
|
||
and ({orderDateIso}) <= '{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("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), filter);
|
||
}
|
||
|
||
private void dtpDateFrom_ValueChanged(object sender, EventArgs e)
|
||
{
|
||
|
||
LoadOrders(dtpDateFrom.Value.ToString("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), filter);
|
||
}
|
||
|
||
private void dtpDateTo_ValueChanged(object sender, EventArgs e)
|
||
{
|
||
LoadOrders(dtpDateFrom.Value.ToString("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), filter);
|
||
}
|
||
|
||
private void dtpDateTo_KeyPress(object sender, KeyPressEventArgs e)
|
||
{
|
||
if (e.KeyChar == (Char)Keys.Enter)
|
||
{
|
||
LoadOrders(dtpDateFrom.Value.ToString("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), filter);
|
||
}
|
||
}
|
||
|
||
private void dtpDateFrom_KeyPress(object sender, KeyPressEventArgs e)
|
||
{
|
||
if (e.KeyChar == (Char)Keys.Enter)
|
||
{
|
||
LoadOrders(dtpDateFrom.Value.ToString("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), 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("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), 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("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), 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("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), 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("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), 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("yyyy-MM-dd"), dtpDateTo.Value.ToString("yyyy-MM-dd"), 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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|