Compare commits

..

2 Commits

58 changed files with 5313 additions and 75 deletions

View File

@ -0,0 +1,23 @@

using Travel_Agency.Entities.Enums;
namespace Travel_Agency.Entities;
public class Client
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public string PassportDetails { get; private set; } = string.Empty;
public PositionInSociety PositionInSociety { get; private set; }
public static Client CreateEntity(int id , string name, string passportDetails, PositionInSociety positionInSociety)
{
return new Client
{
Id = id,
Name = name,
PassportDetails = passportDetails,
PositionInSociety = positionInSociety
};
}
}

View File

@ -0,0 +1,28 @@

namespace Travel_Agency.Entities;
public class Contract
{
public int Id { get; private set; }
public int ContractNumber { get; private set; }
public int Discount { get; private set; } = 0;
public int TouristNumber { get; private set; }
public int FinalPrice { get; private set; }
public int ClientId { get; private set; }
public DateTime Date { get; private set; }
public IEnumerable<Contract_Tour> Tours { get; private set; } = [];
public static Contract CreateOperation(int id, int contractNumber, int discount, int touristNumber, int finalprice, int clientId, IEnumerable<Contract_Tour> tours)
{
return new Contract
{
Id = id,
ContractNumber = contractNumber,
Discount = discount,
TouristNumber = touristNumber,
FinalPrice = finalprice - finalprice * (discount / 100),
ClientId = clientId,
Date = DateTime.Now,
Tours = tours
};
}
}

View File

@ -0,0 +1,19 @@

namespace Travel_Agency.Entities;
public class Contract_Tour
{
public int Id { get; private set; }
public int TourId { get; private set; }
public string StartDate { get; private set; } = string.Empty;
public string EndDate { get; private set; } = string.Empty;
public static Contract_Tour CreateElement(int id, int tourId, string startDate, string endDate)
{
return new Contract_Tour
{
Id = id,
TourId = tourId,
StartDate = startDate,
EndDate = endDate
};
}
}

View File

@ -0,0 +1,11 @@

namespace Travel_Agency.Entities.Enums
{
public enum PositionInSociety
{
Unemployed = 0,
Employed = 1,
LargeFamily = 2,
Pensioner = 3,
}
}

View File

@ -0,0 +1,13 @@

namespace Travel_Agency.Entities.Enums;
[Flags]
public enum TypeOfTour
{
None = 0,
OnFoot = 1,
Bycar = 2,
ByTrain = 4,
ByPlane = 8,
ByShip = 16,
}

View File

@ -0,0 +1,18 @@

namespace Travel_Agency.Entities;
public class Payment
{
public int Id { get; private set; }
public int Sum { get; private set; } = 0;
public int ClientId { get; private set; }
public DateTime Date { get; private set; }
public static Payment CreateOperation(int id, int sum, int clientId)
{
return new Payment {
Id = id,
Sum = sum,
ClientId = clientId,
Date = DateTime.Now
};
}
}

View File

@ -0,0 +1,23 @@

namespace Travel_Agency.Entities;
public class Route
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public int Rating { get; private set; } = 0;
public string Places { get; private set; } = string.Empty;
public int Price { get; private set; } = 0;
public int TourId { get; private set; }
public static Route CreateEntity(int id, string name, int rating, string places, int price, int tourId)
{
return new Route
{
Id = id,
Name = name,
Rating = rating,
Places = places,
Price = price,
TourId = tourId
};
}
}

View File

@ -0,0 +1,22 @@

using Travel_Agency.Entities.Enums;
namespace Travel_Agency.Entities;
public class Tour
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public TypeOfTour TypeOfTour { get; private set; }
public int Price { get; private set; } = 0;
public static Tour CreateEntity(int id, string name, TypeOfTour typeOfTour, int price)
{
return new Tour
{
Id = id,
Name = name,
TypeOfTour = typeOfTour,
Price = price
};
}
}

View File

@ -1,39 +0,0 @@
namespace Travel_Agency
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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
}
}

View File

@ -1,10 +0,0 @@
namespace Travel_Agency
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,138 @@
namespace Travel_Agency
{
partial class FormTravel_Agency
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
menuStrip = new MenuStrip();
справочникиToolStripMenuItem = new ToolStripMenuItem();
ClientsToolStripMenuItem = new ToolStripMenuItem();
ToursToolStripMenuItem = new ToolStripMenuItem();
RoutesToolStripMenuItem = new ToolStripMenuItem();
операцииToolStripMenuItem = new ToolStripMenuItem();
ContractToolStripMenuItem = new ToolStripMenuItem();
PaymentToolStripMenuItem = new ToolStripMenuItem();
отчётыToolStripMenuItem = new ToolStripMenuItem();
menuStrip.SuspendLayout();
SuspendLayout();
//
// menuStrip
//
menuStrip.ImageScalingSize = new Size(20, 20);
menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчётыToolStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(782, 28);
menuStrip.TabIndex = 0;
menuStrip.Text = "menuStrip";
//
// справочникиToolStripMenuItem
//
справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ClientsToolStripMenuItem, ToursToolStripMenuItem, RoutesToolStripMenuItem });
справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
справочникиToolStripMenuItem.Size = new Size(117, 24);
справочникиToolStripMenuItem.Text = "Справочники";
//
// ClientsToolStripMenuItem
//
ClientsToolStripMenuItem.Name = "ClientsToolStripMenuItem";
ClientsToolStripMenuItem.Size = new Size(167, 26);
ClientsToolStripMenuItem.Text = "Клиенты";
ClientsToolStripMenuItem.Click += ClientsToolStripMenuItem_Click;
//
// ToursToolStripMenuItem
//
ToursToolStripMenuItem.Name = "ToursToolStripMenuItem";
ToursToolStripMenuItem.Size = new Size(167, 26);
ToursToolStripMenuItem.Text = "Туры";
ToursToolStripMenuItem.Click += ToursToolStripMenuItem_Click;
//
// RoutesToolStripMenuItem
//
RoutesToolStripMenuItem.Name = "RoutesToolStripMenuItem";
RoutesToolStripMenuItem.Size = new Size(167, 26);
RoutesToolStripMenuItem.Text = "Маршруты";
RoutesToolStripMenuItem.Click += RoutesToolStripMenuItem_Click;
//
// операцииToolStripMenuItem
//
операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ContractToolStripMenuItem, PaymentToolStripMenuItem });
операцииToolStripMenuItem.Name = "операцииToolStripMenuItem";
операцииToolStripMenuItem.Size = new Size(95, 24);
операцииToolStripMenuItem.Text = "Операции";
//
// ContractToolStripMenuItem
//
ContractToolStripMenuItem.Name = "ContractToolStripMenuItem";
ContractToolStripMenuItem.Size = new Size(254, 26);
ContractToolStripMenuItem.Text = "Оформление договора";
ContractToolStripMenuItem.Click += ContractToolStripMenuItem_Click;
//
// PaymentToolStripMenuItem
//
PaymentToolStripMenuItem.Name = "PaymentToolStripMenuItem";
PaymentToolStripMenuItem.Size = new Size(254, 26);
PaymentToolStripMenuItem.Text = "Оплата";
PaymentToolStripMenuItem.Click += PaymentToolStripMenuItem_Click;
//
// отчётыToolStripMenuItem
//
отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem";
отчётыToolStripMenuItem.Size = new Size(73, 24);
отчётыToolStripMenuItem.Text = "Отчёты";
//
// FormTravel_Agency
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackgroundImage = Properties.Resources.Picture_Travel_Agency;
BackgroundImageLayout = ImageLayout.Stretch;
ClientSize = new Size(782, 403);
Controls.Add(menuStrip);
MainMenuStrip = menuStrip;
Name = "FormTravel_Agency";
StartPosition = FormStartPosition.CenterScreen;
Text = "Туристическое агенство";
menuStrip.ResumeLayout(false);
menuStrip.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStrip;
private ToolStripMenuItem справочникиToolStripMenuItem;
private ToolStripMenuItem ClientsToolStripMenuItem;
private ToolStripMenuItem ToursToolStripMenuItem;
private ToolStripMenuItem RoutesToolStripMenuItem;
private ToolStripMenuItem операцииToolStripMenuItem;
private ToolStripMenuItem ContractToolStripMenuItem;
private ToolStripMenuItem PaymentToolStripMenuItem;
private ToolStripMenuItem отчётыToolStripMenuItem;
}
}

View File

@ -0,0 +1,82 @@
using Travel_Agency.Forms;
using Unity;
namespace Travel_Agency
{
public partial class FormTravel_Agency : Form
{
private readonly IUnityContainer _container;
public FormTravel_Agency(IUnityContainer container)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
}
private void ClientsToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormClients>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ToursToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormTours>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void RoutesToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormRoutes>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ContractToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormContracts>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void PaymentToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormPayments>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,141 @@
namespace Travel_Agency.Forms
{
partial class FormClient
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
comboBoxPosition = new ComboBox();
labelName = new Label();
labelPosition = new Label();
labelPassport = new Label();
textBoxName = new TextBox();
textBoxPassport = new TextBox();
ButtonSave = new Button();
ButtonCencel = new Button();
SuspendLayout();
//
// comboBoxPosition
//
comboBoxPosition.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxPosition.FormattingEnabled = true;
comboBoxPosition.Location = new Point(250, 113);
comboBoxPosition.Name = "comboBoxPosition";
comboBoxPosition.Size = new Size(194, 28);
comboBoxPosition.TabIndex = 0;
//
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(50, 50);
labelName.Name = "labelName";
labelName.Size = new Size(117, 20);
labelName.TabIndex = 1;
labelName.Text = "Ф.И.О. клиента :";
//
// labelPosition
//
labelPosition.AutoSize = true;
labelPosition.Location = new Point(50, 113);
labelPosition.Name = "labelPosition";
labelPosition.Size = new Size(181, 20);
labelPosition.TabIndex = 2;
labelPosition.Text = "Положение в обществе :";
//
// labelPassport
//
labelPassport.AutoSize = true;
labelPassport.Location = new Point(50, 184);
labelPassport.Name = "labelPassport";
labelPassport.Size = new Size(160, 20);
labelPassport.TabIndex = 3;
labelPassport.Text = "Паспортные данные :";
//
// textBoxName
//
textBoxName.Location = new Point(250, 50);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(194, 27);
textBoxName.TabIndex = 4;
//
// textBoxPassport
//
textBoxPassport.Location = new Point(250, 177);
textBoxPassport.Name = "textBoxPassport";
textBoxPassport.Size = new Size(194, 27);
textBoxPassport.TabIndex = 5;
//
// ButtonSave
//
ButtonSave.Location = new Point(73, 269);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(94, 29);
ButtonSave.TabIndex = 6;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// ButtonCencel
//
ButtonCencel.Location = new Point(291, 269);
ButtonCencel.Name = "ButtonCencel";
ButtonCencel.Size = new Size(94, 29);
ButtonCencel.TabIndex = 7;
ButtonCencel.Text = "Отмена";
ButtonCencel.UseVisualStyleBackColor = true;
ButtonCencel.Click += ButtonCencel_Click;
//
// FormClient
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(479, 323);
Controls.Add(ButtonCencel);
Controls.Add(ButtonSave);
Controls.Add(textBoxPassport);
Controls.Add(textBoxName);
Controls.Add(labelPassport);
Controls.Add(labelPosition);
Controls.Add(labelName);
Controls.Add(comboBoxPosition);
Name = "FormClient";
Text = "Клиент";
ResumeLayout(false);
PerformLayout();
}
#endregion
private ComboBox comboBoxPosition;
private Label labelName;
private Label labelPosition;
private Label labelPassport;
private TextBox textBoxName;
private TextBox textBoxPassport;
private Button ButtonSave;
private Button ButtonCencel;
}
}

View File

@ -0,0 +1,83 @@

using Travel_Agency.Entities;
using Travel_Agency.Entities.Enums;
using Travel_Agency.Repositories;
namespace Travel_Agency.Forms
{
public partial class FormClient : Form
{
private readonly IClientRepository _clientRepository;
private int? _clientId;
public int Id
{
set
{
try
{
var client =
_clientRepository.ReadClientById(value);
if (client == null)
{
throw new
InvalidDataException(nameof(client));
}
textBoxName.Text = client.Name;
textBoxPassport.Text = client.PassportDetails;
comboBoxPosition.SelectedItem =
client.PositionInSociety;
_clientId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormClient(IClientRepository clientRepository)
{
InitializeComponent();
_clientRepository = clientRepository ??
throw new
ArgumentNullException(nameof(clientRepository));
comboBoxPosition.DataSource =
Enum.GetValues(typeof(PositionInSociety));
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxName.Text) ||
string.IsNullOrWhiteSpace(textBoxPassport.Text)
||
comboBoxPosition.SelectedIndex < 1)
{
throw new Exception("Имеются незаполненные поля");
}
if (_clientId.HasValue)
{
_clientRepository.UpdateClient(CreateClient(_clientId.Value));
}
else
{
_clientRepository.CreateClient(CreateClient(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCencel_Click(object sender, EventArgs e) => Close();
private Client CreateClient(int id) => Client.CreateEntity(id, textBoxName.Text, textBoxPassport.Text,
(PositionInSociety)comboBoxPosition.SelectedItem!);
}
}

View File

@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->

View File

@ -0,0 +1,128 @@
namespace Travel_Agency.Forms
{
partial class FormClients
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormClients));
panel1 = new Panel();
ButtonDel = new Button();
ButtonUpd = new Button();
ButtonAdd = new Button();
dataGridView = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.Controls.Add(ButtonDel);
panel1.Controls.Add(ButtonUpd);
panel1.Controls.Add(ButtonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(651, 0);
panel1.Name = "panel1";
panel1.Size = new Size(149, 450);
panel1.TabIndex = 1;
//
// ButtonDel
//
ButtonDel.BackgroundImage = (Image)resources.GetObject("ButtonDel.BackgroundImage");
ButtonDel.BackgroundImageLayout = ImageLayout.Stretch;
ButtonDel.Location = new Point(55, 213);
ButtonDel.Name = "ButtonDel";
ButtonDel.Size = new Size(65, 59);
ButtonDel.TabIndex = 2;
ButtonDel.UseVisualStyleBackColor = true;
ButtonDel.Click += ButtonDel_Click;
//
// ButtonUpd
//
ButtonUpd.BackgroundImage = (Image)resources.GetObject("ButtonUpd.BackgroundImage");
ButtonUpd.BackgroundImageLayout = ImageLayout.Stretch;
ButtonUpd.Location = new Point(55, 121);
ButtonUpd.Name = "ButtonUpd";
ButtonUpd.Size = new Size(65, 59);
ButtonUpd.TabIndex = 1;
ButtonUpd.UseVisualStyleBackColor = true;
ButtonUpd.Click += ButtonUpd_Click;
//
// ButtonAdd
//
ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage");
ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch;
ButtonAdd.Location = new Point(55, 32);
ButtonAdd.Name = "ButtonAdd";
ButtonAdd.Size = new Size(65, 59);
ButtonAdd.TabIndex = 0;
ButtonAdd.UseVisualStyleBackColor = true;
ButtonAdd.Click += ButtonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AllowUserToResizeColumns = false;
dataGridView.AllowUserToResizeRows = false;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Fill;
dataGridView.Location = new Point(0, 0);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(651, 450);
dataGridView.TabIndex = 2;
//
// FormClients
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridView);
Controls.Add(panel1);
Name = "FormClients";
Text = "Клиенты";
Load += FormClients_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button ButtonDel;
private Button ButtonUpd;
private Button ButtonAdd;
private DataGridView dataGridView;
}
}

View File

@ -0,0 +1,105 @@

using Travel_Agency.Repositories;
using Unity;
namespace Travel_Agency.Forms
{
public partial class FormClients : Form
{
private readonly IUnityContainer _container;
private readonly IClientRepository _clientRepository;
public FormClients(IUnityContainer container, IClientRepository clientRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_clientRepository = clientRepository ??
throw new ArgumentNullException(nameof(clientRepository));
}
private void FormClients_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormClient>().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<FormClient>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление",
MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_clientRepository.DeleteClientById(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridView.DataSource = _clientRepository.ReadClients();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridView.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id =
Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
return true;
}
}
}

View File

@ -0,0 +1,356 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ButtonDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
UBMAAAAASUVORK5CYII=
</value>
</data>
<data name="ButtonUpd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
qad27tz51Vdfzc7OyhsB5VkoW43sFStWSLAZNDQ0qP9+9NFHZ8+elbcAKjFd9q1bt95+++1ishm9/PLL
Kms5HsjGwjVbbWVpthI1rF999dUvv/xSjgQyM132999/v2nTJik31fr169XV/fLly3/++accDGRmtOw7
d+5MTk6uXLlS4i2jqampvb3922+/vXbtmhwJ5GT6mv3WW29Jv+UdOHDg66+/lgOAqhgtu1Ao7Nu3r3iv
I5FaIG+88Ya6tM/Pz8sxQFWMlv3rr7++8sorUvFSq1ev7ujo+OSTT7hdDS2Mlj0xMdHS0iIt36OxsVF9
s/jjjz/euHFDXgrUxlzZamCMjIyU/pmldevWffDBBz/99JO8DtDBXNlqPb///vuS811dXV3Dw8PyCkAf
c2WrpaE6XrZsWbHpJ5544vnnn7948SILBPVgruzF33189NFHV65cefz48dOnT8vnAN3MlT09PV28Wu/a
teuLL76QjwL1Ya7so0ePbty4cffu3TMzM/IhoG4Mlf3HH3989913AwMDV65ckQ8B9WTumv3zzz9funRJ
ngB1Zq5swCTKRpgoG2GibISJshEmykaYKBthomyEibIRooWF/wOJOuh6obV2FwAAAABJRU5ErkJggg==
</value>
</data>
<data name="ButtonAdd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAKkAAAClCAIAAACodUoDAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vgAADr4B6kKxwAAAF+dJREFUeF7tXWuPHcWZpvvcT/eZGc+Mx4MvYGOMr4Nn7PGYGc94xvY4EayWzRek
fEFKpEjRhmg3lmATKSChZaWED+twMyEkEG4mrLlfYsDY2GGDWUIE5DfwQ9jnPf36eFynqk51d/XlzDmP
Ho16+nR3VdfT9Va9b1dVX/dtH72Kvva9i772vYu+9r2Lvva9i772vYu+9r2Lvva9i772vYu+9r2Lvva9
i772vYu+9r2Lvva9i772vYtVrv0333xz+fLlkydPnmhitomNTVx3LYKdwQF33XUXDj5z5gzO5QutRqw2
7SF2oHS7unEQPBCr7GlYDdpDD+ti64HnIHgUOAfdiW7VHvUbRQ8B0pRciu59CLpPexQ0LDAXfJ7QdQ9B
12iPip6yYY8MPASc6XyjC7QPbDuXa/cg/2Yg19qj7LqiomuQ5ycgp9qvAtVXIp9PQO60h8OWtOoD/ziu
Ih+RDNBFzdUTkCPt0Zuz264LukYmX84ScI98w1kjL9qjQnDZxIMgWxLklOLh5MmTfOfZIXvt4xt5QZvU
yMlHBZqAbCPEGWuPx59LIjwEJTIkZygSMjQAWWofuXUXij4/5PyFRFY9gGy0R7cump0Xyjqf5LyGAUoj
ffufgfbRunVC+eafnO8wSNn+p639iRMn+EaNIZRpd5HvwRgoHy6p5JGq9mEbeKEcu5d8P2ZIrflPSXs0
8KFevApltwrIN2YGlBVKjMsuMaShfdienVBq0di4tDjw9fHGJ0uN84cbnx5pfH6UNj5u7ry46J9boJ2f
HvE/XGhcWBz4chm/+h80d15a8t+a89+fb1w+4r9zyH9zjvZ8sOC/NiskEYF8hwZAiSUtf+LaZyK8//Zc
5ac3l24fL90xXrpzfem746XvrCv90/W0sTxWOr4OPxWPjoHYQxuLa2l7eay4MFo8NFI8MFyYHCJODRX2
DRVuHSzsGcSlvGenhYQikO/TAEnLn7j25qZeKKM49P88727x+LquwxsxUXTqT+8XEopMvmYnoPS4HBNA
stpnIjzonT5Y2DXAl7YE9/qqRe1Bvm4nJCd/gtqb9+qFQolP79XZwvYGX90S3A21+lP7hIRiki/dCQn1
/JPS3tyPF4rDCtFTczdfsfmW4FQL1rUH+eqdkITfn4j25m9ohIKwRe+lGfeGOqdhCc5wOQntQU6gE6xH
/exrf/nyZc5sJwhFYJEQyRmrcDKW4G6s1U9NwUUU0rJCTqMT7Mb8LWsPn4Sz2QnCzdsl/HJnrWXtnaFS
/beJ1PuAnIwWdr0+y9obduyF27ZO708HnZEyJ2YJ1N4/OSUkZJeckhaQn8s6Nmxqb9i/E244CdZ/t99d
V+X0ZHAGStdVXKdecDfVcKTjF2HSsc0/y0A+3hPJag9yYlrY6vdZ096wmRduNSF6Lx90RpX1vjA5VL77
xtqvJsD6Y5Pw2uvPTMOe13494W7z+aA2oAORqM1vkdPTworlt6a9ibUXbjI5ko83rqz3hd0DFMNvOwss
LozyQTLUH0+83gfk9NSwYvntaG/i1Am3lyi9Z6Y1Nr+wf43/9pxwCtj4y1Jh39B1ihAwDEkKNr9FTlWN
+C6fBe1N+vbCjSVN7/kDOu2n1/hvybT/eBEmQRX/p/b+scmEfDwpOWE1Ylp+C9qbxG6Fu0qajY8Ou+uV
HbfCjkbj/GHhlIAam+/UCqR92ynJkRNWI2asN672JoPvhFtKgd7pg5rYTmHPoP/evHAK8YtjxUMjfFAb
HK9YfzRV7UFOW404VT+u9h0rvXAz6dB7dhommnPQBrL5r0sGYqADWNiptvnj1fojkwNfLQtnJU1OXoE4
b/liaZ/PSg/67xzSab+94Z8NX+/HKt7/3Caekgo5BwpEnt8ZS/uOfp1wD6nRf1enPZx4/8MF4ZSAxaW1
fJAM3oszwvHpkJNXILK/F137jpVeuIE06T13QFfvp4bkNv/SEn5S2vyNNf9NiXeQDjkTCkSr+tG1z2dL
HxDGWefjTQxKVWz89UjxwLBOe5lnmA45EwpEq/oRtc9zpQcbnyy5m5Tv792bPP99WXv/j+OlY2N8kAze
C9nY/ICcCQUidPgjap/nSg/Cx9PZ/N0D8nr/+dHivNq/Hyl7fzoonJImOR8KRPD1I2rPCSogZDp90rgd
tfbF2RGpf0/t/a2D1xUUNn9TnZ6YFON67eSsKBC26kfRPueVHmxcXNSM2SrsGWz8ZUk4JSAeCz6oDY5f
zKqf3yJnRYGwVT+K9pyUAkJ2MyE6ZbqY7tQQOgTCKSB20rscFUqu9/wB4ZT0yZmRIWyPL7T2Oe/lBSSb
v0GpffHIWmk8n2Z04IlR9fM31Pw3ZrO1+SDnRoFQZj+09nqDL2Q0K1JsZ6Na++k1NFuv7SyK6e4Z5IPa
4KyteK9k2ddrkTMkQ6ghPaG150QUEHKZFam9V4/Pp/d4F2Xaf7JUPDjMB8ngPWNhPl58cm5kCGX2w2nf
FQYfhDOms/nzo9JxO/65BTwW6rEbFe/lvNd7wNzsh9O+Kww+iPbeaRQ5W20ozo3Itf9wwb3Z14zdoEhw
1u19QM6TDOZmfzVq/+Wyf1Y3Xg8CS7Unm3+b2ua7Tj0fNh/kLMlg/lY3nPZ8eQWE/GXI+h/2a+p9Yf8a
VXuPn/igNjj1gpX591bIeVKA1eqEENrrR2ELmcuW9d/uoxH4ClB7L/XxPlgga6G2+d6rs7HGbkjbi6gX
5GzJYNjkh9Be39ETcpYI9WX3xTGw8X9HG58d9U7P6MZs7RyQ1/vgPZ4CFNf74zT6BP578+gV0iosZ+dp
+/152n57jvdg451D/p/nia/P4m/9qX3MU1P098kpIrYfn6o/MUUTBMBHm8TGb/biGCFjUnK2ZDAcwhtC
eyuNPW4MJUhzIXDnj9MNV3+5s/rAztrDE7UHd1X/Y3vtod21/9pTvfeW6i921P5zN/5Wf7YNB1Tv31n5
t5tp//07sadyz1b66b7tlR/fRAfct738w82lf1lfvvvG8vc3wXQ7ntLmu9sU7f3/LmliugAuW5gYdEbL
hV0DhakhmtOzsVbYO1jY3kBy+FvYM+isrbjra4XdA+4Wz6kWkBaOQXvhDJdxPM0UK7swIfS6oeg4a8rY
cAZLtHNdFa4EUiktj5kMFAiyJIVhcDeE9vAd+doyCDmT0n9ttnTnelhjmFb3hrozVEKR4V9qm0sub1cL
NFuqUSTxXId2+kXsoZ1+EYVIO1GU+LXo0E5s4NfmTlyEPLSCQxtqQODGRzKbDx/vFmU/PzUUbh2EtRDy
1k4+WgZDLz+E9nxhGYRsqUgNKpyorEHxfFl7j4YAlTgP2jc+PSLkTUo+QQbWTAtT7dF94KvKIORJRTSN
1pdCiQDYXlRxIW8g2XztnKx0UJgckk4baiefIINJd89UeysdPfR9CtNKJyo1kI8nrfeXmj5extW+qb3Z
wEA+QQaTVRrS1f7dQ5qXJakBnXl5vT9/OBft/e4BPIVC3qTkE2Qw6eqbam+lk48eVl5svmyMNvl4ebD5
uwZM+nognyCDSWQ3Ve39t+Y0gbPUgOdPbvM/PaIZr5caYPMpiNSWvXbyCTKYRHZNtddPwxDypGJOtCeb
L6335w+7N3l2bL70Gq2d2hRU3ZF28gky2NQ+vnMPUoO602y5S2npSFWBlx9g5a8t/771K1DmneREqer9
7AhFHYbLFGDwi87aCv3F9mjZGa0EoQiKxmBPM0rhjFWcQTre3VDDhntDvbCjgU6Du9nDX4rwbPZoe2IQ
+/FgYQ/cSHrCFCNCAXJBFcMJ28nntMHExbegvZAbDdGMkQOtBq1+vDx2dd1jEBv/fD0tiYyN722g7e9t
KP9gc/XEtsqPtlR+srX68+2Ve7ZSdC8I8/3rVvxUfWBn5d+3gRQr/MUObFCUMAgX3nuL99wBuHNC3kC0
97X/3lt/Ztp7cab+yGT91BT62xSFfWzSe2nGOz1Dscjf7/fPztMyLU/tg2X2Xj5IGy/MwH31XjnovzFL
QeWPDsOjofDR349RfPfdQwNfNdfpfouW5MbO2sMTeAj4nttQnBuhU9qyJyWf0wab2vMlZRByoyGKUjMw
xl1XrT20u/HZUVrI/PxhKiYU2cVFir9+cYx2XlikoAd2/pXWRKfwfjOAj9LENu352zFK6O/HaPvLZToA
e77gnbSNPcHOFbm6yuDVAE4EsYEjg4sEPwW/BjuxEewMfsXf1msFA/qv6ZZ8Lc4MG/b1QD6nDfnT/tyC
bkDcSDknA2OSJg0S2aqMb8I0Gvp4IJ8jAyunRqrao+Ki5ePT2oB21NzWdTW9M7dp+j3F6TXx6z3AyqmR
br1/e04zMAZNIApFOGVVkrTXtPe3DRvGdEE+RwZWTg1T7W319fBQ82ltQFXoEe1pCLlmuuDEoPQVs5R8
jgysnBqpak8Bc3U/H02g1O1efaSlH9VLvqJLJA05S8nntMFmX89avZ9R2/ztjXDfI5J2s1U982AnNoJe
uqpbvtIXgGuAPXATgp1fLpP7EOz8W9OVwE74FHA0cEzT0YADgitfdUnghmDj4iLtvHTlq02fHYU7o1ke
AK5Q/Hc5NrW3E9d79xCcVz6nDWgC4fhSaTa/VEXhl6+WcQpcZNp5xWlGWcONJmcaLvULM+Rev3wQrjY5
4k83ne/f74cjDnccTjmNgnpqH7npp6bgspPj/sw0nHgSqS17cPrh+gcxAAoGtAIDD+4KogU0fOjENgoh
3Ledfv3xTTR86OfbKz/ZWvnRFvxU/sHmVhCCAhJ3jNP2yljFd9ZRAOP2cb5nGWAaDft6fIIMuYvp0sKV
U+rJjgWHIl97B/EQ0MaOBlo+jovtHrgaLNvRoDE/gyUKpQ2XKaw2VqEQ27VBNwrDjbaF53D8UInG7cgG
R+BpoznYAa4EAQmt4ODK4UCtMOLK0GEL0hCkMpR3DWg4YeyYrsmwLVPt9WtkC3lSkQpXH89vlY60mMzK
rgNcesKkhYvehmasZmpAEcHsCXmTkk+Qwab2+hVzhTypSJ8wmlTX+7RAY7RV9T4Hr5itaH/GYPUlU+2t
DM5HM2b902URUFwYlbb3FG7TLqGfDugVs2woaTv5BBlsam9lvB75eOqYRkpwHXQa5Db/XD5sPnw8s/gm
nyCDzfF6AF9VBiFPKqK/nb3Nd5ovyGUB887dkVSgWvK1nXyCDKyZFiG017j4gJAtKf23c6B9YPNl73BR
73Ni81VLwK0kHy2DiXMPhNA+/rAt9LCuOlFZATZ/76B8ThbqvcYFTQvuzb7/Qee4Hh8tg0knHwihffyu
PvX18qD9Lb58nO5Hh/Vzssi/LzjkapboO0vkxLcmBhWbU4ha04ZWziVqTTBq0E6nWqDwA3biIkEoAj8N
0ZifIEpRunO9SXyTsySDSUcPCKF9/O4e2vvSMi1c6YxWKKhZdilEc33VWVNG2WGD3nBg50hz6tpwGYXo
bqy523ya2LaFIjzu+pqztoLeEAwjigx/UYnpmE01VFk4ETRZbmJQ32xTbEc6bufCItLig9pAye1fU/7+
pvLdN9LEvx9upujez7bRkKEgzHfPVpoZeP/O6r230NRBbDxAUwcpMhhMLGyGC2sP7aZphw/uqj08QQf8
cifNwnwcnKIhQ3+crseei2n4CcUQ2gN8bQWEzElJkdff7L1m5in4RHNS6qnmBFWwNWW1SViLYEIr8Z1D
NNH17Iqpr+83J8MGe841J8l+uIASpJqnADrz8pjuxeb6+QrQGuqnZ2hYURDAD4YDgdJXA8Hrg8TIeVKA
1eqEcNpbieyKtF52Xy17r84qX5K6DkyrtEFFe69bU3Ug2e9ihiLnSQbDxh4Ip72VyG4K9J6dpqZXAfLx
pGsrot6rGwu0zfU/2Pz+fRxynmRISnt9kw8IWcyKaDipI6ZA8bZhufZo79XThMlanJ3nV8CZkjOkgGFH
DwinPRDfy0+cX9OkT53NhxMlnZtxYVHzihn13nsp4/V0A3KGFGCdDBBa+64w+zQwprmGhQQOra0o9/Gg
vbq9dzfUsl1DvUXOkAzmBh8IrX1XmH0PNl+N4kGFzUd7v0P5Hs/d7EkjQimTc6OAucEHQmsP5N/se68c
dNTfvy/skQ+GbFxa1AwldTfW8jCEnHOjACtkhija64O7gJDdtIn2/o1Z5ZqqaO/X13zZoCjy8Y4ov5NF
Nj/r9p6zokAogw9E0T7/Zt97/sA146uuRWGfev18dTyfnpjsvpUUkLOiAMtjjCjaAzmv+t6LM7q43uyI
cHxAGk6onjLm3lDPtr3nfCgQttIDEbXPddWHzX9zTvmdrIJDc7Bl7+/99+Y173LgNGZr8zkfCoTq5QWI
qD2g7/EBQtbTJJwxzeQHGq/3+VHhFJCGlqiHFZH2pzPz8TgTCkSo9EB07fGgccoKCLlPk94LM5wJGUrH
xoTjA/rvz9OqCArAkEh7CemQM6FAhEoPRNceyG3VR6cMLhlnQoDrqN7jUb3XTBNeV83nt5BNpmFIEUv7
3FZ9au/V2tOiJtL2/vVZXT8fNv+5DL6TxcmrEa3SA7G0B/RvdQHhTtIh+vmcvAzFpbXC8QFpjLZ67Aa0
zyS2w8krEK2lDxBX+44dfkC4mRQI46xZQ714aOTqyIsV9M/qlnwl7d9JW3tOW43IlR6Iqz3Q0dcHhFtK
ll8t1x+ZdFXfTIHN3zkgjemSzdfEdGHz0/1uBiesRpxKD1jQPodVv/7oJA2GVEBZ79+b18R2mmO2UvXx
OGE1UPKsQSRY0B7QD+ENINxYoqw/NunUlON2igujwvEBaYy25j3e+prhVCkr5FTVMPw4hgZ2tAc6+nuA
cHtJ8WvSHiaaUxUAm797oPGxzOa/Naez+fDx0voeLiepRmS/biWsaW9i+QHhJhNi/YkpZ1QR13Oa73Jk
C1fStCH1eD3SPpVvpHF6WhiOwtbDmvaAfkhPC8KtJsH641OcmAxKm39hURfTHa+aTJWKSU5MC5M1sk1g
U3vAxPIDwg1bJ30jTe3jwYmv/XoCx9Anm57ejwai9qsJsHz3jZrpgjAkSS/9yClpYcXaB7CsPSx/HuSH
zVe29024zU9cOX4RlpzmANWbH2hSf1IPwJH13yU4RpuT6YSYffuVsKw9oF+lYSWEm7fI+pNT9L0tq6Al
XxMbq8lpdIKVZr4F+9oDJi5fAKEIbJFs/pCuEkeAs7aSUFyPE+iE+E6dgES0Bwz7fYBQEBYIH+/UlPJd
TlSgA1E3myUZinz1TrDVv1uJpLQHTGK9AYTiiE+I5Awrx25Eg3tD3fq4Hb50J8SM3aqQoPZAx7d8LQiF
EpOkve323t3s2fXx+LqdYLFjLyBZ7YFM5If2yjHaUVHY3jD8hJEJ+aKdkJzwQOLam3t9AYQyikZ47Xof
LwIKuwasvMvhyxkA5WbRo2tH4toD6csP7eVLnUbAlfm87hZPOqMjFINLmSBp4YE0tAdwG+bGP4BQaqHo
PTtdumOclma5dbCwb4iWY5kkFg8MFw+NFBdGS8tjxaNjxcW1+Fv67jhtY+P28dLx5lrHrXWPsXHneloS
+fbxyk9vNv+kgZR8YwZAWSUtPJCS9gHMe/4BhLILRf+1Wf+DBVqS+805+OWNy0dodZbml6oanx6hn84f
pmXRLyz6Hy7Q0ubYeW6BZl98fbzx8SJ+pTXRg682fbJEOy9Fn5jB92OGhHr17UhVe8Dc729BKMfuIt+D
MZLw41VIW3vAPOq3EkKZ5p+c7zCIM/guAjLQHrh8+XKo3l8LQvnmk5zXMEihZ9eObLQPELb5b0Eo6/yQ
8xcSqTXwArLUHohm/1sQij5DcobCw/obGnNkrD0A+x/W/WuHoERq5OQjAXbe7jvZsMhe+wAxDUALgjZJ
kFOKh5S7dVLkRfsAkXsAKgiyRSZfzgZwj+l366TIl/YAKkT8JkAPQdeV5COSQeZGXkDutA+AJ8C6DcgQ
UD0PRl5ATrUPsAqegHyqHiDX2gfo0icAec6t6gG6QPsWuuIJQEU/ceJETnpzenST9gFyawbQRc15RRfQ
fdq3kIeHALU8sO1dUdEFdLH2LQQPQZrPQWDYc+WwRcBq0H4loEfwKNgNEgRinzx5shvrtwqrTft2BE8D
lAseCABCAqzqFQQ7gwNwcKA0zl1NYgtY/dr3oUJf+95FX/veRV/73kVf+95FX/veRV/73kVf+95FX/ve
RV/73kVf+17Ft9/+P+vFPylX2rU2AAAAAElFTkSuQmCC
</value>
</data>
</root>

View File

@ -0,0 +1,262 @@
namespace Travel_Agency.Forms
{
partial class FormContract
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
ButtonSave = new Button();
ButtonCancel = new Button();
comboBoxClient = new ComboBox();
labelClient = new Label();
labelContractNumber = new Label();
labelDiscount = new Label();
labelTouristNumber = new Label();
labelFinalPrice = new Label();
numericUpDownContractNumber = new NumericUpDown();
numericUpDownDiscount = new NumericUpDown();
numericUpDownTouristNumber = new NumericUpDown();
numericUpDownFinalPrice = new NumericUpDown();
groupBoxTour = new GroupBox();
dataGridViewTours = new DataGridView();
ColumnTour = new DataGridViewComboBoxColumn();
ColumnStartDate = new DataGridViewTextBoxColumn();
ColumEndDate = new DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)numericUpDownContractNumber).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownDiscount).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownTouristNumber).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownFinalPrice).BeginInit();
groupBoxTour.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewTours).BeginInit();
SuspendLayout();
//
// ButtonSave
//
ButtonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
ButtonSave.Location = new Point(35, 401);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(94, 29);
ButtonSave.TabIndex = 0;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// ButtonCancel
//
ButtonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
ButtonCancel.Location = new Point(214, 401);
ButtonCancel.Name = "ButtonCancel";
ButtonCancel.Size = new Size(94, 29);
ButtonCancel.TabIndex = 1;
ButtonCancel.Text = "Отмена";
ButtonCancel.UseVisualStyleBackColor = true;
ButtonCancel.Click += ButtonCancel_Click;
//
// comboBoxClient
//
comboBoxClient.FormattingEnabled = true;
comboBoxClient.Location = new Point(211, 247);
comboBoxClient.Name = "comboBoxClient";
comboBoxClient.Size = new Size(151, 28);
comboBoxClient.TabIndex = 7;
//
// labelClient
//
labelClient.AutoSize = true;
labelClient.Location = new Point(37, 250);
labelClient.Name = "labelClient";
labelClient.Size = new Size(65, 20);
labelClient.TabIndex = 6;
labelClient.Text = "Клиент :";
//
// labelContractNumber
//
labelContractNumber.AutoSize = true;
labelContractNumber.Location = new Point(37, 35);
labelContractNumber.Name = "labelContractNumber";
labelContractNumber.Size = new Size(134, 20);
labelContractNumber.TabIndex = 8;
labelContractNumber.Text = "Номер договора :";
//
// labelDiscount
//
labelDiscount.AutoSize = true;
labelDiscount.Location = new Point(37, 87);
labelDiscount.Name = "labelDiscount";
labelDiscount.Size = new Size(92, 20);
labelDiscount.TabIndex = 9;
labelDiscount.Text = "Скидка в % :";
//
// labelTouristNumber
//
labelTouristNumber.AutoSize = true;
labelTouristNumber.Location = new Point(37, 141);
labelTouristNumber.Name = "labelTouristNumber";
labelTouristNumber.Size = new Size(130, 20);
labelTouristNumber.TabIndex = 10;
labelTouristNumber.Text = "Кол-во туристов :";
//
// labelFinalPrice
//
labelFinalPrice.AutoSize = true;
labelFinalPrice.Location = new Point(37, 192);
labelFinalPrice.Name = "labelFinalPrice";
labelFinalPrice.Size = new Size(132, 20);
labelFinalPrice.TabIndex = 11;
labelFinalPrice.Text = "Финальная цена :";
//
// numericUpDownContractNumber
//
numericUpDownContractNumber.Location = new Point(211, 33);
numericUpDownContractNumber.Name = "numericUpDownContractNumber";
numericUpDownContractNumber.Size = new Size(150, 27);
numericUpDownContractNumber.TabIndex = 12;
//
// numericUpDownDiscount
//
numericUpDownDiscount.Location = new Point(211, 85);
numericUpDownDiscount.Name = "numericUpDownDiscount";
numericUpDownDiscount.Size = new Size(150, 27);
numericUpDownDiscount.TabIndex = 13;
//
// numericUpDownTouristNumber
//
numericUpDownTouristNumber.Location = new Point(211, 139);
numericUpDownTouristNumber.Maximum = new decimal(new int[] { 20, 0, 0, 0 });
numericUpDownTouristNumber.Name = "numericUpDownTouristNumber";
numericUpDownTouristNumber.Size = new Size(150, 27);
numericUpDownTouristNumber.TabIndex = 14;
//
// numericUpDownFinalPrice
//
numericUpDownFinalPrice.Location = new Point(211, 190);
numericUpDownFinalPrice.Maximum = new decimal(new int[] { 200000, 0, 0, 0 });
numericUpDownFinalPrice.Name = "numericUpDownFinalPrice";
numericUpDownFinalPrice.Size = new Size(150, 27);
numericUpDownFinalPrice.TabIndex = 15;
//
// groupBoxTour
//
groupBoxTour.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
groupBoxTour.Controls.Add(dataGridViewTours);
groupBoxTour.Location = new Point(403, 33);
groupBoxTour.Name = "groupBoxTour";
groupBoxTour.Size = new Size(463, 428);
groupBoxTour.TabIndex = 16;
groupBoxTour.TabStop = false;
groupBoxTour.Text = "Туры";
//
// dataGridViewTours
//
dataGridViewTours.AllowUserToResizeColumns = false;
dataGridViewTours.AllowUserToResizeRows = false;
dataGridViewTours.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewTours.Columns.AddRange(new DataGridViewColumn[] { ColumnTour, ColumnStartDate, ColumEndDate });
dataGridViewTours.Dock = DockStyle.Fill;
dataGridViewTours.Location = new Point(3, 23);
dataGridViewTours.MultiSelect = false;
dataGridViewTours.Name = "dataGridViewTours";
dataGridViewTours.RowHeadersVisible = false;
dataGridViewTours.RowHeadersWidth = 51;
dataGridViewTours.RowTemplate.Height = 29;
dataGridViewTours.Size = new Size(457, 402);
dataGridViewTours.StandardTab = true;
dataGridViewTours.TabIndex = 0;
//
// ColumnTour
//
ColumnTour.HeaderText = "Тур";
ColumnTour.MinimumWidth = 6;
ColumnTour.Name = "ColumnTour";
ColumnTour.Width = 200;
//
// ColumnStartDate
//
ColumnStartDate.HeaderText = "Дата начала путишествия";
ColumnStartDate.MinimumWidth = 6;
ColumnStartDate.Name = "ColumnStartDate";
ColumnStartDate.Resizable = DataGridViewTriState.True;
ColumnStartDate.Width = 125;
//
// ColumEndDate
//
ColumEndDate.HeaderText = "Дата конца путешествия";
ColumEndDate.MinimumWidth = 6;
ColumEndDate.Name = "ColumEndDate";
ColumEndDate.Width = 125;
//
// FormContract
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(897, 496);
Controls.Add(groupBoxTour);
Controls.Add(numericUpDownFinalPrice);
Controls.Add(numericUpDownTouristNumber);
Controls.Add(numericUpDownDiscount);
Controls.Add(numericUpDownContractNumber);
Controls.Add(labelFinalPrice);
Controls.Add(labelTouristNumber);
Controls.Add(labelDiscount);
Controls.Add(labelContractNumber);
Controls.Add(comboBoxClient);
Controls.Add(labelClient);
Controls.Add(ButtonCancel);
Controls.Add(ButtonSave);
Name = "FormContract";
StartPosition = FormStartPosition.CenterParent;
Text = "Контракт";
((System.ComponentModel.ISupportInitialize)numericUpDownContractNumber).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownDiscount).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownTouristNumber).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownFinalPrice).EndInit();
groupBoxTour.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewTours).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button ButtonSave;
private Button ButtonCancel;
private ComboBox comboBoxClient;
private Label labelClient;
private Label labelContractNumber;
private Label labelDiscount;
private Label labelTouristNumber;
private Label labelFinalPrice;
private NumericUpDown numericUpDownContractNumber;
private NumericUpDown numericUpDownDiscount;
private NumericUpDown numericUpDownTouristNumber;
private NumericUpDown numericUpDownFinalPrice;
private GroupBox groupBoxTour;
private DataGridView dataGridViewTours;
private DataGridViewComboBoxColumn ColumnTour;
private DataGridViewTextBoxColumn ColumnStartDate;
private DataGridViewTextBoxColumn ColumEndDate;
}
}

View File

@ -0,0 +1,69 @@

using Travel_Agency.Entities;
using Travel_Agency.Repositories;
namespace Travel_Agency.Forms
{
public partial class FormContract : Form
{
private readonly IContractRepository _contractRepository;
public FormContract(IContractRepository contractRepository, IClientRepository clientRepository, ITourRepository tourRepository)
{
InitializeComponent();
_contractRepository = contractRepository ??
throw new ArgumentNullException(nameof(contractRepository));
comboBoxClient.DataSource = clientRepository.ReadClients();
comboBoxClient.DisplayMember = "Name";
comboBoxClient.ValueMember = "Id";
ColumnTour.DataSource = tourRepository.ReadTours();
ColumnTour.DisplayMember = "Name";
ColumnTour.ValueMember = "Id";
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (dataGridViewTours.RowCount < 1 ||
comboBoxClient.SelectedIndex < 0 || numericUpDownContractNumber.Value == 0 || numericUpDownDiscount.Value == 0 ||
numericUpDownFinalPrice.Value == 0 || numericUpDownTouristNumber.Value == 0)
{
throw new Exception("Имеются незаполненные поля");
}
_contractRepository.CreateContract(Contract.CreateOperation(0,
Convert.ToInt32(numericUpDownContractNumber.Value),
Convert.ToInt32(numericUpDownDiscount.Value),
Convert.ToInt32(numericUpDownTouristNumber.Value),
Convert.ToInt32(numericUpDownFinalPrice.Value),
(int)comboBoxClient.SelectedValue!,
CreateListContract_TourFromDataGrid()));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCancel_Click(object sender, EventArgs e) => Close();
private List<Contract_Tour> CreateListContract_TourFromDataGrid()
{
var list = new List<Contract_Tour>();
foreach (DataGridViewRow row in dataGridViewTours.Rows)
{
if (row.Cells["ColumnTour"].Value == null ||
row.Cells["ColumnPrice"].Value == null)
{
continue;
}
list.Add(Contract_Tour.CreateElement(0,
Convert.ToInt32(row.Cells["ColumnTour"].Value),
row.Cells["ColumnStartDate"].Value.ToString(),
row.Cells["ColumnEndDate"].Value.ToString()
));
}
return list;
}
}
}

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ColumnTour.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnStartDate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumEndDate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,115 @@
namespace Travel_Agency.Forms
{
partial class FormContracts
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormContracts));
panel1 = new Panel();
ButtonDel = new Button();
ButtonAdd = new Button();
dataGridView = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.Controls.Add(ButtonDel);
panel1.Controls.Add(ButtonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(651, 0);
panel1.Name = "panel1";
panel1.Size = new Size(149, 450);
panel1.TabIndex = 3;
//
// ButtonDel
//
ButtonDel.BackgroundImage = (Image)resources.GetObject("ButtonDel.BackgroundImage");
ButtonDel.BackgroundImageLayout = ImageLayout.Stretch;
ButtonDel.Location = new Point(42, 169);
ButtonDel.Name = "ButtonDel";
ButtonDel.Size = new Size(65, 59);
ButtonDel.TabIndex = 5;
ButtonDel.UseVisualStyleBackColor = true;
ButtonDel.Click += ButtonDel_Click;
//
// ButtonAdd
//
ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage");
ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch;
ButtonAdd.Location = new Point(42, 38);
ButtonAdd.Name = "ButtonAdd";
ButtonAdd.Size = new Size(65, 59);
ButtonAdd.TabIndex = 3;
ButtonAdd.UseVisualStyleBackColor = true;
ButtonAdd.Click += ButtonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AllowUserToResizeColumns = false;
dataGridView.AllowUserToResizeRows = false;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Fill;
dataGridView.Location = new Point(0, 0);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(651, 450);
dataGridView.TabIndex = 4;
//
// FormContracts
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridView);
Controls.Add(panel1);
Name = "FormContracts";
StartPosition = FormStartPosition.CenterParent;
Text = "Договоры";
Load += FormContracts_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private DataGridView dataGridView;
private Button ButtonDel;
private Button ButtonAdd;
}
}

View File

@ -0,0 +1,88 @@

using Travel_Agency.Repositories;
using Unity;
namespace Travel_Agency.Forms
{
public partial class FormContracts : Form
{
private readonly IUnityContainer _container;
private readonly IContractRepository _contractRepository;
public FormContracts(IUnityContainer container, IContractRepository contractRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_contractRepository = contractRepository ??
throw new ArgumentNullException(nameof(contractRepository));
}
private void FormContracts_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridView.DataSource = _contractRepository.ReadContracts();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridView.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id =
Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
return true;
}
private void ButtonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление",
MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_contractRepository.DeleteContract(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormContract>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

@ -0,0 +1,299 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ButtonDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
UBMAAAAASUVORK5CYII=
</value>
</data>
<data name="ButtonAdd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@ -0,0 +1,121 @@
namespace Travel_Agency.Forms
{
partial class FormPayment
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
labelSum = new Label();
labelClient = new Label();
ButtonSave = new Button();
ButtonCencel = new Button();
numericUpDownSum = new NumericUpDown();
comboBoxClient = new ComboBox();
((System.ComponentModel.ISupportInitialize)numericUpDownSum).BeginInit();
SuspendLayout();
//
// labelSum
//
labelSum.AutoSize = true;
labelSum.Location = new Point(40, 43);
labelSum.Name = "labelSum";
labelSum.Size = new Size(117, 20);
labelSum.TabIndex = 0;
labelSum.Text = "Сумма оплаты :";
//
// labelClient
//
labelClient.AutoSize = true;
labelClient.Location = new Point(40, 95);
labelClient.Name = "labelClient";
labelClient.Size = new Size(65, 20);
labelClient.TabIndex = 1;
labelClient.Text = "Клиент :";
//
// ButtonSave
//
ButtonSave.Location = new Point(48, 197);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(94, 29);
ButtonSave.TabIndex = 2;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// ButtonCencel
//
ButtonCencel.Location = new Point(211, 197);
ButtonCencel.Name = "ButtonCencel";
ButtonCencel.Size = new Size(94, 29);
ButtonCencel.TabIndex = 3;
ButtonCencel.Text = "Отмена";
ButtonCencel.UseVisualStyleBackColor = true;
ButtonCencel.Click += ButtonCencel_Click;
//
// numericUpDownSum
//
numericUpDownSum.Location = new Point(195, 36);
numericUpDownSum.Maximum = new decimal(new int[] { 200000, 0, 0, 0 });
numericUpDownSum.Name = "numericUpDownSum";
numericUpDownSum.Size = new Size(150, 27);
numericUpDownSum.TabIndex = 4;
//
// comboBoxClient
//
comboBoxClient.FormattingEnabled = true;
comboBoxClient.Location = new Point(194, 92);
comboBoxClient.Name = "comboBoxClient";
comboBoxClient.Size = new Size(151, 28);
comboBoxClient.TabIndex = 5;
//
// FormPayment
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(387, 254);
Controls.Add(comboBoxClient);
Controls.Add(numericUpDownSum);
Controls.Add(ButtonCencel);
Controls.Add(ButtonSave);
Controls.Add(labelClient);
Controls.Add(labelSum);
Name = "FormPayment";
Text = "Оплата";
((System.ComponentModel.ISupportInitialize)numericUpDownSum).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelSum;
private Label labelClient;
private Button ButtonSave;
private Button ButtonCencel;
private NumericUpDown numericUpDownSum;
private ComboBox comboBoxClient;
}
}

View File

@ -0,0 +1,43 @@

using Travel_Agency.Entities;
using Travel_Agency.Repositories;
namespace Travel_Agency.Forms
{
public partial class FormPayment : Form
{
private readonly IPaymentRepository _paymentRepository;
public FormPayment(IClientRepository clientRepository, IPaymentRepository paymentRepository)
{
InitializeComponent();
_paymentRepository = paymentRepository ??
throw new
ArgumentNullException(nameof(paymentRepository));
comboBoxClient.DataSource = clientRepository.ReadClients();
comboBoxClient.DisplayMember = "Name";
comboBoxClient.ValueMember = "Id";
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (comboBoxClient.SelectedIndex < 0 || numericUpDownSum.Value == 0)
{
throw new Exception("Имеются незаполненные поля");
}
_paymentRepository.CreatePayment(Payment.CreateOperation(0,
(int)comboBoxClient.SelectedValue!,
Convert.ToInt32(numericUpDownSum.Value)));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCencel_Click(object sender, EventArgs e) => Close();
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,100 @@
namespace Travel_Agency.Forms
{
partial class FormPayments
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormPayments));
panel1 = new Panel();
ButtonAdd = new Button();
dataGridView = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.Controls.Add(ButtonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(651, 0);
panel1.Name = "panel1";
panel1.Size = new Size(149, 388);
panel1.TabIndex = 2;
//
// ButtonAdd
//
ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage");
ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch;
ButtonAdd.Location = new Point(40, 30);
ButtonAdd.Name = "ButtonAdd";
ButtonAdd.Size = new Size(65, 59);
ButtonAdd.TabIndex = 0;
ButtonAdd.UseVisualStyleBackColor = true;
ButtonAdd.Click += ButtonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AllowUserToResizeColumns = false;
dataGridView.AllowUserToResizeRows = false;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Fill;
dataGridView.Location = new Point(0, 0);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(651, 388);
dataGridView.TabIndex = 3;
//
// FormPayments
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 388);
Controls.Add(dataGridView);
Controls.Add(panel1);
Name = "FormPayments";
Text = "FormPayments";
Load += FormPayments_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button ButtonAdd;
private DataGridView dataGridView;
}
}

View File

@ -0,0 +1,50 @@

using Travel_Agency.Repositories;
using Unity;
namespace Travel_Agency.Forms
{
public partial class FormPayments : Form
{
private readonly IUnityContainer _container;
private readonly IPaymentRepository _paymentRepository;
public FormPayments(IUnityContainer container, IPaymentRepository paymentRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_paymentRepository = paymentRepository ??
throw new ArgumentNullException(nameof(paymentRepository));
}
private void FormPayments_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormPayment>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridView.DataSource = _paymentRepository.ReadPayments();
}
}

View File

@ -0,0 +1,229 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ButtonAdd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@ -0,0 +1,191 @@
namespace Travel_Agency.Forms
{
partial class FormRoute
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
labelName = new Label();
labelRating = new Label();
labelPlaces = new Label();
labelPrice = new Label();
labelTourId = new Label();
textBoxName = new TextBox();
textBoxPlaces = new TextBox();
numericUpDownRating = new NumericUpDown();
numericUpDownPrice = new NumericUpDown();
buttonSave = new Button();
buttonCancel = new Button();
comboBoxTour = new ComboBox();
((System.ComponentModel.ISupportInitialize)numericUpDownRating).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit();
SuspendLayout();
//
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(48, 52);
labelName.Name = "labelName";
labelName.Size = new Size(118, 20);
labelName.TabIndex = 0;
labelName.Text = "Название тура :";
//
// labelRating
//
labelRating.AutoSize = true;
labelRating.Location = new Point(48, 116);
labelRating.Name = "labelRating";
labelRating.Size = new Size(145, 20);
labelRating.TabIndex = 1;
labelRating.Text = "Рейтинг маршрута :";
//
// labelPlaces
//
labelPlaces.AutoSize = true;
labelPlaces.Location = new Point(48, 183);
labelPlaces.Name = "labelPlaces";
labelPlaces.Size = new Size(224, 20);
labelPlaces.TabIndex = 2;
labelPlaces.Text = "Места или города посещения :";
//
// labelPrice
//
labelPrice.AutoSize = true;
labelPrice.Location = new Point(48, 245);
labelPrice.Name = "labelPrice";
labelPrice.Size = new Size(164, 20);
labelPrice.TabIndex = 3;
labelPrice.Text = "Стоимость маршрута :";
//
// labelTourId
//
labelTourId.AutoSize = true;
labelTourId.Location = new Point(48, 311);
labelTourId.Name = "labelTourId";
labelTourId.Size = new Size(40, 20);
labelTourId.TabIndex = 4;
labelTourId.Text = "Тур :";
//
// textBoxName
//
textBoxName.Location = new Point(278, 45);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(293, 27);
textBoxName.TabIndex = 5;
//
// textBoxPlaces
//
textBoxPlaces.Location = new Point(278, 176);
textBoxPlaces.Name = "textBoxPlaces";
textBoxPlaces.Size = new Size(293, 27);
textBoxPlaces.TabIndex = 6;
//
// numericUpDownRating
//
numericUpDownRating.Location = new Point(278, 109);
numericUpDownRating.Name = "numericUpDownRating";
numericUpDownRating.Size = new Size(293, 27);
numericUpDownRating.TabIndex = 7;
//
// numericUpDownPrice
//
numericUpDownPrice.Location = new Point(278, 238);
numericUpDownPrice.Maximum = new decimal(new int[] { 200000, 0, 0, 0 });
numericUpDownPrice.Name = "numericUpDownPrice";
numericUpDownPrice.Size = new Size(150, 27);
numericUpDownPrice.TabIndex = 8;
numericUpDownPrice.Value = new decimal(new int[] { 1, 0, 0, 131072 });
//
// buttonSave
//
buttonSave.Location = new Point(129, 372);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(100, 41);
buttonSave.TabIndex = 10;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += ButtonSave_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(383, 372);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(110, 41);
buttonCancel.TabIndex = 11;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += ButtonCancel_Click;
//
// comboBoxTour
//
comboBoxTour.FormattingEnabled = true;
comboBoxTour.Location = new Point(278, 303);
comboBoxTour.Name = "comboBoxTour";
comboBoxTour.Size = new Size(151, 28);
comboBoxTour.TabIndex = 12;
//
// FormRoute
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(597, 444);
Controls.Add(comboBoxTour);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(numericUpDownPrice);
Controls.Add(numericUpDownRating);
Controls.Add(textBoxPlaces);
Controls.Add(textBoxName);
Controls.Add(labelTourId);
Controls.Add(labelPrice);
Controls.Add(labelPlaces);
Controls.Add(labelRating);
Controls.Add(labelName);
Name = "FormRoute";
StartPosition = FormStartPosition.CenterScreen;
Text = "Маршрут";
((System.ComponentModel.ISupportInitialize)numericUpDownRating).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelName;
private Label labelRating;
private Label labelPlaces;
private Label labelPrice;
private Label labelTourId;
private TextBox textBoxName;
private TextBox textBoxPlaces;
private NumericUpDown numericUpDownRating;
private NumericUpDown numericUpDownPrice;
private Button buttonSave;
private Button buttonCancel;
private ComboBox comboBoxTour;
}
}

View File

@ -0,0 +1,78 @@

using Travel_Agency.Entities;
using Travel_Agency.Repositories;
namespace Travel_Agency.Forms
{
public partial class FormRoute : Form
{
private readonly IRouteRepository _routeRepository;
private int? _routeId;
public int Id
{
set
{
try
{
var route = _routeRepository.ReadRouteById(value);
if (route == null)
{
throw new InvalidDataException(nameof(route));
}
textBoxName.Text = route.Name;
textBoxPlaces.Text = route.Places;
numericUpDownPrice.Value = route.Price;
numericUpDownRating.Value = route.Rating;
comboBoxTour.SelectedValue = route.TourId;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormRoute(IRouteRepository routeRepository, ITourRepository tourRepository)
{
InitializeComponent();
_routeRepository = routeRepository ??
throw new ArgumentNullException(nameof(routeRepository));
comboBoxTour.DataSource = tourRepository.ReadTours();
comboBoxTour.DisplayMember = "Name";
comboBoxTour.ValueMember = "Id";
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxName.Text) || string.IsNullOrWhiteSpace(textBoxPlaces.Text) || numericUpDownPrice.Value == 0)
{
throw new Exception("Имеются незаполненные поля");
}
if (_routeId.HasValue)
{
_routeRepository.UpdateRoute(CreateRoute(_routeId.Value));
}
else
{
_routeRepository.CreateRoute(CreateRoute(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCancel_Click(object sender, EventArgs e) => Close();
private Route CreateRoute(int id) => Route.CreateEntity(id, textBoxName.Text,
Convert.ToInt32(numericUpDownRating.Value), textBoxPlaces.Text,
Convert.ToInt32(numericUpDownPrice.Value),
(int)comboBoxTour.SelectedValue);
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,129 @@
namespace Travel_Agency.Forms
{
partial class FormRoutes
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormRoutes));
panel1 = new Panel();
ButtonDel = new Button();
ButtonUpd = new Button();
ButtonAdd = new Button();
dataGridView = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.Controls.Add(ButtonDel);
panel1.Controls.Add(ButtonUpd);
panel1.Controls.Add(ButtonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(651, 0);
panel1.Name = "panel1";
panel1.Size = new Size(149, 450);
panel1.TabIndex = 0;
//
// ButtonDel
//
ButtonDel.BackgroundImage = (Image)resources.GetObject("ButtonDel.BackgroundImage");
ButtonDel.BackgroundImageLayout = ImageLayout.Stretch;
ButtonDel.Location = new Point(55, 213);
ButtonDel.Name = "ButtonDel";
ButtonDel.Size = new Size(65, 59);
ButtonDel.TabIndex = 2;
ButtonDel.UseVisualStyleBackColor = true;
ButtonDel.Click += ButtonDel_Click;
//
// ButtonUpd
//
ButtonUpd.BackgroundImage = (Image)resources.GetObject("ButtonUpd.BackgroundImage");
ButtonUpd.BackgroundImageLayout = ImageLayout.Stretch;
ButtonUpd.Location = new Point(55, 121);
ButtonUpd.Name = "ButtonUpd";
ButtonUpd.Size = new Size(65, 59);
ButtonUpd.TabIndex = 1;
ButtonUpd.UseVisualStyleBackColor = true;
ButtonUpd.Click += ButtonUpd_Click;
//
// ButtonAdd
//
ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage");
ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch;
ButtonAdd.Location = new Point(55, 32);
ButtonAdd.Name = "ButtonAdd";
ButtonAdd.Size = new Size(65, 59);
ButtonAdd.TabIndex = 0;
ButtonAdd.UseVisualStyleBackColor = true;
ButtonAdd.Click += ButtonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AllowUserToResizeColumns = false;
dataGridView.AllowUserToResizeRows = false;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Fill;
dataGridView.Location = new Point(0, 0);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(651, 450);
dataGridView.TabIndex = 1;
//
// FormRoutes
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridView);
Controls.Add(panel1);
Name = "FormRoutes";
StartPosition = FormStartPosition.CenterParent;
Text = "Маршруты";
Load += FormRoutes_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button ButtonDel;
private Button ButtonUpd;
private Button ButtonAdd;
private DataGridView dataGridView;
}
}

View File

@ -0,0 +1,106 @@

using Travel_Agency.Repositories;
using Unity;
namespace Travel_Agency.Forms
{
public partial class FormRoutes : Form
{
private readonly IUnityContainer _container;
private readonly IRouteRepository _routeRepository;
public FormRoutes(IUnityContainer container, IRouteRepository routeRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_routeRepository = routeRepository ??
throw new ArgumentNullException(nameof(routeRepository));
}
private void FormRoutes_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormRoute>().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<FormRoute>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление",
MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_routeRepository.DeleteRoute(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridView.DataSource = _routeRepository.ReadRoutes();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridView.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id =
Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
return true;
}
}
}

View File

@ -0,0 +1,356 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ButtonDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
UBMAAAAASUVORK5CYII=
</value>
</data>
<data name="ButtonUpd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
qad27tz51Vdfzc7OyhsB5VkoW43sFStWSLAZNDQ0qP9+9NFHZ8+elbcAKjFd9q1bt95+++1ishm9/PLL
Kms5HsjGwjVbbWVpthI1rF999dUvv/xSjgQyM132999/v2nTJik31fr169XV/fLly3/++accDGRmtOw7
d+5MTk6uXLlS4i2jqampvb3922+/vXbtmhwJ5GT6mv3WW29Jv+UdOHDg66+/lgOAqhgtu1Ao7Nu3r3iv
I5FaIG+88Ya6tM/Pz8sxQFWMlv3rr7++8sorUvFSq1ev7ujo+OSTT7hdDS2Mlj0xMdHS0iIt36OxsVF9
s/jjjz/euHFDXgrUxlzZamCMjIyU/pmldevWffDBBz/99JO8DtDBXNlqPb///vuS811dXV3Dw8PyCkAf
c2WrpaE6XrZsWbHpJ5544vnnn7948SILBPVgruzF33189NFHV65cefz48dOnT8vnAN3MlT09PV28Wu/a
teuLL76QjwL1Ya7so0ePbty4cffu3TMzM/IhoG4Mlf3HH3989913AwMDV65ckQ8B9WTumv3zzz9funRJ
ngB1Zq5swCTKRpgoG2GibISJshEmykaYKBthomyEibIRooWF/wOJOuh6obV2FwAAAABJRU5ErkJggg==
</value>
</data>
<data name="ButtonAdd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@ -0,0 +1,143 @@
namespace Travel_Agency.Forms
{
partial class FormTour
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
labelName = new Label();
labelPrice = new Label();
textBoxName = new TextBox();
numericUpDownPrice = new NumericUpDown();
ButtonSave = new Button();
ButtonCencel = new Button();
labelTypeOfTour = new Label();
checkedListBoxType = new CheckedListBox();
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit();
SuspendLayout();
//
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(46, 51);
labelName.Name = "labelName";
labelName.Size = new Size(118, 20);
labelName.TabIndex = 0;
labelName.Text = "Название тура :";
//
// labelPrice
//
labelPrice.AutoSize = true;
labelPrice.Location = new Point(46, 115);
labelPrice.Name = "labelPrice";
labelPrice.Size = new Size(124, 20);
labelPrice.TabIndex = 1;
labelPrice.Text = "Стоимость тура :";
//
// textBoxName
//
textBoxName.Location = new Point(211, 44);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(172, 27);
textBoxName.TabIndex = 2;
//
// numericUpDownPrice
//
numericUpDownPrice.Location = new Point(211, 108);
numericUpDownPrice.Name = "numericUpDownPrice";
numericUpDownPrice.Size = new Size(172, 27);
numericUpDownPrice.TabIndex = 3;
//
// ButtonSave
//
ButtonSave.Location = new Point(60, 339);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(94, 29);
ButtonSave.TabIndex = 4;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// ButtonCencel
//
ButtonCencel.Location = new Point(255, 339);
ButtonCencel.Name = "ButtonCencel";
ButtonCencel.Size = new Size(94, 29);
ButtonCencel.TabIndex = 5;
ButtonCencel.Text = "Отмена";
ButtonCencel.UseVisualStyleBackColor = true;
ButtonCencel.Click += ButtonCencel_Click;
//
// labelTypeOfTour
//
labelTypeOfTour.AutoSize = true;
labelTypeOfTour.Location = new Point(46, 179);
labelTypeOfTour.Name = "labelTypeOfTour";
labelTypeOfTour.Size = new Size(76, 20);
labelTypeOfTour.TabIndex = 6;
labelTypeOfTour.Text = "Тип тура :";
//
// checkedListBoxType
//
checkedListBoxType.FormattingEnabled = true;
checkedListBoxType.Location = new Point(211, 179);
checkedListBoxType.Name = "checkedListBoxType";
checkedListBoxType.Size = new Size(172, 114);
checkedListBoxType.TabIndex = 7;
//
// FormTour
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(427, 414);
Controls.Add(checkedListBoxType);
Controls.Add(labelTypeOfTour);
Controls.Add(ButtonCencel);
Controls.Add(ButtonSave);
Controls.Add(numericUpDownPrice);
Controls.Add(textBoxName);
Controls.Add(labelPrice);
Controls.Add(labelName);
Name = "FormTour";
StartPosition = FormStartPosition.CenterParent;
Text = "Тур";
((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelName;
private Label labelPrice;
private TextBox textBoxName;
private NumericUpDown numericUpDownPrice;
private Button ButtonSave;
private Button ButtonCencel;
private Label labelTypeOfTour;
private CheckedListBox checkedListBoxType;
}
}

View File

@ -0,0 +1,92 @@

using Travel_Agency.Entities;
using Travel_Agency.Entities.Enums;
using Travel_Agency.Repositories;
namespace Travel_Agency.Forms
{
public partial class FormTour : Form
{
private readonly ITourRepository _tourRepository;
private int? _tourId;
public int Id
{
set
{
try
{
var tour = _tourRepository.ReadTourById(value);
if (tour == null)
{
throw new InvalidDataException(nameof(tour));
}
foreach (TypeOfTour elem in Enum.GetValues(typeof(TypeOfTour)))
{
if ((elem & tour.TypeOfTour) != 0)
{
checkedListBoxType.SetItemChecked(checkedListBoxType.Items.IndexOf(elem), true);
}
}
textBoxName.Text = tour.Name;
numericUpDownPrice.Value = tour.Price;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormTour(ITourRepository tourRepository)
{
InitializeComponent();
_tourRepository = tourRepository ??
throw new ArgumentNullException(nameof(tourRepository));
foreach (var elem in Enum.GetValues(typeof(TypeOfTour)))
{
checkedListBoxType.Items.Add(elem);
}
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxName.Text) || numericUpDownPrice.Value == 0 || checkedListBoxType.CheckedItems.Count == 0)
{
throw new Exception("Имеются незаполненные поля");
}
if (_tourId.HasValue)
{
_tourRepository.UpdateTour(CreateTour(_tourId.Value));
}
else
{
_tourRepository.CreateTour(CreateTour(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCencel_Click(object sender, EventArgs e) => Close();
private Tour CreateTour(int id)
{
TypeOfTour typeOfTour = TypeOfTour.None;
foreach (var elem in checkedListBoxType.CheckedItems)
{
typeOfTour |= (TypeOfTour)elem;
}
return Tour.CreateEntity(id, textBoxName.Text, typeOfTour, Convert.ToInt32(numericUpDownPrice.Value));
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,129 @@
namespace Travel_Agency.Forms
{
partial class FormTours
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormTours));
panel1 = new Panel();
ButtonDel = new Button();
ButtonUpd = new Button();
ButtonAdd = new Button();
dataGridView = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.Controls.Add(ButtonDel);
panel1.Controls.Add(ButtonUpd);
panel1.Controls.Add(ButtonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(651, 0);
panel1.Name = "panel1";
panel1.Size = new Size(149, 450);
panel1.TabIndex = 1;
//
// ButtonDel
//
ButtonDel.BackgroundImage = (Image)resources.GetObject("ButtonDel.BackgroundImage");
ButtonDel.BackgroundImageLayout = ImageLayout.Stretch;
ButtonDel.Location = new Point(55, 213);
ButtonDel.Name = "ButtonDel";
ButtonDel.Size = new Size(65, 59);
ButtonDel.TabIndex = 2;
ButtonDel.UseVisualStyleBackColor = true;
ButtonDel.Click += ButtonDel_Click;
//
// ButtonUpd
//
ButtonUpd.BackgroundImage = (Image)resources.GetObject("ButtonUpd.BackgroundImage");
ButtonUpd.BackgroundImageLayout = ImageLayout.Stretch;
ButtonUpd.Location = new Point(55, 121);
ButtonUpd.Name = "ButtonUpd";
ButtonUpd.Size = new Size(65, 59);
ButtonUpd.TabIndex = 1;
ButtonUpd.UseVisualStyleBackColor = true;
ButtonUpd.Click += ButtonUpd_Click;
//
// ButtonAdd
//
ButtonAdd.BackgroundImage = (Image)resources.GetObject("ButtonAdd.BackgroundImage");
ButtonAdd.BackgroundImageLayout = ImageLayout.Stretch;
ButtonAdd.Location = new Point(55, 32);
ButtonAdd.Name = "ButtonAdd";
ButtonAdd.Size = new Size(65, 59);
ButtonAdd.TabIndex = 0;
ButtonAdd.UseVisualStyleBackColor = true;
ButtonAdd.Click += ButtonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AllowUserToResizeColumns = false;
dataGridView.AllowUserToResizeRows = false;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Fill;
dataGridView.Location = new Point(0, 0);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.RowTemplate.Height = 29;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(651, 450);
dataGridView.TabIndex = 2;
//
// FormTours
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridView);
Controls.Add(panel1);
Name = "FormTours";
StartPosition = FormStartPosition.CenterParent;
Text = "Туры";
Load += FormTours_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button ButtonDel;
private Button ButtonUpd;
private Button ButtonAdd;
private DataGridView dataGridView;
}
}

View File

@ -0,0 +1,105 @@

using Travel_Agency.Repositories;
using Unity;
namespace Travel_Agency.Forms
{
public partial class FormTours : Form
{
private readonly IUnityContainer _container;
private readonly ITourRepository _tourRepository;
public FormTours(IUnityContainer container, ITourRepository tourRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_tourRepository = tourRepository ??
throw new ArgumentNullException(nameof(tourRepository));
}
private void FormTours_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormTour>().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<FormTour>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление",
MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_tourRepository.DeleteTour(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridView.DataSource = _tourRepository.ReadTours();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridView.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id =
Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
return true;
}
}
}

View File

@ -0,0 +1,356 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ButtonDel.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
UBMAAAAASUVORK5CYII=
</value>
</data>
<data name="ButtonUpd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
qad27tz51Vdfzc7OyhsB5VkoW43sFStWSLAZNDQ0qP9+9NFHZ8+elbcAKjFd9q1bt95+++1ishm9/PLL
Kms5HsjGwjVbbWVpthI1rF999dUvv/xSjgQyM132999/v2nTJik31fr169XV/fLly3/++accDGRmtOw7
d+5MTk6uXLlS4i2jqampvb3922+/vXbtmhwJ5GT6mv3WW29Jv+UdOHDg66+/lgOAqhgtu1Ao7Nu3r3iv
I5FaIG+88Ya6tM/Pz8sxQFWMlv3rr7++8sorUvFSq1ev7ujo+OSTT7hdDS2Mlj0xMdHS0iIt36OxsVF9
s/jjjz/euHFDXgrUxlzZamCMjIyU/pmldevWffDBBz/99JO8DtDBXNlqPb///vuS811dXV3Dw8PyCkAf
c2WrpaE6XrZsWbHpJ5544vnnn7948SILBPVgruzF33189NFHV65cefz48dOnT8vnAN3MlT09PV28Wu/a
teuLL76QjwL1Ya7so0ePbty4cffu3TMzM/IhoG4Mlf3HH3989913AwMDV65ckQ8B9WTumv3zzz9funRJ
ngB1Zq5swCTKRpgoG2GibISJshEmykaYKBthomyEibIRooWF/wOJOuh6obV2FwAAAABJRU5ErkJggg==
</value>
</data>
<data name="ButtonAdd.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -1,3 +1,7 @@
using Travel_Agency.Repositories;
using Travel_Agency.Repositories.Implementations;
using Unity;
namespace Travel_Agency
{
internal static class Program
@ -11,7 +15,20 @@ namespace Travel_Agency
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
Application.Run(CreateContainer().Resolve<FormTravel_Agency>());
}
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
container.RegisterType<IClientRepository, ClientRepository>();
container.RegisterType<ITourRepository, TourRepository>();
container.RegisterType<IContractRepository, ContractRepository>();
container.RegisterType<IRouteRepository, RouteRepository>();
container.RegisterType<IPaymentRepository, PaymentRepository>();
return container;
}
}
}

View File

@ -0,0 +1,73 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Travel_Agency.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом 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() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Travel_Agency.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Picture_Travel_Agency {
get {
object obj = ResourceManager.GetObject("Picture_Travel_Agency", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Picture_Travel_Agency" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Picture_Travel_Agency.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@ -0,0 +1,13 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories;
public interface IClientRepository
{
IEnumerable<Client> ReadClients();
Client ReadClientById(int id);
void CreateClient(Client client);
void UpdateClient(Client client);
void DeleteClientById(int id);
}

View File

@ -0,0 +1,11 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories;
public interface IContractRepository
{
IEnumerable<Contract> ReadContracts(DateTime? dateFrom = null, DateTime? dateTo = null, int? clientId = null);
void DeleteContract(int id);
void CreateContract(Contract contract);
}

View File

@ -0,0 +1,10 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories;
public interface IPaymentRepository
{
IEnumerable<Payment> ReadPayments(DateTime? dateFrom = null, DateTime? dateTo = null, int? clientId = null);
void CreatePayment(Payment payment);
}

View File

@ -0,0 +1,14 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories;
public interface IRouteRepository
{
IEnumerable<Route> ReadRoutes();
Route ReadRouteById(int id);
void CreateRoute(Route route);
void UpdateRoute(Route route);
void DeleteRoute(int id);
}

View File

@ -0,0 +1,14 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories;
public interface ITourRepository
{
IEnumerable<Tour> ReadTours();
Tour ReadTourById(int id);
void CreateTour(Tour tour);
void UpdateTour(Tour tour);
void DeleteTour(int id);
}

View File

@ -0,0 +1,29 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories.Implementations;
public class ClientRepository : IClientRepository
{
public void CreateClient(Client client)
{
}
public void DeleteClientById(int id)
{
}
public Client ReadClientById(int id)
{
return Client.CreateEntity(0, string.Empty, string.Empty, 0);
}
public IEnumerable<Client> ReadClients()
{
return [];
}
public void UpdateClient(Client client)
{
}
}

View File

@ -0,0 +1,20 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories.Implementations;
public class ContractRepository : IContractRepository
{
public void CreateContract(Contract contract)
{
}
public void DeleteContract(int id)
{
}
public IEnumerable<Contract> ReadContracts(DateTime? dateFrom = null, DateTime? dateTo = null, int? clientId = null)
{
return [];
}
}

View File

@ -0,0 +1,16 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories.Implementations;
public class PaymentRepository : IPaymentRepository
{
public void CreatePayment(Payment payment)
{
}
public IEnumerable<Payment> ReadPayments(DateTime? dateFrom = null, DateTime? dateTo = null, int? clientId = null)
{
return [];
}
}

View File

@ -0,0 +1,29 @@

using Travel_Agency.Entities;
namespace Travel_Agency.Repositories.Implementations;
public class RouteRepository : IRouteRepository
{
public void CreateRoute(Route route)
{
}
public void DeleteRoute(int id)
{
}
public Route ReadRouteById(int id)
{
return Route.CreateEntity(0, string.Empty, 0, string.Empty, 0, 0);
}
public IEnumerable<Route> ReadRoutes()
{
return [];
}
public void UpdateRoute(Route route)
{
}
}

View File

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Travel_Agency.Entities;
using Travel_Agency.Entities.Enums;
namespace Travel_Agency.Repositories.Implementations;
public class TourRepository : ITourRepository
{
public void CreateTour(Tour tour)
{
}
public void DeleteTour(int id)
{
}
public Tour ReadTourById(int id)
{
return Tour.CreateEntity(0, string.Empty, TypeOfTour.None, 0);
}
public IEnumerable<Tour> ReadTours()
{
return [];
}
public void UpdateTour(Tour tour)
{
}
}

View File

@ -6,6 +6,26 @@
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>preview</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Unity" Version="5.11.10" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>