diff --git a/ProjectGarage/Entities/Driver.cs b/ProjectGarage/Entities/Driver.cs new file mode 100644 index 0000000..02ecffc --- /dev/null +++ b/ProjectGarage/Entities/Driver.cs @@ -0,0 +1,33 @@ +using ProjectGarage.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities; + +public class Driver +{ + public int Id { get;private set; } + + public string First_name { get;private set; } = string.Empty; + + public string Last_name { get;private set; } = string.Empty; + + public string Phone_Number { get;private set; } = string.Empty; + + public int TruckId { get;private set; } + + public static Driver CreateDriver(int id, string fname, string lname ,string phone_num, int tryckid) + { + return new Driver + { + Id = id, + First_name = fname, + Last_name = lname, + Phone_Number = phone_num ?? string.Empty, + TruckId = tryckid + }; + } +} diff --git a/ProjectGarage/Entities/Enums/FuelType.cs b/ProjectGarage/Entities/Enums/FuelType.cs new file mode 100644 index 0000000..ab9b32e --- /dev/null +++ b/ProjectGarage/Entities/Enums/FuelType.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities.Enums; + +[Flags] +public enum FuelType +{ + None = 0, + Petrol_92 = 1, + Petrol_95 = 2, + Petrol_98 = 4, + Petrol_100 = 8, + Diesel_Summer = 16, + Diesel_Winter = 32 +} diff --git a/ProjectGarage/Entities/Enums/TruckType.cs b/ProjectGarage/Entities/Enums/TruckType.cs new file mode 100644 index 0000000..9523151 --- /dev/null +++ b/ProjectGarage/Entities/Enums/TruckType.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities.Enums +{ + public enum TruckType + { + None = 0, + Mercedes = 1, + SCANIA = 2, + KAMAZ = 3, + MAN = 4, + Volvo = 5 + } +} diff --git a/ProjectGarage/Entities/Fuel.cs b/ProjectGarage/Entities/Fuel.cs new file mode 100644 index 0000000..f12e164 --- /dev/null +++ b/ProjectGarage/Entities/Fuel.cs @@ -0,0 +1,31 @@ +using ProjectGarage.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata.Ecma335; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities; + +public class Fuel +{ + public int Id { get; set; } + + public string Name { get; set; } = string.Empty; + + public FuelType Type { get; set; } + + public int Price { get; set; } + + public static Fuel CreateFuel(int id, string name, FuelType type, int price) + { + return new Fuel + { + Id = id, + Name = name, + Type = type, + Price = price + }; + } +} diff --git a/ProjectGarage/Entities/FuelFuelReplenishment.cs b/ProjectGarage/Entities/FuelFuelReplenishment.cs new file mode 100644 index 0000000..87e71b9 --- /dev/null +++ b/ProjectGarage/Entities/FuelFuelReplenishment.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities; + +public class FuelFuelReplenishment +{ + public int Id { get; private set; } + public int FuelId { get; private set; } + public int Amount { get; private set; } + public static FuelFuelReplenishment CreateElement(int id, int fuelId, int amount) + { + return new FuelFuelReplenishment + { + Id = id, + FuelId = fuelId, + Amount = amount + }; + } +} diff --git a/ProjectGarage/Entities/FuelReplenishment.cs b/ProjectGarage/Entities/FuelReplenishment.cs new file mode 100644 index 0000000..ed5fdca --- /dev/null +++ b/ProjectGarage/Entities/FuelReplenishment.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities; + +public class FuelReplenishment +{ + public int Id { get; private set; } + public int DriverId { get; private set; } + public DateTime Date { get; private set; } + public IEnumerable FuelFuelReplenishments { get; private set;} = []; + + public static FuelReplenishment CreateOpeartion(int id, int driverId, IEnumerable fuelFuelReplenishments) + { + return new FuelReplenishment + { + Id = id, + DriverId = driverId, + Date = DateTime.Now, + FuelFuelReplenishments = fuelFuelReplenishments + }; + } +} diff --git a/ProjectGarage/Entities/Route.cs b/ProjectGarage/Entities/Route.cs new file mode 100644 index 0000000..a511640 --- /dev/null +++ b/ProjectGarage/Entities/Route.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities; + +public class Route +{ + public int Id { get; set; } + + public string Name { get; set; } = string.Empty; + + public string StartPoint { get; set; } = string.Empty; + + public string FinalPoint { get; set; } = string.Empty; + + public int Length { get; set; } + + public static Route CreateRoute(int id, string startp, string finalp, int len) + { + return new Route() { + Id = id, + Name = startp + " - " + finalp, + StartPoint = startp, + FinalPoint = finalp, + Length = len + }; + } +} diff --git a/ProjectGarage/Entities/Transportation.cs b/ProjectGarage/Entities/Transportation.cs new file mode 100644 index 0000000..0aa3408 --- /dev/null +++ b/ProjectGarage/Entities/Transportation.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities; + +public class Transportation +{ + public int Id { get; set; } + + public int FuelId { get; set; } + + public int RouteId { get; set; } + + public int DriverId { get; set; } + + public int Amount { get; set; } + + public DateTime TransportationDate { get; set; } + + public static Transportation CreateTransportation(int id, int fuel_id, int route_id, int driver_id, int amount) + { + return new Transportation + { + Id = id, + FuelId = fuel_id, + RouteId = route_id, + DriverId = driver_id, + Amount = amount, + TransportationDate = DateTime.Now + }; + } +} diff --git a/ProjectGarage/Entities/Truck.cs b/ProjectGarage/Entities/Truck.cs new file mode 100644 index 0000000..c416718 --- /dev/null +++ b/ProjectGarage/Entities/Truck.cs @@ -0,0 +1,30 @@ +using ProjectGarage.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Entities; + +public class Truck +{ + public int Id { get; private set; } + + public string Numbers { get; private set; } = string.Empty; + + public TruckType Type { get; set; } + + public int MaxFuel { get; private set; } + + public static Truck CreateTruck(int id,string numbers, TruckType type, int maxFuel) + { + return new Truck() + { + Id = id, + Numbers = numbers, + Type = type, + MaxFuel = maxFuel + }; + } +} diff --git a/ProjectGarage/Form1.Designer.cs b/ProjectGarage/Form1.Designer.cs deleted file mode 100644 index f4eeafd..0000000 --- a/ProjectGarage/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectGarage -{ - partial class Form1 - { - /// - /// 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); - } - - #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() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} diff --git a/ProjectGarage/Form1.cs b/ProjectGarage/Form1.cs deleted file mode 100644 index 8f726a8..0000000 --- a/ProjectGarage/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectGarage -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/ProjectGarage/FormGarage.Designer.cs b/ProjectGarage/FormGarage.Designer.cs new file mode 100644 index 0000000..5fa1e37 --- /dev/null +++ b/ProjectGarage/FormGarage.Designer.cs @@ -0,0 +1,147 @@ +namespace ProjectGarage +{ + partial class FormGarage + { + /// + /// 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); + } + + #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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormGarage)); + menuStripGarage = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + водителиToolStripMenuItem = new ToolStripMenuItem(); + фурыToolStripMenuItem = new ToolStripMenuItem(); + маршрутыToolStripMenuItem = new ToolStripMenuItem(); + топливоToolStripMenuItem = new ToolStripMenuItem(); + операцииToolStripMenuItem = new ToolStripMenuItem(); + отправкаТопливаToolStripMenuItem = new ToolStripMenuItem(); + получениеТопливаToolStripMenuItem = new ToolStripMenuItem(); + отчетыToolStripMenuItem = new ToolStripMenuItem(); + menuStripGarage.SuspendLayout(); + SuspendLayout(); + // + // menuStripGarage + // + menuStripGarage.ImageScalingSize = new Size(20, 20); + menuStripGarage.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчетыToolStripMenuItem }); + menuStripGarage.Location = new Point(0, 0); + menuStripGarage.Name = "menuStripGarage"; + menuStripGarage.Size = new Size(612, 28); + menuStripGarage.TabIndex = 0; + menuStripGarage.Text = "menuStrip1"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { водителиToolStripMenuItem, фурыToolStripMenuItem, маршрутыToolStripMenuItem, топливоToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // водителиToolStripMenuItem + // + водителиToolStripMenuItem.Name = "водителиToolStripMenuItem"; + водителиToolStripMenuItem.Size = new Size(224, 26); + водителиToolStripMenuItem.Text = "Водители"; + водителиToolStripMenuItem.Click += DriversToolStripMenuItem_Click; + // + // фурыToolStripMenuItem + // + фурыToolStripMenuItem.Name = "фурыToolStripMenuItem"; + фурыToolStripMenuItem.Size = new Size(224, 26); + фурыToolStripMenuItem.Text = "Фуры"; + фурыToolStripMenuItem.Click += TrucksToolStripMenuItem_Click; + // + // маршрутыToolStripMenuItem + // + маршрутыToolStripMenuItem.Name = "маршрутыToolStripMenuItem"; + маршрутыToolStripMenuItem.Size = new Size(224, 26); + маршрутыToolStripMenuItem.Text = "Маршруты"; + маршрутыToolStripMenuItem.Click += RoutesToolStripMenuItem_Click; + // + // топливоToolStripMenuItem + // + топливоToolStripMenuItem.Name = "топливоToolStripMenuItem"; + топливоToolStripMenuItem.Size = new Size(224, 26); + топливоToolStripMenuItem.Text = "Топливо"; + топливоToolStripMenuItem.Click += FuelsToolStripMenuItem_Click; + // + // операцииToolStripMenuItem + // + операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { отправкаТопливаToolStripMenuItem, получениеТопливаToolStripMenuItem }); + операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; + операцииToolStripMenuItem.Size = new Size(95, 24); + операцииToolStripMenuItem.Text = "Операции"; + // + // отправкаТопливаToolStripMenuItem + // + отправкаТопливаToolStripMenuItem.Name = "отправкаТопливаToolStripMenuItem"; + отправкаТопливаToolStripMenuItem.Size = new Size(230, 26); + отправкаТопливаToolStripMenuItem.Text = "Отправка топлива"; + отправкаТопливаToolStripMenuItem.Click += TransportationToolStripMenuItem_Click; + // + // получениеТопливаToolStripMenuItem + // + получениеТопливаToolStripMenuItem.Name = "получениеТопливаToolStripMenuItem"; + получениеТопливаToolStripMenuItem.Size = new Size(230, 26); + получениеТопливаToolStripMenuItem.Text = "Получение топлива"; + получениеТопливаToolStripMenuItem.Click += ReplenishmentToolStripMenuItem_Click; + // + // отчетыToolStripMenuItem + // + отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; + отчетыToolStripMenuItem.Size = new Size(73, 24); + отчетыToolStripMenuItem.Text = "Отчеты"; + // + // FormGarage + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackgroundImage = (Image)resources.GetObject("$this.BackgroundImage"); + BackgroundImageLayout = ImageLayout.Stretch; + ClientSize = new Size(612, 399); + Controls.Add(menuStripGarage); + Name = "FormGarage"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Гараж"; + menuStripGarage.ResumeLayout(false); + menuStripGarage.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private MenuStrip menuStripGarage; + private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem водителиToolStripMenuItem; + private ToolStripMenuItem фурыToolStripMenuItem; + private ToolStripMenuItem маршрутыToolStripMenuItem; + private ToolStripMenuItem топливоToolStripMenuItem; + private ToolStripMenuItem операцииToolStripMenuItem; + private ToolStripMenuItem отправкаТопливаToolStripMenuItem; + private ToolStripMenuItem получениеТопливаToolStripMenuItem; + private ToolStripMenuItem отчетыToolStripMenuItem; + } +} diff --git a/ProjectGarage/FormGarage.cs b/ProjectGarage/FormGarage.cs new file mode 100644 index 0000000..cac09cb --- /dev/null +++ b/ProjectGarage/FormGarage.cs @@ -0,0 +1,95 @@ +using ProjectGarage.Forms; +using System.ComponentModel; +using Unity; + +namespace ProjectGarage +{ + public partial class FormGarage : Form + { + private readonly IUnityContainer _container; + + public FormGarage(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + private void DriversToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void TrucksToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void RoutesToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void FuelsToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void TransportationToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ReplenishmentToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/ProjectGarage/FormGarage.resx b/ProjectGarage/FormGarage.resx new file mode 100644 index 0000000..8973b45 --- /dev/null +++ b/ProjectGarage/FormGarage.resx @@ -0,0 +1,1175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + 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 + bU3RstgT4rb8pTlByHL3P//Z + + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormDriver.Designer.cs b/ProjectGarage/Forms/FormDriver.Designer.cs new file mode 100644 index 0000000..b63e004 --- /dev/null +++ b/ProjectGarage/Forms/FormDriver.Designer.cs @@ -0,0 +1,165 @@ +namespace ProjectGarage.Forms +{ + partial class FormDriver + { + /// + /// 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); + } + + #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() + { + labelFirstName = new Label(); + textBoxFirstName = new TextBox(); + textBoxLastName = new TextBox(); + labelLastName = new Label(); + textBoxPhoneNum = new TextBox(); + labelPhoneNum = new Label(); + labelTruckID = new Label(); + buttonSaveDriver = new Button(); + buttonCancelDriver = new Button(); + comboBoxTruckID = new ComboBox(); + SuspendLayout(); + // + // labelFirstName + // + labelFirstName.AutoSize = true; + labelFirstName.Location = new Point(34, 24); + labelFirstName.Name = "labelFirstName"; + labelFirstName.Size = new Size(39, 20); + labelFirstName.TabIndex = 0; + labelFirstName.Text = "Имя"; + // + // textBoxFirstName + // + textBoxFirstName.Location = new Point(120, 24); + textBoxFirstName.Name = "textBoxFirstName"; + textBoxFirstName.Size = new Size(183, 27); + textBoxFirstName.TabIndex = 1; + // + // textBoxLastName + // + textBoxLastName.Location = new Point(120, 70); + textBoxLastName.Name = "textBoxLastName"; + textBoxLastName.Size = new Size(183, 27); + textBoxLastName.TabIndex = 3; + // + // labelLastName + // + labelLastName.AutoSize = true; + labelLastName.Location = new Point(20, 73); + labelLastName.Name = "labelLastName"; + labelLastName.Size = new Size(73, 20); + labelLastName.TabIndex = 2; + labelLastName.Text = "Фамилия"; + // + // textBoxPhoneNum + // + textBoxPhoneNum.Location = new Point(120, 115); + textBoxPhoneNum.Name = "textBoxPhoneNum"; + textBoxPhoneNum.Size = new Size(183, 27); + textBoxPhoneNum.TabIndex = 5; + textBoxPhoneNum.Text = "+7"; + // + // labelPhoneNum + // + labelPhoneNum.AutoSize = true; + labelPhoneNum.Location = new Point(20, 118); + labelPhoneNum.Name = "labelPhoneNum"; + labelPhoneNum.Size = new Size(69, 20); + labelPhoneNum.TabIndex = 4; + labelPhoneNum.Text = "Телефон"; + // + // labelTruckID + // + labelTruckID.AutoSize = true; + labelTruckID.Location = new Point(34, 164); + labelTruckID.Name = "labelTruckID"; + labelTruckID.Size = new Size(44, 20); + labelTruckID.TabIndex = 6; + labelTruckID.Text = "Фура"; + // + // buttonSaveDriver + // + buttonSaveDriver.Location = new Point(20, 231); + buttonSaveDriver.Name = "buttonSaveDriver"; + buttonSaveDriver.Size = new Size(128, 39); + buttonSaveDriver.TabIndex = 8; + buttonSaveDriver.Text = "Сохранить"; + buttonSaveDriver.UseVisualStyleBackColor = true; + buttonSaveDriver.Click += ButtonSaveDriver_Click; + // + // buttonCancelDriver + // + buttonCancelDriver.Location = new Point(175, 231); + buttonCancelDriver.Name = "buttonCancelDriver"; + buttonCancelDriver.Size = new Size(128, 39); + buttonCancelDriver.TabIndex = 9; + buttonCancelDriver.Text = "Отмена"; + buttonCancelDriver.UseVisualStyleBackColor = true; + buttonCancelDriver.Click += ButtonCancelDriver_Click; + // + // comboBoxTruckID + // + comboBoxTruckID.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxTruckID.FormattingEnabled = true; + comboBoxTruckID.Location = new Point(120, 156); + comboBoxTruckID.Name = "comboBoxTruckID"; + comboBoxTruckID.Size = new Size(183, 28); + comboBoxTruckID.TabIndex = 10; + // + // FormDriver + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(333, 302); + Controls.Add(comboBoxTruckID); + Controls.Add(buttonCancelDriver); + Controls.Add(buttonSaveDriver); + Controls.Add(labelTruckID); + Controls.Add(textBoxPhoneNum); + Controls.Add(labelPhoneNum); + Controls.Add(textBoxLastName); + Controls.Add(labelLastName); + Controls.Add(textBoxFirstName); + Controls.Add(labelFirstName); + Name = "FormDriver"; + StartPosition = FormStartPosition.CenterParent; + Text = "Водитель"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelFirstName; + private TextBox textBoxFirstName; + private TextBox textBoxLastName; + private Label labelLastName; + private TextBox textBoxPhoneNum; + private Label labelPhoneNum; + private Label labelTruckID; + private Button buttonSaveDriver; + private Button buttonCancelDriver; + private ComboBox comboBoxTruckID; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormDriver.cs b/ProjectGarage/Forms/FormDriver.cs new file mode 100644 index 0000000..ea1a7f6 --- /dev/null +++ b/ProjectGarage/Forms/FormDriver.cs @@ -0,0 +1,87 @@ +using ProjectGarage.Entities; +using ProjectGarage.Entities.Enums; +using ProjectGarage.Repositories; +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 ProjectGarage.Forms +{ + public partial class FormDriver : Form + { + private readonly IDriverRepository _driverRepository; + private int? _driverId; + + public int Id + { + set + { + try + { + + var driver = _driverRepository.ReadDriverByID(value); + if (driver == null) + { + throw new + InvalidDataException(nameof(driver)); + } + textBoxFirstName.Text = driver.First_name; + textBoxLastName.Text = driver.Last_name; + //comboBoxTruckID.SelectedItem = driver.TruckId; + _driverId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormDriver(IDriverRepository driverRepository, ITruckRepository truckRepository) + { + InitializeComponent(); + _driverRepository = driverRepository ?? throw new ArgumentNullException(nameof(driverRepository)); + comboBoxTruckID.DataSource = truckRepository.ReadTrucks();// + comboBoxTruckID.DisplayMember = "Numbers"; + comboBoxTruckID.ValueMember = "Id"; + } + + private void ButtonSaveDriver_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxFirstName.Text) || string.IsNullOrWhiteSpace(textBoxLastName.Text) + || comboBoxTruckID.SelectedIndex < 0)// + { + throw new Exception("Имеются незаполненные поля"); + } + if (_driverId.HasValue) + { + _driverRepository.UpdateDriver(CreateDriver(_driverId.Value)); + } + else + { + _driverRepository.CreateDriver(CreateDriver(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancelDriver_Click(object sender, EventArgs e) => Close(); + + private Driver CreateDriver(int id) => Driver.CreateDriver(id, textBoxFirstName.Text, + textBoxLastName.Text, textBoxPhoneNum.Text, (int)comboBoxTruckID.SelectedIndex!);// + } +} diff --git a/ProjectGarage/Form1.resx b/ProjectGarage/Forms/FormDriver.resx similarity index 93% rename from ProjectGarage/Form1.resx rename to ProjectGarage/Forms/FormDriver.resx index 1af7de1..af32865 100644 --- a/ProjectGarage/Form1.resx +++ b/ProjectGarage/Forms/FormDriver.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectGarage/Forms/FormDrivers.Designer.cs b/ProjectGarage/Forms/FormDrivers.Designer.cs new file mode 100644 index 0000000..6bc5f62 --- /dev/null +++ b/ProjectGarage/Forms/FormDrivers.Designer.cs @@ -0,0 +1,126 @@ +namespace ProjectGarage.Forms +{ + partial class FormDrivers + { + /// + /// 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); + } + + #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() + { + dataGridViewDrivers = new DataGridView(); + panelFormDriversButtons = new Panel(); + buttonUpdateDriver = new Button(); + buttonDeleteDriver = new Button(); + buttonAddDriver = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridViewDrivers).BeginInit(); + panelFormDriversButtons.SuspendLayout(); + SuspendLayout(); + // + // dataGridViewDrivers + // + dataGridViewDrivers.AllowUserToAddRows = false; + dataGridViewDrivers.AllowUserToDeleteRows = false; + dataGridViewDrivers.AllowUserToResizeColumns = false; + dataGridViewDrivers.AllowUserToResizeRows = false; + dataGridViewDrivers.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewDrivers.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewDrivers.Dock = DockStyle.Fill; + dataGridViewDrivers.Location = new Point(0, 0); + dataGridViewDrivers.Name = "dataGridViewDrivers"; + dataGridViewDrivers.ReadOnly = true; + dataGridViewDrivers.RowHeadersVisible = false; + dataGridViewDrivers.RowHeadersWidth = 51; + dataGridViewDrivers.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewDrivers.Size = new Size(639, 367); + dataGridViewDrivers.TabIndex = 3; + // + // panelFormDriversButtons + // + panelFormDriversButtons.Controls.Add(buttonUpdateDriver); + panelFormDriversButtons.Controls.Add(buttonDeleteDriver); + panelFormDriversButtons.Controls.Add(buttonAddDriver); + panelFormDriversButtons.Dock = DockStyle.Right; + panelFormDriversButtons.Location = new Point(639, 0); + panelFormDriversButtons.Name = "panelFormDriversButtons"; + panelFormDriversButtons.Size = new Size(161, 367); + panelFormDriversButtons.TabIndex = 2; + // + // buttonUpdateDriver + // + buttonUpdateDriver.BackgroundImage = Properties.Resources.каранд; + buttonUpdateDriver.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdateDriver.Location = new Point(35, 140); + buttonUpdateDriver.Name = "buttonUpdateDriver"; + buttonUpdateDriver.Size = new Size(94, 75); + buttonUpdateDriver.TabIndex = 2; + buttonUpdateDriver.UseVisualStyleBackColor = true; + buttonUpdateDriver.Click += ButtonUpdateDriver_Click; + // + // buttonDeleteDriver + // + buttonDeleteDriver.BackgroundImage = Properties.Resources.минусик; + buttonDeleteDriver.BackgroundImageLayout = ImageLayout.Stretch; + buttonDeleteDriver.Location = new Point(35, 249); + buttonDeleteDriver.Name = "buttonDeleteDriver"; + buttonDeleteDriver.Size = new Size(94, 78); + buttonDeleteDriver.TabIndex = 1; + buttonDeleteDriver.UseVisualStyleBackColor = true; + buttonDeleteDriver.Click += ButtonDeleteDriver_Click; + // + // buttonAddDriver + // + buttonAddDriver.BackgroundImage = Properties.Resources.плюсик; + buttonAddDriver.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddDriver.Location = new Point(35, 23); + buttonAddDriver.Name = "buttonAddDriver"; + buttonAddDriver.Size = new Size(94, 75); + buttonAddDriver.TabIndex = 0; + buttonAddDriver.UseVisualStyleBackColor = true; + buttonAddDriver.Click += ButtonAddDriver_Click; + // + // FormDrivers + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 367); + Controls.Add(dataGridViewDrivers); + Controls.Add(panelFormDriversButtons); + Name = "FormDrivers"; + Text = "FormDrivers"; + Load += FormDrivers_Load; + Click += FormDrivers_Load; + ((System.ComponentModel.ISupportInitialize)dataGridViewDrivers).EndInit(); + panelFormDriversButtons.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridViewDrivers; + private Panel panelFormDriversButtons; + private Button buttonUpdateDriver; + private Button buttonDeleteDriver; + private Button buttonAddDriver; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormDrivers.cs b/ProjectGarage/Forms/FormDrivers.cs new file mode 100644 index 0000000..b5444ad --- /dev/null +++ b/ProjectGarage/Forms/FormDrivers.cs @@ -0,0 +1,114 @@ +using ProjectGarage.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectGarage.Forms +{ + public partial class FormDrivers : Form + { + private readonly IUnityContainer _container; + private readonly IDriverRepository _driverRepository; + + public FormDrivers(IUnityContainer container, IDriverRepository driverRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _driverRepository = driverRepository ?? throw new ArgumentNullException(nameof(driverRepository)); + } + private void FormDrivers_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + + private void ButtonAddDriver_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpdateDriver_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDeleteDriver_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _driverRepository.DeleteDriver(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + private void LoadList() => dataGridViewDrivers.DataSource = _driverRepository.ReadDrivers(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewDrivers.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = + Convert.ToInt32(dataGridViewDrivers.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectGarage/Forms/FormDrivers.resx b/ProjectGarage/Forms/FormDrivers.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormDrivers.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormFuel.Designer.cs b/ProjectGarage/Forms/FormFuel.Designer.cs new file mode 100644 index 0000000..db9db84 --- /dev/null +++ b/ProjectGarage/Forms/FormFuel.Designer.cs @@ -0,0 +1,144 @@ +namespace ProjectGarage.Forms +{ + partial class FormFuel + { + /// + /// 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); + } + + #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() + { + checkedListBoxFuel = new CheckedListBox(); + labelFuelType = new Label(); + labelFuelName = new Label(); + textBoxFuelName = new TextBox(); + numericUpDownFuelPrice = new NumericUpDown(); + labelFuelPrice = new Label(); + buttonFuelSave = new Button(); + buttonFuelCancel = new Button(); + ((System.ComponentModel.ISupportInitialize)numericUpDownFuelPrice).BeginInit(); + SuspendLayout(); + // + // checkedListBoxFuel + // + checkedListBoxFuel.FormattingEnabled = true; + checkedListBoxFuel.Location = new Point(121, 12); + checkedListBoxFuel.Name = "checkedListBoxFuel"; + checkedListBoxFuel.Size = new Size(150, 114); + checkedListBoxFuel.TabIndex = 0; + // + // labelFuelType + // + labelFuelType.AutoSize = true; + labelFuelType.Location = new Point(12, 12); + labelFuelType.Name = "labelFuelType"; + labelFuelType.Size = new Size(96, 20); + labelFuelType.TabIndex = 1; + labelFuelType.Text = "Тип топлива"; + // + // labelFuelName + // + labelFuelName.AutoSize = true; + labelFuelName.Location = new Point(21, 138); + labelFuelName.Name = "labelFuelName"; + labelFuelName.Size = new Size(77, 20); + labelFuelName.TabIndex = 2; + labelFuelName.Text = "Название"; + // + // textBoxFuelName + // + textBoxFuelName.Location = new Point(121, 138); + textBoxFuelName.Name = "textBoxFuelName"; + textBoxFuelName.Size = new Size(150, 27); + textBoxFuelName.TabIndex = 3; + // + // numericUpDownFuelPrice + // + numericUpDownFuelPrice.Location = new Point(121, 180); + numericUpDownFuelPrice.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownFuelPrice.Name = "numericUpDownFuelPrice"; + numericUpDownFuelPrice.Size = new Size(150, 27); + numericUpDownFuelPrice.TabIndex = 4; + numericUpDownFuelPrice.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // labelFuelPrice + // + labelFuelPrice.AutoSize = true; + labelFuelPrice.Location = new Point(8, 182); + labelFuelPrice.Name = "labelFuelPrice"; + labelFuelPrice.Size = new Size(100, 20); + labelFuelPrice.TabIndex = 5; + labelFuelPrice.Text = "Цена за литр"; + // + // buttonFuelSave + // + buttonFuelSave.Location = new Point(8, 219); + buttonFuelSave.Name = "buttonFuelSave"; + buttonFuelSave.Size = new Size(121, 29); + buttonFuelSave.TabIndex = 6; + buttonFuelSave.Text = "Сохранить"; + buttonFuelSave.UseVisualStyleBackColor = true; + buttonFuelSave.Click += ButtonFuelSave_Click; + // + // buttonFuelCancel + // + buttonFuelCancel.Location = new Point(152, 219); + buttonFuelCancel.Name = "buttonFuelCancel"; + buttonFuelCancel.Size = new Size(119, 29); + buttonFuelCancel.TabIndex = 7; + buttonFuelCancel.Text = "Отмена"; + buttonFuelCancel.UseVisualStyleBackColor = true; + buttonFuelCancel.Click += ButtonFuelCancel_Click; + // + // FormFuel + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(292, 260); + Controls.Add(buttonFuelCancel); + Controls.Add(buttonFuelSave); + Controls.Add(labelFuelPrice); + Controls.Add(numericUpDownFuelPrice); + Controls.Add(textBoxFuelName); + Controls.Add(labelFuelName); + Controls.Add(labelFuelType); + Controls.Add(checkedListBoxFuel); + Name = "FormFuel"; + Text = "FormFuel"; + ((System.ComponentModel.ISupportInitialize)numericUpDownFuelPrice).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private CheckedListBox checkedListBoxFuel; + private Label labelFuelType; + private Label labelFuelName; + private TextBox textBoxFuelName; + private NumericUpDown numericUpDownFuelPrice; + private Label labelFuelPrice; + private Button buttonFuelSave; + private Button buttonFuelCancel; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormFuel.cs b/ProjectGarage/Forms/FormFuel.cs new file mode 100644 index 0000000..dba03d4 --- /dev/null +++ b/ProjectGarage/Forms/FormFuel.cs @@ -0,0 +1,101 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectGarage.Entities; +using ProjectGarage.Entities.Enums; +using ProjectGarage.Repositories; +using ProjectGarage.Repositories.Implementations; +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 ProjectGarage.Forms +{ + public partial class FormFuel : Form + { + private readonly IFuelRepository _fuelRepository; + private int? _fuelId; + + public int Id + { + set + { + try + { + var fuel = _fuelRepository.ReadFuelByID(value); + if (fuel == null) + { + throw new InvalidDataException(nameof(fuel)); + } + foreach (FuelType elem in Enum.GetValues(typeof(FuelType))) + { + if ((elem & fuel.Type) != 0) + { + checkedListBoxFuel.SetItemChecked(checkedListBoxFuel.Items.IndexOf(elem), true); + } + } + textBoxFuelName.Text = fuel.Name; + _fuelId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormFuel(IFuelRepository fuelRepository) + { + InitializeComponent(); + _fuelRepository = fuelRepository ?? throw new ArgumentNullException(nameof(fuelRepository)); + foreach (var elem in Enum.GetValues(typeof(FuelType))) + { + checkedListBoxFuel.Items.Add(elem); + } + } + + private void ButtonFuelSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxFuelName.Text) || + checkedListBoxFuel.CheckedItems.Count == 0) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_fuelId.HasValue) + { + _fuelRepository.UpdateFuel(CreateFuel(_fuelId.Value)); + } + else + { + _fuelRepository.CreateFuel(CreateFuel(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + private void ButtonFuelCancel_Click(object sender, EventArgs e) => Close(); + + private Fuel CreateFuel(int id) + { + FuelType fuelType = FuelType.None; + foreach (var elem in checkedListBoxFuel.CheckedItems) + { + fuelType |= (FuelType)elem; + } + return Fuel.CreateFuel(id, textBoxFuelName.Text, fuelType, Convert.ToInt32(numericUpDownFuelPrice.Value)); + } + } +} diff --git a/ProjectGarage/Forms/FormFuel.resx b/ProjectGarage/Forms/FormFuel.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormFuel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormFuels.Designer.cs b/ProjectGarage/Forms/FormFuels.Designer.cs new file mode 100644 index 0000000..064fe4c --- /dev/null +++ b/ProjectGarage/Forms/FormFuels.Designer.cs @@ -0,0 +1,125 @@ +namespace ProjectGarage.Forms +{ + partial class FormFuels + { + /// + /// 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); + } + + #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() + { + dataGridViewFuels = new DataGridView(); + panelFormFuelsButtons = new Panel(); + buttonUpdateFuel = new Button(); + buttonDeleteFuel = new Button(); + buttonAddFuel = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridViewFuels).BeginInit(); + panelFormFuelsButtons.SuspendLayout(); + SuspendLayout(); + // + // dataGridViewFuels + // + dataGridViewFuels.AllowUserToAddRows = false; + dataGridViewFuels.AllowUserToDeleteRows = false; + dataGridViewFuels.AllowUserToResizeColumns = false; + dataGridViewFuels.AllowUserToResizeRows = false; + dataGridViewFuels.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewFuels.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewFuels.Dock = DockStyle.Fill; + dataGridViewFuels.Location = new Point(0, 0); + dataGridViewFuels.Name = "dataGridViewFuels"; + dataGridViewFuels.ReadOnly = true; + dataGridViewFuels.RowHeadersVisible = false; + dataGridViewFuels.RowHeadersWidth = 51; + dataGridViewFuels.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewFuels.Size = new Size(648, 367); + dataGridViewFuels.TabIndex = 5; + // + // panelFormFuelsButtons + // + panelFormFuelsButtons.Controls.Add(buttonUpdateFuel); + panelFormFuelsButtons.Controls.Add(buttonDeleteFuel); + panelFormFuelsButtons.Controls.Add(buttonAddFuel); + panelFormFuelsButtons.Dock = DockStyle.Right; + panelFormFuelsButtons.Location = new Point(648, 0); + panelFormFuelsButtons.Name = "panelFormFuelsButtons"; + panelFormFuelsButtons.Size = new Size(161, 367); + panelFormFuelsButtons.TabIndex = 4; + // + // buttonUpdateFuel + // + buttonUpdateFuel.BackgroundImage = Properties.Resources.каранд; + buttonUpdateFuel.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdateFuel.Location = new Point(35, 140); + buttonUpdateFuel.Name = "buttonUpdateFuel"; + buttonUpdateFuel.Size = new Size(94, 75); + buttonUpdateFuel.TabIndex = 2; + buttonUpdateFuel.UseVisualStyleBackColor = true; + buttonUpdateFuel.Click += ButtonUpdateFuel_Click; + // + // buttonDeleteFuel + // + buttonDeleteFuel.BackgroundImage = Properties.Resources.минусик; + buttonDeleteFuel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDeleteFuel.Location = new Point(35, 249); + buttonDeleteFuel.Name = "buttonDeleteFuel"; + buttonDeleteFuel.Size = new Size(94, 78); + buttonDeleteFuel.TabIndex = 1; + buttonDeleteFuel.UseVisualStyleBackColor = true; + buttonDeleteFuel.Click += ButtonDeleteFuel_Click; + // + // buttonAddFuel + // + buttonAddFuel.BackgroundImage = Properties.Resources.плюсик; + buttonAddFuel.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddFuel.Location = new Point(35, 23); + buttonAddFuel.Name = "buttonAddFuel"; + buttonAddFuel.Size = new Size(94, 75); + buttonAddFuel.TabIndex = 0; + buttonAddFuel.UseVisualStyleBackColor = true; + buttonAddFuel.Click += ButtonAddFuel_Click; + // + // FormFuels + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(809, 367); + Controls.Add(dataGridViewFuels); + Controls.Add(panelFormFuelsButtons); + Name = "FormFuels"; + Text = "FormFuels"; + Load += FormFeeds_Load; + ((System.ComponentModel.ISupportInitialize)dataGridViewFuels).EndInit(); + panelFormFuelsButtons.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridViewFuels; + private Panel panelFormFuelsButtons; + private Button buttonUpdateFuel; + private Button buttonDeleteFuel; + private Button buttonAddFuel; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormFuels.cs b/ProjectGarage/Forms/FormFuels.cs new file mode 100644 index 0000000..893dc14 --- /dev/null +++ b/ProjectGarage/Forms/FormFuels.cs @@ -0,0 +1,114 @@ +using ProjectGarage.Repositories; +using ProjectGarage.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectGarage.Forms +{ + public partial class FormFuels : Form + { + private readonly IUnityContainer _container; + private readonly IFuelRepository _fuelRepository; + + public FormFuels(IUnityContainer container, IFuelRepository fuelRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _fuelRepository = fuelRepository ?? throw new ArgumentNullException(nameof(fuelRepository)); + } + + private void FormFeeds_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAddFuel_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpdateFuel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + private void ButtonDeleteFuel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _fuelRepository.DeleteFuel(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewFuels.DataSource = _fuelRepository.ReadFuels(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewFuels.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewFuels.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectGarage/Forms/FormFuels.resx b/ProjectGarage/Forms/FormFuels.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormFuels.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormReplenishment.Designer.cs b/ProjectGarage/Forms/FormReplenishment.Designer.cs new file mode 100644 index 0000000..68b2f3a --- /dev/null +++ b/ProjectGarage/Forms/FormReplenishment.Designer.cs @@ -0,0 +1,148 @@ +namespace ProjectGarage.Forms +{ + partial class FormReplenishment + { + /// + /// 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); + } + + #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() + { + comboBoxReplenishmentDriver = new ComboBox(); + labelReplenishmentDriver = new Label(); + groupBoxReplenishment = new GroupBox(); + dataGridViewReplenishment = new DataGridView(); + ColumnFuel = new DataGridViewComboBoxColumn(); + ColumnAmount = new DataGridViewTextBoxColumn(); + ButtonReplenishmentSave = new Button(); + ButtonReplenishmentCancel = new Button(); + groupBoxReplenishment.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewReplenishment).BeginInit(); + SuspendLayout(); + // + // comboBoxReplenishmentDriver + // + comboBoxReplenishmentDriver.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxReplenishmentDriver.FormattingEnabled = true; + comboBoxReplenishmentDriver.Location = new Point(141, 16); + comboBoxReplenishmentDriver.Name = "comboBoxReplenishmentDriver"; + comboBoxReplenishmentDriver.Size = new Size(151, 28); + comboBoxReplenishmentDriver.TabIndex = 9; + // + // labelReplenishmentDriver + // + labelReplenishmentDriver.AutoSize = true; + labelReplenishmentDriver.Location = new Point(21, 19); + labelReplenishmentDriver.Name = "labelReplenishmentDriver"; + labelReplenishmentDriver.Size = new Size(74, 20); + labelReplenishmentDriver.TabIndex = 8; + labelReplenishmentDriver.Text = "Водитель"; + // + // groupBoxReplenishment + // + groupBoxReplenishment.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + groupBoxReplenishment.Controls.Add(dataGridViewReplenishment); + groupBoxReplenishment.Location = new Point(21, 66); + groupBoxReplenishment.Name = "groupBoxReplenishment"; + groupBoxReplenishment.Size = new Size(271, 288); + groupBoxReplenishment.TabIndex = 10; + groupBoxReplenishment.TabStop = false; + groupBoxReplenishment.Text = "Пополнение топлива"; + // + // dataGridViewReplenishment + // + dataGridViewReplenishment.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewReplenishment.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewReplenishment.Columns.AddRange(new DataGridViewColumn[] { ColumnFuel, ColumnAmount }); + dataGridViewReplenishment.Dock = DockStyle.Fill; + dataGridViewReplenishment.Location = new Point(3, 23); + dataGridViewReplenishment.Name = "dataGridViewReplenishment"; + dataGridViewReplenishment.RowHeadersVisible = false; + dataGridViewReplenishment.RowHeadersWidth = 51; + dataGridViewReplenishment.Size = new Size(265, 262); + dataGridViewReplenishment.TabIndex = 0; + // + // ColumnFuel + // + ColumnFuel.HeaderText = "Топливо"; + ColumnFuel.MinimumWidth = 6; + ColumnFuel.Name = "ColumnFuel"; + // + // ColumnAmount + // + ColumnAmount.HeaderText = "Кол-во"; + ColumnAmount.MinimumWidth = 6; + ColumnAmount.Name = "ColumnAmount"; + // + // ButtonReplenishmentSave + // + ButtonReplenishmentSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + ButtonReplenishmentSave.Location = new Point(21, 360); + ButtonReplenishmentSave.Name = "ButtonReplenishmentSave"; + ButtonReplenishmentSave.Size = new Size(134, 29); + ButtonReplenishmentSave.TabIndex = 11; + ButtonReplenishmentSave.Text = "Сохранить"; + ButtonReplenishmentSave.UseVisualStyleBackColor = true; + ButtonReplenishmentSave.Click += ButtonReplenishmentSave_Click; + // + // ButtonReplenishmentCancel + // + ButtonReplenishmentCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + ButtonReplenishmentCancel.Location = new Point(161, 360); + ButtonReplenishmentCancel.Name = "ButtonReplenishmentCancel"; + ButtonReplenishmentCancel.Size = new Size(131, 29); + ButtonReplenishmentCancel.TabIndex = 13; + ButtonReplenishmentCancel.Text = "Отмена"; + ButtonReplenishmentCancel.UseVisualStyleBackColor = true; + ButtonReplenishmentCancel.Click += ButtonReplenishmentCancel_Click; + // + // FormReplenishment + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(315, 401); + Controls.Add(ButtonReplenishmentCancel); + Controls.Add(ButtonReplenishmentSave); + Controls.Add(groupBoxReplenishment); + Controls.Add(comboBoxReplenishmentDriver); + Controls.Add(labelReplenishmentDriver); + Name = "FormReplenishment"; + Text = "FormReplenishment"; + groupBoxReplenishment.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewReplenishment).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private ComboBox comboBoxReplenishmentDriver; + private Label labelReplenishmentDriver; + private GroupBox groupBoxReplenishment; + private DataGridView dataGridViewReplenishment; + private Button ButtonReplenishmentSave; + private Button ButtonReplenishmentCancel; + private DataGridViewComboBoxColumn ColumnFuel; + private DataGridViewTextBoxColumn ColumnAmount; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormReplenishment.cs b/ProjectGarage/Forms/FormReplenishment.cs new file mode 100644 index 0000000..8e0ba2a --- /dev/null +++ b/ProjectGarage/Forms/FormReplenishment.cs @@ -0,0 +1,72 @@ +using ProjectGarage.Entities; +using ProjectGarage.Repositories; +using ProjectGarage.Repositories.Implementations; +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 ProjectGarage.Forms +{ + public partial class FormReplenishment : Form + { + private readonly IReplenishmentRepository _replenishmentRepository; + + + public FormReplenishment(IReplenishmentRepository replenishmentRepository, + IDriverRepository driverRepository, IFuelRepository fuelRepository) + { + InitializeComponent(); + _replenishmentRepository = replenishmentRepository ?? + throw new ArgumentNullException(nameof(replenishmentRepository)); + comboBoxReplenishmentDriver.DataSource = driverRepository.ReadDrivers(); + comboBoxReplenishmentDriver.DisplayMember = "First_name"; + comboBoxReplenishmentDriver.ValueMember = "Id"; + ColumnFuel.DataSource = fuelRepository.ReadFuels(); + ColumnFuel.DisplayMember = "Name"; + ColumnFuel.ValueMember = "Id"; + } + + private void ButtonReplenishmentSave_Click(object sender, EventArgs e) + { + try + { + if (dataGridViewReplenishment.RowCount < 1 || + comboBoxReplenishmentDriver.SelectedIndex < 0) + { + throw new Exception("Имеются незаполненные поля"); + } + _replenishmentRepository.CreateFuelReplenishment(FuelReplenishment.CreateOpeartion(0, + (int)comboBoxReplenishmentDriver.SelectedValue!, CreateListFuelFuelReplenishmentsFromDataGrid())); + Close(); + } + catch(Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonReplenishmentCancel_Click(object sender, EventArgs e) => Close(); + + private List CreateListFuelFuelReplenishmentsFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridViewReplenishment.Rows) + { + if (row.Cells["ColumnFeed"].Value == null || + row.Cells["ColumnCount"].Value == null) + { + continue; + } + list.Add(FuelFuelReplenishment.CreateElement(0, Convert.ToInt32(row.Cells["ColumnFeed"].Value), + Convert.ToInt32(row.Cells["ColumnCount"].Value))); + } + return list; + } + } +} diff --git a/ProjectGarage/Forms/FormReplenishment.resx b/ProjectGarage/Forms/FormReplenishment.resx new file mode 100644 index 0000000..69bbf06 --- /dev/null +++ b/ProjectGarage/Forms/FormReplenishment.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormReplenishments.Designer.cs b/ProjectGarage/Forms/FormReplenishments.Designer.cs new file mode 100644 index 0000000..20960d7 --- /dev/null +++ b/ProjectGarage/Forms/FormReplenishments.Designer.cs @@ -0,0 +1,109 @@ +namespace ProjectGarage.Forms +{ + partial class FormReplenishments + { + /// + /// Обязательная переменная конструктора. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Освободить все используемые ресурсы. + /// + /// истинно, если управляемый ресурс должен быть удален; иначе ложно. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Код, автоматически созданный конструктором компонентов + + /// + /// Требуемый метод для поддержки конструктора — не изменяйте + /// содержимое этого метода с помощью редактора кода. + /// + private void InitializeComponent() + { + buttonAddReplenishment = new Button(); + buttonDeleteReplenishment = new Button(); + panelFormReplenishmentssButtons = new Panel(); + dataGridViewReplenishments = new DataGridView(); + panelFormReplenishmentssButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewReplenishments).BeginInit(); + SuspendLayout(); + // + // buttonAddReplenishment + // + buttonAddReplenishment.BackgroundImage = Properties.Resources.плюсик; + buttonAddReplenishment.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddReplenishment.Location = new Point(35, 23); + buttonAddReplenishment.Name = "buttonAddReplenishment"; + buttonAddReplenishment.Size = new Size(94, 75); + buttonAddReplenishment.TabIndex = 0; + buttonAddReplenishment.UseVisualStyleBackColor = true; + buttonAddReplenishment.Click += ButtonAddReplenishment_Click; + // + // buttonDeleteReplenishment + // + buttonDeleteReplenishment.BackgroundImage = Properties.Resources.минусик; + buttonDeleteReplenishment.BackgroundImageLayout = ImageLayout.Stretch; + buttonDeleteReplenishment.Location = new Point(35, 115); + buttonDeleteReplenishment.Name = "buttonDeleteReplenishment"; + buttonDeleteReplenishment.Size = new Size(94, 78); + buttonDeleteReplenishment.TabIndex = 1; + buttonDeleteReplenishment.UseVisualStyleBackColor = true; + buttonDeleteReplenishment.Click += ButtonDeleteReplenishment_Click; + // + // panelFormReplenishmentssButtons + // + panelFormReplenishmentssButtons.Controls.Add(buttonDeleteReplenishment); + panelFormReplenishmentssButtons.Controls.Add(buttonAddReplenishment); + panelFormReplenishmentssButtons.Dock = DockStyle.Right; + panelFormReplenishmentssButtons.Location = new Point(641, 0); + panelFormReplenishmentssButtons.Name = "panelFormReplenishmentssButtons"; + panelFormReplenishmentssButtons.Size = new Size(161, 406); + panelFormReplenishmentssButtons.TabIndex = 6; + // + // dataGridViewReplenishments + // + dataGridViewReplenishments.AllowUserToAddRows = false; + dataGridViewReplenishments.AllowUserToDeleteRows = false; + dataGridViewReplenishments.AllowUserToResizeColumns = false; + dataGridViewReplenishments.AllowUserToResizeRows = false; + dataGridViewReplenishments.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewReplenishments.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewReplenishments.Dock = DockStyle.Fill; + dataGridViewReplenishments.Location = new Point(0, 0); + dataGridViewReplenishments.Name = "dataGridViewReplenishments"; + dataGridViewReplenishments.ReadOnly = true; + dataGridViewReplenishments.RowHeadersVisible = false; + dataGridViewReplenishments.RowHeadersWidth = 51; + dataGridViewReplenishments.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewReplenishments.Size = new Size(641, 406); + dataGridViewReplenishments.TabIndex = 7; + // + // FormReplenishments + // + ClientSize = new Size(802, 406); + Controls.Add(dataGridViewReplenishments); + Controls.Add(panelFormReplenishmentssButtons); + Name = "FormReplenishments"; + Text = "Пополнения"; + Load += FormReplenishments_Load; + panelFormReplenishmentssButtons.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewReplenishments).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Button buttonAddReplenishment; + private Button buttonDeleteReplenishment; + private Panel panelFormReplenishmentssButtons; + private DataGridView dataGridViewReplenishments; + } +} diff --git a/ProjectGarage/Forms/FormReplenishments.cs b/ProjectGarage/Forms/FormReplenishments.cs new file mode 100644 index 0000000..efefa42 --- /dev/null +++ b/ProjectGarage/Forms/FormReplenishments.cs @@ -0,0 +1,96 @@ +using ProjectGarage.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Unity; + +namespace ProjectGarage.Forms +{ + public partial class FormReplenishments : Form + { + private readonly IUnityContainer _container; + private readonly IReplenishmentRepository _replenishmentRepository; + + public FormReplenishments(IUnityContainer container, IReplenishmentRepository replenishmentRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _replenishmentRepository = replenishmentRepository ?? + throw new ArgumentNullException(nameof(replenishmentRepository)); + } + private void FormReplenishments_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + public FormReplenishments(IContainer container) + { + container.Add(this); + + InitializeComponent(); + } + + private void ButtonAddReplenishment_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDeleteReplenishment_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _replenishmentRepository.DeleteFuelReplenishment(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridViewReplenishments.DataSource = _replenishmentRepository.ReadFuelReplenishment(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewReplenishments.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = + Convert.ToInt32(dataGridViewReplenishments.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectGarage/Forms/FormReplenishments.resx b/ProjectGarage/Forms/FormReplenishments.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormReplenishments.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormRoute.Designer.cs b/ProjectGarage/Forms/FormRoute.Designer.cs new file mode 100644 index 0000000..36649fa --- /dev/null +++ b/ProjectGarage/Forms/FormRoute.Designer.cs @@ -0,0 +1,143 @@ +namespace ProjectGarage.Forms +{ + partial class FormRoute + { + /// + /// 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); + } + + #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() + { + labelRouteStart = new Label(); + labelRouteFinal = new Label(); + numericUpDownRouteLen = new NumericUpDown(); + labelRouteLen = new Label(); + buttonRouteSave = new Button(); + buttonRouteFinal = new Button(); + textBoxRouteStart = new TextBox(); + textBoxRouteFinal = new TextBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownRouteLen).BeginInit(); + SuspendLayout(); + // + // labelRouteStart + // + labelRouteStart.AutoSize = true; + labelRouteStart.Location = new Point(12, 20); + labelRouteStart.Name = "labelRouteStart"; + labelRouteStart.Size = new Size(135, 20); + labelRouteStart.TabIndex = 0; + labelRouteStart.Text = "Начало маршрута"; + // + // labelRouteFinal + // + labelRouteFinal.AutoSize = true; + labelRouteFinal.Location = new Point(12, 62); + labelRouteFinal.Name = "labelRouteFinal"; + labelRouteFinal.Size = new Size(127, 20); + labelRouteFinal.TabIndex = 1; + labelRouteFinal.Text = "Конец маршрута"; + // + // numericUpDownRouteLen + // + numericUpDownRouteLen.Location = new Point(160, 103); + numericUpDownRouteLen.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownRouteLen.Name = "numericUpDownRouteLen"; + numericUpDownRouteLen.Size = new Size(150, 27); + numericUpDownRouteLen.TabIndex = 2; + numericUpDownRouteLen.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // labelRouteLen + // + labelRouteLen.AutoSize = true; + labelRouteLen.Location = new Point(12, 103); + labelRouteLen.Name = "labelRouteLen"; + labelRouteLen.Size = new Size(127, 20); + labelRouteLen.TabIndex = 3; + labelRouteLen.Text = "Длина маршрута"; + // + // buttonRouteSave + // + buttonRouteSave.Location = new Point(12, 149); + buttonRouteSave.Name = "buttonRouteSave"; + buttonRouteSave.Size = new Size(135, 29); + buttonRouteSave.TabIndex = 4; + buttonRouteSave.Text = "Сохранить"; + buttonRouteSave.UseVisualStyleBackColor = true; + buttonRouteSave.Click += ButtonRouteSave_Click; + // + // buttonRouteFinal + // + buttonRouteFinal.Location = new Point(160, 149); + buttonRouteFinal.Name = "buttonRouteFinal"; + buttonRouteFinal.Size = new Size(150, 29); + buttonRouteFinal.TabIndex = 5; + buttonRouteFinal.Text = "Отмена"; + buttonRouteFinal.UseVisualStyleBackColor = true; + buttonRouteFinal.Click += ButtonRouteFinal_Click; + // + // textBoxRouteStart + // + textBoxRouteStart.Location = new Point(160, 20); + textBoxRouteStart.Name = "textBoxRouteStart"; + textBoxRouteStart.Size = new Size(150, 27); + textBoxRouteStart.TabIndex = 6; + // + // textBoxRouteFinal + // + textBoxRouteFinal.Location = new Point(160, 62); + textBoxRouteFinal.Name = "textBoxRouteFinal"; + textBoxRouteFinal.Size = new Size(150, 27); + textBoxRouteFinal.TabIndex = 7; + // + // FormRoute + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(332, 199); + Controls.Add(textBoxRouteFinal); + Controls.Add(textBoxRouteStart); + Controls.Add(buttonRouteFinal); + Controls.Add(buttonRouteSave); + Controls.Add(labelRouteLen); + Controls.Add(numericUpDownRouteLen); + Controls.Add(labelRouteFinal); + Controls.Add(labelRouteStart); + Name = "FormRoute"; + Text = "FormRoute"; + ((System.ComponentModel.ISupportInitialize)numericUpDownRouteLen).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelRouteStart; + private Label labelRouteFinal; + private NumericUpDown numericUpDownRouteLen; + private Label labelRouteLen; + private Button buttonRouteSave; + private Button buttonRouteFinal; + private TextBox textBoxRouteStart; + private TextBox textBoxRouteFinal; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormRoute.cs b/ProjectGarage/Forms/FormRoute.cs new file mode 100644 index 0000000..d49b465 --- /dev/null +++ b/ProjectGarage/Forms/FormRoute.cs @@ -0,0 +1,85 @@ +using ProjectGarage.Entities; +using ProjectGarage.Entities.Enums; +using ProjectGarage.Repositories; +using ProjectGarage.Repositories.Implementations; +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 ProjectGarage.Forms +{ + public partial class FormRoute : Form + { + private readonly IRouteRepository _routeRepository; + private int? _routeId; + + public int Id + { + set + { + try + { + var route = _routeRepository.ReadRouteByID(value); + if (route == null) + { + throw new InvalidDataException(nameof(route)); + } + + textBoxRouteStart.Text = route.StartPoint; + textBoxRouteFinal.Text = route.FinalPoint; + numericUpDownRouteLen.Value = route.Length; + _routeId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + } + } + + public FormRoute(IRouteRepository routeRepository) + { + InitializeComponent(); + _routeRepository = routeRepository ?? + throw new ArgumentNullException(nameof(routeRepository)); + } + + private void ButtonRouteSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxRouteStart.Text) + || string.IsNullOrWhiteSpace(textBoxRouteFinal.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_routeId.HasValue) + { + _routeRepository.UpdateRoute(CreateRoute(_routeId.Value)); + } + else + { + _routeRepository.CreateRoute(CreateRoute(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonRouteFinal_Click(object sender, EventArgs e) => Close(); + + private Route CreateRoute(int id) => Route.CreateRoute(id, textBoxRouteStart.Text, + textBoxRouteFinal.Text, Convert.ToInt32(numericUpDownRouteLen.Value)); + } +} diff --git a/ProjectGarage/Forms/FormRoute.resx b/ProjectGarage/Forms/FormRoute.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormRoute.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormRoutes.Designer.cs b/ProjectGarage/Forms/FormRoutes.Designer.cs new file mode 100644 index 0000000..bd539c6 --- /dev/null +++ b/ProjectGarage/Forms/FormRoutes.Designer.cs @@ -0,0 +1,125 @@ +namespace ProjectGarage.Forms +{ + partial class FormRoutes + { + /// + /// 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); + } + + #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() + { + dataGridViewRoutes = new DataGridView(); + panelFormRoutesButtons = new Panel(); + buttonUpdateRoute = new Button(); + buttonDeleteRoute = new Button(); + buttonAddRoute = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridViewRoutes).BeginInit(); + panelFormRoutesButtons.SuspendLayout(); + SuspendLayout(); + // + // dataGridViewRoutes + // + dataGridViewRoutes.AllowUserToAddRows = false; + dataGridViewRoutes.AllowUserToDeleteRows = false; + dataGridViewRoutes.AllowUserToResizeColumns = false; + dataGridViewRoutes.AllowUserToResizeRows = false; + dataGridViewRoutes.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewRoutes.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewRoutes.Dock = DockStyle.Fill; + dataGridViewRoutes.Location = new Point(0, 0); + dataGridViewRoutes.Name = "dataGridViewRoutes"; + dataGridViewRoutes.ReadOnly = true; + dataGridViewRoutes.RowHeadersVisible = false; + dataGridViewRoutes.RowHeadersWidth = 51; + dataGridViewRoutes.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewRoutes.Size = new Size(584, 355); + dataGridViewRoutes.TabIndex = 5; + // + // panelFormRoutesButtons + // + panelFormRoutesButtons.Controls.Add(buttonUpdateRoute); + panelFormRoutesButtons.Controls.Add(buttonDeleteRoute); + panelFormRoutesButtons.Controls.Add(buttonAddRoute); + panelFormRoutesButtons.Dock = DockStyle.Right; + panelFormRoutesButtons.Location = new Point(584, 0); + panelFormRoutesButtons.Name = "panelFormRoutesButtons"; + panelFormRoutesButtons.Size = new Size(161, 355); + panelFormRoutesButtons.TabIndex = 4; + // + // buttonUpdateRoute + // + buttonUpdateRoute.BackgroundImage = Properties.Resources.каранд; + buttonUpdateRoute.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdateRoute.Location = new Point(35, 140); + buttonUpdateRoute.Name = "buttonUpdateRoute"; + buttonUpdateRoute.Size = new Size(94, 75); + buttonUpdateRoute.TabIndex = 2; + buttonUpdateRoute.UseVisualStyleBackColor = true; + buttonUpdateRoute.Click += ButtonUpdateRoute_Click; + // + // buttonDeleteRoute + // + buttonDeleteRoute.BackgroundImage = Properties.Resources.минусик; + buttonDeleteRoute.BackgroundImageLayout = ImageLayout.Stretch; + buttonDeleteRoute.Location = new Point(35, 249); + buttonDeleteRoute.Name = "buttonDeleteRoute"; + buttonDeleteRoute.Size = new Size(94, 78); + buttonDeleteRoute.TabIndex = 1; + buttonDeleteRoute.UseVisualStyleBackColor = true; + buttonDeleteRoute.Click += ButtonDeleteRoute_Click; + // + // buttonAddRoute + // + buttonAddRoute.BackgroundImage = Properties.Resources.плюсик; + buttonAddRoute.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddRoute.Location = new Point(35, 23); + buttonAddRoute.Name = "buttonAddRoute"; + buttonAddRoute.Size = new Size(94, 75); + buttonAddRoute.TabIndex = 0; + buttonAddRoute.UseVisualStyleBackColor = true; + buttonAddRoute.Click += ButtonAddRoute_Click; + // + // FormRoutes + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(745, 355); + Controls.Add(dataGridViewRoutes); + Controls.Add(panelFormRoutesButtons); + Name = "FormRoutes"; + Text = "FormRoutes"; + Load += FormRoutes_Load; + ((System.ComponentModel.ISupportInitialize)dataGridViewRoutes).EndInit(); + panelFormRoutesButtons.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridViewRoutes; + private Panel panelFormRoutesButtons; + private Button buttonUpdateRoute; + private Button buttonDeleteRoute; + private Button buttonAddRoute; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormRoutes.cs b/ProjectGarage/Forms/FormRoutes.cs new file mode 100644 index 0000000..fb519e1 --- /dev/null +++ b/ProjectGarage/Forms/FormRoutes.cs @@ -0,0 +1,106 @@ +using ProjectGarage.Repositories; +using ProjectGarage.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Xml.Linq; +using Unity; + +namespace ProjectGarage.Forms +{ + public partial class FormRoutes : Form + { + private readonly IUnityContainer _container; + private readonly IRouteRepository _routeRepository; + + public FormRoutes(IUnityContainer container, IRouteRepository routeRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _routeRepository = routeRepository ?? throw new ArgumentNullException(nameof(routeRepository)); + } + private void ButtonAddRoute_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + private void FormRoutes_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + + private void ButtonUpdateRoute_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDeleteRoute_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewRoutes.DataSource = _routeRepository.ReadRoute(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewRoutes.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = + Convert.ToInt32(dataGridViewRoutes.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectGarage/Forms/FormRoutes.resx b/ProjectGarage/Forms/FormRoutes.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormRoutes.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormTransportation.Designer.cs b/ProjectGarage/Forms/FormTransportation.Designer.cs new file mode 100644 index 0000000..db32cdf --- /dev/null +++ b/ProjectGarage/Forms/FormTransportation.Designer.cs @@ -0,0 +1,171 @@ +namespace ProjectGarage.Forms +{ + partial class FormTransportation + { + /// + /// 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); + } + + #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() + { + labelFuel = new Label(); + labelDriver = new Label(); + labelRoute = new Label(); + label1 = new Label(); + numericUpDownAmountFuel = new NumericUpDown(); + comboBoxFuel = new ComboBox(); + comboBoxRoute = new ComboBox(); + comboBoxDriver = new ComboBox(); + buttonTransportationSave = new Button(); + buttonTransportationCancel = new Button(); + ((System.ComponentModel.ISupportInitialize)numericUpDownAmountFuel).BeginInit(); + SuspendLayout(); + // + // labelFuel + // + labelFuel.AutoSize = true; + labelFuel.Location = new Point(32, 26); + labelFuel.Name = "labelFuel"; + labelFuel.Size = new Size(69, 20); + labelFuel.TabIndex = 0; + labelFuel.Text = "Топливо"; + // + // labelDriver + // + labelDriver.AutoSize = true; + labelDriver.Location = new Point(32, 70); + labelDriver.Name = "labelDriver"; + labelDriver.Size = new Size(74, 20); + labelDriver.TabIndex = 1; + labelDriver.Text = "Водитель"; + // + // labelRoute + // + labelRoute.AutoSize = true; + labelRoute.Location = new Point(32, 116); + labelRoute.Name = "labelRoute"; + labelRoute.Size = new Size(73, 20); + labelRoute.TabIndex = 2; + labelRoute.Text = "Маршрут"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 157); + label1.Name = "label1"; + label1.Size = new Size(118, 20); + label1.TabIndex = 3; + label1.Text = "Объем топлива"; + // + // numericUpDownAmountFuel + // + numericUpDownAmountFuel.Location = new Point(152, 155); + numericUpDownAmountFuel.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownAmountFuel.Name = "numericUpDownAmountFuel"; + numericUpDownAmountFuel.Size = new Size(150, 27); + numericUpDownAmountFuel.TabIndex = 4; + numericUpDownAmountFuel.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // comboBoxFuel + // + comboBoxFuel.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxFuel.FormattingEnabled = true; + comboBoxFuel.Location = new Point(151, 23); + comboBoxFuel.Name = "comboBoxFuel"; + comboBoxFuel.Size = new Size(151, 28); + comboBoxFuel.TabIndex = 5; + // + // comboBoxRoute + // + comboBoxRoute.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxRoute.FormattingEnabled = true; + comboBoxRoute.Location = new Point(151, 113); + comboBoxRoute.Name = "comboBoxRoute"; + comboBoxRoute.Size = new Size(151, 28); + comboBoxRoute.TabIndex = 6; + // + // comboBoxDriver + // + comboBoxDriver.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxDriver.FormattingEnabled = true; + comboBoxDriver.Location = new Point(152, 67); + comboBoxDriver.Name = "comboBoxDriver"; + comboBoxDriver.Size = new Size(151, 28); + comboBoxDriver.TabIndex = 7; + // + // buttonTransportationSave + // + buttonTransportationSave.Location = new Point(12, 194); + buttonTransportationSave.Name = "buttonTransportationSave"; + buttonTransportationSave.Size = new Size(135, 29); + buttonTransportationSave.TabIndex = 8; + buttonTransportationSave.Text = "Сохранить"; + buttonTransportationSave.UseVisualStyleBackColor = true; + buttonTransportationSave.Click += ButtonTransportationSave_Click; + // + // buttonTransportationCancel + // + buttonTransportationCancel.Location = new Point(163, 194); + buttonTransportationCancel.Name = "buttonTransportationCancel"; + buttonTransportationCancel.Size = new Size(140, 29); + buttonTransportationCancel.TabIndex = 9; + buttonTransportationCancel.Text = "Отмена"; + buttonTransportationCancel.UseVisualStyleBackColor = true; + buttonTransportationCancel.Click += ButtonTransportationCancel_Click; + // + // FormTransportation + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(324, 244); + Controls.Add(buttonTransportationCancel); + Controls.Add(buttonTransportationSave); + Controls.Add(comboBoxDriver); + Controls.Add(comboBoxRoute); + Controls.Add(comboBoxFuel); + Controls.Add(numericUpDownAmountFuel); + Controls.Add(label1); + Controls.Add(labelRoute); + Controls.Add(labelDriver); + Controls.Add(labelFuel); + Name = "FormTransportation"; + Text = "FormTransportation"; + ((System.ComponentModel.ISupportInitialize)numericUpDownAmountFuel).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelFuel; + private Label labelDriver; + private Label labelRoute; + private Label label1; + private NumericUpDown numericUpDownAmountFuel; + private ComboBox comboBoxFuel; + private ComboBox comboBoxRoute; + private ComboBox comboBoxDriver; + private Button buttonTransportationSave; + private Button buttonTransportationCancel; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormTransportation.cs b/ProjectGarage/Forms/FormTransportation.cs new file mode 100644 index 0000000..a1b2448 --- /dev/null +++ b/ProjectGarage/Forms/FormTransportation.cs @@ -0,0 +1,63 @@ +using ProjectGarage.Entities; +using ProjectGarage.Repositories; +using ProjectGarage.Repositories.Implementations; +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 ProjectGarage.Forms +{ + public partial class FormTransportation : Form + { + private readonly ITransportationRepository _transportationRepository; + + public FormTransportation(ITransportationRepository transportationRepository, + IFuelRepository fuelRepository, IDriverRepository driverRepository, IRouteRepository routeRepository) + { + InitializeComponent(); + _transportationRepository = transportationRepository ?? + throw new ArgumentNullException(nameof(transportationRepository)); + + comboBoxDriver.DataSource = driverRepository.ReadDrivers(); + comboBoxDriver.DisplayMember = "First_name"; + comboBoxDriver.ValueMember = "Id"; + + comboBoxFuel.DataSource = fuelRepository.ReadFuels(); + comboBoxFuel.DisplayMember = "Name"; + comboBoxFuel.ValueMember = "Id"; + + comboBoxRoute.DataSource = routeRepository.ReadRoute(); + comboBoxRoute.DisplayMember = "Name"; + comboBoxRoute.ValueMember = "Id"; + } + + private void ButtonTransportationSave_Click(object sender, EventArgs e) + { + try + { + if (comboBoxFuel.SelectedIndex < 0 || comboBoxDriver.SelectedIndex < 0 || + comboBoxRoute.SelectedIndex < 0) + { + throw new Exception("Имеются незаполненные поля"); + } + _transportationRepository.CreateTransportation(Transportation.CreateTransportation(0, + (int)comboBoxFuel.SelectedValue!, (int)comboBoxRoute.SelectedValue!, + (int)comboBoxDriver.SelectedValue!, Convert.ToInt32(numericUpDownAmountFuel.Value))); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonTransportationCancel_Click(object sender, EventArgs e) => Close(); + } +} diff --git a/ProjectGarage/Forms/FormTransportation.resx b/ProjectGarage/Forms/FormTransportation.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormTransportation.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormTransportations.Designer.cs b/ProjectGarage/Forms/FormTransportations.Designer.cs new file mode 100644 index 0000000..9a52d64 --- /dev/null +++ b/ProjectGarage/Forms/FormTransportations.Designer.cs @@ -0,0 +1,97 @@ +namespace ProjectGarage.Forms +{ + partial class FormTransportations + { + /// + /// 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); + } + + #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() + { + buttonAddTransportation = new Button(); + dataGridViewTransportations = new DataGridView(); + panelFormTransportationsButtons = new Panel(); + ((System.ComponentModel.ISupportInitialize)dataGridViewTransportations).BeginInit(); + panelFormTransportationsButtons.SuspendLayout(); + SuspendLayout(); + // + // buttonAddTransportation + // + buttonAddTransportation.BackgroundImage = Properties.Resources.плюсик; + buttonAddTransportation.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddTransportation.Location = new Point(35, 23); + buttonAddTransportation.Name = "buttonAddTransportation"; + buttonAddTransportation.Size = new Size(94, 75); + buttonAddTransportation.TabIndex = 0; + buttonAddTransportation.UseVisualStyleBackColor = true; + buttonAddTransportation.Click += ButtonAddTransportation_Click; + // + // dataGridViewTransportations + // + dataGridViewTransportations.AllowUserToAddRows = false; + dataGridViewTransportations.AllowUserToDeleteRows = false; + dataGridViewTransportations.AllowUserToResizeColumns = false; + dataGridViewTransportations.AllowUserToResizeRows = false; + dataGridViewTransportations.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewTransportations.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewTransportations.Dock = DockStyle.Fill; + dataGridViewTransportations.Location = new Point(0, 0); + dataGridViewTransportations.Name = "dataGridViewTransportations"; + dataGridViewTransportations.ReadOnly = true; + dataGridViewTransportations.RowHeadersVisible = false; + dataGridViewTransportations.RowHeadersWidth = 51; + dataGridViewTransportations.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewTransportations.Size = new Size(639, 450); + dataGridViewTransportations.TabIndex = 7; + // + // panelFormTransportationsButtons + // + panelFormTransportationsButtons.Controls.Add(buttonAddTransportation); + panelFormTransportationsButtons.Dock = DockStyle.Right; + panelFormTransportationsButtons.Location = new Point(639, 0); + panelFormTransportationsButtons.Name = "panelFormTransportationsButtons"; + panelFormTransportationsButtons.Size = new Size(161, 450); + panelFormTransportationsButtons.TabIndex = 6; + // + // FormTransportations + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewTransportations); + Controls.Add(panelFormTransportationsButtons); + Name = "FormTransportations"; + Text = "FormTransportations"; + Load += FormTransportations_Load; + ((System.ComponentModel.ISupportInitialize)dataGridViewTransportations).EndInit(); + panelFormTransportationsButtons.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private Button buttonAddTransportation; + private DataGridView dataGridViewTransportations; + private Panel panelFormTransportationsButtons; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormTransportations.cs b/ProjectGarage/Forms/FormTransportations.cs new file mode 100644 index 0000000..7c423a5 --- /dev/null +++ b/ProjectGarage/Forms/FormTransportations.cs @@ -0,0 +1,57 @@ +using ProjectGarage.Repositories; +using ProjectGarage.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectGarage.Forms +{ + public partial class FormTransportations : Form + { + private readonly IUnityContainer _container; + private readonly ITransportationRepository _transportationRepository; + + public FormTransportations(IUnityContainer container, ITransportationRepository transportationRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _transportationRepository = transportationRepository ?? + throw new + ArgumentNullException(nameof(transportationRepository)); + } + private void FormTransportations_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAddTransportation_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewTransportations.DataSource = _transportationRepository.ReadTransportation(); + } +} diff --git a/ProjectGarage/Forms/FormTransportations.resx b/ProjectGarage/Forms/FormTransportations.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormTransportations.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormTruck.Designer.cs b/ProjectGarage/Forms/FormTruck.Designer.cs new file mode 100644 index 0000000..a1a9af7 --- /dev/null +++ b/ProjectGarage/Forms/FormTruck.Designer.cs @@ -0,0 +1,145 @@ +namespace ProjectGarage.Forms +{ + partial class FormTruck + { + /// + /// 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); + } + + #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() + { + labelTruckBrand = new Label(); + textBoxTruckNumbers = new TextBox(); + labelTruckNumbers = new Label(); + labelMaxFuel = new Label(); + numericUpDownMaxFuel = new NumericUpDown(); + buttonTruckSave = new Button(); + buttonTruckCancel = new Button(); + comboBoxTruckType = new ComboBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownMaxFuel).BeginInit(); + SuspendLayout(); + // + // labelTruckBrand + // + labelTruckBrand.AutoSize = true; + labelTruckBrand.Location = new Point(43, 76); + labelTruckBrand.Name = "labelTruckBrand"; + labelTruckBrand.Size = new Size(54, 20); + labelTruckBrand.TabIndex = 10; + labelTruckBrand.Text = "Марка"; + // + // textBoxTruckNumbers + // + textBoxTruckNumbers.Location = new Point(158, 30); + textBoxTruckNumbers.Name = "textBoxTruckNumbers"; + textBoxTruckNumbers.Size = new Size(183, 27); + textBoxTruckNumbers.TabIndex = 9; + // + // labelTruckNumbers + // + labelTruckNumbers.AutoSize = true; + labelTruckNumbers.Location = new Point(26, 30); + labelTruckNumbers.Name = "labelTruckNumbers"; + labelTruckNumbers.Size = new Size(106, 20); + labelTruckNumbers.TabIndex = 8; + labelTruckNumbers.Text = "Номера фуры"; + // + // labelMaxFuel + // + labelMaxFuel.AutoSize = true; + labelMaxFuel.Location = new Point(12, 122); + labelMaxFuel.Name = "labelMaxFuel"; + labelMaxFuel.Size = new Size(129, 20); + labelMaxFuel.TabIndex = 14; + labelMaxFuel.Text = "Объем цистерны"; + // + // numericUpDownMaxFuel + // + numericUpDownMaxFuel.Location = new Point(158, 115); + numericUpDownMaxFuel.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownMaxFuel.Name = "numericUpDownMaxFuel"; + numericUpDownMaxFuel.Size = new Size(183, 27); + numericUpDownMaxFuel.TabIndex = 15; + numericUpDownMaxFuel.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // buttonTruckSave + // + buttonTruckSave.Location = new Point(12, 170); + buttonTruckSave.Name = "buttonTruckSave"; + buttonTruckSave.Size = new Size(156, 37); + buttonTruckSave.TabIndex = 16; + buttonTruckSave.Text = "Сохранить"; + buttonTruckSave.UseVisualStyleBackColor = true; + buttonTruckSave.Click += ButtonTruckSave_Click; + // + // buttonTruckCancel + // + buttonTruckCancel.Location = new Point(196, 170); + buttonTruckCancel.Name = "buttonTruckCancel"; + buttonTruckCancel.Size = new Size(156, 37); + buttonTruckCancel.TabIndex = 17; + buttonTruckCancel.Text = "Отмена"; + buttonTruckCancel.UseVisualStyleBackColor = true; + buttonTruckCancel.Click += ButtonTruckCancel_Click; + // + // comboBoxTruckType + // + comboBoxTruckType.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxTruckType.FormattingEnabled = true; + comboBoxTruckType.Location = new Point(158, 68); + comboBoxTruckType.Name = "comboBoxTruckType"; + comboBoxTruckType.Size = new Size(183, 28); + comboBoxTruckType.TabIndex = 18; + // + // FormTruck + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(364, 222); + Controls.Add(comboBoxTruckType); + Controls.Add(buttonTruckCancel); + Controls.Add(buttonTruckSave); + Controls.Add(numericUpDownMaxFuel); + Controls.Add(labelMaxFuel); + Controls.Add(labelTruckBrand); + Controls.Add(textBoxTruckNumbers); + Controls.Add(labelTruckNumbers); + Name = "FormTruck"; + StartPosition = FormStartPosition.CenterParent; + Text = "Фура"; + ((System.ComponentModel.ISupportInitialize)numericUpDownMaxFuel).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + private Label labelTruckBrand; + private TextBox textBoxTruckNumbers; + private Label labelTruckNumbers; + private Label labelMaxFuel; + private NumericUpDown numericUpDownMaxFuel; + private Button buttonTruckSave; + private Button buttonTruckCancel; + private ComboBox comboBoxTruckType; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormTruck.cs b/ProjectGarage/Forms/FormTruck.cs new file mode 100644 index 0000000..b1878a1 --- /dev/null +++ b/ProjectGarage/Forms/FormTruck.cs @@ -0,0 +1,74 @@ +using ProjectGarage.Entities; +using ProjectGarage.Entities.Enums; +using ProjectGarage.Repositories; + +namespace ProjectGarage.Forms +{ + public partial class FormTruck : Form + { + + private readonly ITruckRepository _truckRepository; + private int? _truckId; + public int Id + { + set + { + try + { + var truck = _truckRepository.ReadTruckByID(value); + if (truck == null) + { + throw new InvalidDataException(nameof(truck)); + } + + textBoxTruckNumbers.Text = truck.Numbers; + comboBoxTruckType.SelectedItem = truck.Type; + numericUpDownMaxFuel.Value = truck.MaxFuel; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormTruck(ITruckRepository truckRepository) + { + InitializeComponent(); + _truckRepository = truckRepository ?? + throw new ArgumentNullException(nameof(truckRepository)); + comboBoxTruckType.DataSource = Enum.GetValues(typeof(TruckType)); + } + + private void ButtonTruckSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxTruckNumbers.Text) + || comboBoxTruckType.SelectedIndex < 1) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_truckId.HasValue) + { + _truckRepository.UpdateTruck(CreateTruck(_truckId.Value)); + } + else + { + _truckRepository.CreateTruck(CreateTruck(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonTruckCancel_Click(object sender, EventArgs e) => Close(); + + private Truck CreateTruck(int id) => Truck.CreateTruck(id, textBoxTruckNumbers.Text, + (TruckType)comboBoxTruckType.SelectedItem!, Convert.ToInt32(numericUpDownMaxFuel.Value)); + } +} diff --git a/ProjectGarage/Forms/FormTruck.resx b/ProjectGarage/Forms/FormTruck.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormTruck.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Forms/FormTrucks.Designer.cs b/ProjectGarage/Forms/FormTrucks.Designer.cs new file mode 100644 index 0000000..8946ee5 --- /dev/null +++ b/ProjectGarage/Forms/FormTrucks.Designer.cs @@ -0,0 +1,126 @@ +namespace ProjectGarage.Forms +{ + partial class FormTrucks + { + /// + /// 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); + } + + #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() + { + panelFormTrucksButtons = new Panel(); + buttonUpdateTruck = new Button(); + buttonDeleteTruck = new Button(); + buttonAddTruck = new Button(); + dataGridViewTrucks = new DataGridView(); + panelFormTrucksButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewTrucks).BeginInit(); + SuspendLayout(); + // + // panelFormTrucksButtons + // + panelFormTrucksButtons.Controls.Add(buttonUpdateTruck); + panelFormTrucksButtons.Controls.Add(buttonDeleteTruck); + panelFormTrucksButtons.Controls.Add(buttonAddTruck); + panelFormTrucksButtons.Dock = DockStyle.Right; + panelFormTrucksButtons.Location = new Point(565, 0); + panelFormTrucksButtons.Name = "panelFormTrucksButtons"; + panelFormTrucksButtons.Size = new Size(161, 360); + panelFormTrucksButtons.TabIndex = 0; + // + // buttonUpdateTruck + // + buttonUpdateTruck.BackgroundImage = Properties.Resources.каранд; + buttonUpdateTruck.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdateTruck.Location = new Point(35, 140); + buttonUpdateTruck.Name = "buttonUpdateTruck"; + buttonUpdateTruck.Size = new Size(94, 75); + buttonUpdateTruck.TabIndex = 2; + buttonUpdateTruck.UseVisualStyleBackColor = true; + buttonUpdateTruck.Click += ButtonUpdateTruck_Click; + // + // buttonDeleteTruck + // + buttonDeleteTruck.BackgroundImage = Properties.Resources.минусик; + buttonDeleteTruck.BackgroundImageLayout = ImageLayout.Stretch; + buttonDeleteTruck.Location = new Point(35, 247); + buttonDeleteTruck.Name = "buttonDeleteTruck"; + buttonDeleteTruck.Size = new Size(94, 78); + buttonDeleteTruck.TabIndex = 1; + buttonDeleteTruck.UseVisualStyleBackColor = true; + buttonDeleteTruck.Click += ButtonDeleteTruck_Click; + // + // buttonAddTruck + // + buttonAddTruck.BackgroundImage = Properties.Resources.плюсик; + buttonAddTruck.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddTruck.Location = new Point(35, 23); + buttonAddTruck.Name = "buttonAddTruck"; + buttonAddTruck.Size = new Size(94, 75); + buttonAddTruck.TabIndex = 0; + buttonAddTruck.UseVisualStyleBackColor = true; + buttonAddTruck.Click += ButtonAddTruck_Click; + // + // dataGridViewTrucks + // + dataGridViewTrucks.AllowUserToAddRows = false; + dataGridViewTrucks.AllowUserToDeleteRows = false; + dataGridViewTrucks.AllowUserToResizeColumns = false; + dataGridViewTrucks.AllowUserToResizeRows = false; + dataGridViewTrucks.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewTrucks.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewTrucks.Dock = DockStyle.Fill; + dataGridViewTrucks.Location = new Point(0, 0); + dataGridViewTrucks.Name = "dataGridViewTrucks"; + dataGridViewTrucks.ReadOnly = true; + dataGridViewTrucks.RowHeadersVisible = false; + dataGridViewTrucks.RowHeadersWidth = 51; + dataGridViewTrucks.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewTrucks.Size = new Size(565, 360); + dataGridViewTrucks.TabIndex = 1; + // + // FormTrucks + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(726, 360); + Controls.Add(dataGridViewTrucks); + Controls.Add(panelFormTrucksButtons); + Name = "FormTrucks"; + StartPosition = FormStartPosition.CenterParent; + Text = "Фуры"; + Load += FormTrucks_Load; + panelFormTrucksButtons.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewTrucks).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panelFormTrucksButtons; + private Button buttonUpdateTruck; + private Button buttonDeleteTruck; + private Button buttonAddTruck; + private DataGridView dataGridViewTrucks; + } +} \ No newline at end of file diff --git a/ProjectGarage/Forms/FormTrucks.cs b/ProjectGarage/Forms/FormTrucks.cs new file mode 100644 index 0000000..c135a16 --- /dev/null +++ b/ProjectGarage/Forms/FormTrucks.cs @@ -0,0 +1,110 @@ +using ProjectGarage.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectGarage.Forms +{ + public partial class FormTrucks : Form + { + private readonly IUnityContainer _container; + + private readonly ITruckRepository _truckRepository; + + public FormTrucks(IUnityContainer container, ITruckRepository truckRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _truckRepository = truckRepository ?? throw new ArgumentNullException(nameof(truckRepository)); + } + private void FormTrucks_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при закгрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAddTruck_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDeleteTruck_Click(object sender, EventArgs e) + { + if (!TryGetIDFromSelectedRow(out var findid)) + { + return; + } + + if (MessageBox.Show("Удалить звпись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _truckRepository.DeleteTruck(findid); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpdateTruck_Click(object sender, EventArgs e) + { + if (!TryGetIDFromSelectedRow(out var findid)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findid; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewTrucks.DataSource = _truckRepository.ReadTrucks(); + + private bool TryGetIDFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewTrucks.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewTrucks.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectGarage/Forms/FormTrucks.resx b/ProjectGarage/Forms/FormTrucks.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectGarage/Forms/FormTrucks.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectGarage/Program.cs b/ProjectGarage/Program.cs index e95d0ba..72fc364 100644 --- a/ProjectGarage/Program.cs +++ b/ProjectGarage/Program.cs @@ -1,3 +1,7 @@ +using ProjectGarage.Repositories; +using ProjectGarage.Repositories.Implementations; +using Unity; + namespace ProjectGarage { internal static class Program @@ -11,7 +15,21 @@ namespace ProjectGarage // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); + Application.Run(CreateContainer().Resolve()); + } + + private static IUnityContainer CreateContainer() + { + var container = new UnityContainer(); + + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + + return container; } } } \ No newline at end of file diff --git a/ProjectGarage/ProjectGarage.csproj b/ProjectGarage/ProjectGarage.csproj index 663fdb8..accbdf0 100644 --- a/ProjectGarage/ProjectGarage.csproj +++ b/ProjectGarage/ProjectGarage.csproj @@ -8,4 +8,23 @@ enable + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectGarage/Properties/Resources.Designer.cs b/ProjectGarage/Properties/Resources.Designer.cs new file mode 100644 index 0000000..b9facb9 --- /dev/null +++ b/ProjectGarage/Properties/Resources.Designer.cs @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectGarage.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectGarage.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap каранд { + get { + object obj = ResourceManager.GetObject("каранд", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap минусик { + get { + object obj = ResourceManager.GetObject("минусик", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap плюсик { + get { + object obj = ResourceManager.GetObject("плюсик", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectGarage/Properties/Resources.resx b/ProjectGarage/Properties/Resources.resx new file mode 100644 index 0000000..cc9719f --- /dev/null +++ b/ProjectGarage/Properties/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\минусик.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\плюсик.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\каранд.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectGarage/Repositories/IDriverRepository.cs b/ProjectGarage/Repositories/IDriverRepository.cs new file mode 100644 index 0000000..c443abc --- /dev/null +++ b/ProjectGarage/Repositories/IDriverRepository.cs @@ -0,0 +1,21 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories; + +public interface IDriverRepository +{ + IEnumerable ReadDrivers(); + + Driver ReadDriverByID(int id); + + void CreateDriver(Driver driver); + + void UpdateDriver(Driver driver); + + void DeleteDriver(int id); +} diff --git a/ProjectGarage/Repositories/IFuelRepository.cs b/ProjectGarage/Repositories/IFuelRepository.cs new file mode 100644 index 0000000..c52d6ba --- /dev/null +++ b/ProjectGarage/Repositories/IFuelRepository.cs @@ -0,0 +1,21 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories; + +public interface IFuelRepository +{ + IEnumerable ReadFuels(); + + Fuel ReadFuelByID(int id); + + void CreateFuel(Fuel fuel); + + void UpdateFuel(Fuel fuel); + + void DeleteFuel(int id); +} diff --git a/ProjectGarage/Repositories/IReplenishmentRepository.cs b/ProjectGarage/Repositories/IReplenishmentRepository.cs new file mode 100644 index 0000000..ab27bf5 --- /dev/null +++ b/ProjectGarage/Repositories/IReplenishmentRepository.cs @@ -0,0 +1,17 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories; + +public interface IReplenishmentRepository +{ + IEnumerable ReadFuelReplenishment(DateTime? dateForm = null, DateTime? dateTo = null, int? fuelId = null, + int? driverId = null, int? routeId = null); + void CreateFuelReplenishment(FuelReplenishment fuelReplenishment); + + void DeleteFuelReplenishment(int id); +} diff --git a/ProjectGarage/Repositories/IRouteRepository.cs b/ProjectGarage/Repositories/IRouteRepository.cs new file mode 100644 index 0000000..c1dec9e --- /dev/null +++ b/ProjectGarage/Repositories/IRouteRepository.cs @@ -0,0 +1,21 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories; + +public interface IRouteRepository +{ + IEnumerable ReadRoute(string? startPoint = null,string? finalPoint = null); + + Route ReadRouteByID(int id); + + void CreateRoute(Route route); + + void UpdateRoute(Route route); + + void DeleteRoute(int id); +} diff --git a/ProjectGarage/Repositories/ITransportationRepository.cs b/ProjectGarage/Repositories/ITransportationRepository.cs new file mode 100644 index 0000000..1e4c578 --- /dev/null +++ b/ProjectGarage/Repositories/ITransportationRepository.cs @@ -0,0 +1,17 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories; + +public interface ITransportationRepository +{ + IEnumerable ReadTransportation(DateTime? dateForm = null, DateTime? dateTo = null, int? fuelId = null, + int? driverId = null, int? routeId = null); + void CreateTransportation(Transportation transportation); + + void DeleteTransportation(int id); +} diff --git a/ProjectGarage/Repositories/ITruckRepository.cs b/ProjectGarage/Repositories/ITruckRepository.cs new file mode 100644 index 0000000..9716bc0 --- /dev/null +++ b/ProjectGarage/Repositories/ITruckRepository.cs @@ -0,0 +1,21 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories; + +public interface ITruckRepository +{ + IEnumerable ReadTrucks(); + + Truck ReadTruckByID(int id); + + void CreateTruck(Truck truck); + + void UpdateTruck(Truck truck); + + void DeleteTruck(int id); +} diff --git a/ProjectGarage/Repositories/Implementations/DriverRepository.cs b/ProjectGarage/Repositories/Implementations/DriverRepository.cs new file mode 100644 index 0000000..0fba152 --- /dev/null +++ b/ProjectGarage/Repositories/Implementations/DriverRepository.cs @@ -0,0 +1,27 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories.Implementations; + +public class DriverRepository : IDriverRepository +{ + public void CreateDriver(Driver driver) + { + } + + public void DeleteDriver(int id) + { + } + + public Driver ReadDriverByID(int id) => Driver.CreateDriver(0, string.Empty, string.Empty, string.Empty, 0); + + public IEnumerable ReadDrivers() => []; + + public void UpdateDriver(Driver driver) + { + } +} diff --git a/ProjectGarage/Repositories/Implementations/FuelRepository.cs b/ProjectGarage/Repositories/Implementations/FuelRepository.cs new file mode 100644 index 0000000..03d40a4 --- /dev/null +++ b/ProjectGarage/Repositories/Implementations/FuelRepository.cs @@ -0,0 +1,28 @@ +using ProjectGarage.Entities; +using ProjectGarage.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories.Implementations; + +public class FuelRepository : IFuelRepository +{ + public void CreateFuel(Fuel fuel) + { + } + + public void DeleteFuel(int id) + { + } + + public Fuel ReadFuelByID(int id) => Fuel.CreateFuel(0, string.Empty, FuelType.None, 0); + + public IEnumerable ReadFuels() => []; + + public void UpdateFuel(Fuel fuel) + { + } +} diff --git a/ProjectGarage/Repositories/Implementations/ReplenishmentRepository.cs b/ProjectGarage/Repositories/Implementations/ReplenishmentRepository.cs new file mode 100644 index 0000000..09a74d5 --- /dev/null +++ b/ProjectGarage/Repositories/Implementations/ReplenishmentRepository.cs @@ -0,0 +1,24 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories.Implementations; + +public class FuelReplishmentRepository : IReplenishmentRepository +{ + public void CreateFuelReplenishment(FuelReplenishment fuelReplenishment) + { + } + + public void DeleteFuelReplenishment(int id) + { + } + + public IEnumerable ReadFuelReplenishment(DateTime? dateForm = null, DateTime? dateTo = null, int? fuelId = null, int? driverId = null, int? routeId = null) + { + return []; + } +} diff --git a/ProjectGarage/Repositories/Implementations/RouteRepository.cs b/ProjectGarage/Repositories/Implementations/RouteRepository.cs new file mode 100644 index 0000000..3a745ec --- /dev/null +++ b/ProjectGarage/Repositories/Implementations/RouteRepository.cs @@ -0,0 +1,34 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories.Implementations; + +public class RouteRepository : IRouteRepository +{ + public void CreateFuelReplenishment(FuelReplenishment fuelReplenishment) + { + } + + public void CreateRoute(Route route) + { + } + + public void DeleteRoute(int id) + { + } + + public Route ReadRouteByID(int id) => Route.CreateRoute(0, string.Empty, string.Empty, 0); + + public IEnumerable ReadRoute(string? startPoint = null, string? finalPoint = null) + { + return []; + } + + public void UpdateRoute(Route route) + { + } +} diff --git a/ProjectGarage/Repositories/Implementations/TransportationRepository.cs b/ProjectGarage/Repositories/Implementations/TransportationRepository.cs new file mode 100644 index 0000000..4cd902a --- /dev/null +++ b/ProjectGarage/Repositories/Implementations/TransportationRepository.cs @@ -0,0 +1,25 @@ +using ProjectGarage.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories.Implementations; + +public class TransportationRepository : ITransportationRepository +{ + public void CreateTransportation(Transportation transportation) + { + } + + public void DeleteTransportation(int id) + { + throw new NotImplementedException(); + } + + public IEnumerable ReadTransportation(DateTime? dateForm = null, DateTime? dateTo = null, int? fuelId = null, int? driverId = null, int? routeId = null) + { + return []; + } +} diff --git a/ProjectGarage/Repositories/Implementations/TruckRepository.cs b/ProjectGarage/Repositories/Implementations/TruckRepository.cs new file mode 100644 index 0000000..ac2dbd3 --- /dev/null +++ b/ProjectGarage/Repositories/Implementations/TruckRepository.cs @@ -0,0 +1,28 @@ +using ProjectGarage.Entities; +using ProjectGarage.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectGarage.Repositories.Implementations; + +public class TruckRepository : ITruckRepository +{ + public void CreateTruck(Truck truck) + { + } + + public void DeleteTruck(int id) + { + } + + public Truck ReadTruckByID(int id) => Truck.CreateTruck(0, string.Empty, TruckType.None, 0); + + public IEnumerable ReadTrucks() => []; + + public void UpdateTruck(Truck truck) + { + } +} diff --git a/ProjectGarage/Resources/каранд.jpg b/ProjectGarage/Resources/каранд.jpg new file mode 100644 index 0000000..b6a25ca Binary files /dev/null and b/ProjectGarage/Resources/каранд.jpg differ diff --git a/ProjectGarage/Resources/минусик.jpg b/ProjectGarage/Resources/минусик.jpg new file mode 100644 index 0000000..469909f Binary files /dev/null and b/ProjectGarage/Resources/минусик.jpg differ diff --git a/ProjectGarage/Resources/плюсик.jpg b/ProjectGarage/Resources/плюсик.jpg new file mode 100644 index 0000000..801481b Binary files /dev/null and b/ProjectGarage/Resources/плюсик.jpg differ diff --git a/каранд.jpg b/каранд.jpg new file mode 100644 index 0000000..b6a25ca Binary files /dev/null and b/каранд.jpg differ diff --git a/минусик.jpg b/минусик.jpg new file mode 100644 index 0000000..469909f Binary files /dev/null and b/минусик.jpg differ diff --git a/плюсик.jpg b/плюсик.jpg new file mode 100644 index 0000000..801481b Binary files /dev/null and b/плюсик.jpg differ diff --git a/филмор1.jpg b/филмор1.jpg new file mode 100644 index 0000000..09e2a97 Binary files /dev/null and b/филмор1.jpg differ