From 713e0968620cef7e28321463e4c534733b657a11 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 3 May 2023 16:28:35 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B0=D0=B4=D0=BE=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImplementationBusinessLogicExtension.cs | 35 ++ .../IceCreamShop/DataGridViewExtension.cs | 1 + .../IceCreamShop/FormMain.Designer.cs | 583 ++++++------------ IceCreamShop/IceCreamShop/FormMain.cs | 458 +++++++------- IceCreamShop/IceCreamShop/FormShops.cs | 43 +- IceCreamShop/IceCreamShop/FormViewMail.cs | 48 +- IceCreamShop/IceCreamShop/Program.cs | 54 +- .../Attributes/ColumnAttribute.cs | 5 +- .../BindingModels/MessageInfoBindingModel.cs | 7 +- .../DI/DependencyManager.cs | 13 +- .../IImplementationBusinessLogicExtension.cs | 9 + .../DI/ServiceProviderLoader.cs | 32 +- .../ViewModels/ComponentViewModel.cs | 4 +- .../ViewModels/IceCreamViewModel.cs | 4 +- .../ViewModels/MessageInfoViewModel.cs | 42 +- .../ViewModels/OrderViewModel.cs | 8 +- .../ViewModels/ShopViewModel.cs | 15 +- .../Models/MessageInfo.cs | 24 +- .../FileImplementationExtension.cs | 1 + .../Models/MessageInfo.cs | 59 +- .../Implements/MessageInfoStorage.cs | 1 - .../ListImplementationExtension.cs | 2 +- .../Models/MessageInfo.cs | 36 +- .../IceCreamShopContracts.dll | Bin 31744 -> 37888 bytes .../IceCreamShopDataModels.dll | Bin 6144 -> 6656 bytes .../IceCreamShopListImplement.dll | Bin 26624 -> 30720 bytes 26 files changed, 638 insertions(+), 846 deletions(-) create mode 100644 IceCreamShop/IceCreamBusinessLogic/BusinessLogics/ImplementationBusinessLogicExtension.cs create mode 100644 IceCreamShop/IceCreamShopContracts/DI/IImplementationBusinessLogicExtension.cs diff --git a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/ImplementationBusinessLogicExtension.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/ImplementationBusinessLogicExtension.cs new file mode 100644 index 0000000..ad29864 --- /dev/null +++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/ImplementationBusinessLogicExtension.cs @@ -0,0 +1,35 @@ +using IceCreamBusinessLogic.BusinessLogics; +using IceCreamBusinessLogic.MailWorker; +using IceCreamBusinessLogic.OfficePackage.Implements; +using IceCreamBusinessLogic.OfficePackage; +using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.DI; +using IceCreamBusinessLogic.BusinessLogic; + +namespace ConfectioneryBusinessLogic +{ + public class ImplementationBusinessLogicExtension : IImplementationBusinessLogicExtension + { + public int Priority => 0; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + + DependencyManager.Instance.RegisterType(true); + + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/IceCreamShop/IceCreamShop/DataGridViewExtension.cs b/IceCreamShop/IceCreamShop/DataGridViewExtension.cs index a43d144..b96c1ba 100644 --- a/IceCreamShop/IceCreamShop/DataGridViewExtension.cs +++ b/IceCreamShop/IceCreamShop/DataGridViewExtension.cs @@ -31,6 +31,7 @@ namespace IceCreamShopView { column.HeaderText = columnAttr.Title; column.Visible = columnAttr.Visible; + column.DefaultCellStyle.Format = columnAttr.Format; if (columnAttr.IsUseAutoSize) { column.AutoSizeMode = (DataGridViewAutoSizeColumnMode)Enum.Parse(typeof(DataGridViewAutoSizeColumnMode), columnAttr.GridViewAutoSize.ToString()); diff --git a/IceCreamShop/IceCreamShop/FormMain.Designer.cs b/IceCreamShop/IceCreamShop/FormMain.Designer.cs index 2303bdf..f61aaf1 100644 --- a/IceCreamShop/IceCreamShop/FormMain.Designer.cs +++ b/IceCreamShop/IceCreamShop/FormMain.Designer.cs @@ -1,470 +1,273 @@ namespace IceCreamShopView { - partial class FormMain - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; + partial class FormMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - buttonUpdate = new Button(); - buttonSetToFinish = new Button(); - buttonCreateOrder = new Button(); - dataGridView = new DataGridView(); - menuStrip = new MenuStrip(); - справочникиToolStripMenuItem = new ToolStripMenuItem(); - компонентыToolStripMenuItem = new ToolStripMenuItem(); - мороженоеToolStripMenuItem = new ToolStripMenuItem(); - клиентыToolStripMenuItem = new ToolStripMenuItem(); - ImplementersToolStripMenuItem = new ToolStripMenuItem(); - отчетыToolStripMenuItem = new ToolStripMenuItem(); - iceCreamComponentsToolStripMenuItem = new ToolStripMenuItem(); - iceCreamToolStripMenuItem = new ToolStripMenuItem(); - ordersToolStripMenuItem = new ToolStripMenuItem(); - DoWorkToolStripMenuItem = new ToolStripMenuItem(); - MailToolStripMenuItem = new ToolStripMenuItem(); - createBackupToolStripMenuItem = new ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); - menuStrip.SuspendLayout(); - SuspendLayout(); - // - // buttonUpdate - // - buttonUpdate.Location = new Point(1081, 112); - buttonUpdate.Margin = new Padding(3, 2, 3, 2); - buttonUpdate.Name = "buttonUpdate"; - buttonUpdate.Size = new Size(170, 37); - buttonUpdate.TabIndex = 13; - buttonUpdate.Text = "Обновить"; - buttonUpdate.UseVisualStyleBackColor = true; - buttonUpdate.Click += buttonUpdate_Click; - // - // buttonSetToFinish - // - buttonSetToFinish.Location = new Point(1081, 70); - buttonSetToFinish.Margin = new Padding(3, 2, 3, 2); - buttonSetToFinish.Name = "buttonSetToFinish"; - buttonSetToFinish.Size = new Size(170, 37); - buttonSetToFinish.TabIndex = 12; - buttonSetToFinish.Text = "Заказ выдан"; - buttonSetToFinish.UseVisualStyleBackColor = true; - buttonSetToFinish.Click += buttonSetToFinish_Click; - // - // buttonCreateOrder - // - buttonCreateOrder.Location = new Point(1081, 29); - buttonCreateOrder.Margin = new Padding(3, 2, 3, 2); - buttonCreateOrder.Name = "buttonCreateOrder"; - buttonCreateOrder.Size = new Size(170, 37); - buttonCreateOrder.TabIndex = 9; - buttonCreateOrder.Text = "Создать заказ"; - buttonCreateOrder.UseVisualStyleBackColor = true; - buttonCreateOrder.Click += buttonCreateOrder_Click; - // - // dataGridView - // - dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView.Location = new Point(12, 26); - dataGridView.Margin = new Padding(3, 2, 3, 2); - dataGridView.Name = "dataGridView"; - dataGridView.RowHeadersWidth = 51; - dataGridView.RowTemplate.Height = 29; - dataGridView.Size = new Size(1063, 305); - dataGridView.TabIndex = 8; - // - // menuStrip - // - menuStrip.ImageScalingSize = new Size(20, 20); - menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem, DoWorkToolStripMenuItem, MailToolStripMenuItem, createBackupToolStripMenuItem }); - menuStrip.Location = new Point(0, 0); - menuStrip.Name = "menuStrip"; - menuStrip.Padding = new Padding(5, 2, 0, 2); - menuStrip.Size = new Size(1261, 24); - menuStrip.TabIndex = 7; - menuStrip.Text = "Справочники"; - // - // справочникиToolStripMenuItem - // - справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, мороженоеToolStripMenuItem, клиентыToolStripMenuItem, ImplementersToolStripMenuItem }); - справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - справочникиToolStripMenuItem.Size = new Size(94, 20); - справочникиToolStripMenuItem.Text = "Справочники"; - // - // компонентыToolStripMenuItem - // - компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - компонентыToolStripMenuItem.Size = new Size(149, 22); - компонентыToolStripMenuItem.Text = "Компоненты"; - компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click; - // - // мороженоеToolStripMenuItem - // - мороженоеToolStripMenuItem.Name = "мороженоеToolStripMenuItem"; - мороженоеToolStripMenuItem.Size = new Size(149, 22); - мороженоеToolStripMenuItem.Text = "Мороженое"; - мороженоеToolStripMenuItem.Click += мороженоеToolStripMenuItem_Click; - // - // клиентыToolStripMenuItem - // - клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(149, 22); - клиентыToolStripMenuItem.Text = "Клиенты"; - клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; - // - // ImplementersToolStripMenuItem - // - ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem"; - ImplementersToolStripMenuItem.Size = new Size(149, 22); - ImplementersToolStripMenuItem.Text = "Исполнители"; - ImplementersToolStripMenuItem.Click += ImplementersToolStripMenuItem_Click; - // - // отчетыToolStripMenuItem - // - отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { iceCreamComponentsToolStripMenuItem, iceCreamToolStripMenuItem, ordersToolStripMenuItem }); - отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; - отчетыToolStripMenuItem.Size = new Size(60, 20); - отчетыToolStripMenuItem.Text = "Отчеты"; - // - // iceCreamComponentsToolStripMenuItem - // - iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem"; - iceCreamComponentsToolStripMenuItem.Size = new Size(238, 22); - iceCreamComponentsToolStripMenuItem.Text = "Список мороженых"; - iceCreamComponentsToolStripMenuItem.Click += IceCreamsToolStripMenuItem_Click; - // - // iceCreamToolStripMenuItem - // - iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem"; - iceCreamToolStripMenuItem.Size = new Size(238, 22); - iceCreamToolStripMenuItem.Text = "Мороженые с компонентами"; - iceCreamToolStripMenuItem.Click += IceCreamComponentsToolStripMenuItem_Click; - // - // ordersToolStripMenuItem - // - ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; - ordersToolStripMenuItem.Size = new Size(238, 22); - ordersToolStripMenuItem.Text = "Список заказов"; - ordersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; - // - // DoWorkToolStripMenuItem - // - DoWorkToolStripMenuItem.Name = "DoWorkToolStripMenuItem"; - DoWorkToolStripMenuItem.Size = new Size(92, 20); - DoWorkToolStripMenuItem.Text = "Запуск работ"; - DoWorkToolStripMenuItem.Click += DoWorkToolStripMenuItem_Click; - // - // MailToolStripMenuItem - // - MailToolStripMenuItem.Name = "MailToolStripMenuItem"; - MailToolStripMenuItem.Size = new Size(62, 20); - MailToolStripMenuItem.Text = "Письма"; - MailToolStripMenuItem.Click += MailToolStripMenuItem_Click; - // - // createBackupToolStripMenuItem - // - createBackupToolStripMenuItem.Name = "createBackupToolStripMenuItem"; - createBackupToolStripMenuItem.Size = new Size(97, 20); - createBackupToolStripMenuItem.Text = "Создать бекап"; - createBackupToolStripMenuItem.Click += createBackupToolStripMenuItem_Click; - // - // FormMain - // - AutoScaleDimensions = new SizeF(7F, 15F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1261, 347); - Controls.Add(buttonUpdate); - Controls.Add(buttonSetToFinish); - Controls.Add(buttonCreateOrder); - Controls.Add(dataGridView); - Controls.Add(menuStrip); - Name = "FormMain"; - Text = "Магазин мороженого"; - Load += FormMain_Load; - ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); - menuStrip.ResumeLayout(false); - menuStrip.PerformLayout(); - ResumeLayout(false); - PerformLayout(); - } /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { - this.buttonUpdate = new System.Windows.Forms.Button(); - this.buttonSetToFinish = new System.Windows.Forms.Button(); - this.buttonCreateOrder = new System.Windows.Forms.Button(); - this.dataGridView = new System.Windows.Forms.DataGridView(); - this.menuStrip = new System.Windows.Forms.MenuStrip(); - this.справочникиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.компонентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.мороженоеToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.клиентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ImplementersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.магазиныToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.отчетыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.iceCreamComponentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.iceCreamToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ordersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.listShopsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.shopWorkloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ordersByDateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DoWorkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonSupplyShop = new System.Windows.Forms.Button(); - this.SellIceCreamButton = new System.Windows.Forms.Button(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.menuStrip.SuspendLayout(); - this.SuspendLayout(); + buttonUpdate = new Button(); + buttonSetToFinish = new Button(); + buttonCreateOrder = new Button(); + dataGridView = new DataGridView(); + menuStrip = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + компонентыToolStripMenuItem = new ToolStripMenuItem(); + мороженоеToolStripMenuItem = new ToolStripMenuItem(); + клиентыToolStripMenuItem = new ToolStripMenuItem(); + ImplementersToolStripMenuItem = new ToolStripMenuItem(); + магазиныToolStripMenuItem = new ToolStripMenuItem(); + отчетыToolStripMenuItem = new ToolStripMenuItem(); + iceCreamComponentsToolStripMenuItem = new ToolStripMenuItem(); + iceCreamToolStripMenuItem = new ToolStripMenuItem(); + ordersToolStripMenuItem = new ToolStripMenuItem(); + listShopsToolStripMenuItem = new ToolStripMenuItem(); + shopWorkloadToolStripMenuItem = new ToolStripMenuItem(); + ordersByDateToolStripMenuItem = new ToolStripMenuItem(); + DoWorkToolStripMenuItem = new ToolStripMenuItem(); + MailToolStripMenuItem = new ToolStripMenuItem(); + createBackupToolStripMenuItem = new ToolStripMenuItem(); + buttonSupplyShop = new Button(); + SellIceCreamButton = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + menuStrip.SuspendLayout(); + SuspendLayout(); // // buttonUpdate // - this.buttonUpdate.Location = new System.Drawing.Point(1231, 392); - this.buttonUpdate.Name = "buttonUpdate"; - this.buttonUpdate.Size = new System.Drawing.Size(194, 49); - this.buttonUpdate.TabIndex = 13; - this.buttonUpdate.Text = "Обновить"; - this.buttonUpdate.UseVisualStyleBackColor = true; - this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click); + buttonUpdate.Location = new Point(1081, 112); + buttonUpdate.Margin = new Padding(3, 2, 3, 2); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(170, 37); + buttonUpdate.TabIndex = 13; + buttonUpdate.Text = "Обновить"; + buttonUpdate.UseVisualStyleBackColor = true; + buttonUpdate.Click += buttonUpdate_Click; // // buttonSetToFinish // - this.buttonSetToFinish.Location = new System.Drawing.Point(1231, 90); - this.buttonSetToFinish.Name = "buttonSetToFinish"; - this.buttonSetToFinish.Size = new System.Drawing.Size(194, 49); - this.buttonSetToFinish.TabIndex = 12; - this.buttonSetToFinish.Text = "Заказ выдан"; - this.buttonSetToFinish.UseVisualStyleBackColor = true; - this.buttonSetToFinish.Click += new System.EventHandler(this.buttonSetToFinish_Click); + buttonSetToFinish.Location = new Point(1081, 70); + buttonSetToFinish.Margin = new Padding(3, 2, 3, 2); + buttonSetToFinish.Name = "buttonSetToFinish"; + buttonSetToFinish.Size = new Size(170, 37); + buttonSetToFinish.TabIndex = 12; + buttonSetToFinish.Text = "Заказ выдан"; + buttonSetToFinish.UseVisualStyleBackColor = true; + buttonSetToFinish.Click += buttonSetToFinish_Click; // // buttonCreateOrder // - this.buttonCreateOrder.Location = new System.Drawing.Point(1231, 35); - this.buttonCreateOrder.Name = "buttonCreateOrder"; - this.buttonCreateOrder.Size = new System.Drawing.Size(194, 49); - this.buttonCreateOrder.TabIndex = 9; - this.buttonCreateOrder.Text = "Создать заказ"; - this.buttonCreateOrder.UseVisualStyleBackColor = true; - this.buttonCreateOrder.Click += new System.EventHandler(this.buttonCreateOrder_Click); + buttonCreateOrder.Location = new Point(1081, 29); + buttonCreateOrder.Margin = new Padding(3, 2, 3, 2); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(170, 37); + buttonCreateOrder.TabIndex = 9; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += buttonCreateOrder_Click; // // dataGridView // - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Location = new System.Drawing.Point(14, 35); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowHeadersWidth = 51; - this.dataGridView.RowTemplate.Height = 29; - this.dataGridView.Size = new System.Drawing.Size(1202, 407); - this.dataGridView.TabIndex = 8; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(12, 26); + dataGridView.Margin = new Padding(3, 2, 3, 2); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(1063, 305); + dataGridView.TabIndex = 8; // // menuStrip // - this.menuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); - this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.справочникиToolStripMenuItem, - this.отчетыToolStripMenuItem, - this.DoWorkToolStripMenuItem}); - this.menuStrip.Location = new System.Drawing.Point(0, 0); - this.menuStrip.Name = "menuStrip"; - this.menuStrip.Padding = new System.Windows.Forms.Padding(6, 3, 0, 3); - this.menuStrip.Size = new System.Drawing.Size(1433, 30); - this.menuStrip.TabIndex = 7; - this.menuStrip.Text = "Справочники"; + menuStrip.ImageScalingSize = new Size(20, 20); + menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem, DoWorkToolStripMenuItem, MailToolStripMenuItem, createBackupToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Padding = new Padding(5, 2, 0, 2); + menuStrip.Size = new Size(1261, 24); + menuStrip.TabIndex = 7; + menuStrip.Text = "Справочники"; // // справочникиToolStripMenuItem // - this.справочникиToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.компонентыToolStripMenuItem, - this.мороженоеToolStripMenuItem, - this.клиентыToolStripMenuItem, - this.ImplementersToolStripMenuItem, - this.магазиныToolStripMenuItem}); - this.справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - this.справочникиToolStripMenuItem.Size = new System.Drawing.Size(117, 24); - this.справочникиToolStripMenuItem.Text = "Справочники"; + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, мороженоеToolStripMenuItem, клиентыToolStripMenuItem, ImplementersToolStripMenuItem, магазиныToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(94, 20); + справочникиToolStripMenuItem.Text = "Справочники"; // // компонентыToolStripMenuItem // - this.компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - this.компонентыToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.компонентыToolStripMenuItem.Text = "Компоненты"; - this.компонентыToolStripMenuItem.Click += new System.EventHandler(this.компонентыToolStripMenuItem_Click); + компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; + компонентыToolStripMenuItem.Size = new Size(149, 22); + компонентыToolStripMenuItem.Text = "Компоненты"; + компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click; // // мороженоеToolStripMenuItem // - this.мороженоеToolStripMenuItem.Name = "мороженоеToolStripMenuItem"; - this.мороженоеToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.мороженоеToolStripMenuItem.Text = "Мороженое"; - this.мороженоеToolStripMenuItem.Click += new System.EventHandler(this.мороженоеToolStripMenuItem_Click); + мороженоеToolStripMenuItem.Name = "мороженоеToolStripMenuItem"; + мороженоеToolStripMenuItem.Size = new Size(149, 22); + мороженоеToolStripMenuItem.Text = "Мороженое"; + мороженоеToolStripMenuItem.Click += мороженоеToolStripMenuItem_Click; // // клиентыToolStripMenuItem // - this.клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - this.клиентыToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.клиентыToolStripMenuItem.Text = "Клиенты"; - this.клиентыToolStripMenuItem.Click += new System.EventHandler(this.клиентыToolStripMenuItem_Click); + клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; + клиентыToolStripMenuItem.Size = new Size(149, 22); + клиентыToolStripMenuItem.Text = "Клиенты"; + клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; // // ImplementersToolStripMenuItem // - this.ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem"; - this.ImplementersToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.ImplementersToolStripMenuItem.Text = "Исполнители"; - this.ImplementersToolStripMenuItem.Click += new System.EventHandler(this.ImplementersToolStripMenuItem_Click); + ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem"; + ImplementersToolStripMenuItem.Size = new Size(149, 22); + ImplementersToolStripMenuItem.Text = "Исполнители"; + ImplementersToolStripMenuItem.Click += ImplementersToolStripMenuItem_Click; // // магазиныToolStripMenuItem // - this.магазиныToolStripMenuItem.Name = "магазиныToolStripMenuItem"; - this.магазиныToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.магазиныToolStripMenuItem.Text = "Магазины"; - this.магазиныToolStripMenuItem.Click += new System.EventHandler(this.магазиныToolStripMenuItem_Click); + магазиныToolStripMenuItem.Name = "магазиныToolStripMenuItem"; + магазиныToolStripMenuItem.Size = new Size(149, 22); + магазиныToolStripMenuItem.Text = "Магазины"; + магазиныToolStripMenuItem.Click += магазиныToolStripMenuItem_Click; // // отчетыToolStripMenuItem // - this.отчетыToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.iceCreamComponentsToolStripMenuItem, - this.iceCreamToolStripMenuItem, - this.ordersToolStripMenuItem, - this.listShopsToolStripMenuItem, - this.shopWorkloadToolStripMenuItem, - this.ordersByDateToolStripMenuItem}); - this.отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; - this.отчетыToolStripMenuItem.Size = new System.Drawing.Size(73, 24); - this.отчетыToolStripMenuItem.Text = "Отчеты"; + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { iceCreamComponentsToolStripMenuItem, iceCreamToolStripMenuItem, ordersToolStripMenuItem, listShopsToolStripMenuItem, shopWorkloadToolStripMenuItem, ordersByDateToolStripMenuItem }); + отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; + отчетыToolStripMenuItem.Size = new Size(60, 20); + отчетыToolStripMenuItem.Text = "Отчеты"; // // iceCreamComponentsToolStripMenuItem // - this.iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem"; - this.iceCreamComponentsToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.iceCreamComponentsToolStripMenuItem.Text = "Список мороженых"; - this.iceCreamComponentsToolStripMenuItem.Click += new System.EventHandler(this.IceCreamsToolStripMenuItem_Click); + iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem"; + iceCreamComponentsToolStripMenuItem.Size = new Size(238, 22); + iceCreamComponentsToolStripMenuItem.Text = "Список мороженых"; + iceCreamComponentsToolStripMenuItem.Click += IceCreamsToolStripMenuItem_Click; // // iceCreamToolStripMenuItem // - this.iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem"; - this.iceCreamToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.iceCreamToolStripMenuItem.Text = "Мороженые с компонентами"; - this.iceCreamToolStripMenuItem.Click += new System.EventHandler(this.IceCreamComponentsToolStripMenuItem_Click); + iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem"; + iceCreamToolStripMenuItem.Size = new Size(238, 22); + iceCreamToolStripMenuItem.Text = "Мороженые с компонентами"; + iceCreamToolStripMenuItem.Click += IceCreamComponentsToolStripMenuItem_Click; // // ordersToolStripMenuItem // - this.ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; - this.ordersToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.ordersToolStripMenuItem.Text = "Список заказов"; - this.ordersToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click); + ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; + ordersToolStripMenuItem.Size = new Size(238, 22); + ordersToolStripMenuItem.Text = "Список заказов"; + ordersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; // // listShopsToolStripMenuItem // - this.listShopsToolStripMenuItem.Name = "listShopsToolStripMenuItem"; - this.listShopsToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.listShopsToolStripMenuItem.Text = "Список магазинов"; - this.listShopsToolStripMenuItem.Click += new System.EventHandler(this.listShopsToolStripMenuItem_Click); + listShopsToolStripMenuItem.Name = "listShopsToolStripMenuItem"; + listShopsToolStripMenuItem.Size = new Size(238, 22); + listShopsToolStripMenuItem.Text = "Список магазинов"; + listShopsToolStripMenuItem.Click += listShopsToolStripMenuItem_Click; // // shopWorkloadToolStripMenuItem // - this.shopWorkloadToolStripMenuItem.Name = "shopWorkloadToolStripMenuItem"; - this.shopWorkloadToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.shopWorkloadToolStripMenuItem.Text = "Загруженность магазинов"; - this.shopWorkloadToolStripMenuItem.Click += new System.EventHandler(this.shopWorkloadToolStripMenuItem_Click); + shopWorkloadToolStripMenuItem.Name = "shopWorkloadToolStripMenuItem"; + shopWorkloadToolStripMenuItem.Size = new Size(238, 22); + shopWorkloadToolStripMenuItem.Text = "Загруженность магазинов"; + shopWorkloadToolStripMenuItem.Click += shopWorkloadToolStripMenuItem_Click; // // ordersByDateToolStripMenuItem // - this.ordersByDateToolStripMenuItem.Name = "ordersByDateToolStripMenuItem"; - this.ordersByDateToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.ordersByDateToolStripMenuItem.Text = "Заказы по дате"; - this.ordersByDateToolStripMenuItem.Click += new System.EventHandler(this.ordersByDateToolStripMenuItem_Click); + ordersByDateToolStripMenuItem.Name = "ordersByDateToolStripMenuItem"; + ordersByDateToolStripMenuItem.Size = new Size(238, 22); + ordersByDateToolStripMenuItem.Text = "Заказы по дате"; + ordersByDateToolStripMenuItem.Click += ordersByDateToolStripMenuItem_Click; // // DoWorkToolStripMenuItem // - this.DoWorkToolStripMenuItem.Name = "DoWorkToolStripMenuItem"; - this.DoWorkToolStripMenuItem.Size = new System.Drawing.Size(114, 24); - this.DoWorkToolStripMenuItem.Text = "Запуск работ"; - this.DoWorkToolStripMenuItem.Click += new System.EventHandler(this.DoWorkToolStripMenuItem_Click); + DoWorkToolStripMenuItem.Name = "DoWorkToolStripMenuItem"; + DoWorkToolStripMenuItem.Size = new Size(92, 20); + DoWorkToolStripMenuItem.Text = "Запуск работ"; + DoWorkToolStripMenuItem.Click += DoWorkToolStripMenuItem_Click; + // + // MailToolStripMenuItem + // + MailToolStripMenuItem.Name = "MailToolStripMenuItem"; + MailToolStripMenuItem.Size = new Size(62, 20); + MailToolStripMenuItem.Text = "Письма"; + MailToolStripMenuItem.Click += MailToolStripMenuItem_Click; + // + // createBackupToolStripMenuItem + // + createBackupToolStripMenuItem.Name = "createBackupToolStripMenuItem"; + createBackupToolStripMenuItem.Size = new Size(97, 20); + createBackupToolStripMenuItem.Text = "Создать бекап"; + createBackupToolStripMenuItem.Click += createBackupToolStripMenuItem_Click; // // buttonSupplyShop // - this.buttonSupplyShop.Location = new System.Drawing.Point(1231, 292); - this.buttonSupplyShop.Name = "buttonSupplyShop"; - this.buttonSupplyShop.Size = new System.Drawing.Size(194, 44); - this.buttonSupplyShop.TabIndex = 14; - this.buttonSupplyShop.Text = "Пополнение магазина"; - this.buttonSupplyShop.UseVisualStyleBackColor = true; - this.buttonSupplyShop.Click += new System.EventHandler(this.buttonSupplyShop_Click); + buttonSupplyShop.Location = new Point(1081, 243); + buttonSupplyShop.Margin = new Padding(3, 2, 3, 2); + buttonSupplyShop.Name = "buttonSupplyShop"; + buttonSupplyShop.Size = new Size(170, 37); + buttonSupplyShop.TabIndex = 14; + buttonSupplyShop.Text = "Пополнение магазина"; + buttonSupplyShop.UseVisualStyleBackColor = true; + buttonSupplyShop.Click += new System.EventHandler(this.buttonSupplyShop_Click); // // SellIceCreamButton // - this.SellIceCreamButton.Location = new System.Drawing.Point(1231, 248); - this.SellIceCreamButton.Name = "SellIceCreamButton"; - this.SellIceCreamButton.Size = new System.Drawing.Size(194, 40); - this.SellIceCreamButton.TabIndex = 15; - this.SellIceCreamButton.Text = "Продажа мороженого"; - this.SellIceCreamButton.UseVisualStyleBackColor = true; - this.SellIceCreamButton.Click += new System.EventHandler(this.SellIceCreamButton_Click); + SellIceCreamButton.Location = new Point(1081, 284); + SellIceCreamButton.Margin = new Padding(3, 2, 3, 2); + SellIceCreamButton.Name = "SellIceCreamButton"; + SellIceCreamButton.Size = new Size(170, 37); + SellIceCreamButton.TabIndex = 15; + SellIceCreamButton.Text = "Продажа мороженого"; + SellIceCreamButton.UseVisualStyleBackColor = true; + SellIceCreamButton.Click += new System.EventHandler(this.SellIceCreamButton_Click); // // FormMain // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1433, 467); - this.Controls.Add(this.SellIceCreamButton); - this.Controls.Add(this.buttonSupplyShop); - this.Controls.Add(this.buttonUpdate); - this.Controls.Add(this.buttonSetToFinish); - this.Controls.Add(this.buttonCreateOrder); - this.Controls.Add(this.dataGridView); - this.Controls.Add(this.menuStrip); - this.Margin = new System.Windows.Forms.Padding(3, 5, 3, 5); - this.Name = "FormMain"; - this.Text = "Магазин мороженого"; - this.Load += new System.EventHandler(this.FormMain_Load); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.menuStrip.ResumeLayout(false); - this.menuStrip.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1261, 347); + Controls.Add(SellIceCreamButton); + Controls.Add(buttonSupplyShop); + Controls.Add(buttonUpdate); + Controls.Add(buttonSetToFinish); + Controls.Add(buttonCreateOrder); + Controls.Add(dataGridView); + Controls.Add(menuStrip); + Name = "FormMain"; + Text = "Магазин мороженого"; + Load += FormMain_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ResumeLayout(false); + PerformLayout(); } - #endregion + #endregion - private Button buttonUpdate; - private Button buttonSetToFinish; - private Button buttonCreateOrder; - private DataGridView dataGridView; - private MenuStrip menuStrip; - private ToolStripMenuItem справочникиToolStripMenuItem; - private ToolStripMenuItem компонентыToolStripMenuItem; - private ToolStripMenuItem мороженоеToolStripMenuItem; - private ToolStripMenuItem отчетыToolStripMenuItem; - private ToolStripMenuItem iceCreamComponentsToolStripMenuItem; - private ToolStripMenuItem iceCreamToolStripMenuItem; - private ToolStripMenuItem ordersToolStripMenuItem; - private ToolStripMenuItem клиентыToolStripMenuItem; - private ToolStripMenuItem ImplementersToolStripMenuItem; - private ToolStripMenuItem DoWorkToolStripMenuItem; - private ToolStripMenuItem MailToolStripMenuItem; - private ToolStripMenuItem createBackupToolStripMenuItem; - } private Button buttonUpdate; private Button buttonSetToFinish; private Button buttonCreateOrder; @@ -480,11 +283,13 @@ private ToolStripMenuItem клиентыToolStripMenuItem; private ToolStripMenuItem ImplementersToolStripMenuItem; private ToolStripMenuItem DoWorkToolStripMenuItem; + private ToolStripMenuItem MailToolStripMenuItem; + private ToolStripMenuItem createBackupToolStripMenuItem; private ToolStripMenuItem магазиныToolStripMenuItem; - private Button buttonSupplyShop; - private Button SellIceCreamButton; private ToolStripMenuItem listShopsToolStripMenuItem; private ToolStripMenuItem shopWorkloadToolStripMenuItem; private ToolStripMenuItem ordersByDateToolStripMenuItem; + private Button buttonSupplyShop; + private Button SellIceCreamButton; } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/FormMain.cs b/IceCreamShop/IceCreamShop/FormMain.cs index 8d3b2cc..fdc71b4 100644 --- a/IceCreamShop/IceCreamShop/FormMain.cs +++ b/IceCreamShop/IceCreamShop/FormMain.cs @@ -1,225 +1,196 @@ -using AbstractIceCreamShopDataModels.Enums; -using ConfectioneryBusinessLogic; -using IceCreamBusinessLogic.BusinessLogics; -using IceCreamShop; +using IceCreamShop; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.BusinessLogicsContracts; using IceCreamShopContracts.DI; using Microsoft.Extensions.Logging; -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; namespace IceCreamShopView { - public partial class FormMain : Form - { - private readonly ILogger _logger; - private readonly IOrderLogic _orderLogic; - private readonly IReportLogic _reportLogic; - private readonly IWorkProcess _workProcess; + public partial class FormMain : Form + { + private readonly ILogger _logger; + private readonly IOrderLogic _orderLogic; + private readonly IReportLogic _reportLogic; + private readonly IWorkProcess _workProcess; private readonly IBackUpLogic _backUpLogic; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess, IBackUpLogic backUpLogic) - { - InitializeComponent(); - _logger = logger; - _orderLogic = orderLogic; - _reportLogic = reportLogic; - _workProcess = workProcess; - _backUpLogic = backUpLogic; - } - private void FormMain_Load(object sender, EventArgs e) - { - LoadData(); - } - - private void LoadData() - { - _logger.LogInformation("Загрузка заказов"); - try - { - dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); - _logger.LogInformation("Загрузка заказов"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки заказов"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - - private void компонентыToolStripMenuItem_Click(object sender, EventArgs e) - { - var form = DependencyManager.Instance.Resolve(); - form.ShowDialog(); - } - - private void мороженоеToolStripMenuItem_Click(object sender, EventArgs e) - { - var form = DependencyManager.Instance.Resolve(); - form.ShowDialog(); - } - - private void buttonCreateOrder_Click(object sender, EventArgs e) - { - var form = DependencyManager.Instance.Resolve(); - form.ShowDialog(); - LoadData(); - } - private void магазиныToolStripMenuItem_Click(object sender, EventArgs e) + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess, IBackUpLogic backUpLogic) { - var service = Program.ServiceProvider?.GetService(typeof(FormShops)); - if (service is FormShops form) + InitializeComponent(); + _logger = logger; + _orderLogic = orderLogic; + _reportLogic = reportLogic; + _workProcess = workProcess; + _backUpLogic = backUpLogic; + } + + private void FormMain_Load(object sender, EventArgs e) + { + LoadData(); + } + + private void LoadData() + { + _logger.LogInformation("Загрузка заказов"); + try { - form.ShowDialog(); + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); + _logger.LogInformation("Загрузка заказов"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки заказов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void buttonSetToWork_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id); - try - { - var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel - { - Id = id, - }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка передачи заказа в работу"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } + private void компонентыToolStripMenuItem_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void мороженоеToolStripMenuItem_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } - private void buttonSetToDone_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id); - try - { - var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel - { - Id = id, - }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка отметки о готовности заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } private void buttonCreateOrder_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - if (service is FormCreateOrder form) + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + LoadData(); + } + private void магазиныToolStripMenuItem_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void buttonSetToWork_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) { - form.ShowDialog(); - LoadData(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id); + try + { + var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel + { + Id = id, + }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка передачи заказа в работу"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } } } - private void buttonSetToFinish_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'", id); - try - { - var operationResult = _orderLogic.FinishOrder(new OrderBindingModel - { - Id = id, - }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - _logger.LogInformation("Заказ №{id} выдан", id); - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка отметки о выдачи заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } + private void buttonSetToDone_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id); + try + { + var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel + { + Id = id, + }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } - private void buttonUpdate_Click(object sender, EventArgs e) - { - LoadData(); - } + private void buttonSetToFinish_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'", id); + try + { + var operationResult = _orderLogic.FinishOrder(new OrderBindingModel + { + Id = id, + }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + _logger.LogInformation("Заказ №{id} выдан", id); + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о выдачи заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } - private void IceCreamsToolStripMenuItem_Click(object sender, EventArgs e) - { - using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; - if (dialog.ShowDialog() == DialogResult.OK) - { - _reportLogic.SaveIceCreamsToWordFile(new ReportBindingModel { FileName = dialog.FileName }); - MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } + private void buttonUpdate_Click(object sender, EventArgs e) + { + LoadData(); + } - private void IceCreamComponentsToolStripMenuItem_Click(object sender, EventArgs e) - { - var form = DependencyManager.Instance.Resolve(); - form.ShowDialog(); - } + private void IceCreamsToolStripMenuItem_Click(object sender, EventArgs e) + { + using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; + if (dialog.ShowDialog() == DialogResult.OK) + { + _reportLogic.SaveIceCreamsToWordFile(new ReportBindingModel { FileName = dialog.FileName }); + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } - private void OrdersToolStripMenuItem_Click(object sender, EventArgs e) - { - var form = DependencyManager.Instance.Resolve(); - form.ShowDialog(); - } + private void IceCreamComponentsToolStripMenuItem_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void OrdersToolStripMenuItem_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } - private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) - { - var form = DependencyManager.Instance.Resolve(); - form.ShowDialog(); - } private void buttonSupplyShop_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormShopSupply)); - if (service is FormShopSupply form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void SellIceCreamButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormSellIceCream)); - - if (service is FormSellIceCream form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void listShopsToolStripMenuItem_Click(object sender, EventArgs e) @@ -237,75 +208,60 @@ namespace IceCreamShopView private void shopWorkloadToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportShopWorkload)); - if (service is FormReportShopWorkload form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void ordersByDateToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportDateOrders)); - if (service is FormReportDateOrders form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } - private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) + private void DoWorkToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)); - if (service is FormClients form) - { - form.ShowDialog(); - } + _workProcess.DoWork( + DependencyManager.Instance.Resolve(), + _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); } - private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e) - { - var form = DependencyManager.Instance.Resolve(); - form.ShowDialog(); - } + private void MailToolStripMenuItem_Click(object sender, EventArgs e) + { + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } - private void DoWorkToolStripMenuItem_Click(object sender, EventArgs e) - { - _workProcess.DoWork( - DependencyManager.Instance.Resolve(), - _orderLogic); - MessageBox.Show("Процесс обработки запущен", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); - } - - private void MailToolStripMenuItem_Click(object sender, EventArgs e) - { - var form = DependencyManager.Instance.Resolve(); - form.ShowDialog(); - } - - private void createBackupToolStripMenuItem_Click(object sender, EventArgs e) - { - try - { - if (_backUpLogic != null) - { - var fbd = new FolderBrowserDialog(); - if (fbd.ShowDialog() == DialogResult.OK) - { - _backUpLogic.CreateBackUp(new BackUpSaveBinidngModel - { - FolderName = fbd.SelectedPath - }); - MessageBox.Show("Бекап создан", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } + private void createBackupToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_backUpLogic != null) + { + var fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + _backUpLogic.CreateBackUp(new BackUpSaveBinidngModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show("Бекап создан", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } } diff --git a/IceCreamShop/IceCreamShop/FormShops.cs b/IceCreamShop/IceCreamShop/FormShops.cs index 8560cca..ed135be 100644 --- a/IceCreamShop/IceCreamShop/FormShops.cs +++ b/IceCreamShop/IceCreamShop/FormShops.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using IceCreamShopContracts.DI; namespace IceCreamShopView { @@ -33,36 +34,23 @@ namespace IceCreamShopView { try { - var list = _logic.ReadList(null); - - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["Name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["ShopIceCreams"].Visible = false; - } - + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка магазинов"); - } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки магазинов"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); } } private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormShop)); - - if (service is FormShop form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -70,12 +58,10 @@ namespace IceCreamShopView { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormShop)); - + var service = DependencyManager.Instance.Resolve(); if (service is FormShop form) { form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) { LoadData(); @@ -88,11 +74,12 @@ namespace IceCreamShopView { if (dataGridView.SelectedRows.Count == 1) { - if (MessageBox.Show("Удалить магазин?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + if (MessageBox.Show("Удалить запись?", "Вопрос", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + int id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); _logger.LogInformation("Удаление магазина"); - try { if (!_logic.Delete(new ShopBindingModel @@ -102,13 +89,13 @@ namespace IceCreamShopView { throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); } - LoadData(); } catch (Exception ex) { - _logger.LogError(ex, "Ошибка удаления изделия"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError(ex, "Ошибка удаления магазина"); + MessageBox.Show(ex.Message, "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); } } } diff --git a/IceCreamShop/IceCreamShop/FormViewMail.cs b/IceCreamShop/IceCreamShop/FormViewMail.cs index 132a34c..f694950 100644 --- a/IceCreamShop/IceCreamShop/FormViewMail.cs +++ b/IceCreamShop/IceCreamShop/FormViewMail.cs @@ -1,5 +1,6 @@ using IceCreamShop; using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.DI; using IceCreamShopContracts.ViewModels; using Microsoft.Extensions.Logging; @@ -27,21 +28,25 @@ namespace IceCreamShopView private bool MailLoad() { - try - { - dataGridView.FillAndConfigGrid(_logic.ReadList(null)); - _logger.LogInformation("Загрузка списка писем"); - labelInfoPages.Text = $"{currentPage} страница"; - return true; - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки писем"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - return false; - } - } + try + { + dataGridView.FillAndConfigGrid(_logic.ReadList(new() + { + Page = currentPage, + PageSize = pageSize, + })); + _logger.LogInformation("Загрузка списка писем"); + labelInfoPages.Text = $"{currentPage} страница"; + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки писем"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + return false; + } + } private void ButtonPrevPage_Click(object sender, EventArgs e) { @@ -75,13 +80,10 @@ namespace IceCreamShopView private void dataGridView_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReplyMail)); - if (service is FormReplyMail form) - { - form.MessageId = (string)dataGridView.Rows[e.RowIndex].Cells["MessageId"].Value; - form.ShowDialog(); - MailLoad(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.MessageId = (string)dataGridView.Rows[e.RowIndex].Cells["MessageId"].Value; + form.ShowDialog(); + MailLoad(); + } } } diff --git a/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs index 0dbbe76..ab4e73d 100644 --- a/IceCreamShop/IceCreamShop/Program.cs +++ b/IceCreamShop/IceCreamShop/Program.cs @@ -58,37 +58,29 @@ namespace IceCreamShop { option.SetMinimumLevel(LogLevel.Information); option.AddNLog("nlog.config"); - }); + }); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - - DependencyManager.Instance.RegisterType(); - - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - } - private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/Attributes/ColumnAttribute.cs b/IceCreamShop/IceCreamShopContracts/Attributes/ColumnAttribute.cs index d2feaa8..8a236c0 100644 --- a/IceCreamShop/IceCreamShopContracts/Attributes/ColumnAttribute.cs +++ b/IceCreamShop/IceCreamShopContracts/Attributes/ColumnAttribute.cs @@ -13,13 +13,16 @@ public bool IsUseAutoSize { get; private set; } - public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + public string Format { get; private set; } + + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false, string format = "") { Title = title; Visible = visible; Width = width; GridViewAutoSize = gridViewAutoSize; IsUseAutoSize = isUseAutoSize; + Format = format; } } } diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs index b8a7e4b..fd620b9 100644 --- a/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs +++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs @@ -16,11 +16,10 @@ namespace IceCreamShopContracts.BindingModels public DateTime DateDelivery { get; set; } - public int Id => throw new NotImplementedException(); - } + public bool HasRead { get; set; } - public bool HasRead { get; set; } + public string? Reply { get; set; } - public string? Reply { get; set; } + public int Id => throw new NotImplementedException(); } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/DI/DependencyManager.cs b/IceCreamShop/IceCreamShopContracts/DI/DependencyManager.cs index 93cda26..9d371b5 100644 --- a/IceCreamShop/IceCreamShopContracts/DI/DependencyManager.cs +++ b/IceCreamShop/IceCreamShopContracts/DI/DependencyManager.cs @@ -22,13 +22,16 @@ namespace IceCreamShopContracts.DI /// public static void InitDependency() { - var ext = ServiceProviderLoader.GetImplementationExtensions(); - if (ext == null) + var extList = ServiceProviderLoader.GetImplementationExtensions(); + foreach (var ext in extList) { - throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + if (ext == null) + { + throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + } + // регистрируем зависимости + ext.RegisterServices(); } - // регистрируем зависимости - ext.RegisterServices(); } /// diff --git a/IceCreamShop/IceCreamShopContracts/DI/IImplementationBusinessLogicExtension.cs b/IceCreamShop/IceCreamShopContracts/DI/IImplementationBusinessLogicExtension.cs new file mode 100644 index 0000000..b6b1133 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/DI/IImplementationBusinessLogicExtension.cs @@ -0,0 +1,9 @@ + +namespace IceCreamShopContracts.DI +{ + /// + /// Интерфейс для индентификации и отделения загрузки бизнес-логики от загрузки хранилищ + /// + /// + public interface IImplementationBusinessLogicExtension : IImplementationExtension { } +} diff --git a/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs b/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs index e09cd8a..8353566 100644 --- a/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs +++ b/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs @@ -8,33 +8,41 @@ namespace IceCreamShopContracts.DI /// Загрузка всех классов-реализаций IImplementationExtension /// /// - public static IImplementationExtension? GetImplementationExtensions() + public static List GetImplementationExtensions() { - IImplementationExtension? source = null; + Type[] handledTypes = + { + typeof(IImplementationBusinessLogicExtension), + typeof(IImplementationExtension) + }; + var result = handledTypes.Select(x => (IImplementationExtension?)null).ToList(); var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories); foreach (var file in files.Distinct()) { Assembly asm = Assembly.LoadFrom(file); foreach (var t in asm.GetExportedTypes()) { - if (t.IsClass && typeof(IImplementationExtension).IsAssignableFrom(t)) + for (var i = 0; i < handledTypes.Length; i++) { - if (source == null) + if (t.IsClass && handledTypes[i].IsAssignableFrom(t)) { - source = (IImplementationExtension)Activator.CreateInstance(t)!; - } - else - { - var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; - if (newSource.Priority > source.Priority) + if (result[i] == null) { - source = newSource; + result[i] = (IImplementationExtension)Activator.CreateInstance(t)!; + } + else + { + var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; + if (newSource.Priority > result[i].Priority) + { + result[i] = newSource; + } } } } } } - return source; + return result; } private static string TryGetImplementationExtensionsFolder() diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs index d577aa7..7f36499 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs @@ -17,8 +17,8 @@ namespace IceCreamShopContracts.ViewModels [Column("Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ComponentName { get; set; } = string.Empty; - [Column("Цена", width: 80)] - public double Cost { get; set; } + [Column("Цена", width: 80, format: "0.00")] + public double Cost { get; set; } } } diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs index 8e98dcf..11bb2ae 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs @@ -17,8 +17,8 @@ namespace IceCreamShopContracts.ViewModels [Column("Название мороженого", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string IceCreamName { get; set; } = string.Empty; - [Column("Цена", width: 100)] - public double Price { get; set; } + [Column("Цена", width: 100, format: "0.00")] + public double Price { get; set; } [Column(visible: false)] public Dictionary IceCreamComponents { get; set; } = new(); diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs index 3356f8c..abfa257 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs @@ -5,34 +5,32 @@ namespace IceCreamShopContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { - [Column(visible: false)] - public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] + public string MessageId { get; set; } = string.Empty; - [Column(visible: false)] - public int? ClientId { get; set; } + [Column(visible: false)] + public int? ClientId { get; set; } - [Column("Отправитель", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] - public string SenderName { get; set; } = string.Empty; + [Column("Отправитель", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] + public string SenderName { get; set; } = string.Empty; - [Column("Дата письма", width: 100)] - public DateTime DateDelivery { get; set; } + [Column("Дата письма", width: 100, format: "D")] + public DateTime DateDelivery { get; set; } - [Column("Заголовок", width: 150)] - public string Subject { get; set; } = string.Empty; + [Column("Заголовок", width: 150)] + public string Subject { get; set; } = string.Empty; - [Column("Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] - public string Body { get; set; } = string.Empty; - - [Column(visible: false)] - public int Id => throw new NotImplementedException(); - } - [DisplayName("Текст")] + [Column("Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Body { get; set; } = string.Empty; - [DisplayName("Прочитано")] - public bool HasRead { get; set; } + [Column(visible: false)] - [DisplayName("Ответ")] - public string? Reply { get; set; } - } + public int Id => throw new NotImplementedException(); + + [Column("Прочитано", gridViewAutoSize: GridViewAutoSize.AllCellsExceptHeader, isUseAutoSize: true)] + public bool HasRead { get; set; } + + [Column("Ответ", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string? Reply { get; set; } + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs index a173759..223155c 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs @@ -42,10 +42,10 @@ namespace IceCreamShopContracts.ViewModels [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [Column("Дата создания", width: 100)] - public DateTime DateCreate { get; set; } = DateTime.Now; + [Column("Дата создания", width: 100, format: "D")] + public DateTime DateCreate { get; set; } = DateTime.Now; - [Column("Дата выполнения", width: 100)] - public DateTime? DateImplement { get; set; } + [Column("Дата выполнения", width: 100, format: "D")] + public DateTime? DateImplement { get; set; } } } diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/ShopViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/ShopViewModel.cs index f49e717..c5d3c19 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/ShopViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/ShopViewModel.cs @@ -1,4 +1,6 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; +using IceCreamShopContracts.Attributes; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,14 +12,19 @@ namespace IceCreamShopContracts.ViewModels { public class ShopViewModel : IShopModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название магазина")] + + [Column("Название магазина", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public string Name { get; set; } = string.Empty; - [DisplayName("Адрес")] + + [Column("Адрес", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Adress { get; set; } = string.Empty; - [DisplayName("Дата открытия")] + + [Column("Дата открытия", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true, format: "f")] public DateTime OpeningDate { get; set; } - [DisplayName("Вместимость магазина")] + + [Column("Вместимость магазина", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] public int IceCreamMaxCount { get; set; } public Dictionary ShopIceCreams { get; set; } = new(); diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs index 3ac9709..14fccc0 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs @@ -13,21 +13,29 @@ namespace IceCreamShopDatabaseImplement.Models [DataMember] public string MessageId { get; private set; } = string.Empty; + [DataMember] public int? ClientId { get; private set; } + [DataMember] public string SenderName { get; private set; } = string.Empty; + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; + [DataMember] public string Subject { get; private set; } = string.Empty; + [DataMember] public string Body { get; private set; } = string.Empty; + [DataMember] public Client? Client { get; private set; } - public bool HasRead { get; private set; } + [DataMember] + public bool HasRead { get; private set; } - public string? Reply { get; private set; } + [DataMember] + public string? Reply { get; private set; } public static MessageInfo? Create(MessageInfoBindingModel model) { @@ -61,6 +69,8 @@ namespace IceCreamShopDatabaseImplement.Models public MessageInfoViewModel GetViewModel => new() { Body = Body, + Reply = Reply, + HasRead = HasRead, Subject = Subject, ClientId = ClientId, MessageId = MessageId, @@ -70,14 +80,4 @@ namespace IceCreamShopDatabaseImplement.Models public int Id => throw new NotImplementedException(); } - Body = Body, - Reply = Reply, - HasRead = HasRead, - Subject = Subject, - ClientId = ClientId, - MessageId = MessageId, - SenderName = SenderName, - DateDelivery = DateDelivery, - }; - } } diff --git a/IceCreamShop/IceCreamShopFileImplement/FileImplementationExtension.cs b/IceCreamShop/IceCreamShopFileImplement/FileImplementationExtension.cs index c177c3a..87d48b8 100644 --- a/IceCreamShop/IceCreamShopFileImplement/FileImplementationExtension.cs +++ b/IceCreamShop/IceCreamShopFileImplement/FileImplementationExtension.cs @@ -16,6 +16,7 @@ namespace IceCreamShopFileImplement DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); } } diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs index 2097a6b..74f42c5 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs @@ -27,9 +27,11 @@ namespace IceCreamShopFileImplement.Models [DataMember] public string Body { get; private set; } = string.Empty; - public bool HasRead { get; private set; } + [DataMember] + public bool HasRead { get; private set; } - public string? Reply { get; private set; } + [DataMember] + public string? Reply { get; private set; } public static MessageInfo? Create(MessageInfoBindingModel model) { @@ -39,15 +41,15 @@ namespace IceCreamShopFileImplement.Models } return new() { - Body = model.Body, - Reply = model.Reply, - HasRead = model.HasRead, - Subject = model.Subject, - ClientId = model.ClientId, - MessageId = model.MessageId, - SenderName = model.SenderName, - DateDelivery = model.DateDelivery, - }; + Body = model.Body, + Reply = model.Reply, + HasRead = model.HasRead, + Subject = model.Subject, + ClientId = model.ClientId, + MessageId = model.MessageId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + }; } public static MessageInfo? Create(XElement element) @@ -58,15 +60,15 @@ namespace IceCreamShopFileImplement.Models } return new() { - Body = element.Attribute("Body")!.Value, - Reply = element.Attribute("Reply")!.Value, - HasRead = Convert.ToBoolean(element.Attribute("HasRead")!.Value), - Subject = element.Attribute("Subject")!.Value, - ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value), - MessageId = element.Attribute("MessageId")!.Value, - SenderName = element.Attribute("SenderName")!.Value, - DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value), - }; + Body = element.Attribute("Body")!.Value, + Reply = element.Attribute("Reply")!.Value, + HasRead = Convert.ToBoolean(element.Attribute("HasRead")!.Value), + Subject = element.Attribute("Subject")!.Value, + ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value), + MessageId = element.Attribute("MessageId")!.Value, + SenderName = element.Attribute("SenderName")!.Value, + DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value), + }; } public void Update(MessageInfoBindingModel model) @@ -91,19 +93,10 @@ namespace IceCreamShopFileImplement.Models DateDelivery = DateDelivery, }; - public XElement GetXElement => new("MessageInfo", - new XAttribute("Body", Body), - new XAttribute("Reply", Reply), - new XAttribute("HasRead", HasRead), - new XAttribute("Subject", Subject), - new XAttribute("ClientId", ClientId), - new XAttribute("MessageId", MessageId), - new XAttribute("SenderName", SenderName), - new XAttribute("DateDelivery", DateDelivery) - ); - } public XElement GetXElement => new("MessageInfo", new XAttribute("Body", Body), + new XAttribute("Reply", Reply), + new XAttribute("HasRead", HasRead), new XAttribute("Subject", Subject), new XAttribute("ClientId", ClientId), new XAttribute("MessageId", MessageId), @@ -111,6 +104,6 @@ namespace IceCreamShopFileImplement.Models new XAttribute("DateDelivery", DateDelivery) ); - public int Id => throw new NotImplementedException(); - } + public int Id => throw new NotImplementedException(); + } } diff --git a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs index 1b6c450..7332916 100644 --- a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs +++ b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs @@ -2,7 +2,6 @@ using IceCreamShopContracts.SearchModels; using IceCreamShopContracts.StoragesContracts; using IceCreamShopContracts.ViewModels; -using IceCreamShopContracts.StoragesContracts; using IceCreamShopListImplement.Models; namespace IceCreamShopListImplement.Implements diff --git a/IceCreamShop/IceCreamShopListImplement/ListImplementationExtension.cs b/IceCreamShop/IceCreamShopListImplement/ListImplementationExtension.cs index a81df9a..fe1a3d3 100644 --- a/IceCreamShop/IceCreamShopListImplement/ListImplementationExtension.cs +++ b/IceCreamShop/IceCreamShopListImplement/ListImplementationExtension.cs @@ -16,8 +16,8 @@ namespace IceCreamShopListImplement DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); } - } } diff --git a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs index 2ec1866..cf66d24 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs @@ -26,9 +26,11 @@ namespace IceCreamShopListImplement.Models [DataMember] public string Body { get; private set; } = string.Empty; - public bool HasRead { get; private set; } + [DataMember] + public bool HasRead { get; private set; } - public string? Reply { get; private set; } + [DataMember] + public string? Reply { get; private set; } public static MessageInfo? Create(MessageInfoBindingModel model) { @@ -38,15 +40,15 @@ namespace IceCreamShopListImplement.Models } return new() { - Body = model.Body, - Reply = model.Reply, - HasRead = model.HasRead, - Subject = model.Subject, - ClientId = model.ClientId, - MessageId = model.MessageId, - SenderName = model.SenderName, - DateDelivery = model.DateDelivery, - }; + Body = model.Body, + Reply = model.Reply, + HasRead = model.HasRead, + Subject = model.Subject, + ClientId = model.ClientId, + MessageId = model.MessageId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + }; } public void Update(MessageInfoBindingModel model) @@ -62,6 +64,8 @@ namespace IceCreamShopListImplement.Models public MessageInfoViewModel GetViewModel => new() { Body = Body, + Reply = Reply, + HasRead = HasRead, Subject = Subject, ClientId = ClientId, MessageId = MessageId, @@ -71,14 +75,4 @@ namespace IceCreamShopListImplement.Models public int Id => throw new NotImplementedException(); } - Body = Body, - Reply = Reply, - HasRead = HasRead, - Subject = Subject, - ClientId = ClientId, - MessageId = MessageId, - SenderName = SenderName, - DateDelivery = DateDelivery, - }; - } } diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll index 5e2b943aecb6e9bc35f3a7bbc9ae1a07de193735..a447c772b4e8ced66c7bc91826922fde2eb8b1f4 100644 GIT binary patch literal 37888 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 literal 31744 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 diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll index 749fa9084aaa2d35e8179842440d2be4554e64eb..8625536af13d370aa9d2c17ba396259ba10a2776 100644 GIT binary patch delta 2140 zcmY*beN0tl7=PaL#pS~N%K_ky2;R1{M)N(40`~XIarJqx`eE)H7#3~xn|8-|1@>|-iHI8d*J<@=l6S__j#W4o^#%F zn`buXAJ~;OrmO1@vXASO6-p8_iGmQUVe#?2_RdQ0O^D@6SV(k2Zx5#=uOmtZzcGVo zg$!%CvPw*GFAP8mVFcwKkt0&&IWa|K$e%=3=D0k_IG)DP$fScIqKJ=3$RlZUWkg$F z;7TCM-bU1f^Cc5@MN>oFhT29oYoUk8z&U$m1r@{gD|_k6l46`!fZvn$SHWmSY(U!!>vLaMMmCeoOv%q&4&oaKuxQX#7 zFcLy%v@@fR*Q08bRpJU8M%fy$mQkjB!$-g8b*gr-MHB^#jW}y{MMv0qc8)NQaQc>- zb&kl}agkq<(|6UVcSO!WQ$Tc0I1&?>QM)eyZs#e>kq7)ax82?i#xtY^iXTPdE2Dd^h46?J?}ua6KA0re$a_z)S6J9OsRNb`*cA8poO=j5AVt}pr7&>=Q9>EmM|`7tYWMN zTJ$C`4L7S#Ubez97heAYjInfEOu|kUq3M)Fe*#nJAK*Aj5z{G~#shO`HE=d<1}>oO zz#`fQEM>g{SVU_ur-LGkZ?*zF3LKF}ROU+ZjJFHwJWnVYW0B5r@9Qi$`_()fYT3GL*Uf3FEc)|P{w%1hI zRxlpm_%6mmQ_cE7#plx@T@}#HZ-AvjO&e=oQOJq<43%O5>sySgupcu!WVP$qYK=lP zA6FU1t_3nlZcW}CjO-_tFD)m-4S>B z#^?roR*I{ex;MJ738P~Ds~fwQBu9k5HrljSv67l-Q9~5r<({xS>&Z-1j>4B3qK)#B zr#@-KT~_^uoZ)>j@c!Vr!OsUj9XvgFcBo}&`_O*5-#gyF)%2e@6xv8{*)<^H;l z&Txo&DS}^32%Y3=;P95>W zaCp0S_)^6fdj7{fdr6c<)Sj~oV;(-%^Mdk}Ki%qq*%Ool{w)7@?J1jf-#S`+{@}5W z!uMJ{@}7U|EL*(spDiL)(&f5=pEHa-TOKVKZ1LG&ZMDqPlpSghr)%T#WN)BMhSE=W YdxLlNL=;iK1)j+34y6Ar+Gi&G5AADkI{*Lx delta 1834 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 EcOpAC9RL6T literal 26624 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 fJD1K