diff --git a/abandoned-call-poller.js b/abandoned-call-poller.js index 65852d6..0192313 100644 --- a/abandoned-call-poller.js +++ b/abandoned-call-poller.js @@ -1,6 +1,13 @@ const config = require('./config'); const apiClient = require('./api-client'); +function parseOptionalNonNegativeNumber(value) { + if (value === undefined || value === null || value === '') return null; + const parsed = Number(value); + if (!Number.isFinite(parsed) || parsed < 0) return null; + return parsed; +} + class AbandonedCallPoller { constructor(database, printer) { this.db = database; @@ -53,7 +60,7 @@ class AbandonedCallPoller { const result = await apiClient.getAbandonedCalls( appConfig.authToken, appConfig.selectedBotId, - { limit: 50 } + { limit: 200 } ); if (result.error) { @@ -98,18 +105,22 @@ class AbandonedCallPoller { const printerConfigs = this.db.getAbandonedCallPrinters(); if (!printerConfigs || printerConfigs.length === 0) return; - const cooldownSeconds = parseInt(appConfig.abandonedCallPrintCooldown, 10) || 300; - const lastPrintTime = this.db.getLastAbandonedCallPrintTime(); - const now = Math.floor(Date.now() / 1000); - - const printablePriorities = new Set(['critical', 'high', 'medium']); + const configuredCooldown = parseOptionalNonNegativeNumber(appConfig.abandonedCallPrintCooldown); + const cooldownSeconds = configuredCooldown === null ? 0 : configuredCooldown; + const minScoreForPrint = parseOptionalNonNegativeNumber(appConfig.abandonedCallMinScoreForPrint); + let lastPrintTime = this.db.getLastAbandonedCallPrintTime(); for (const call of calls) { + if (!call || !call.id) continue; if (this.db.hasAbandonedCallPrint(call.id)) continue; - const priority = call.callback_priority || 'none'; - if (!printablePriorities.has(priority)) continue; + const score = Number(call.callback_score) || 0; + if (minScoreForPrint !== null && score < minScoreForPrint) { + console.log(`Abandoned call #${call.id}: skipping print (score ${score} below configured minimum ${minScoreForPrint})`); + continue; + } + const now = Math.floor(Date.now() / 1000); if (lastPrintTime && (now - lastPrintTime) < cooldownSeconds) { console.log(`Abandoned call #${call.id}: skipping print (cooldown active)`); continue; @@ -117,9 +128,18 @@ class AbandonedCallPoller { try { const result = await this.printer.printAbandonedCallReceipt(call, printerConfigs); - const printedCount = result ? (result.successCount || printerConfigs.length) : 0; - this.db.addAbandonedCallPrint(call.id, printedCount); - console.log(`Abandoned call #${call.id}: printed on ${printedCount} printer(s)`); + const printedCount = result && typeof result.successCount === 'number' + ? result.successCount + : (result && result.success ? printerConfigs.length : 0); + + if (result && result.success && printedCount > 0) { + this.db.addAbandonedCallPrint(call.id, printedCount); + lastPrintTime = Math.floor(Date.now() / 1000); + console.log(`Abandoned call #${call.id}: printed on ${printedCount} printer(s)`); + } else { + const message = result && result.error ? result.error : 'No printers succeeded'; + console.error(`Abandoned call #${call.id}: print failed: ${message}`); + } } catch (err) { console.error(`Abandoned call #${call.id}: print failed:`, err.message); } diff --git a/database.js b/database.js index d8ae169..5ca88f9 100644 --- a/database.js +++ b/database.js @@ -879,7 +879,8 @@ class DatabaseManager { cleanOldAbandonedCallCache(maxAgeDays = 7) { const cutoff = Math.floor(Date.now() / 1000) - (maxAgeDays * 86400); this.db.prepare('DELETE FROM abandoned_calls_cache WHERE updated_at < ?').run(cutoff); - this.db.prepare('DELETE FROM abandoned_call_prints WHERE printed_at < ?').run(cutoff); + // Print records are dedupe state, not cache. Keep them so old calls do not + // reprint days later after the UI cache has been cleaned. } close() { diff --git a/package.json b/package.json index ff20201..4ea2ba0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kitchen-agent", - "version": "1.0.7", + "version": "1.0.8", "description": "Kitchen Agent for ThinkLink Food Order Management", "main": "server.js", "scripts": {