Apply Primary gradient to «Обновить с сервера» after text is set, restore compact clear buttons on FOrders, and skip focus cues on icon-only controls. Co-authored-by: Cursor <cursoragent@cursor.com>
369 lines
13 KiB
C#
369 lines
13 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
using Elfisa.UI.Controls;
|
||
using Электронная_Фармация.Classes;
|
||
using System.Data.SQLite;
|
||
|
||
namespace Электронная_Фармация.UserControls
|
||
{
|
||
public partial class UCInvoices : UserControl
|
||
{
|
||
public UCInvoices()
|
||
{
|
||
InitializeComponent();
|
||
}
|
||
|
||
void getDatesFromCalendar()
|
||
{
|
||
string dateFrom = dtpDateFrom.Value.ToString("yyyy-MM-dd");
|
||
string dateTo = dtpDateTo.Value.ToString("yyyy-MM-dd");
|
||
|
||
string dateFromYear = dtpDateFrom.Value.ToString("yyyy");
|
||
|
||
loadInvoicesList(dateFrom, dateTo, dateFromYear);
|
||
}
|
||
|
||
string filterAddons = "";
|
||
|
||
void loadSuppliers()
|
||
{
|
||
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
|
||
|
||
string qShowMeSuppliersList = "select SuppliersName from suppliers order by [SuppliersName] 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 = "SuppliersName";
|
||
comboSuppliers.Text = "Поставщик";
|
||
}
|
||
catch(Exception ex)
|
||
{
|
||
ToastNotification.ShowError($"Ошибка загрузки поставщиков: {ex.Message}");
|
||
}
|
||
finally
|
||
{
|
||
conSuppliers.Close();
|
||
}
|
||
}
|
||
}
|
||
|
||
void loadConsignees()
|
||
{
|
||
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
|
||
|
||
string qShowMeConsigneesList = "select ConsigneesName from Consignees order by [ConsigneesUseAsDefault] desc";
|
||
|
||
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);
|
||
comboConsignees.DataSource = tableConsignees;
|
||
comboConsignees.DisplayMember = "ConsigneesName";
|
||
comboConsignees.Text = "Грузополучатель";
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ToastNotification.ShowError($"Ошибка загрузки грузополучателей: {ex.Message}");
|
||
}
|
||
finally
|
||
{
|
||
conConsignees.Close();
|
||
}
|
||
}
|
||
}
|
||
|
||
void loadInvoicesList(string InvoicesDateFrom, string InvoicesDateTo, string dateFromYearFormat)
|
||
{
|
||
|
||
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
|
||
|
||
string filterAddons = $"where i.InvoiceDate between date('{InvoicesDateFrom}') and date('{InvoicesDateTo}')";
|
||
|
||
if (txtInvoiceNumber.Text != "" & txtInvoiceNumber.Text != "Номер накладной")
|
||
{
|
||
filterAddons += $" and i.InvoiceNumber like '%{txtInvoiceNumber.Text}%'";
|
||
}
|
||
|
||
if (comboSuppliers.Text != "" & comboSuppliers.Text != "Поставщик")
|
||
{
|
||
filterAddons += $" and s.SuppliersName like '%{comboSuppliers.Text}%'";
|
||
}
|
||
|
||
if (comboConsignees.Text != "" & comboConsignees.Text != "Грузополучатель")
|
||
{
|
||
filterAddons += $" and c.ConsigneesName like '%{comboConsignees.Text}%'";
|
||
}
|
||
|
||
string qShowMeListOfInvoices = $@"
|
||
select i.InvoiceNumber as [Номер],
|
||
i.invoiceDate as [Дата],
|
||
s.SuppliersName as [Поставщик],
|
||
c.ConsigneesName as [Грузополучатель],
|
||
c.ConsigneesAddress as [Адрес ГП],
|
||
i.SumWithoutNDS as [Сумма без НДС],
|
||
i.SumWithNDS as [Сумма с НДС],
|
||
i.SumNDS as [Сумма НДС]
|
||
from [Invoice] i
|
||
inner join [Suppliers] s on s.codeSuppliers = i.CodeSupplier
|
||
inner join [Consignees] c on c.codeConsignees = i.CodeConsignees
|
||
{filterAddons}
|
||
order by i.InvoiceDate asc
|
||
";
|
||
|
||
using (SQLiteConnection conInvoices = new SQLiteConnection(connectionStringToLocalDB))
|
||
{
|
||
try
|
||
{
|
||
conInvoices.Open();
|
||
SQLiteCommand cmdShowInvoicesList = new SQLiteCommand(qShowMeListOfInvoices, conInvoices);
|
||
DataTable tableInvoices = new DataTable();
|
||
SQLiteDataAdapter daInvoicesList = new SQLiteDataAdapter(cmdShowInvoicesList);
|
||
daInvoicesList.Fill(tableInvoices);
|
||
dgvInvoice.DataSource = tableInvoices;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ToastNotification.ShowError($"Ошибка загрузки накладных: {ex.Message}");
|
||
}
|
||
finally
|
||
{
|
||
conInvoices.Close();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
loadInvoiceItems(string.Empty);
|
||
|
||
//selectInvoice();
|
||
}
|
||
|
||
private void UCInvoices_Load(object sender, EventArgs e)
|
||
{
|
||
UiThemeHelper.ApplyToControlTree(this);
|
||
Font = new Font("Segoe UI", 9.75f, FontStyle.Regular);
|
||
|
||
button1.Visible = true;
|
||
button1.Text = "Обновить с сервера";
|
||
button1.Width = 180;
|
||
ModernButtonStyles.ApplyAuto(button1);
|
||
button1.Click += async (_, __) => await SyncFromServerAsync();
|
||
|
||
loadConsignees();
|
||
loadSuppliers();
|
||
getDatesFromCalendar();
|
||
}
|
||
|
||
private async Task SyncFromServerAsync()
|
||
{
|
||
button1.Enabled = false;
|
||
UseWaitCursor = true;
|
||
try
|
||
{
|
||
var sync = new InvoiceSyncService();
|
||
int count = await sync.SyncFromServerAsync();
|
||
ToastNotification.ShowSuccess($"Загружено накладных: {count}");
|
||
getDatesFromCalendar();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ToastNotification.ShowError($"Не удалось загрузить накладные: {ex.Message}");
|
||
}
|
||
finally
|
||
{
|
||
button1.Enabled = true;
|
||
UseWaitCursor = false;
|
||
}
|
||
}
|
||
|
||
|
||
private void dtpDateTo_Leave(object sender, EventArgs e)
|
||
{
|
||
getDatesFromCalendar();
|
||
}
|
||
|
||
private void dtpDateFrom_Leave(object sender, EventArgs e)
|
||
{
|
||
getDatesFromCalendar();
|
||
}
|
||
|
||
private void dtpDateTo_KeyPress(object sender, KeyPressEventArgs e)
|
||
{
|
||
if (e.KeyChar == (char)Keys.Enter)
|
||
{
|
||
getDatesFromCalendar();
|
||
}
|
||
}
|
||
|
||
private void dtpDateFrom_KeyPress(object sender, KeyPressEventArgs e)
|
||
{
|
||
if (e.KeyChar == (char)Keys.Enter)
|
||
{
|
||
getDatesFromCalendar();
|
||
}
|
||
}
|
||
|
||
|
||
void selectInvoice()
|
||
{
|
||
if (dgvInvoice.Rows.Count > 0)
|
||
{
|
||
int SelectedInvoiceIndex = dgvInvoice.CurrentCell.RowIndex;
|
||
string SelectedInvoiceNumber = dgvInvoice.Rows[SelectedInvoiceIndex].Cells[0].Value.ToString();
|
||
loadInvoiceItems(SelectedInvoiceNumber);
|
||
}
|
||
}
|
||
|
||
void loadInvoiceItems(string InvoiceNumber)
|
||
{
|
||
string filterAddons = string.Empty;
|
||
|
||
|
||
string InvNum = InvoiceNumber;
|
||
if (dgvInvoice.Rows.Count > 0)
|
||
{
|
||
if (InvNum != "" | InvoiceNumber != string.Empty)
|
||
{
|
||
filterAddons = $"where i.InvoiceNumber = '{InvNum}'";
|
||
|
||
string connectionStringToLocalDB = AppConfig.SqliteConnectionString;
|
||
string qShowMeInvoiceItems = $@"
|
||
select
|
||
ii.GoodCode as [Код товара],
|
||
ii.Good as [Товар],
|
||
ii.ProducerName as [Производитель],
|
||
ii.CountryName as [Страна],
|
||
ii.GoodsGount as [Количество],
|
||
ii.PriceSupplierWithoutNDS as [Цена пост. без НДС],
|
||
ii.PriceSupplierWithNDS as [Цена пост. с НДС],
|
||
ii.PriceProducerWithoutNDS as [Цена произв. без НДС],
|
||
ii.PriceProducerWithNDS as [Цена произв. с НДС],
|
||
ii.NDS as [НДС %],
|
||
ii.JNVLS as [ЖНВЛП?],
|
||
ii.PriceReestr as [Предел. цена произв.],
|
||
ii.SumWithoutNDS as [Сумма пост. без НДС],
|
||
ii.SumWithNDS as [Сумма пост. с НДС],
|
||
ii.SumNDS as [Сумма НДС],
|
||
ii.Serial as [Серия],
|
||
ii.BestBefore as [Срок годности],
|
||
ii.Sertificate as [Сертификат],
|
||
ii.Marked as [Признак маркировки],
|
||
ii.GTIN as [GTIN]
|
||
from InvoiceItem ii
|
||
inner join Invoice i on i.idInvoice = ii.idInvoice
|
||
{filterAddons}
|
||
";
|
||
using (SQLiteConnection conInvoiceItems = new SQLiteConnection(connectionStringToLocalDB))
|
||
{
|
||
try
|
||
{
|
||
conInvoiceItems.Open();
|
||
SQLiteCommand cmdShowMeInvoiceItems = new SQLiteCommand(qShowMeInvoiceItems, conInvoiceItems);
|
||
DataTable tableInvoiceItems = new DataTable();
|
||
SQLiteDataAdapter daInvoiceItems = new SQLiteDataAdapter(cmdShowMeInvoiceItems);
|
||
daInvoiceItems.Fill(tableInvoiceItems);
|
||
dgvInvoiceItems.DataSource = tableInvoiceItems;
|
||
dgvInvoiceItems.Columns[10].ValueType = typeof(bool);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ToastNotification.ShowError($"Ошибка загрузки позиций накладной: {ex.Message}");
|
||
}
|
||
finally
|
||
{
|
||
conInvoiceItems.Close();
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dgvInvoiceItems.DataSource = null;
|
||
}
|
||
}
|
||
|
||
private void txtInvoiceNumber_KeyPress(object sender, KeyPressEventArgs e)
|
||
{
|
||
if (e.KeyChar == (char)Keys.Enter)
|
||
{
|
||
if (dgvInvoice.Rows.Count > 0)
|
||
{
|
||
(dgvInvoice.DataSource as DataTable).DefaultView.RowFilter = string.Format($"[Номер] like '%{txtInvoiceNumber.Text}%'");
|
||
if (dgvInvoice.Rows.Count == 0)
|
||
{
|
||
getDatesFromCalendar();
|
||
}
|
||
}
|
||
txtInvoiceNumber.Text = "Номер накладной";
|
||
dgvInvoice.Focus();
|
||
}
|
||
}
|
||
|
||
private void txtInvoiceNumber_Enter(object sender, EventArgs e)
|
||
{
|
||
if (txtInvoiceNumber.Text == "Номер накладной")
|
||
{
|
||
txtInvoiceNumber.Text = string.Empty;
|
||
}
|
||
}
|
||
|
||
private void txtInvoiceNumber_Leave(object sender, EventArgs e)
|
||
{
|
||
if (txtInvoiceNumber.Text == string.Empty)
|
||
{
|
||
txtInvoiceNumber.Text = "Номер накладной";
|
||
}
|
||
}
|
||
|
||
private void comboSuppliers_SelectedIndexChanged(object sender, EventArgs e)
|
||
{
|
||
getDatesFromCalendar();
|
||
selectInvoice();
|
||
}
|
||
|
||
private void comboConsignees_SelectedIndexChanged(object sender, EventArgs e)
|
||
{
|
||
getDatesFromCalendar();
|
||
selectInvoice();
|
||
}
|
||
|
||
private void btnClearSuppliers_Click(object sender, EventArgs e)
|
||
{
|
||
loadSuppliers();
|
||
getDatesFromCalendar();
|
||
}
|
||
|
||
private void btnClearConsignees_Click(object sender, EventArgs e)
|
||
{
|
||
loadConsignees();
|
||
getDatesFromCalendar();
|
||
}
|
||
|
||
private void dgvInvoice_SelectionChanged(object sender, EventArgs e)
|
||
{
|
||
selectInvoice();
|
||
}
|
||
}
|
||
}
|