Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
-- AlterEnum
ALTER TYPE "CampaignType" ADD VALUE 'EVENT';

-- CreateTable
CREATE TABLE "campaign_items" (
"id" TEXT NOT NULL,
"campaign_id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"category" TEXT,
"price" DECIMAL(12,2) NOT NULL,
"max_quantity" INTEGER,
"min_per_order" INTEGER NOT NULL DEFAULT 0,
"max_per_order" INTEGER,
"is_required" BOOLEAN NOT NULL DEFAULT false,
"sort_order" INTEGER NOT NULL DEFAULT 0,
"is_active" BOOLEAN NOT NULL DEFAULT true,

CONSTRAINT "campaign_items_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "donation_line_items" (
"id" TEXT NOT NULL,
"donation_id" TEXT NOT NULL,
"campaign_item_id" TEXT NOT NULL,
"quantity" INTEGER NOT NULL,
"unit_price" DECIMAL(12,2) NOT NULL,
"subtotal" DECIMAL(12,2) NOT NULL,

CONSTRAINT "donation_line_items_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE INDEX "idx_campaign_item_campaign" ON "campaign_items"("campaign_id");

-- CreateIndex
CREATE INDEX "idx_line_item_donation" ON "donation_line_items"("donation_id");

-- CreateIndex
CREATE INDEX "idx_line_item_campaign_item" ON "donation_line_items"("campaign_item_id");

-- AddForeignKey
ALTER TABLE "campaign_items" ADD CONSTRAINT "campaign_items_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "donation_line_items" ADD CONSTRAINT "donation_line_items_donation_id_fkey" FOREIGN KEY ("donation_id") REFERENCES "donations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "donation_line_items" ADD CONSTRAINT "donation_line_items_campaign_item_id_fkey" FOREIGN KEY ("campaign_item_id") REFERENCES "campaign_items"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
44 changes: 42 additions & 2 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -755,6 +755,7 @@ model Campaign {
// Relations
donations Donation[]
tiers CampaignTier[]
items CampaignItem[]

@@index([organizationId, status], name: "idx_campaign_org_status")
@@map("campaigns")
Expand All @@ -771,6 +772,7 @@ enum CampaignType {
OPEN // Default: any amount, no capacity limit
FIXED_UNIT // Fixed price per unit, optional max units
TIERED // Predefined donation levels with optional per-tier caps
EVENT // Multiple purchasable items with categories, prices, and capacity
}

model CampaignTier {
Expand All @@ -788,6 +790,27 @@ model CampaignTier {
@@map("campaign_tiers")
}

model CampaignItem {
id String @id @default(uuid())
campaignId String @map("campaign_id")
name String // "Adult Plate", "Child Plate", "Gift"
description String? @db.Text
category String? // Grouping label: "Plates", "Extras"
price Decimal @db.Decimal(12, 2)
maxQuantity Int? @map("max_quantity") // Total capacity (null = unlimited)
minPerOrder Int @default(0) @map("min_per_order") // 0 = optional
maxPerOrder Int? @map("max_per_order") // null = unlimited
isRequired Boolean @default(false) @map("is_required") // Must select ≥1
sortOrder Int @default(0) @map("sort_order")
isActive Boolean @default(true) @map("is_active")

campaign Campaign @relation(fields: [campaignId], references: [id])
donationLineItems DonationLineItem[]

@@index([campaignId], name: "idx_campaign_item_campaign")
@@map("campaign_items")
}

// ============================================
// DONATIONS
// ============================================
Expand Down Expand Up @@ -832,8 +855,9 @@ model Donation {
updatedAt DateTime @updatedAt @map("updated_at")

// Relations
campaign Campaign? @relation(fields: [campaignId], references: [id])
tier CampaignTier? @relation(fields: [tierId], references: [id])
campaign Campaign? @relation(fields: [campaignId], references: [id])
tier CampaignTier? @relation(fields: [tierId], references: [id])
lineItems DonationLineItem[]

@@index([organizationId, status], name: "idx_donation_org_status")
@@index([organizationId, campaignId], name: "idx_donation_org_campaign")
Expand All @@ -842,6 +866,22 @@ model Donation {
@@map("donations")
}

model DonationLineItem {
id String @id @default(uuid())
donationId String @map("donation_id")
campaignItemId String @map("campaign_item_id")
quantity Int
unitPrice Decimal @map("unit_price") @db.Decimal(12, 2) // Snapshot of price at donation time
subtotal Decimal @map("subtotal") @db.Decimal(12, 2) // quantity × unitPrice

donation Donation @relation(fields: [donationId], references: [id])
campaignItem CampaignItem @relation(fields: [campaignItemId], references: [id])

@@index([donationId], name: "idx_line_item_donation")
@@index([campaignItemId], name: "idx_line_item_campaign_item")
@@map("donation_line_items")
}

enum DonationType {
ONE_TIME
PLEDGE
Expand Down
Loading
Loading