963 lines
47 KiB
C#
963 lines
47 KiB
C#
using Ophelias.Models;
|
|
using System.Data.SQLite;
|
|
|
|
namespace Ophelias.Managers
|
|
{
|
|
internal static class Hotel
|
|
{
|
|
internal static int GetLastId(string tableName)
|
|
{
|
|
int LastId = 0;
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = $"SELECT SEQ FROM sqlite_sequence WHERE name=@Table;";
|
|
cmd.ExecuteNonQuery();
|
|
cmd.Parameters.AddWithValue("@Table", tableName);
|
|
using SQLiteDataReader reader = cmd.ExecuteReader();
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
LastId = reader.GetInt32(0);
|
|
}
|
|
}
|
|
}
|
|
return LastId;
|
|
}
|
|
internal static (List<(DateTime, int, string, string)>, List<int>) GetDailyOccupancy()
|
|
{
|
|
List<int> previousOccupancies = new();
|
|
List<(DateTime, int, string, string)> currentOccupancies = new();
|
|
using (Database Manager = new())
|
|
{
|
|
using SQLiteTransaction Transaction = Manager.con.BeginTransaction();
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT RoomNum, Lname, Fname, EndDate FROM reservations " +
|
|
"INNER JOIN guests ON reservations.GuestID = guests.ID " +
|
|
"INNER JOIN rooms ON reservations.RoomNum = rooms.ID " +
|
|
"WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status IN (@Status1,@Status2) AND CheckIn IS NOT NULL " +
|
|
"ORDER BY RoomNum ASC;";
|
|
cmd.Parameters.AddWithValue("@Date", DateTime.Now.Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
currentOccupancies.Add((reader.GetDateTime(3), reader.GetInt32(0), reader.GetString(1), reader.GetString(2)));
|
|
}
|
|
}
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT RoomNum FROM reservations " +
|
|
"INNER JOIN guests ON reservations.GuestID = guests.ID " +
|
|
"INNER JOIN rooms ON reservations.RoomNum = rooms.ID " +
|
|
"WHERE DATE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status IN (@Status1);";
|
|
cmd.Parameters.AddWithValue("@Date", DateTime.Now.AddDays(-1).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Ended);
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
foreach (int item in reader.GetValues())
|
|
{
|
|
previousOccupancies.Add(item);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Transaction.Commit();
|
|
}
|
|
return (currentOccupancies, previousOccupancies);
|
|
}
|
|
internal static List<Reservation> GetDailyArrivals()
|
|
{
|
|
List<Reservation> reservations = new();
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT * FROM reservations " +
|
|
"INNER JOIN transactions ON reservations.TransactionID = transactions.ID " +
|
|
"INNER JOIN guests ON reservations.GuestID = guests.ID " +
|
|
"WHERE DATE (@Date) = StartDate AND Status IN (@Status1,@Status2)" +
|
|
"ORDER BY Lname ASC;";
|
|
cmd.Parameters.AddWithValue("@Date", DateTime.Now.Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
Reservation? r;
|
|
Transaction? t;
|
|
Guest g;
|
|
int? RoomNumber = null;
|
|
DateTime? CheckIn = null, CheckOut = null, DateChanged = null, LastPaid = null, PaidOn = null;
|
|
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
if (reader[21].GetType() != typeof(DBNull))
|
|
{
|
|
LastPaid = reader.GetDateTime(21);
|
|
}
|
|
|
|
if (reader[22].GetType() != typeof(DBNull))
|
|
{
|
|
PaidOn = reader.GetDateTime(22);
|
|
}
|
|
|
|
t = new(reader.GetInt32(13), reader.GetDouble(14), reader.GetDouble(15), reader.GetDouble(17), reader.GetDateTime(20),
|
|
LastPaid: LastPaid, PaidOn: PaidOn, RefundAmount: reader.GetDouble(18), Penalty: reader.GetDouble(16), AmountPaid: reader.GetDouble(19));
|
|
|
|
g = new(reader.GetInt32(23), reader.GetString(24), reader.GetString(25), reader.GetString(26), reader.GetString(27), reader.GetString(28), reader.GetString(29));
|
|
|
|
if (reader[1].GetType() != typeof(DBNull))
|
|
{
|
|
RoomNumber = reader.GetInt32(1);
|
|
}
|
|
|
|
if (reader[10].GetType() != typeof(DBNull))
|
|
{
|
|
CheckIn = reader.GetDateTime(10);
|
|
}
|
|
|
|
if (reader[11].GetType() != typeof(DBNull))
|
|
{
|
|
CheckOut = reader.GetDateTime(11);
|
|
}
|
|
|
|
if (reader[12].GetType() != typeof(DBNull))
|
|
{
|
|
DateChanged = reader.GetDateTime(12);
|
|
}
|
|
|
|
r = new(reader.GetInt32(0), g, t, (ReservationType)reader.GetInt32(5), (ReservationStatus)reader.GetInt32(6),
|
|
reader.GetDateTime(7), reader.GetDateTime(8), reader.GetDateTime(9), RoomNum: RoomNumber, IsNoShow: reader.GetBoolean(4),
|
|
CheckIn: CheckIn, CheckOut: CheckOut, DateChanged: DateChanged);
|
|
reservations.Add(r);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return reservations;
|
|
}
|
|
internal static (double, double, List<(DateTime, double)>) GetIncentiveTransactions()
|
|
{
|
|
double losses;
|
|
double totalLosses = 0;
|
|
int days = 30;
|
|
DateTime dt = DateTime.Now;
|
|
List<(DateTime, double)> dailyLosses = new();
|
|
using (Database Manager = new())
|
|
{
|
|
for (int i = 0; i < days; i++)
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT sum(((julianday(EndDate) - julianday(StartDate)) * transactions.Rate) - transactions.Owed) AS Loss " +
|
|
"FROM reservations " +
|
|
"INNER JOIN transactions ON reservations.TransactionID = transactions.ID " +
|
|
"WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND STATUS IN (@Status1,@Status2) AND Type = @Type";
|
|
cmd.Parameters.AddWithValue("@Date", dt.AddDays(i).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
cmd.Parameters.AddWithValue("@Type", (int)ReservationType.Incentive);
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
totalLosses += reader.GetDouble(0);
|
|
losses = reader.GetDouble(0);
|
|
}
|
|
else
|
|
{
|
|
losses = 0;
|
|
}
|
|
}
|
|
}
|
|
dailyLosses.Add((dt.AddDays(i), losses));
|
|
}
|
|
}
|
|
return (totalLosses, totalLosses / 30, dailyLosses);
|
|
}
|
|
internal static (List<(DateTime, double)>, double, double) GetExpectedIncomeCount()
|
|
{
|
|
double totalIncome = 0;
|
|
double income;
|
|
int days = 30;
|
|
DateTime dt = DateTime.Now;
|
|
List<(DateTime, double)> dailyIncomes = new();
|
|
using (Database Manager = new())
|
|
{
|
|
for (int i = 0; i < days; i++)
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT sum(transactions.Owed) FROM reservations " +
|
|
"INNER JOIN transactions ON reservations.TransactionID = transactions.ID " +
|
|
"WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status IN (@Status1,@Status2);";
|
|
cmd.Parameters.AddWithValue("@Date", dt.AddDays(i).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
totalIncome += reader.GetDouble(0);
|
|
income = reader.GetDouble(0);
|
|
}
|
|
else
|
|
{
|
|
income = 0;
|
|
}
|
|
}
|
|
}
|
|
dailyIncomes.Add((dt.AddDays(i), income));
|
|
}
|
|
}
|
|
return (dailyIncomes, totalIncome, totalIncome / 30);
|
|
}
|
|
internal static (double, List<(DateTime, int, int, int, int, int)>) GetExpectedOccupancyCount()
|
|
{
|
|
double thirtyDayOcc = 0;
|
|
int days = 30;
|
|
DateTime dt = DateTime.Now;
|
|
List<(DateTime, int, int, int, int, int)> occData = new();
|
|
using (Database Manager = new())
|
|
{
|
|
for (int i = 0; i < days; i++)
|
|
{
|
|
int rooms, conventional, prepaid, sixty, incentive;
|
|
using (SQLiteTransaction Transaction = Manager.con.BeginTransaction())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT COUNT(*) " +
|
|
"FROM reservations " +
|
|
"WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status in (@Status1,@Status2);";
|
|
cmd.Parameters.AddWithValue("@Date", dt.AddDays(i).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
thirtyDayOcc += reader.GetInt32(0);
|
|
rooms = reader.GetInt32(0);
|
|
}
|
|
else
|
|
{
|
|
rooms = 0;
|
|
}
|
|
}
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT COUNT(*) " +
|
|
"FROM reservations " +
|
|
"WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status in (@Status1,@Status2) AND Type = 0;";
|
|
cmd.Parameters.AddWithValue("@Date", dt.AddDays(i).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
conventional = reader.GetInt32(0);
|
|
}
|
|
else
|
|
{
|
|
conventional = 0;
|
|
}
|
|
}
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT COUNT(*) " +
|
|
"FROM reservations " +
|
|
"WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status in (@Status1,@Status2) AND Type = 1;";
|
|
cmd.Parameters.AddWithValue("@Date", dt.AddDays(i).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
prepaid = reader.GetInt32(0);
|
|
}
|
|
else
|
|
{
|
|
prepaid = 0;
|
|
}
|
|
}
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT COUNT(*) " +
|
|
"FROM reservations " +
|
|
"WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status in (@Status1,@Status2) AND Type = 2;";
|
|
cmd.Parameters.AddWithValue("@Date", dt.AddDays(i).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
sixty = reader.GetInt32(0);
|
|
}
|
|
else
|
|
{
|
|
sixty = 0;
|
|
}
|
|
}
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT COUNT(*) " +
|
|
"FROM reservations " +
|
|
"WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status in (@Status1,@Status2) AND Type = 3;";
|
|
cmd.Parameters.AddWithValue("@Date", dt.AddDays(i).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
incentive = reader.GetInt32(0);
|
|
}
|
|
else
|
|
{
|
|
incentive = 0;
|
|
}
|
|
}
|
|
}
|
|
Transaction.Commit();
|
|
}
|
|
occData.Add((dt.AddDays(i), rooms, conventional, prepaid, sixty, incentive));
|
|
}
|
|
}
|
|
return (thirtyDayOcc / days, occData);
|
|
}
|
|
internal static (int, bool) AvgOccupancySpan(DateTime Start, DateTime End)
|
|
{
|
|
int thirtyDayOcc = 0;
|
|
bool maxCapacityInRange = false;
|
|
int days = (int)(End.Date - Start.Date).TotalDays;
|
|
using (Database Manager = new())
|
|
{
|
|
for (int i = 0; i < days; i++)
|
|
{
|
|
using SQLiteCommand cmd = Manager.con.CreateCommand();
|
|
cmd.CommandText = $@"SELECT COUNT(*)
|
|
FROM reservations
|
|
WHERE (DATE(@Date) BETWEEN StartDate AND EndDate) AND Status in (@Status1,@Status2);";
|
|
cmd.Parameters.AddWithValue("@Date", Start.AddDays(i).Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
|
|
using SQLiteDataReader reader = cmd.ExecuteReader();
|
|
reader.Read();
|
|
if (reader.HasRows && !reader.IsDBNull(0))
|
|
{
|
|
thirtyDayOcc += reader.GetInt32(0);
|
|
if (reader.GetInt32(0) == 45)
|
|
{
|
|
maxCapacityInRange = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (thirtyDayOcc / days, maxCapacityInRange);
|
|
}
|
|
internal static Guest? GetGuestByEmail(string Email)
|
|
{
|
|
Guest? g = null;
|
|
using (Database Manager = new())
|
|
{
|
|
using SQLiteCommand cmd = Manager.con.CreateCommand();
|
|
cmd.CommandText = $"SELECT * FROM guests WHERE Email = @Email";
|
|
cmd.Parameters.AddWithValue("@Email", Email);
|
|
using SQLiteDataReader reader = cmd.ExecuteReader();
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
string? CreditCard = null, Expiration = null, CCV = null;
|
|
if (reader[4].GetType() != typeof(DBNull))
|
|
{
|
|
CreditCard = reader[4].ToString();
|
|
}
|
|
|
|
if (reader[5].GetType() != typeof(DBNull))
|
|
{
|
|
Expiration = reader[5].ToString();
|
|
}
|
|
|
|
if (reader[6].GetType() != typeof(DBNull))
|
|
{
|
|
CCV = reader[6].ToString();
|
|
}
|
|
|
|
g = new(reader.GetInt32(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), CreditCard, Expiration, CCV);
|
|
}
|
|
}
|
|
return g;
|
|
}
|
|
internal static Reservation? GetResByGuest(Guest g)
|
|
{
|
|
Reservation? r = null;
|
|
Transaction? t;
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
int? RoomNumber = null;
|
|
DateTime? CheckIn = null, CheckOut = null, DateChanged = null, LastPaid = null, PaidOn = null;
|
|
|
|
cmd.CommandText = @"SELECT * FROM reservations
|
|
INNER JOIN transactions ON reservations.TransactionID = transactions.ID
|
|
WHERE GuestID = @GuestID AND Status = @Status;";
|
|
cmd.Parameters.AddWithValue("@GuestID", g.Id);
|
|
cmd.Parameters.AddWithValue("@Status", (int)ReservationStatus.Active);
|
|
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
if (reader[21].GetType() != typeof(DBNull))
|
|
{
|
|
LastPaid = reader.GetDateTime(21);
|
|
}
|
|
|
|
if (reader[22].GetType() != typeof(DBNull))
|
|
{
|
|
PaidOn = reader.GetDateTime(22);
|
|
}
|
|
|
|
t = new(reader.GetInt32(13), reader.GetDouble(14), reader.GetDouble(15), reader.GetDouble(17), reader.GetDateTime(20),
|
|
LastPaid: LastPaid, PaidOn: PaidOn, RefundAmount: reader.GetDouble(18), Penalty: reader.GetDouble(16), AmountPaid: reader.GetDouble(19));
|
|
|
|
if (reader[1].GetType() != typeof(DBNull))
|
|
{
|
|
RoomNumber = reader.GetInt32(1);
|
|
}
|
|
|
|
if (reader[10].GetType() != typeof(DBNull))
|
|
{
|
|
CheckIn = reader.GetDateTime(10);
|
|
}
|
|
|
|
if (reader[11].GetType() != typeof(DBNull))
|
|
{
|
|
CheckOut = reader.GetDateTime(11);
|
|
}
|
|
|
|
if (reader[12].GetType() != typeof(DBNull))
|
|
{
|
|
DateChanged = reader.GetDateTime(12);
|
|
}
|
|
|
|
r = new(reader.GetInt32(0), g, t, (ReservationType)reader.GetInt32(5), (ReservationStatus)reader.GetInt32(6),
|
|
reader.GetDateTime(7), reader.GetDateTime(8), reader.GetDateTime(9), RoomNum: RoomNumber, IsNoShow: reader.GetBoolean(4),
|
|
CheckIn: CheckIn, CheckOut: CheckOut, DateChanged: DateChanged);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
internal static TimeRefs? CanBeCheckedIn(string Email)
|
|
{
|
|
TimeRefs? status = null;
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = $"SELECT * FROM reservation WHERE Email = @Email AND Status IN (0,1)";
|
|
cmd.Parameters.AddWithValue("@Email", Email);
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
DateTime dt = reader.GetDateTime(8);
|
|
if (dt.Date == DateTime.Now.Date)
|
|
{
|
|
status = TimeRefs.OnTime;
|
|
}
|
|
else if (dt.Date > DateTime.Now.Date)
|
|
{
|
|
status = TimeRefs.Late;
|
|
}
|
|
else if (dt.Date < DateTime.Now.Date)
|
|
{
|
|
status = TimeRefs.Early;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
status = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
internal static double? GetBaseRate()
|
|
{
|
|
double? rate;
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
string query = "SELECT Rate FROM rates WHERE DefaultRate = 1;";
|
|
cmd.CommandText = query;
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
rate = reader.GetDouble(0);
|
|
}
|
|
else
|
|
{
|
|
rate = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return rate;
|
|
}
|
|
internal static bool GetBaseRateByDate(DateTime dt)
|
|
{
|
|
bool configured;
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
string query = "SELECT Rate FROM rates WHERE DateSet = @Date;";
|
|
cmd.CommandText = query;
|
|
cmd.Parameters.AddWithValue("@Date", dt.ToString("yyyy-MM-dd"));
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
configured = true;
|
|
}
|
|
else
|
|
{
|
|
configured = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return configured;
|
|
}
|
|
internal static void SetBaseRate(double Rate, DateTime DateSet, bool? DefaultRate = null)
|
|
{
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
string query = $"INSERT INTO rates (Rate, DateSet, DefaultRate) VALUES (@Rate, @DateSet, @DefaultRate);";
|
|
cmd.CommandText = query;
|
|
cmd.Parameters.AddWithValue("@Rate", Rate);
|
|
cmd.Parameters.AddWithValue("@DateSet", DateSet.ToString("yyyy-MM-dd"));
|
|
if (DefaultRate != null)
|
|
{
|
|
if (DefaultRate.Value == true)
|
|
{
|
|
cmd.Parameters.AddWithValue("@DefaultRate", Convert.ToInt32(DefaultRate));
|
|
}
|
|
else
|
|
{
|
|
cmd.Parameters.AddWithValue("@DefaultRate", null);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cmd.Parameters.AddWithValue("@DefaultRate", null);
|
|
}
|
|
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
internal static void UpdateBaseRate(double Rate, DateTime DateSet, bool? DefaultRate = null)
|
|
{
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
if (DefaultRate != null)
|
|
{
|
|
if (DefaultRate.Value == true)
|
|
{
|
|
cmd.CommandText = $"UPDATE rates SET rate = @Rate, defaultrate = @DefaultRate WHERE DateSet = @Date;";
|
|
cmd.Parameters.AddWithValue("@DefaultRate", Convert.ToInt32(DefaultRate));
|
|
}
|
|
else
|
|
{
|
|
cmd.CommandText = $"UPDATE rates SET rate = @Rate WHERE DateSet = @Date;";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cmd.CommandText = $"UPDATE rates SET rate = @Rate WHERE DateSet = @Date;";
|
|
}
|
|
cmd.Parameters.AddWithValue("@Rate", Rate);
|
|
cmd.Parameters.AddWithValue("@Date", DateSet.ToString("yyyy-MM-dd"));
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
internal static bool CheckBaseRate()
|
|
{
|
|
int? OldId = null;
|
|
bool Success = true;
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
string query = "SELECT Id FROM rates WHERE DefaultRate = 1;";
|
|
cmd.CommandText = query;
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
OldId = reader.GetInt32(0);
|
|
}
|
|
}
|
|
}
|
|
int? Id;
|
|
if (OldId != null)
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
string query = "SELECT Id FROM rates WHERE DateSet = @Date;";
|
|
cmd.CommandText = query;
|
|
cmd.Parameters.AddWithValue("@Date", DateTime.Now.Date.ToString("yyyy-MM-dd"));
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
Id = reader.GetInt32(0);
|
|
}
|
|
else
|
|
{
|
|
Id = null;
|
|
}
|
|
}
|
|
}
|
|
if (Id != null)
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = @"UPDATE rates SET DefaultRate = NULL WHERE Id = @OldID;
|
|
UPDATE rates SET DefaultRate = 1 WHERE Id = @ID";
|
|
cmd.Parameters.AddWithValue("@OldID", OldId);
|
|
cmd.Parameters.AddWithValue("@ID", Id);
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Success = false;
|
|
}
|
|
}
|
|
return Success;
|
|
}
|
|
internal static int? CheckInGuest(string Email, DateTime CheckIn)
|
|
{
|
|
int? RoomID = null;
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteTransaction Transaction = Manager.con.BeginTransaction())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "UPDATE reservations SET RoomNum = (SELECT ID FROM rooms WHERE Occupied = 0 LIMIT 1), CheckIn = @Date " +
|
|
"WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email) AND RoomNum IS NULL AND Status in (@SActive,@SChanged);";
|
|
cmd.Parameters.AddWithValue("@Email", Email);
|
|
cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed);
|
|
cmd.Parameters.AddWithValue("@Date", CheckIn.ToString("yyyy-MM-dd"));
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "UPDATE rooms SET Occupied = 1 " +
|
|
"WHERE ID = (SELECT RoomNum FROM reservations WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email AND Status in (@SActive,@SChanged))));";
|
|
cmd.Parameters.AddWithValue("@Email", Email);
|
|
cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed);
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT RoomNum FROM reservations WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email AND Status in (@SActive,@SChanged))";
|
|
cmd.Parameters.AddWithValue("@Email", Email);
|
|
cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed);
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
RoomID = (int)reader.GetValue(0);
|
|
}
|
|
}
|
|
}
|
|
Transaction.Commit();
|
|
}
|
|
}
|
|
return RoomID;
|
|
}
|
|
internal static bool GuestCurrentlyCheckedIn(string Email)
|
|
{
|
|
bool EntryFound;
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT * FROM reservations " +
|
|
"WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email AND Status in (@SActive,@SChanged)) AND CheckIn IS NOT NULL";
|
|
cmd.Parameters.AddWithValue("@Email", Email);
|
|
cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed);
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
reader.Read();
|
|
if (reader.HasRows)
|
|
{
|
|
EntryFound = true;
|
|
}
|
|
else
|
|
{
|
|
EntryFound = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return EntryFound;
|
|
}
|
|
internal static void CheckOutGuest(string Email, DateTime CheckOut)
|
|
{
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteTransaction Transaction = Manager.con.BeginTransaction())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "UPDATE rooms SET Occupied = 0 " +
|
|
"WHERE ID = (SELECT RoomNum FROM reservations WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email AND Status in (@SActive,@SChanged)));";
|
|
cmd.Parameters.AddWithValue("@Email", Email);
|
|
cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed);
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "UPDATE reservations SET CheckOut = @Date, Status = @Status " +
|
|
"WHERE GuestID = (SELECT ID FROM guests WHERE Email = @Email) AND RoomNum IS NOT NULL AND Status in (@SActive,@SChanged) AND CheckIn IS NULL;";
|
|
cmd.Parameters.AddWithValue("@Email", Email);
|
|
cmd.Parameters.AddWithValue("@Status", (int)ReservationStatus.Ended);
|
|
cmd.Parameters.AddWithValue("@SActive", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@SChanged", (int)ReservationStatus.Changed);
|
|
cmd.Parameters.AddWithValue("@Date", CheckOut.ToString("yyyy-MM-dd"));
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
Transaction.Commit();
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
internal static List<Reservation> GetActiveSixtyDayRes()
|
|
{
|
|
List<Reservation> list = new();
|
|
using (Database Manager = new())
|
|
{
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT * FROM reservations " +
|
|
"INNER JOIN transactions ON reservations.TransactionID = transactions.ID " +
|
|
"INNER JOIN guests ON reservations.GuestID = guests.ID " +
|
|
"WHERE Type = @Type AND Status IN (@Status1,@Status2);";
|
|
cmd.Parameters.AddWithValue("@Type", (int)ReservationType.SixtyDayAdvance);
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
cmd.ExecuteNonQuery();
|
|
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
Reservation? r;
|
|
Transaction? t;
|
|
Guest g;
|
|
int? RoomNumber = null;
|
|
DateTime? CheckIn = null, CheckOut = null, DateChanged = null, LastPaid = null, PaidOn = null;
|
|
|
|
if (reader.HasRows)
|
|
{
|
|
if (reader[21].GetType() != typeof(DBNull))
|
|
{
|
|
LastPaid = reader.GetDateTime(21);
|
|
}
|
|
|
|
if (reader[22].GetType() != typeof(DBNull))
|
|
{
|
|
PaidOn = reader.GetDateTime(22);
|
|
}
|
|
|
|
t = new(reader.GetInt32(13), reader.GetDouble(14), reader.GetDouble(15), reader.GetDouble(17), reader.GetDateTime(20),
|
|
LastPaid: LastPaid, PaidOn: PaidOn, RefundAmount: reader.GetDouble(18), Penalty: reader.GetDouble(16), AmountPaid: reader.GetDouble(19));
|
|
|
|
g = new(reader.GetInt32(23), reader.GetString(24), reader.GetString(25), reader.GetString(26), reader.GetString(27), reader.GetString(28), reader.GetString(29));
|
|
|
|
if (reader[1].GetType() != typeof(DBNull))
|
|
{
|
|
RoomNumber = reader.GetInt32(1);
|
|
}
|
|
|
|
if (reader[10].GetType() != typeof(DBNull))
|
|
{
|
|
CheckIn = reader.GetDateTime(10);
|
|
}
|
|
|
|
if (reader[11].GetType() != typeof(DBNull))
|
|
{
|
|
CheckOut = reader.GetDateTime(11);
|
|
}
|
|
|
|
if (reader[12].GetType() != typeof(DBNull))
|
|
{
|
|
DateChanged = reader.GetDateTime(12);
|
|
}
|
|
|
|
r = new(reader.GetInt32(0), g, t, (ReservationType)reader.GetInt32(5), (ReservationStatus)reader.GetInt32(6),
|
|
reader.GetDateTime(7), reader.GetDateTime(8), reader.GetDateTime(9), RoomNum: RoomNumber, IsNoShow: reader.GetBoolean(4),
|
|
CheckIn: CheckIn, CheckOut: CheckOut, DateChanged: DateChanged);
|
|
list.Add(r);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
internal static List<Reservation> GetPastDueReservations()
|
|
{
|
|
List<Reservation> list = new();
|
|
using (Database Manager = new())
|
|
{
|
|
using SQLiteTransaction Transaction = Manager.con.BeginTransaction();
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "SELECT * FROM reservations " +
|
|
"INNER JOIN transactions ON reservations.TransactionID = transactions.ID " +
|
|
"INNER JOIN guests ON reservations.GuestID = guests.ID " +
|
|
"WHERE DATE(@Date) > StartDate AND Status IN (@Status1,@Status2) AND CheckIn IS NULL;";
|
|
cmd.Parameters.AddWithValue("@Date", DateTime.Now.Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
using (SQLiteDataReader reader = cmd.ExecuteReader())
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
Reservation? r;
|
|
Transaction? t;
|
|
Guest g;
|
|
int? RoomNumber = null;
|
|
DateTime? CheckIn = null, CheckOut = null, DateChanged = null, LastPaid = null, PaidOn = null;
|
|
|
|
if (reader.HasRows)
|
|
{
|
|
if (reader[21].GetType() != typeof(DBNull))
|
|
{
|
|
LastPaid = reader.GetDateTime(21);
|
|
}
|
|
|
|
if (reader[22].GetType() != typeof(DBNull))
|
|
{
|
|
PaidOn = reader.GetDateTime(22);
|
|
}
|
|
|
|
t = new(reader.GetInt32(13), reader.GetDouble(14), reader.GetDouble(15), reader.GetDouble(17), reader.GetDateTime(20),
|
|
LastPaid: LastPaid, PaidOn: PaidOn, RefundAmount: reader.GetDouble(18), Penalty: reader.GetDouble(16), AmountPaid: reader.GetDouble(19));
|
|
|
|
g = new(reader.GetInt32(23), reader.GetString(24), reader.GetString(25), reader.GetString(26), reader.GetString(27), reader.GetString(28), reader.GetString(29));
|
|
|
|
if (reader[1].GetType() != typeof(DBNull))
|
|
{
|
|
RoomNumber = reader.GetInt32(1);
|
|
}
|
|
|
|
if (reader[10].GetType() != typeof(DBNull))
|
|
{
|
|
CheckIn = reader.GetDateTime(10);
|
|
}
|
|
|
|
if (reader[11].GetType() != typeof(DBNull))
|
|
{
|
|
CheckOut = reader.GetDateTime(11);
|
|
}
|
|
|
|
if (reader[12].GetType() != typeof(DBNull))
|
|
{
|
|
DateChanged = reader.GetDateTime(12);
|
|
}
|
|
|
|
r = new(reader.GetInt32(0), g, t, (ReservationType)reader.GetInt32(5), (ReservationStatus)reader.GetInt32(6),
|
|
reader.GetDateTime(7), reader.GetDateTime(8), reader.GetDateTime(9), RoomNum: RoomNumber, IsNoShow: reader.GetBoolean(4),
|
|
CheckIn: CheckIn, CheckOut: CheckOut, DateChanged: DateChanged);
|
|
list.Add(r);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
using (SQLiteCommand cmd = Manager.con.CreateCommand())
|
|
{
|
|
cmd.CommandText = "UPDATE reservations SET IsNoShow = 1, DateChanged = @DateChanged " +
|
|
"WHERE DATE (@Date) > StartDate AND Status IN (@Status1,@Status2) AND CheckIn IS NULL";
|
|
cmd.Parameters.AddWithValue("@Date", DateTime.Now.Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@DateChanged", DateTime.Now.Date.ToString("yyyy-MM-dd"));
|
|
cmd.Parameters.AddWithValue("@Status1", (int)ReservationStatus.Active);
|
|
cmd.Parameters.AddWithValue("@Status2", (int)ReservationStatus.Changed);
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
Transaction.Commit();
|
|
}
|
|
return list;
|
|
}
|
|
}
|
|
internal enum TimeRefs
|
|
{
|
|
OnTime,
|
|
Early,
|
|
Late
|
|
}
|
|
}
|