import { config } from '../config.js' import { createDocument, getDocument, listDocuments, updateDocument, Query, ID, } from './appwriteAdmin.js' const WOID_BASE = 9999 async function generateNextWoid() { // Numerisches Maximum ueber alle Tickets - orderDesc('woid') sortiert Strings // und liefert bei gemischt 5-/6-stelligen WOIDs falsche Ergebnisse. const docs = await listDocuments(config.collections.workorders, [Query.limit(1000)]) const highest = docs.reduce((max, doc) => { const n = parseInt(doc.woid, 10) return Number.isNaN(n) ? max : Math.max(max, n) }, WOID_BASE) return String(highest + 1) } /** * Stellt sicher, dass ein Website-Projekt ein Ticket hat, damit Git-Pushes * als Worksheets (WSIDs) getrackt werden koennen. Legt bei Bedarf automatisch * ein 'Webpage'-Ticket fuer den Kunden des Projekts an und verknuepft es. * Projekte ohne Kunde bekommen kein automatisches Ticket. */ export async function ensureProjectTicket(project, { repoFullName } = {}) { if (!project) return null if (project.ticketId) return project.ticketId if (!project.customerId) return null const customer = await getDocument(config.collections.customers, project.customerId).catch(() => null) if (!customer) return null const woid = await generateNextWoid() const now = new Date().toISOString() const ticket = await createDocument( config.collections.workorders, { topic: `Website ${project.projectName || repoFullName || project.subdomain || ''}`.trim(), type: 'Webpage', status: 'Open', priority: 1, serviceType: 'Remote', systemType: 'n/a', customerId: project.customerId, customerName: customer.name || '', customerLocation: customer.location || '', woid, details: `Automatisch angelegt fuer das Repository ${repoFullName || project.repoFullName || ''} (erster Git-Push).`, createdAt: now, }, ID.unique() ) await updateDocument(config.collections.websiteProjects, project.$id, { ticketId: ticket.$id, updatedAt: now, }) console.log(`[ticketAdmin] Webpage-Ticket #${woid} fuer Projekt ${project.$id} angelegt`) return ticket.$id }