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.
197 lines
7.8 KiB
C#
197 lines
7.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Ophelias.Models;
|
|
using Ophelias.Managers;
|
|
using System.Data.SQLite;
|
|
|
|
namespace Ophelias.Models
|
|
{
|
|
internal class Transaction
|
|
{
|
|
internal int Id { get; set; }
|
|
internal double Rate { get; set; }
|
|
internal double Owed { get; set; }
|
|
internal double Penalty { get; set; }
|
|
internal double Multiplier { get; set; }
|
|
internal double RefundAmount { get; set; }
|
|
internal DateTime PayBy { get; set; }
|
|
internal DateTime? LastPaid { get; set; } = null;
|
|
internal DateTime? PaidOn { get; set; } = null;
|
|
|
|
internal Transaction(double Rate, double Owed,
|
|
double Multiplier, DateTime PayBy, DateTime? LastPaid = null,
|
|
DateTime? PaidOn = null, double RefundAmount = 0, double Penalty = 0)
|
|
{
|
|
int Id;
|
|
using (DatabaseManager Manager = new DatabaseManager())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "INSERT INTO transactions (Rate, Owed, Penalty, Multiplier, RefundAmount, PayBy, LastPaid, PaidOn) " +
|
|
"VALUES (@Rate, @Owed, @Penalty, @Multiplier, @RefundAmount, @PayBy, @LastPaid, @PaidOn)";
|
|
cmd.Parameters.AddWithValue("@Rate", Rate);
|
|
cmd.Parameters.AddWithValue("@Owed", Owed);
|
|
cmd.Parameters.AddWithValue("@Multiplier", Multiplier);
|
|
cmd.Parameters.AddWithValue("@RefundAmount", RefundAmount);
|
|
cmd.Parameters.AddWithValue("@Penalty", Penalty);
|
|
cmd.Parameters.AddWithValue("@PayBy", PayBy.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@LastPaid", LastPaid);
|
|
cmd.Parameters.AddWithValue("@PaidOn", PaidOn);
|
|
if (LastPaid != null)
|
|
cmd.Parameters.AddWithValue("@LastPaid", LastPaid.Value.ToString("yyyy-MM-dd"));
|
|
else
|
|
cmd.Parameters.AddWithValue("@LastPaid", LastPaid);
|
|
if (PaidOn != null)
|
|
cmd.Parameters.AddWithValue("@PaidOn", PaidOn.Value.ToString("yyyy-MM-dd"));
|
|
else
|
|
cmd.Parameters.AddWithValue("@PaidOn", PaidOn);
|
|
|
|
//cmd.CommandText = QueryBuilder.CreateTransaction(Rate, Owed, Multiplier, PayBy, Refund: RefundAmount, Penalty: Penalty, LastPaid: LastPaid, PaidOn: PaidOn);
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
Id = (int)Manager.con.LastInsertRowId;
|
|
}
|
|
this.Id = Id;
|
|
this.Rate = Rate;
|
|
this.Owed = Owed;
|
|
this.Penalty = Penalty;
|
|
this.Multiplier = Multiplier;
|
|
this.RefundAmount = RefundAmount;
|
|
this.PayBy = PayBy;
|
|
this.LastPaid = LastPaid;
|
|
this.PaidOn = PaidOn;
|
|
}
|
|
internal Transaction(int Id, double Rate, double Owed,
|
|
double Multiplier, DateTime PayBy, DateTime? LastPaid = null,
|
|
DateTime? PaidOn = null, double RefundAmount = 0, double Penalty = 0)
|
|
{
|
|
this.Id = Id;
|
|
this.Rate = Rate;
|
|
this.Owed = Owed;
|
|
this.Penalty = Penalty;
|
|
this.Multiplier = Multiplier;
|
|
this.RefundAmount = RefundAmount;
|
|
this.PayBy = PayBy;
|
|
this.LastPaid = LastPaid;
|
|
this.PaidOn = PaidOn;
|
|
}
|
|
|
|
internal void UpdateTransactionFees(double Rate, double Multiplier, DateTime PayBy)
|
|
{
|
|
this.Rate = Rate;
|
|
this.Multiplier = Multiplier;
|
|
this.PayBy = PayBy;
|
|
using (DatabaseManager Manager = new DatabaseManager())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
string? query = QueryBuilder.UpdateTransaction(Id: Id, Rate: this.Rate, Multiplier: this.Multiplier, PayBy: this.PayBy);
|
|
|
|
if (query == null)
|
|
throw new Exception();
|
|
|
|
cmd.CommandText = query;
|
|
cmd.Parameters.AddWithValue("@ID", Id);
|
|
cmd.Parameters.AddWithValue("@Rate", this.Rate);
|
|
cmd.Parameters.AddWithValue("@Multiplier", this.Multiplier);
|
|
cmd.Parameters.AddWithValue("@PayBy", this.PayBy.ToString("yyyy-MM-dd"));
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
internal void Pay(double Amount)
|
|
{
|
|
if (Amount <= 0)
|
|
return;
|
|
LastPaid = DateTime.Now;
|
|
Owed -= Amount;
|
|
if (Owed < 0)
|
|
RefundAmount = Math.Abs(Owed);
|
|
else if (Owed == 0)
|
|
PaidOn = DateTime.Now;
|
|
using (DatabaseManager Manager = new DatabaseManager())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
string? query = QueryBuilder.UpdateTransaction(Id: Id, Owed: Owed, Refund: RefundAmount, LastPaid: LastPaid, PaidOn: PaidOn);
|
|
|
|
if (query == null)
|
|
throw new Exception();
|
|
|
|
cmd.CommandText = query;
|
|
cmd.Parameters.AddWithValue("@ID", Id);
|
|
cmd.Parameters.AddWithValue("@Owed", Owed);
|
|
cmd.Parameters.AddWithValue("@RefundAmount", RefundAmount);
|
|
cmd.Parameters.AddWithValue("@LastPaid", LastPaid);
|
|
cmd.Parameters.AddWithValue("@PaidOn", PaidOn);
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
internal void Refund()
|
|
{
|
|
RefundAmount = 0;
|
|
using (DatabaseManager Manager = new DatabaseManager())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
string? query = QueryBuilder.UpdateTransaction(Id: Id, Refund: RefundAmount);
|
|
|
|
if (query == null)
|
|
throw new Exception();
|
|
|
|
cmd.CommandText = query;
|
|
cmd.Parameters.AddWithValue("@ID", Id);
|
|
cmd.Parameters.AddWithValue("@RefundAmount", RefundAmount);
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
internal static class TxFunctions
|
|
{
|
|
internal static double ConventionalFee = 1.0;
|
|
internal static double PrepaidFee = 0.75;
|
|
internal static double SixtyDayFee = 0.85;
|
|
internal static double Changed = 1.1;
|
|
internal static double IncentiveFee(DateTime Start, DateTime End)
|
|
{
|
|
int thirtyDayOcc;
|
|
thirtyDayOcc = HotelManager.AvgOccupancySpan(Start, End);
|
|
if ((double)(thirtyDayOcc / 45.0) <= 0.6)
|
|
return 0.80;
|
|
return 1.0;
|
|
}
|
|
internal static DateTime GetPayByDate(ReservationType Type, DateTime StartDate, DateTime EndDate)
|
|
{
|
|
switch (Type)
|
|
{
|
|
case ReservationType.Conventional: return EndDate;
|
|
case ReservationType.Prepaid: return StartDate;
|
|
case ReservationType.Incentive: return EndDate;
|
|
case ReservationType.SixtyDayAdvance: return StartDate.AddDays(-30);
|
|
default: throw new NotImplementedException();
|
|
}
|
|
}
|
|
internal static double CalculateOwed(double Rate, int Days)
|
|
{
|
|
return Rate * Days;
|
|
}
|
|
|
|
|
|
}
|
|
internal class TransactionList
|
|
{
|
|
internal List<Transaction> Transactions;
|
|
|
|
internal TransactionList()
|
|
{
|
|
Transactions = new List<Transaction>();
|
|
}
|
|
}
|
|
}
|