import { ChannelType } from "../Common/Channels/ChannelType"; import { ITicketAuditedEntity, TicketPriority, TicketPropertyValue } from "./Common"; import { TicketConditionOperator } from "./Workflow"; export declare enum TicketRoutingStrategy { ROUND_ROBIN = "ROUND_ROBIN", LEAST_BUSY = "LEAST_BUSY", MOST_SKILLED = "MOST_SKILLED", LONGEST_IDLE = "LONGEST_IDLE", MANUAL_PULL = "MANUAL_PULL", RANDOM = "RANDOM", WEIGHTED = "WEIGHTED" } export declare enum TicketRoutingStatus { NOT_ROUTED = "NOT_ROUTED", QUEUED = "QUEUED", ROUTING = "ROUTING", OFFERED = "OFFERED", ASSIGNED = "ASSIGNED", ACCEPTED = "ACCEPTED", DECLINED = "DECLINED", RETURNED = "RETURNED", ESCALATED = "ESCALATED", FAILED = "FAILED" } export declare enum AgentAvailabilityStatus { AVAILABLE = "AVAILABLE", BUSY = "BUSY", AWAY = "AWAY", OFFLINE = "OFFLINE" } export declare enum TicketRoutingConditionGroupOperator { AND = "AND", OR = "OR" } export declare enum TicketQueueOrderCriterion { SLA_BREACH_AT = "SLA_BREACH_AT", PRIORITY = "PRIORITY", CREATED_AT = "CREATED_AT", DUE_AT = "DUE_AT", CUSTOM_FIELD = "CUSTOM_FIELD", CALCULATED_SCORE = "CALCULATED_SCORE" } export declare enum TicketQueueOrderDirection { ASC = "ASC", DESC = "DESC" } export declare enum TicketSkillRelaxationMode { NEVER = "NEVER", AFTER_TIMEOUT = "AFTER_TIMEOUT" } export declare enum TicketEscalationTrigger { QUEUE_WAIT = "QUEUE_WAIT", OFFER_TIMEOUT = "OFFER_TIMEOUT", SLA_WARNING = "SLA_WARNING", SLA_BREACH = "SLA_BREACH", NO_ELIGIBLE_AGENT = "NO_ELIGIBLE_AGENT", DECLINED = "DECLINED" } export declare enum TicketEscalationActionType { ADD_GROUP = "ADD_GROUP", CHANGE_QUEUE = "CHANGE_QUEUE", INCREASE_PRIORITY = "INCREASE_PRIORITY", NOTIFY_USERS = "NOTIFY_USERS", NOTIFY_ROLES = "NOTIFY_ROLES", RELAX_OPTIONAL_SKILLS = "RELAX_OPTIONAL_SKILLS", ASSIGN_USER = "ASSIGN_USER", ASSIGN_GROUP = "ASSIGN_GROUP", WEBHOOK = "WEBHOOK" } export declare enum TicketAssignmentEndReason { COMPLETED = "COMPLETED", REASSIGNED = "REASSIGNED", RETURNED = "RETURNED", DECLINED = "DECLINED", EXPIRED = "EXPIRED", MANUAL = "MANUAL" } export interface ITicketRoutingCondition { fieldNameKey: string; operator: TicketConditionOperator; expectedValue?: TicketPropertyValue; } export interface ITicketRoutingConditionGroup { operator: TicketRoutingConditionGroupOperator; conditions?: ITicketRoutingCondition[]; groups?: ITicketRoutingConditionGroup[]; } export interface ITicketQueueOrder { criterion: TicketQueueOrderCriterion; direction: TicketQueueOrderDirection; fieldNameKey?: string; weight?: number; } export interface ITicketSkill extends ITicketAuditedEntity { name: string; description?: string; enabled: boolean; } export interface ITicketSkillRequirement { skillId: string; required: boolean; priority: number; minimumProficiency?: number; relaxationMode?: TicketSkillRelaxationMode; timeoutMinutes?: number; } export interface IAgentTicketSkill { userId: string; skillId: string; proficiency?: number; priority?: number; enabled: boolean; validFrom?: Date; validUntil?: Date; } export interface IAgentChannelCapacity { channelType?: ChannelType; maximumConcurrent: number; currentAssignments: number; reservedCapacity?: number; } export interface IAgentRoutingState { spaceId: string; userId: string; status: AgentAvailabilityStatus; capacities: IAgentChannelCapacity[]; activeAssignmentCount: number; lastAssignedAt?: Date; availableSince?: Date; updatedAt: Date; } export interface ITicketQueue extends ITicketAuditedEntity { name: string; description?: string; enabled: boolean; priority: number; conditions?: ITicketRoutingConditionGroup; primaryGroupIds: string[]; fallbackGroupIds?: string[]; strategy: TicketRoutingStrategy; ordering: ITicketQueueOrder[]; skillRequirements?: ITicketSkillRequirement[]; offerTimeoutSeconds?: number; maximumWaitMinutes?: number; escalationPolicyId?: string; } export interface ITicketRoutingPolicy extends ITicketAuditedEntity { name: string; description?: string; enabled: boolean; priority: number; conditions?: ITicketRoutingConditionGroup; queueId: string; strategyOverride?: TicketRoutingStrategy; skillRequirements?: ITicketSkillRequirement[]; validFrom?: Date; validUntil?: Date; } export interface ITicketEscalationAction { type: TicketEscalationActionType; groupIds?: string[]; userIds?: string[]; roleIds?: string[]; queueId?: string; priority?: TicketPriority; webhookId?: string; } export interface ITicketEscalationStep { id: string; order: number; trigger: TicketEscalationTrigger; thresholdMinutes?: number; repeatEveryMinutes?: number; maximumExecutions?: number; actions: ITicketEscalationAction[]; } export interface ITicketEscalationPolicy extends ITicketAuditedEntity { name: string; description?: string; enabled: boolean; steps: ITicketEscalationStep[]; } export interface ITicketAssignment { id: string; spaceId: string; ticketId: string; queueId?: string; groupId?: string; agentId?: string; status: TicketRoutingStatus; offeredAt?: Date; offerExpiresAt?: Date; assignedAt?: Date; acceptedAt?: Date; endedAt?: Date; endedReason?: TicketAssignmentEndReason; assignedBy?: string; routingDecisionId?: string; } export interface ITicketRoutingCandidate { agentId: string; eligible: boolean; score?: number; matchedSkillIds: string[]; missingSkillIds?: string[]; availableCapacity?: number; exclusionReasons?: string[]; } export interface ITicketRoutingDecision { id: string; spaceId: string; ticketId: string; attemptId: string; policyId?: string; queueId: string; strategy: TicketRoutingStrategy; selectedAgentId?: string; selectedGroupId?: string; candidates?: ITicketRoutingCandidate[]; matchedSkillIds: string[]; relaxedSkillIds?: string[]; reasonCode: string; explanation?: string; decidedAt: Date; } export interface ITicketRoutingAttempt { id: string; spaceId: string; ticketId: string; queueId?: string; status: TicketRoutingStatus; startedAt: Date; completedAt?: Date; trigger: string; decisionId?: string; errorCode?: string; errorMessage?: string; } export interface ITicketEscalationExecution { id: string; spaceId: string; ticketId: string; policyId: string; stepId: string; executedAt: Date; actionsExecuted: TicketEscalationActionType[]; error?: string; } export interface ITicketRoutingState { status: TicketRoutingStatus; queueId?: string; policyId?: string; currentAssignmentId?: string; enqueuedAt?: Date; offeredAt?: Date; offerExpiresAt?: Date; assignedAt?: Date; acceptedAt?: Date; priorityScore?: number; nextEscalationAt?: Date; requiredSkills?: ITicketSkillRequirement[]; lastDecisionId?: string; } export interface IEnqueueTicketDto { expectedVersion: number; queueId?: string; reason?: string; } export interface IAcceptTicketAssignmentDto { expectedVersion: number; assignmentId: string; } export interface IDeclineTicketAssignmentDto { expectedVersion: number; assignmentId: string; reason: string; } export interface IReturnTicketToQueueDto { expectedVersion: number; assignmentId: string; reason?: string; queueId?: string; } export interface IManualRouteTicketDto { expectedVersion: number; queueId?: string; groupId?: string; agentId?: string; reason?: string; } export interface ICreateTicketQueueDto { name: string; description?: string; enabled: boolean; priority: number; conditions?: ITicketRoutingConditionGroup; primaryGroupIds: string[]; fallbackGroupIds?: string[]; strategy: TicketRoutingStrategy; ordering: ITicketQueueOrder[]; skillRequirements?: ITicketSkillRequirement[]; offerTimeoutSeconds?: number; maximumWaitMinutes?: number; escalationPolicyId?: string; } export type IUpdateTicketQueueDto = Partial; export interface ICreateTicketSkillDto { name: string; description?: string; enabled?: boolean; } export type IUpdateTicketSkillDto = Partial; export interface ICreateTicketEscalationPolicyDto { name: string; description?: string; enabled?: boolean; steps: ITicketEscalationStep[]; } export type IUpdateTicketEscalationPolicyDto = Partial; export interface ITicketQueueSimulateRequestDto { queueId?: string; conditions?: ITicketRoutingConditionGroup; sampleTicket: Record; } export interface ITicketQueueSimulateResponseDto { wouldEnter: boolean; reasons: string[]; } export interface ICreateTicketRoutingPolicyDto { name: string; description?: string; enabled: boolean; priority: number; conditions?: ITicketRoutingConditionGroup; queueId: string; strategyOverride?: TicketRoutingStrategy; skillRequirements?: ITicketSkillRequirement[]; validFrom?: Date; validUntil?: Date; } export type IUpdateTicketRoutingPolicyDto = Partial; export interface IReorderTicketRoutingPoliciesDto { orderedIds: string[]; } export declare enum TicketSkillWarningCode { ENABLED_BUT_UNASSIGNED = "ENABLED_BUT_UNASSIGNED", DISABLED_BUT_REFERENCED = "DISABLED_BUT_REFERENCED", REQUIRED_BY_QUEUE_BUT_UNMET = "REQUIRED_BY_QUEUE_BUT_UNMET" } export interface ITicketSkillUsageSummary { agentsCount: number; queuesCount: number; policiesCount: number; } export interface ITicketSkillUsageRef { id: string; name: string; } export interface ITicketSkillUsage { agents: number; queues: ITicketSkillUsageRef[]; policies: ITicketSkillUsageRef[]; } export interface ITicketSkillWithUsage extends ITicketSkill { usage: ITicketSkillUsageSummary; warnings: TicketSkillWarningCode[]; } export interface ICreateAgentTicketSkillDto { userId: string; skillId: string; proficiency?: number; priority?: number; enabled?: boolean; validFrom?: Date; validUntil?: Date; } export type IUpdateAgentTicketSkillDto = Partial>; export interface IAgentChannelCapacityConfig { id: string; userId: string; channelType?: ChannelType; maximumConcurrent: number; reservedCapacity?: number; effectiveCapacity: number; } export interface ICreateAgentChannelCapacityDto { userId: string; channelType?: ChannelType; maximumConcurrent: number; reservedCapacity?: number; } export type IUpdateAgentChannelCapacityDto = Partial>; export interface IEscalationPolicyUsageRef { id: string; name: string; enabled: boolean; } /** Body of GET /routing/escalation-policies/{id}/usages. */ export interface IEscalationPolicyUsage { queues: IEscalationPolicyUsageRef[]; } export interface IEscalationPolicyUsageSummary { queuesCount: number; } /** Mirror of TicketSkillWarningCode; only one member is needed today. */ export declare enum EscalationPolicyWarningCode { DISABLED_BUT_REFERENCED = "DISABLED_BUT_REFERENCED" } /** List/get view: the base DTO plus a usage summary and warnings. */ export interface ITicketEscalationPolicyWithUsage extends ITicketEscalationPolicy { usage: IEscalationPolicyUsageSummary; warnings: EscalationPolicyWarningCode[]; } export interface ICreateAgentSkillDto { userId: string; skillId: string; proficiency?: number; priority?: number; enabled?: boolean; validFrom?: string; validUntil?: string; } /** `channelType` null means "the agent's global capacity", not "unknown". */ export interface ICreateAgentCapacityDto { userId: string; channelType?: number | null; maximumConcurrent: number; reservedCapacity?: number; enabled?: boolean; } export interface IListAgentSkillsFilters { userId?: string; skillId?: string; enabled?: boolean; }