collabSupport/commands/woHistory.js
Joseph McQueen 1117be40cc Format chat footers in DISPLAY_TIMEZONE instead of UTC.
Docker hosts default to UTC, so bare toLocaleTimeString() showed
wrong "Last checked" times in avstatus and other commands. Add
formatDisplayTime() (default America/New_York, overridable via
DISPLAY_TIMEZONE) and use it across renderers and command footers.
2026-07-21 14:41:26 -04:00

66 lines
No EOL
2.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// src/commands/woHistory.js
import { collectWoHistory } from '../services/woService.js';
import { logger } from '../utils/logger.js';
import { formatDisplayTime } from '../utils/time.js';
export async function handleWoHistory(bot, trigger) {
logger('wo:history', 'Handler entered');
// Support both Webex (args) and HTTP (query)
const query = trigger.query || {};
const args = trigger.args || [];
let storeNum = args[0]?.trim() || query.storeNum || query.store || query.s;
const modeArg = args[1]?.toLowerCase() || query.mode || '';
const isDetailed = modeArg === 'detailed' || query.detailed === 'true';
if (!storeNum || !/^\d{2,4}$/.test(storeNum)) {
const usage = '**Work Order History Usage:**\n' +
'`/woHistory 782` → Summary (last 15)\n' +
'`/woHistory 782 detailed` → Full list\n\n' +
'Also works via HTTP: `?storeNum=782&mode=detailed`';
await bot.say('markdown', usage);
return;
}
logger('wo:history', `Request for store ${storeNum} (${isDetailed ? 'detailed' : 'summary'} mode)`);
try {
const data = await collectWoHistory(storeNum);
let reply = `**Work Order History Store ${storeNum}** (Audio Visual Trade, past 3 years)\n\n`;
if (data.workOrders.length === 0) {
reply += 'No Audio Visual work orders found in the past 3 years.\n';
} else {
// Show all in detailed mode, limit to 15 in summary
const displayWOs = isDetailed ? data.workOrders : data.workOrders.slice(0, 15);
let grandTotal = 0;
displayWOs.forEach(wo => {
reply += `**${wo.woNumber}** - ${wo.summary}\n`;
reply += `Status: ${wo.status} • Opened: ${wo.openedDate} • Total Cost: $${wo.totalInvoiceCost.toLocaleString()}\n\n`;
grandTotal += wo.totalInvoiceCost;
});
reply += `**Grand Total (AV Trade):** $${grandTotal.toLocaleString()}\n`;
if (!isDetailed && data.workOrders.length > 15) {
reply += `\nShowing first 15 of ${data.workOrders.length} work orders. Use \`/woHistory ${storeNum} detailed\` for full list.\n`;
}
}
reply += `\n*Last checked: ${formatDisplayTime()}*`;
await bot.say('markdown', reply.trim() || 'No data available.');
logger('wo:history', `Successfully returned ${data.workOrders.length} work orders for store ${storeNum}`);
} catch (err) {
logger('wo:history', `Error processing woHistory for store ${storeNum}: ${err.message}`, 'error');
await bot.say('markdown', `❌ Error collecting work order history: ${err.message}`);
}
}