diff --git a/Travel_Agency/Travel_Agency/Entities/Client.cs b/Travel_Agency/Travel_Agency/Entities/Client.cs new file mode 100644 index 0000000..ec428a4 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Entities/Client.cs @@ -0,0 +1,27 @@ + + +using System.Runtime.CompilerServices; +using System.Security.Policy; +using System.Web; +using Travel_Agency.Entities.Enums; + +namespace Travel_Agency.Entities; + +public class Client +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public string PassportDetails { get; private set; } = string.Empty; + public PositionInSociety PositionInSociety { get; private set; } + + public static Client CreateEntity(int id , string name, string passportDetails, PositionInSociety positionInSociety) + { + return new Client + { + Id = id, + Name = name, + PassportDetails = passportDetails, + PositionInSociety = positionInSociety + }; + } +} diff --git a/Travel_Agency/Travel_Agency/Entities/Contract.cs b/Travel_Agency/Travel_Agency/Entities/Contract.cs new file mode 100644 index 0000000..8ec9db4 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Entities/Contract.cs @@ -0,0 +1,30 @@ + +namespace Travel_Agency.Entities; + +public class Contract +{ + public int Id { get; private set; } + public int ContractNumber { get; private set; } + public int Discount { get; private set; } = 0; + public int TouristNumber { get; private set; } + public int FinalPrice { get; private set; } + public int ClientId { get; private set; } + public DateTime Date { get; private set; } + public IEnumerable Tours { get; private set; } = []; + + public static Contract CreateOperation(int id, int contractNumber, int discount, int touristNumber, int finalprice, int clientId, IEnumerable tours) + { + return new Contract + { + Id = id, + ContractNumber = contractNumber, + Discount = discount, + TouristNumber = touristNumber, + FinalPrice = finalprice - finalprice * (discount / 100), + ClientId = clientId, + Date = DateTime.Now, + Tours = tours + }; + } + +} diff --git a/Travel_Agency/Travel_Agency/Entities/Contract_Tour.cs b/Travel_Agency/Travel_Agency/Entities/Contract_Tour.cs new file mode 100644 index 0000000..f6b6feb --- /dev/null +++ b/Travel_Agency/Travel_Agency/Entities/Contract_Tour.cs @@ -0,0 +1,20 @@ + +namespace Travel_Agency.Entities; + +public class Contract_Tour +{ + public int Id { get; private set; } + public int TourId { get; private set; } + public string StartDate { get; private set; } = string.Empty; + public string EndDate { get; private set; } = string.Empty; + public static Contract_Tour CreateElement(int id, int tourId, string startDate, string endDate) + { + return new Contract_Tour + { + Id = id, + TourId = tourId, + StartDate = startDate, + EndDate = endDate + }; + } +} diff --git a/Travel_Agency/Travel_Agency/Entities/Enums/PositionInSociety.cs b/Travel_Agency/Travel_Agency/Entities/Enums/PositionInSociety.cs new file mode 100644 index 0000000..4765b5e --- /dev/null +++ b/Travel_Agency/Travel_Agency/Entities/Enums/PositionInSociety.cs @@ -0,0 +1,11 @@ + +namespace Travel_Agency.Entities.Enums +{ + public enum PositionInSociety + { + Unemployed = 0, + Employed = 1, + LargeFamily = 2, + Pensioner = 3, + } +} diff --git a/Travel_Agency/Travel_Agency/Entities/Enums/TypeOfTour.cs b/Travel_Agency/Travel_Agency/Entities/Enums/TypeOfTour.cs new file mode 100644 index 0000000..22a1ace --- /dev/null +++ b/Travel_Agency/Travel_Agency/Entities/Enums/TypeOfTour.cs @@ -0,0 +1,13 @@ + +namespace Travel_Agency.Entities.Enums; + +[Flags] +public enum TypeOfTour +{ + None = 0, + OnFoot = 1, + Bycar = 2, + ByTrain = 4, + ByPlane = 8, + ByShip = 16, +} diff --git a/Travel_Agency/Travel_Agency/Entities/Payment.cs b/Travel_Agency/Travel_Agency/Entities/Payment.cs new file mode 100644 index 0000000..b9f49b2 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Entities/Payment.cs @@ -0,0 +1,19 @@ + +namespace Travel_Agency.Entities; + +public class Payment +{ + public int Id { get; private set; } + public int Sum { get; private set; } = 0; + public int ClientId { get; private set; } + public DateTime Date { get; private set; } + public static Payment CreateOperation(int id, int sum, int clientId) + { + return new Payment { + Id = id, + Sum = sum, + ClientId = clientId, + Date = DateTime.Now + }; + } +} diff --git a/Travel_Agency/Travel_Agency/Entities/Route.cs b/Travel_Agency/Travel_Agency/Entities/Route.cs new file mode 100644 index 0000000..6b5d8ea --- /dev/null +++ b/Travel_Agency/Travel_Agency/Entities/Route.cs @@ -0,0 +1,24 @@ + +namespace Travel_Agency.Entities; + +public class Route +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public int Rating { get; private set; } = 0; + public string Places { get; private set; } = string.Empty; + public int Price { get; private set; } = 0; + public int TourId { get; private set; } + public static Route CreateEntity(int id, string name, int rating, string places, int price, int tourId) + { + return new Route + { + Id = id, + Name = name, + Rating = rating, + Places = places, + Price = price, + TourId = tourId + }; + } +} diff --git a/Travel_Agency/Travel_Agency/Entities/Tour.cs b/Travel_Agency/Travel_Agency/Entities/Tour.cs new file mode 100644 index 0000000..2f6f038 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Entities/Tour.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Travel_Agency.Entities.Enums; + +namespace Travel_Agency.Entities; + +public class Tour +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public TypeOfTour TypeOfTour { get; private set; } + public int Price { get; private set; } = 0; + public static Tour CreateEntity(int id, string name, TypeOfTour typeOfTour, int price) + { + return new Tour + { + Id = id, + Name = name, + TypeOfTour = typeOfTour, + Price = price + }; + + } +} diff --git a/Travel_Agency/Travel_Agency/Form1.Designer.cs b/Travel_Agency/Travel_Agency/Form1.Designer.cs deleted file mode 100644 index 51400df..0000000 --- a/Travel_Agency/Travel_Agency/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace Travel_Agency -{ - 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 - } -} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Form1.cs b/Travel_Agency/Travel_Agency/Form1.cs deleted file mode 100644 index b1c0505..0000000 --- a/Travel_Agency/Travel_Agency/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Travel_Agency -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/FormTravel_Agency.Designer.cs b/Travel_Agency/Travel_Agency/FormTravel_Agency.Designer.cs new file mode 100644 index 0000000..028e769 --- /dev/null +++ b/Travel_Agency/Travel_Agency/FormTravel_Agency.Designer.cs @@ -0,0 +1,138 @@ +namespace Travel_Agency +{ + partial class FormTravel_Agency + { + /// + /// 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() + { + menuStrip = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + ClientsToolStripMenuItem = new ToolStripMenuItem(); + ToursToolStripMenuItem = new ToolStripMenuItem(); + RoutesToolStripMenuItem = new ToolStripMenuItem(); + операцииToolStripMenuItem = new ToolStripMenuItem(); + ContractToolStripMenuItem = new ToolStripMenuItem(); + PaymentToolStripMenuItem = new ToolStripMenuItem(); + отчётыToolStripMenuItem = new ToolStripMenuItem(); + menuStrip.SuspendLayout(); + SuspendLayout(); + // + // menuStrip + // + menuStrip.ImageScalingSize = new Size(20, 20); + menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчётыToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Size = new Size(782, 28); + menuStrip.TabIndex = 0; + menuStrip.Text = "menuStrip"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ClientsToolStripMenuItem, ToursToolStripMenuItem, RoutesToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // ClientsToolStripMenuItem + // + ClientsToolStripMenuItem.Name = "ClientsToolStripMenuItem"; + ClientsToolStripMenuItem.Size = new Size(167, 26); + ClientsToolStripMenuItem.Text = "Клиенты"; + ClientsToolStripMenuItem.Click += ClientsToolStripMenuItem_Click; + // + // ToursToolStripMenuItem + // + ToursToolStripMenuItem.Name = "ToursToolStripMenuItem"; + ToursToolStripMenuItem.Size = new Size(167, 26); + ToursToolStripMenuItem.Text = "Туры"; + ToursToolStripMenuItem.Click += ToursToolStripMenuItem_Click; + // + // RoutesToolStripMenuItem + // + RoutesToolStripMenuItem.Name = "RoutesToolStripMenuItem"; + RoutesToolStripMenuItem.Size = new Size(167, 26); + RoutesToolStripMenuItem.Text = "Маршруты"; + RoutesToolStripMenuItem.Click += RoutesToolStripMenuItem_Click; + // + // операцииToolStripMenuItem + // + операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ContractToolStripMenuItem, PaymentToolStripMenuItem }); + операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; + операцииToolStripMenuItem.Size = new Size(95, 24); + операцииToolStripMenuItem.Text = "Операции"; + // + // ContractToolStripMenuItem + // + ContractToolStripMenuItem.Name = "ContractToolStripMenuItem"; + ContractToolStripMenuItem.Size = new Size(254, 26); + ContractToolStripMenuItem.Text = "Оформление договора"; + ContractToolStripMenuItem.Click += ContractToolStripMenuItem_Click; + // + // PaymentToolStripMenuItem + // + PaymentToolStripMenuItem.Name = "PaymentToolStripMenuItem"; + PaymentToolStripMenuItem.Size = new Size(254, 26); + PaymentToolStripMenuItem.Text = "Оплата"; + PaymentToolStripMenuItem.Click += PaymentToolStripMenuItem_Click; + // + // отчётыToolStripMenuItem + // + отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; + отчётыToolStripMenuItem.Size = new Size(73, 24); + отчётыToolStripMenuItem.Text = "Отчёты"; + // + // FormTravel_Agency + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackgroundImage = Properties.Resources.Picture_Travel_Agency; + BackgroundImageLayout = ImageLayout.Stretch; + ClientSize = new Size(782, 403); + Controls.Add(menuStrip); + MainMenuStrip = menuStrip; + Name = "FormTravel_Agency"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Туристическое агенство"; + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private MenuStrip menuStrip; + private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem ClientsToolStripMenuItem; + private ToolStripMenuItem ToursToolStripMenuItem; + private ToolStripMenuItem RoutesToolStripMenuItem; + private ToolStripMenuItem операцииToolStripMenuItem; + private ToolStripMenuItem ContractToolStripMenuItem; + private ToolStripMenuItem PaymentToolStripMenuItem; + private ToolStripMenuItem отчётыToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/FormTravel_Agency.cs b/Travel_Agency/Travel_Agency/FormTravel_Agency.cs new file mode 100644 index 0000000..6b21fd6 --- /dev/null +++ b/Travel_Agency/Travel_Agency/FormTravel_Agency.cs @@ -0,0 +1,84 @@ +using System.ComponentModel; +using Travel_Agency.Forms; +using Unity; + +namespace Travel_Agency +{ + public partial class FormTravel_Agency : Form + { + private readonly IUnityContainer _container; + public FormTravel_Agency(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + } + + private void ClientsToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + private void ToursToolStripMenuItem_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 ContractToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void PaymentToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/FormTravel_Agency.resx b/Travel_Agency/Travel_Agency/FormTravel_Agency.resx new file mode 100644 index 0000000..6c82d08 --- /dev/null +++ b/Travel_Agency/Travel_Agency/FormTravel_Agency.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormClient.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormClient.Designer.cs new file mode 100644 index 0000000..e2bc241 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormClient.Designer.cs @@ -0,0 +1,141 @@ +namespace Travel_Agency.Forms +{ + partial class FormClient + { + /// + /// 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() + { + comboBoxPosition = new ComboBox(); + labelName = new Label(); + labelPosition = new Label(); + labelPassport = new Label(); + textBoxName = new TextBox(); + textBoxPassport = new TextBox(); + ButtonSave = new Button(); + ButtonCencel = new Button(); + SuspendLayout(); + // + // comboBoxPosition + // + comboBoxPosition.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxPosition.FormattingEnabled = true; + comboBoxPosition.Location = new Point(250, 113); + comboBoxPosition.Name = "comboBoxPosition"; + comboBoxPosition.Size = new Size(194, 28); + comboBoxPosition.TabIndex = 0; + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(50, 50); + labelName.Name = "labelName"; + labelName.Size = new Size(117, 20); + labelName.TabIndex = 1; + labelName.Text = "Ф.И.О. клиента :"; + // + // labelPosition + // + labelPosition.AutoSize = true; + labelPosition.Location = new Point(50, 113); + labelPosition.Name = "labelPosition"; + labelPosition.Size = new Size(181, 20); + labelPosition.TabIndex = 2; + labelPosition.Text = "Положение в обществе :"; + // + // labelPassport + // + labelPassport.AutoSize = true; + labelPassport.Location = new Point(50, 184); + labelPassport.Name = "labelPassport"; + labelPassport.Size = new Size(160, 20); + labelPassport.TabIndex = 3; + labelPassport.Text = "Паспортные данные :"; + // + // textBoxName + // + textBoxName.Location = new Point(250, 50); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(194, 27); + textBoxName.TabIndex = 4; + // + // textBoxPassport + // + textBoxPassport.Location = new Point(250, 177); + textBoxPassport.Name = "textBoxPassport"; + textBoxPassport.Size = new Size(194, 27); + textBoxPassport.TabIndex = 5; + // + // ButtonSave + // + ButtonSave.Location = new Point(73, 269); + ButtonSave.Name = "ButtonSave"; + ButtonSave.Size = new Size(94, 29); + ButtonSave.TabIndex = 6; + ButtonSave.Text = "Сохранить"; + ButtonSave.UseVisualStyleBackColor = true; + ButtonSave.Click += ButtonSave_Click; + // + // ButtonCencel + // + ButtonCencel.Location = new Point(291, 269); + ButtonCencel.Name = "ButtonCencel"; + ButtonCencel.Size = new Size(94, 29); + ButtonCencel.TabIndex = 7; + ButtonCencel.Text = "Отмена"; + ButtonCencel.UseVisualStyleBackColor = true; + ButtonCencel.Click += ButtonCencel_Click; + // + // FormClient + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(479, 323); + Controls.Add(ButtonCencel); + Controls.Add(ButtonSave); + Controls.Add(textBoxPassport); + Controls.Add(textBoxName); + Controls.Add(labelPassport); + Controls.Add(labelPosition); + Controls.Add(labelName); + Controls.Add(comboBoxPosition); + Name = "FormClient"; + Text = "Клиент"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private ComboBox comboBoxPosition; + private Label labelName; + private Label labelPosition; + private Label labelPassport; + private TextBox textBoxName; + private TextBox textBoxPassport; + private Button ButtonSave; + private Button ButtonCencel; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormClient.cs b/Travel_Agency/Travel_Agency/Forms/FormClient.cs new file mode 100644 index 0000000..df84a11 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormClient.cs @@ -0,0 +1,93 @@ +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 Travel_Agency.Entities; +using Travel_Agency.Entities.Enums; +using Travel_Agency.Repositories; + +namespace Travel_Agency.Forms +{ + public partial class FormClient : Form + { + private readonly IClientRepository _clientRepository; + + private int? _clientId; + + public int Id + { + set + { + try + { + var client = + _clientRepository.ReadClientById(value); + if (client == null) + { + throw new + InvalidDataException(nameof(client)); + } + textBoxName.Text = client.Name; + textBoxPassport.Text = client.PassportDetails; + comboBoxPosition.SelectedItem = + client.PositionInSociety; + _clientId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormClient(IClientRepository clientRepository) + { + InitializeComponent(); + _clientRepository = clientRepository ?? + throw new + ArgumentNullException(nameof(clientRepository)); + comboBoxPosition.DataSource = + Enum.GetValues(typeof(PositionInSociety)); + + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxName.Text) || + string.IsNullOrWhiteSpace(textBoxPassport.Text) + || + comboBoxPosition.SelectedIndex < 1) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_clientId.HasValue) + { + _clientRepository.UpdateClient(CreateClient(_clientId.Value)); + } + else + { + _clientRepository.CreateClient(CreateClient(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + private void ButtonCencel_Click(object sender, EventArgs e) => Close(); + + private Client CreateClient(int id) => Client.CreateEntity(id, textBoxName.Text, textBoxPassport.Text, + (PositionInSociety)comboBoxPosition.SelectedItem!); + } +} diff --git a/Travel_Agency/Travel_Agency/Form1.resx b/Travel_Agency/Travel_Agency/Forms/FormClient.resx similarity index 93% rename from Travel_Agency/Travel_Agency/Form1.resx rename to Travel_Agency/Travel_Agency/Forms/FormClient.resx index 1af7de1..af32865 100644 --- a/Travel_Agency/Travel_Agency/Form1.resx +++ b/Travel_Agency/Travel_Agency/Forms/FormClient.resx @@ -1,17 +1,17 @@  - diff --git a/Travel_Agency/Travel_Agency/Forms/FormClients.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormClients.Designer.cs new file mode 100644 index 0000000..10bb34d --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormClients.Designer.cs @@ -0,0 +1,128 @@ +namespace Travel_Agency.Forms +{ + partial class FormClients + { + /// + /// 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(FormClients)); + panel1 = new Panel(); + ButtonDel = new Button(); + ButtonUpd = new Button(); + ButtonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(ButtonDel); + panel1.Controls.Add(ButtonUpd); + panel1.Controls.Add(ButtonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(651, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(149, 450); + panel1.TabIndex = 1; + // + // ButtonDel + // + ButtonDel.BackgroundImage = (Image)resources.GetObject("ButtonDel.BackgroundImage"); + ButtonDel.BackgroundImageLayout = ImageLayout.Stretch; + ButtonDel.Location = new Point(55, 213); + ButtonDel.Name = "ButtonDel"; + ButtonDel.Size = new Size(65, 59); + ButtonDel.TabIndex = 2; + ButtonDel.UseVisualStyleBackColor = true; + ButtonDel.Click += ButtonDel_Click; + // + // ButtonUpd + // + ButtonUpd.BackgroundImage = (Image)resources.GetObject("ButtonUpd.BackgroundImage"); + ButtonUpd.BackgroundImageLayout = ImageLayout.Stretch; + ButtonUpd.Location = new Point(55, 121); + ButtonUpd.Name = "ButtonUpd"; + ButtonUpd.Size = new Size(65, 59); + ButtonUpd.TabIndex = 1; + ButtonUpd.UseVisualStyleBackColor = true; + ButtonUpd.Click += ButtonUpd_Click; + // + // ButtonAdd + // + ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage"); + ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch; + ButtonAdd.Location = new Point(55, 32); + ButtonAdd.Name = "ButtonAdd"; + ButtonAdd.Size = new Size(65, 59); + ButtonAdd.TabIndex = 0; + ButtonAdd.UseVisualStyleBackColor = true; + ButtonAdd.Click += ButtonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(651, 450); + dataGridView.TabIndex = 2; + // + // FormClients + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormClients"; + Text = "Клиенты"; + Load += FormClients_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button ButtonDel; + private Button ButtonUpd; + private Button ButtonAdd; + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormClients.cs b/Travel_Agency/Travel_Agency/Forms/FormClients.cs new file mode 100644 index 0000000..10543b8 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormClients.cs @@ -0,0 +1,114 @@ +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 Travel_Agency.Repositories; +using Travel_Agency.Repositories.Implementations; +using Unity; + +namespace Travel_Agency.Forms +{ + public partial class FormClients : Form + { + private readonly IUnityContainer _container; + + private readonly IClientRepository _clientRepository; + public FormClients(IUnityContainer container, IClientRepository clientRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _clientRepository = clientRepository ?? + throw new ArgumentNullException(nameof(clientRepository)); + } + + private void FormClients_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpd_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 ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _clientRepository.DeleteClientById(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridView.DataSource = _clientRepository.ReadClients(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormClients.resx b/Travel_Agency/Travel_Agency/Forms/FormClients.resx new file mode 100644 index 0000000..d987d75 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormClients.resx @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + UBMAAAAASUVORK5CYII= + + + + + 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 + qad27tz51Vdfzc7OyhsB5VkoW43sFStWSLAZNDQ0qP9+9NFHZ8+elbcAKjFd9q1bt95+++1ishm9/PLL + Kms5HsjGwjVbbWVpthI1rF999dUvv/xSjgQyM132999/v2nTJik31fr169XV/fLly3/++accDGRmtOw7 + d+5MTk6uXLlS4i2jqampvb3922+/vXbtmhwJ5GT6mv3WW29Jv+UdOHDg66+/lgOAqhgtu1Ao7Nu3r3iv + I5FaIG+88Ya6tM/Pz8sxQFWMlv3rr7++8sorUvFSq1ev7ujo+OSTT7hdDS2Mlj0xMdHS0iIt36OxsVF9 + s/jjjz/euHFDXgrUxlzZamCMjIyU/pmldevWffDBBz/99JO8DtDBXNlqPb///vuS811dXV3Dw8PyCkAf + c2WrpaE6XrZsWbHpJ5544vnnn7948SILBPVgruzF33189NFHV65cefz48dOnT8vnAN3MlT09PV28Wu/a + teuLL76QjwL1Ya7so0ePbty4cffu3TMzM/IhoG4Mlf3HH3989913AwMDV65ckQ8B9WTumv3zzz9funRJ + ngB1Zq5swCTKRpgoG2GibISJshEmykaYKBthomyEibIRooWF/wOJOuh6obV2FwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAKkAAAClCAIAAACodUoDAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vgAADr4B6kKxwAAAF+dJREFUeF7tXWuPHcWZpvvcT/eZGc+Mx4MvYGOMr4Nn7PGYGc94xvY4EayWzRek + fEFKpEjRhmg3lmATKSChZaWED+twMyEkEG4mrLlfYsDY2GGDWUIE5DfwQ9jnPf36eFynqk51d/XlzDmP + Ho16+nR3VdfT9Va9b1dVX/dtH72Kvva9i772vYu+9r2Lvva9i772vYu+9r2Lvva9i772vYu+9r2Lvva9 + i772vYu+9r2Lvva9i772vYtVrv0333xz+fLlkydPnmhitomNTVx3LYKdwQF33XUXDj5z5gzO5QutRqw2 + 7SF2oHS7unEQPBCr7GlYDdpDD+ti64HnIHgUOAfdiW7VHvUbRQ8B0pRciu59CLpPexQ0LDAXfJ7QdQ9B + 12iPip6yYY8MPASc6XyjC7QPbDuXa/cg/2Yg19qj7LqiomuQ5ycgp9qvAtVXIp9PQO60h8OWtOoD/ziu + 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 + + + \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormContract.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormContract.Designer.cs new file mode 100644 index 0000000..f95c4c8 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormContract.Designer.cs @@ -0,0 +1,262 @@ +namespace Travel_Agency.Forms +{ + partial class FormContract + { + /// + /// 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() + { + ButtonSave = new Button(); + ButtonCancel = new Button(); + comboBoxClient = new ComboBox(); + labelClient = new Label(); + labelContractNumber = new Label(); + labelDiscount = new Label(); + labelTouristNumber = new Label(); + labelFinalPrice = new Label(); + numericUpDownContractNumber = new NumericUpDown(); + numericUpDownDiscount = new NumericUpDown(); + numericUpDownTouristNumber = new NumericUpDown(); + numericUpDownFinalPrice = new NumericUpDown(); + groupBoxTour = new GroupBox(); + dataGridViewTours = new DataGridView(); + ColumnTour = new DataGridViewComboBoxColumn(); + ColumnStartDate = new DataGridViewTextBoxColumn(); + ColumEndDate = new DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)numericUpDownContractNumber).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownDiscount).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownTouristNumber).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownFinalPrice).BeginInit(); + groupBoxTour.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewTours).BeginInit(); + SuspendLayout(); + // + // ButtonSave + // + ButtonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + ButtonSave.Location = new Point(35, 401); + ButtonSave.Name = "ButtonSave"; + ButtonSave.Size = new Size(94, 29); + ButtonSave.TabIndex = 0; + ButtonSave.Text = "Сохранить"; + ButtonSave.UseVisualStyleBackColor = true; + ButtonSave.Click += ButtonSave_Click; + // + // ButtonCancel + // + ButtonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + ButtonCancel.Location = new Point(214, 401); + ButtonCancel.Name = "ButtonCancel"; + ButtonCancel.Size = new Size(94, 29); + ButtonCancel.TabIndex = 1; + ButtonCancel.Text = "Отмена"; + ButtonCancel.UseVisualStyleBackColor = true; + ButtonCancel.Click += ButtonCancel_Click; + // + // comboBoxClient + // + comboBoxClient.FormattingEnabled = true; + comboBoxClient.Location = new Point(211, 247); + comboBoxClient.Name = "comboBoxClient"; + comboBoxClient.Size = new Size(151, 28); + comboBoxClient.TabIndex = 7; + // + // labelClient + // + labelClient.AutoSize = true; + labelClient.Location = new Point(37, 250); + labelClient.Name = "labelClient"; + labelClient.Size = new Size(65, 20); + labelClient.TabIndex = 6; + labelClient.Text = "Клиент :"; + // + // labelContractNumber + // + labelContractNumber.AutoSize = true; + labelContractNumber.Location = new Point(37, 35); + labelContractNumber.Name = "labelContractNumber"; + labelContractNumber.Size = new Size(134, 20); + labelContractNumber.TabIndex = 8; + labelContractNumber.Text = "Номер договора :"; + // + // labelDiscount + // + labelDiscount.AutoSize = true; + labelDiscount.Location = new Point(37, 87); + labelDiscount.Name = "labelDiscount"; + labelDiscount.Size = new Size(92, 20); + labelDiscount.TabIndex = 9; + labelDiscount.Text = "Скидка в % :"; + // + // labelTouristNumber + // + labelTouristNumber.AutoSize = true; + labelTouristNumber.Location = new Point(37, 141); + labelTouristNumber.Name = "labelTouristNumber"; + labelTouristNumber.Size = new Size(130, 20); + labelTouristNumber.TabIndex = 10; + labelTouristNumber.Text = "Кол-во туристов :"; + // + // labelFinalPrice + // + labelFinalPrice.AutoSize = true; + labelFinalPrice.Location = new Point(37, 192); + labelFinalPrice.Name = "labelFinalPrice"; + labelFinalPrice.Size = new Size(132, 20); + labelFinalPrice.TabIndex = 11; + labelFinalPrice.Text = "Финальная цена :"; + // + // numericUpDownContractNumber + // + numericUpDownContractNumber.Location = new Point(211, 33); + numericUpDownContractNumber.Name = "numericUpDownContractNumber"; + numericUpDownContractNumber.Size = new Size(150, 27); + numericUpDownContractNumber.TabIndex = 12; + // + // numericUpDownDiscount + // + numericUpDownDiscount.Location = new Point(211, 85); + numericUpDownDiscount.Name = "numericUpDownDiscount"; + numericUpDownDiscount.Size = new Size(150, 27); + numericUpDownDiscount.TabIndex = 13; + // + // numericUpDownTouristNumber + // + numericUpDownTouristNumber.Location = new Point(211, 139); + numericUpDownTouristNumber.Maximum = new decimal(new int[] { 20, 0, 0, 0 }); + numericUpDownTouristNumber.Name = "numericUpDownTouristNumber"; + numericUpDownTouristNumber.Size = new Size(150, 27); + numericUpDownTouristNumber.TabIndex = 14; + // + // numericUpDownFinalPrice + // + numericUpDownFinalPrice.Location = new Point(211, 190); + numericUpDownFinalPrice.Maximum = new decimal(new int[] { 200000, 0, 0, 0 }); + numericUpDownFinalPrice.Name = "numericUpDownFinalPrice"; + numericUpDownFinalPrice.Size = new Size(150, 27); + numericUpDownFinalPrice.TabIndex = 15; + // + // groupBoxTour + // + groupBoxTour.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + groupBoxTour.Controls.Add(dataGridViewTours); + groupBoxTour.Location = new Point(403, 33); + groupBoxTour.Name = "groupBoxTour"; + groupBoxTour.Size = new Size(463, 428); + groupBoxTour.TabIndex = 16; + groupBoxTour.TabStop = false; + groupBoxTour.Text = "Туры"; + // + // dataGridViewTours + // + dataGridViewTours.AllowUserToResizeColumns = false; + dataGridViewTours.AllowUserToResizeRows = false; + dataGridViewTours.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewTours.Columns.AddRange(new DataGridViewColumn[] { ColumnTour, ColumnStartDate, ColumEndDate }); + dataGridViewTours.Dock = DockStyle.Fill; + dataGridViewTours.Location = new Point(3, 23); + dataGridViewTours.MultiSelect = false; + dataGridViewTours.Name = "dataGridViewTours"; + dataGridViewTours.RowHeadersVisible = false; + dataGridViewTours.RowHeadersWidth = 51; + dataGridViewTours.RowTemplate.Height = 29; + dataGridViewTours.Size = new Size(457, 402); + dataGridViewTours.StandardTab = true; + dataGridViewTours.TabIndex = 0; + // + // ColumnTour + // + ColumnTour.HeaderText = "Тур"; + ColumnTour.MinimumWidth = 6; + ColumnTour.Name = "ColumnTour"; + ColumnTour.Width = 200; + // + // ColumnStartDate + // + ColumnStartDate.HeaderText = "Дата начала путишествия"; + ColumnStartDate.MinimumWidth = 6; + ColumnStartDate.Name = "ColumnStartDate"; + ColumnStartDate.Resizable = DataGridViewTriState.True; + ColumnStartDate.Width = 125; + // + // ColumEndDate + // + ColumEndDate.HeaderText = "Дата конца путешествия"; + ColumEndDate.MinimumWidth = 6; + ColumEndDate.Name = "ColumEndDate"; + ColumEndDate.Width = 125; + // + // FormContract + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(897, 496); + Controls.Add(groupBoxTour); + Controls.Add(numericUpDownFinalPrice); + Controls.Add(numericUpDownTouristNumber); + Controls.Add(numericUpDownDiscount); + Controls.Add(numericUpDownContractNumber); + Controls.Add(labelFinalPrice); + Controls.Add(labelTouristNumber); + Controls.Add(labelDiscount); + Controls.Add(labelContractNumber); + Controls.Add(comboBoxClient); + Controls.Add(labelClient); + Controls.Add(ButtonCancel); + Controls.Add(ButtonSave); + Name = "FormContract"; + StartPosition = FormStartPosition.CenterParent; + Text = "Контракт"; + ((System.ComponentModel.ISupportInitialize)numericUpDownContractNumber).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownDiscount).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownTouristNumber).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownFinalPrice).EndInit(); + groupBoxTour.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewTours).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button ButtonSave; + private Button ButtonCancel; + private ComboBox comboBoxClient; + private Label labelClient; + private Label labelContractNumber; + private Label labelDiscount; + private Label labelTouristNumber; + private Label labelFinalPrice; + private NumericUpDown numericUpDownContractNumber; + private NumericUpDown numericUpDownDiscount; + private NumericUpDown numericUpDownTouristNumber; + private NumericUpDown numericUpDownFinalPrice; + private GroupBox groupBoxTour; + private DataGridView dataGridViewTours; + private DataGridViewComboBoxColumn ColumnTour; + private DataGridViewTextBoxColumn ColumnStartDate; + private DataGridViewTextBoxColumn ColumEndDate; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormContract.cs b/Travel_Agency/Travel_Agency/Forms/FormContract.cs new file mode 100644 index 0000000..ff21c58 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormContract.cs @@ -0,0 +1,77 @@ +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 Travel_Agency.Entities; +using Travel_Agency.Repositories; + +namespace Travel_Agency.Forms +{ + public partial class FormContract : Form + { + private readonly IContractRepository _contractRepository; + public FormContract(IContractRepository contractRepository, IClientRepository clientRepository, ITourRepository tourRepository) + { + InitializeComponent(); + _contractRepository = contractRepository ?? + throw new ArgumentNullException(nameof(contractRepository)); + comboBoxClient.DataSource = clientRepository.ReadClients(); + comboBoxClient.DisplayMember = "Name"; + comboBoxClient.ValueMember = "Id"; + ColumnTour.DataSource = tourRepository.ReadTours(); + ColumnTour.DisplayMember = "Name"; + ColumnTour.ValueMember = "Id"; + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (dataGridViewTours.RowCount < 1 || + comboBoxClient.SelectedIndex < 0 || numericUpDownContractNumber.Value == 0 || numericUpDownDiscount.Value == 0 || + numericUpDownFinalPrice.Value == 0 || numericUpDownTouristNumber.Value == 0) + { + throw new Exception("Имеются незаполненные поля"); + } + _contractRepository.CreateContract(Contract.CreateOperation(0, + Convert.ToInt32(numericUpDownContractNumber.Value), + Convert.ToInt32(numericUpDownDiscount.Value), + Convert.ToInt32(numericUpDownTouristNumber.Value), + Convert.ToInt32(numericUpDownFinalPrice.Value), + (int)comboBoxClient.SelectedValue!, + CreateListContract_TourFromDataGrid())); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + private List CreateListContract_TourFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridViewTours.Rows) + { + if (row.Cells["ColumnTour"].Value == null || + row.Cells["ColumnPrice"].Value == null) + { + continue; + } + list.Add(Contract_Tour.CreateElement(0, + Convert.ToInt32(row.Cells["ColumnTour"].Value), + row.Cells["ColumnStartDate"].Value.ToString(), + row.Cells["ColumnEndDate"].Value.ToString() + )); + } + return list; + } + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormContract.resx b/Travel_Agency/Travel_Agency/Forms/FormContract.resx new file mode 100644 index 0000000..4be2f2d --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormContract.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormContracts.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormContracts.Designer.cs new file mode 100644 index 0000000..da8c0a2 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormContracts.Designer.cs @@ -0,0 +1,115 @@ +namespace Travel_Agency.Forms +{ + partial class FormContracts + { + /// + /// 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(FormContracts)); + panel1 = new Panel(); + ButtonDel = new Button(); + ButtonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(ButtonDel); + panel1.Controls.Add(ButtonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(651, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(149, 450); + panel1.TabIndex = 3; + // + // ButtonDel + // + ButtonDel.BackgroundImage = (Image)resources.GetObject("ButtonDel.BackgroundImage"); + ButtonDel.BackgroundImageLayout = ImageLayout.Stretch; + ButtonDel.Location = new Point(42, 169); + ButtonDel.Name = "ButtonDel"; + ButtonDel.Size = new Size(65, 59); + ButtonDel.TabIndex = 5; + ButtonDel.UseVisualStyleBackColor = true; + ButtonDel.Click += ButtonDel_Click; + // + // ButtonAdd + // + ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage"); + ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch; + ButtonAdd.Location = new Point(42, 38); + ButtonAdd.Name = "ButtonAdd"; + ButtonAdd.Size = new Size(65, 59); + ButtonAdd.TabIndex = 3; + ButtonAdd.UseVisualStyleBackColor = true; + ButtonAdd.Click += ButtonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(651, 450); + dataGridView.TabIndex = 4; + // + // FormContracts + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormContracts"; + StartPosition = FormStartPosition.CenterParent; + Text = "Договоры"; + Load += FormContracts_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private DataGridView dataGridView; + private Button ButtonDel; + private Button ButtonAdd; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormContracts.cs b/Travel_Agency/Travel_Agency/Forms/FormContracts.cs new file mode 100644 index 0000000..39cdf96 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormContracts.cs @@ -0,0 +1,97 @@ +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 Travel_Agency.Repositories; +using Travel_Agency.Repositories.Implementations; +using Unity; + +namespace Travel_Agency.Forms +{ + public partial class FormContracts : Form + { + private readonly IUnityContainer _container; + private readonly IContractRepository _contractRepository; + public FormContracts(IUnityContainer container, IContractRepository contractRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _contractRepository = contractRepository ?? + throw new ArgumentNullException(nameof(contractRepository)); + } + + private void FormContracts_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + + + private void LoadList() => dataGridView.DataSource = _contractRepository.ReadContracts(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _contractRepository.DeleteContract(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormContracts.resx b/Travel_Agency/Travel_Agency/Forms/FormContracts.resx new file mode 100644 index 0000000..483781b --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormContracts.resx @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + UBMAAAAASUVORK5CYII= + + + + + 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 + + + \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormPayment.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormPayment.Designer.cs new file mode 100644 index 0000000..db5d973 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormPayment.Designer.cs @@ -0,0 +1,121 @@ +namespace Travel_Agency.Forms +{ + partial class FormPayment + { + /// + /// 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() + { + labelSum = new Label(); + labelClient = new Label(); + ButtonSave = new Button(); + ButtonCencel = new Button(); + numericUpDownSum = new NumericUpDown(); + comboBoxClient = new ComboBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownSum).BeginInit(); + SuspendLayout(); + // + // labelSum + // + labelSum.AutoSize = true; + labelSum.Location = new Point(40, 43); + labelSum.Name = "labelSum"; + labelSum.Size = new Size(117, 20); + labelSum.TabIndex = 0; + labelSum.Text = "Сумма оплаты :"; + // + // labelClient + // + labelClient.AutoSize = true; + labelClient.Location = new Point(40, 95); + labelClient.Name = "labelClient"; + labelClient.Size = new Size(65, 20); + labelClient.TabIndex = 1; + labelClient.Text = "Клиент :"; + // + // ButtonSave + // + ButtonSave.Location = new Point(48, 197); + ButtonSave.Name = "ButtonSave"; + ButtonSave.Size = new Size(94, 29); + ButtonSave.TabIndex = 2; + ButtonSave.Text = "Сохранить"; + ButtonSave.UseVisualStyleBackColor = true; + ButtonSave.Click += ButtonSave_Click; + // + // ButtonCencel + // + ButtonCencel.Location = new Point(211, 197); + ButtonCencel.Name = "ButtonCencel"; + ButtonCencel.Size = new Size(94, 29); + ButtonCencel.TabIndex = 3; + ButtonCencel.Text = "Отмена"; + ButtonCencel.UseVisualStyleBackColor = true; + ButtonCencel.Click += ButtonCencel_Click; + // + // numericUpDownSum + // + numericUpDownSum.Location = new Point(195, 36); + numericUpDownSum.Maximum = new decimal(new int[] { 200000, 0, 0, 0 }); + numericUpDownSum.Name = "numericUpDownSum"; + numericUpDownSum.Size = new Size(150, 27); + numericUpDownSum.TabIndex = 4; + // + // comboBoxClient + // + comboBoxClient.FormattingEnabled = true; + comboBoxClient.Location = new Point(194, 92); + comboBoxClient.Name = "comboBoxClient"; + comboBoxClient.Size = new Size(151, 28); + comboBoxClient.TabIndex = 5; + // + // FormPayment + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(387, 254); + Controls.Add(comboBoxClient); + Controls.Add(numericUpDownSum); + Controls.Add(ButtonCencel); + Controls.Add(ButtonSave); + Controls.Add(labelClient); + Controls.Add(labelSum); + Name = "FormPayment"; + Text = "Оплата"; + ((System.ComponentModel.ISupportInitialize)numericUpDownSum).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelSum; + private Label labelClient; + private Button ButtonSave; + private Button ButtonCencel; + private NumericUpDown numericUpDownSum; + private ComboBox comboBoxClient; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormPayment.cs b/Travel_Agency/Travel_Agency/Forms/FormPayment.cs new file mode 100644 index 0000000..ecbcbb0 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormPayment.cs @@ -0,0 +1,54 @@ +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 Travel_Agency.Entities; +using Travel_Agency.Repositories; + +namespace Travel_Agency.Forms +{ + public partial class FormPayment : Form + { + private readonly IPaymentRepository _paymentRepository; + public FormPayment(IClientRepository clientRepository, IPaymentRepository paymentRepository) + { + InitializeComponent(); + _paymentRepository = paymentRepository ?? + throw new + ArgumentNullException(nameof(paymentRepository)); + comboBoxClient.DataSource = clientRepository.ReadClients(); + comboBoxClient.DisplayMember = "Name"; + comboBoxClient.ValueMember = "Id"; + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (comboBoxClient.SelectedIndex < 0 || numericUpDownSum.Value == 0) + { + throw new Exception("Имеются незаполненные поля"); + } + _paymentRepository.CreatePayment(Payment.CreateOperation(0, + (int)comboBoxClient.SelectedValue!, + Convert.ToInt32(numericUpDownSum.Value))); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + private void ButtonCencel_Click(object sender, EventArgs e) => Close(); + + + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormPayment.resx b/Travel_Agency/Travel_Agency/Forms/FormPayment.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormPayment.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/Travel_Agency/Travel_Agency/Forms/FormPayments.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormPayments.Designer.cs new file mode 100644 index 0000000..7e627db --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormPayments.Designer.cs @@ -0,0 +1,100 @@ +namespace Travel_Agency.Forms +{ + partial class FormPayments + { + /// + /// 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(FormPayments)); + panel1 = new Panel(); + ButtonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(ButtonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(651, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(149, 388); + panel1.TabIndex = 2; + // + // ButtonAdd + // + ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage"); + ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch; + ButtonAdd.Location = new Point(40, 30); + ButtonAdd.Name = "ButtonAdd"; + ButtonAdd.Size = new Size(65, 59); + ButtonAdd.TabIndex = 0; + ButtonAdd.UseVisualStyleBackColor = true; + ButtonAdd.Click += ButtonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(651, 388); + dataGridView.TabIndex = 3; + // + // FormPayments + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 388); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormPayments"; + Text = "FormPayments"; + Load += FormPayments_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button ButtonAdd; + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormPayments.cs b/Travel_Agency/Travel_Agency/Forms/FormPayments.cs new file mode 100644 index 0000000..3dd2c6d --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormPayments.cs @@ -0,0 +1,58 @@ +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 Travel_Agency.Repositories; +using Unity; + +namespace Travel_Agency.Forms +{ + public partial class FormPayments : Form + { + private readonly IUnityContainer _container; + private readonly IPaymentRepository _paymentRepository; + public FormPayments(IUnityContainer container, IPaymentRepository paymentRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _paymentRepository = paymentRepository ?? + throw new ArgumentNullException(nameof(paymentRepository)); + } + + + private void FormPayments_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridView.DataSource = _paymentRepository.ReadPayments(); + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormPayments.resx b/Travel_Agency/Travel_Agency/Forms/FormPayments.resx new file mode 100644 index 0000000..28a2270 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormPayments.resx @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + + + \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormRoute.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormRoute.Designer.cs new file mode 100644 index 0000000..56c49fb --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormRoute.Designer.cs @@ -0,0 +1,191 @@ +namespace Travel_Agency.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() + { + labelName = new Label(); + labelRating = new Label(); + labelPlaces = new Label(); + labelPrice = new Label(); + labelTourId = new Label(); + textBoxName = new TextBox(); + textBoxPlaces = new TextBox(); + numericUpDownRating = new NumericUpDown(); + numericUpDownPrice = new NumericUpDown(); + buttonSave = new Button(); + buttonCancel = new Button(); + comboBoxTour = new ComboBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownRating).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit(); + SuspendLayout(); + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(48, 52); + labelName.Name = "labelName"; + labelName.Size = new Size(118, 20); + labelName.TabIndex = 0; + labelName.Text = "Название тура :"; + // + // labelRating + // + labelRating.AutoSize = true; + labelRating.Location = new Point(48, 116); + labelRating.Name = "labelRating"; + labelRating.Size = new Size(145, 20); + labelRating.TabIndex = 1; + labelRating.Text = "Рейтинг маршрута :"; + // + // labelPlaces + // + labelPlaces.AutoSize = true; + labelPlaces.Location = new Point(48, 183); + labelPlaces.Name = "labelPlaces"; + labelPlaces.Size = new Size(224, 20); + labelPlaces.TabIndex = 2; + labelPlaces.Text = "Места или города посещения :"; + // + // labelPrice + // + labelPrice.AutoSize = true; + labelPrice.Location = new Point(48, 245); + labelPrice.Name = "labelPrice"; + labelPrice.Size = new Size(164, 20); + labelPrice.TabIndex = 3; + labelPrice.Text = "Стоимость маршрута :"; + // + // labelTourId + // + labelTourId.AutoSize = true; + labelTourId.Location = new Point(48, 311); + labelTourId.Name = "labelTourId"; + labelTourId.Size = new Size(40, 20); + labelTourId.TabIndex = 4; + labelTourId.Text = "Тур :"; + // + // textBoxName + // + textBoxName.Location = new Point(278, 45); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(293, 27); + textBoxName.TabIndex = 5; + // + // textBoxPlaces + // + textBoxPlaces.Location = new Point(278, 176); + textBoxPlaces.Name = "textBoxPlaces"; + textBoxPlaces.Size = new Size(293, 27); + textBoxPlaces.TabIndex = 6; + // + // numericUpDownRating + // + numericUpDownRating.Location = new Point(278, 109); + numericUpDownRating.Name = "numericUpDownRating"; + numericUpDownRating.Size = new Size(293, 27); + numericUpDownRating.TabIndex = 7; + // + // numericUpDownPrice + // + numericUpDownPrice.Location = new Point(278, 238); + numericUpDownPrice.Maximum = new decimal(new int[] { 200000, 0, 0, 0 }); + numericUpDownPrice.Name = "numericUpDownPrice"; + numericUpDownPrice.Size = new Size(150, 27); + numericUpDownPrice.TabIndex = 8; + numericUpDownPrice.Value = new decimal(new int[] { 1, 0, 0, 131072 }); + // + // buttonSave + // + buttonSave.Location = new Point(129, 372); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(100, 41); + buttonSave.TabIndex = 10; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(383, 372); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(110, 41); + buttonCancel.TabIndex = 11; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // comboBoxTour + // + comboBoxTour.FormattingEnabled = true; + comboBoxTour.Location = new Point(278, 303); + comboBoxTour.Name = "comboBoxTour"; + comboBoxTour.Size = new Size(151, 28); + comboBoxTour.TabIndex = 12; + // + // FormRoute + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(597, 444); + Controls.Add(comboBoxTour); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(numericUpDownPrice); + Controls.Add(numericUpDownRating); + Controls.Add(textBoxPlaces); + Controls.Add(textBoxName); + Controls.Add(labelTourId); + Controls.Add(labelPrice); + Controls.Add(labelPlaces); + Controls.Add(labelRating); + Controls.Add(labelName); + Name = "FormRoute"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Маршрут"; + ((System.ComponentModel.ISupportInitialize)numericUpDownRating).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelName; + private Label labelRating; + private Label labelPlaces; + private Label labelPrice; + private Label labelTourId; + private TextBox textBoxName; + private TextBox textBoxPlaces; + private NumericUpDown numericUpDownRating; + private NumericUpDown numericUpDownPrice; + private Button buttonSave; + private Button buttonCancel; + private ComboBox comboBoxTour; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormRoute.cs b/Travel_Agency/Travel_Agency/Forms/FormRoute.cs new file mode 100644 index 0000000..5bd3f08 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormRoute.cs @@ -0,0 +1,87 @@ +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 Travel_Agency.Entities; +using Travel_Agency.Repositories; +using Travel_Agency.Repositories.Implementations; + +namespace Travel_Agency.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)); + } + + textBoxName.Text = route.Name; + textBoxPlaces.Text = route.Places; + numericUpDownPrice.Value = route.Price; + numericUpDownRating.Value = route.Rating; + comboBoxTour.SelectedValue = route.TourId; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormRoute(IRouteRepository routeRepository, ITourRepository tourRepository) + { + InitializeComponent(); + _routeRepository = routeRepository ?? + throw new ArgumentNullException(nameof(routeRepository)); + comboBoxTour.DataSource = tourRepository.ReadTours(); + comboBoxTour.DisplayMember = "Name"; + comboBoxTour.ValueMember = "Id"; + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxName.Text) || string.IsNullOrWhiteSpace(textBoxPlaces.Text) || numericUpDownPrice.Value == 0) + { + 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 ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Route CreateRoute(int id) => Route.CreateEntity(id, textBoxName.Text, + Convert.ToInt32(numericUpDownRating.Value), textBoxPlaces.Text, + Convert.ToInt32(numericUpDownPrice.Value), + (int)comboBoxTour.SelectedValue); + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormRoute.resx b/Travel_Agency/Travel_Agency/Forms/FormRoute.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/Travel_Agency/Travel_Agency/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/Travel_Agency/Travel_Agency/Forms/FormRoutes.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormRoutes.Designer.cs new file mode 100644 index 0000000..8d611a7 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormRoutes.Designer.cs @@ -0,0 +1,129 @@ +namespace Travel_Agency.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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormRoutes)); + panel1 = new Panel(); + ButtonDel = new Button(); + ButtonUpd = new Button(); + ButtonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(ButtonDel); + panel1.Controls.Add(ButtonUpd); + panel1.Controls.Add(ButtonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(651, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(149, 450); + panel1.TabIndex = 0; + // + // ButtonDel + // + ButtonDel.BackgroundImage = (Image)resources.GetObject("ButtonDel.BackgroundImage"); + ButtonDel.BackgroundImageLayout = ImageLayout.Stretch; + ButtonDel.Location = new Point(55, 213); + ButtonDel.Name = "ButtonDel"; + ButtonDel.Size = new Size(65, 59); + ButtonDel.TabIndex = 2; + ButtonDel.UseVisualStyleBackColor = true; + ButtonDel.Click += ButtonDel_Click; + // + // ButtonUpd + // + ButtonUpd.BackgroundImage = (Image)resources.GetObject("ButtonUpd.BackgroundImage"); + ButtonUpd.BackgroundImageLayout = ImageLayout.Stretch; + ButtonUpd.Location = new Point(55, 121); + ButtonUpd.Name = "ButtonUpd"; + ButtonUpd.Size = new Size(65, 59); + ButtonUpd.TabIndex = 1; + ButtonUpd.UseVisualStyleBackColor = true; + ButtonUpd.Click += ButtonUpd_Click; + // + // ButtonAdd + // + ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage"); + ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch; + ButtonAdd.Location = new Point(55, 32); + ButtonAdd.Name = "ButtonAdd"; + ButtonAdd.Size = new Size(65, 59); + ButtonAdd.TabIndex = 0; + ButtonAdd.UseVisualStyleBackColor = true; + ButtonAdd.Click += ButtonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(651, 450); + dataGridView.TabIndex = 1; + // + // FormRoutes + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormRoutes"; + StartPosition = FormStartPosition.CenterParent; + Text = "Маршруты"; + Load += FormRoutes_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button ButtonDel; + private Button ButtonUpd; + private Button ButtonAdd; + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormRoutes.cs b/Travel_Agency/Travel_Agency/Forms/FormRoutes.cs new file mode 100644 index 0000000..c328d9d --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormRoutes.cs @@ -0,0 +1,115 @@ +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 Travel_Agency.Repositories; +using Unity; + +namespace Travel_Agency.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 FormRoutes_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpd_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 ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _routeRepository.DeleteRoute(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridView.DataSource = _routeRepository.ReadRoutes(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormRoutes.resx b/Travel_Agency/Travel_Agency/Forms/FormRoutes.resx new file mode 100644 index 0000000..d00a30d --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormRoutes.resx @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + UBMAAAAASUVORK5CYII= + + + + + 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 + qad27tz51Vdfzc7OyhsB5VkoW43sFStWSLAZNDQ0qP9+9NFHZ8+elbcAKjFd9q1bt95+++1ishm9/PLL + Kms5HsjGwjVbbWVpthI1rF999dUvv/xSjgQyM132999/v2nTJik31fr169XV/fLly3/++accDGRmtOw7 + d+5MTk6uXLlS4i2jqampvb3922+/vXbtmhwJ5GT6mv3WW29Jv+UdOHDg66+/lgOAqhgtu1Ao7Nu3r3iv + I5FaIG+88Ya6tM/Pz8sxQFWMlv3rr7++8sorUvFSq1ev7ujo+OSTT7hdDS2Mlj0xMdHS0iIt36OxsVF9 + s/jjjz/euHFDXgrUxlzZamCMjIyU/pmldevWffDBBz/99JO8DtDBXNlqPb///vuS811dXV3Dw8PyCkAf + c2WrpaE6XrZsWbHpJ5544vnnn7948SILBPVgruzF33189NFHV65cefz48dOnT8vnAN3MlT09PV28Wu/a + teuLL76QjwL1Ya7so0ePbty4cffu3TMzM/IhoG4Mlf3HH3989913AwMDV65ckQ8B9WTumv3zzz9funRJ + ngB1Zq5swCTKRpgoG2GibISJshEmykaYKBthomyEibIRooWF/wOJOuh6obV2FwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAKkAAAClCAIAAACodUoDAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wAAADsABataJCQAAF+dJREFUeF7tXWuPHcWZpvvcT/eZGc+Mx4MvYGOMr4Nn7PGYGc94xvY4EayWzRek + fEFKpEjRhmg3lmATKSChZaWED+twMyEkEG4mrLlfYsDY2GGDWUIE5DfwQ9jnPf36eFynqk51d/XlzDmP + Ho16+nR3VdfT9Va9b1dVX/dtH72Kvva9i772vYu+9r2Lvva9i772vYu+9r2Lvva9i772vYu+9r2Lvva9 + i772vYu+9r2Lvva9i772vYtVrv0333xz+fLlkydPnmhitomNTVx3LYKdwQF33XUXDj5z5gzO5QutRqw2 + 7SF2oHS7unEQPBCr7GlYDdpDD+ti64HnIHgUOAfdiW7VHvUbRQ8B0pRciu59CLpPexQ0LDAXfJ7QdQ9B + 12iPip6yYY8MPASc6XyjC7QPbDuXa/cg/2Yg19qj7LqiomuQ5ycgp9qvAtVXIp9PQO60h8OWtOoD/ziu + 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 + + + \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormTour.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormTour.Designer.cs new file mode 100644 index 0000000..cb72734 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormTour.Designer.cs @@ -0,0 +1,143 @@ +namespace Travel_Agency.Forms +{ + partial class FormTour + { + /// + /// 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() + { + labelName = new Label(); + labelPrice = new Label(); + textBoxName = new TextBox(); + numericUpDownPrice = new NumericUpDown(); + ButtonSave = new Button(); + ButtonCencel = new Button(); + labelTypeOfTour = new Label(); + checkedListBoxType = new CheckedListBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit(); + SuspendLayout(); + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(46, 51); + labelName.Name = "labelName"; + labelName.Size = new Size(118, 20); + labelName.TabIndex = 0; + labelName.Text = "Название тура :"; + // + // labelPrice + // + labelPrice.AutoSize = true; + labelPrice.Location = new Point(46, 115); + labelPrice.Name = "labelPrice"; + labelPrice.Size = new Size(124, 20); + labelPrice.TabIndex = 1; + labelPrice.Text = "Стоимость тура :"; + // + // textBoxName + // + textBoxName.Location = new Point(211, 44); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(172, 27); + textBoxName.TabIndex = 2; + // + // numericUpDownPrice + // + numericUpDownPrice.Location = new Point(211, 108); + numericUpDownPrice.Name = "numericUpDownPrice"; + numericUpDownPrice.Size = new Size(172, 27); + numericUpDownPrice.TabIndex = 3; + // + // ButtonSave + // + ButtonSave.Location = new Point(60, 339); + ButtonSave.Name = "ButtonSave"; + ButtonSave.Size = new Size(94, 29); + ButtonSave.TabIndex = 4; + ButtonSave.Text = "Сохранить"; + ButtonSave.UseVisualStyleBackColor = true; + ButtonSave.Click += ButtonSave_Click; + // + // ButtonCencel + // + ButtonCencel.Location = new Point(255, 339); + ButtonCencel.Name = "ButtonCencel"; + ButtonCencel.Size = new Size(94, 29); + ButtonCencel.TabIndex = 5; + ButtonCencel.Text = "Отмена"; + ButtonCencel.UseVisualStyleBackColor = true; + ButtonCencel.Click += ButtonCencel_Click; + // + // labelTypeOfTour + // + labelTypeOfTour.AutoSize = true; + labelTypeOfTour.Location = new Point(46, 179); + labelTypeOfTour.Name = "labelTypeOfTour"; + labelTypeOfTour.Size = new Size(76, 20); + labelTypeOfTour.TabIndex = 6; + labelTypeOfTour.Text = "Тип тура :"; + // + // checkedListBoxType + // + checkedListBoxType.FormattingEnabled = true; + checkedListBoxType.Location = new Point(211, 179); + checkedListBoxType.Name = "checkedListBoxType"; + checkedListBoxType.Size = new Size(172, 114); + checkedListBoxType.TabIndex = 7; + // + // FormTour + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(427, 414); + Controls.Add(checkedListBoxType); + Controls.Add(labelTypeOfTour); + Controls.Add(ButtonCencel); + Controls.Add(ButtonSave); + Controls.Add(numericUpDownPrice); + Controls.Add(textBoxName); + Controls.Add(labelPrice); + Controls.Add(labelName); + Name = "FormTour"; + StartPosition = FormStartPosition.CenterParent; + Text = "Тур"; + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelName; + private Label labelPrice; + private TextBox textBoxName; + private NumericUpDown numericUpDownPrice; + private Button ButtonSave; + private Button ButtonCencel; + private Label labelTypeOfTour; + private CheckedListBox checkedListBoxType; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormTour.cs b/Travel_Agency/Travel_Agency/Forms/FormTour.cs new file mode 100644 index 0000000..e42bcd2 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormTour.cs @@ -0,0 +1,102 @@ +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 Microsoft.VisualBasic.FileIO; +using Travel_Agency.Entities; +using Travel_Agency.Entities.Enums; +using Travel_Agency.Repositories; +using Travel_Agency.Repositories.Implementations; + +namespace Travel_Agency.Forms +{ + public partial class FormTour : Form + { + private readonly ITourRepository _tourRepository; + private int? _tourId; + public int Id + { + set + { + try + { + var tour = _tourRepository.ReadTourById(value); + if (tour == null) + { + throw new InvalidDataException(nameof(tour)); + } + + foreach (TypeOfTour elem in Enum.GetValues(typeof(TypeOfTour))) + { + if ((elem & tour.TypeOfTour) != 0) + { + checkedListBoxType.SetItemChecked(checkedListBoxType.Items.IndexOf(elem), true); + } + } + + textBoxName.Text = tour.Name; + numericUpDownPrice.Value = tour.Price; + + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormTour(ITourRepository tourRepository) + { + InitializeComponent(); + _tourRepository = tourRepository ?? + throw new ArgumentNullException(nameof(tourRepository)); + foreach (var elem in Enum.GetValues(typeof(TypeOfTour))) + { + checkedListBoxType.Items.Add(elem); + } + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxName.Text) || numericUpDownPrice.Value == 0 || checkedListBoxType.CheckedItems.Count == 0) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_tourId.HasValue) + { + _tourRepository.UpdateTour(CreateTour(_tourId.Value)); + } + else + { + _tourRepository.CreateTour(CreateTour(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCencel_Click(object sender, EventArgs e) => Close(); + + private Tour CreateTour(int id) + { + TypeOfTour typeOfTour = TypeOfTour.None; + foreach (var elem in checkedListBoxType.CheckedItems) + { + typeOfTour |= (TypeOfTour)elem; + } + + return Tour.CreateEntity(id, textBoxName.Text, typeOfTour, Convert.ToInt32(numericUpDownPrice.Value)); + } + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormTour.resx b/Travel_Agency/Travel_Agency/Forms/FormTour.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormTour.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/Travel_Agency/Travel_Agency/Forms/FormTours.Designer.cs b/Travel_Agency/Travel_Agency/Forms/FormTours.Designer.cs new file mode 100644 index 0000000..e66a503 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormTours.Designer.cs @@ -0,0 +1,129 @@ +namespace Travel_Agency.Forms +{ + partial class FormTours + { + /// + /// 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(FormTours)); + panel1 = new Panel(); + ButtonDel = new Button(); + ButtonUpd = new Button(); + ButtonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(ButtonDel); + panel1.Controls.Add(ButtonUpd); + panel1.Controls.Add(ButtonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(651, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(149, 450); + panel1.TabIndex = 1; + // + // ButtonDel + // + ButtonDel.BackgroundImage = (Image)resources.GetObject("ButtonDel.BackgroundImage"); + ButtonDel.BackgroundImageLayout = ImageLayout.Stretch; + ButtonDel.Location = new Point(55, 213); + ButtonDel.Name = "ButtonDel"; + ButtonDel.Size = new Size(65, 59); + ButtonDel.TabIndex = 2; + ButtonDel.UseVisualStyleBackColor = true; + ButtonDel.Click += ButtonDel_Click; + // + // ButtonUpd + // + ButtonUpd.BackgroundImage = (Image)resources.GetObject("ButtonUpd.BackgroundImage"); + ButtonUpd.BackgroundImageLayout = ImageLayout.Stretch; + ButtonUpd.Location = new Point(55, 121); + ButtonUpd.Name = "ButtonUpd"; + ButtonUpd.Size = new Size(65, 59); + ButtonUpd.TabIndex = 1; + ButtonUpd.UseVisualStyleBackColor = true; + ButtonUpd.Click += ButtonUpd_Click; + // + // ButtonAdd + // + ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage"); + ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch; + ButtonAdd.Location = new Point(55, 32); + ButtonAdd.Name = "ButtonAdd"; + ButtonAdd.Size = new Size(65, 59); + ButtonAdd.TabIndex = 0; + ButtonAdd.UseVisualStyleBackColor = true; + ButtonAdd.Click += ButtonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(651, 450); + dataGridView.TabIndex = 2; + // + // FormTours + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormTours"; + StartPosition = FormStartPosition.CenterParent; + Text = "Туры"; + Load += FormTours_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button ButtonDel; + private Button ButtonUpd; + private Button ButtonAdd; + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Forms/FormTours.cs b/Travel_Agency/Travel_Agency/Forms/FormTours.cs new file mode 100644 index 0000000..3929c97 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormTours.cs @@ -0,0 +1,114 @@ +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 Travel_Agency.Repositories; +using Travel_Agency.Repositories.Implementations; +using Unity; + +namespace Travel_Agency.Forms +{ + public partial class FormTours : Form + { + private readonly IUnityContainer _container; + + private readonly ITourRepository _tourRepository; + public FormTours(IUnityContainer container, ITourRepository tourRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _tourRepository = tourRepository ?? + throw new ArgumentNullException(nameof(tourRepository)); + } + + private void FormTours_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpd_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 ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _tourRepository.DeleteTour(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridView.DataSource = _tourRepository.ReadTours(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/Travel_Agency/Travel_Agency/Forms/FormTours.resx b/Travel_Agency/Travel_Agency/Forms/FormTours.resx new file mode 100644 index 0000000..d987d75 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Forms/FormTours.resx @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + UBMAAAAASUVORK5CYII= + + + + + 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 + qad27tz51Vdfzc7OyhsB5VkoW43sFStWSLAZNDQ0qP9+9NFHZ8+elbcAKjFd9q1bt95+++1ishm9/PLL + Kms5HsjGwjVbbWVpthI1rF999dUvv/xSjgQyM132999/v2nTJik31fr169XV/fLly3/++accDGRmtOw7 + d+5MTk6uXLlS4i2jqampvb3922+/vXbtmhwJ5GT6mv3WW29Jv+UdOHDg66+/lgOAqhgtu1Ao7Nu3r3iv + I5FaIG+88Ya6tM/Pz8sxQFWMlv3rr7++8sorUvFSq1ev7ujo+OSTT7hdDS2Mlj0xMdHS0iIt36OxsVF9 + s/jjjz/euHFDXgrUxlzZamCMjIyU/pmldevWffDBBz/99JO8DtDBXNlqPb///vuS811dXV3Dw8PyCkAf + c2WrpaE6XrZsWbHpJ5544vnnn7948SILBPVgruzF33189NFHV65cefz48dOnT8vnAN3MlT09PV28Wu/a + teuLL76QjwL1Ya7so0ePbty4cffu3TMzM/IhoG4Mlf3HH3989913AwMDV65ckQ8B9WTumv3zzz9funRJ + ngB1Zq5swCTKRpgoG2GibISJshEmykaYKBthomyEibIRooWF/wOJOuh6obV2FwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAKkAAAClCAIAAACodUoDAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vgAADr4B6kKxwAAAF+dJREFUeF7tXWuPHcWZpvvcT/eZGc+Mx4MvYGOMr4Nn7PGYGc94xvY4EayWzRek + fEFKpEjRhmg3lmATKSChZaWED+twMyEkEG4mrLlfYsDY2GGDWUIE5DfwQ9jnPf36eFynqk51d/XlzDmP + Ho16+nR3VdfT9Va9b1dVX/dtH72Kvva9i772vYu+9r2Lvva9i772vYu+9r2Lvva9i772vYu+9r2Lvva9 + i772vYu+9r2Lvva9i772vYtVrv0333xz+fLlkydPnmhitomNTVx3LYKdwQF33XUXDj5z5gzO5QutRqw2 + 7SF2oHS7unEQPBCr7GlYDdpDD+ti64HnIHgUOAfdiW7VHvUbRQ8B0pRciu59CLpPexQ0LDAXfJ7QdQ9B + 12iPip6yYY8MPASc6XyjC7QPbDuXa/cg/2Yg19qj7LqiomuQ5ycgp9qvAtVXIp9PQO60h8OWtOoD/ziu + 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 + + + \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Picture_Travel_Agency.jpg b/Travel_Agency/Travel_Agency/Picture_Travel_Agency.jpg new file mode 100644 index 0000000..cb64e2a Binary files /dev/null and b/Travel_Agency/Travel_Agency/Picture_Travel_Agency.jpg differ diff --git a/Travel_Agency/Travel_Agency/Program.cs b/Travel_Agency/Travel_Agency/Program.cs index 8afc856..292de88 100644 --- a/Travel_Agency/Travel_Agency/Program.cs +++ b/Travel_Agency/Travel_Agency/Program.cs @@ -1,3 +1,7 @@ +using Travel_Agency.Repositories; +using Travel_Agency.Repositories.Implementations; +using Unity; + namespace Travel_Agency { internal static class Program @@ -11,7 +15,20 @@ namespace Travel_Agency // 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(); + + return container; } } } \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Properties/Resources.Designer.cs b/Travel_Agency/Travel_Agency/Properties/Resources.Designer.cs new file mode 100644 index 0000000..320dc3f --- /dev/null +++ b/Travel_Agency/Travel_Agency/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace Travel_Agency.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("Travel_Agency.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 Picture_Travel_Agency { + get { + object obj = ResourceManager.GetObject("Picture_Travel_Agency", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Travel_Agency/Travel_Agency/Properties/Resources.resx b/Travel_Agency/Travel_Agency/Properties/Resources.resx new file mode 100644 index 0000000..a761d41 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Picture_Travel_Agency.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Travel_Agency/Travel_Agency/Repositories/IClientRepository.cs b/Travel_Agency/Travel_Agency/Repositories/IClientRepository.cs new file mode 100644 index 0000000..b802a48 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/IClientRepository.cs @@ -0,0 +1,13 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories; + +public interface IClientRepository +{ + IEnumerable ReadClients(); + Client ReadClientById(int id); + void CreateClient(Client client); + void UpdateClient(Client client); + void DeleteClientById(int id); +} diff --git a/Travel_Agency/Travel_Agency/Repositories/IContractRepository.cs b/Travel_Agency/Travel_Agency/Repositories/IContractRepository.cs new file mode 100644 index 0000000..495ef9a --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/IContractRepository.cs @@ -0,0 +1,11 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories; + +public interface IContractRepository +{ + IEnumerable ReadContracts(DateTime? dateFrom = null, DateTime? dateTo = null, int? clientId = null); + void DeleteContract(int id); + void CreateContract(Contract contract); +} diff --git a/Travel_Agency/Travel_Agency/Repositories/IPaymentRepository.cs b/Travel_Agency/Travel_Agency/Repositories/IPaymentRepository.cs new file mode 100644 index 0000000..40bf7d3 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/IPaymentRepository.cs @@ -0,0 +1,10 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories; + +public interface IPaymentRepository +{ + IEnumerable ReadPayments(DateTime? dateFrom = null, DateTime? dateTo = null, int? clientId = null); + void CreatePayment(Payment payment); +} diff --git a/Travel_Agency/Travel_Agency/Repositories/IRouteRepository.cs b/Travel_Agency/Travel_Agency/Repositories/IRouteRepository.cs new file mode 100644 index 0000000..3f1c02c --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/IRouteRepository.cs @@ -0,0 +1,14 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories; + +public interface IRouteRepository +{ + IEnumerable ReadRoutes(); + Route ReadRouteById(int id); + void CreateRoute(Route route); + void UpdateRoute(Route route); + void DeleteRoute(int id); + +} diff --git a/Travel_Agency/Travel_Agency/Repositories/ITourRepository.cs b/Travel_Agency/Travel_Agency/Repositories/ITourRepository.cs new file mode 100644 index 0000000..d7aee5d --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/ITourRepository.cs @@ -0,0 +1,14 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories; + +public interface ITourRepository +{ + IEnumerable ReadTours(); + Tour ReadTourById(int id); + void CreateTour(Tour tour); + void UpdateTour(Tour tour); + void DeleteTour(int id); + +} diff --git a/Travel_Agency/Travel_Agency/Repositories/Implementations/ClientRepository.cs b/Travel_Agency/Travel_Agency/Repositories/Implementations/ClientRepository.cs new file mode 100644 index 0000000..35ca29e --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/Implementations/ClientRepository.cs @@ -0,0 +1,29 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories.Implementations; + +public class ClientRepository : IClientRepository +{ + public void CreateClient(Client client) + { + } + + public void DeleteClientById(int id) + { + } + + public Client ReadClientById(int id) + { + return Client.CreateEntity(0, string.Empty, string.Empty, 0); + } + + public IEnumerable ReadClients() + { + return []; + } + + public void UpdateClient(Client client) + { + } +} diff --git a/Travel_Agency/Travel_Agency/Repositories/Implementations/ContractRepository.cs b/Travel_Agency/Travel_Agency/Repositories/Implementations/ContractRepository.cs new file mode 100644 index 0000000..4c165e5 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/Implementations/ContractRepository.cs @@ -0,0 +1,20 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories.Implementations; + +public class ContractRepository : IContractRepository +{ + public void CreateContract(Contract contract) + { + } + + public void DeleteContract(int id) + { + } + + public IEnumerable ReadContracts(DateTime? dateFrom = null, DateTime? dateTo = null, int? clientId = null) + { + return []; + } +} diff --git a/Travel_Agency/Travel_Agency/Repositories/Implementations/PaymentRepository.cs b/Travel_Agency/Travel_Agency/Repositories/Implementations/PaymentRepository.cs new file mode 100644 index 0000000..3bd8102 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/Implementations/PaymentRepository.cs @@ -0,0 +1,16 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories.Implementations; + +public class PaymentRepository : IPaymentRepository +{ + public void CreatePayment(Payment payment) + { + } + + public IEnumerable ReadPayments(DateTime? dateFrom = null, DateTime? dateTo = null, int? clientId = null) + { + return []; + } +} diff --git a/Travel_Agency/Travel_Agency/Repositories/Implementations/RouteRepository.cs b/Travel_Agency/Travel_Agency/Repositories/Implementations/RouteRepository.cs new file mode 100644 index 0000000..e6976a5 --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/Implementations/RouteRepository.cs @@ -0,0 +1,29 @@ + +using Travel_Agency.Entities; + +namespace Travel_Agency.Repositories.Implementations; + +public class RouteRepository : IRouteRepository +{ + public void CreateRoute(Route route) + { + } + + public void DeleteRoute(int id) + { + } + + public Route ReadRouteById(int id) + { + return Route.CreateEntity(0, string.Empty, 0, string.Empty, 0, 0); + } + + public IEnumerable ReadRoutes() + { + return []; + } + + public void UpdateRoute(Route route) + { + } +} diff --git a/Travel_Agency/Travel_Agency/Repositories/Implementations/TourRepository.cs b/Travel_Agency/Travel_Agency/Repositories/Implementations/TourRepository.cs new file mode 100644 index 0000000..66454ea --- /dev/null +++ b/Travel_Agency/Travel_Agency/Repositories/Implementations/TourRepository.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Travel_Agency.Entities; +using Travel_Agency.Entities.Enums; + +namespace Travel_Agency.Repositories.Implementations; + +public class TourRepository : ITourRepository +{ + public void CreateTour(Tour tour) + { + } + + public void DeleteTour(int id) + { + } + + public Tour ReadTourById(int id) + { + return Tour.CreateEntity(0, string.Empty, TypeOfTour.None, 0); + } + + public IEnumerable ReadTours() + { + return []; + } + + public void UpdateTour(Tour tour) + { + } +} diff --git a/Travel_Agency/Travel_Agency/Travel_Agency.csproj b/Travel_Agency/Travel_Agency/Travel_Agency.csproj index b57c89e..45a8476 100644 --- a/Travel_Agency/Travel_Agency/Travel_Agency.csproj +++ b/Travel_Agency/Travel_Agency/Travel_Agency.csproj @@ -6,6 +6,26 @@ enable true enable + preview + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file