elfisa-pharmacy/src/ElectronicPharmacy/Form1.cs
Exest 28f0886b32 Fix auto-update exit crash after download (Application.Exit from async).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 13:48:56 +03:00

905 lines
42 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.OleDb;
using System.Data.SQLite;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Elfisa.UI.Theming;
using Электроннаяармация.Classes;
using Электроннаяармация.Properties;
using Электроннаяармация.Forms;
using Электроннаяармация.HelpForms;
using Электроннаяармация.UserControls;
namespace Электроннаяармация
{
public partial class ElectroPharmacy : Form
{
partial void InitializeModernShell();
partial void FinalizeModernShell();
partial void RefreshOpenPriceLists();
partial void ShowShellLoading(string message);
partial void HideShellLoading();
public string ConsigneeName { get; private set; } = string.Empty;
public ElectroPharmacy()
{
InitializeComponent();
InitializeModernShell();
}
private void tsItemContractors_Click(object sender, EventArgs e)
{
var fContractors = new FContractors();
UiThemeHelper.ApplyToControlTree(fContractors);
fContractors.ShowDialog();
}
private void tsItemExit_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void ElectroPharmacy_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult drExitFromApplication = UiDialogs.ConfirmYesNo("Завершить работу программы?", "Предупреждение", this);
if (drExitFromApplication == DialogResult.Yes)
{
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
private void ElectroPharmacy_Load(object sender, EventArgs e)
{
FinalizeModernShell();
// Принудительное обновление: если на Gitea есть более новый Release — не пускаем в работу.
// При недоступной сети не блокируем (офлайн-аптека должна открываться).
try
{
var update = UpdateChecker.CheckForUpdate();
if (update != null && update.UpdateRequired)
{
using (var dlg = new HF_UpdateAvailable(update))
{
UiThemeHelper.ApplyToControlTree(dlg);
dlg.ShowDialog(this);
}
// Жёстко завершаем процесс, чтобы updater смог заменить exe.
Environment.Exit(0);
return;
}
}
catch (Exception ex)
{
AppDebugLog.Info("App", $"Проверка обновлений пропущена: {ex.Message}");
}
FCheckDatabaseIntegrary fCheckDatabaseIntegrary = new FCheckDatabaseIntegrary();
UiThemeHelper.ApplyToControlTree(fCheckDatabaseIntegrary);
fCheckDatabaseIntegrary.ShowDialog();
var hasToken = !string.IsNullOrWhiteSpace(Settings.Default.stringToken);
// Окно выбора грузополучателя открываем только после авторизации.
// Если аптек одна — не открываем окно вообще.
int consigneeCount = 0;
using (var con = new SQLiteConnection(AppConfig.SqliteConnectionString))
{
con.Open();
using (var cmd = new SQLiteCommand("SELECT COUNT(*) FROM Consignees", con))
{
consigneeCount = Convert.ToInt32(cmd.ExecuteScalar());
}
}
if (hasToken && consigneeCount > 1)
{
var consigneeDialog = new HFConsignees { ParentForm = this };
UiThemeHelper.ApplyToControlTree(consigneeDialog);
consigneeDialog.ShowDialog();
}
if (string.IsNullOrWhiteSpace(ConsigneeName))
{
var defaultName = ConsigneeHelper.GetDefaultConsigneeName();
if (!string.IsNullOrWhiteSpace(defaultName))
{
ConsigneeName = defaultName;
ConsigneeHelper.SetActiveConsignee(defaultName);
}
}
if (!HasDocumentTabs())
{
loadDefaultPriceList();
}
RefreshCurrentUserStatus();
}
void loadDefaultPriceList()
{
var consignee = !string.IsNullOrWhiteSpace(ConsigneeName)
? ConsigneeName
: ConsigneeHelper.GetDefaultConsigneeName();
if (string.IsNullOrWhiteSpace(consignee))
{
consignee = "Прайс-Лист";
}
else
{
ConsigneeName = consignee;
}
var title = consignee == "Прайс-Лист"
? "Прайс-лист"
: $"Прайс-лист ({consignee})";
// На смене аптеки не должно появляться много вкладок прайса.
// Поэтому перед открытием закрываем все вкладки с navKey="price".
ConsigneeHelper.SyncCartToPriceList(consignee);
foreach (var tab in _documentTabStrip.Tabs.Where(t => t.NavKey == "price").ToList())
{
CloseDocumentTab(tab.Id);
}
var ucPriceList = new UCPriceList(consignee);
OpenDocumentTab(title, "price", ucPriceList, allowDuplicate: false);
ucPriceList.dgvPriceList.Focus();
RefreshCurrentUserStatus();
}
#region загрузкаПрайсЛиста_старая версия
//void loadDefaultPriceList()
//{
// string defaultConsignee = string.Empty;
// string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
// using (SQLiteConnection conShowMeDefaultPriceList = new SQLiteConnection(connectionStringToLocalDB))
// {
// string qShowMeDefaultPriceList = "select ConsigneesName as [Грузополучатель] from Consignees where ConsigneesUseAsDefault = '1'";
// try
// {
// conShowMeDefaultPriceList.Open();
// SQLiteCommand cmdShowMeDefaultPriceList = new SQLiteCommand(qShowMeDefaultPriceList, conShowMeDefaultPriceList);
// defaultConsignee = cmdShowMeDefaultPriceList.ExecuteScalar().ToString();
// string tabPageName = $"Прайс-лист ({defaultConsignee})";
// TabPage pagePriceList = new TabPage(tabPageName);
// UCPriceList UCPriceList = new UCPriceList(defaultConsignee);
// pagePriceList.SuspendLayout();
// pagePriceList.ResumeLayout();
// tabContent.TabPages.Add(pagePriceList);
// pagePriceList.Controls.Add(UCPriceList);
// UCPriceList.Dock = DockStyle.Fill;
// tabContent.SelectTab(pagePriceList);
// UCPriceList.dgvPriceList.Focus();
// }
// catch(Exception ex)
// {
// MessageBox.Show($"Возникла ошибка при загрузке прайс-листа по умолчанию. Текст ошибки:\n{ex.ToString()}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
// }
// finally
// {
// conShowMeDefaultPriceList.Close();
// }
// }
//}
#endregion
private void tsConsignee_Click(object sender, EventArgs e)
{
var hasToken = !string.IsNullOrWhiteSpace(Settings.Default.stringToken);
if (!hasToken)
{
UiDialogs.ShowInfo("Сначала выполните авторизацию, чтобы выбрать грузополучателя.", "Авторизация", this);
return;
}
var fConsignees = new FConsignees();
UiThemeHelper.ApplyToControlTree(fConsignees);
var dr = fConsignees.ShowDialog(this);
if (dr == DialogResult.OK &&
!string.IsNullOrWhiteSpace(fConsignees.SelectedConsigneeNameAfterSave))
{
showMePriceList(fConsignees.SelectedConsigneeNameAfterSave);
}
}
private void tsItemInvoices_Click(object sender, EventArgs e)
{
OpenInvoicesTab();
}
private void tsItemPriceList_Click(object sender, EventArgs e)
{
loadDefaultPriceList();
//HFConsignees hfConsignees = new HFConsignees();
//hfConsignees.ParentForm = this;
//hfConsignees.ShowDialog();
}
public void showMePriceList(string consignee)
{
ConsigneeName = consignee ?? string.Empty;
if (!string.IsNullOrWhiteSpace(ConsigneeName))
{
ConsigneeHelper.SetActiveConsignee(ConsigneeName);
}
// Перед открытием прайс-листа синхронизируем Zakaz/SummaZakaza с корзиной активной аптеки.
ConsigneeHelper.SyncCartToPriceList(ConsigneeName);
var ucPriceList = new UCPriceList(consignee);
foreach (var tab in _documentTabStrip.Tabs.Where(t => t.NavKey == "price").ToList())
{
CloseDocumentTab(tab.Id);
}
OpenDocumentTab($"Прайс-лист ({consignee})", "price", ucPriceList, allowDuplicate: false);
ucPriceList.dgvPriceList.Focus();
RefreshCurrentUserStatus();
}
private void SwitchConsignee()
{
var hasToken = !string.IsNullOrWhiteSpace(Settings.Default.stringToken);
if (!hasToken)
{
UiDialogs.ShowInfo("Сначала выполните авторизацию, чтобы сменить грузополучателя.", "Авторизация", this);
return;
}
var consigneeDialog = new HFConsignees { ParentForm = this };
UiThemeHelper.ApplyToControlTree(consigneeDialog);
consigneeDialog.ShowDialog(this);
RefreshCurrentUserStatus();
}
private void tsDebug_Click(object sender, EventArgs e)
{
var fDebug = new FDebug();
UiThemeHelper.ApplyToControlTree(fDebug);
fDebug.Show();
}
private void tsItemOrders_Click(object sender, EventArgs e)
{
OpenOrdersTab();
}
private void tsExchangeLoad_Click(object sender, EventArgs e)
{
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
var consigneeSafe = (string.IsNullOrWhiteSpace(ConsigneeName) ? ConsigneeHelper.GetDefaultConsigneeName() : ConsigneeName)
?.Replace("'", "''");
string qShowMeCoountDataFromTempOrder = $"select count(*) from TempOrderItems where ConsigneeName = '{consigneeSafe}'";
int countDataTempOrder = 0;
using (SQLiteConnection sqlCon = new SQLiteConnection(connectionStringToLocalDB))
{
try
{
sqlCon.Open();
SQLiteCommand cmdCountOfDataTempOrder = new SQLiteCommand(qShowMeCoountDataFromTempOrder, sqlCon);
countDataTempOrder = Convert.ToInt32(cmdCountOfDataTempOrder.ExecuteScalar());
}
catch (Exception ex)
{
UiDialogs.ShowError($"При получении данных из локальных базы данных произошла ошибка. Возможно БД повреждена. Текст ошибки:{ex.ToString()}", "Не удалось получить данные", this);
}
finally
{
sqlCon.Close();
}
}
ClearDocumentTabs();
HF_DownloadDataFromServer hF_DownloadDataFromServer = new HF_DownloadDataFromServer();
hF_DownloadDataFromServer.ActiveConsigneeName =
string.IsNullOrWhiteSpace(ConsigneeName) ? ConsigneeHelper.GetDefaultConsigneeName() : ConsigneeName;
UiThemeHelper.ApplyToControlTree(hF_DownloadDataFromServer);
DialogResult downloadResult = DialogResult.Cancel;
if (countDataTempOrder > 0)
{
DialogResult drShowDataDownload = UiDialogs.ConfirmYesNoCancel("В корзине найдены товары. При обновлении прайса она будет очищена.\nПродолжить?", "ТОВАРЫ В КОРЗИНЕ", this);
if(drShowDataDownload == DialogResult.Yes)
{
downloadResult = hF_DownloadDataFromServer.ShowDialog();
}
}
else
{
downloadResult = hF_DownloadDataFromServer.ShowDialog();
}
if (downloadResult == DialogResult.OK)
{
RefreshOpenPriceLists();
}
else if (!HasDocumentTabs())
{
loadDefaultPriceList();
}
}
#region старая кнопка загрузки данных
/*
private void tsExchangeLoad_Click(object sender, EventArgs e)
{
string fileName = "0027379.dbf";
string filePath = @"C:\!ElectroPharmacy\ElectoPharmacyOrder\";
string connectionToDbf = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filePath};Extended Properties=dBASE IV;User ID=Admin;Password=;";
using (OleDbConnection oleCon = new OleDbConnection(connectionToDbf))
{
var sql = $"select '{DateTime.Now.ToShortDateString()}' as [DatePriceList], '2' as [ConsigneesCode], '3' as [SupplierCode], CODE, PRODUCT, PRODUCER, 'Поставщик 2' as [SupplierName], EXP, VTIMPORT, REGCOST, QUANTITY, COST, COUNTRY, NDS, PRODCOST, '0' as [Marked] from {fileName}";
OleDbCommand cmd = new OleDbCommand(sql, oleCon);
oleCon.Open();
OleDbDataAdapter daDbfReader = new OleDbDataAdapter(cmd);
DataTable tablePriceFromDbf = new DataTable();
daDbfReader.Fill(tablePriceFromDbf);
string qDbfPriceListDate = $"select '{DateTime.Now.ToString()}' as [DatePriceList] from {fileName}";
string qDbfConsigneesCode = $"select '2' as [ConsigneesCode] from {fileName}";
string qDbfSupplierCode = $"select '3' as [CodeSuppliers] from {fileName}";
OleDbCommand cmdPriceListDate = new OleDbCommand(qDbfPriceListDate, oleCon);
OleDbCommand cmdConsigneesCode = new OleDbCommand(qDbfConsigneesCode, oleCon);
OleDbCommand cmdSupplierCode = new OleDbCommand(qDbfSupplierCode, oleCon);
string dbfPriceListDate = cmdPriceListDate.ExecuteScalar().ToString();
string dbfConsigneesCode = cmdConsigneesCode.ExecuteScalar().ToString();
string dbfSupplierCode = cmdSupplierCode.ExecuteScalar().ToString();
string dbPriceListDate = string.Empty;
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
using (SQLiteConnection conShowMePriceListDateFromPriceListSuppliers = new SQLiteConnection(connectionStringToLocalDB))
{
string qShowMeLastDateOfPriceList = $"select PriceListDate from PriceListFromSuppliers where ConsigneesCode = '{dbfConsigneesCode}' and CodeSuppliers = '{dbfSupplierCode}'";
string qShowMeCountOfPriceListForThisConsigneeFromThisSupplier = $"select Count(PriceListDate) from PriceListFromSuppliers where ConsigneesCode = '{dbfConsigneesCode}' and CodeSuppliers = '{dbfSupplierCode}'";
try
{
conShowMePriceListDateFromPriceListSuppliers.Open();
SQLiteCommand cmdShowMeCountPriceListFromThisSupplierForThisConsignee = new SQLiteCommand(qShowMeCountOfPriceListForThisConsigneeFromThisSupplier, conShowMePriceListDateFromPriceListSuppliers);
Int32 countPriceLists = Convert.ToInt32(cmdShowMeCountPriceListFromThisSupplierForThisConsignee.ExecuteScalar().ToString());
if (countPriceLists != 0)
{
SQLiteCommand cmdShowMeLastPriceListDate = new SQLiteCommand(qShowMeLastDateOfPriceList, conShowMePriceListDateFromPriceListSuppliers);
dbPriceListDate = cmdShowMeLastPriceListDate.ExecuteScalar().ToString();
}
else
{
string qCreateNewPriceList = $"insert into PriceListFromSuppliers (ConsigneesCode, CodeSuppliers, PriceListDate) values('{dbfConsigneesCode}', '{dbfSupplierCode}', (select strftime('%Y-%m-%d','{Convert.ToDateTime(dbfPriceListDate).ToString("yyyy-MM-dd")}')))";
SQLiteCommand cmdCreatePriceList = new SQLiteCommand(qCreateNewPriceList, conShowMePriceListDateFromPriceListSuppliers);
cmdCreatePriceList.ExecuteNonQuery();
SQLiteCommand cmdShowMeLastPriceListDate = new SQLiteCommand(qShowMeLastDateOfPriceList, conShowMePriceListDateFromPriceListSuppliers);
dbPriceListDate = cmdShowMeLastPriceListDate.ExecuteScalar().ToString();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conShowMePriceListDateFromPriceListSuppliers.Close();
}
}
// SQLiteCommand cmdShowMeLastPriceListDate = new SQLiteCommand(qShowMeLastDateOfPriceList, conFillPriceListByNewData);
//DateTime dateLastPriceListDate = Convert.ToDateTime(cmdShowMeLastPriceListDate.ExecuteScalar().ToString());
if (Convert.ToDateTime(dbfPriceListDate) > Convert.ToDateTime(dbPriceListDate))
{
using (SQLiteConnection conPriceListFromSupplier = new SQLiteConnection(connectionStringToLocalDB))
{
try
{
conPriceListFromSupplier.Open();
string qShowMeIdPriceListFromSupplier = $"select idPriceListSuppliers from PriceListFromSuppliers where ConsigneesCode = '{dbfConsigneesCode}' and CodeSuppliers = '{dbfSupplierCode}'";
SQLiteCommand cmdShowMeIdPriceListSupplier = new SQLiteCommand(qShowMeIdPriceListFromSupplier, conPriceListFromSupplier);
string IdPriceListFromSupplier = cmdShowMeIdPriceListSupplier.ExecuteScalar().ToString();
string qUpdatePriceListFromSupplier = $"update PriceListFromSuppliers set PriceListDate = (select strftime('%Y-%m-%d','{Convert.ToDateTime(dbfPriceListDate).ToString("yyyy-MM-dd")}')) where idPriceListSuppliers = '{IdPriceListFromSupplier}'";
string qDeletePriceListItems = $"delete from PriceList where idPriceListSupplier = '{IdPriceListFromSupplier}'";
SQLiteCommand cmdUpdatePriceListFromSuppliers = new SQLiteCommand(qUpdatePriceListFromSupplier, conPriceListFromSupplier);
SQLiteCommand cmdDeletePriceListItems = new SQLiteCommand(qDeletePriceListItems, conPriceListFromSupplier);
cmdUpdatePriceListFromSuppliers.ExecuteNonQuery();
string qShowMeCountOfItemFromPriceList = $"select count(idPriceListSupplier) from PriceList where idPriceListSupplier = '{IdPriceListFromSupplier}'";
SQLiteCommand cmdShowMeCountItemsFromPriceList = new SQLiteCommand(qShowMeCountOfItemFromPriceList, conPriceListFromSupplier);
Int32 countItemsFromPriceList = Convert.ToInt32(cmdShowMeCountItemsFromPriceList.ExecuteScalar().ToString());
if(countItemsFromPriceList < 1)
{
}
else
{
cmdDeletePriceListItems.ExecuteNonQuery();
}
foreach (DataRow dr in tablePriceFromDbf.Rows)
{
//string dbfPriceListDate = dr["DatePriceList"].ToString();
//string dbfConsigneesCode = dr["ConsigneesCode"].ToString();
string dbfCode = dr["CODE"].ToString();
string dbfGood = dr["PRODUCT"].ToString().ToLower();
string dbfProducer = dr["PRODUCER"].ToString();
string dbfSupplierName = dr["SupplierName"].ToString();
string dbfBestBefore = Convert.ToDateTime(dr["EXP"]).ToShortDateString();
string dbfJNVLS = dr["VTIMPORT"].ToString();
string dbfPriceReestr = dr["REGCOST"].ToString();
string dbfQuantity = dr["QUANTITY"].ToString();
string dbfPriceSupplierWithNds = dr["COST"].ToString();
string dbfCountry = dr["COUNTRY"].ToString();
string dbfNDS = dr["NDS"].ToString();
string dbfPriceProducer = dr["PRODCOST"].ToString();
string dbfMarked = dr["Marked"].ToString();
dbfGood = dbfGood.Replace("'", "");
dbfProducer = dbfProducer.Replace("'", "");
//dbfSupplierName = dbfSupplierName.Replace("'", "");
dbfCountry = dbfCountry.Replace("'", "");
string qInsertDataInLocalDB = $@"insert into PriceList (idPriceListSupplier, ConsigneesCode, GoodCode, GoodName, ProducerName, SupplierName, BestBefore, JNVLS, PriceReestr, AvaibleCount, PriceSupplierWithNDS, NDS , Marked)
values ('{IdPriceListFromSupplier}', '{dbfConsigneesCode}', '{dbfCode}','{dbfGood}','{dbfProducer}', (select SuppliersName from Suppliers where codeSuppliers = '{dbfSupplierCode}'),'{dbfBestBefore}','{dbfJNVLS}','{dbfPriceReestr}', '{dbfQuantity}', '{dbfPriceSupplierWithNds}', '{dbfNDS}', '{dbfMarked}')
";
//MessageBox.Show(qInsertDataInLocalDB);
SQLiteCommand cmdInsertDataInPriceList = new SQLiteCommand(qInsertDataInLocalDB, conPriceListFromSupplier);
cmdInsertDataInPriceList.ExecuteNonQuery();
}
MessageBox.Show("Загрузка прайса завершена");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conPriceListFromSupplier.Close();
}
}
//string IdPriceListFromSupplier = cmdShowMeIdPriceListSupplier.ExecuteScalar().ToString();
//string qUpdatePriceListFromSupplier = $"update PriceListFromSuppliers set PriceListDate = '{dbfPriceListDate}' where idPriceListSuppliers = '{IdPriceListFromSupplier}'";
//string qDeletePriceListItems = $"delete from PriceList where idPriceListSupplier = '{IdPriceListFromSupplier}'";
//SQLiteCommand cmdUpdatePriceListFromSuppliers = new SQLiteCommand(qUpdatePriceListFromSupplier, conFillPriceListByNewData);
//SQLiteCommand cmdDeletePriceListItems = new SQLiteCommand(qDeletePriceListItems, conFillPriceListByNewData);
////cmdUpdatePriceListFromSuppliers.ExecuteNonQuery();
////cmdDeletePriceListItems.ExecuteNonQuery();
}
//string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
//using (SQLiteConnection conFillPriceListByNewData = new SQLiteConnection(connectionStringToLocalDB))
//{
// try
// {
// conFillPriceListByNewData.Open();
// foreach (DataRow dr in tablePriceFromDbf.Rows)
// {
// string dbfPriceListDate = dr["DatePriceList"].ToString();
// string dbfConsigneesCode = dr["ConsigneesCode"].ToString();
// string dbfCode = dr["CODE"].ToString();
// string dbfGood = dr["PRODUCT"].ToString().ToLower();
// string dbfProducer = dr["PRODUCER"].ToString();
// string dbfSupplierCode = dr["SupplierCode"].ToString();
// string dbfBestBefore = Convert.ToDateTime(dr["EXP"]).ToShortDateString();
// string dbfJNVLS = dr["VTIMPORT"].ToString();
// string dbfPriceReestr = dr["REGCOST"].ToString();
// string dbfQuantity = dr["QUANTITY"].ToString();
// string dbfPriceSupplierWithNds = dr["COST"].ToString();
// string dbfCountry = dr["COUNTRY"].ToString();
// string dbfNDS = dr["NDS"].ToString();
// string dbfPriceProducer = dr["PRODCOST"].ToString();
// string dbfMarked = dr["Marked"].ToString();
// dbfGood = dbfGood.Replace("'", "");
// dbfProducer = dbfProducer.Replace("'", "");
// //dbfSupplierName = dbfSupplierName.Replace("'", "");
// dbfCountry = dbfCountry.Replace("'", "");
// string qInsertDataInLocalDB = $@"insert into PriceList (PriceListDate, GoodCode, GoodName, ProducerName, SupplierName, BestBefore, JNVLS, PriceReestr, AvaibleCount, PriceSupplierWithNDS, NDS , Marked)
// values ('{dbfPriceListDate}','{dbfCode}','{dbfGood}','{dbfProducer}', '{dbfSupplierCode}','{dbfBestBefore}','{dbfJNVLS}','{dbfPriceReestr}', '{dbfQuantity}', '{dbfPriceSupplierWithNds}', '{dbfCountry}', '{dbfNDS}', '{dbfPriceProducer}', '{dbfMarked}')
// ";
// //MessageBox.Show(qInsertDataInLocalDB);
// SQLiteCommand cmdInsertDataInPriceList = new SQLiteCommand(qInsertDataInLocalDB, conFillPriceListByNewData);
// cmdInsertDataInPriceList.ExecuteNonQuery();
// }
// }
// catch (Exception ex)
// {
// MessageBox.Show(ex.ToString());
// }
// finally
// {
// conFillPriceListByNewData.Close();
// }
//}
}
}
*/
#endregion
private void tsmi_CloseTab_Click(object sender, EventArgs e)
{
tabContent.TabPages.Remove(tabContent.SelectedTab);
}
private void закрытьВсеToolStripMenuItem_Click(object sender, EventArgs e)
{
ClearDocumentTabs();
}
private void регистрацияToolStripMenuItem_Click(object sender, EventArgs e)
{
var hF_Registration = new HF_Registration();
UiThemeHelper.ApplyToControlTree(hF_Registration);
hF_Registration.ShowDialog();
}
private async void tsExchangeDeploy_Click(object sender, EventArgs e)
{
DialogResult drUpdateData = UiDialogs.ConfirmYesNoCancel("Будут отправлены все сохранённые заказы. Вы уверены?", "Отправка заказов", this);
if (drUpdateData == DialogResult.Yes)
{
ToastNotification.ShowCustom("Отправляем данные", Color.DarkOrange, Color.White);
var uploadData = new DataSender();
try
{
await uploadData.Main();
//lblDataSent.Text = "ДАННЫЕ ОТПРАВЛЕНЫ";
//ToastNotification.ShowSuccess($"Данные отправлены");
}
catch (Exception ex)
{
AppDebugLog.Error("Form1", "Не удалось отправить данные (меню Обмен)", ex);
ToastNotification.ShowError($"Не удалось отправить данные. {ex.Message}");
//MessageBox.Show(ex.ToString(), "Ошибка отправки данных на сервер", MessageBoxButtons.OK, MessageBoxIcon.Error);
//MessageBox.Show($"Не удалось отправить данные на сервер. Текст ошибки:\n{ex.ToString()}", "Ошибка отправки данных на сервер", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
//HF_UploadDataToServer hF_UploadDataToServer = new HF_UploadDataToServer();
//hF_UploadDataToServer.Visible = false;
//hF_UploadDataToServer.ShowDialog();
}
}
private void tsJournal_DropDownOpened(object sender, EventArgs e)
{
tsJournal.ForeColor = System.Drawing.Color.Black;
}
private void tsJournal_DropDownClosed(object sender, EventArgs e)
{
tsJournal.ForeColor = System.Drawing.Color.White;
}
private void tsDirectory_DropDownOpened(object sender, EventArgs e)
{
tsDirectory.ForeColor = System.Drawing.Color.Black;
}
private void tsDirectory_DropDownClosed(object sender, EventArgs e)
{
tsDirectory.ForeColor = System.Drawing.Color.White;
}
private void tsExchange_DropDownClosed(object sender, EventArgs e)
{
tsExchange.ForeColor = System.Drawing.Color.White;
}
private void tsExchange_DropDownOpened(object sender, EventArgs e)
{
tsExchange.ForeColor = System.Drawing.Color.Black;
}
private void tsHelp_DropDownOpened(object sender, EventArgs e)
{
tsHelp.ForeColor = System.Drawing.Color.Black;
}
private void tsHelp_DropDownClosed(object sender, EventArgs e)
{
tsHelp.ForeColor = System.Drawing.Color.White;
}
private void roundBtnOrders_Click(object sender, EventArgs e)
{
OpenOrdersTab();
}
private void RoundBtnPriceList_Click(object sender, EventArgs e)
{
loadDefaultPriceList();
}
private void roundBtnRegister_Click(object sender, EventArgs e)
{
var hF_Registration = new HF_Registration();
UiThemeHelper.ApplyToControlTree(hF_Registration);
hF_Registration.ShowDialog();
}
private void tsBtnPriceList_Click(object sender, EventArgs e)
{
loadDefaultPriceList();
}
private void tsBtnOrders_Click(object sender, EventArgs e)
{
OpenOrdersTab();
}
private void tsBtnAuth_Click(object sender, EventArgs e)
{
var hF_Registration = new HF_Registration();
UiThemeHelper.ApplyToControlTree(hF_Registration);
if (hF_Registration.ShowDialog() == DialogResult.OK)
{
// После успешной авторизации сначала выбираем грузополучателя,
// и только потом (если нужно) запрашиваем Location ID.
int consigneeCount;
using (var con = new SQLiteConnection(AppConfig.SqliteConnectionString))
{
con.Open();
using (var cmd = new SQLiteCommand("SELECT COUNT(*) FROM Consignees", con))
{
consigneeCount = Convert.ToInt32(cmd.ExecuteScalar());
}
}
if (consigneeCount <= 1)
{
var defaultName = ConsigneeHelper.GetDefaultConsigneeName();
if (!string.IsNullOrWhiteSpace(defaultName))
{
ConsigneeName = defaultName;
ConsigneeHelper.SetActiveConsignee(defaultName);
}
}
else
{
var consigneeDialog = new HFConsignees { ParentForm = this };
UiThemeHelper.ApplyToControlTree(consigneeDialog);
if (consigneeDialog.ShowDialog(this) != DialogResult.OK)
{
// Без выбора грузополучателя дальше не идём.
return;
}
}
if (string.IsNullOrWhiteSpace(AppConfig.LocationId))
{
var consigneeName = ConsigneeName ?? string.Empty;
var consigneeAddress = string.Empty;
if (!string.IsNullOrWhiteSpace(consigneeName))
{
using (var con = new SQLiteConnection(AppConfig.SqliteConnectionString))
{
con.Open();
using (var cmd = new SQLiteCommand(
@"SELECT ifnull(ConsigneesAddress, '')
FROM Consignees
WHERE ConsigneesName = @name
LIMIT 1",
con))
{
cmd.Parameters.AddWithValue("@name", consigneeName.Trim());
consigneeAddress = cmd.ExecuteScalar()?.ToString() ?? string.Empty;
}
}
}
if (!HF_LocationId.PromptAndSave(this, consigneeName, consigneeAddress))
{
ToastNotification.ShowCustom(
"Location ID не указан. Укажите его перед отправкой заказов.",
Color.DarkOrange,
Color.White);
return;
}
}
if (!string.IsNullOrWhiteSpace(AppConfig.LocationId))
{
ConsigneeHelper.ApplyLocationIdToEmptyConsignees(AppConfig.LocationId);
}
RefreshCurrentUserStatus();
}
}
private void OpenSettingsDialog()
{
var settingsForm = new HF_Settings();
UiThemeHelper.ApplyToControlTree(settingsForm);
if (settingsForm.ShowDialog(this) == DialogResult.OK)
{
RefreshCurrentUserStatus();
}
}
private async void tsBtnSentData_Click(object sender, EventArgs e)
{
var hasToken = !string.IsNullOrWhiteSpace(Settings.Default.stringToken);
if (!hasToken)
{
UiDialogs.ShowInfo("Сначала выполните авторизацию, чтобы отправить заказы.", "Авторизация", this);
return;
}
DialogResult drUpdateData = UiDialogs.ConfirmYesNoCancel("Будут отправлены все сохранённые заказы. Вы уверены?", "Отправка заказов", this);
if (drUpdateData == DialogResult.Yes)
{
var nowUtc = DateTime.UtcNow;
var lastPriceUpdateUtc = Settings.Default.LastPriceUpdateUtc;
var lastPriceReminderUtc = Settings.Default.LastPriceReminderUtc;
var priceIsStale = lastPriceUpdateUtc == DateTime.MinValue ||
(nowUtc - lastPriceUpdateUtc) > TimeSpan.FromHours(24);
var canRemind = lastPriceReminderUtc == DateTime.MinValue ||
(nowUtc - lastPriceReminderUtc) > TimeSpan.FromHours(24);
if (priceIsStale && canRemind)
{
// Напоминание не блокирует отправку.
UiDialogs.ShowInfo(
"Прайс-лист не обновлялся более 24 часов. Рекомендуем обновить прайс перед отправкой заказов.",
"Прайс-лист",
this);
Settings.Default.LastPriceReminderUtc = nowUtc;
Settings.Default.Save();
}
ShowShellLoading("Отправка заказов...");
ToastNotification.ShowCustom("Отправляем данные", Color.DarkOrange, Color.White);
var uploadData = new DataSender();
try
{
await uploadData.Main();
}
catch (Exception ex)
{
AppDebugLog.Error("Form1", "Не удалось отправить данные (кнопка ОТПРАВИТЬ)", ex);
ToastNotification.ShowError($"Не удалось отправить данные. {ex.Message}");
}
finally
{
HideShellLoading();
}
}
}
private void tsBtnDownloadData_Click(object sender, EventArgs e)
{
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
var consigneeSafe = (string.IsNullOrWhiteSpace(ConsigneeName) ? ConsigneeHelper.GetDefaultConsigneeName() : ConsigneeName)
?.Replace("'", "''");
string qShowMeCoountDataFromTempOrder = $"select count(*) from TempOrderItems where ConsigneeName = '{consigneeSafe}'";
int countDataTempOrder = 0;
using (SQLiteConnection sqlCon = new SQLiteConnection(connectionStringToLocalDB))
{
try
{
sqlCon.Open();
SQLiteCommand cmdCountOfDataTempOrder = new SQLiteCommand(qShowMeCoountDataFromTempOrder, sqlCon);
countDataTempOrder = Convert.ToInt32(cmdCountOfDataTempOrder.ExecuteScalar());
}
catch (Exception ex)
{
UiDialogs.ShowError($"При получении данных из локальных базы данных произошла ошибка. Возможно БД повреждена. Текст ошибки:{ex.ToString()}", "Не удалось получить данные", this);
}
finally
{
sqlCon.Close();
}
}
ClearDocumentTabs();
HF_DownloadDataFromServer hF_DownloadDataFromServer = new HF_DownloadDataFromServer();
hF_DownloadDataFromServer.ActiveConsigneeName =
string.IsNullOrWhiteSpace(ConsigneeName) ? ConsigneeHelper.GetDefaultConsigneeName() : ConsigneeName;
UiThemeHelper.ApplyToControlTree(hF_DownloadDataFromServer);
DialogResult downloadResult = DialogResult.Cancel;
if (countDataTempOrder > 0)
{
DialogResult drShowDataDownload = UiDialogs.ConfirmYesNoCancel("В корзине найдены товары. При обновлении прайса она будет очищена.\nПродолжить?", "ТОВАРЫ В КОРЗИНЕ", this);
if (drShowDataDownload == DialogResult.Yes)
{
downloadResult = hF_DownloadDataFromServer.ShowDialog();
}
}
else
{
downloadResult = hF_DownloadDataFromServer.ShowDialog();
}
if (downloadResult == DialogResult.OK)
{
RefreshOpenPriceLists();
}
else if (!HasDocumentTabs())
{
loadDefaultPriceList();
}
}
}
}