Добавил:
выбрасываю тут свой мусор, надеюсь, что он кому-то может пригодится... Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ по ООП Аронова 22ИСТ2.docx
Скачиваний:
27
Добавлен:
03.12.2023
Размер:
8.48 Mб
Скачать

Приложение 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;

}

}

Соседние файлы в предмете Объектно-ориентированное программирование