diff --git a/OpheliasOasis/Managers/Hotel.cs b/OpheliasOasis/Managers/Hotel.cs index f40e18e..281b0d0 100644 --- a/OpheliasOasis/Managers/Hotel.cs +++ b/OpheliasOasis/Managers/Hotel.cs @@ -37,7 +37,7 @@ namespace Ophelias.Managers cmd.CommandText = "SELECT RoomNum, Lname, Fname, EndDate FROM reservations " + "INNER JOIN guests ON reservations.GuestID = guests.ID " + "INNER JOIN rooms ON reservations.RoomNum = rooms.ID " + - "WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status IN (@Status1,@Status2);"; + "WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status IN (@Status1,@Status2) AND CheckIn IS NOT NULL;"; cmd.Parameters.AddWithValue("@Date", DateTime.Now.Date.ToString("yyyy-MM-dd")); cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active); cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed); @@ -774,13 +774,13 @@ namespace Ophelias.Managers "WHERE ID = (SELECT RoomNum FROM reservations WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email AND Status in (@SActive,@SChanged)));"; cmd.Parameters.AddWithValue("@Email", Email); cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active); - cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Ended); + cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed); cmd.ExecuteNonQuery(); } using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = "UPDATE reservations SET CheckOut = @Date, Status = @Status " + - "WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email) AND RoomNum IS NOT NULL AND Status in (@SActive,@SChanged);"; + "WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email) AND RoomNum IS NOT NULL AND Status in (@SActive,@SChanged) AND CheckIn IS NULL;"; cmd.Parameters.AddWithValue("@Email", Email); cmd.Parameters.AddWithValue("@Status", (int)ReservationStatus.Ended); cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active); @@ -872,6 +872,7 @@ namespace Ophelias.Managers List list = new(); using (Database Manager = new()) { + using SQLiteTransaction Transaction = Manager.con.BeginTransaction(); using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = "SELECT * FROM reservations " + @@ -936,6 +937,17 @@ namespace Ophelias.Managers } } } + using (SQLiteCommand cmd = Manager.con.CreateCommand()) + { + cmd.CommandText = "UPDATE reservations SET IsNoShow = 1, DateChanged = @DateChanged " + + "WHERE DATE (@Date) > StartDate AND Status IN (@Status1,@Status2) AND CheckIn IS NULL"; + cmd.Parameters.AddWithValue("@Date", DateTime.Now.Date.ToString("yyyy-MM-dd")); + cmd.Parameters.AddWithValue("@DateChanged", DateTime.Now.Date.ToString("yyyy-MM-dd")); + cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active); + cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed); + cmd.ExecuteNonQuery(); + } + Transaction.Commit(); } return list; } diff --git a/OpheliasOasis/Models/Reservation.cs b/OpheliasOasis/Models/Reservation.cs index a099661..5c5bcb9 100644 --- a/OpheliasOasis/Models/Reservation.cs +++ b/OpheliasOasis/Models/Reservation.cs @@ -188,6 +188,16 @@ namespace Ophelias.Models cmd.ExecuteNonQuery(); } } + if (Type == ReservationType.Conventional && _DateChanged.Date >= StartDate.AddDays(-3).Date) + { + Transaction.Pay(Transaction.Owed, Guest.CreditCard); + } else if (Type == ReservationType.Incentive && _DateChanged.Date >= StartDate.AddDays(-3).Date) + { + Transaction.Pay(Transaction.Owed, Guest.CreditCard); + } else if (_DateChanged.Date > StartDate.Date) + { + Transaction.Pay(Transaction.Owed, Guest.CreditCard); + } } } internal enum ReservationStatus diff --git a/OpheliasOasis/Models/Transaction.cs b/OpheliasOasis/Models/Transaction.cs index 1323891..14c6b8c 100644 --- a/OpheliasOasis/Models/Transaction.cs +++ b/OpheliasOasis/Models/Transaction.cs @@ -113,7 +113,7 @@ namespace Ophelias.Models { return PaymentStatus.MissingCreditCard; } - if (Amount >= Owed) + if (AmountPaid >= Owed) { return PaymentStatus.AlreadyPaid; } diff --git a/OpheliasOasis/Program.cs b/OpheliasOasis/Program.cs index 608b867..4075007 100644 --- a/OpheliasOasis/Program.cs +++ b/OpheliasOasis/Program.cs @@ -993,6 +993,15 @@ internal class Program Console.WriteLine($"Daily occupancy has been written and appended to {f.FullName}"); } } + void IssuePenalties() + { + List reservations = Hotel.GetPastDueReservations(); + foreach (Reservation reservation in reservations) + { + reservation.CancelReservation(); + } + Console.WriteLine("Penalties have been issued."); + } Console.Write( "\nWelcome to the Ophelias Oasis Hotel Management System!\n" + @@ -1009,7 +1018,7 @@ internal class Program case "generate operational report": GenerateOperationalReports(); break; case "generate accommodation bills": GenerateAccommodationBills(); break; case "notify pending payments": NotifyOutstandingPayments(); break; - case "issue penalties": break; + case "issue penalties": IssuePenalties(); break; case "checkin guest": CheckIn(); break; case "checkout guest": CheckOut(); break; case "set rate": SetFutureBaseRate(); break; @@ -1026,34 +1035,41 @@ internal class Program { if (!File.Exists("database.sqlite3") || new FileInfo("database.sqlite3").Length == 0) { + /* + * Checks to see if the databse is created. If the database file is missing, that means + * it has not been initialized. Upon the initialization process, the tables are created + * and the rooms table is populated with 45 rooms. This is a preconfigured value within + * the InitializeRoomsTable() function since there was no requirement to make this configurable. + */ SQLiteConnection.CreateFile("database.sqlite3"); - using (Database Manager = new()) - { - Manager.InitializeTables(); - Manager.InitializeRoomsTable(); - } + using Database Manager = new(); + Manager.InitializeTables(); + Manager.InitializeRoomsTable(); } if (!Hotel.CheckBaseRate()) { + // Checks to see if the base rate is configured, if not a warning will be shown. Console.WriteLine("No base rate is configured. As a result reservations cannot be made until one is configured."); } bool run = true; while (run) { + // Main loop for checking if the person is a customer or employee. Console.Write( "Are you an employee or customer?\n" + "1. Employee\n" + "2. Customer/ Guest\n" + ": " ); - switch (Console.ReadLine().ToUpper()) + switch (Console.ReadLine().ToUpper()) // Using .ToUpper() to support "q" without having to write a case for it. { - case "1": AdminMode(); break; - case "2": GuestMode(); break; - case "Q": run = false; break; + case "1": AdminMode(); break; // Enter employee (administrative) mode + case "2": GuestMode(); break; // Enter guest (customer) mode + case "Q": run = false; break; // Quit default: Console.WriteLine("You must either specify 1 for Employee, 2 for Customer/ Guest, or Q to quit.\n\n"); break; } } + Console.WriteLine("Shutting system down."); } } \ No newline at end of file