From c9d4eb055c8f1c304635e1c49593548c62cbedac Mon Sep 17 00:00:00 2001 From: MariaBelkina <89656988623@mail.ru> Date: Wed, 25 Dec 2024 11:42:32 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=B04,=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BC=D0=B5=D0=B6=D1=83=D1=82=D0=BE=D0=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/Agent.cs | 12 +++- .../Entities/Contract.cs | 32 ++++++--- .../Entities/DelegateToAgents.cs | 14 ++++ .../Entities/Product.cs | 12 ++-- .../Entities/ProductSales.cs | 2 + .../Entities/PurchasingCompany.cs | 2 + .../Entities/TempProductSales.cs | 22 ------ .../Forms/FormAgent.Designer.cs | 72 +++++++++++-------- .../Forms/FormAgent.cs | 6 +- .../Forms/FormAgents.cs | 7 +- .../Forms/FormContract.cs | 2 +- .../Forms/FormContracts.cs | 7 +- .../Forms/FormDelegateToAgent.cs | 2 +- .../Forms/FormDelegatesToAgents.cs | 7 +- .../Forms/FormProducts.cs | 6 +- .../Forms/FormPurchasingCompanies.cs | 7 +- .../Reports/TableReport.cs | 9 ++- .../Repositories/IContractRepository.cs | 2 +- .../Implementations/AgentsRepository.cs | 5 +- .../Implementations/ContractRepository.cs | 71 +++++++++++++++--- .../DelegateToAgentRepository.cs | 29 +++++++- .../Implementations/QueryBuilder.cs | 37 ++++++++++ 22 files changed, 270 insertions(+), 95 deletions(-) delete mode 100644 TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/TempProductSales.cs create mode 100644 TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/QueryBuilder.cs diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Agent.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Agent.cs index 470a1c0..f5a779c 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Agent.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Agent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -11,18 +12,27 @@ public class Agent { public int Id { get; private set; } + [DisplayName("Имя")] public string Name { get; private set; } = string.Empty; + [DisplayName("Фамилия")] + public string Surname { get; private set; } = string.Empty; + + [DisplayName("Квалификация")] public Qualification Qualification { get; private set; } + [DisplayName("Категория")] public Category Category { get; private set; } - public static Agent CreateEntity(int id, string name, Qualification qualification, Category category) + public string FullName => $"{Name} {Surname}"; + + public static Agent CreateEntity(int id, string name, string surname, Qualification qualification, Category category) { return new Agent { Id = id, Name = name ?? string.Empty, + Surname = surname ?? string.Empty, Qualification = qualification, Category = category }; diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Contract.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Contract.cs index cc7998b..b3fc29f 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Contract.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Contract.cs @@ -1,5 +1,7 @@ -using System; +using DocumentFormat.OpenXml.Spreadsheet; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,12 +12,27 @@ public class Contract { public int ID { get; private set; } + [DisplayName("Дата продажи")] public DateTime SaleDate { get; private set; } + [Browsable(false)] public int PurchasingCompanyID { get; private set; } + [Browsable(false)] public int AgentsID { get; private set; } + [DisplayName("Агент-реализатор")] + public string AgentsName { get; private set; } = string.Empty; + + [DisplayName("Компания-закупщик")] + public string CompanyName { get; private set; } = string.Empty; + + [DisplayName("Номенклатура")] + public string Product => ProductSales != null ? + string.Join(", ", ProductSales.Select(x => $"{x.ProductName} {x.ProductQuantity}")) : + string.Empty; + + [Browsable(false)] public IEnumerable ProductSales { get; private set; } = []; public static Contract CreateOperation(int contractID, int purchasingCompanyID, int agentsID, IEnumerable productSales) @@ -30,16 +47,11 @@ public class Contract }; } - public static Contract CreateOperation(TempProductSales tempProductSales, - IEnumerable productSales) + public void SetProductSales(IEnumerable productSales) { - return new Contract + if (productSales != null && productSales.Any()) { - ID = tempProductSales.ID, - AgentsID = tempProductSales.AgentsId, - SaleDate = tempProductSales.SaleDate, - PurchasingCompanyID = tempProductSales.PurchasingCompanyId, - ProductSales = productSales - }; + ProductSales = productSales; + } } } diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/DelegateToAgents.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/DelegateToAgents.cs index 20562f9..e3cf40e 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/DelegateToAgents.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/DelegateToAgents.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,12 +10,25 @@ namespace TradeAndProcurementEnterprice.Entities; public class DelegateToAgents { public int Id { get; private set; } + + [Browsable(false)] public int ProductArticle { get; private set; } + [Browsable(false)] public int AgentsID { get; private set; } + [DisplayName("Номенклатура")] + public string ProductName { get; private set; } = string.Empty; + + [DisplayName("Имя агента")] + public string AgentsName { get; private set; } = string.Empty; + + + [DisplayName("Количество товара")] public int Quantity { get; private set; } + + [DisplayName("Дата передачи")] public DateTime Date { get; private set; } public static DelegateToAgents CreateOperation(int id, int productArticle, int agentsID, int quantity) diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Product.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Product.cs index 1e4c47c..864e9a0 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Product.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/Product.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.ComponentModel; using TradeAndProcurementEnterprice.Entities.Enums; namespace TradeAndProcurementEnterprice.Entities; @@ -11,14 +7,20 @@ public class Product { public int Article { get; private set; } + [DisplayName("Номенклатура")] public string Name { get; private set; } = string.Empty; + [DisplayName("Цена")] public decimal SellingPrice { get; private set; } + [DisplayName("Единица измерения")] public Units Unit { get; private set; } + [DisplayName("Категория")] public Category Category { get; private set; } + + [DisplayName("Количество на складе")] public int InventoryQuantity { get; private set; } public static Product CreateEntity(int article, string name, decimal sellingPrice, Units unit, diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/ProductSales.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/ProductSales.cs index 57e432c..7421305 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/ProductSales.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/ProductSales.cs @@ -12,6 +12,8 @@ public class ProductSales public int ProductArticle { get; private set; } + public string ProductName { get; private set; } = string.Empty; + public int ProductQuantity { get; private set; } public static ProductSales CreateElement(int id, int prodictArticle, int productQuantity) diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/PurchasingCompany.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/PurchasingCompany.cs index cf203e5..1f4ccb2 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/PurchasingCompany.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/PurchasingCompany.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,6 +11,7 @@ public class PurchasingCompany { public int Id { get; private set; } + [DisplayName("Наименование компании")] public string Name { get; private set; } = string.Empty; public static PurchasingCompany CreateEntity(int id, string name) diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/TempProductSales.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/TempProductSales.cs deleted file mode 100644 index fa927f4..0000000 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Entities/TempProductSales.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TradeAndProcurementEnterprice.Entities; - -public class TempProductSales -{ - public int ID { get; private set; } - - public int AgentsId { get; private set; } - - public DateTime SaleDate { get; private set; } - - public int PurchasingCompanyId { get; private set; } - - public int ProductArticle { get; private set; } - - public int ProductQuantity { get; private set; } -} diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgent.Designer.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgent.Designer.cs index 6ca1722..f9a2bd4 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgent.Designer.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgent.Designer.cs @@ -36,15 +36,16 @@ labelQualification = new Label(); labelName = new Label(); checkedListBoxCategory = new CheckedListBox(); + labelSurname = new Label(); + textBoxSurname = new TextBox(); SuspendLayout(); // // buttonCancel // buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonCancel.Location = new Point(280, 412); - buttonCancel.Margin = new Padding(6, 6, 6, 6); + buttonCancel.Location = new Point(151, 227); buttonCancel.Name = "buttonCancel"; - buttonCancel.Size = new Size(156, 49); + buttonCancel.Size = new Size(84, 23); buttonCancel.TabIndex = 16; buttonCancel.Text = "Отмена"; buttonCancel.UseVisualStyleBackColor = true; @@ -53,10 +54,9 @@ // buttonSave // buttonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonSave.Location = new Point(80, 412); - buttonSave.Margin = new Padding(6, 6, 6, 6); + buttonSave.Location = new Point(43, 227); buttonSave.Name = "buttonSave"; - buttonSave.Size = new Size(156, 49); + buttonSave.Size = new Size(84, 23); buttonSave.TabIndex = 17; buttonSave.Text = "Сохранить"; buttonSave.UseVisualStyleBackColor = true; @@ -67,76 +67,88 @@ comboBoxQualification.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; comboBoxQualification.DropDownStyle = ComboBoxStyle.DropDownList; comboBoxQualification.FormattingEnabled = true; - comboBoxQualification.Location = new Point(217, 124); - comboBoxQualification.Margin = new Padding(6, 6, 6, 6); + comboBoxQualification.Location = new Point(115, 103); comboBoxQualification.Name = "comboBoxQualification"; - comboBoxQualification.Size = new Size(273, 40); + comboBoxQualification.Size = new Size(149, 23); comboBoxQualification.TabIndex = 14; // // textBoxName // textBoxName.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - textBoxName.Location = new Point(217, 38); - textBoxName.Margin = new Padding(6, 6, 6, 6); + textBoxName.Location = new Point(117, 18); textBoxName.Name = "textBoxName"; - textBoxName.Size = new Size(273, 39); + textBoxName.Size = new Size(149, 23); textBoxName.TabIndex = 11; // // labelCategory // labelCategory.AutoSize = true; - labelCategory.Location = new Point(39, 220); - labelCategory.Margin = new Padding(6, 0, 6, 0); + labelCategory.Location = new Point(19, 148); labelCategory.Name = "labelCategory"; - labelCategory.Size = new Size(126, 32); + labelCategory.Size = new Size(63, 15); labelCategory.TabIndex = 7; labelCategory.Text = "Категория"; // // labelQualification // labelQualification.AutoSize = true; - labelQualification.Location = new Point(43, 130); - labelQualification.Margin = new Padding(6, 0, 6, 0); + labelQualification.Location = new Point(21, 106); labelQualification.Name = "labelQualification"; - labelQualification.Size = new Size(174, 32); + labelQualification.Size = new Size(88, 15); labelQualification.TabIndex = 8; labelQualification.Text = "Квалификация"; // // labelName // labelName.AutoSize = true; - labelName.Location = new Point(39, 53); - labelName.Margin = new Padding(6, 0, 6, 0); + labelName.Location = new Point(21, 25); labelName.Name = "labelName"; - labelName.Size = new Size(67, 32); + labelName.Size = new Size(31, 15); labelName.TabIndex = 10; - labelName.Text = "ФИО"; + labelName.Text = "Имя"; // // checkedListBoxCategory // checkedListBoxCategory.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; checkedListBoxCategory.FormattingEnabled = true; - checkedListBoxCategory.Location = new Point(217, 211); - checkedListBoxCategory.Margin = new Padding(6, 6, 6, 6); + checkedListBoxCategory.Location = new Point(115, 144); checkedListBoxCategory.Name = "checkedListBoxCategory"; - checkedListBoxCategory.Size = new Size(273, 148); + checkedListBoxCategory.Size = new Size(149, 58); checkedListBoxCategory.TabIndex = 18; // + // labelSurname + // + labelSurname.AutoSize = true; + labelSurname.Location = new Point(21, 66); + labelSurname.Name = "labelSurname"; + labelSurname.Size = new Size(58, 15); + labelSurname.TabIndex = 10; + labelSurname.Text = "Фамилия"; + // + // textBoxSurname + // + textBoxSurname.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + textBoxSurname.Location = new Point(117, 59); + textBoxSurname.Name = "textBoxSurname"; + textBoxSurname.Size = new Size(149, 23); + textBoxSurname.TabIndex = 12; + // // FormAgent // - AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(549, 504); + ClientSize = new Size(301, 285); Controls.Add(checkedListBoxCategory); Controls.Add(buttonCancel); Controls.Add(buttonSave); Controls.Add(comboBoxQualification); + Controls.Add(textBoxSurname); Controls.Add(textBoxName); Controls.Add(labelCategory); + Controls.Add(labelSurname); Controls.Add(labelQualification); Controls.Add(labelName); - Margin = new Padding(6, 6, 6, 6); - MinimumSize = new Size(575, 575); + MinimumSize = new Size(317, 290); Name = "FormAgent"; StartPosition = FormStartPosition.CenterParent; Text = "Агент-реализатор"; @@ -154,5 +166,7 @@ private Label labelQualification; private Label labelName; private CheckedListBox checkedListBoxCategory; + private Label labelSurname; + private TextBox textBoxSurname; } } \ No newline at end of file diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgent.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgent.cs index 8b2d9c7..1f4cca8 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgent.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgent.cs @@ -35,6 +35,7 @@ namespace TradeAndProcurementEnterprice.Forms } textBoxName.Text = agent.Name; + textBoxSurname.Text = agent.Surname; comboBoxQualification.SelectedItem = agent.Qualification; foreach (Category elem in Enum.GetValues(typeof(Category))) { if ((elem & agent.Category) != 0) @@ -69,7 +70,8 @@ namespace TradeAndProcurementEnterprice.Forms { try { - if (string.IsNullOrWhiteSpace(textBoxName.Text) || checkedListBoxCategory.CheckedItems.Count == 0 || comboBoxQualification.SelectedIndex < 1) + if (string.IsNullOrWhiteSpace(textBoxName.Text) || string.IsNullOrWhiteSpace(textBoxSurname.Text) || + checkedListBoxCategory.CheckedItems.Count == 0 || comboBoxQualification.SelectedIndex < 1) { throw new Exception("Имеются незаполненные поля!"); } @@ -101,7 +103,7 @@ namespace TradeAndProcurementEnterprice.Forms category |= (Category)elem; } - return Agent.CreateEntity(id, textBoxName.Text, (Qualification)comboBoxQualification.SelectedItem, + return Agent.CreateEntity(id, textBoxName.Text, textBoxSurname.Text, (Qualification)comboBoxQualification.SelectedItem, category); } } diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgents.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgents.cs index 4effb14..392d15e 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgents.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormAgents.cs @@ -97,7 +97,12 @@ namespace TradeAndProcurementEnterprice.Forms } } - private void LoadList() => dataGridViewData.DataSource = _agentsRepository.ReadAgents(); + private void LoadList() + { + dataGridViewData.DataSource = _agentsRepository.ReadAgents(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["FullName"].Visible = false; + } private bool TryGetIdFromSelectedRow(out int id) { diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormContract.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormContract.cs index f4ba812..ed8bb7f 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormContract.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormContract.cs @@ -29,7 +29,7 @@ namespace TradeAndProcurementEnterprice.Forms comboBoxPurchasingCompany.ValueMember = "Id"; comboBoxAgent.DataSource = agentsRepository.ReadAgents(); - comboBoxAgent.DisplayMember = "Name"; + comboBoxAgent.DisplayMember = "FullName"; comboBoxAgent.ValueMember = "Id"; ColumnProduct.DataSource = productRepository.ReadProducts(); diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormContracts.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormContracts.cs index 3731f3f..afc2c28 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormContracts.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormContracts.cs @@ -53,6 +53,11 @@ namespace TradeAndProcurementEnterprice.Forms } } - private void LoadList() => dataGridViewData.DataSource = _contractRepository.ReadContracts(); + private void LoadList() + { + dataGridViewData.DataSource = _contractRepository.ReadContracts(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["SaleDate"].DefaultCellStyle.Format = "dd.MM.yyyy"; + } } } diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormDelegateToAgent.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormDelegateToAgent.cs index f1da290..d1c439c 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormDelegateToAgent.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormDelegateToAgent.cs @@ -28,7 +28,7 @@ namespace TradeAndProcurementEnterprice.Forms comboBoxProduct.ValueMember = "Article"; comboBoxAgent.DataSource = agentsRepository.ReadAgents(); - comboBoxAgent.DisplayMember = "Name"; + comboBoxAgent.DisplayMember = "FullName"; comboBoxAgent.ValueMember = "Id"; } diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormDelegatesToAgents.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormDelegatesToAgents.cs index c198d49..9be821a 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormDelegatesToAgents.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormDelegatesToAgents.cs @@ -51,6 +51,11 @@ namespace TradeAndProcurementEnterprice.Forms MessageBox.Show(ex.Message, "Ошибка при добавлении!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridViewData.DataSource = _delegateToAgentRepository.ReadDelegatesToAgent(); + private void LoadList() + { + dataGridViewData.DataSource = _delegateToAgentRepository.ReadDelegatesToAgent(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["Date"].DefaultCellStyle.Format = "dd MMMM yyyy hh:mm"; + } } } diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormProducts.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormProducts.cs index 9b4748e..e23eea5 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormProducts.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormProducts.cs @@ -95,7 +95,11 @@ namespace TradeAndProcurementEnterprice.Forms } } - private void LoadList() => dataGridViewData.DataSource = _productRepository.ReadProducts(); + private void LoadList() + { + dataGridViewData.DataSource = _productRepository.ReadProducts(); + dataGridViewData.Columns["Article"].Visible = false; + } private bool TryGetIdFromSelectedRow(out int id) { diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormPurchasingCompanies.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormPurchasingCompanies.cs index 5ac48ae..86eec1e 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormPurchasingCompanies.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Forms/FormPurchasingCompanies.cs @@ -97,8 +97,11 @@ namespace TradeAndProcurementEnterprice.Forms } } - private void LoadList() => dataGridViewData.DataSource = _companyRepository.ReadCompanies(); - + private void LoadList() + { + dataGridViewData.DataSource = _companyRepository.ReadCompanies(); + dataGridViewData.Columns["Id"].Visible = false; + } private bool TryGetIdFromSelectedRow(out int id) { id = 0; diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Reports/TableReport.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Reports/TableReport.cs index 1a32baa..e113a57 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Reports/TableReport.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Reports/TableReport.cs @@ -35,7 +35,7 @@ internal class TableReport { new ExcelBuilder(filePath) .AddHeader("Сводка по передвижению товара", 0, 4) - .AddParagraph("За период", 0) + .AddParagraph($"За период с {startDate: dd.MM.yyyy} по {endDate: dd.MM.yyyy}", 0) .AddTable([10, 10, 15, 15], GetData(productArticle, startDate, endDate)) .Build(); @@ -51,11 +51,10 @@ internal class TableReport private List GetData(int productArticle, DateTime startDate, DateTime endDate) { var data = _contractRepository - .ReadContracts() - .Where(x => x.SaleDate >= startDate && x.SaleDate <= endDate && x.ProductSales.Any(y => y.ProductArticle == productArticle)) + .ReadContracts(dateFrom: startDate, dateTo: endDate, productArticle: productArticle) .Select(x => new { - x.AgentsID, + x.AgentsName, CurrentDate = x.SaleDate, CountIn = (int?)null, CountOut = x.ProductSales.FirstOrDefault(y => y.ProductArticle == productArticle)?.ProductQuantity @@ -66,7 +65,7 @@ internal class TableReport .Where(x => x.Date >= startDate && x.Date <= endDate && x.ProductArticle == productArticle) .Select(x => new { - x.AgentsID, + x.AgentsName, CurrentDate = x.Date, CountIn = (int?)x.Quantity, CountOut = (int?)null diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/IContractRepository.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/IContractRepository.cs index 4d9604a..4e938ec 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/IContractRepository.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/IContractRepository.cs @@ -10,7 +10,7 @@ namespace TradeAndProcurementEnterprice.Repositories; public interface IContractRepository { IEnumerable ReadContracts(DateTime? dateFrom = null, DateTime? dateTo = null, - int? productArticle = null, int? agentID = null, int? purchasingCompaniID = null); + int? productArticle = null, int? agentID = null, int? purchasingCompanyID = null); void CreateContract(Contract contract); } diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/AgentsRepository.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/AgentsRepository.cs index c78da09..520c9c7 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/AgentsRepository.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/AgentsRepository.cs @@ -34,8 +34,8 @@ internal class AgentsRepository : IAgentsRepository using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var queryInsert = @" -INSERT INTO Agents (Name, Qualification, Category) -VALUES (@Name, @Qualification, @Category)"; +INSERT INTO Agents (Name, Surname, Qualification, Category) +VALUES (@Name, @Surname, @Qualification, @Category)"; connection.Execute(queryInsert, agent); } catch (Exception ex) @@ -118,6 +118,7 @@ WHERE Id=@id"; UPDATE Agents SET Name=@Name, + Surname=@Surname, Qualification=@Qualification, Category=@Category WHERE Id=@Id"; diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/ContractRepository.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/ContractRepository.cs index 2ee09dd..7ab264a 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/ContractRepository.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/ContractRepository.cs @@ -57,20 +57,75 @@ VALUES (@ID, @ProductArticle, @ProductQuantity)"; } } - public IEnumerable ReadContracts(DateTime? dateFrom = null, DateTime? dateTo = null, int? productArticle = null, int? agentID = null, int? purchasingCompaniID = null) + public IEnumerable ReadContracts(DateTime? dateFrom = null, DateTime? dateTo = null, int? productArticle = null, + int? agentID = null, int? purchasingCompanyID = null) { _logger.LogInformation("Получение всех объектов."); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("c.SaleDate >= @dateForm"); + } + if (dateTo.HasValue) + { + builder.AddCondition("c.SaleDate <= @dateTo"); + } + if (productArticle.HasValue) + { + builder.AddCondition("c.ProductArticle = @productArticle"); + } + if (agentID.HasValue) + { + builder.AddCondition("c.AgentsId = @agentsID"); + } + if (purchasingCompanyID.HasValue) + { + builder.AddCondition("c.PurchasingCompanyID = @purchasingCompanyID"); + } + + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @" -SELECT c.*, ps.ProductArticle, ps.ProductQuantity FROM Contracts c -INNER JOIN ProductSales ps ON ps.ID = c.ID"; - var contracts = connection.Query(querySelect); + var querySelect = @$" +SELECT + c.*, + CONCAT(a.Name, ' ', a.Surname) as AgentsName, + pc.Name as CompanyName, + ps.ProductArticle, + ps.ProductQuantity, + p.Name as ProductName +FROM Contracts c +LEFT JOIN Agents a on a.Id = c.AgentsId +LEFT JOIN purchasingcompanies pc on pc.Id = c.PurchasingCompanyID +INNER JOIN ProductSales ps ON ps.ID = c.ID +LEFT JOIN Products p on p.Article = ps.ProductArticle +{builder.Build()}"; + + var salesDict = new Dictionary>(); + + var contracts = connection.Query(querySelect, + (sales, contract) => + { + if (!salesDict.TryGetValue(sales.ID, out var ps)) + { + ps = []; + salesDict.Add(sales.ID, ps); + } + + ps.Add(contract); + return sales; + }, splitOn: "ProductArticle", param: new { dateFrom, dateTo, productArticle, agentID, purchasingCompanyID }); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts)); - return contracts.GroupBy(x => x.ID, y => y, - (key, value) => Contract.CreateOperation(value.First(), - value.Select(z => ProductSales.CreateElement(0, z.ProductArticle, z.ProductQuantity)))).ToList(); + + return salesDict.Select(x => + { + var c = contracts.First(y => y.ID == x.Key); + c.SetProductSales(x.Value); + return c; + }).ToArray(); + } catch (Exception ex) { diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/DelegateToAgentRepository.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/DelegateToAgentRepository.cs index 0e76969..062a379 100644 --- a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/DelegateToAgentRepository.cs +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/DelegateToAgentRepository.cs @@ -43,13 +43,38 @@ VALUES (@ProductArticle, @AgentsID, @Quantity, @Date)"; } } - public IEnumerable ReadDelegatesToAgent(DateTime? dateFrom = null, DateTime? dateTo = null, int? productArticle = null, int? agentID = null) + public IEnumerable ReadDelegatesToAgent(DateTime? dateFrom = null, DateTime? dateTo = null, + int? productArticle = null, int? agentID = null) { _logger.LogInformation("Получение всех объектов."); try { + /*var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("dta.Date >= @dateFrom"); } + if (dateTo.HasValue) + { + builder.AddCondition("dta.Date <= @dateTo"); + } + if (productArticle.HasValue) + { + builder.AddCondition("dta.ProductArticle = @productArticle"); + } + if (agentID.HasValue) + { + builder.AddCondition("dta.AgentsId = @agentsID"); + }*/ + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM DelegateToAgents"; + var querySelect = @$"SELECT + dta.*, + p.Name as ProductName, + CONCAT(a.Name, ' ', a.Surname) as AgentsName +FROM DelegateToAgents dta +LEFT JOIN Agents a on a.Id = dta.AgentsId +LEFT JOIN Products p on p.Article = dta.ProductArticle"; +//{builder.Build()}"; var delegatesToAgents = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(delegatesToAgents)); return delegatesToAgents; diff --git a/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/QueryBuilder.cs b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..b2ab03f --- /dev/null +++ b/TradeAndProcurementEnterprice/TradeAndProcurementEnterprice/Repositories/Implementations/QueryBuilder.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TradeAndProcurementEnterprice.Repositories.Implementations; + +internal class QueryBuilder +{ + private readonly StringBuilder _builder; + + public QueryBuilder() + { + _builder = new(); + } + + public QueryBuilder AddCondition(string condition) + { + if (_builder.Length > 0) + { + _builder.Append(" AND "); + } + _builder.Append(condition); + return this; + } + + public string Build() + { + if (_builder.Length == 0) + { + return string.Empty; + } + + return $"WHERE {_builder}"; + } +}