From 121bf60ad904fb11f0c012a0ed1327993f93f217 Mon Sep 17 00:00:00 2001 From: zw1st <144824777+zw1st@users.noreply.github.com> Date: Mon, 16 Dec 2024 12:06:36 +0400 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=9E=D0=9E=D0=9E=D0=9E=D0=9E=D0=9E?= =?UTF-8?q?=D0=9E=D0=9E=D0=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectTourismCompany/Entities/Check.cs | 21 ++ .../ProjectTourismCompany/Entities/Client.cs | 28 ++ .../ProjectTourismCompany/Entities/Company.cs | 24 ++ .../Entities/CompanyTrip.cs | 26 ++ .../ProjectTourismCompany/Entities/Country.cs | 21 ++ .../Entities/Enums/CleintStatus.cs | 16 ++ .../Entities/Enums/TravelType.cs | 18 ++ .../ProjectTourismCompany/Entities/Trip.cs | 38 +++ .../ProjectTourismCompany/Form1.Designer.cs | 39 --- .../ProjectTourismCompany/Form1.cs | 10 - .../FormTourismCompany.Designer.cs | 137 +++++++++ .../FormTourismCompany.cs | 87 ++++++ .../FormTourismCompany.resx | 123 ++++++++ .../Forms/FormCheck.Designer.cs | 195 +++++++++++++ .../ProjectTourismCompany/Forms/FormCheck.cs | 88 ++++++ .../{Form1.resx => Forms/FormCheck.resx} | 50 ++-- .../Forms/FormChecks.Designer.cs | 111 ++++++++ .../ProjectTourismCompany/Forms/FormChecks.cs | 100 +++++++ .../Forms/FormChecks.resx | 120 ++++++++ .../Forms/FormClient.Designer.cs | 166 +++++++++++ .../ProjectTourismCompany/Forms/FormClient.cs | 91 ++++++ .../Forms/FormClient.resx | 120 ++++++++ .../Forms/FormClients.Designer.cs | 122 ++++++++ .../Forms/FormClients.cs | 107 +++++++ .../Forms/FormClients.resx | 120 ++++++++ .../Forms/FormCompanies.Designer.cs | 126 +++++++++ .../Forms/FormCompanies.cs | 111 ++++++++ .../Forms/FormCompanies.resx | 120 ++++++++ .../Forms/FormCompany.Designer.cs | 174 ++++++++++++ .../Forms/FormCompany.cs | 103 +++++++ .../Forms/FormCompany.resx | 126 +++++++++ .../Forms/FormCountries.Designer.cs | 126 +++++++++ .../Forms/FormCountries.cs | 116 ++++++++ .../Forms/FormCountries.resx | 120 ++++++++ .../Forms/FormCountry.Designer.cs | 98 +++++++ .../Forms/FormCountry.cs | 81 ++++++ .../Forms/FormCountry.resx | 120 ++++++++ .../Forms/FormTrip.Designer.cs | 264 ++++++++++++++++++ .../ProjectTourismCompany/Forms/FormTrip.cs | 110 ++++++++ .../ProjectTourismCompany/Forms/FormTrip.resx | 120 ++++++++ .../Forms/FormTrips.Designer.cs | 98 +++++++ .../ProjectTourismCompany/Forms/FormTrips.cs | 64 +++++ .../Forms/FormTrips.resx | 120 ++++++++ .../ProjectTourismCompany/Program.cs | 41 ++- .../ProjectTourismCompany.csproj | 19 ++ ...TourismCompany.Entities.Country.datasource | 10 + .../Properties/Resources.Designer.cs | 103 +++++++ .../Properties/Resources.resx | 133 +++++++++ .../Repositories/ICheckRepository.cs | 18 ++ .../Repositories/IClientRepository.cs | 17 ++ .../Repositories/ICompanyRepository.cs | 18 ++ .../Repositories/ICountryRepository.cs | 17 ++ .../Repositories/ITripRepository.cs | 21 ++ .../Implementations/CheckRepository.cs | 34 +++ .../Implementations/ClientRepository.cs | 36 +++ .../Implementations/CompanyRepository.cs | 36 +++ .../Implementations/CountryRepository.cs | 36 +++ .../Implementations/TripRepository.cs | 26 ++ .../ProjectTourismCompany/Resources/minus.png | Bin 0 -> 2428 bytes .../Resources/pencil.jpg | Bin 0 -> 12382 bytes .../ProjectTourismCompany/Resources/plus.jpg | Bin 0 -> 6843 bytes .../Resources/Карта мира.jpg | Bin 0 -> 21842 bytes 62 files changed, 4652 insertions(+), 88 deletions(-) create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Entities/Check.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Entities/Client.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Entities/Company.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Entities/CompanyTrip.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Entities/Country.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Entities/Enums/CleintStatus.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Entities/Enums/TravelType.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Entities/Trip.cs delete mode 100644 ProjectTourismCompany/ProjectTourismCompany/Form1.Designer.cs delete mode 100644 ProjectTourismCompany/ProjectTourismCompany/Form1.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.cs rename ProjectTourismCompany/ProjectTourismCompany/{Form1.resx => Forms/FormCheck.resx} (93%) create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Properties/DataSources/ProjectTourismCompany.Entities.Country.datasource create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Properties/Resources.Designer.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Properties/Resources.resx create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/ICheckRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/IClientRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/ICompanyRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/ICountryRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/ITripRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CheckRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/ClientRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CompanyRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CountryRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/TripRepository.cs create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Resources/minus.png create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Resources/pencil.jpg create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Resources/plus.jpg create mode 100644 ProjectTourismCompany/ProjectTourismCompany/Resources/Карта мира.jpg diff --git a/ProjectTourismCompany/ProjectTourismCompany/Entities/Check.cs b/ProjectTourismCompany/ProjectTourismCompany/Entities/Check.cs new file mode 100644 index 0000000..942eab8 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Entities/Check.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Entities; + +public class Check +{ + public int Id { get; private set; } + public string Title { get; private set; } = string.Empty; + public DateTime PurchaseDate { get; private set; } + public int Price { get; private set; } + public int TripId { get; private set; } + public int ClientId { get; private set; } + public static Check CreateCheck(int id, string title, DateTime purchaseDate, int price, int tripId, int clientId) + { + return new Check() { Id = id, Title = title, PurchaseDate = purchaseDate, Price = price, TripId = tripId, ClientId = clientId }; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Entities/Client.cs b/ProjectTourismCompany/ProjectTourismCompany/Entities/Client.cs new file mode 100644 index 0000000..83a87e6 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Entities/Client.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Entities.Enums; + +public class Client +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public DateTime BirthDate { get; private set; } + public ClientStatus Status { get; private set; } + public string Phone { get; private set; }= string.Empty; + public static Client CreateClient(int id, string name, DateTime birth, ClientStatus status, string phone) + { + return new Client() + { + Id = id, + Name = name, + BirthDate = birth, + Status = status, + Phone = phone + }; + + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Entities/Company.cs b/ProjectTourismCompany/ProjectTourismCompany/Entities/Company.cs new file mode 100644 index 0000000..36853b0 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Entities/Company.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Entities; + +public class Company +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public int CountryId { get; private set; } + public IEnumerable CompanyTrip + { + get; + private set; + } = []; + + public static Company CreateCompany(int id, string name, int countryId, IEnumerable companyTrip) + { + return new Company() { Id = id, Name = name, CountryId = countryId, CompanyTrip = companyTrip }; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Entities/CompanyTrip.cs b/ProjectTourismCompany/ProjectTourismCompany/Entities/CompanyTrip.cs new file mode 100644 index 0000000..ac8d1dc --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Entities/CompanyTrip.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Entities; + +public class CompanyTrip +{ + public int Id { get; private set; } + public int CompanyId { get; private set; } + public int TripId { get; private set; } + public int AdditionalPrice { get; private set; } + public static CompanyTrip CreateCompanyTrip(int id, int companyId, int tripId, int additionalPrice) + { + return new CompanyTrip() + { + Id = id, + CompanyId = companyId, + TripId = tripId, + AdditionalPrice = additionalPrice + }; + } + +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Entities/Country.cs b/ProjectTourismCompany/ProjectTourismCompany/Entities/Country.cs new file mode 100644 index 0000000..a15c011 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Entities/Country.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Entities; + +public class Country +{ + public int Id { get; private set; } + public string CountryName { get; private set; }=string.Empty; + public static Country CreateCountry(int id, string countryName) + { + return new Country + { + Id = id, + CountryName = countryName, + }; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Entities/Enums/CleintStatus.cs b/ProjectTourismCompany/ProjectTourismCompany/Entities/Enums/CleintStatus.cs new file mode 100644 index 0000000..397a129 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Entities/Enums/CleintStatus.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Entities.Enums; + +public enum ClientStatus +{ + None = 0, + Student = 1, + Veteran = 3, + Invalid = 4, + Parent = 5, +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Entities/Enums/TravelType.cs b/ProjectTourismCompany/ProjectTourismCompany/Entities/Enums/TravelType.cs new file mode 100644 index 0000000..117b222 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Entities/Enums/TravelType.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Entities.Enums; + +[Flags] +public enum TravelType +{ + None = 0, + Hiking = 1, + Bus = 2, + Sights = 4, + Water = 8, + Event = 16 +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Entities/Trip.cs b/ProjectTourismCompany/ProjectTourismCompany/Entities/Trip.cs new file mode 100644 index 0000000..1442654 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Entities/Trip.cs @@ -0,0 +1,38 @@ +using ProjectTourismCompany.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Entities; + +public class Trip +{ + public int Id { get; private set; } + public string Title { get; private set; } = string.Empty; + public int Price { get; private set; } + public int HumanCapacity { get; private set; } + public DateTime StartDate { get; private set; } + public DateTime EndDate { get; private set;} + public string StartCity { get; private set; }=string.Empty; + public string EndCity { get; private set;} =string.Empty; + public int CompanyId { get; private set; } + public TravelType TravelType { get; private set; } + + public static Trip CreateOpeartion(int id, string title, int price, int humanCapacity, DateTime startDate, DateTime endDate, string startCity, string endCity, TravelType travelType) + { + return new Trip + { + Title = title, + Id = id, + Price = price, + HumanCapacity = humanCapacity, + StartDate = startDate, + EndDate = endDate, + StartCity = startCity, + EndCity = endCity, + TravelType = travelType, + }; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Form1.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Form1.Designer.cs deleted file mode 100644 index a6d4b62..0000000 --- a/ProjectTourismCompany/ProjectTourismCompany/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectTourismCompany -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Form1.cs b/ProjectTourismCompany/ProjectTourismCompany/Form1.cs deleted file mode 100644 index e354936..0000000 --- a/ProjectTourismCompany/ProjectTourismCompany/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectTourismCompany -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.Designer.cs new file mode 100644 index 0000000..1018606 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.Designer.cs @@ -0,0 +1,137 @@ +namespace ProjectTourismCompany +{ + partial class FormTourismCompany + { + /// + /// 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() + { + menuStrip1 = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + ClientsToolStripMenuItem = new ToolStripMenuItem(); + CompaniesToolStripMenuItem = new ToolStripMenuItem(); + CountriesToolStripMenuItem = new ToolStripMenuItem(); + операцииToolStripMenuItem = new ToolStripMenuItem(); + ChecksToolStripMenuItem = new ToolStripMenuItem(); + ToursToolStripMenuItem = new ToolStripMenuItem(); + отчетыToolStripMenuItem = new ToolStripMenuItem(); + menuStrip1.SuspendLayout(); + SuspendLayout(); + // + // menuStrip1 + // + menuStrip1.ImageScalingSize = new Size(20, 20); + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчетыToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Size = new Size(800, 28); + menuStrip1.TabIndex = 0; + menuStrip1.Text = "menuStrip1"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ClientsToolStripMenuItem, CompaniesToolStripMenuItem, CountriesToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // ClientsToolStripMenuItem + // + ClientsToolStripMenuItem.Name = "ClientsToolStripMenuItem"; + ClientsToolStripMenuItem.Size = new Size(165, 26); + ClientsToolStripMenuItem.Text = "Клиенты"; + ClientsToolStripMenuItem.Click += ClientsToolStripMenuItem_Click; + // + // CompaniesToolStripMenuItem + // + CompaniesToolStripMenuItem.Name = "CompaniesToolStripMenuItem"; + CompaniesToolStripMenuItem.Size = new Size(165, 26); + CompaniesToolStripMenuItem.Text = "Компании"; + CompaniesToolStripMenuItem.Click += CompaniesToolStripMenuItem_Click; + // + // CountriesToolStripMenuItem + // + CountriesToolStripMenuItem.Name = "CountriesToolStripMenuItem"; + CountriesToolStripMenuItem.Size = new Size(165, 26); + CountriesToolStripMenuItem.Text = "Страны"; + CountriesToolStripMenuItem.Click += CountriesToolStripMenuItem_Click; + // + // операцииToolStripMenuItem + // + операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ChecksToolStripMenuItem, ToursToolStripMenuItem }); + операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; + операцииToolStripMenuItem.Size = new Size(95, 24); + операцииToolStripMenuItem.Text = "Операции"; + // + // ChecksToolStripMenuItem + // + ChecksToolStripMenuItem.Name = "ChecksToolStripMenuItem"; + ChecksToolStripMenuItem.Size = new Size(302, 26); + ChecksToolStripMenuItem.Text = "Заключение договоров (чеки)"; + ChecksToolStripMenuItem.Click += ChecksToolStripMenuItem_Click; + // + // ToursToolStripMenuItem + // + ToursToolStripMenuItem.Name = "ToursToolStripMenuItem"; + ToursToolStripMenuItem.Size = new Size(302, 26); + ToursToolStripMenuItem.Text = "Проведенные туры"; + ToursToolStripMenuItem.Click += TripsToolStripMenuItem_Click; + // + // отчетыToolStripMenuItem + // + отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; + отчетыToolStripMenuItem.Size = new Size(73, 24); + отчетыToolStripMenuItem.Text = "Отчеты"; + // + // FormTourismCompany + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackgroundImage = Properties.Resources.Карта_мира; + BackgroundImageLayout = ImageLayout.Stretch; + ClientSize = new Size(800, 450); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Name = "FormTourismCompany"; + Text = "Туристическое агенство"; + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private MenuStrip menuStrip1; + private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem операцииToolStripMenuItem; + private ToolStripMenuItem отчетыToolStripMenuItem; + private ToolStripMenuItem ClientsToolStripMenuItem; + private ToolStripMenuItem CompaniesToolStripMenuItem; + private ToolStripMenuItem CountriesToolStripMenuItem; + private ToolStripMenuItem ChecksToolStripMenuItem; + private ToolStripMenuItem ToursToolStripMenuItem; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.cs b/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.cs new file mode 100644 index 0000000..57e8988 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.cs @@ -0,0 +1,87 @@ +using ProjectTourismCompany.Forms; +using System.ComponentModel; +using Unity; + +namespace ProjectTourismCompany; + +public partial class FormTourismCompany : Form +{ + private readonly IUnityContainer _container; + public FormTourismCompany(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + + private void TripsToolStripMenuItem_Click(object sender, + EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + + private void CompaniesToolStripMenuItem_Click(object sender, + EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ChecksToolStripMenuItem_Click(object sender, + EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void CountriesToolStripMenuItem_Click(object sender, + EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ClientsToolStripMenuItem_Click(object sender, + EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.resx b/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.resx new file mode 100644 index 0000000..a0623c8 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/FormTourismCompany.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/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.Designer.cs new file mode 100644 index 0000000..345125b --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.Designer.cs @@ -0,0 +1,195 @@ +namespace ProjectTourismCompany.Forms +{ + partial class FormCheck + { + /// + /// 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() + { + buttonCancel = new Button(); + buttonSave = new Button(); + dateTimePickerPurchaseDate = new DateTimePicker(); + labelStartDate = new Label(); + label1 = new Label(); + numericUpDownPrice = new NumericUpDown(); + label2 = new Label(); + textBoxTitle = new TextBox(); + label3 = new Label(); + label4 = new Label(); + comboBoxClient = new ComboBox(); + comboBoxTrip = new ComboBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit(); + SuspendLayout(); + // + // buttonCancel + // + buttonCancel.BackColor = Color.IndianRed; + buttonCancel.Location = new Point(221, 260); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(135, 51); + buttonCancel.TabIndex = 31; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = false; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.BackColor = Color.LimeGreen; + buttonSave.Location = new Point(367, 260); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(135, 51); + buttonSave.TabIndex = 30; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = false; + buttonSave.Click += buttonSave_Click; + // + // dateTimePickerPurchaseDate + // + dateTimePickerPurchaseDate.Location = new Point(282, 66); + dateTimePickerPurchaseDate.Name = "dateTimePickerPurchaseDate"; + dateTimePickerPurchaseDate.Size = new Size(220, 27); + dateTimePickerPurchaseDate.TabIndex = 25; + // + // labelStartDate + // + labelStartDate.AutoSize = true; + labelStartDate.Location = new Point(45, 71); + labelStartDate.Name = "labelStartDate"; + labelStartDate.Size = new Size(92, 20); + labelStartDate.TabIndex = 18; + labelStartDate.Text = "Дата сделки"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(64, 117); + label1.Name = "label1"; + label1.Size = new Size(45, 20); + label1.TabIndex = 34; + label1.Text = "Цена"; + // + // numericUpDownPrice + // + numericUpDownPrice.Location = new Point(284, 110); + numericUpDownPrice.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 }); + numericUpDownPrice.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownPrice.Name = "numericUpDownPrice"; + numericUpDownPrice.Size = new Size(217, 27); + numericUpDownPrice.TabIndex = 35; + numericUpDownPrice.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(45, 163); + label2.Name = "label2"; + label2.Size = new Size(101, 20); + label2.TabIndex = 36; + label2.Text = "ФИО клиента"; + // + // textBoxTitle + // + textBoxTitle.Location = new Point(282, 22); + textBoxTitle.Name = "textBoxTitle"; + textBoxTitle.Size = new Size(220, 27); + textBoxTitle.TabIndex = 38; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(45, 22); + label3.Name = "label3"; + label3.Size = new Size(135, 20); + label3.TabIndex = 37; + label3.Text = "Название путевки"; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(45, 208); + label4.Name = "label4"; + label4.Size = new Size(64, 20); + label4.TabIndex = 39; + label4.Text = "Путевка"; + // + // comboBoxClient + // + comboBoxClient.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxClient.FormattingEnabled = true; + comboBoxClient.Location = new Point(282, 163); + comboBoxClient.Name = "comboBoxClient"; + comboBoxClient.Size = new Size(217, 28); + comboBoxClient.TabIndex = 41; + // + // comboBoxTrip + // + comboBoxTrip.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxTrip.FormattingEnabled = true; + comboBoxTrip.Location = new Point(282, 208); + comboBoxTrip.Name = "comboBoxTrip"; + comboBoxTrip.Size = new Size(217, 28); + comboBoxTrip.TabIndex = 42; + // + // FormCheck + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(513, 322); + Controls.Add(comboBoxTrip); + Controls.Add(comboBoxClient); + Controls.Add(label4); + Controls.Add(textBoxTitle); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(numericUpDownPrice); + Controls.Add(label1); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(dateTimePickerPurchaseDate); + Controls.Add(labelStartDate); + Name = "FormCheck"; + StartPosition = FormStartPosition.CenterParent; + Text = "Чек"; + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonCancel; + private Button buttonSave; + private DateTimePicker dateTimePickerPurchaseDate; + private Label labelStartDate; + private Label label1; + private NumericUpDown numericUpDownPrice; + private Label label2; + private TextBox textBoxTitle; + private Label label3; + private Label label4; + private ComboBox comboBoxClient; + private ComboBox comboBoxTrip; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.cs new file mode 100644 index 0000000..29ca619 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.cs @@ -0,0 +1,88 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectTourismCompany.Entities; +using ProjectTourismCompany.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectTourismCompany.Forms; + +public partial class FormCheck : Form +{ + private readonly ICheckRepository _checkRepository; + private int _checkId; + public int Id + { + set + { + try + { + var check = _checkRepository.ReadCheckById(value); + if (check == null) + { + throw new + InvalidDataException(nameof(check)); + } + textBoxTitle.Text = check.Title; + dateTimePickerPurchaseDate.Value = check.PurchaseDate; + numericUpDownPrice.Value = check.Price; + + comboBoxClient.SelectedItem = check.ClientId; + + comboBoxTrip.SelectedItem = check.TripId; + _checkId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormCheck(ICheckRepository checkRepository, IClientRepository clientRepository) + { + InitializeComponent(); + _checkRepository = checkRepository ?? throw new ArgumentNullException(nameof(checkRepository)); + + comboBoxClient.DataSource = clientRepository.ReadClients(); + comboBoxClient.DisplayMember = "Name"; + comboBoxClient.ValueMember = "Id"; + + comboBoxTrip.DisplayMember = "Title"; + comboBoxTrip.ValueMember = "Id"; + } + private void buttonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxTitle.Text) || + comboBoxTrip.SelectedIndex < 0 || + comboBoxClient.SelectedIndex < 0) + { + throw new Exception("Имеются незаполненные поля"); + } + _checkRepository.CreateCheck(Check.CreateCheck(_checkId, textBoxTitle.Text, dateTimePickerPurchaseDate.Value, + (int)numericUpDownPrice.Value, (int)comboBoxTrip.SelectedItem!, + (int)comboBoxClient.SelectedItem!)); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => + Close(); + + +} + + diff --git a/ProjectTourismCompany/ProjectTourismCompany/Form1.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.resx similarity index 93% rename from ProjectTourismCompany/ProjectTourismCompany/Form1.resx rename to ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.resx index 1af7de1..af32865 100644 --- a/ProjectTourismCompany/ProjectTourismCompany/Form1.resx +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCheck.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.Designer.cs new file mode 100644 index 0000000..4979bab --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.Designer.cs @@ -0,0 +1,111 @@ +namespace ProjectTourismCompany.Forms +{ + partial class FormChecks + { + /// + /// 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() + { + dataGridViewChecks = new DataGridView(); + panel1 = new Panel(); + buttonDelCheck = new Button(); + buttonAddCheck = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridViewChecks).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridViewChecks + // + dataGridViewChecks.AllowUserToAddRows = false; + dataGridViewChecks.AllowUserToDeleteRows = false; + dataGridViewChecks.AllowUserToResizeColumns = false; + dataGridViewChecks.AllowUserToResizeRows = false; + dataGridViewChecks.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewChecks.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewChecks.Dock = DockStyle.Fill; + dataGridViewChecks.Location = new Point(0, 0); + dataGridViewChecks.MultiSelect = false; + dataGridViewChecks.Name = "dataGridViewChecks"; + dataGridViewChecks.ReadOnly = true; + dataGridViewChecks.RowHeadersVisible = false; + dataGridViewChecks.RowHeadersWidth = 51; + dataGridViewChecks.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewChecks.Size = new Size(800, 450); + dataGridViewChecks.TabIndex = 0; + // + // panel1 + // + panel1.Controls.Add(buttonDelCheck); + panel1.Controls.Add(buttonAddCheck); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(643, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(157, 450); + panel1.TabIndex = 1; + // + // buttonDelCheck + // + buttonDelCheck.BackgroundImage = Properties.Resources.minus; + buttonDelCheck.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelCheck.Location = new Point(17, 184); + buttonDelCheck.Name = "buttonDelCheck"; + buttonDelCheck.Size = new Size(94, 80); + buttonDelCheck.TabIndex = 5; + buttonDelCheck.UseVisualStyleBackColor = true; + buttonDelCheck.Click += buttonDel_Click; + // + // buttonAddCheck + // + buttonAddCheck.BackgroundImage = Properties.Resources.plus; + buttonAddCheck.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddCheck.Location = new Point(17, 12); + buttonAddCheck.Name = "buttonAddCheck"; + buttonAddCheck.Size = new Size(94, 80); + buttonAddCheck.TabIndex = 3; + buttonAddCheck.UseVisualStyleBackColor = true; + buttonAddCheck.Click += ButtonAdd_Click; + // + // FormChecks + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(panel1); + Controls.Add(dataGridViewChecks); + Name = "FormChecks"; + Text = "Чеки"; + ((System.ComponentModel.ISupportInitialize)dataGridViewChecks).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridViewChecks; + private Panel panel1; + private Button buttonDelCheck; + private Button buttonAddCheck; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.cs new file mode 100644 index 0000000..3464838 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.cs @@ -0,0 +1,100 @@ +using ProjectTourismCompany.Repositories; +using ProjectTourismCompany.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectTourismCompany.Forms; + +public partial class FormChecks : Form +{ + private readonly IUnityContainer _container; + private readonly ICheckRepository _checkRepository; + + public FormChecks(IUnityContainer container, ICheckRepository checkRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _checkRepository = checkRepository ?? + throw new + ArgumentNullException(nameof(checkRepository)); + } + + + private void FormChecks_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 buttonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", + MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _checkRepository.DeleteCheck(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewChecks.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewChecks.SelectedRows[0].Cells["Id"].Value); + return true; + } + + + private void LoadList() => dataGridViewChecks.DataSource = + _checkRepository.ReadChecks(); +} + diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormChecks.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/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.Designer.cs new file mode 100644 index 0000000..d929217 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.Designer.cs @@ -0,0 +1,166 @@ +namespace ProjectTourismCompany.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() + { + textBoxName = new TextBox(); + textBoxPhoneNumber = new TextBox(); + label1 = new Label(); + dateTimePickerBirthDate = new DateTimePicker(); + label2 = new Label(); + label3 = new Label(); + label4 = new Label(); + buttonSave = new Button(); + buttonCancel = new Button(); + comboBoxStatus = new ComboBox(); + SuspendLayout(); + // + // textBoxName + // + textBoxName.Location = new Point(230, 12); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(198, 27); + textBoxName.TabIndex = 0; + // + // textBoxPhoneNumber + // + textBoxPhoneNumber.Location = new Point(230, 198); + textBoxPhoneNumber.Name = "textBoxPhoneNumber"; + textBoxPhoneNumber.Size = new Size(198, 27); + textBoxPhoneNumber.TabIndex = 1; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(63, 15); + label1.Name = "label1"; + label1.Size = new Size(42, 20); + label1.TabIndex = 2; + label1.Text = "ФИО"; + // + // dateTimePickerBirthDate + // + dateTimePickerBirthDate.Location = new Point(230, 45); + dateTimePickerBirthDate.Name = "dateTimePickerBirthDate"; + dateTimePickerBirthDate.Size = new Size(198, 27); + dateTimePickerBirthDate.TabIndex = 3; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(63, 50); + label2.Name = "label2"; + label2.Size = new Size(116, 20); + label2.TabIndex = 4; + label2.Text = "Дата рождения"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(63, 121); + label3.Name = "label3"; + label3.Size = new Size(52, 20); + label3.TabIndex = 5; + label3.Text = "Статус"; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(63, 201); + label4.Name = "label4"; + label4.Size = new Size(69, 20); + label4.TabIndex = 6; + label4.Text = "Телефон"; + // + // buttonSave + // + buttonSave.BackColor = Color.LimeGreen; + buttonSave.Location = new Point(293, 281); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(135, 51); + buttonSave.TabIndex = 8; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = false; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.BackColor = Color.IndianRed; + buttonCancel.Location = new Point(147, 281); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(135, 51); + buttonCancel.TabIndex = 9; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = false; + buttonCancel.Click += ButtonCancel_Click; + // + // comboBoxStatus + // + comboBoxStatus.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStatus.FormattingEnabled = true; + comboBoxStatus.Location = new Point(230, 121); + comboBoxStatus.Name = "comboBoxStatus"; + comboBoxStatus.Size = new Size(198, 28); + comboBoxStatus.TabIndex = 10; + // + // FormClient + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(442, 344); + Controls.Add(comboBoxStatus); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(label4); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(dateTimePickerBirthDate); + Controls.Add(label1); + Controls.Add(textBoxPhoneNumber); + Controls.Add(textBoxName); + Name = "FormClient"; + StartPosition = FormStartPosition.CenterParent; + Text = "Клиент"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox textBoxName; + private TextBox textBoxPhoneNumber; + private Label label1; + private DateTimePicker dateTimePickerBirthDate; + private Label label2; + private Label label3; + private Label label4; + private Button buttonSave; + private Button buttonCancel; + private ComboBox comboBoxStatus; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.cs new file mode 100644 index 0000000..a6663d1 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.cs @@ -0,0 +1,91 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectTourismCompany.Entities.Enums; +using ProjectTourismCompany.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectTourismCompany.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; + textBoxPhoneNumber.Text = client.Phone; + comboBoxStatus.SelectedItem = client.Status; + dateTimePickerBirthDate.Value = client.BirthDate; + _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)); + comboBoxStatus.DataSource = +Enum.GetValues(typeof(ClientStatus)); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxName.Text) + || + string.IsNullOrWhiteSpace(textBoxPhoneNumber.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_clientId.HasValue) + { + _clientRepository.UpdateClient(CreateClient(_clientId.Value)); + } + else + { + _clientRepository.UpdateClient(CreateClient(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Client CreateClient(int id) + { + return Client.CreateClient(id, textBoxName.Text, dateTimePickerBirthDate.Value, (ClientStatus)comboBoxStatus.SelectedItem!, textBoxPhoneNumber.Text); + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClient.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/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.Designer.cs new file mode 100644 index 0000000..2f4f961 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.Designer.cs @@ -0,0 +1,122 @@ +namespace ProjectTourismCompany.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() + { + panel1 = new Panel(); + buttonDelClient = new Button(); + buttonUpdClient = new Button(); + buttonAddClient = new Button(); + dataGridViewClient = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewClient).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(buttonDelClient); + panel1.Controls.Add(buttonUpdClient); + panel1.Controls.Add(buttonAddClient); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(669, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(131, 450); + panel1.TabIndex = 0; + // + // buttonDelClient + // + buttonDelClient.BackgroundImage = Properties.Resources.minus; + buttonDelClient.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelClient.Location = new Point(6, 184); + buttonDelClient.Name = "buttonDelClient"; + buttonDelClient.Size = new Size(94, 80); + buttonDelClient.TabIndex = 2; + buttonDelClient.UseVisualStyleBackColor = true; + buttonDelClient.Click += buttonDel_Click; + // + // buttonUpdClient + // + buttonUpdClient.BackgroundImage = Properties.Resources.pencil; + buttonUpdClient.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdClient.Location = new Point(6, 98); + buttonUpdClient.Name = "buttonUpdClient"; + buttonUpdClient.Size = new Size(94, 80); + buttonUpdClient.TabIndex = 1; + buttonUpdClient.UseVisualStyleBackColor = true; + buttonUpdClient.Click += buttonUpd_Click; + // + // buttonAddClient + // + buttonAddClient.BackgroundImage = Properties.Resources.plus; + buttonAddClient.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddClient.Location = new Point(6, 12); + buttonAddClient.Name = "buttonAddClient"; + buttonAddClient.Size = new Size(94, 80); + buttonAddClient.TabIndex = 0; + buttonAddClient.UseVisualStyleBackColor = true; + buttonAddClient.Click += buttonAdd_Click; + // + // dataGridViewClient + // + dataGridViewClient.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewClient.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewClient.Dock = DockStyle.Fill; + dataGridViewClient.Location = new Point(0, 0); + dataGridViewClient.MultiSelect = false; + dataGridViewClient.Name = "dataGridViewClient"; + dataGridViewClient.ReadOnly = true; + dataGridViewClient.RowHeadersVisible = false; + dataGridViewClient.RowHeadersWidth = 51; + dataGridViewClient.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewClient.Size = new Size(669, 450); + dataGridViewClient.TabIndex = 1; + // + // FormClients + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewClient); + Controls.Add(panel1); + Name = "FormClients"; + StartPosition = FormStartPosition.CenterParent; + Text = "Клиенты"; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewClient).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button buttonDelClient; + private Button buttonUpdClient; + private Button buttonAddClient; + private DataGridView dataGridViewClient; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.cs new file mode 100644 index 0000000..47c4663 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.cs @@ -0,0 +1,107 @@ +using ProjectTourismCompany.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectTourismCompany.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.DeleteClient(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridViewClient.DataSource = + _clientRepository.ReadClients(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewClient.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewClient.SelectedRows[0].Cells["Id"].Value); + return true; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormClients.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/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.Designer.cs new file mode 100644 index 0000000..903e133 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.Designer.cs @@ -0,0 +1,126 @@ +namespace ProjectTourismCompany.Forms +{ + partial class FormCompanies + { + /// + /// 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() + { + dataGridViewCompanies = new DataGridView(); + panel1 = new Panel(); + buttonDelCompany = new Button(); + buttonUpdCompany = new Button(); + buttonAddCompany = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridViewCompanies).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridViewCompanies + // + dataGridViewCompanies.AllowUserToAddRows = false; + dataGridViewCompanies.AllowUserToDeleteRows = false; + dataGridViewCompanies.AllowUserToResizeColumns = false; + dataGridViewCompanies.AllowUserToResizeRows = false; + dataGridViewCompanies.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewCompanies.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewCompanies.Dock = DockStyle.Fill; + dataGridViewCompanies.Location = new Point(0, 0); + dataGridViewCompanies.MultiSelect = false; + dataGridViewCompanies.Name = "dataGridViewCompanies"; + dataGridViewCompanies.ReadOnly = true; + dataGridViewCompanies.RowHeadersVisible = false; + dataGridViewCompanies.RowHeadersWidth = 51; + dataGridViewCompanies.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewCompanies.Size = new Size(800, 450); + dataGridViewCompanies.TabIndex = 0; + // + // panel1 + // + panel1.Controls.Add(buttonDelCompany); + panel1.Controls.Add(buttonUpdCompany); + panel1.Controls.Add(buttonAddCompany); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(665, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(135, 450); + panel1.TabIndex = 1; + // + // buttonDelCompany + // + buttonDelCompany.BackgroundImage = Properties.Resources.minus; + buttonDelCompany.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelCompany.Location = new Point(29, 183); + buttonDelCompany.Name = "buttonDelCompany"; + buttonDelCompany.Size = new Size(94, 80); + buttonDelCompany.TabIndex = 5; + buttonDelCompany.UseVisualStyleBackColor = true; + buttonDelCompany.Click += buttonDel_Click; + // + // buttonUpdCompany + // + buttonUpdCompany.BackgroundImage = Properties.Resources.pencil; + buttonUpdCompany.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdCompany.Location = new Point(29, 97); + buttonUpdCompany.Name = "buttonUpdCompany"; + buttonUpdCompany.Size = new Size(94, 80); + buttonUpdCompany.TabIndex = 4; + buttonUpdCompany.UseVisualStyleBackColor = true; + buttonUpdCompany.Click += buttonUpd_Click; + // + // buttonAddCompany + // + buttonAddCompany.BackgroundImage = Properties.Resources.plus; + buttonAddCompany.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddCompany.Location = new Point(29, 11); + buttonAddCompany.Name = "buttonAddCompany"; + buttonAddCompany.Size = new Size(94, 80); + buttonAddCompany.TabIndex = 3; + buttonAddCompany.UseVisualStyleBackColor = true; + buttonAddCompany.Click += buttonAdd_Click; + // + // FormCompanies + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(panel1); + Controls.Add(dataGridViewCompanies); + Name = "FormCompanies"; + StartPosition = FormStartPosition.CenterParent; + Text = "Компании"; + ((System.ComponentModel.ISupportInitialize)dataGridViewCompanies).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridViewCompanies; + private Panel panel1; + private Button buttonDelCompany; + private Button buttonUpdCompany; + private Button buttonAddCompany; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.cs new file mode 100644 index 0000000..2e75024 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.cs @@ -0,0 +1,111 @@ +using ProjectTourismCompany.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectTourismCompany.Forms; + +public partial class FormCompanies : Form +{ + private readonly IUnityContainer _container; + private readonly ICompanyRepository _companyRepository; + + + public FormCompanies(IUnityContainer container, ICompanyRepository + companyRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _companyRepository = companyRepository ?? throw new ArgumentNullException(nameof(companyRepository)); + } + + private void FormCompanies_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 + { + _companyRepository.DeleteCompany(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridViewCompanies.DataSource = + _companyRepository.ReadCompanies(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewCompanies.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewCompanies.SelectedRows[0].Cells["Id"].Value); + return true; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompanies.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/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.Designer.cs new file mode 100644 index 0000000..a44dd5a --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.Designer.cs @@ -0,0 +1,174 @@ +namespace ProjectTourismCompany.Forms +{ + partial class FormCompany + { + /// + /// 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() + { + label1 = new Label(); + textBoxName = new TextBox(); + buttonCancel = new Button(); + buttonSave = new Button(); + groupBox1 = new GroupBox(); + dataGridView1 = new DataGridView(); + ColumnTitle = new DataGridViewComboBoxColumn(); + ColumnAdditionalPrice = new DataGridViewButtonColumn(); + comboBoxCountry = new ComboBox(); + label2 = new Label(); + groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 9); + label1.Name = "label1"; + label1.Size = new Size(77, 20); + label1.TabIndex = 0; + label1.Text = "Название"; + // + // textBoxName + // + textBoxName.Location = new Point(107, 6); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(150, 27); + textBoxName.TabIndex = 3; + // + // buttonCancel + // + buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonCancel.BackColor = Color.IndianRed; + buttonCancel.Location = new Point(305, 318); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(135, 51); + buttonCancel.TabIndex = 17; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = false; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonSave.BackColor = Color.LimeGreen; + buttonSave.Location = new Point(446, 318); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(135, 51); + buttonSave.TabIndex = 16; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = false; + buttonSave.Click += ButtonSave_Click; + // + // groupBox1 + // + groupBox1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + groupBox1.Controls.Add(dataGridView1); + groupBox1.Location = new Point(283, 6); + groupBox1.Name = "groupBox1"; + groupBox1.Size = new Size(298, 306); + groupBox1.TabIndex = 19; + groupBox1.TabStop = false; + groupBox1.Text = "groupBox1"; + // + // dataGridView1 + // + dataGridView1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView1.Columns.AddRange(new DataGridViewColumn[] { ColumnTitle, ColumnAdditionalPrice }); + dataGridView1.Location = new Point(3, 23); + dataGridView1.MultiSelect = false; + dataGridView1.Name = "dataGridView1"; + dataGridView1.RowHeadersVisible = false; + dataGridView1.RowHeadersWidth = 51; + dataGridView1.Size = new Size(292, 280); + dataGridView1.TabIndex = 0; + // + // ColumnTitle + // + ColumnTitle.HeaderText = "Название путевки"; + ColumnTitle.MinimumWidth = 6; + ColumnTitle.Name = "ColumnTitle"; + // + // ColumnAdditionalPrice + // + ColumnAdditionalPrice.HeaderText = "Надбавка фирмы"; + ColumnAdditionalPrice.MinimumWidth = 6; + ColumnAdditionalPrice.Name = "ColumnAdditionalPrice"; + ColumnAdditionalPrice.Resizable = DataGridViewTriState.True; + // + // comboBoxCountry + // + comboBoxCountry.FormattingEnabled = true; + comboBoxCountry.Location = new Point(107, 67); + comboBoxCountry.Name = "comboBoxCountry"; + comboBoxCountry.Size = new Size(150, 28); + comboBoxCountry.TabIndex = 20; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(12, 67); + label2.Name = "label2"; + label2.Size = new Size(58, 20); + label2.TabIndex = 21; + label2.Text = "Страна"; + // + // FormCompany + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(593, 381); + Controls.Add(label2); + Controls.Add(comboBoxCountry); + Controls.Add(groupBox1); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxName); + Controls.Add(label1); + Name = "FormCompany"; + StartPosition = FormStartPosition.CenterParent; + Text = "Компания"; + groupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private TextBox textBoxName; + private Button buttonCancel; + private Button buttonSave; + private GroupBox groupBox1; + private DataGridView dataGridView1; + private DataGridViewComboBoxColumn ColumnTitle; + private DataGridViewButtonColumn ColumnAdditionalPrice; + private ComboBox comboBoxCountry; + private Label label2; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.cs new file mode 100644 index 0000000..d756f51 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.cs @@ -0,0 +1,103 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectTourismCompany.Entities; +using ProjectTourismCompany.Entities.Enums; +using ProjectTourismCompany.Repositories; +using ProjectTourismCompany.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectTourismCompany.Forms; + +public partial class FormCompany : Form +{ + private readonly ICompanyRepository _companyRepository; + private int? _companyId; + public int Id + { + set + { + try + { + var client = _companyRepository.ReadCompanyById(value); + if (client == null) + { + throw new InvalidDataException(nameof(client)); + } + + textBoxName.Text = client.Name; + comboBoxCountry.SelectedItem = client.CountryId; + _companyId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + + + + public FormCompany( + ICompanyRepository companyRepository, + ITripRepository tripRepository, + ICountryRepository countryRepository) + { + InitializeComponent(); + _companyRepository = companyRepository ?? + throw new ArgumentNullException(nameof(companyRepository)); + comboBoxCountry.DataSource = countryRepository.ReadCountries(); + comboBoxCountry.DisplayMember = "Name"; + comboBoxCountry.ValueMember = "Id"; + + ColumnTitle.DataSource = tripRepository.ReadTrips(); + ColumnTitle.DisplayMember = "Title"; + ColumnTitle.ValueMember = "Id"; + } + + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (dataGridView1.RowCount < 1 || + comboBoxCountry.SelectedIndex < 0) + { + throw new Exception("Имеются незаполненные поля"); + } + _companyRepository.CreateCompany(Company.CreateCompany(0, textBoxName.Text, (int)comboBoxCountry.SelectedItem!, CreateListCompanyTripFromDataGrid())); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonCancel_Click(object sender, EventArgs e) => + Close(); + private List CreateListCompanyTripFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridView1.Rows) + { + if (row.Cells["ColumnAdditionalPrice"].Value == null || + row.Cells["ColumnTitle"].Value == null) + { + continue; + } + list.Add(CompanyTrip.CreateCompanyTrip(0, 0, + Convert.ToInt32(row.Cells["ColumnTitle"].Value), + Convert.ToInt32(row.Cells["ColumnAdditionalPrice"].Value))); + } + return list; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.resx new file mode 100644 index 0000000..25abefb --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCompany.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.Designer.cs new file mode 100644 index 0000000..8d9df93 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.Designer.cs @@ -0,0 +1,126 @@ +namespace ProjectTourismCompany.Forms +{ + partial class FormCountries + { + /// + /// 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() + { + dataGridView1 = new DataGridView(); + panel1 = new Panel(); + buttonDelCountry = new Button(); + buttonUpdCountry = new Button(); + buttonAddCountry = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridView1 + // + dataGridView1.AllowUserToAddRows = false; + dataGridView1.AllowUserToDeleteRows = false; + dataGridView1.AllowUserToResizeColumns = false; + dataGridView1.AllowUserToResizeRows = false; + dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView1.ColumnHeadersVisible = false; + dataGridView1.Dock = DockStyle.Fill; + dataGridView1.Location = new Point(0, 0); + dataGridView1.MultiSelect = false; + dataGridView1.Name = "dataGridView1"; + dataGridView1.ReadOnly = true; + dataGridView1.RowHeadersWidth = 51; + dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView1.Size = new Size(800, 450); + dataGridView1.TabIndex = 0; + // + // panel1 + // + panel1.Controls.Add(buttonDelCountry); + panel1.Controls.Add(buttonUpdCountry); + panel1.Controls.Add(buttonAddCountry); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(642, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(158, 450); + panel1.TabIndex = 1; + // + // buttonDelCountry + // + buttonDelCountry.BackgroundImage = Properties.Resources.minus; + buttonDelCountry.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelCountry.Location = new Point(38, 198); + buttonDelCountry.Name = "buttonDelCountry"; + buttonDelCountry.Size = new Size(94, 80); + buttonDelCountry.TabIndex = 7; + buttonDelCountry.UseVisualStyleBackColor = true; + buttonDelCountry.Click += buttonDel_Click; + // + // buttonUpdCountry + // + buttonUpdCountry.BackgroundImage = Properties.Resources.pencil; + buttonUpdCountry.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdCountry.Location = new Point(38, 112); + buttonUpdCountry.Name = "buttonUpdCountry"; + buttonUpdCountry.Size = new Size(94, 80); + buttonUpdCountry.TabIndex = 6; + buttonUpdCountry.UseVisualStyleBackColor = true; + buttonUpdCountry.Click += buttonUpd_Click; + // + // buttonAddCountry + // + buttonAddCountry.BackgroundImage = Properties.Resources.plus; + buttonAddCountry.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddCountry.Location = new Point(38, 26); + buttonAddCountry.Name = "buttonAddCountry"; + buttonAddCountry.Size = new Size(94, 80); + buttonAddCountry.TabIndex = 4; + buttonAddCountry.UseVisualStyleBackColor = true; + buttonAddCountry.Click += buttonAdd_Click; + // + // FormCountries + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(panel1); + Controls.Add(dataGridView1); + Name = "FormCountries"; + StartPosition = FormStartPosition.CenterParent; + Text = "Страны"; + ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView1; + private Panel panel1; + private Button buttonAddCountry; + private Button buttonDelCountry; + private Button buttonUpdCountry; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.cs new file mode 100644 index 0000000..3e6380d --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.cs @@ -0,0 +1,116 @@ +using ProjectTourismCompany.Repositories; +using ProjectTourismCompany.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectTourismCompany.Forms; + +public partial class FormCountries : Form +{ + private readonly IUnityContainer _container; + private readonly ICountryRepository _countryRepository; + + + public FormCountries(IUnityContainer container, ICountryRepository countryRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _countryRepository = countryRepository ?? throw new ArgumentNullException(nameof(countryRepository)); + } + + private void FormCompanies_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 + { + _countryRepository.DeleteCountry(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridView1.DataSource = + _countryRepository.ReadCountries(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView1.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value); + return true; + } + +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountries.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/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.Designer.cs new file mode 100644 index 0000000..fc82c19 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.Designer.cs @@ -0,0 +1,98 @@ +namespace ProjectTourismCompany.Forms +{ + partial class FormCountry + { + /// + /// 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() + { + buttonCancel = new Button(); + buttonSave = new Button(); + textBoxName = new TextBox(); + label1 = new Label(); + SuspendLayout(); + // + // buttonCancel + // + buttonCancel.BackColor = Color.IndianRed; + buttonCancel.Location = new Point(33, 76); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(135, 51); + buttonCancel.TabIndex = 17; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = false; + buttonCancel.Click += buttonCancel_Click; + // + // buttonSave + // + buttonSave.BackColor = Color.LimeGreen; + buttonSave.Location = new Point(174, 76); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(135, 51); + buttonSave.TabIndex = 16; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = false; + buttonSave.Click += buttonSave_Click; + // + // textBoxName + // + textBoxName.Location = new Point(107, 6); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(150, 27); + textBoxName.TabIndex = 21; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 9); + label1.Name = "label1"; + label1.Size = new Size(77, 20); + label1.TabIndex = 18; + label1.Text = "Название"; + // + // FormCountry + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(321, 139); + Controls.Add(textBoxName); + Controls.Add(label1); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Name = "FormCountry"; + StartPosition = FormStartPosition.CenterParent; + Text = "Страна"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonCancel; + private Button buttonSave; + private TextBox textBoxName; + private Label label1; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.cs new file mode 100644 index 0000000..33731b3 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.cs @@ -0,0 +1,81 @@ +using ProjectTourismCompany.Entities; +using ProjectTourismCompany.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectTourismCompany.Forms; + +public partial class FormCountry : Form +{ + + private readonly ICountryRepository _countryRepository; + private int? _countryId; + public int Id + { + set + { + try + { + var country = _countryRepository.ReadCountryById(value); + if (country == null) + { + throw new InvalidDataException(nameof(country)); + } + + textBoxName.Text = country.CountryName; + _countryId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + + public FormCountry(ICountryRepository countryRepository) + { + InitializeComponent(); + _countryRepository = countryRepository ?? throw new ArgumentNullException(nameof(countryRepository)); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxName.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_countryId.HasValue) + { + _countryRepository.UpdateCountry(CreateCountry(_countryId.Value)); + } + else + { + _countryRepository.UpdateCountry(CreateCountry(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) => Close(); + + private Country CreateCountry(int id) + { + return Country.CreateCountry(id, textBoxName.Text); + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormCountry.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/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.Designer.cs new file mode 100644 index 0000000..d2e3da6 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.Designer.cs @@ -0,0 +1,264 @@ +namespace ProjectTourismCompany.Forms +{ + partial class FormTrip + { + /// + /// 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() + { + labelPrice = new Label(); + labelHumanCapacity = new Label(); + labelStartDate = new Label(); + labelEndDate = new Label(); + labelStartCity = new Label(); + labelEndCity = new Label(); + labelTravelType = new Label(); + numericUpDownPrice = new NumericUpDown(); + numericUpDownHumanCapacity = new NumericUpDown(); + dateTimePickerStartDate = new DateTimePicker(); + dateTimePickerEndDate = new DateTimePicker(); + textBoxStartCity = new TextBox(); + textBoxEndCity = new TextBox(); + checkedListBoxTravelType = new CheckedListBox(); + buttonCancel = new Button(); + buttonSave = new Button(); + label1 = new Label(); + textBoxTitle = new TextBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownHumanCapacity).BeginInit(); + SuspendLayout(); + // + // labelPrice + // + labelPrice.AutoSize = true; + labelPrice.Location = new Point(36, 71); + labelPrice.Name = "labelPrice"; + labelPrice.Size = new Size(45, 20); + labelPrice.TabIndex = 0; + labelPrice.Text = "Цена"; + // + // labelHumanCapacity + // + labelHumanCapacity.AutoSize = true; + labelHumanCapacity.Location = new Point(36, 116); + labelHumanCapacity.Name = "labelHumanCapacity"; + labelHumanCapacity.Size = new Size(142, 20); + labelHumanCapacity.TabIndex = 1; + labelHumanCapacity.Text = "Человек максимум"; + // + // labelStartDate + // + labelStartDate.AutoSize = true; + labelStartDate.Location = new Point(36, 172); + labelStartDate.Name = "labelStartDate"; + labelStartDate.Size = new Size(94, 20); + labelStartDate.TabIndex = 2; + labelStartDate.Text = "Дата начала"; + // + // labelEndDate + // + labelEndDate.AutoSize = true; + labelEndDate.Location = new Point(36, 227); + labelEndDate.Name = "labelEndDate"; + labelEndDate.Size = new Size(87, 20); + labelEndDate.TabIndex = 3; + labelEndDate.Text = "Дата конца"; + // + // labelStartCity + // + labelStartCity.AutoSize = true; + labelStartCity.Location = new Point(36, 285); + labelStartCity.Name = "labelStartCity"; + labelStartCity.Size = new Size(129, 20); + labelStartCity.TabIndex = 4; + labelStartCity.Text = "Стартовый город"; + // + // labelEndCity + // + labelEndCity.AutoSize = true; + labelEndCity.Location = new Point(36, 339); + labelEndCity.Name = "labelEndCity"; + labelEndCity.Size = new Size(126, 20); + labelEndCity.TabIndex = 5; + labelEndCity.Text = "Конечный город"; + // + // labelTravelType + // + labelTravelType.AutoSize = true; + labelTravelType.Location = new Point(35, 427); + labelTravelType.Name = "labelTravelType"; + labelTravelType.Size = new Size(127, 20); + labelTravelType.TabIndex = 6; + labelTravelType.Text = "Тип путешествия"; + // + // numericUpDownPrice + // + numericUpDownPrice.Location = new Point(273, 69); + numericUpDownPrice.Maximum = new decimal(new int[] { 1000000, 0, 0, 0 }); + numericUpDownPrice.Minimum = new decimal(new int[] { 10000, 0, 0, 0 }); + numericUpDownPrice.Name = "numericUpDownPrice"; + numericUpDownPrice.Size = new Size(220, 27); + numericUpDownPrice.TabIndex = 7; + numericUpDownPrice.Value = new decimal(new int[] { 10000, 0, 0, 0 }); + // + // numericUpDownHumanCapacity + // + numericUpDownHumanCapacity.Location = new Point(273, 114); + numericUpDownHumanCapacity.Minimum = new decimal(new int[] { 5, 0, 0, 0 }); + numericUpDownHumanCapacity.Name = "numericUpDownHumanCapacity"; + numericUpDownHumanCapacity.Size = new Size(220, 27); + numericUpDownHumanCapacity.TabIndex = 8; + numericUpDownHumanCapacity.Value = new decimal(new int[] { 5, 0, 0, 0 }); + // + // dateTimePickerStartDate + // + dateTimePickerStartDate.Location = new Point(273, 167); + dateTimePickerStartDate.Name = "dateTimePickerStartDate"; + dateTimePickerStartDate.Size = new Size(220, 27); + dateTimePickerStartDate.TabIndex = 9; + // + // dateTimePickerEndDate + // + dateTimePickerEndDate.Location = new Point(273, 222); + dateTimePickerEndDate.Name = "dateTimePickerEndDate"; + dateTimePickerEndDate.Size = new Size(220, 27); + dateTimePickerEndDate.TabIndex = 10; + // + // textBoxStartCity + // + textBoxStartCity.Location = new Point(273, 285); + textBoxStartCity.Name = "textBoxStartCity"; + textBoxStartCity.Size = new Size(220, 27); + textBoxStartCity.TabIndex = 11; + // + // textBoxEndCity + // + textBoxEndCity.Location = new Point(273, 339); + textBoxEndCity.Name = "textBoxEndCity"; + textBoxEndCity.Size = new Size(220, 27); + textBoxEndCity.TabIndex = 12; + // + // checkedListBoxTravelType + // + checkedListBoxTravelType.FormattingEnabled = true; + checkedListBoxTravelType.Location = new Point(273, 383); + checkedListBoxTravelType.Name = "checkedListBoxTravelType"; + checkedListBoxTravelType.Size = new Size(220, 114); + checkedListBoxTravelType.TabIndex = 13; + // + // buttonCancel + // + buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCancel.BackColor = Color.IndianRed; + buttonCancel.Location = new Point(214, 512); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(135, 51); + buttonCancel.TabIndex = 15; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = false; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonSave.BackColor = Color.LimeGreen; + buttonSave.Location = new Point(361, 512); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(135, 51); + buttonSave.TabIndex = 14; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = false; + buttonSave.Click += ButtonSave_Click; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(36, 12); + label1.Name = "label1"; + label1.Size = new Size(111, 20); + label1.TabIndex = 16; + label1.Text = "Название тура"; + // + // textBoxTitle + // + textBoxTitle.Location = new Point(273, 12); + textBoxTitle.Name = "textBoxTitle"; + textBoxTitle.Size = new Size(220, 27); + textBoxTitle.TabIndex = 17; + // + // FormTrip + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(508, 573); + Controls.Add(textBoxTitle); + Controls.Add(label1); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(checkedListBoxTravelType); + Controls.Add(textBoxEndCity); + Controls.Add(textBoxStartCity); + Controls.Add(dateTimePickerEndDate); + Controls.Add(dateTimePickerStartDate); + Controls.Add(numericUpDownHumanCapacity); + Controls.Add(numericUpDownPrice); + Controls.Add(labelTravelType); + Controls.Add(labelEndCity); + Controls.Add(labelStartCity); + Controls.Add(labelEndDate); + Controls.Add(labelStartDate); + Controls.Add(labelHumanCapacity); + Controls.Add(labelPrice); + Name = "FormTrip"; + StartPosition = FormStartPosition.CenterParent; + Text = "Туры"; + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownHumanCapacity).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelPrice; + private Label labelHumanCapacity; + private Label labelStartDate; + private Label labelEndDate; + private Label labelStartCity; + private Label labelEndCity; + private Label labelTravelType; + private NumericUpDown numericUpDownPrice; + private NumericUpDown numericUpDownHumanCapacity; + private DateTimePicker dateTimePickerStartDate; + private DateTimePicker dateTimePickerEndDate; + private TextBox textBoxStartCity; + private TextBox textBoxEndCity; + private CheckedListBox checkedListBoxTravelType; + private Button buttonCancel; + private Button buttonSave; + private Label label1; + private TextBox textBoxTitle; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.cs new file mode 100644 index 0000000..0735bfe --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.cs @@ -0,0 +1,110 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectTourismCompany.Entities; +using ProjectTourismCompany.Entities.Enums; +using ProjectTourismCompany.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ProjectTourismCompany.Forms; + +public partial class FormTrip : Form +{ + private readonly ITripRepository _tripRepository; + private int? _tripId; + public int Id + { + set + { + try + { + var trip = _tripRepository.ReadTripById(value); + if (trip == null) + { + throw new + InvalidDataException(nameof(trip)); + } + textBoxStartCity.Text = trip.StartCity; + textBoxEndCity.Text = trip.EndCity; + numericUpDownHumanCapacity.Value = trip.HumanCapacity; + numericUpDownPrice.Value = trip.Price; + dateTimePickerEndDate.Value = trip.EndDate; + dateTimePickerStartDate.Value = trip.StartDate; + _tripId = value; + + foreach (TravelType elem in +Enum.GetValues(typeof(TravelType))) + { + if ((elem & trip.TravelType) != 0) + { + checkedListBoxTravelType.SetItemChecked(checkedListBoxTravelType.Items.IndexOf( + elem), true); + } + } + + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormTrip(ITripRepository tripRepository) + { + InitializeComponent(); + _tripRepository = tripRepository ?? throw new ArgumentNullException(nameof(tripRepository)); + foreach (var elem in Enum.GetValues(typeof(TravelType))) + { + checkedListBoxTravelType.Items.Add(elem); + } + + } + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxStartCity.Text) || + string.IsNullOrWhiteSpace(textBoxEndCity.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + + if (_tripId.HasValue) + { + _tripRepository.CreateTrip(CreateTrip(_tripId.Value)); + } + else + { + _tripRepository.CreateTrip(CreateTrip(0)); + } + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonCancel_Click(object sender, EventArgs e) => + Close(); + + private Trip CreateTrip(int id) + { + TravelType tr = TravelType.None; + foreach (var elem in checkedListBoxTravelType.CheckedItems) + { + tr |= (TravelType)elem; + } + return Trip.CreateOpeartion(0, textBoxTitle.Text, (int)numericUpDownPrice.Value, + (int)numericUpDownHumanCapacity.Value, dateTimePickerStartDate.Value, dateTimePickerEndDate.Value, + textBoxStartCity.Text, textBoxEndCity.Text, tr); + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrip.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/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.Designer.cs new file mode 100644 index 0000000..f62873e --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.Designer.cs @@ -0,0 +1,98 @@ +namespace ProjectTourismCompany.Forms +{ + partial class FormTrips + { + /// + /// 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() + { + dataGridView1 = new DataGridView(); + panel1 = new Panel(); + buttonAddTrip = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridView1 + // + dataGridView1.AllowUserToAddRows = false; + dataGridView1.AllowUserToDeleteRows = false; + dataGridView1.AllowUserToResizeColumns = false; + dataGridView1.AllowUserToResizeRows = false; + dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView1.ColumnHeadersVisible = false; + dataGridView1.Dock = DockStyle.Fill; + dataGridView1.Location = new Point(0, 0); + dataGridView1.MultiSelect = false; + dataGridView1.Name = "dataGridView1"; + dataGridView1.ReadOnly = true; + dataGridView1.RowHeadersWidth = 51; + dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView1.Size = new Size(800, 450); + dataGridView1.TabIndex = 0; + // + // panel1 + // + panel1.Controls.Add(buttonAddTrip); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(645, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(155, 450); + panel1.TabIndex = 1; + // + // buttonAddTrip + // + buttonAddTrip.BackgroundImage = Properties.Resources.plus; + buttonAddTrip.BackgroundImageLayout = ImageLayout.Stretch; + buttonAddTrip.Location = new Point(34, 31); + buttonAddTrip.Name = "buttonAddTrip"; + buttonAddTrip.Size = new Size(94, 80); + buttonAddTrip.TabIndex = 5; + buttonAddTrip.UseVisualStyleBackColor = true; + buttonAddTrip.Click += ButtonAdd_Click; + // + // FormTrips + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(panel1); + Controls.Add(dataGridView1); + Name = "FormTrips"; + StartPosition = FormStartPosition.CenterParent; + Text = "Туры"; + ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView1; + private Panel panel1; + private Button buttonAddTrip; + } +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.cs b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.cs new file mode 100644 index 0000000..178adaa --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.cs @@ -0,0 +1,64 @@ +using ProjectTourismCompany.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace ProjectTourismCompany.Forms; + +public partial class FormTrips : Form +{ + private readonly IUnityContainer _container; + private readonly ITripRepository _tripRepository; + + public FormTrips(IUnityContainer container, ITripRepository tripRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _tripRepository = tripRepository ?? + throw new + ArgumentNullException(nameof(tripRepository)); + } + + + private void FormChecks_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() => dataGridView1.DataSource = + _tripRepository.ReadTrips(); +} + diff --git a/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.resx b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Forms/FormTrips.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/ProjectTourismCompany/ProjectTourismCompany/Program.cs b/ProjectTourismCompany/ProjectTourismCompany/Program.cs index 332a19c..aeeef48 100644 --- a/ProjectTourismCompany/ProjectTourismCompany/Program.cs +++ b/ProjectTourismCompany/ProjectTourismCompany/Program.cs @@ -1,17 +1,30 @@ -namespace ProjectTourismCompany +using Unity.Lifetime; +using Unity; +using ProjectTourismCompany.Repositories; +using ProjectTourismCompany.Repositories.Implementations; +using ProjectTourismCompany; + +internal static class Program { - internal static class Program + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // To customize application configuration such as set high DPI settings or default font, - // see https://aka.ms/applicationconfiguration. - ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); - } + + ApplicationConfiguration.Initialize(); + Application.Run(CreateContainer().Resolve()); } -} \ No newline at end of file + private static IUnityContainer CreateContainer() + { + var container = new UnityContainer(); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + + return container; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/ProjectTourismCompany.csproj b/ProjectTourismCompany/ProjectTourismCompany/ProjectTourismCompany.csproj index 663fdb8..accbdf0 100644 --- a/ProjectTourismCompany/ProjectTourismCompany/ProjectTourismCompany.csproj +++ b/ProjectTourismCompany/ProjectTourismCompany/ProjectTourismCompany.csproj @@ -8,4 +8,23 @@ enable + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Properties/DataSources/ProjectTourismCompany.Entities.Country.datasource b/ProjectTourismCompany/ProjectTourismCompany/Properties/DataSources/ProjectTourismCompany.Entities.Country.datasource new file mode 100644 index 0000000..b1aa628 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Properties/DataSources/ProjectTourismCompany.Entities.Country.datasource @@ -0,0 +1,10 @@ + + + + ProjectTourismCompany.Entities.Country, ProjectTourismCompany, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Properties/Resources.Designer.cs b/ProjectTourismCompany/ProjectTourismCompany/Properties/Resources.Designer.cs new file mode 100644 index 0000000..5c40735 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectTourismCompany.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("ProjectTourismCompany.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 minus { + get { + object obj = ResourceManager.GetObject("minus", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap pencil { + get { + object obj = ResourceManager.GetObject("pencil", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap plus { + get { + object obj = ResourceManager.GetObject("plus", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Карта_мира { + get { + object obj = ResourceManager.GetObject("Карта мира", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Properties/Resources.resx b/ProjectTourismCompany/ProjectTourismCompany/Properties/Resources.resx new file mode 100644 index 0000000..9c7b01f --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\pencil.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\plus.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Карта мира.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\minus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICheckRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICheckRepository.cs new file mode 100644 index 0000000..957364f --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICheckRepository.cs @@ -0,0 +1,18 @@ +using ProjectTourismCompany.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories; + +public interface ICheckRepository +{ + IEnumerable ReadChecks(DateTime? dateFrom = +null, DateTime? dateTo = null, +int? tripId = null, int? clientId = null); + Check ReadCheckById(int id); + void CreateCheck(Check check); + void DeleteCheck(int id); +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/IClientRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/IClientRepository.cs new file mode 100644 index 0000000..ce2b68c --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/IClientRepository.cs @@ -0,0 +1,17 @@ +using ProjectTourismCompany.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories; + +public interface IClientRepository +{ + IEnumerable ReadClients(); + Client ReadClientById(int id); + void CreateClient(Client client); + void UpdateClient(Client client); + void DeleteClient(int id); +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICompanyRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICompanyRepository.cs new file mode 100644 index 0000000..a6b1bef --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICompanyRepository.cs @@ -0,0 +1,18 @@ +using ProjectTourismCompany.Entities; +using ProjectTourismCompany.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories; + +public interface ICompanyRepository +{ + IEnumerable ReadCompanies(); + Company ReadCompanyById(int id); + void CreateCompany(Company company); + void UpdateCompany(Company company); + void DeleteCompany(int id); +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICountryRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICountryRepository.cs new file mode 100644 index 0000000..c269d32 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/ICountryRepository.cs @@ -0,0 +1,17 @@ +using ProjectTourismCompany.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories; + +public interface ICountryRepository +{ + IEnumerable ReadCountries(); + Country ReadCountryById(int id); + void CreateCountry(Country country); + void UpdateCountry(Country country); + void DeleteCountry(int id); +} \ No newline at end of file diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/ITripRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/ITripRepository.cs new file mode 100644 index 0000000..74a1e73 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/ITripRepository.cs @@ -0,0 +1,21 @@ +using ProjectTourismCompany.Entities; +using ProjectTourismCompany.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories; + +public interface ITripRepository +{ + IEnumerable ReadTrips(DateTime? dateForm = null, +DateTime? dateTo = null, int? tripId = null, +int? companyId = null, int? countryId = null); + + Trip ReadTripById(int id); + + void CreateTrip(Trip trip); +} + diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CheckRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CheckRepository.cs new file mode 100644 index 0000000..4d1dd34 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CheckRepository.cs @@ -0,0 +1,34 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectTourismCompany.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories.Implementations; + +internal class CheckRepository : ICheckRepository +{ + + + public void CreateCheck(Check check) + { + + } + + public void DeleteCheck(int id) + { + + } + + public IEnumerable ReadChecks(DateTime? dateFrom = null, DateTime? dateTo = null, int? tripId = null, int? clientId = null) + { + return []; + } + + public Check ReadCheckById(int id) + { + return Check.CreateCheck(0, "title", DateTime.Now, 500, 1, 2); + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/ClientRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/ClientRepository.cs new file mode 100644 index 0000000..086a418 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/ClientRepository.cs @@ -0,0 +1,36 @@ +using ProjectTourismCompany.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories.Implementations; + +internal class ClientRepository : IClientRepository +{ + public void CreateClient(Client client) + { + + } + + public void DeleteClient(int id) + { + + } + + public Client ReadClientById(int id) + { + return Client.CreateClient(0, string.Empty, DateTime.Now, ClientStatus.None, "1") ; + } + + public IEnumerable ReadClients() + { + return []; + } + + public void UpdateClient(Client client) + { + + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CompanyRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CompanyRepository.cs new file mode 100644 index 0000000..1c7f6c2 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CompanyRepository.cs @@ -0,0 +1,36 @@ +using ProjectTourismCompany.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories.Implementations; + +internal class CompanyRepository : ICompanyRepository +{ + public void CreateCompany(Company company) + { + + } + + public void DeleteCompany(int id) + { + + } + + public IEnumerable ReadCompanies() + { + return []; + } + + public Company ReadCompanyById(int id) + { + return Company.CreateCompany(1, "randomName", 73, []); + } + + public void UpdateCompany(Company company) + { + + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CountryRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CountryRepository.cs new file mode 100644 index 0000000..bfc7d47 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/CountryRepository.cs @@ -0,0 +1,36 @@ +using ProjectTourismCompany.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories.Implementations; + +internal class CountryRepository : ICountryRepository +{ + public void CreateCountry(Country country) + { + + } + + public void DeleteCountry(int id) + { + + } + + public IEnumerable ReadCountries() + { + return []; + } + + public Country ReadCountryById(int id) + { + return Country.CreateCountry(73, "Russia"); + } + + public void UpdateCountry(Country country) + { + + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/TripRepository.cs b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/TripRepository.cs new file mode 100644 index 0000000..6ec44e3 --- /dev/null +++ b/ProjectTourismCompany/ProjectTourismCompany/Repositories/Implementations/TripRepository.cs @@ -0,0 +1,26 @@ +using ProjectTourismCompany.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourismCompany.Repositories.Implementations; + +internal class TripRepository : ITripRepository +{ + public void CreateTrip(Trip trip) + { + + } + + public Trip ReadTripById(int id) + { + return Trip.CreateOpeartion(0, "a", 0, 0, DateTime.Now, DateTime.Now, "Moscow", "Piter", Entities.Enums.TravelType.None); + } + + public IEnumerable ReadTrips(DateTime? dateForm = null, DateTime? dateTo = null, int? tripId = null, int? companyId = null, int? countryId = null) + { + return []; + } +} diff --git a/ProjectTourismCompany/ProjectTourismCompany/Resources/minus.png b/ProjectTourismCompany/ProjectTourismCompany/Resources/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2738c3eab3dd6cac7643af1cd2545e31147247 GIT binary patch literal 2428 zcmV-?34`{DP)>`Z+l{SXfx0p`qU1-khAAQ&UrrkdW-`?DX{Xb8~YX92|#-hi7MJ*VorU2fe}4%H2}DFhD=RBVNJxx~j4a$u zPyhf3&PhZ;RCt`_o!ernIuM2nDn&p+L{L!F{r(TRYpF|H{z(Gl0O7k_t3n1QbIK%q ze5l3^lViDBN6W)L-xRe|7n^*4SVrqrc}zlA`TbQAc-1yuIBXX2w(U<17X{)qTs+gleUZp8E;LKi4kSA$mG8m9(=Q~DpH5?YZbS2X5Al*-`@;&&}nrNMG+68o++gY1@u3iOw5ovmj$DZRW z^4orKy2S?L@oW?iL5oWz{ z326@!!ciY7UV|N|om5A{0ed=12;rCl-gMN6GG?qeSVX3ZYAP(SOC|#qm38exUjZy( z#pHv`4QrmCWDQ>k)@&SL>sXFntqEi*rsAp3L-|0_`f9V zsNQ^61R~Sm+EW+%`d+cST8P}|#v3W|@=f>8A&3N>Go3>GE8QgvF^IwjJMO|}W_**d z0Z&DyvB59C&^6-D;NXijrSM|U7$;!^ej`iz2RIlSnBgfW`(?rJz1DeCLRO)2nSipzj<@>4^=TU+p*r?LHg3r+9)q#{TagL1muC zDT@&7J=qO3w*L#%o# zF#cZ|23jtxO^vn}sH@_AK@lmbie_xU$ujI%L4)}DZU{f}ZAc((#= zH=_i^*N^$OZU6JMlHV5~4c>mhh*jS)DRKe*T#pO_9KSh5fByjZ`~_@997V5lA5ed^ zi!#Tl6);|a93n(f>GZPSC%~p8C~@4H9%yfXUpS(iV~VL$0~7`%_(Cf(u5LsI1y*QQ z$V+nj*n)EBFLdL_B{y6KMrDm69p1v|f9;=Wf@dK>j2)rs2K!Nk>W{mm*|Wz6vWq3? zMqwxTA@2xswd~o^NIT6xfDVP6c@1?3&Wgd#d)h(G9{k&lbqQ+Akv^DKqTP&{gRHUD zr|}N(shVNdklGr#0h+sDT|$Qp99Y9^8;JsxgRc{ouw7NF!H`)!7`U5LFD!>~Z~yrW z-l6^T(0*HLzdy7;rm;URwLiD8KR>iT$G5*uV}Gs9{(7nXHE;XZE$m-=vVZ+>25Z3f zujAX_i(!91jr~1Q_V=~Tpf}O}{!;sUgzfM1o^~=J24{WQe_osYXYS45+(i4&zMR4N zrS_jeJA-qC?LP~82IqO(ekYD4D@`X6*k~&Y_-26ZV_jBnPE2d)z=uuG?JwuA zPg4`p%{znb9_Xn+M9;>*jLE#$en!+$_gndGk$teEX(fdnwCpeeEr5vL85S%Li$o+U*W{LOv zjRszlmD||oJE7miI*RUs2B$@l-}Z~^{kquS@-CY2j;30zODu#dC(>8qI|~|Bsob<4 zD#I=;C_z)n5ZsO4?Mj900003Su{8=`?4g=Tp!-Iee!r_BR zC~7DQ7ZQV_kYh<2sI?>lH8cWc9~2Zxp+?}SF4kBr+0Nv3&{`foh z5^*emN)0o@U_vMwIASQCq(KM`#zf=7Fj^X#7{J6VIt)h$BvDa#l0P{Fi~ew>4viuc zvFLSrPMS_(R-^#3U2Fu&Bi7lI5F1D^B%;ksc}${>qJzVNNmLvvIyfkVVib)X^n5T;QBfLEIvSx7{unJoLqm+FHbz@p9Ym;8VnV36 zX!Q_^JlzG;hc$^ph#-eCvZedP;X@;-STuUxaaceoHIxz%8n)p6ms}UrjEsL6*@saH zx?mDkp%J77JCK9G2#P`_ViqG9ri@fEXcTImcNK|Bjj<2L`I9KC>}@?4yntRc{OLL} zL&qq%KiQA^3qO&tfDem|2x71j2^dlkDVP*OrGQv1kcwH|FtFPTXfU@(3W+Xa*aQ*% zFd*T)?|B1y9yZZniRR1AGA|H-(bm*7P}kH}*EU=r1D&~({R61KF#djWA{ZFZYN5PF zRuLp386;)Y1;s238ud3-GP0mhNK|`kELuxjYvoEUO&v`=dY<#7M(ap;4=Rqzr~)&7 z3OKy8oW6ej3hD`3(glVgiKJx z1&0~a#gx#<2m%S~9~$Z(L|Tv%KsAo+AA+Tq3G4-!6Ifj%YaA8lL=GW`_%GCvMeVnS z5^#8owUfQNtGkPxy`{aUjkUVXdMg`OPY)XlcPl#^=T-L3HulceHtX%3SD{hh*+V24 z5h6%9@Ju#koFg8jaONV2Y)T|iz)(mL+J+_=`mBQ@=7IsjEH(w#Ao|Cd!SrAeME&84 zJ_|-cIC}We>O_(sE;5LUHvQ-JmA{FF!9tH^F+Yz9qil|hhOkHtMNcOT7eOI;#)Ofu zO70|PJCsa+HC*HFXiA@3c710|z(U{sgMZGE`oG?L6U;A3&|~?V+?jp&1;yB?7~NX5 zQ_(j-h78;R!JcClwoLHD!lp|K0e9Lc`j$HP4v2RBv5}#4G&BJNOM53coN+POC0=aCbXDZgnig8RhQ_9*rpq;~?X67g^s%PKbSDrVUS0uy0VyO>%2*k# zZ2S)&a}9tX7nBGk!XSbGR1g9agv>Pp%fKrdjDAgJl!EaK0z<%|9GswXDJTY&KULuM z4+@7N=AHn2FbDue!jPcktL9?BU+e$D3K$S<9YfALorw8-jD2=|x4R}HKfRPMZhl+c z|4f%H5OPp*e4zdD5i{e>>jiep9>0)IZD$8&VxJf4ya^ojya*i{_!KoBdWapG9>L>J z+Y6qXwRCk?g#jl|$7OX*j-O;_06jYx`1Z}M7XVal%@)1tthYun=B#}qND2~>pU##B z0M@G2=I@Wp0l2PPtf3I+z{k(``tE>UzrYtvcMQy^O&`v0V2u_b4mZ6H`1Cw~W_rK- zT4Gmc|DMx4CtNw6)oc@YS;;yY#8RX17%!yEIk%C)@cCd2>Enj{uqP^>IXGiT|0eh{FCC&%@nJcKd@e*Q~(SSfdwU_klK!}PoD zG?Bi_)QdT=)Uz?RqXA(&BE;S zK&JkdhnXsm-;#GfYIqWfk#83{cH(fv-f!0pTYNq|IyONG-u>~ca8#dq^hj8%(o}pL zLjIc9_!wV|d*#hh+_j?x-XFU%X-%TeS!Z|EZjFh$=VP>2moG+9dG=w;z?;@Kjp@K< zcmLa3)kiMk6kmWnO@S&8iE&lvKl}@qNrlFg{AnjYnA;)z_ znvGxRo{fY>TQjs4fnENcV7#s(RZ;Dz1U~MIsM^OLaf}#L-kA??Xo=dF`hh!)P=`3j zgq7U!mpXPSwfn4lbJ}6>9-m9`idWTHrV{vV+)emB5mhCMI~>;N2XnTc3~dO7umXfTi)?P?(BAEh;dqc?T<)(Wkmdr-iI5kwQeBlbj+H`E}%82)9^^lbf zX)C``_5M!|#KLDg6-%d@@Bv(tcE?1aMV>r~vla>9oGA-} za|VOKVc?@3^DKda&w>CPh1PUM3TgQY%US5S6%McM0?|Aoa)@gNrLG%X63rhSw^_@A5J4+FWos%2m z6864}_h{plH|Lmche9p!6L$TU9Z5+IGt$@U?tJ!9K9}_vST<-z?)D>IYEahczj4{jNl$}dD78sB-Xd3)}}*{!2P&e70V2 zF|Gamx>+U=1LPO?GF&L7uk7kTc(~-M0^o?7^3BV6^1KWu)lH3LnP_OZ^;_ICha9G> zb>f0$F)z5AgvBMT96UYOZ?*t!bRx@i%WZ6S4&G1_aXOqNx*jA8x9*7rgP1}$X_4DkAj|LEnH4kb!veTnI=8i)~bBk`<~SRCrCbInSC(rZX{ii z%&k_lT=ZjFOr?g>&^A6E9S`gB@O2%uf!~_c3LmSe&e$DszgSl|8V8Ps3OE{2I0qDh z`0>mSZb1NCP)i5}zL)@aA)K&?g_`)$#_v~x67%5KrY$>Fs~9c7Ah)s8`2S$&=pUA1vAEowKXoc zuq>^cx0BL7<|?}KLxrMd07m>aCokW+h$}yM8g7dAo@53VPYbJQicL5a@$rKHHp67rFO|D`K-l_+J@41T~oVWlaF8HC!Y*U z@w6D1pUgwoEc-qO5cP?TLSZdK!vmbK}|O~3s+y5FiQJ0 z5}jy?3onwV70+LQILx5mEr@T<`69T!?Bg8gQEpl3u)42b(e&(+?49C-vTL(wd{4%5 zIkU}3 z7h3GEw6VXV-LscxAx3ZQ!QLA6MNycJd=(z~5pu%m7fU#F*3ZY_1DNkTBbUC-F8mmT z9#wjU5A?>MJy20XDe3jr9#eW)`#4>qvlk04GY<2l1f@ztYGe3prDZrs&>KAf)IifV znU=}j=Tv-9bq8x|QU zSDcs0c7%5qh3vIWfcrt;Y7|}0ccU)p=LKh-@d6tBmoET-+t**m|8@oL{Xu&0#3}Y# z8(=G2r3ev#(b#AqvF3oTIXfi{{1yT`9l{(CgV0!OIccsCUryFKKw%6i1{knbLIG;B zFS}q-ym@j(Yz&2f>rGsNtiyqzc;6jyU(b&5dQXlgYeN7uJP0VWH_YZ_ZAfQ42t@zm zhD^r)Z$q#+J?ujL&olmEaU}mJRN#-QiZW%NBlIBqb^vB_(`<_axZ7W0*GB-NkZa3k z0KjkM*aMtXtOo!9_;R`SvC}~j^5*Px034#hRtIn^u-E-tE*?+|coH{?4XHw|y+SS< z9RQ$c+-!A!DgHMqAj^0O171MDf3t(f{6iObSC5j@qTkfJ`Mw+vA1f+8UEi_r5(YVo zx{iGfzKPj+k5@_My~1Uevddpxp|*N`Z`x9}M@>d;-l70Amc3&0j#QVXKYg}ewy@;# z*ACRu?(a{e)us~?N|qe0>ZN11?;3e;>20vWa%Tc2s}C9fZX@NesoZRWr5uq^cN9?F zu*JuJDi&F)&9^P<(0)(N!(X>=<9jKp{MimHQ_R^t-ML8os4Xnbxg_H@8(hV22EVbKL>PSbNiv5tFM@= z0SM_GQ6L%998exzcJ=e>lqR9~?L0Rit9+l)gL6oY3PAV*r8OZFKmEFO>&J}dBZU~W zEbVNS^S9F00zAeXAAUzi&y5~UX8jegD73uAe81Q=!jCO@DIR5HL}#9cFtY>K+n^hc zIl3~Vodgb};kkP5{xIVqMFw+G+fcdY10j*E{C$@D^KMJWaeOFOyii+okbIWEy=T3NG;bgEu&F<;F`kr>1SVnwD&D%58?o zQk9s}y@cPtoky#>Z`xeOw(&H6f6xw-F`4tK<(=1tx43fVoHkkEet+-lLE5LPHJAgP zC)_g>_9W@7Ug?rw0P8IGthMkNJFg72>ydHMVS+SjEe4;9l>_$6t*7Xc;&f|5XJ7N9un*O!f;so!@;5tvY9{4e?`?23RW7vz;0Qyx;lHi!B6v_7PS^ZJwFJ+m{-ybUVlF1 ze%w1~$9S_z5M|W#x1`P%%B^NIRHuF{9`3HplhkuoYW(z=kSUkZBbi5Z^C?7WZ9?l(koTLU2|x3p-l<}N{4HmkT^@KybY0x7zbVa8V4uTP=j+@X zvj)9xp2=wAjb`--V{Z?@pey4P32o1MsFCi3*a47rG$ZdR|`WRnx1HNzWfB zJ_gF-I(+AcFJhNs-EI@fB%yla@Ncg=B_@CKajvs+B>418J&Q2&^y4~lCzMot2r3xY z_OT1&V92*e-FTNLPSd$J!BDTIqFJ;ha)xh-ckrGNO~`g1cZiA@=XZB5sJ?t_j#S;lN|^TN zGWYJBe5*?pM?N=0mmJknIIfyU3ir_{@AXtpC=@}$LslJiatJq^1FF&c8#69T-`5?i zH9*D>r!IH%JfW60zJ7U?Op{SdxH3E=i~C{R?Xtk_;gZzi&6UpD+Cx#g4-2|qSWHwX zTYpXx4&_o6bGgMU5$~SCUmsYQC_jv_8%gQJYa#1^mwT-?&sFF*;kD92#&&zk$2x0k#M>$?P zy&9glr6BqlaWZ4$o={4*@f z?;~}3K**t_YVA7F{+iY9*mQ_|duzds5UJgi!k zyp@kc`X!UCByE_j0W&0iq|U&3o+U(m_}<^a=oct_0}45KpkBA+T$aMXFWJ6CE#x+& zMTpDCx2mrFzM78%dW&A|N#$obTN|E#5AR(HR(L0BnR1as6HE_3x>Q77$>RW`ij>6?uA)ziq%%9j(8>-8NPGb=7#n$(qY cSSRy1*5T9R%6C4ww43M6B_Q7{%;tLj5A>$a_W%F@ literal 0 HcmV?d00001 diff --git a/ProjectTourismCompany/ProjectTourismCompany/Resources/plus.jpg b/ProjectTourismCompany/ProjectTourismCompany/Resources/plus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8c3671221e2d213fa86328b64150e21d35540b3 GIT binary patch literal 6843 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 literal 0 HcmV?d00001 diff --git a/ProjectTourismCompany/ProjectTourismCompany/Resources/Карта мира.jpg b/ProjectTourismCompany/ProjectTourismCompany/Resources/Карта мира.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9986cea6bc492c3471ea11881aa097d7ead30312 GIT binary patch literal 21842 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 literal 0 HcmV?d00001