Files
CASAN/apps/service-desk/src/ticket.js
T

27 lines
1.1 KiB
JavaScript

const PRIORITIES = new Set(['LOW', 'NORMAL', 'HIGH', 'CRITICAL']);
export function createTicket({ id, summary, priority = 'NORMAL', requestedAt }) {
if (!id || !summary?.trim() || !requestedAt || !PRIORITIES.has(priority)) {
throw new Error('invalid ticket input');
}
return { id, summary: summary.trim(), priority, requestedAt, status: 'OPEN', assignee: null, resolvedAt: null };
}
export function assignTicket(ticket, assignee) {
if (!assignee?.trim() || !['OPEN', 'ASSIGNED'].includes(ticket.status)) {
throw new Error('ticket cannot be assigned');
}
return { ...ticket, assignee: assignee.trim(), status: 'ASSIGNED' };
}
export function resolveTicket(ticket, resolvedAt) {
if (ticket.status !== 'ASSIGNED' || !resolvedAt) throw new Error('ticket cannot be resolved');
return { ...ticket, status: 'RESOLVED', resolvedAt };
}
export function isSlaBreached(ticket, now) {
const targetHours = ticket.priority === 'CRITICAL' ? 1 : ticket.priority === 'HIGH' ? 4 : 24;
const elapsed = new Date(now).getTime() - new Date(ticket.requestedAt).getTime();
return ticket.status !== 'RESOLVED' && elapsed > targetHours * 60 * 60 * 1000;
}