IO format fixes and implemented res payment
This is a small commit to include the feature for paying for a reservation, specifically only the 60-day-in-advance reservation type as the others are paid for at specific periods. Other fixes include just some formatting for reports.
This commit is contained in:
@@ -265,7 +265,7 @@ namespace Ophelias.Managers
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(CreditCard))
|
if (!string.IsNullOrEmpty(CreditCard))
|
||||||
{
|
{
|
||||||
QueryParts.Add($"CreditCard = @CC");
|
QueryParts.Add($"CreditCard = @CreditCard");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Expiration))
|
if (!string.IsNullOrEmpty(Expiration))
|
||||||
|
|||||||
@@ -67,6 +67,12 @@ namespace Ophelias.Models
|
|||||||
{
|
{
|
||||||
using SQLiteCommand cmd = Manager.con.CreateCommand();
|
using SQLiteCommand cmd = Manager.con.CreateCommand();
|
||||||
cmd.CommandText = QueryBuilder.UpdateGuest(Id, FirstName, LastName, Email, CreditCard, Expiration, CCV);
|
cmd.CommandText = QueryBuilder.UpdateGuest(Id, FirstName, LastName, Email, CreditCard, Expiration, CCV);
|
||||||
|
cmd.Parameters.AddWithValue("@Fname", FirstName);
|
||||||
|
cmd.Parameters.AddWithValue("@Lname", LastName);
|
||||||
|
cmd.Parameters.AddWithValue("@Email", Email);
|
||||||
|
cmd.Parameters.AddWithValue("@CreditCard", CreditCard);
|
||||||
|
cmd.Parameters.AddWithValue("@Expiry", Expiration);
|
||||||
|
cmd.Parameters.AddWithValue("@CCV", CCV);
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
}
|
}
|
||||||
if (FirstName != null)
|
if (FirstName != null)
|
||||||
|
|||||||
@@ -107,11 +107,19 @@ namespace Ophelias.Models
|
|||||||
cmd.Parameters.AddWithValue("@PayBy", this.PayBy.ToString("yyyy-MM-dd"));
|
cmd.Parameters.AddWithValue("@PayBy", this.PayBy.ToString("yyyy-MM-dd"));
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
}
|
}
|
||||||
internal void Pay(double Amount)
|
internal PaymentStatus Pay(double Amount, string cc)
|
||||||
{
|
{
|
||||||
|
if (string.IsNullOrEmpty(cc))
|
||||||
|
{
|
||||||
|
return PaymentStatus.MissingCreditCard;
|
||||||
|
}
|
||||||
|
if (Amount >= Owed)
|
||||||
|
{
|
||||||
|
return PaymentStatus.AlreadyPaid;
|
||||||
|
}
|
||||||
if (Amount <= 0)
|
if (Amount <= 0)
|
||||||
{
|
{
|
||||||
return;
|
return PaymentStatus.AmountCannotZero;
|
||||||
}
|
}
|
||||||
|
|
||||||
LastPaid = DateTime.Now;
|
LastPaid = DateTime.Now;
|
||||||
@@ -144,6 +152,7 @@ namespace Ophelias.Models
|
|||||||
throw new Exception();
|
throw new Exception();
|
||||||
cmd.Parameters.AddWithValue("@PaidOn", PaidOn.Value.ToString("yyyy-MM-dd"));
|
cmd.Parameters.AddWithValue("@PaidOn", PaidOn.Value.ToString("yyyy-MM-dd"));
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
|
return PaymentStatus.SuccessfulPayment;
|
||||||
}
|
}
|
||||||
internal void Refund()
|
internal void Refund()
|
||||||
{
|
{
|
||||||
@@ -200,13 +209,12 @@ namespace Ophelias.Models
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
internal class TransactionList
|
internal enum PaymentStatus
|
||||||
{
|
{
|
||||||
internal List<Transaction> Transactions;
|
SuccessfulPayment,
|
||||||
|
AlreadyPaid,
|
||||||
internal TransactionList()
|
FailedPayment,
|
||||||
{
|
AmountCannotZero,
|
||||||
Transactions = new();
|
MissingCreditCard
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,11 +32,12 @@ internal class Program
|
|||||||
"\treservation create - Create a new reservation.\n" +
|
"\treservation create - Create a new reservation.\n" +
|
||||||
"\treservation update - Update your active reservation.\n" +
|
"\treservation update - Update your active reservation.\n" +
|
||||||
"\treservation cancel - Cancel a reservation.\n" +
|
"\treservation cancel - Cancel a reservation.\n" +
|
||||||
|
"\treservation pay - Pays in full for an active reservation.\n" +
|
||||||
"Account Commands:\n" +
|
"Account Commands:\n" +
|
||||||
"\taccount create - Create a new guest account.\n" +
|
"\taccount create - Create a new guest account.\n" +
|
||||||
"\taccount update - Update your account information.\n" +
|
"\taccount update - Update your account information.\n" +
|
||||||
"\taccount login - Log into your guest account." +
|
"\taccount login - Log into your guest account." +
|
||||||
"Enter Q to quit.\n"
|
"Enter Q or q to quit.\n"
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -220,6 +221,7 @@ internal class Program
|
|||||||
|
|
||||||
Console.WriteLine($"The following changes have been made:\n {changes}");
|
Console.WriteLine($"The following changes have been made:\n {changes}");
|
||||||
activeGuest.UpdateGuest(activeGuest.Id, NewFname, NewLname, NewEmail, NewCard, NewExpiry, NewCCV);
|
activeGuest.UpdateGuest(activeGuest.Id, NewFname, NewLname, NewEmail, NewCard, NewExpiry, NewCCV);
|
||||||
|
activeReservation.Guest = activeGuest;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,7 +493,7 @@ internal class Program
|
|||||||
if (Type == ReservationType.Prepaid)
|
if (Type == ReservationType.Prepaid)
|
||||||
{
|
{
|
||||||
activeReservation = new(activeGuest, Type, DateTime.Now.Date, StartDate.Value, EndDate.Value);
|
activeReservation = new(activeGuest, Type, DateTime.Now.Date, StartDate.Value, EndDate.Value);
|
||||||
activeReservation.Transaction.Pay(activeReservation.Transaction.Owed);
|
activeReservation.Transaction.Pay(activeReservation.Transaction.Owed, activeGuest.CreditCard);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -586,6 +588,118 @@ internal class Program
|
|||||||
activeReservation = null;
|
activeReservation = null;
|
||||||
Console.Write("Reservation has been cancelled, you may be charged based on your reservation.");
|
Console.Write("Reservation has been cancelled, you may be charged based on your reservation.");
|
||||||
}
|
}
|
||||||
|
void PayForReservation()
|
||||||
|
{
|
||||||
|
if (activeGuest == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("No guest is currently logged in, please login.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (activeReservation == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("You currently do not have an active registration.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ReservationType.Incentive == activeReservation.Type)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Incentive reservations are paid for when you check-out.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (ReservationType.Conventional == activeReservation.Type)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Conventional reservations are paid for when you check-out.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (ReservationType.Prepaid == activeReservation.Type)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Prepaid reservations are paid for when you create them.");
|
||||||
|
return;
|
||||||
|
} else if (ReservationType.SixtyDayAdvance == activeReservation.Type)
|
||||||
|
{
|
||||||
|
if(activeReservation.StartDate.AddDays(-30).Date < DateTime.Now.Date)
|
||||||
|
{
|
||||||
|
if (activeReservation.Transaction.Owed <= activeReservation.Transaction.AmountPaid)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Your reservation has already been paid for.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
activeReservation.CancelReservation();
|
||||||
|
Console.WriteLine("Your reservation has been cancelled because you failed to pay within the payment period.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string? cc, exp, ccv;
|
||||||
|
cc = activeGuest.CreditCard;
|
||||||
|
exp = activeGuest.Expiration;
|
||||||
|
ccv = activeGuest.CCV;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (cc == null || exp == null || ccv == null)
|
||||||
|
(cc, exp, ccv) = GetCreditCardInformation();
|
||||||
|
|
||||||
|
if (cc == null || exp == null || ccv == null)
|
||||||
|
{
|
||||||
|
Console.Write("Would you like to try again and enter your payment information? (Your reservation will not be canceled)\n" +
|
||||||
|
"YES or NO: ");
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
string input = Console.ReadLine();
|
||||||
|
if (input == "YES")
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
} else if (input == "NO")
|
||||||
|
{
|
||||||
|
Console.WriteLine("Payment has been aborted.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Input must be YES or NO.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (cc != null && exp != null && ccv != null)
|
||||||
|
{
|
||||||
|
if (ReservationType.SixtyDayAdvance == activeReservation.Type && ((DateTime.Parse(exp).Date < activeReservation.StartDate.AddDays(-30).Date) && (DateTime.Parse(exp).Date < activeReservation.StartDate.AddDays(-45).Date)))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Your card expires too soon. Please enter the correct expiration date if incorrect or a new card.");
|
||||||
|
cc = null;
|
||||||
|
exp = null;
|
||||||
|
ccv = null;
|
||||||
|
}
|
||||||
|
else if (ReservationType.SixtyDayAdvance == activeReservation.Type && ((DateTime.Parse(exp).Date > activeReservation.StartDate.AddDays(-30).Date) && (DateTime.Parse(exp).Date > activeReservation.StartDate.AddDays(-45).Date)))
|
||||||
|
{
|
||||||
|
if (cc != activeGuest.CreditCard && exp != activeGuest.Expiration && ccv != activeGuest.CCV)
|
||||||
|
{
|
||||||
|
activeGuest.UpdateGuest(activeGuest.Id, CreditCard: cc, Expiration: exp, CCV: ccv);
|
||||||
|
activeReservation.Guest = activeGuest;
|
||||||
|
}
|
||||||
|
PaymentStatus ps = activeReservation.Transaction.Pay(activeReservation.Transaction.Owed, activeGuest.CreditCard);
|
||||||
|
if (ps == PaymentStatus.SuccessfulPayment)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Your reservation has been paid for.");
|
||||||
|
return;
|
||||||
|
} else if (ps == PaymentStatus.FailedPayment)
|
||||||
|
{
|
||||||
|
Console.WriteLine("There was an error paying for your resevation. Try again later or contact the Ophelias Oasis team.");
|
||||||
|
return;
|
||||||
|
} else if (ps == PaymentStatus.AmountCannotZero)
|
||||||
|
{
|
||||||
|
Console.WriteLine("You cannot pay $0 or less than $0.");
|
||||||
|
return;
|
||||||
|
} else if (ps == PaymentStatus.MissingCreditCard)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Credit Card information is missing. Payment could not be made.");
|
||||||
|
} else if (ps == PaymentStatus.AlreadyPaid)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Your reservation has already been paid for.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Console.Write(
|
Console.Write(
|
||||||
"\nWelcome to the Ophelias Oasis Hotel Registration System!\n" +
|
"\nWelcome to the Ophelias Oasis Hotel Registration System!\n" +
|
||||||
"Type help to get a full list of commands or enter a command.\n" +
|
"Type help to get a full list of commands or enter a command.\n" +
|
||||||
@@ -601,10 +715,12 @@ internal class Program
|
|||||||
case "reservation create": CreateNewReservation(); break;
|
case "reservation create": CreateNewReservation(); break;
|
||||||
case "reservation update": UpdateReservation(); break;
|
case "reservation update": UpdateReservation(); break;
|
||||||
case "reservation cancel": CancelReservation(); break;
|
case "reservation cancel": CancelReservation(); break;
|
||||||
|
case "reservation pay": PayForReservation(); break;
|
||||||
case "account create": CreateNewGuestPrompt(); break;
|
case "account create": CreateNewGuestPrompt(); break;
|
||||||
case "account update": UpdateGuestInformation(); break;
|
case "account update": UpdateGuestInformation(); break;
|
||||||
case "account login": GuestLogin(); break;
|
case "account login": GuestLogin(); break;
|
||||||
case "q": return;
|
case "q": return;
|
||||||
|
case "Q": return;
|
||||||
default: Console.WriteLine("Unknown command, enter help for more inforamtion."); break;
|
default: Console.WriteLine("Unknown command, enter help for more inforamtion."); break;
|
||||||
}
|
}
|
||||||
Console.Write("\nCommand: ");
|
Console.Write("\nCommand: ");
|
||||||
@@ -626,7 +742,7 @@ internal class Program
|
|||||||
"\tcheckin guest - Checks in a guest and assigns them a room.\n" +
|
"\tcheckin guest - Checks in a guest and assigns them a room.\n" +
|
||||||
"\tcheckout guest - Checks out a guest and removes their room assignment.\n" +
|
"\tcheckout guest - Checks out a guest and removes their room assignment.\n" +
|
||||||
"\tset rate - Sets a new base rate to begin after a specified date.\n" +
|
"\tset rate - Sets a new base rate to begin after a specified date.\n" +
|
||||||
"Enter Q to quit.\n"
|
"Enter Q or q to quit.\n"
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -791,7 +907,7 @@ internal class Program
|
|||||||
Reservation r = Hotel.GetResByGuest(Hotel.GetGuestByEmail(Email));
|
Reservation r = Hotel.GetResByGuest(Hotel.GetGuestByEmail(Email));
|
||||||
if (r.Type == ReservationType.Incentive || r.Type == ReservationType.Conventional)
|
if (r.Type == ReservationType.Incentive || r.Type == ReservationType.Conventional)
|
||||||
{
|
{
|
||||||
r.Transaction.Pay(r.Transaction.Owed);
|
r.Transaction.Pay(r.Transaction.Owed, r.Guest.CreditCard);
|
||||||
}
|
}
|
||||||
|
|
||||||
Hotel.CheckOutGuest(Email, DateTime.Now.Date);
|
Hotel.CheckOutGuest(Email, DateTime.Now.Date);
|
||||||
@@ -898,6 +1014,7 @@ internal class Program
|
|||||||
case "checkout guest": CheckOut(); break;
|
case "checkout guest": CheckOut(); break;
|
||||||
case "set rate": SetFutureBaseRate(); break;
|
case "set rate": SetFutureBaseRate(); break;
|
||||||
case "Q": return;
|
case "Q": return;
|
||||||
|
case "q": return;
|
||||||
default: Console.WriteLine("Unknown command, enter help for more inforamtion."); break;
|
default: Console.WriteLine("Unknown command, enter help for more inforamtion."); break;
|
||||||
}
|
}
|
||||||
Console.Write("\nCommand: ");
|
Console.Write("\nCommand: ");
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ namespace Ophelias.Reporting
|
|||||||
entries.Add($"{r.Guest.LastName}, {r.Guest.FirstName}\t{r.Type}\t{roominfo}\t{r.EndDate}");
|
entries.Add($"{r.Guest.LastName}, {r.Guest.FirstName}\t{r.Type}\t{roominfo}\t{r.EndDate}");
|
||||||
}
|
}
|
||||||
string report = $"DAILY ARRIVAL REPORT - GENERATED ON {DateTime.Now.Date.ToString("yyyy-MM-dd")}\n" +
|
string report = $"DAILY ARRIVAL REPORT - GENERATED ON {DateTime.Now.Date.ToString("yyyy-MM-dd")}\n" +
|
||||||
$"Last, First\tType\tRoom\tDeparture" +
|
$"Last, First\tType\tRoom\tDeparture\n" +
|
||||||
$"{string.Join("\n", entries)}\n\n";
|
$"{string.Join("\n", entries)}\n\n";
|
||||||
|
|
||||||
File.AppendAllText(Path.GetFullPath("DailyArrivals.txt"), report);
|
File.AppendAllText(Path.GetFullPath("DailyArrivals.txt"), report);
|
||||||
|
|||||||
Reference in New Issue
Block a user