Add landing page
This commit is contained in:
parent
3fea484585
commit
bce86ee840
47 changed files with 7119 additions and 439 deletions
|
|
@ -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 },
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue