From c4e70dafce92c5419a41248d8c0c9e144aba4f3b Mon Sep 17 00:00:00 2001 From: 145Game Date: Mon, 11 Nov 2024 14:01:14 +0400 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=81=D0=B5=20=D0=A1=D1=83=D1=89=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8,=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B8=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Travel_Agency/Entities/Client.cs | 27 ++ .../Travel_Agency/Entities/Contract.cs | 30 ++ .../Travel_Agency/Entities/Contract_Tour.cs | 20 + .../Entities/Enums/PositionInSociety.cs | 11 + .../Entities/Enums/TypeOfTour.cs | 13 + .../Travel_Agency/Entities/Payment.cs | 19 + Travel_Agency/Travel_Agency/Entities/Route.cs | 24 ++ Travel_Agency/Travel_Agency/Entities/Tour.cs | 27 ++ Travel_Agency/Travel_Agency/Form1.Designer.cs | 39 -- Travel_Agency/Travel_Agency/Form1.cs | 10 - .../FormTravel_Agency.Designer.cs | 138 +++++++ .../Travel_Agency/FormTravel_Agency.cs | 84 +++++ .../Travel_Agency/FormTravel_Agency.resx | 123 ++++++ .../Forms/FormClient.Designer.cs | 141 +++++++ .../Travel_Agency/Forms/FormClient.cs | 93 +++++ .../{Form1.resx => Forms/FormClient.resx} | 50 +-- .../Forms/FormClients.Designer.cs | 128 +++++++ .../Travel_Agency/Forms/FormClients.cs | 114 ++++++ .../Travel_Agency/Forms/FormClients.resx | 356 ++++++++++++++++++ .../Forms/FormContract.Designer.cs | 262 +++++++++++++ .../Travel_Agency/Forms/FormContract.cs | 77 ++++ .../Travel_Agency/Forms/FormContract.resx | 129 +++++++ .../Forms/FormContracts.Designer.cs | 115 ++++++ .../Travel_Agency/Forms/FormContracts.cs | 97 +++++ .../Travel_Agency/Forms/FormContracts.resx | 299 +++++++++++++++ .../Forms/FormPayment.Designer.cs | 121 ++++++ .../Travel_Agency/Forms/FormPayment.cs | 54 +++ .../Travel_Agency/Forms/FormPayment.resx | 120 ++++++ .../Forms/FormPayments.Designer.cs | 100 +++++ .../Travel_Agency/Forms/FormPayments.cs | 58 +++ .../Travel_Agency/Forms/FormPayments.resx | 229 +++++++++++ .../Travel_Agency/Forms/FormRoute.Designer.cs | 191 ++++++++++ .../Travel_Agency/Forms/FormRoute.cs | 87 +++++ .../Travel_Agency/Forms/FormRoute.resx | 120 ++++++ .../Forms/FormRoutes.Designer.cs | 129 +++++++ .../Travel_Agency/Forms/FormRoutes.cs | 115 ++++++ .../Travel_Agency/Forms/FormRoutes.resx | 356 ++++++++++++++++++ .../Travel_Agency/Forms/FormTour.Designer.cs | 143 +++++++ Travel_Agency/Travel_Agency/Forms/FormTour.cs | 102 +++++ .../Travel_Agency/Forms/FormTour.resx | 120 ++++++ .../Travel_Agency/Forms/FormTours.Designer.cs | 129 +++++++ .../Travel_Agency/Forms/FormTours.cs | 114 ++++++ .../Travel_Agency/Forms/FormTours.resx | 356 ++++++++++++++++++ .../Travel_Agency/Picture_Travel_Agency.jpg | Bin 0 -> 63195 bytes Travel_Agency/Travel_Agency/Program.cs | 19 +- .../Properties/Resources.Designer.cs | 73 ++++ .../Travel_Agency/Properties/Resources.resx | 124 ++++++ .../Repositories/IClientRepository.cs | 13 + .../Repositories/IContractRepository.cs | 11 + .../Repositories/IPaymentRepository.cs | 10 + .../Repositories/IRouteRepository.cs | 14 + .../Repositories/ITourRepository.cs | 14 + .../Implementations/ClientRepository.cs | 29 ++ .../Implementations/ContractRepository.cs | 20 + .../Implementations/PaymentRepository.cs | 16 + .../Implementations/RouteRepository.cs | 29 ++ .../Implementations/TourRepository.cs | 34 ++ .../Travel_Agency/Travel_Agency.csproj | 20 + 58 files changed, 5421 insertions(+), 75 deletions(-) create mode 100644 Travel_Agency/Travel_Agency/Entities/Client.cs create mode 100644 Travel_Agency/Travel_Agency/Entities/Contract.cs create mode 100644 Travel_Agency/Travel_Agency/Entities/Contract_Tour.cs create mode 100644 Travel_Agency/Travel_Agency/Entities/Enums/PositionInSociety.cs create mode 100644 Travel_Agency/Travel_Agency/Entities/Enums/TypeOfTour.cs create mode 100644 Travel_Agency/Travel_Agency/Entities/Payment.cs create mode 100644 Travel_Agency/Travel_Agency/Entities/Route.cs create mode 100644 Travel_Agency/Travel_Agency/Entities/Tour.cs delete mode 100644 Travel_Agency/Travel_Agency/Form1.Designer.cs delete mode 100644 Travel_Agency/Travel_Agency/Form1.cs create mode 100644 Travel_Agency/Travel_Agency/FormTravel_Agency.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/FormTravel_Agency.cs create mode 100644 Travel_Agency/Travel_Agency/FormTravel_Agency.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormClient.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormClient.cs rename Travel_Agency/Travel_Agency/{Form1.resx => Forms/FormClient.resx} (93%) create mode 100644 Travel_Agency/Travel_Agency/Forms/FormClients.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormClients.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormClients.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormContract.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormContract.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormContract.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormContracts.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormContracts.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormContracts.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormPayment.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormPayment.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormPayment.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormPayments.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormPayments.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormPayments.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormRoute.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormRoute.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormRoute.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormRoutes.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormRoutes.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormRoutes.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormTour.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormTour.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormTour.resx create mode 100644 Travel_Agency/Travel_Agency/Forms/FormTours.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormTours.cs create mode 100644 Travel_Agency/Travel_Agency/Forms/FormTours.resx create mode 100644 Travel_Agency/Travel_Agency/Picture_Travel_Agency.jpg create mode 100644 Travel_Agency/Travel_Agency/Properties/Resources.Designer.cs create mode 100644 Travel_Agency/Travel_Agency/Properties/Resources.resx create mode 100644 Travel_Agency/Travel_Agency/Repositories/IClientRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/IContractRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/IPaymentRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/IRouteRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/ITourRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/Implementations/ClientRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/Implementations/ContractRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/Implementations/PaymentRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/Implementations/RouteRepository.cs create mode 100644 Travel_Agency/Travel_Agency/Repositories/Implementations/TourRepository.cs 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 + + + + + iVBORw0KGgoAAAANSUhEUgAAANMAAADPCAIAAADgcXNuAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAADuxJREFUeF7tnUGOJDsRhp8EQiC9xZNACNAsWHAFFpyCFYdg2Wdg3zfgAn0BbtAH + 4Aq15Q5DaPxPql6U7YqwIxzOrPj0L0Yz1ZFO+ytn2lld88PXJIkgzUtiSPOSGNK8JIY0L4khzUtiSPOS + GNK8JIY0L4khzUtiSPOSGNK8JIY0L4khzUtiSPOSGNK8JIY0L4khzUtiSPOSGNK8JIY0L4khzUtiSPOa + 3G63z8/P9/f3t7e3v33ny3d+uKP8TXnBP75BP/LxDSqCcsnPSfNA8axIxsSahwoeOuJ4L89Lm+en2lNS + xJczj+Y2uoCSbVBgA8jCF1TwVcwr09v6uU1FuSi/iIUXN49mOBrIzYV7hBp8ef8uax45R/MHRvK0XHgK + vKB5Z5zk+tBd6fX8u5R513OOcSX/LmLeSuf+9+Uv1eCf/bmGf6c3z8k5ZtVkUNSU9/d3dME5ObF5ts4x + V1yDQ05Dp3/e+e+U5lmtW5kQIUFTJqCuoA5B15yH85n39vaGLh+Fjf0mQeNGoW5BB52EM5k3eXllI71t + 0Fw957r4nsa8mamODe0pgqbrOcvkdwLz6CZm+AE/G87TBaehhLpr/zu/3c37/PwcuMKy8Tt7cFZKqOvQ + iVuytXnv7+/oRTFszK4UnKGGnff89jVvYN+EDdUlg1MVQ92IDt2MHc0buLFjw3P54LRl7Hnbt5152hs7 + NiQvFXSBAOrS3W779jLv4+MDXSWDjcQLBh0hY6vdvo3M064n2Bi8bNAdMvZZc+xinko71vUZCrpGwCby + bWGe6iLLejxzBB0kYIfLbrx5dOeL/hDA+jrDgm4SEL7gCDYvtTMPOktArHyR5t1uN+EGCuvczNOg47pQ + 5wfu80Wal9q5Bt3XhYYAg7GcMPOETylYb2ZUQSd2oYHAkKwlxjzhh+1YP2YGgq7sEvKRvgDzhFt3rAcz + w0GHdlm/ybfaPOFilvVdZjLo1i6Ll7qrzcNZdmG9ljEJOrfN4qXuUvMkH7lj/WWY//z+y59+8cv//vHP + 7O+3CjWPGklNZX9vEnRxm5Uf5ltnnvARGessq9BYlvo7y1e0K+30kK9U7rPswdo683BmXVhPWeXfv/0D + DvAdp0llJmVKRvu+8a+ffsdeMx+UbrNsh2+ReYHXWRo/HODnbCXfMSUzQuRbc81dYZ7kOst6xyot7Qo0 + F7LXh+RxSr4nRL4F69wV5j19Ssb6xSr//PEnHKCNx7iq0n9vFOhE2E/NB6UbLLjmupsXNeFJtCsEyifR + rmAuH+q28V5quJuH82jDesQkf/3Vr1Fdhsek8jTy90aBTopVmAzqNvCe9nzNe/qgjPWFSbTaFRbLp9Wu + sFg+12nP1zycQRvWEZO53w8b4O+/+ZEVdAodCIfUQ/IZ7keiaBu/pxqO5j39QArrhclMalcwn1QeMzYl + 32O7GY6iDfx2WBzNQ9vbsC6YyeM27DC2k8p9qOy8dgU6Wav9SFRs4zTteZn3dOuYnf9MWtuww9hOKiUm + UzJjjXxO056XeWh1G3byw1FpJ7/BspVPpZ3qLtBqMxzlajgtcl3Me7qHx057OPL9MKLs26kWlSaTiuq9 + UZbYA+c1GdRq4LHIdTGv/9CCnfNwhodnpXwD2pVsJZ/HtGdv3poJb9KeNeM6eZRha8eCQg3Mpz178xas + LUwmLW/5TOrvI5/5r6jZm4eWNmCnOhDDVYLfuJq8N0q0qxP246qgSgPb7RVj87wvtfL9MOHi1EM+Q+1K + VPLNbIajRAPb308zNq9/qWXnqY1cO9VuMI29fFyfyifXTvjeKKFXqk6f/bg8KFHDdp1hbB7a2ICdpDZ+ + b32rynI5VNpR/CqzoEoDwwuupXn9Sy07w7G4yicf3WrlC2hXglo1DFe4lua5Xmrvo1JkwRjTH/zeD06V + O0G5GoYrXEvz0LoG7PQmM6aIJNrKF9OOgooNrC64ZuYtuNSyqO7lJUvII6rFqVyOp6uT+6i0U1WWBHVr + WP1ykJl5yy6191Ep4iefBJUcHns9qqB0Dasvnjq3eRQ/+VQPIfqoHoGEa0dB9RpWt3pm5qFdDdiJ2cbk + OVU1JvL5HVFVWRUcoAGGfA6bKv3vJmNn5RG/Aev/GvZTVJ+f20S7Ehymhskiw8a89cuLx/hdpFSV71Fd + 3P1uG8aCI9UweYxmY17UTR7LPvK5rqYXaEfBwWrQcGPgJ7Axr/912+yUXEOjIt+MUH2yQ77NQS+jF7Mf + 7yTqM/r94JA1TB7gGt0ttmHnsyB+G7CSylo5/LbE54MD18DAT3BB8yg0QvIR1e7+dyrTP8nl0DZysXYU + HLvG/CLDwLzwhW0r8nE1majoL9nLOqHDOU3MhsHha8w/yTAwb4eFbSt+t1CsstMtIxGlHQUtqDG/vDUw + r/8tFuxk1sdv2XhU1i6T5dqpKpsHjagx/wzNwLxNtlQ6cZVPqx0OIyBWOwraUWN+Y+UlzKOoHg84fYut + 6nGI9yMKSdCUGvNPbw3M22czr5/YZ1OxRx8LWlNjC/PWfKOASaJmHZV2TjPuWNCmB+Y3k33NY6exQ9bf + afndZS4ImvXAFuahLTXYaWySlatLuXbUpN20o6BxD6R5g1mzo1bdcK5CjVHtJi4L2lcDwz/Ki5pH8Zbv + AtpR0MQaGP5R0jwRad4jGP5RDMw71wqjxFu7kgvIh/bVwPCP8orm5QpDHjTugS1WGOcyj0YXjRMwqV2J + XD5iK/nQphpbmHeWZxiU3ElWBQ2qkU/PFFENv6F2JbFHHwtaUyM/MSDNDrNO1Iw7HDSlxhbmbf75PIrf + nRZVVt0Lrr/LnAnaUWOLz+f1/0NHdjLrI9dOu7o8Kl9VPjSixvwX6RmYt+3vYVAu8Gl4VWXboAU1tvg9 + jNvthubUYCezMn4budXKqg3nNVvZk8Hha2DsJzAoQaA5NdjJrAmNq1w7eqVcu35lrSJOjbQKjl0DAz+B + jXmdzWSCnY93/KYTSWWT6bOKtvJkcNQa85t5hI15+2ysqLRzujnTKuJ3MzoTHLLG/JYKYWPeJstbv2Uj + VZYLXRhbJktQVR4ODlbD5BvibczbYZHhqh1+TMmp5cORaswvbAkb8wg0qgE7K/P4PZtSPXh4RPU4xO8s + tMExGmDI5zAzL/Dprd+AqSq38DuiqrIqOEANk5s8wsy8qGdofhcpE+0KKkX8bhvkQfUa25kX8iTDTztV + ZQkqRcLlQ+kaJssLwsy8/iKDYOc2H7kc2s0IVWX8SYBWPnlxW/lQtAHGexqzQsTKWz2/DVhtZYpcEfON + 6wNV5X5QsYbVpZawNG/ZF+nto135KVf55E2ykg/lalhdaglL8xZccF3HeLKySpHDWknklbXvtMegUAOM + tAWWtQjXB7g7a1fip8gy+VClhuGlljA2r/8YjWDnqYq89+mV8t5Xaff0Xl61OpEvt6mRqtNnPy4Mfr6B + 4aWWMDbP+4Jr/tb32L+Qy0dI5FO9N4a1o6BEA4yxEcblCO8VruEnO/y2zQzlU2k38wFmlGhge6kl7M3r + r3AJdsIDMRlX7+dUJvX93huPQZUGtpdawt48YsEHRSfl89auZPIoK7WjoFCN+W8UeMTFvAXTHmV4XA0v + hU8zbM+ktdqgUAPzCY9wMY9Y8/n4geFZqV3JgHxbaUdgUE3xMo9uSNHqBuzkh6P6/FzU585JPtUqAX8S + YPLeQK0G5muLgpd5T7dXCHb+w1FNKhJstStRLVGFLNCOwIha41WXWDbtUVSTSh/VLrQqVFa+H9mHTtZE + OwoqNpj/FosWjuatnPYoJpPKzDasMPPyGU7JqNgGY+mAY2lizSL3yOSkMrMNq4rqTo5hqB0FRRvM/4eO + HXzNI/qLXIL1xXzG5JvfD1NFtcQ+sJ2SUbQNhtAHd/OeTnsE65H5aOVbrF2JVr7F2nns4d3jbh6xftqj + yMd1fj9sOPJ9O/P3Buo28HhowVhhXv+XgwqsX0wikS9QuxKJfIu1I7wnPGKFecTTHRaC9Y5J+uPq9K20 + 2vQ3w83fG6jbxmnrmLHIPOLpNZdgfWSSlnxW+2EmaW2Gr9eOwIA5s848yVKDYD1lEiaf4TasYR43w82n + ZNTtsuA6W1hnHhF1zaUck4rtfpht7jfDPd4bpXKHNdfZwlLzbrdb1DWXUiaVbbUrKfKFaEdgnJaw9GCE + ZJ1LsF7LTAbd2sXku8nkrDaPePr7aQXWd5nhoEO7uD4oqxJgHtH/4qkD1oOZgaAru/h9IKVDjHlE/1fU + Dlg/ZlRBJ3Yx+brtAcLMIySrDYL1ZkYYdF+XBU/JWkSaJ1zqEqxPM0+DjutCnU9DgMFYTqR5hHCpW2Cd + m6kGnSVg8WKWEWwekfIZBt0kIFY7It48QvhgrcD6OnMEHSRg2SOyDluYRwg3+QqsxzMUdI2A9Vt3VXYx + j1DJR7Cuf9mgO2Rsoh2xkXmE6rJLsDF4waAjZOxwkT3YyzyC7nyFWy0FNhIvFXSBAOrS8CUFYzvziNvt + JnzCccCG5PLBacugzgzct2uxo3kFyYf5GGx4LhmcqpiVH7lTsa95hHbNUWBDdaXgDMXss554ZGvzCNU+ + 8z1szM4enJWYDW/sGLubRwzc9h2w8TtdcBpK9ryxY5zAvILwI31V2HCeImi6npAP2w1wGvOIj48P1YYL + gw3ttkFz9VDnbLVj1+dM5hVmJr8CG+lNgsaNcpap7uB85hF0EzOw5/IIG/uQoCkTUFfsf1f3yCnNK0xe + fBlMCNfgkNOc6/LKOLF5hbE9v6cwVyaDonac2rnC6c0r0DBgTPxhVh3BPztzAecKFzGvsNK/9VzGucKl + zCvQ8AzvPO/JxZwrXNC8Ag2Vyfo3lpOuWyVc1rwDUpDmDIzkSSiT3FWdK1zfvEKZAjdXkJr39va2+ZN+ + K17FvHt2uxDTXen7+/u1Z7hHXtG8A1KQ5pj1FtLcRra9zvRW5aXNYxwiml+U71V7tbmtRZrXhBQhFw8d + CbKHII2YmuVviPICgn6ELqDpWYc0L4khzUtiSPOSGNK8JIY0L4khzUtiSPOSGNK8JIY0L4khzUtiSPOS + GNK8JIY0L4khzUtiSPOSGNK8JIY0L4khzUtiSPOSGNK8JIY0L4khzUtiSPOSGNK8JIKvX/8PIX0F0fFO + 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 0000000000000000000000000000000000000000..cb64e2a271bf22e0f527b27bafb661edf4932055 GIT binary patch literal 63195 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 literal 0 HcmV?d00001 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