This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
/**
|
||||
* Seed default billing plans
|
||||
* ----------------------------
|
||||
* Run with: npx ts-node prisma/seed-plans.ts
|
||||
* Or via the API: POST /api/billing { action: "seed_plans" }
|
||||
*
|
||||
* Creates 4 plans: Free, Starter ($49/mo), Pro ($149/mo), Enterprise ($499/mo)
|
||||
*/
|
||||
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
const plans = [
|
||||
{
|
||||
name: "Free",
|
||||
slug: "free",
|
||||
priceMonthly: 0,
|
||||
sortOrder: 0,
|
||||
limitBrands: 1,
|
||||
limitWebsites: 1,
|
||||
limitEvents: 1000,
|
||||
limitUsers: 1,
|
||||
features: {
|
||||
dashboard: true,
|
||||
technical_audit: true,
|
||||
site_tag: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Starter",
|
||||
slug: "starter",
|
||||
priceMonthly: 4900, // $49.00
|
||||
sortOrder: 1,
|
||||
limitBrands: 3,
|
||||
limitWebsites: 3,
|
||||
limitEvents: 10000,
|
||||
limitUsers: 3,
|
||||
features: {
|
||||
dashboard: true,
|
||||
technical_audit: true,
|
||||
site_tag: true,
|
||||
content_briefs: true,
|
||||
competitors: true,
|
||||
ai_avatar: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Pro",
|
||||
slug: "pro",
|
||||
priceMonthly: 14900, // $149.00
|
||||
sortOrder: 2,
|
||||
limitBrands: 10,
|
||||
limitWebsites: 10,
|
||||
limitEvents: 100000,
|
||||
limitUsers: 10,
|
||||
features: {
|
||||
dashboard: true,
|
||||
technical_audit: true,
|
||||
site_tag: true,
|
||||
content_briefs: true,
|
||||
competitors: true,
|
||||
ai_avatar: true,
|
||||
conversion_intelligence: true,
|
||||
local_geo: true,
|
||||
report_studio: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Enterprise",
|
||||
slug: "enterprise",
|
||||
priceMonthly: 49900, // $499.00
|
||||
sortOrder: 3,
|
||||
limitBrands: 100,
|
||||
limitWebsites: 100,
|
||||
limitEvents: 1000000,
|
||||
limitUsers: 50,
|
||||
features: {
|
||||
dashboard: true,
|
||||
technical_audit: true,
|
||||
site_tag: true,
|
||||
content_briefs: true,
|
||||
competitors: true,
|
||||
ai_avatar: true,
|
||||
conversion_intelligence: true,
|
||||
local_geo: true,
|
||||
report_studio: true,
|
||||
api_access: true,
|
||||
white_label: true,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
for (const p of plans) {
|
||||
await prisma.plan.upsert({
|
||||
where: { slug: p.slug },
|
||||
create: { ...p, features: p.features },
|
||||
update: { ...p, features: p.features },
|
||||
});
|
||||
console.log(` ✓ ${p.name} plan — $${(p.priceMonthly / 100).toFixed(2)}/mo, ${p.limitBrands} brands, ${p.limitEvents.toLocaleString()} events`);
|
||||
}
|
||||
|
||||
console.log("\nDone! 4 plans seeded.");
|
||||
}
|
||||
|
||||
main()
|
||||
.catch(console.error)
|
||||
.finally(() => prisma.$disconnect());
|
||||
Reference in New Issue
Block a user