Files
ophelias-oasis/OpheliasOasis/Models/Transaction.cs
雲華 f1a1b5d067 Update models with more functionality
This is a small commit that aims to add some more descriptive
functionality to the models.

Guest now has more creditcard information
such as CCV and an expiration date to bring it in-line with what would
be expected.

Reservation implemented a very loose cancellation function,
this may be moved out.

Transaction has a few more tweaks that follows the same goal as guest,
however this functionality may be migrated as well.
2022-04-09 04:45:42 -04:00

168 lines
5.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ophelias.Models;
namespace Ophelias.Models
{
internal class Transaction
{
private double PenaltyMultipler = 1.1;
internal int Id;
internal double Rate;
internal double Paid;
internal double Owed;
internal double? Penalty;
internal double? Multiplier;
internal double RefundAmount;
internal bool? Late;
internal bool PaidOff;
internal DateTime PayBy;
internal DateTime PaidOn;
internal Transaction(int id, Reservation r, DateTime payby)
{
Id = id;
Paid = 0;
Owed = 0;
RefundAmount = 0;
PaidOff = false;
PayBy = SetPayByDate(r);
Multiplier = Fee(r.Type);
}
private bool IsOverdue()
{
if (DateTime.Now > PayBy)
{
return true;
}
return false;
}
private DateTime SetPayByDate(Reservation r)
{
switch(r.Type)
{
case ReservationType.Conventional: return r.EndDate;
case ReservationType.Prepaid: return r.StartDate;
case ReservationType.Incentive: return r.EndDate;
case ReservationType.SixtyDayAdvance: return r.StartDate.AddDays(-30);
default: throw new NotImplementedException();
}
}
private void SetChangeFees(ReservationType type, double rate)
{
switch (type)
{
case ReservationType.Conventional: return;
case ReservationType.Prepaid: SetFee(PenaltyMultipler); SetRate(rate); return;
case ReservationType.Incentive: return;
case ReservationType.SixtyDayAdvance: SetFee(PenaltyMultipler); SetRate(rate); return;
default: throw new NotImplementedException();
}
}
private void CancellationHandler(ReservationType type)
{
void SetRefund()
{
if (DateTime.Now.AddDays(+3).Day <= PayBy.Day)
{
RefundAmount = Paid;
Paid = 0;
Owed = 0;
PaidOff = false;
}
}
switch (type)
{
case ReservationType.Conventional: SetRefund(); return;
case ReservationType.Prepaid: return;
case ReservationType.Incentive: SetRefund(); return;
case ReservationType.SixtyDayAdvance: return;
default: throw new NotImplementedException();
}
}
internal void Penalize(Reservation r)
{
switch (r.Status)
{
case ReservationStatus.Active: IsOverdue(); return;
case ReservationStatus.Ended: IsOverdue(); return;
case ReservationStatus.Cancelled: CancellationHandler(r.Type); return;
default: throw new NotImplementedException();
}
}
internal void Penalize(Reservation r, double rate)
{
switch(r.Status)
{
case ReservationStatus.Changed: SetChangeFees(r.Type, rate); return;
default: throw new NotImplementedException();
}
}
private double Fee(ReservationType type)
{
switch (type)
{
case ReservationType.Conventional: return 1.0;
case ReservationType.Prepaid: return 0.75;
case ReservationType.Incentive: return GetIncentiveRate();
case ReservationType.SixtyDayAdvance: return 0.85;
default: throw new NotImplementedException();
}
}
private double GetIncentiveRate()
{
return 0.80;
}
private void SetFee(double mult)
{
Multiplier = mult;
}
private void SetRate(double rate)
{
Rate = rate;
}
internal void Pay(double amount)
{
if (RefundAmount > -1)
{
return;
}
Paid += amount;
if (Paid == Owed)
{
Owed -= Paid;
PaidOn = DateTime.Now;
PaidOff = true;
} else if (Paid > Owed)
{
RefundAmount = Paid - Owed;
Owed = Owed - Paid + RefundAmount;
PaidOn = DateTime.Now;
PaidOff = true;
} else
{
Owed -= Paid;
PaidOn = DateTime.Now;
}
}
}
internal class TransactionList
{
internal List<Transaction> Transactions;
internal TransactionList()
{
Transactions = new List<Transaction>();
}
}
}