Files
ophelias-oasis/OpheliasOasis/Models/Transaction.cs
雲華 fbb75a583d First major version of the project
This finishes the first iteration of the project. Reports have been
tested and are functional in terms of writing out and outputting some
form of text. There are still a few bugs here and there that are found
but ultimately this commit is so testing can begin.

Since the changes are too large to individually summarize, here is the
generalization:

Reports have been integrated into the admin mode. They write out to text
files rather than export to say email or a printer as it was not to be
considered for this version. The files are appended too and exist in the
debug director of the project. I made this easier to find by outputting
where the files were output to after running the report.

Other changes included some bug fixes, optimizations, and a few bit of
automatic cleanup. This may lead to sylistic inconsistencies.

Documentation will come in a later commit.
2022-04-16 04:42:13 -04:00

213 lines
7.9 KiB
C#

using Ophelias.Managers;
using System.Data.SQLite;
namespace Ophelias.Models
{
internal class Transaction
{
internal int Id;
internal double Rate;
internal double Owed;
internal double Penalty;
internal double Multiplier;
internal double RefundAmount;
internal double AmountPaid;
internal DateTime PayBy;
internal DateTime? LastPaid = null;
internal DateTime? PaidOn = null;
internal Transaction(double Rate, double Owed,
double Multiplier, DateTime PayBy, DateTime? LastPaid = null,
DateTime? PaidOn = null, double RefundAmount = 0, double Penalty = 0, double AmountPaid = 0)
{
int Id;
using (Database Manager = new())
{
using (SQLiteCommand cmd = Manager.con.CreateCommand())
{
cmd.CommandText = "INSERT INTO transactions (Rate, Owed, Penalty, Multiplier, RefundAmount, AmountPaid, PayBy, LastPaid, PaidOn) " +
"VALUES (@Rate, @Owed, @Penalty, @Multiplier, @RefundAmount, @AmountPaid, @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("@AmountPaid", AmountPaid);
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.AmountPaid = AmountPaid;
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, double AmountPaid = 0)
{
this.Id = Id;
this.Rate = Rate;
this.Owed = Owed;
this.Penalty = Penalty;
this.Multiplier = Multiplier;
this.RefundAmount = RefundAmount;
this.AmountPaid = AmountPaid;
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 Database Manager = new();
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;
AmountPaid += Amount;
if (Owed - AmountPaid < 0)
{
RefundAmount = Math.Abs(Owed - Amount);
}
if (Owed - AmountPaid <= 0)
{
PaidOn = DateTime.Now;
}
using Database Manager = new();
using SQLiteCommand cmd = Manager.con.CreateCommand();
string? query = QueryBuilder.UpdateTransaction(Id: Id, Refund: RefundAmount, AmountPaid: AmountPaid, LastPaid: LastPaid, PaidOn: PaidOn);
if (query == null)
{
throw new Exception();
}
cmd.CommandText = query;
cmd.Parameters.AddWithValue("@ID", Id);
cmd.Parameters.AddWithValue("@RefundAmount", RefundAmount);
cmd.Parameters.AddWithValue("@AmountPaid", AmountPaid);
cmd.Parameters.AddWithValue("@LastPaid", LastPaid.Value.ToString("yyyy-MM-dd"));
if(!PaidOn.HasValue)
throw new Exception();
cmd.Parameters.AddWithValue("@PaidOn", PaidOn.Value.ToString("yyyy-MM-dd"));
cmd.ExecuteNonQuery();
}
internal void Refund()
{
AmountPaid -= RefundAmount;
RefundAmount = 0;
using Database Manager = new();
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, _) = Hotel.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 Math.Round(Rate * Days * Multiplier);
}
}
internal class TransactionList
{
internal List<Transaction> Transactions;
internal TransactionList()
{
Transactions = new();
}
}
}