const EventTicket = require('../../models/EventTicket'); const { generateConciergeResponse } = require('../conciergeCall2.service'); function formatPrice(ticket) { const minor = ticket?.basePriceMinor; if (minor == null || Number.isNaN(Number(minor))) return null; const major = Number(minor) / 100; if (major === 0) return 'Free'; const currency = (ticket.currency || 'INR').toUpperCase(); return `${currency} ${major.toFixed(2)}`; } /** * ticket_pricing: cards-first. Return deterministic ticket cards from the * EventTicket collection. If there are no active tickets, fall back to Call 2 * for any policy/FAQ answer grounded in the event knowledge base. */ module.exports = async function ticketingHandler({ plan, bot, event, session, turnLog }) { let tickets = []; try { tickets = await EventTicket.find({ event: bot.event, isActive: true }) .sort({ sortOrder: 1, name: 1 }) .lean(); } catch (err) { console.warn('[concierge][ticketing] ticket load failed:', err?.message || err); } if (Array.isArray(tickets) && tickets.length) { const cards = tickets.slice(0, 6).map((t) => ({ type: 'ticket', data: { ticketId: String(t._id), name: t.name, price: formatPrice(t), currency: (t.currency || 'INR').toUpperCase(), description: t.description || '', keyPoints: Array.isArray(t.keyPoints) ? t.keyPoints.slice(0, 5) : [], }, })); return { reply: `Here are the ticket options for ${event?.name || 'this event'}.`, cards, usedCall2: false, }; } const call2 = await generateConciergeResponse({ bot, event, session, plan, turnLog }); return { reply: call2.reply, usedCall2: true, usage: call2.usage, modelId: call2.modelId }; };