using Tiku.Domain.Learning; namespace Tiku.Application.Learning; public sealed record LearningBusinessContextItem( Guid BusinessLineId, string BusinessCode, string BusinessName, Guid TenantBusinessLicenseId, DateTimeOffset? LicenseEndsAt, Guid? PrimaryProfileVersionId, IReadOnlyCollection AlternateProfileVersionIds, int MaxActiveTargets, int MaxAlternateTargets, int TargetChangeCooldownDays); public sealed record LearningContextItem(IReadOnlyCollection Businesses); public sealed record LearningTargetItem( Guid ExamTargetProfileVersionId, string ProfileCode, string DisplayName, int? ExamYear, bool IsBaseTarget, bool MayBePrimary, bool MayBeAlternate, bool IsPrimary, bool IsAlternate); public sealed record LearningTargetSelectionItem( Guid BusinessLineId, Guid PrimaryProfileVersionId, IReadOnlyCollection AlternateProfileVersionIds, DateTimeOffset ChangedAt, DateTimeOffset? NextChangeAllowedAt); public sealed record ChangeLearningTargetsCommand( Guid PrimaryProfileVersionId, IReadOnlyCollection AlternateProfileVersionIds); public interface IStudentLearningTargetService { Task GetContextAsync( LearningActor actor, CancellationToken cancellationToken = default); Task> GetTargetsAsync( LearningActor actor, Guid businessLineId, CancellationToken cancellationToken = default); Task ChangeTargetsAsync( LearningActor actor, Guid businessLineId, ChangeLearningTargetsCommand command, CancellationToken cancellationToken = default); Task OverrideTargetsAsync( LearningActor student, Guid businessLineId, ChangeLearningTargetsCommand command, Guid changedBy, string reason, CancellationToken cancellationToken = default); } public sealed record UpsertClassAssignmentGrantCommand( Guid? Id, Guid ClassId, Guid ProductAccessManifestVersionId, AccessResourceType ResourceType, Guid ResourceId, DateTimeOffset? StartsAt, DateTimeOffset? EndsAt); public sealed record ClassAssignmentGrantItem( Guid Id, Guid ClassId, Guid ProductAccessManifestVersionId, AccessResourceType ResourceType, Guid ResourceId, DateTimeOffset StartsAt, DateTimeOffset? EndsAt, ClassAssignmentGrantStatus Status, Guid? CreatedBy, Guid? RevokedBy, string? RevokedReason); public interface IV2LearningAccessAdministrationService { Task> GetClassGrantsAsync( Guid tenantId, Guid classId, CancellationToken cancellationToken = default); Task UpsertClassGrantAsync( Guid tenantId, Guid actorUserId, UpsertClassAssignmentGrantCommand command, CancellationToken cancellationToken = default); Task RevokeClassGrantAsync( Guid tenantId, Guid actorUserId, Guid classId, Guid grantId, string reason, CancellationToken cancellationToken = default); }