using Ophelias.Models; using System.Data.SQLite; namespace Ophelias.Managers { internal static class HotelManager { internal static int GetLastId(string tableName) { int LastId = 0; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = $"SELECT SEQ FROM sqlite_sequence WHERE name=@Table;"; cmd.ExecuteNonQuery(); cmd.Parameters.AddWithValue("@Table", tableName); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) LastId = reader.GetInt32(0); } } } return LastId; } internal static List DailyOccupancies(DateTime Date) { List Occupancies = new List(); using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = $@"SELECT COUNT(*) FROM reservations WHERE DATE(@Date) BETWEEN StartDate AND EndDate;"; cmd.ExecuteNonQuery(); cmd.Parameters.AddWithValue("@Date", Date.Date.ToString("yyyy-MM-dd")); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.Read()) Occupancies.Add(reader.GetInt32(0)); } } } return Occupancies; } internal static (int, bool) AvgOccupancySpan(DateTime Start, DateTime End) { int thirtyDayOcc = 0; bool maxCapacityInRange = false; int days = (int)(End.Date - Start.Date).TotalDays; using (DatabaseManager Manager = new DatabaseManager()) { for (int i = 0; i < days; i++) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = $@"SELECT COUNT(*) FROM reservations WHERE DATE(@Date) BETWEEN @Start AND @End;"; cmd.Parameters.AddWithValue("@Date", Start.AddDays(i).Date.ToString("yyyy-MM-dd")); cmd.Parameters.AddWithValue("@Start", Start); cmd.Parameters.AddWithValue("@End", End); cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) { thirtyDayOcc += reader.GetInt32(0); if (reader.GetInt32(0) == 45) maxCapacityInRange = true; } } } } } return (thirtyDayOcc / days, maxCapacityInRange); } internal static Guest? GetGuestByEmail(string Email) { Guest? g = null; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = $"SELECT * FROM guests WHERE Email = @Email"; cmd.Parameters.AddWithValue("@Email", Email); cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) { string? CreditCard = null, Expiration = null, CCV = null; if (reader[4].GetType() != typeof(DBNull)) CreditCard = reader[4].ToString(); if (reader[5].GetType() != typeof(DBNull)) Expiration = reader[5].ToString(); if (reader[6].GetType() != typeof(DBNull)) CCV = reader[6].ToString(); g = new Guest(reader.GetInt32(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), CreditCard, Expiration, CCV); } } } } return g; } internal static Reservation? GetResByGuest(Guest g) { Reservation? r = null; Transaction? t; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { int? RoomNumber = null; DateTime? CheckIn = null, CheckOut = null, DateChanged = null, LastPaid = null, PaidOn = null; cmd.CommandText = @"SELECT * FROM reservations INNER JOIN transactions ON reservations.TransactionID = transactions.ID WHERE GuestID = @GuestID AND Status = @Status;"; cmd.Parameters.AddWithValue("@GuestID", g.Id); cmd.Parameters.AddWithValue("@Status", (int)ReservationStatus.Active); cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) { if (reader[20].GetType() != typeof(DBNull)) LastPaid = reader.GetDateTime(20); if (reader[21].GetType() != typeof(DBNull)) PaidOn = reader.GetDateTime(21); t = new Transaction(reader.GetInt32(13), reader.GetDouble(14), reader.GetDouble(15), reader.GetDouble(17), reader.GetDateTime(19), LastPaid: LastPaid, PaidOn: PaidOn, RefundAmount: reader.GetDouble(18), Penalty: reader.GetDouble(16)); if (reader[1].GetType() != typeof(DBNull)) RoomNumber = reader.GetInt32(1); if (reader[10].GetType() != typeof(DBNull)) CheckIn = reader.GetDateTime(10); if (reader[11].GetType() != typeof(DBNull)) CheckOut = reader.GetDateTime(11); if (reader[12].GetType() != typeof(DBNull)) DateChanged = reader.GetDateTime(12); r = new Reservation(reader.GetInt32(0), g, t, (ReservationType)reader.GetInt32(5), (ReservationStatus)reader.GetInt32(6), reader.GetDateTime(7), reader.GetDateTime(8), reader.GetDateTime(9), RoomNum: RoomNumber, IsNoShow: reader.GetBoolean(4), CheckIn: CheckIn, CheckOut: CheckOut, DateChanged: DateChanged); } } } } return r; } internal static TimeRefs? CanBeCheckedIn(string Email) { TimeRefs? status = null; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = $"SELECT * FROM reservation WHERE Email = @Email AND Status IN (0,1)"; cmd.Parameters.AddWithValue("@Email", Email); cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) { DateTime dt = reader.GetDateTime(8); if (dt.Date == DateTime.Now.Date) status = TimeRefs.OnTime; else if (dt.Date > DateTime.Now.Date) status = TimeRefs.Late; else if (dt.Date < DateTime.Now.Date) status = TimeRefs.Early; } else status = null; } } } return status; } internal static double? GetBaseRate() { double? rate; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { string query = "SELECT Rate FROM rates WHERE DefaultRate = 1;"; cmd.CommandText = query; cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) rate = reader.GetDouble(0); else rate = null; } } } return rate; } internal static bool GetBaseRateByDate(DateTime dt) { bool configured; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { string query = "SELECT Rate FROM rates WHERE DateSet = @Date;"; cmd.CommandText = query; cmd.Parameters.AddWithValue("@Date", dt.ToString("yyyy-MM-dd")); cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) configured = true; else configured = false; } } } return configured; } internal static void SetBaseRate(double Rate, DateTime DateSet) { double rate; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { string query = $"INSERT INTO rates (Rate, DateSet) VALUES (@Rate, @DateSet);"; cmd.CommandText = query; cmd.Parameters.AddWithValue("@Rate", Rate); cmd.Parameters.AddWithValue("@DateSet", DateSet.ToString("yyyy-MM-dd")); cmd.ExecuteNonQuery(); } } } internal static void UpdateBaseRate(double Rate, DateTime DateSet) { double rate; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { string query = $"UPDATE rates SET rate = @Rate WHERE DateSet = @Date;"; cmd.CommandText = query; cmd.Parameters.AddWithValue("@Rate", Rate); cmd.Parameters.AddWithValue("@Date", DateSet.ToString("yyyy-MM-dd")); cmd.ExecuteNonQuery(); } } } internal static void CheckBaseRate() { using (DatabaseManager Manager = new DatabaseManager()) { int? OldId; using (SQLiteCommand cmd = Manager.con.CreateCommand()) { string query = "SELECT Id FROM rates WHERE DefaultRate = 1;"; cmd.CommandText = query; cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); OldId = reader.GetInt32(0); } } int? Id; using (SQLiteCommand cmd = Manager.con.CreateCommand()) { string query = "SELECT Id FROM rates WHERE DateSet = @Date;"; cmd.CommandText = query; cmd.Parameters.AddWithValue("@Date", DateTime.Now.Date.ToString("yyyy-MM-dd")); cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); Id = reader.GetInt32(0); } } if (Id != null) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = @"UPDATE rates SET DefaultRate = NULL WHERE Id = @OldID; UPDATE rates SET DefaultRate = 1 WHERE Id = @ID"; cmd.Parameters.AddWithValue("@OldID", OldId); cmd.Parameters.AddWithValue("@ID", Id); cmd.ExecuteNonQuery(); } } } } internal static int? CheckInGuest(string Email, DateTime CheckIn) { int? RoomID = null; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteTransaction Transaction = Manager.con.BeginTransaction()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = "UPDATE reservations SET RoomNum = (SELECT ID FROM rooms WHERE Occupied = 0 LIMIT 1), CheckIn = @Date " + "WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email) AND RoomNum IS NULL AND Status in (@SActive,@SChanged);"; cmd.Parameters.AddWithValue("@Email", Email); cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active); cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed); cmd.Parameters.AddWithValue("@Date", CheckIn.ToString("yyyy-MM-dd")); cmd.ExecuteNonQuery(); } using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = "UPDATE rooms SET Occupied = 1 " + "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.Changed); cmd.ExecuteNonQuery(); } using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = "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.Changed); cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) { RoomID = (int)reader.GetValue(0); } } } Transaction.Commit(); } } return RoomID; } internal static bool GuestCurrentlyCheckedIn(string Email) { bool EntryFound; using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = "SELECT * FROM reservations " + "WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email AND Status in (@SActive,@SChanged)) AND CheckIn IS NOT NULL"; cmd.Parameters.AddWithValue("@Email", Email); cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active); cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed); cmd.ExecuteNonQuery(); using (SQLiteDataReader reader = cmd.ExecuteReader()) { reader.Read(); if (reader.HasRows) EntryFound = true; else EntryFound = false; } } } return EntryFound; } internal static void CheckOutGuest(string Email, DateTime CheckOut) { using (DatabaseManager Manager = new DatabaseManager()) { using (SQLiteTransaction Transaction = Manager.con.BeginTransaction()) { using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = "UPDATE rooms SET Occupied = 0 " + "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.ExecuteNonQuery(); } using (SQLiteCommand cmd = Manager.con.CreateCommand()) { cmd.CommandText = "UPDATE reservations SET RoomNum = NULL, CheckOut = @Date, Status = @Status " + "WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email) AND RoomNum IS NOT NULL AND Status in (@SActive,@SChanged);"; cmd.Parameters.AddWithValue("@Email", Email); cmd.Parameters.AddWithValue("@Status", (int)ReservationStatus.Ended); cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active); cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed); cmd.Parameters.AddWithValue("@Date", CheckOut.ToString("yyyy-MM-dd")); cmd.ExecuteNonQuery(); } Transaction.Commit(); } } return; } internal static List GetActiveSixtyDayRes() { List list = new List(); return list; } } internal enum TimeRefs { OnTime, Early, Late } }