Add landing page

This commit is contained in:
Jennie Robinson Faber 2025-11-03 11:17:51 +00:00
parent 3fea484585
commit bce86ee840
47 changed files with 7119 additions and 439 deletions

View file

@ -70,16 +70,66 @@ const eventSchema = new mongoose.Schema({
// Ticket configuration
tickets: {
enabled: { type: Boolean, default: false },
requiresSeriesTicket: { type: Boolean, default: false }, // If true, must buy series pass instead
seriesTicketReference: {
type: mongoose.Schema.Types.ObjectId,
ref: "Series",
}, // Reference to series with tickets
currency: { type: String, default: "CAD" },
// Member ticket configuration
member: {
available: { type: Boolean, default: true }, // Members can always register if tickets enabled
isFree: { type: Boolean, default: true }, // Most events free for members
price: { type: Number, default: 0 }, // Optional member price (discounted)
name: { type: String, default: "Member Ticket" },
description: String,
// Circle-specific overrides (optional)
circleOverrides: {
community: {
isFree: { type: Boolean },
price: { type: Number },
},
founder: {
isFree: { type: Boolean },
price: { type: Number },
},
practitioner: {
isFree: { type: Boolean },
price: { type: Number },
},
},
},
// Public (non-member) ticket configuration
public: {
available: { type: Boolean, default: false },
name: { type: String, default: "Public Ticket" },
description: String,
price: { type: Number, default: 0 },
quantity: Number, // null = unlimited
quantity: Number, // null/undefined = unlimited
sold: { type: Number, default: 0 },
reserved: { type: Number, default: 0 }, // Temporarily reserved during checkout
earlyBirdPrice: Number,
earlyBirdDeadline: Date,
},
// Capacity management (applies to all ticket types combined)
capacity: {
total: Number, // null/undefined = unlimited
reserved: { type: Number, default: 0 }, // Currently reserved across all types
},
// Waitlist configuration
waitlist: {
enabled: { type: Boolean, default: false },
maxSize: Number, // null = unlimited waitlist
entries: [
{
name: String,
email: String,
membershipLevel: String,
addedAt: { type: Date, default: Date.now },
notified: { type: Boolean, default: false },
},
],
},
},
// Circle targeting
targetCircles: [
@ -107,14 +157,29 @@ const eventSchema = new mongoose.Schema({
email: String,
membershipLevel: String,
isMember: { type: Boolean, default: false },
// Ticket information
ticketType: {
type: String,
enum: ["member", "public", "guest", "series_pass"],
default: "guest",
},
ticketPrice: { type: Number, default: 0 }, // Actual price paid (may be early bird, member, etc.)
// Series ticket info
isSeriesTicketHolder: { type: Boolean, default: false }, // Registered via series pass
seriesTicketId: { type: mongoose.Schema.Types.ObjectId, ref: "Series" }, // Reference to series registration
// Payment information
paymentStatus: {
type: String,
enum: ["pending", "completed", "failed", "not_required"],
enum: ["pending", "completed", "failed", "refunded", "not_required"],
default: "not_required",
},
paymentId: String, // Helcim transaction ID
amountPaid: { type: Number, default: 0 },
// Metadata
registeredAt: { type: Date, default: Date.now },
cancelledAt: Date,
refundedAt: Date,
refundAmount: Number,
},
],
createdBy: { type: String, required: true },