// src/services/woService.js import { getWorkOrderDetails, searchServiceChannelAVWorkOrders, getWorkOrderNotes, getWorkOrderAttachments } from '../integrations/serviceChannel/client.js'; import { summarizeTicketWithGrok, summarizeWorkOrders } from '../utils/grokSummarizer.js'; import { logger } from '../utils/logger.js'; export async function collectWoHistory(storeNumber) { logger('wo:service', `Starting work order history collection for store ${storeNumber}`); try { // Step 1: Fetch basic list of AV work orders const rawWorkOrders = await searchServiceChannelAVWorkOrders(storeNumber); if (rawWorkOrders.length === 0) { logger('wo:service', `No AV work orders found for store ${storeNumber}`); return { workOrders: [], storeNumber, totalRecords: 0 }; } logger('wo:service', `Found ${rawWorkOrders.length} raw AV work orders for store ${storeNumber}`); // Step 2: Enrich each WO with notes history const workOrdersWithNotes = await Promise.all( rawWorkOrders.map(async wo => { const notes = await getWorkOrderNotes(wo.id); return { ...wo, notes }; }) ); // Step 3: Bulk summarize with Grok const summarizedWorkOrders = await summarizeWorkOrders(workOrdersWithNotes); logger('wo:service', `Summarized ${summarizedWorkOrders.length} work orders`); return { workOrders: summarizedWorkOrders, storeNumber, totalRecords: rawWorkOrders.length }; } catch (err) { logger('wo:service', `Error collecting work orders for store ${storeNumber}: ${err.message}`, 'error'); return { workOrders: [], storeNumber }; } } export async function collectWoSummary(woNumber) { logger('wo:service', `Summarizing work order ${woNumber}`); try { const ticket = await getWorkOrderDetails(woNumber); if (!ticket) { throw new Error('Work order not found'); } const notes = await getWorkOrderNotes(woNumber); const grokSummary = await summarizeTicketWithGrok(ticket, notes); // Format final reply let reply = `**Grok Summary:**\n${grokSummary}\n\n`; reply += `Status: ${ticket.Status?.Primary || 'N/A'} • Trade: ${ticket.Trade || 'N/A'}\n`; reply += `Opened: ${ticket.CallDate ? new Date(ticket.CallDate).toLocaleDateString() : 'N/A'}\n`; reply += `Total Invoice Cost: $${ticket.Nte?.toLocaleString() || 'N/A'}\n`; logger('wo:service', `Successfully summarized WO ${woNumber}`); return reply; } catch (err) { logger('wo:service', `Error summarizing WO ${woNumber}: ${err.message}`, 'error'); return `Unable to summarize work order ${woNumber}: ${err.message}`; } } /** * Collect attachments for a single work order */ export async function collectWoAttachments(woNumber) { logger('wo:service', `Collecting attachments for WO ${woNumber}`); try { const attachments = await getWorkOrderAttachments(woNumber); logger('wo:service', `Found ${attachments.length} attachments for WO ${woNumber}`); return { woNumber, count: attachments.length, attachments }; } catch (err) { logger('wo:service', `Error collecting attachments for WO ${woNumber}: ${err.message}`, 'error'); throw err; } }