121 lines
3.2 KiB
JavaScript
121 lines
3.2 KiB
JavaScript
// Script to create missing Helcim payment plans
|
|
// Run with: node scripts/setup-helcim-plans.js
|
|
|
|
import { config } from "dotenv";
|
|
import { fileURLToPath } from "url";
|
|
import { dirname, resolve } from "path";
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
|
|
// Load .env file
|
|
config({ path: resolve(__dirname, "../.env") });
|
|
|
|
const HELCIM_API_BASE = "https://api.helcim.com/v2";
|
|
|
|
async function createPlan(name, amount) {
|
|
const helcimToken = process.env.NUXT_PUBLIC_HELCIM_TOKEN;
|
|
|
|
if (!helcimToken) {
|
|
throw new Error(
|
|
"NUXT_PUBLIC_HELCIM_TOKEN environment variable not set in .env file",
|
|
);
|
|
}
|
|
|
|
console.log(`Creating plan: ${name} ($${amount}/month)...`);
|
|
|
|
const response = await fetch(`${HELCIM_API_BASE}/payment-plans`, {
|
|
method: "POST",
|
|
headers: {
|
|
accept: "application/json",
|
|
"content-type": "application/json",
|
|
"api-token": helcimToken,
|
|
},
|
|
body: JSON.stringify({
|
|
name: name,
|
|
description: `Ghost Guild ${name}`,
|
|
type: "subscription",
|
|
status: "active",
|
|
currency: "CAD",
|
|
setupAmount: 0,
|
|
recurringAmount: parseFloat(amount),
|
|
billingPeriod: "monthly",
|
|
billingPeriodIncrements: 1,
|
|
dateBilling: "Sign-up",
|
|
termType: "forever",
|
|
freeTrialPeriod: 0,
|
|
taxType: "customer",
|
|
paymentMethod: "card",
|
|
}),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const errorText = await response.text();
|
|
throw new Error(`Failed to create plan: ${errorText}`);
|
|
}
|
|
|
|
const planData = await response.json();
|
|
console.log(`✓ Created plan ID: ${planData.id}`);
|
|
|
|
return planData;
|
|
}
|
|
|
|
async function main() {
|
|
console.log("Setting up Helcim payment plans...\n");
|
|
|
|
const plans = [
|
|
{ name: "Ghost Guild - Member ($15)", amount: 15, tier: "MEMBER" },
|
|
{ name: "Ghost Guild - Advocate ($30)", amount: 30, tier: "ADVOCATE" },
|
|
{ name: "Ghost Guild - Champion ($50)", amount: 50, tier: "CHAMPION" },
|
|
];
|
|
|
|
const results = [];
|
|
|
|
for (const plan of plans) {
|
|
try {
|
|
const result = await createPlan(plan.name, plan.amount);
|
|
results.push({
|
|
tier: plan.tier,
|
|
planId: result.id,
|
|
amount: plan.amount,
|
|
});
|
|
} catch (error) {
|
|
console.error(`✗ Failed to create ${plan.name}:`, error.message);
|
|
}
|
|
}
|
|
|
|
console.log("\n--- Plan IDs to update in contributions.js ---");
|
|
results.forEach(({ tier, planId, amount }) => {
|
|
console.log(`${tier}: helcimPlanId: ${planId}, // $${amount}/month`);
|
|
});
|
|
|
|
console.log("\n--- Copy this to update server/config/contributions.js ---");
|
|
console.log(`
|
|
MEMBER: {
|
|
value: '15',
|
|
amount: 15,
|
|
label: '$15 - I can sustain the community',
|
|
tier: 'member',
|
|
helcimPlanId: ${results.find((r) => r.tier === "MEMBER")?.planId || "null"},
|
|
...
|
|
},
|
|
ADVOCATE: {
|
|
value: '30',
|
|
amount: 30,
|
|
label: '$30 - I can support others too',
|
|
tier: 'advocate',
|
|
helcimPlanId: ${results.find((r) => r.tier === "ADVOCATE")?.planId || "null"},
|
|
...
|
|
},
|
|
CHAMPION: {
|
|
value: '50',
|
|
amount: 50,
|
|
label: '$50 - I want to sponsor multiple members',
|
|
tier: 'champion',
|
|
helcimPlanId: ${results.find((r) => r.tier === "CHAMPION")?.planId || "null"},
|
|
...
|
|
}
|
|
`);
|
|
}
|
|
|
|
main().catch(console.error);
|