using LCU.Library.Internal.IncentiveApiModels.Enums; using LCU.Library.Internal.IncentiveApiModels.Common; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace LCU.Library.Internal.IncentiveApiModels.Entities { public class Activity : Auditable, IViewTransformable { public int Id { get; set; } public Guid AppUserId { get; set; } [Required] [JsonConverter(typeof(StringEnumConverter))] public Product Product { get; set; } [Required] [JsonConverter(typeof(StringEnumConverter))] public ActivityType Type { get; set; } = ActivityType.Sale; [Required] [JsonConverter(typeof(StringEnumConverter))] public SystemType SourceSystem { get; set; } public string? SourceId { get; set; } public DateTime SourceCreated { get; set; } [Required] public ActivityDetail Detail { get; set; } public List MetaData { get; set; } [Required] public int DepartmentId { get; set; } [Required] public string EmployeeId { get; set; } public string? EmployeeEmail { get; set; } public int MatchingActivityId { get; set; } public int MatchingDpAccessoryActivityId { get; set; } public DateTime Accepted { get; set; } [JsonConverter(typeof(StringEnumConverter))] public ActivityState State { get; set; } = ActivityState.Created; public virtual IList ActivityPayouts { get; set; } public int MatchingGapInsuranceActivityId { get; set; } public static Activity CopyActivityForTransfer( Activity activity, ActivityTransferAction activityTransferAction, string employeeEmail ) { return new Activity { Accepted = activity.Accepted, DepartmentId = activityTransferAction.NewActivityDepartmentId, Detail = new ActivityDetail { AccountBalance = activity.Detail.AccountBalance, AccountNewBalance = activity.Detail.AccountNewBalance, AccountNumber = activity.Detail.AccountNumber, AccountStatus = activity.Detail.AccountStatus, AgreementNumber = activity.Detail.AgreementNumber, BranchOrgName = activity.Detail.BranchOrgName, BranchOrgNbr = activity.Detail.BranchOrgNbr, DnaPersonNbr = activity.Detail.DnaPersonNbr, DebtProtectionAddDate = activity.Detail.DebtProtectionAddDate, DebtProtectionRemoveDate = activity.Detail.DebtProtectionRemoveDate, GapInsuranceAddDate = activity.Detail.GapInsuranceAddDate, GapInsuranceRemoveDate = activity.Detail.GapInsuranceRemoveDate, IsDebtProtectionEligible = activity.Detail.IsDebtProtectionEligible, IsGapInsuranceEligible = activity.Detail.IsGapInsuranceEligible, MemberName = activity.Detail.MemberName, StationName = activity.Detail.StationName, SubAccountNumber = activity.Detail.SubAccountNumber, SubjectOrgNbr = activity.Detail.SubjectOrgNbr, SubjectPersonNbr = activity.Detail.SubjectPersonNbr, }, EmployeeEmail = employeeEmail, EmployeeId = activityTransferAction.NewActivityEmployeeId, MatchingActivityId = activity.MatchingActivityId, MatchingDpAccessoryActivityId = activity.MatchingDpAccessoryActivityId, MatchingGapInsuranceActivityId = activity.MatchingGapInsuranceActivityId, MetaData = activity.MetaData, Product = activity.Product, SourceCreated = activity.SourceCreated, SourceId = activity.SourceId, SourceSystem = activity.SourceSystem, State = activityTransferAction.ActivityStateBeforeTransfer, Type = activity.Type }; } public static Activity CopyActivityForDpAccessory(Activity activity) { return new Activity { Accepted = activity.Detail.DebtProtectionAddDate ?? activity.Accepted, DepartmentId = activity.DepartmentId, Detail = new ActivityDetail { AccountBalance = activity.Detail.AccountBalance, AccountNewBalance = activity.Detail.AccountNewBalance, AccountNumber = activity.Detail.AccountNumber, AccountStatus = activity.Detail.AccountStatus, AgreementNumber = activity.Detail.AgreementNumber, BranchOrgName = activity.Detail.BranchOrgName, BranchOrgNbr = activity.Detail.BranchOrgNbr, DnaPersonNbr = activity.Detail.DnaPersonNbr, DebtProtectionAddDate = activity.Detail.DebtProtectionAddDate, DebtProtectionRemoveDate = activity.Detail.DebtProtectionRemoveDate, GapInsuranceAddDate = activity.Detail.GapInsuranceAddDate, GapInsuranceRemoveDate = activity.Detail.GapInsuranceRemoveDate, IsDebtProtectionEligible = activity.Detail.IsDebtProtectionEligible, IsGapInsuranceEligible = activity.Detail.IsGapInsuranceEligible, MemberName = activity.Detail.MemberName, StationName = activity.Detail.StationName, SubAccountNumber = activity.Detail.SubAccountNumber, SubjectOrgNbr = activity.Detail.SubjectOrgNbr, SubjectPersonNbr = activity.Detail.SubjectPersonNbr }, EmployeeEmail = activity.EmployeeEmail, EmployeeId = activity.EmployeeId, MatchingActivityId = activity.MatchingActivityId, MatchingDpAccessoryActivityId = activity.Id, MatchingGapInsuranceActivityId = activity.MatchingGapInsuranceActivityId, MetaData = activity.MetaData, Product = Product.DebtProtection, SourceCreated = activity.Detail.DebtProtectionAddDate ?? activity.SourceCreated, SourceId = activity.SourceId, SourceSystem = activity.SourceSystem, State = ActivityState.Created, Type = activity.Type }; } public bool CanAutoDecision() { return State != ActivityState.Rejected; } public double CalculatedValueTowardsGoal(Product countsForProduct) { if (Type == ActivityType.Other || State != ActivityState.Accepted && State != ActivityState.PendingTransfer) { return 0; } var details = ProductDetail.DetailsForProduct(Product); if (countsForProduct == Product.DebtProtectionEligibleLoan && Detail != null) { return Detail.IsDebtProtectionEligible && Detail.DebtProtectionAddDate != null && Detail.DebtProtectionRemoveDate == null ? 1 : 0; } if (countsForProduct == Product && details.ValueType == ProductValue.Numeric) { return 1; } if (countsForProduct == Product && Detail is { AccountBalance: { } }) { return Detail.AccountBalance.Value; } return 0; } public int CalculatedValueTowardsOther(Product countsForProduct) { if (Detail != null && countsForProduct == Product.DebtProtectionEligibleLoan && Detail.IsDebtProtectionEligible) { return 1; } return 0; } public int CalculatedValueTowardsGapInsurance() => Detail?.IsGapInsuranceEligible ?? false ? 1 : 0; public bool HasDpAccessory() { return Type == ActivityType.Sale && Detail.IsDebtProtectionEligible && ( MatchingDpAccessoryActivityId != 0 || Detail.DebtProtectionAddDate?.Date != null || Detail.DebtProtectionRemoveDate?.Date != null ); } public bool HasActiveGapAccessory() { return Type == ActivityType.Sale && MatchingGapInsuranceActivityId != 0 && Detail.IsGapInsuranceEligible && Detail.GapInsuranceAddDate != null && Detail.GapInsuranceRemoveDate?.Date == null; } public Activity TransformForView() { Detail?.TransformForView(); return this; } } }