using Tiku.Domain.Common; namespace Tiku.Domain.Learning; public sealed class TenantBusinessLicense : AuditableTenantEntity { public Guid BusinessLineId { get; set; } public LicenseLifecycleStatus Status { get; set; } = LicenseLifecycleStatus.Active; public DateTimeOffset StartsAt { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset? EndsAt { get; set; } public long Version { get; set; } = 1; } public sealed class TenantLicensedTarget : Entity, ITenantOwned { public Guid TenantBusinessLicenseId { get; set; } public Guid ExamTargetProfileVersionId { get; set; } public bool IsBaseTarget { get; set; } public DateTimeOffset StartsAt { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset? EndsAt { get; set; } public Guid TenantId { get; set; } } public sealed class ProductAccessManifest : AuditableTenantEntity { public Guid LearningProductId { get; set; } public Guid? CurrentVersionId { get; set; } public bool IsActive { get; set; } = true; } public sealed class ProductAccessManifestVersion : Entity, ITenantOwned { public Guid ProductAccessManifestId { get; set; } public int VersionNo { get; set; } = 1; public AccessManifestStatus Status { get; set; } = AccessManifestStatus.Draft; public int MaxActiveTargets { get; set; } = 1; public int MaxAlternateTargets { get; set; } public int? DailyQuestionLimit { get; set; } public int? TotalQuestionLimit { get; set; } public DateTimeOffset? PublishedAt { get; set; } public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; public Guid TenantId { get; set; } } public sealed class ProductManifestRelease : Entity, ITenantOwned { public Guid ProductAccessManifestVersionId { get; set; } public Guid ContentOwnerTenantId { get; set; } public Guid ContentReleaseId { get; set; } public Guid? PlatformContentPackageOwnerTenantId { get; set; } public Guid? PlatformContentPackageVersionId { get; set; } public Guid TenantId { get; set; } } public sealed class ProductManifestTarget : Entity, ITenantOwned { public Guid ProductAccessManifestVersionId { get; set; } public Guid ExamTargetProfileVersionId { get; set; } public bool MayBePrimary { get; set; } = true; public bool MayBeAlternate { get; set; } public Guid TenantId { get; set; } } public sealed class ProductManifestResource : Entity, ITenantOwned { public Guid ProductAccessManifestVersionId { get; set; } public AccessResourceType ResourceType { get; set; } public Guid ResourceId { get; set; } public string DisplayName { get; set; } = string.Empty; public int SortOrder { get; set; } public Guid TenantId { get; set; } } public sealed class StudentEntitlement : AuditableTenantEntity { public Guid UserId { get; set; } public Guid LearningProductId { get; set; } public Guid ProductAccessManifestVersionId { get; set; } public StudentEntitlementStatus Status { get; set; } = StudentEntitlementStatus.Active; public DateTimeOffset StartsAt { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset? EndsAt { get; set; } public string SourceType { get; set; } = string.Empty; public Guid? SourceId { get; set; } public int UsedQuestionCount { get; set; } public DateTimeOffset? RevokedAt { get; set; } public Guid? RevokedBy { get; set; } public string? RevokedReason { get; set; } } public sealed class StudentTargetSelectionHistory : AuditableTenantEntity { public Guid UserId { get; set; } public Guid BusinessLineId { get; set; } public Guid ExamTargetProfileVersionId { get; set; } public TargetSelectionRole Role { get; set; } = TargetSelectionRole.Primary; public Guid? EntitlementId { get; set; } public string SourceType { get; set; } = string.Empty; public Guid SourceId { get; set; } public DateTimeOffset EffectiveAt { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset? EndedAt { get; set; } public bool IsCurrent { get; set; } = true; public Guid? ChangedBy { get; set; } public string? Reason { get; set; } } public sealed class ClassAssignmentGrant : AuditableTenantEntity { public Guid ClassId { get; set; } public Guid ProductAccessManifestVersionId { get; set; } public AccessResourceType ResourceType { get; set; } public Guid ResourceId { get; set; } public DateTimeOffset StartsAt { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset? EndsAt { get; set; } public ClassAssignmentGrantStatus Status { get; set; } = ClassAssignmentGrantStatus.Active; public Guid? CreatedBy { get; set; } public Guid? RevokedBy { get; set; } public string? RevokedReason { get; set; } } public sealed class EffectiveAccessProjection : TenantEntity { public Guid UserId { get; set; } public Guid BusinessLineId { get; set; } public Guid? PrimaryProfileVersionId { get; set; } public Guid[] AlternateProfileVersionIds { get; set; } = []; public Guid[] ContentReleaseIds { get; set; } = []; public Guid[] AudienceSegmentIds { get; set; } = []; public Guid[] ManifestVersionIds { get; set; } = []; public long GrantVersion { get; set; } = 1; public long ContentVersion { get; set; } = 1; public long StrongRevocationVersion { get; set; } = 1; public DateTimeOffset ValidUntil { get; set; } public DateTimeOffset CompiledAt { get; set; } = DateTimeOffset.UtcNow; } public enum LicenseLifecycleStatus { Active, Suspended, Expired, Cancelled } public enum AccessManifestStatus { Draft, Published, Retired } public enum AccessResourceType { ContentRelease, CurriculumNode, CollectionRelease, BlueprintRelease } public enum TargetSelectionRole { Primary, Alternate } public enum StudentEntitlementStatus { Active, Expired, Revoked, Cancelled } public enum ClassAssignmentGrantStatus { Active, Revoked, Expired }