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.
66 lines
No EOL
2.5 KiB
JavaScript
66 lines
No EOL
2.5 KiB
JavaScript
// 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}`);
|
||
}
|
||
} |