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.
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, double Multiplier)
|
|
{
|
|
return Rate * Days * Multiplier;
|
|
}
|
|
|
|
|
|
}
|
|
internal class TransactionList
|
|
{
|
|
internal List<Transaction> Transactions;
|
|
|
|
internal TransactionList()
|
|
{
|
|
Transactions = new List<Transaction>();
|
|
}
|
|
}
|
|
}
|