This commit versions the inital classes used for reporting. Some of the manager classes have been adjusted so that they can also be used in the reporting system since the queries are very similar. The terminal commands and flow have been improved to further close in on the design spec. Guests who make reservations now abide by the fixed rules determined by the doc. For example Prepaid and 60 day reservations have requirements on how far away a reservation needs to be at minimum. The reservation creation process now takes this into account. The base rate functionality has been hooked up and the queries have been verified to work at least once. The same applies for CheckIn() and CheckOut() functions.
205 lines
7.8 KiB
C#
205 lines
7.8 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 NOT NULL,
|
|
[Multiplier] INTEGER NOT NULL,
|
|
[RefundAmount] INTEGER NOT NULL,
|
|
[PayBy] TEXT NOT NULL,
|
|
[LastPaid] TEXT NULL,
|
|
[PaidOn] TEXT NULL);
|
|
|
|
CREATE TABLE IF NOT EXISTS [reservations] (
|
|
[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
|
[RoomNum] INTEGER NULL UNIQUE,
|
|
[GuestID] INTEGER NOT NULL,
|
|
[TransactionID] INTEGER NOT NULL UNIQUE,
|
|
[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 NULL,
|
|
[CheckOut] TEXT NULL,
|
|
[DateChanged] TEXT NULL,
|
|
FOREIGN KEY ([RoomNum]) 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 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");
|
|
if (LastPaid.HasValue)
|
|
queryComponents.Add($"LastPaid = @LastPaid");
|
|
if (PaidOn.HasValue)
|
|
queryComponents.Add($"PaidOn = @PaidOn");
|
|
|
|
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 = @RID");
|
|
if (GuestID.HasValue)
|
|
QueryParts.Add($"GuestID = @GID");
|
|
if (TransactionID.HasValue)
|
|
QueryParts.Add($"TransactionID = @TID");
|
|
if (IsNoShow.HasValue)
|
|
QueryParts.Add($"IsNoShow = @IsNoShow");
|
|
if (Type.HasValue)
|
|
QueryParts.Add($"Type = @Type");
|
|
if (Status.HasValue)
|
|
QueryParts.Add($"Status = @Status");
|
|
if (CreationDate.HasValue)
|
|
QueryParts.Add($"CreationDate = @CreationDate");
|
|
if (StartDate.HasValue)
|
|
QueryParts.Add($"StartDate = @StartDate");
|
|
if (EndDate.HasValue)
|
|
QueryParts.Add($"EndDate = @EndDate");
|
|
if (CheckIn.HasValue)
|
|
QueryParts.Add($"CheckIn = @CheckIn");
|
|
if (CheckOut.HasValue)
|
|
QueryParts.Add($"CheckOut = @CheckOut");
|
|
if (DateChanged.HasValue)
|
|
QueryParts.Add($"DateChanged = @DateChanged");
|
|
|
|
if (QueryParts.Count > 0)
|
|
query += " " + string.Join(", ", QueryParts) + " " + $"WHERE ID = @ID;";
|
|
else
|
|
return null;
|
|
|
|
return query;
|
|
}
|
|
|
|
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 = @Fname");
|
|
if (!string.IsNullOrEmpty(LastName))
|
|
QueryParts.Add($"Lname = @Lname");
|
|
if (!string.IsNullOrEmpty(LastName))
|
|
QueryParts.Add($"Email = @Email");
|
|
if (!string.IsNullOrEmpty(CreditCard))
|
|
QueryParts.Add($"CreditCard = @CC");
|
|
if (!string.IsNullOrEmpty(Expiration))
|
|
QueryParts.Add($"Expiration = @Expiry");
|
|
if (!string.IsNullOrEmpty(CCV))
|
|
QueryParts.Add($"CCV = @CCV");
|
|
|
|
if (QueryParts.Count > 0)
|
|
query += " " + string.Join(", ", QueryParts) + " " + $"WHERE ID = @ID;";
|
|
else
|
|
return null;
|
|
|
|
return query;
|
|
}
|
|
}
|
|
}
|