feat: add advanced analytics and territory management system

- Add comprehensive analytics components with export functionality
- Implement territory management with manager performance tracking
- Add seatmap components for venue layout management
- Create customer management features with modal interface
- Add advanced hooks for dashboard flags and territory data
- Implement seat selection and venue management utilities
- Add type definitions for ticketing and seatmap systems

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-26 09:25:10 -06:00
parent d5c3953888
commit aa81eb5adb
438 changed files with 90509 additions and 2787 deletions

View File

@@ -0,0 +1,97 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOrder = void 0;
const https_1 = require("firebase-functions/v2/https");
const firebase_functions_1 = require("firebase-functions");
const firestore_1 = require("firebase-admin/firestore");
const db = (0, firestore_1.getFirestore)();
/**
* Gets order details by session ID for frontend polling
* POST /api/orders/get
*/
exports.getOrder = (0, https_1.onRequest)({
cors: true,
enforceAppCheck: false,
region: "us-central1",
}, async (req, res) => {
if (req.method !== "POST") {
res.status(405).json({ error: "Method not allowed" });
return;
}
try {
const { sessionId } = req.body;
if (!sessionId) {
res.status(400).json({ error: "Session ID is required" });
return;
}
firebase_functions_1.logger.info("Getting order details", { sessionId });
// Get order by session ID
const orderDoc = await db.collection("orders").doc(sessionId).get();
if (!orderDoc.exists) {
res.status(404).json({ error: "Order not found" });
return;
}
const orderData = orderDoc.data();
// Get additional details if order is paid
let eventName = "";
let ticketTypeName = "";
let eventDate = "";
let eventLocation = "";
if (orderData.status === "paid") {
try {
const [eventDoc, ticketTypeDoc] = await Promise.all([
db.collection("events").doc(orderData.eventId).get(),
db.collection("ticket_types").doc(orderData.ticketTypeId).get(),
]);
if (eventDoc.exists) {
const event = eventDoc.data();
eventName = event.name || "";
eventDate = event.startAt?.toDate?.()?.toISOString() || event.startAt || "";
eventLocation = event.location || "Venue TBD";
}
if (ticketTypeDoc.exists) {
const ticketType = ticketTypeDoc.data();
ticketTypeName = ticketType.name || "";
}
}
catch (error) {
firebase_functions_1.logger.warn("Failed to fetch event/ticket type details for order", {
error: error instanceof Error ? error.message : String(error),
sessionId,
});
}
}
const response = {
id: orderDoc.id,
orgId: orderData.orgId,
eventId: orderData.eventId,
ticketTypeId: orderData.ticketTypeId,
qty: orderData.qty,
status: orderData.status,
totalCents: orderData.totalCents,
purchaserEmail: orderData.purchaserEmail,
eventName,
ticketTypeName,
eventDate,
eventLocation,
createdAt: orderData.createdAt?.toDate?.()?.toISOString() || orderData.createdAt,
updatedAt: orderData.updatedAt?.toDate?.()?.toISOString() || orderData.updatedAt,
};
firebase_functions_1.logger.info("Order details retrieved", {
sessionId,
status: orderData.status,
qty: orderData.qty,
});
res.status(200).json(response);
}
catch (error) {
firebase_functions_1.logger.error("Error getting order details", {
error: error instanceof Error ? error.message : String(error),
stack: error instanceof Error ? error.stack : undefined,
});
res.status(500).json({
error: "Internal server error retrieving order",
});
}
});
// # sourceMappingURL=orders.js.map