110 lines
2.5 KiB
TypeScript
110 lines
2.5 KiB
TypeScript
/**
|
|
* 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());
|