- •Нижегородский государственный технический университет им. Р.Е. Алексеева» (нгту)
- •Пояснительная записка
- •Введение
- •1. Анализ исходных данных и разработка технического задания
- •1.1. Исследование предметной области
- •1.2.5. Выбор и обоснование способа хранения данных
- •1.2.6. Выбор и обоснование средств разработки
- •1.2.7. Выбор средства представления данных
- •2. Разработка информационной системы
- •2.1. Разработка модели предметной области и архитектуры системы
- •2.2. Распределение обязанностей классов системы
- •2.2.1. Применение принципа единственной ответственности (spr)
- •2.2.2. Разработка основной диаграммы классов системы
- •2.3. Моделирование взаимодействия объектов
- •3. Тестирование системы
- •3.1 Разработка тестового комплекта
- •4. Руководство пользователя
- •Заключение
- •Приложение ContrBd - Код контроллера
Приложение ContrBd - Код контроллера
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.IO;
using System.Diagnostics;
namespace Administrator
{
// Класс для доступа к БД(XML)
public class ContrBD
{
private string source;
// Конструктор с параметром (источник данных).
public ContrBD(string source)
{
this.source = source;
LoadFromFile();
}
// Список этажей, полученный из БД.
public List<List<Room>> Floor { get; set; }
// Список гостей из БД.
public List<Guest> Guests { get; set; }
// Загружает данные из БД source.
public void LoadFromFile()
{
XmlDocument doc = new XmlDocument();
doc.Load(source);
Floor = new List<List<Room>>();
Guests = new List<Guest>();
foreach(XmlNode floorNode in doc.ChildNodes[1].ChildNodes)
{
List<Room> floor = new List<Room>();
foreach (XmlNode roomNode in floorNode.ChildNodes)
{
int number = Int32.Parse(roomNode.ChildNodes[0].InnerText);
string _class = roomNode.ChildNodes[1].InnerText;
int capacity = Int32.Parse(roomNode.ChildNodes[2].InnerText);
double price = Double.Parse(roomNode.ChildNodes[3].InnerText);
bool isEmpty = Boolean.Parse(roomNode.ChildNodes[4].InnerText);
Room room = new Room(number, _class, capacity, price);
floor.Add(room);
if (!isEmpty)
{
List<Guest> curRoomGuests = new List<Guest>();
foreach (XmlNode guestNode in roomNode.ChildNodes[5].ChildNodes)
{
string name = guestNode.ChildNodes[0].InnerText;
string surName = guestNode.ChildNodes[1].InnerText;
21
string pasport = guestNode.ChildNodes[2].InnerText;
DateTime enter = DateTime.Parse(guestNode.ChildNodes[3].InnerText);
DateTime leave = DateTime.Parse(guestNode.ChildNodes[4].InnerText);
Guest guest = new Guest(name, surName, pasport);
guest.Room = number;
guest.Enter = enter;
guest.Leave = leave;
curRoomGuests.Add(guest);
}
Guests.AddRange(curRoomGuests);
room.SettleGuests(curRoomGuests);
}
}
Floor.Add(floor);
}
}
// Сохраняет изменения в БД.
public void SaveToFile()
{
XmlDocument doc = new XmlDocument();
doc.Load(source);
doc.RemoveChild(doc.ChildNodes[1]);
XmlNode hotelNode = doc.CreateElement("hotel");
foreach (List<Room> floor in Floor)
{
XmlNode floorNode = doc.CreateElement("floor");
foreach(Room room in floor)
{
XmlNode roomNode = doc.CreateElement("room");
XmlNode numberNode = doc.CreateElement("number");
numberNode.InnerText = room.Number.ToString();
roomNode.AppendChild(numberNode);
XmlNode classNode = doc.CreateElement("class");
classNode.InnerText = room.Class.ToString();
roomNode.AppendChild(classNode);
XmlNode capacityNode = doc.CreateElement("capacity");
capacityNode.InnerText = room.Capacity.ToString();
roomNode.AppendChild(capacityNode);
XmlNode priceNode = doc.CreateElement("price");
priceNode.InnerText = room.PricePerDay.ToString();
roomNode.AppendChild(priceNode);
XmlNode isEmptyNode = doc.CreateElement("isempty");
isEmptyNode.InnerText = room.IsEmpty.ToString();
roomNode.AppendChild(isEmptyNode);
XmlNode guestsNode = doc.CreateElement("guests");
if (!room.IsEmpty)
{
foreach(Guest guest in room.GuestList)
{
XmlNode guestNode = doc.CreateElement("guest");
XmlNode nameNode = doc.CreateElement("name");
nameNode.InnerText = guest.Name;
guestNode.AppendChild(nameNode);
22
XmlNode surNameNode = doc.CreateElement("surname");
surNameNode.InnerText = guest.SurName;
guestNode.AppendChild(surNameNode);
XmlNode pasportNode = doc.CreateElement("pasport");
pasportNode.InnerText = guest.Pasport;
guestNode.AppendChild(pasportNode);
XmlNode enterNode = doc.CreateElement("enter");
enterNode.InnerText = guest.Enter.ToShortDateString();
guestNode.AppendChild(enterNode);
XmlNode leaveNode = doc.CreateElement("leave");
leaveNode.InnerText = guest.Leave.ToShortDateString();
guestNode.AppendChild(leaveNode);
guestsNode.AppendChild(guestNode);
}
}
roomNode.AppendChild(guestsNode);
floorNode.AppendChild(roomNode);
}
hotelNode.AppendChild(floorNode);
}
doc.AppendChild(hotelNode);
doc.Save(source);
}
}
}
AddGuestsForm.cs – форма заселения гостей
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Administrator
{
// Форма заселения гостей.
public partial class AddGuestsForm : Form
{
Guests guests;
// Конструктор.
public AddGuestsForm(Guests g)
{
guests = g;
InitializeComponent();
datePicker.MinDate = DateTime.Today.AddDays(1);
}
// Обработчики событий.
private void addGuestButton_Click(object sender, EventArgs e)
{
guestsToAdd.Rows.Add();
}
23
private void guestsToAdd_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 3)
{
guestsToAdd.Rows.RemoveAt(e.RowIndex);
}
}
private void roomNumberTextBox_TextChanged(object sender, EventArgs e)
{
errorProvider.SetError(roomNumberTextBox, null);
}
private void guestsToAdd_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (guestsToAdd.Rows.Count == 0)
{
return;
}
guestsToAdd.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = null;
}
private void submitButton_Click(object sender, EventArgs e)
{
//проверка номера дома
string text = roomNumberTextBox.Text;
int number;
string name, surname, pasport;
if (text == "")
{
errorProvider.SetError(roomNumberTextBox, "Заполните это поле.");
return;
}
if (Int32.TryParse(text, out number) == false || number <= 0)
{
errorProvider.SetError(roomNumberTextBox, "Введите положительное число не
больше миллиарда.");
return;
}
//проверка присутствия хоть 1 гостя
if (guestsToAdd.Rows.Count == 0)
{
MessageBox.Show("Добавьте как минимум одного гостя.",
"Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
List<Guest> guestList = new List<Guest>();
//проверка и парсинг списка гостей
foreach (DataGridViewRow row in guestsToAdd.Rows)
{
name = row.Cells[0].EditedFormattedValue.ToString();
surname = row.Cells[1].EditedFormattedValue.ToString();
pasport = row.Cells[2].EditedFormattedValue.ToString();
if (name == "")
{
row.Cells[0].ErrorText = "Заполните это поле.";
return;
}
if (surname == "")
24
{
row.Cells[1].ErrorText = "Заполните это поле.";
return;
}
//в номере могут быть скобки, дефисы, плюс и т.д. поэтому проверить очень
ложно
if (pasport == "")
{
row.Cells[2].ErrorText = "Заполните это поле.";
return;
}
guestList.Add(new Guest(name, surname, pasport));
}
try
{
DateTime date = new DateTime(datePicker.Value.Year, datePicker.Value.Month,
datePicker.Value.Day);
guests.SettleGuests(number, date, guestList);
MessageBox.Show($"Гости успешно добавлены в комнату {number}.\nПодробная
информация содержится в квитанции.",
"Заселение успешно",
MessageBoxButtons.OK, MessageBoxIcon.Information);
this.DialogResult = DialogResult.OK;
}
catch (Exception exc)
{
errorProvider.SetError(roomNumberTextBox, null);
MessageBox.Show(exc.Message,
"Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
DeleteGuestsForm.cs – форма выселения гостей из комнаты
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Administrator
{
// Форма выселения гостей из комнаты.
public partial class DeleteGuestsForm : Form
{
private Guests guests;
private Hotel hotel;
public DeleteGuestsForm(Guests g, Hotel h)
{
InitializeComponent();
hotel = h;
guests = g;
}
25
private void deleteButton_Click(object sender, EventArgs e)
{
string text = roomNumberTextBox.Text;
int number;
if (text == "")
{
errorProvider.SetError(roomNumberTextBox, "Заполните это поле.");
return;
}
if (Int32.TryParse(text, out number) == false || number <= 0)
{
errorProvider.SetError(roomNumberTextBox, "Введите положительное число не
больше миллиарда.");
return;
}
// Должны ли гости были выехать сегодня или нет.
//Если комната свободная/не найдена, спокойно вызываем метод выселения, он
выкинет эксепшн.
bool isDateEqualToLeave;
Room room = hotel.FindRoomByNumber(number);
if (room == null || room.IsEmpty || room.DateLeave == DateTime.Today)
{
isDateEqualToLeave = true;
}
else
{
isDateEqualToLeave = false;
}
if (isDateEqualToLeave == false)
{
DialogResult result = MessageBox.Show(
"Текущая дата не совпадает с запланированной датой отъезда."+
"\nЕсли гости решили изменить дату отъезда, воспользуйтесь функцией
\"Изменить дату отъезда\" с выпиской новой квитанции."+
"\n\nЕсли вы действительно хотите удалить гостей из комнаты вне плана,
нажмите ОК. Новая квитанция при этом выписана не будет.",
"Подтверждение операции",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning);
if (result == DialogResult.Cancel)
{
errorProvider.SetError(roomNumberTextBox, null);
return;
}
}
else
{
DialogResult result = MessageBox.Show($"Вы уверены, что хотите выселить
гостей из комнаты {number}?",
"Подтверждение операции",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (result == DialogResult.No)
{
errorProvider.SetError(roomNumberTextBox, null);
return;
}
26
}
try
{
guests.UnsettleGuests(number);
MessageBox.Show($"Комната {number} успешно освобождена.",
"Выселение успешно",
MessageBoxButtons.OK, MessageBoxIcon.Information);
this.DialogResult = DialogResult.OK;
}
catch (Exception exc)
{
errorProvider.SetError(roomNumberTextBox, null);
MessageBox.Show(exc.Message,
"Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
FindGuestsForm.cs - форма поиска гостей
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Administrator
{
// Форма поиска гостей.
public partial class FindGuestsForm : Form
{
private Guests guests;
public FindGuestsForm(Guests g)
{
guests = g;
InitializeComponent();
}
// Удаление предупреждения при изменении текста.
private void textBox_TextChanged(object sender, EventArgs e)
{
TextBox target = sender as TextBox;
errorProvider.SetError(target, null);
}
// Формирование запроса на поиск.
private void findButton_Click(object sender, EventArgs e)
{
// Флаг, все ли поля формы верны.
bool flag = true;
if (nameCheckBox.Checked && nameTextBox.Text == "")
{
flag = false;
27
errorProvider.SetError(nameTextBox, "Заполните или деактивируйте поле.");
}
if (surNameCheckBox.Checked && surNameTextBox.Text == "")
{
flag = false;
errorProvider.SetError(surNameTextBox, "Заполните или деактивируйте поле.");
}
if (pasportCheckBox.Checked && pasportTextBox.Text == "")
{
flag = false;
errorProvider.SetError(pasportTextBox, "Заполните или деактивируйте поле.");
}
if (flag == false)
return;
//проверка чекбоксов, составление критерия
string criteria = "";
criteria += nameCheckBox.Checked ? "Y" : "N";
criteria += surNameCheckBox.Checked ? "Y" : "N";
criteria += pasportCheckBox.Checked ? "Y" : "N";
criteria += enterCheckBox.Checked ? "Y" : "N";
criteria += leaveCheckBox.Checked ? "Y" : "N";
try
{
DateTime enter = new DateTime(enterDatePicker.Value.Year,
enterDatePicker.Value.Month, enterDatePicker.Value.Day);
DateTime leave = new DateTime(leaveDatePicker.Value.Year,
leaveDatePicker.Value.Month, leaveDatePicker.Value.Day);
IReadOnlyList<Guest> foundGuests = guests.FindGuests(criteria,
nameTextBox.Text,
surNameTextBox.Text,
pasportTextBox.Text,
enter,
leave);
showResult(foundGuests);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message,
"Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void showResult(IReadOnlyList<Guest> foundGuests)
{
if (foundGuests.Count == 0)
{
nothingFound.Visible = true;
}
else
{
nothingFound.Visible = false;
}
searchResult.Rows.Clear();
foreach (Guest guest in foundGuests)
{
searchResult.Rows.Add(new object[] { guest.Name,
guest.SurName,
guest.Pasport,
28
guest. Room,
guest.Enter.ToShortDateString(),
guest.Leave.ToShortDateString() });
}
}
// Включение/отключение параметра поиска.
private void checkBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox target = sender as CheckBox;
switch (target.Name)
{
case "nameCheckBox":
{
nameTextBox.Enabled = !nameTextBox.Enabled;
errorProvider.SetError(nameTextBox, null);
break;
}
case "surNameCheckBox":
{
surNameTextBox.Enabled = !surNameTextBox.Enabled;
errorProvider.SetError(surNameTextBox, null);
break;
}
case "pasportCheckBox":
{
pasportTextBox.Enabled = !pasportTextBox.Enabled;
errorProvider.SetError(pasportTextBox, null);
break;
}
case "enterCheckBox":
{
enterDatePicker.Enabled = !enterDatePicker.Enabled;
errorProvider.SetError(enterDatePicker, null);
break;
}
case "leaveCheckBox":
{
leaveDatePicker.Enabled = !leaveDatePicker.Enabled;
errorProvider.SetError(leaveDatePicker, null);
break;
}
}
}
}
}
FindRoomForm - форма поиска комнаты
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Administrator
{
29
// Форма поиска комнаты.
public partial class FindRoomForm : Form
{
private Hotel hotel;
private string _class;
private int capacity;
private double pricePerDay;
public FindRoomForm(Hotel h)
{
hotel = h;
InitializeComponent();
datePicker.MinDate = DateTime.Today;
}
// Валидаторы полей.
private string classTextBox_Validate()
{
_class = classTextBox.Text;
if (_class == "")
{
return "Заполните это поле";
}
return "";
}
private string capacityTextBox_Validate()
{
if (capacityTextBox.Text == "")
{
return "Заполните это поле";
}
if (!Int32.TryParse(capacityTextBox.Text, out capacity) || capacity <= 0)
{
return "Введите положительное число меньше миллиарда";
}
return "";
}
private string priceTextBox_Validate()
{
if (priceTextBox.Text == "")
{
return "Заполните это поле";
}
if (!Double.TryParse(priceTextBox.Text, out pricePerDay) || pricePerDay < 0)
{
return "Введите неотрицательное число меньше миллиарда";
}
return "";
}
// Удаление предупреждения при изменении текста.
private void textBox_TextChanged(object sender, EventArgs e)
{
TextBox target = sender as TextBox;
if (target == priceTextBox)
{
errorProvider.SetError(priceLabel1, null);
}
30
else
{
errorProvider.SetError(target, null);
}
}
// Формирование запроса на поиск.
private void findButton_Click(object sender, EventArgs e)
{
//проверка всех полей формы
string result;
//флаг, все ли поля формы верны
bool flag = true;
if (classCheckBox.Checked && (result = classTextBox_Validate()) != "")
{
flag = false;
errorProvider.SetError(classTextBox, result);
}
if (capacityCheckBox.Checked && (result = capacityTextBox_Validate()) != "")
{
flag = false;
errorProvider.SetError(capacityTextBox, result);
}
if (priceCheckBox.Checked && (result = priceTextBox_Validate()) != "")
{
flag = false;
errorProvider.SetError(priceLabel1, result);
}
if (flag == false)
return;
//проверка чекбоксов, составление критерия
string criteria = "";
criteria += classCheckBox.Checked ? "Y" : "N";
criteria += capacityCheckBox.Checked ? "Y" : "N";
criteria += priceCheckBox.Checked ? "Y" : "N";
try
{
DateTime date = new DateTime(datePicker.Value.Year, datePicker.Value.Month,
datePicker.Value.Day);
IReadOnlyList<Room> foundRoom = hotel.FindEmptyRoom(criteria,
_class,
capacity,
pricePerDay,
date);
showResult(foundRoom);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message,
"Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void showResult(IReadOnlyList<Room> foundRoom)
{
if (foundRoom.Count == 0)
{
nothingFound.Visible = true;
}
31
else
{
nothingFound.Visible = false;
}
searchResult.Rows.Clear();
foreach (Room room in foundRoom)
{
searchResult.Rows.Add(new object[] { room.Number,
room.Class,
room.Capacity,
room.PricePerDay,
room.IsEmpty,
room.IsEmpty ? null : room.DateLeave.ToShortDateString() });
}
}
// Включение/отключение параметра поиска.
private void checkBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox target = sender as CheckBox;
switch (target.Name)
{
case "classCheckBox":
{
classTextBox.Enabled = !classTextBox.Enabled;
errorProvider.SetError(classTextBox, null);
break;
}
case "capacityCheckBox":
{
capacityTextBox.Enabled = !capacityTextBox.Enabled;
errorProvider.SetError(capacityTextBox, null);
break;
}
case "priceCheckBox":
{
priceTextBox.Enabled = !priceTextBox.Enabled;
errorProvider.SetError(priceLabel1, null);
break;
}
}
}
}
}
ChangeLeaveForm – форма изменения даты отъезда гостей.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Administrator
{
// Форма изменения даты отъезда гостей.
public partial class ChangeLeaveForm : Form
{
32
private Guests guests;
// Конструктор.
public ChangeLeaveForm(Guests g)
{
InitializeComponent();
guests = g;
leaveDatePicker.MinDate = DateTime.Today;
}
private void submitButton_Click(object sender, EventArgs e)
{
string text = roomNumberTextBox.Text;
int number;
if (text == "")
{
errorProvider.SetError(roomNumberTextBox, "Заполните это поле.");
return;
}
if (Int32.TryParse(text, out number) == false || number <= 0)
{
errorProvider.SetError(roomNumberTextBox, "Введите положительное число не
больше миллиарда.");
return;
}
try
{
DateTime date = new DateTime(leaveDatePicker.Value.Year,
leaveDatePicker.Value.Month, leaveDatePicker.Value.Day);
guests.ChangeLeaveDate(number, date);
MessageBox.Show($"Дата отъезда гостей из номера {number} изменена на
{leaveDatePicker.Value.ToShortDateString()}.\nНовая квитанция выписана.",
"Изменение успешно",
MessageBoxButtons.OK, MessageBoxIcon.Information);
this.DialogResult = DialogResult.OK;
}
catch (Exception exc)
{
errorProvider.SetError(roomNumberTextBox, null);
MessageBox.Show(exc.Message,
"Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
Guest-класс гостя поселка
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Administrator
{
// Класс гостя отеля.
public class Guest
33
{
private DateTime leave;
// Конструктор.
public Guest(string name, string surname, string pasport)
{
if (name == "" || surname == "")
{
throw new ArgumentException("Имя и фамилия не могут быть пустыми.");
}
Name = name;
SurName = surname;
Pasport = pasport;
}
// Имя.
public string Name { get; private set; }
// Фамилия.
public string SurName { get; private set; }
// Номер паспорта.
public string Pasport { get; private set; }
// Номер комнаты проживания.
public int Room { get; set; }
// Дата заселения.
public DateTime Enter { get; set; }
// Дата отъезда.
public DateTime Leave
{
get
{
return leave;
}
set
{
if (value < Enter.AddDays(1))
{
throw new ArgumentException($"Дата выезда должна быть позже даты въезда
({Enter.ToShortDateString()}).");
}
leave = value;
}
}
// Размещение гостя в комнате.
public void Settle(int room, DateTime leave)
{
if (leave <= DateTime.Today)
{
throw new ArgumentOutOfRangeException("Дата отъезда должна быть позже
текущей.");
};
Room = room;
Enter = DateTime.Today;
Leave = leave;
}
}
}
34
Guests - класс управления гостями отеля
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Administrator
{
// Класс управления гостями отеля.
public class Guests
{
// Сслыка на гостинницу.
public readonly Hotel hotel;
private List<Guest> guestList = new List<Guest>();
// Конструктор.
public Guests(Hotel h, ContrBD contrBD)
{
hotel = h;
guestList = contrBD.Guests;
}
// Список гостей только для чтения.
public IReadOnlyList<Guest> GuestList
{
get
{
return guestList.AsReadOnly();
}
}
// Количество гостей в гостиннице в данный момент.
public int GuestNumber
{
get
{
return guestList.Count;
}
}
// Количество гостей, выезжающих из гостинницы сегодня.
public int TodayLeaveNumber
{
get
{
return FindGuests("NNNNY", null, null, null, new DateTime(),
DateTime.Today).Count;
}
}
// Размещение гостей в комнате.
public void SettleGuests(int roomNumber, DateTime leave, List<Guest> guests)
{
// В дом нужно передать уже готовых гостей с датой отъезда, поэтому сначала
делаем гостей, потом комнату.
Room room = hotel.FindRoomByNumber(roomNumber);
if (room == null)
{
throw new ArgumentException(String.Format("Комнаты с номером {0} не
существует.", roomNumber));
}
35
foreach (Guest curGuest in guests)
{
curGuest.Settle(roomNumber, leave);
}
room.SettleGuests(guests);
guestList.AddRange(guests);
try
{
Invoice.AddSettleInvoice(room);
}
catch
{
throw new Exception("Произошла ошибка при создании квитанции.");
}
}
// Выселение гостей из комнаты.
public void UnsettleGuests(int roomNumber)
{
Room room = hotel.FindRoomByNumber(roomNumber);
if (room == null)
{
throw new ArgumentOutOfRangeException(String.Format("Комнаты с номером {0}
не существует.", roomNumber));
}
foreach (Guest guest in room.GuestList)
{
guestList.Remove(guest);
}
room.MakeEmpty();
}
// Поиск гостей по ряду параметров.
public IReadOnlyList<Guest> FindGuests(string criteria/*"YYYYY"*/, string name,
string surname, string pasport, DateTime enter, DateTime leave)
{
if (criteria.Length != 5)
{
throw new ArgumentException();
}
List<Guest> Result = new List<Guest>();
foreach (Guest guest in guestList)
{
if (criteria[0] == 'Y' && guest.Name != name)//не подходит имя
continue;
if (criteria[1] == 'Y' && guest.SurName != surname)//не подходит фамилия
continue;
if (criteria[2] == 'Y' && guest.Pasport != pasport)//не подходит Паспорт
continue;
if (criteria[3] == 'Y' && guest.Enter.ToShortDateString() !=
enter.ToShortDateString())//не подходит день въезда
continue;
if (criteria[4] == 'Y' && guest.Leave.ToShortDateString() !=
leave.ToShortDateString())//не подходит день выезда
continue;
Result.Add(guest);
}
return Result.AsReadOnly();
}
36
// Изменить дату отъезда гостей данной комнаты.
public void ChangeLeaveDate(int roomNumber, DateTime newDate)
{
Room room = hotel.FindRoomByNumber(roomNumber);
if (room == null)
{
throw new ArgumentException($"Комнаты с номером {roomNumber} не
существует.");
}
if (room.IsEmpty)
{
throw new InvalidOperationException($"В данной комнате {roomNumber}
отсутствуют гости.");
}
if (newDate == room.DateLeave)
{
throw new ArgumentException("Новая дата отъезда не должна совпадать с
текущей.");
}
if (newDate < DateTime.Today)
{
throw new ArgumentException("Дата уже прошла.");
}
DateTime oldLeave = room.DateLeave;
room.DateLeave = newDate;
try
{
Invoice.AddReSettleInvoice(room, oldLeave);
}
catch
{
throw new Exception("Произошла ошибка при создании квитанции.");
}
}
}
}
Hotel - класс отеля
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace Administrator
{
// Класс комнаты.
public class Room
{
private List<Guest> guestList = new List<Guest>();
// Конструктор.
public Room(int number, string _class, int capacity, double price)
{
if (number <= 0 || _class == "" || capacity <= 0 || price < 0)
{
throw new ArgumentException("Неправильный формат данных");
}
37
Number = number;
IsEmpty = true;
Class = _class;
Capacity = capacity;
PricePerDay = price;
}
// Номер комнаты.
public int Number { get; private set; }
// Дата освобождения.
public DateTime DateLeave
{
get
{
if (IsEmpty)
{
throw new InvalidOperationException("Комната свободна.");
}
return guestList[0].Leave;
}
set
{
if (IsEmpty)
{
throw new InvalidOperationException("Комната свободна");
}
foreach (Guest guest in guestList)
{
guest.Leave = value;
}
}
}
// Пустая ли комната.
public bool IsEmpty { get; private set; }
// Класс комнаты.
public string Class { get; private set; }
// Емкость (количество мест).
public int Capacity { get; private set; }
// Цена за сутки.
public double PricePerDay { get; private set; }
// Коллекция гостей, находящихся в данный момент в комнате.
public IReadOnlyList<Guest> GuestList
{
get
{
return guestList.AsReadOnly();
}
}
// Количество гостей, находящихся в данный момент в комнате.
public int NumberOfGuests
{
get
{
return guestList.Count;
}
38
}
// Освободить дом.
public void MakeEmpty()
{
if (IsEmpty)
{
throw new InvalidOperationException("Комната пуста.");
}
IsEmpty = true;
guestList.Clear();
}
// Разместить гостей в комнате.
public void SettleGuests(List<Guest> guests)
{
if (guests.Count == 0)
{
throw new InvalidOperationException("Ошибка добавления. Необходимо передать
как минимум одного гостя.");
}
if (guests.Count > Capacity)
{
throw new InvalidOperationException(String.Format("Ошибка добавления.
В данную комнату можно добавить не более {0} гостей.", Capacity));
}
if (IsEmpty == false)
{
throw new InvalidOperationException("Ошибка добавления. Комната занята.");
}
guestList = guests;
IsEmpty = false;
}
}