51 lines
1.7 KiB
JavaScript
51 lines
1.7 KiB
JavaScript
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 };
|
|
};
|