Finishes the guest part of the models and UI integration
This commit branch has been muddled with changes that are out of scope and cover more than just the models. Specifically it includes completion of basic guest related models, database access, command line interface integration and preventing SQL injection. Total summary of changes: **IMPORTANT CHANGE: All queries are now parameterized to prevent SQL injections. Prior versions are subject to it since the strings were built. - HotelManager This class is used to provide database operations that are outside of scope from a given model. Furthermore if there is no model to work off of, such as creating a new model based off an existing entry, these functions live outside of the model since it makes no sense for models to contain functions where it would retrieve itself with no context. Realistically this could be placed in an empty constructor and address itself, however, for now this functionality has been moved off the model since it is a one use and is not guaranteed to generate a guest. Some functionality for the coming employee management functions are already in there since they share overlap with the guest module. Specifically GetBaseRate for checking and getting the base rate. - DatabaseManager This class has mostly migrated functionality out or switch to parameterized query generation to prevent SQL injections. - Guest, Reservation, and Transaction Classes Migrated functionality to create the database entry and a new entry of guest upon creation as well as update them. - Program (Terminal app) Fully integrated the guest module. Has not undergone extensive testing but does work as of this commit.
This commit is contained in:
@@ -27,30 +27,30 @@ namespace Ophelias.Managers
|
||||
[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
[Rate] INTEGER NOT NULL,
|
||||
[Owed] INTEGER NOT NULL,
|
||||
[Penalty] INTEGER NULL,
|
||||
[Penalty] INTEGER NOT NULL,
|
||||
[Multiplier] INTEGER NOT NULL,
|
||||
[RefundAmount] INTEGER NOT NULL,
|
||||
[PayBy] TEXT NOT NULL,
|
||||
[LastPaid] TEXXT NULL,
|
||||
[LastPaid] TEXT 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,
|
||||
[RoomNum] INTEGER NULL UNIQUE,
|
||||
[GuestID] INTEGER NOT NULL UNIQUE,
|
||||
[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 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));
|
||||
[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,
|
||||
@@ -98,10 +98,6 @@ namespace Ophelias.Managers
|
||||
}
|
||||
}
|
||||
|
||||
internal static class DatabaseFunctions
|
||||
{
|
||||
|
||||
}
|
||||
internal static class QueryBuilder
|
||||
{
|
||||
|
||||
@@ -114,24 +110,24 @@ namespace Ophelias.Managers
|
||||
string query = "UPDATE transactions SET";
|
||||
|
||||
if (Rate.HasValue)
|
||||
queryComponents.Add($"Rate = {Rate}");
|
||||
queryComponents.Add($"Rate = @Rate");
|
||||
if (Owed.HasValue)
|
||||
queryComponents.Add($"Owed = {Owed}");
|
||||
queryComponents.Add($"Owed = @Owed");
|
||||
if (Penalty.HasValue)
|
||||
queryComponents.Add($"Penalty = {Penalty}");
|
||||
queryComponents.Add($"Penalty = @Penalty");
|
||||
if (Multiplier.HasValue)
|
||||
queryComponents.Add($"Multiplier = {Multiplier}");
|
||||
queryComponents.Add($"Multiplier = @Multiplier");
|
||||
if (Refund.HasValue)
|
||||
queryComponents.Add($"Refund = {Refund}");
|
||||
queryComponents.Add($"Refund = @Refund");
|
||||
if (PayBy.HasValue)
|
||||
queryComponents.Add($"PayBy = {PayBy.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
queryComponents.Add($"PayBy = @PayBy");
|
||||
if (LastPaid.HasValue)
|
||||
queryComponents.Add($"LastPaid = {LastPaid.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
queryComponents.Add($"LastPaid = @LastPaid");
|
||||
if (PaidOn.HasValue)
|
||||
queryComponents.Add($"PaidOn = {PaidOn.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
queryComponents.Add($"PaidOn = @PaidOn");
|
||||
|
||||
if (queryComponents.Count > 0)
|
||||
query += " " + string.Join(", ", queryComponents) + " " + $"WHERE ID = {Id};";
|
||||
query += " " + string.Join(", ", queryComponents) + " " + $"WHERE ID = @ID;";
|
||||
else
|
||||
return null;
|
||||
|
||||
@@ -147,83 +143,58 @@ namespace Ophelias.Managers
|
||||
string query = "UPDATE reservations SET";
|
||||
|
||||
if (RoomID.HasValue)
|
||||
QueryParts.Add($"RoomID = {RoomID}");
|
||||
QueryParts.Add($"RoomID = @RID");
|
||||
if (GuestID.HasValue)
|
||||
QueryParts.Add($"GuestID = {GuestID}");
|
||||
QueryParts.Add($"GuestID = @GID");
|
||||
if (TransactionID.HasValue)
|
||||
QueryParts.Add($"TransactionID = {TransactionID}");
|
||||
QueryParts.Add($"TransactionID = @TID");
|
||||
if (IsNoShow.HasValue)
|
||||
QueryParts.Add($"IsNoShow = {Convert.ToInt32(IsNoShow)}");
|
||||
QueryParts.Add($"IsNoShow = @IsNoShow");
|
||||
if (Type.HasValue)
|
||||
QueryParts.Add($"Type = {(int)Type}");
|
||||
QueryParts.Add($"Type = @Type");
|
||||
if (Status.HasValue)
|
||||
QueryParts.Add($"Status = {(int)Status}");
|
||||
QueryParts.Add($"Status = @Status");
|
||||
if (CreationDate.HasValue)
|
||||
QueryParts.Add($"CreationDate = {CreationDate.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
QueryParts.Add($"CreationDate = @CreationDate");
|
||||
if (StartDate.HasValue)
|
||||
QueryParts.Add($"StartDate = {StartDate.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
QueryParts.Add($"StartDate = @StartDate");
|
||||
if (EndDate.HasValue)
|
||||
QueryParts.Add($"EndDate = {EndDate.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
QueryParts.Add($"EndDate = @EndDate");
|
||||
if (CheckIn.HasValue)
|
||||
QueryParts.Add($"CheckIn = {CheckIn.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
QueryParts.Add($"CheckIn = @CheckIn");
|
||||
if (CheckOut.HasValue)
|
||||
QueryParts.Add($"CheckOut = {CheckOut.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
QueryParts.Add($"CheckOut = @CheckOut");
|
||||
if (DateChanged.HasValue)
|
||||
QueryParts.Add($"DateChanged = {DateChanged.Value.Date.ToString("yyyy-MM-dd")}");
|
||||
QueryParts.Add($"DateChanged = @DateChanged");
|
||||
|
||||
if (QueryParts.Count > 0)
|
||||
query += " " + string.Join(", ", QueryParts) + " " + $"WHERE ID = {Id};";
|
||||
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}'");
|
||||
QueryParts.Add($"Fname = @Fname");
|
||||
if (!string.IsNullOrEmpty(LastName))
|
||||
QueryParts.Add($"Lname = '{LastName}'");
|
||||
QueryParts.Add($"Lname = @Lname");
|
||||
if (!string.IsNullOrEmpty(LastName))
|
||||
QueryParts.Add($"Email = '{Email}'");
|
||||
QueryParts.Add($"Email = @Email");
|
||||
if (!string.IsNullOrEmpty(CreditCard))
|
||||
QueryParts.Add($"CreditCard = '{CreditCard}'");
|
||||
QueryParts.Add($"CreditCard = @CC");
|
||||
if (!string.IsNullOrEmpty(Expiration))
|
||||
QueryParts.Add($"Expiration = '{Expiration}'");
|
||||
QueryParts.Add($"Expiration = @Expiry");
|
||||
if (!string.IsNullOrEmpty(CCV))
|
||||
QueryParts.Add($"CCV = '{CCV}'");
|
||||
QueryParts.Add($"CCV = @CCV");
|
||||
|
||||
if (QueryParts.Count > 0)
|
||||
query += " " + string.Join(", ", QueryParts) + " " + $"WHERE ID = {Id};";
|
||||
query += " " + string.Join(", ", QueryParts) + " " + $"WHERE ID = @ID;";
|
||||
else
|
||||
return null;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user