Files
ophelias-oasis/OpheliasOasis/Managers/DatabaseManager.cs
雲華 8764c2e57c Begun integration of models and managers
The HotelManager class now has been connected to some aspects of the
command line interface and is functioning for a few cases such as
logging in as a specific guest via email, chaging a guests information
and creating a new guest account. This was implemented first over the
reservation system to test and implement something on a smaller scale.
Furthermore, the reservation depends on an existing guest account since
a Guest ID needs to be linked to the reservation that is created.
Other changes include redesigning, tweaking/ adjusting, and/ or fixing
of other modules that have not yet been implemented or are partially
implemented.
2022-04-13 23:53:17 -04:00

234 lines
9.9 KiB
C#

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<string> queryComponents = new List<string>();
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<string> QueryParts = new List<string>();
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<string> QueryParts = new List<string>();
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;
}
}
}