using System.Data.SQLite; using Ophelias.Models; namespace Ophelias.Managers { internal class DatabaseManager : IDisposable { internal SQLiteConnection con = new SQLiteConnection("DataSource=database.sqlite3;Version=3;"); internal DatabaseManager() { Connect(); } internal void Connect() { con.Open(); } internal void Close() { con.Close(); con.Dispose(); } internal void InitializeTables() { string tableCommands = @"CREATE TABLE IF NOT EXISTS [transactions] ( [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [Rate] INTEGER NOT NULL, [Owed] INTEGER NOT NULL, [Penalty] INTEGER NULL, [Multiplier] INTEGER NOT NULL, [RefundAmount] INTEGER NOT NULL, [PayBy] TEXT NOT NULL, [LastPaid] TEXXT NULL, [PaidOn] TEXT NULL); CREATE TABLE IF NOT EXISTS [reservations] ( [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [RoomID] INTEGER NOT NULL, [GuestID] INTEGER NOT NULL, [TransactionID] INTEGER NOT NULL, [IsNoShow] BOOLEAN NOT NULL CHECK ([IsNoShow] IN (0,1)), [Type] INTEGER NOT NULL CHECK ([Type] IN (0,1,2,3)), [Status] INTEGER NOT NULL CHECK ([Status] IN (0,1,2,3)), [CreationDate] TEXT NOT NULL, [StartDate] TEXT NOT NULL, [EndDate] TEXT NOT NULL, [CheckIn] TEXT NOT NULL, [CheckOut] TEXT NOT NULL, [DateChanged] TEXT NOT NULL, FOREIGN KEY ([RoomID]) REFERENCES ROOMS(ID), FOREIGN KEY ([GuestID]) REFERENCES GUESTS(ID), FOREIGN KEY ([TransactionID]) REFERENCES TRANSACTIONS(ID)); CREATE TABLE IF NOT EXISTS [guests] ( [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [Fname] TEXT NOT NULL, [Lname] TEXT NOT NULL, [Email] TEXT NOT NULL UNIQUE, [CreditCard] TEXT NULL UNIQUE, [Expiration] TEXT NULL, [CCV] TEXT NULL); CREATE TABLE IF NOT EXISTS [rooms] ( [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [Occupied] BOOLEAN NOT NULL CHECK ([Occupied] IN (0,1))); CREATE TABLE IF NOT EXISTS [rates] ( [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [Rate] INTEGER NOT NULL, [DateSet] TEXT NOT NULL UNIQUE, [DefaultRate] INTEGER NULL UNIQUE CHECK ([DefaultRate] IN (1)));"; using (SQLiteCommand cmd = con.CreateCommand()) { cmd.CommandText = tableCommands; cmd.ExecuteNonQuery(); } } internal void InitializeRoomsTable() { using (SQLiteCommand cmd = con.CreateCommand()) { for (int i = 1; i < 46; i++) { cmd.CommandText = $"INSERT INTO ROOMS (Occupied) VALUES (0);"; cmd.ExecuteNonQuery(); } } // Initialize Rooms } public void Dispose() { Close(); } } internal static class DatabaseFunctions { } internal static class QueryBuilder { internal static string? UpdateTransaction(int Id, double? Rate = null, double? Owed = null, double? Penalty = null, double? Multiplier = null, double? Refund = null, DateTime? PayBy = null, DateTime? LastPaid = null, DateTime? PaidOn = null) { List queryComponents = new List(); string query = "UPDATE transactions SET"; if (Rate.HasValue) queryComponents.Add($"Rate = {Rate}"); if (Owed.HasValue) queryComponents.Add($"Owed = {Owed}"); if (Penalty.HasValue) queryComponents.Add($"Penalty = {Penalty}"); if (Multiplier.HasValue) queryComponents.Add($"Multiplier = {Multiplier}"); if (Refund.HasValue) queryComponents.Add($"Refund = {Refund}"); if (PayBy.HasValue) queryComponents.Add($"PayBy = {PayBy.Value.Date.ToString("yyyy-MM-dd")}"); if (LastPaid.HasValue) queryComponents.Add($"LastPaid = {LastPaid.Value.Date.ToString("yyyy-MM-dd")}"); if (PaidOn.HasValue) queryComponents.Add($"PaidOn = {PaidOn.Value.Date.ToString("yyyy-MM-dd")}"); if (queryComponents.Count > 0) query += " " + string.Join(", ", queryComponents) + " " + $"WHERE ID = {Id};"; else return null; return query; } internal static string? UpdateReservation(int Id, int? RoomID = null, int? GuestID = null, int? TransactionID = null, bool? IsNoShow = null, ReservationType? Type = null, ReservationStatus? Status = null, DateTime? CreationDate = null, DateTime? StartDate = null, DateTime? EndDate = null, DateTime? CheckIn = null, DateTime? CheckOut = null, DateTime? DateChanged = null) { List QueryParts = new List(); string query = "UPDATE reservations SET"; if (RoomID.HasValue) QueryParts.Add($"RoomID = {RoomID}"); if (GuestID.HasValue) QueryParts.Add($"GuestID = {GuestID}"); if (TransactionID.HasValue) QueryParts.Add($"TransactionID = {TransactionID}"); if (IsNoShow.HasValue) QueryParts.Add($"IsNoShow = {Convert.ToInt32(IsNoShow)}"); if (Type.HasValue) QueryParts.Add($"Type = {(int)Type}"); if (Status.HasValue) QueryParts.Add($"Status = {(int)Status}"); if (CreationDate.HasValue) QueryParts.Add($"CreationDate = {CreationDate.Value.Date.ToString("yyyy-MM-dd")}"); if (StartDate.HasValue) QueryParts.Add($"StartDate = {StartDate.Value.Date.ToString("yyyy-MM-dd")}"); if (EndDate.HasValue) QueryParts.Add($"EndDate = {EndDate.Value.Date.ToString("yyyy-MM-dd")}"); if (CheckIn.HasValue) QueryParts.Add($"CheckIn = {CheckIn.Value.Date.ToString("yyyy-MM-dd")}"); if (CheckOut.HasValue) QueryParts.Add($"CheckOut = {CheckOut.Value.Date.ToString("yyyy-MM-dd")}"); if (DateChanged.HasValue) QueryParts.Add($"DateChanged = {DateChanged.Value.Date.ToString("yyyy-MM-dd")}"); if (QueryParts.Count > 0) query += " " + string.Join(", ", QueryParts) + " " + $"WHERE ID = {Id};"; else return null; return query; } internal static string CreateTransaction(double Rate, double Owed, double Multiplier, DateTime PayBy, DateTime? LastPaid = null, DateTime? PaidOn = null, double Refund = 0, double Penalty = 0) { return @$"INSERT INTO transactions (Rate, Owed, Penalty, Multiplier, RefundAmount, PayBy, LastPaid, PaidOn) VALUES ({Rate}, {Owed}, {Penalty}, {Multiplier}, {Refund}, {PayBy}, {PayBy}, {PaidOn});"; } internal static string CreateReservation(int guestid, int transactionid, ReservationType type, ReservationStatus status, DateTime creationdate, DateTime startdate, DateTime enddate, DateTime? checkin = null, DateTime? checkout = null, DateTime? datechanged = null, bool? isnoshow = false) { return @$"INSERT INTO reservations (GuestID, TransactionID, IsNoShow, Type, Status, CreationDate, StartDate, EndDate, CheckIn, CheckOut, DateChanged) VALUES ({guestid}, {transactionid}, {isnoshow}, {status}, {creationdate}, {startdate}, {enddate}, {checkin}, {checkout}, {datechanged});"; } internal static string CreateGuest(string FirstName, string LastName, string Email, string? CreditCard, string? Expiration, string? CCV) { if (CreditCard != null && Expiration != null && CCV != null) return $@"INSERT INTO guests (Fname, Lname, Email, CreditCard, Expiration, CCV) VALUES ('{FirstName}', '{LastName}', '{Email}', '{CreditCard}', '{Expiration}', '{CCV}');"; else return $@"INSERT INTO guests (Fname, Lname, Email) VALUES ('{FirstName}', '{LastName}', '{Email}');"; } internal static string? UpdateGuest(int Id, string? FirstName = null, string? LastName = null, string? Email = null, string? CreditCard = null, string? Expiration = null, string? CCV = null) { List QueryParts = new List(); string query = "UPDATE guests SET"; if (!string.IsNullOrEmpty(FirstName)) QueryParts.Add($"Fname = '{FirstName}'"); if (!string.IsNullOrEmpty(LastName)) QueryParts.Add($"Lname = '{LastName}'"); if (!string.IsNullOrEmpty(LastName)) QueryParts.Add($"Email = '{Email}'"); if (!string.IsNullOrEmpty(CreditCard)) QueryParts.Add($"CreditCard = '{CreditCard}'"); if (!string.IsNullOrEmpty(Expiration)) QueryParts.Add($"Expiration = '{Expiration}'"); if (!string.IsNullOrEmpty(CCV)) QueryParts.Add($"CCV = '{CCV}'"); if (QueryParts.Count > 0) query += " " + string.Join(", ", QueryParts) + " " + $"WHERE ID = {Id};"; else return null; return query; } } }