This commit is contained in:
Zeeshaun
2026-03-17 08:54:34 -05:00
parent 64856c640e
commit cdcba54aa4
330 changed files with 54110 additions and 0 deletions
@@ -0,0 +1,18 @@
namespace ReserveManagementSystemLib.Models
{
public class AuditHistory
{
[Key]
public int AuditId { get; set; }
public int? LoanId { get; set; }
public string MemberNumber { get; set; }
public string LoanNumber { get; set; }
public string ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public string ActivityType { get; set; }
public string OldValue { get; set; }
public string NewValue { get; set; }
public string AuditDescription { get; set; }
}
}
@@ -0,0 +1,33 @@
namespace ReserveManagementSystemLib.Models
{
public class CalculationConfig
{
public readonly Loan _loanData;
public CalculationConfig(Loan loanData)
{
_loanData = loanData;
}
public Loan LoanData() { return _loanData; }
public decimal BuydownRateDifference() { return _loanData.BuyRate - _loanData.ContractRate; }
public decimal BuyFinanceCharge { get; set; }
public decimal ContractFinanceCharge { get; set; }
public int DaysToFirstPmt() { return (_loanData.FirstPmtDate - _loanData.LoanDate).Days - 30 > 0 ? (_loanData.FirstPmtDate - _loanData.LoanDate).Days - 30 : 0; }
public decimal ReserveDiscount() { return _loanData.LoanType?.ReserveDiscount ?? 25M; }
public decimal FlatFeePercent() { return _loanData.LoanType?.FlatFeePercent ?? 1M; }
public decimal NoReserveThreshold() { return _loanData.LoanType?.NoReserveThreshold ?? 0.25M; }
public decimal StdRate() { return (_loanData.ContractRate - _loanData.BuyRate); }
}
}
@@ -0,0 +1,32 @@
namespace ReserveManagementSystemLib.Models
{
public class Dealer
{
public string DealerCode { get; set; }
string _dealerName;
public string Name { get { return _dealerName?.ToUpper(); } set => _dealerName = value?.ToUpper(); }
public string DealerGroupCode { get; set; }
public string DealerAccountNumber { get; set; }
[Key]
public string DealerOrganizationNumber { get; set; }
public override bool Equals(object obj)
{
return obj is Dealer dealer &&
DealerCode == dealer.DealerCode &&
Name == dealer.Name?.ToUpper() &&
DealerAccountNumber == dealer.DealerAccountNumber &&
DealerOrganizationNumber == dealer.DealerOrganizationNumber;
}
public override int GetHashCode()
{
return HashCode.Combine(DealerCode, DealerAccountNumber, DealerOrganizationNumber);
}
}
}
@@ -0,0 +1,22 @@
namespace ReserveManagementSystemLib.Models
{
public class Import
{
[Key]
public int ImportId { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public int RecordCount { get; set; }
public int RecordsSaved { get; set; }
public bool Success { get; set; }
public string FileName { get; set; }
public string ImportType { get; set; }
}
}
@@ -0,0 +1,204 @@
using FluentValidation;
using FluentValidation.Results;
using System.ComponentModel.DataAnnotations.Schema;
namespace ReserveManagementSystemLib.Models
{
public class Loan
{
[Key]
public int LoanId { get; set; }
public int ImportId { get; set; }
public string MemberNumber { get; set; }
public string LoanNumber { get; set; }
public string MemberLastName { get; set; }
public string MemberFirstName { get; set; }
public string MemberInitial { get; set; }
public string DealerOrganizationNumber { get; set; }
public DateTime LoanDate { get; set; }
public DateTime PostedDate { get; set; }
public DateTime FirstPmtDate { get; set; }
public DateTime FinalPmtDate { get; set; }
public decimal LoanAmount { get; set; }
public decimal BuyRate { get; set; }
public decimal ContractRate { get; set; }
public decimal MonthlyPmt { get; set; }
public string LoanTypeId { get; set; }
public int Term { get; set; }
public decimal ReserveAmount { get; set; }
public bool FlatFeePaid { get; set; }
public decimal? ChargeBack { get; set; }
public string ChargebackMessage { get; set; }
public byte? RemainingMonthsAtClose { get; set; }
public DateTime? PaidLoanDate { get; set; }
public string ReserveMessage { get; set; }
public bool ActionRequired { get; set; }
public DateTime? StatementDate { get; set; }
public decimal? Adjustment { get; set; }
public string LoanStatus { get; set; }
public DateTime? ExportedReserveDate { get; set; }
public DateTime? ExportedChargebackDate { get; set; }
public string ApplicationId { get; set; }
public bool Warranty { get; set; }
public bool Gap { get; set; }
public bool CreditLife { get; set; }
public bool CreditDisability { get; set; }
public bool Mbp { get; set; }
public string AccountType { get; set; }
[ForeignKey("DealerOrganizationNumber")]
public Dealer Dealer { get; set; }
[ForeignKey("LoanTypeId")]
public LoanType LoanType { get; set; }
public Vehicle Vehicle { get; set; }
[NotMapped]
public List<ValidationFailure> ValidationErrors { get; set; }
public bool HasSameReserve(object obj)
{
return obj is Loan loan &&
LoanDate == loan.LoanDate &&
Term == loan.Term &&
FirstPmtDate == loan.FirstPmtDate &&
FinalPmtDate == loan.FinalPmtDate &&
LoanAmount == loan.LoanAmount &&
LoanTypeId == loan.LoanTypeId &&
BuyRate == loan.BuyRate &&
ContractRate == loan.ContractRate;
}
public bool IsBoatLoan(object obj)
{
return obj is Loan loan &&
AccountType == "DL09" || AccountType == "DL10" || AccountType == "DL11" || AccountType == "DL12";
}
public override bool Equals(object obj)
{
return obj is Loan loan &&
MemberNumber == loan.MemberNumber &&
LoanNumber == loan.LoanNumber &&
MemberLastName == loan.MemberLastName &&
MemberFirstName == loan.MemberFirstName &&
MemberInitial == loan.MemberInitial &&
DealerOrganizationNumber == loan.DealerOrganizationNumber &&
LoanDate == loan.LoanDate &&
PostedDate == loan.PostedDate &&
Term == loan.Term &&
FirstPmtDate == loan.FirstPmtDate &&
FinalPmtDate == loan.FinalPmtDate &&
LoanAmount == loan.LoanAmount &&
BuyRate == loan.BuyRate &&
ContractRate == loan.ContractRate &&
MonthlyPmt == loan.MonthlyPmt &&
LoanTypeId == loan.LoanTypeId &&
ApplicationId == loan.ApplicationId &&
Warranty == loan.Warranty &&
Gap == loan.Gap &&
Mbp == loan.Mbp &&
CreditLife == loan.CreditLife &&
CreditDisability == loan.CreditDisability &&
ActionRequired == loan.ActionRequired;
}
public override int GetHashCode()
{
HashCode hash = new HashCode();
hash.Add(MemberNumber);
hash.Add(LoanNumber);
hash.Add(MemberLastName);
hash.Add(MemberFirstName);
hash.Add(MemberInitial);
hash.Add(DealerOrganizationNumber);
hash.Add(LoanDate);
hash.Add(PostedDate);
hash.Add(FirstPmtDate);
hash.Add(FinalPmtDate);
hash.Add(LoanAmount);
hash.Add(BuyRate);
hash.Add(ContractRate);
hash.Add(MonthlyPmt);
hash.Add(LoanTypeId);
hash.Add(ApplicationId);
hash.Add(Warranty);
hash.Add(Gap);
hash.Add(Mbp);
hash.Add(CreditLife);
hash.Add(CreditDisability);
hash.Add(ActionRequired);
return hash.ToHashCode();
}
}
public class LoanValidator : AbstractValidator<Loan>
{
public LoanValidator()
{
RuleFor(m => m.LoanTypeId).NotEmpty().WithMessage("Loan type cannot be empty!");
RuleFor(m => m.DealerOrganizationNumber).NotEmpty().WithMessage("Dealer Organization Number cannot be empty!");
When(m => m.Dealer != null && string.IsNullOrEmpty(m.Dealer.DealerCode), () =>
{
RuleFor(m => m.Dealer.DealerCode).NotEmpty().WithMessage("Dealer Code cannot be empty!");
});
When(m => m.Dealer != null && string.IsNullOrEmpty(m.Dealer.DealerAccountNumber), () =>
{
RuleFor(m => m.Dealer.DealerAccountNumber).NotEmpty().WithMessage("Dealer Account Number cannot be empty!");
});
When(m => m.Dealer != null && string.IsNullOrEmpty(m.Dealer.Name), () =>
{
RuleFor(m => m.Dealer.Name).NotEmpty().WithMessage("Dealer Name cannot be empty!");
});
When(m => m.Vehicle != null && string.IsNullOrEmpty(m.Vehicle.VINNumber), () =>
{
RuleFor(m => m.Vehicle.VINNumber).NotEmpty().WithMessage("VIN cannot be empty!");
});
RuleFor(m => m.LoanDate).LessThanOrEqualTo(m => m.FirstPmtDate).WithMessage("First Payment Date cannot be before Loan Date!");
}
}
}
@@ -0,0 +1,11 @@
namespace ReserveManagementSystemLib.Models
{
public class LoanChargeback
{
public decimal ChargebackAmount { get; set; }
public string ChargebackTypeMessage { get; set; }
public byte? RemainingMonthsAtClose { get; set; }
}
}
@@ -0,0 +1,22 @@
namespace ReserveManagementSystemLib.Models
{
public class LoanChargebackInput
{
public DateTime LoanDate { get; set; }
public DateTime FirstPmtDate { get; set; }
public DateTime FinalPmtDate { get; set; }
public string LoanType { get; set; }
public decimal ReserveAmount { get; set; }
public DateTime? PaidLoanDate { get; set; }
public int Term { get; set; }
public string AccountType { get; set; }
}
}
@@ -0,0 +1,89 @@
namespace ReserveManagementSystemLib.Models
{
public class LoanFilter
{
public bool? ActionRequired { get; set; }
public string DealerCodeText { get; set; }
public string MemberNumberText { get; set; }
public string MemberNameText { get; set; }
public string LoanNumberText { get; set; }
public string ApplicationIdText { get; set; }
public int? ImportId { get; set; }
public DateTime? LoanDateStart { get; set; }
public DateTime? LoanDateEnd { get; set; }
public int PageIndex { get; set; }
public int MaxRecordsPerPage { get; set; }
public int MaxPagesPerRange { get; set; }
public string SortField { get; set; }
public string SortDirection { get; set; }
public IQueryable<Loan> ApplyFilter(IQueryable<Loan> query)
{
if (!string.IsNullOrEmpty(MemberNumberText))
{
query = query.Where(x => x.MemberNumber.Contains(this.MemberNumberText));
}
if (!string.IsNullOrEmpty(MemberNameText))
{
query = query.Where(x => x.MemberFirstName.Contains(this.MemberNameText.ToUpper()) || x.MemberLastName.Contains(this.MemberNameText.ToUpper()));
}
if (!string.IsNullOrEmpty(LoanNumberText))
{
query = query.Where(x => x.LoanNumber.Contains(this.LoanNumberText));
}
if (!string.IsNullOrEmpty(ApplicationIdText))
{
query = query.Where(x => x.ApplicationId.Contains(this.ApplicationIdText));
}
if (ImportId.HasValue)
{
query = query.Where(x => x.ImportId == ImportId.Value);
}
if (ActionRequired.HasValue && !string.IsNullOrEmpty(ActionRequired.ToString()))
{
query = query.Where(x => x.ActionRequired == (this.ActionRequired));
}
if (!string.IsNullOrEmpty(DealerCodeText))
{
query = query.Where(x => x.Dealer.DealerCode == (this.DealerCodeText));
}
if (LoanDateStart.HasValue || LoanDateEnd.HasValue)
{
if (LoanDateStart.HasValue && LoanDateEnd.HasValue)
{
query = query.Where(x => x.LoanDate >= LoanDateStart.Value && x.LoanDate <= LoanDateEnd.Value);
}
else if (LoanDateStart.HasValue)
{
query = query.Where(x => x.LoanDate >= LoanDateStart.Value);
}
else if (LoanDateEnd.HasValue)
{
query = query.Where(x => x.LoanDate <= LoanDateEnd.Value);
}
}
return query;
}
}
}
@@ -0,0 +1,12 @@
namespace ReserveManagementSystemLib.Models
{
public class LoanReserve
{
public decimal ReserveAmount { get; set;}
public string ReserveTypeMessage { get; set; }
public bool FlatFeePaid { get; set; }
}
}
@@ -0,0 +1,22 @@
namespace ReserveManagementSystemLib.Models
{
public class LoanReserveInput
{
public DateTime LoanDate { get; set; }
public DateTime FirstPmtDate { get; set; }
public decimal LoanAmount { get; set; }
public decimal BuyRate { get; set; }
public decimal ContractRate { get; set; }
public int OriginalTermInDays { get; set; }
public string LoanType { get; set; }
public string AccountType { get; set; }
}
}
@@ -0,0 +1,22 @@
namespace ReserveManagementSystemLib.Models
{
public class LoanType
{
[Key]
public string LoanTypeId{ get; set; }
public string LoanComment { get; set; }
public string ChargebackMethod { get; set; }
public short NoChargebackDays { get; set; }
public short NoChargebackPayments { get; set; }
public decimal ReserveDiscount { get; set; }
public decimal FlatFeePercent { get; set; }
public decimal NoReserveThreshold { get; set; }
}
}
@@ -0,0 +1,13 @@
namespace ReserveManagementSystemLib.Models
{
public class MinorAccountType
{
[Key]
public int MinorAccountTypeId{ get; set; }
public string AccountType { get; set; }
public string GeneralLedgerAccountNumber { get; set; }
}
}
@@ -0,0 +1,78 @@
namespace ReserveManagementSystemLib.Models
{
public class PaginatedListResponse
{
public List<Loan> LoanList { get; set; }
public int PageIndex { get; set; }
public int TotalPages { get; set; }
public int TotalItems { get; set; }
public int FirstPage { get; set; }
public int LastPage { get; set; }
public int PageRangeSize { get; set; }
public PaginatedListResponse() {}
public void SetFirstAndLastPageToShow()
{
if (TotalPages < PageRangeSize) { PageRangeSize = TotalPages; }
var half = PageRangeSize / 2; //this should be set to an odd number to evenly set page range
if (PageIndex - half <= 0)
{
FirstPage = 1;
LastPage = (PageRangeSize > TotalPages) ? TotalPages : PageRangeSize;
}
else if (PageIndex == TotalPages || PageIndex + half > TotalPages)
{
FirstPage = TotalPages - PageRangeSize + 1;
LastPage = TotalPages;
}
else //increment page range slightly by the half difference
{
FirstPage = PageIndex - half;
LastPage = PageIndex + half;
}
}
public PaginatedListResponse(List<Loan> items, int count, int pageIndex, int pageSize, int pageRangeSize)
{
PageIndex = pageIndex;
TotalItems = count;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
PageRangeSize = pageRangeSize;
SetFirstAndLastPageToShow();
List<Loan> loanList = new List<Loan>();
loanList.AddRange(items);
LoanList = loanList;
}
public bool HasPreviousPage
{
get
{
return (PageIndex > 1);
}
}
public bool HasNextPage
{
get
{
return (PageIndex < TotalPages);
}
}
public static async Task<PaginatedListResponse> CreateListAsync(IQueryable<Loan> source, int pageIndex, int pageSize, int pageRangeSize)
{
var count = source.Count();
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
return new PaginatedListResponse(items, count, pageIndex, pageSize, pageRangeSize);
}
}
}
@@ -0,0 +1,8 @@
namespace ReserveManagementSystemLib.Models
{
public class RmsActiveImportRequest
{
public string ImportDateTime { get; set; }
public bool SkipExport { get; set; }
}
}
@@ -0,0 +1,38 @@
namespace ReserveManagementSystemLib.Models
{
public class Vehicle
{
[Key]
public int VehicleId { get; set; }
public int? LoanId { get; set; }
public string VINNumber { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public string Year { get; set; }
public double Mileage { get; set; }
public string Color { get; set; }
public override bool Equals(object obj)
{
return obj is Vehicle vehicle &&
VINNumber == vehicle.VINNumber &&
Make == vehicle.Make &&
Model == vehicle.Model &&
Year == vehicle.Year &&
Mileage == vehicle.Mileage &&
Color == vehicle.Color;
}
public override int GetHashCode()
{
return HashCode.Combine(VINNumber, Make, Model, Year, Mileage, Color);
}
}
}