feat(helcim): use contributionAmount, inline ×12 annual math

This commit is contained in:
Jennie Robinson Faber 2026-04-19 18:35:25 +01:00
parent 4c8aff34bf
commit 613d077eaa
2 changed files with 38 additions and 48 deletions

View file

@ -1,5 +1,5 @@
// Create a Helcim subscription
import { getHelcimPlanId, requiresPayment, getContributionTierByValue, getTierAmount } from '../../config/contributions.js'
import { getHelcimPlanId, requiresPayment } from '../../config/contributions.js'
import Member from '../../models/member.js'
import { connectDB } from '../../utils/mongoose.js'
import { getSlackService } from '../../utils/slack.ts'
@ -46,7 +46,7 @@ async function inviteToSlack(member) {
member.name,
member.email,
member.circle,
member.contributionTier,
member.contributionAmount,
inviteResult.status
)
@ -93,19 +93,19 @@ export default defineEventHandler(async (event) => {
const isFirstActivation = priorMember?.status === 'pending_payment'
// Check if payment is required
if (!requiresPayment(body.contributionTier)) {
if (!requiresPayment(body.contributionAmount)) {
// For free tier, just update member status
const member = await Member.findOneAndUpdate(
{ helcimCustomerId: body.customerId },
{
{
status: 'active',
contributionTier: body.contributionTier,
contributionAmount: body.contributionAmount,
subscriptionStartDate: new Date()
},
{ new: true }
)
logActivity(member._id, 'subscription_created', { tier: body.contributionTier })
logActivity(member._id, 'subscription_created', { amount: body.contributionAmount })
await inviteToSlack(member)
if (isFirstActivation) await sendWelcomeEmail(member)
@ -118,7 +118,7 @@ export default defineEventHandler(async (event) => {
email: member.email,
name: member.name,
circle: member.circle,
contributionTier: member.contributionTier,
contributionAmount: member.contributionAmount,
status: member.status
}
}
@ -128,13 +128,15 @@ export default defineEventHandler(async (event) => {
if (!body.cardToken) {
throw createError({
statusCode: 400,
statusMessage: 'Payment information is required for this contribution tier'
statusMessage: 'Payment information is required for a paid contribution'
})
}
const tierInfo = getContributionTierByValue(body.contributionTier)
const cadence = body.cadence
const paymentPlanId = getHelcimPlanId(cadence)
const recurringAmount = cadence === 'annual'
? body.contributionAmount * 12
: body.contributionAmount
if (!paymentPlanId) {
throw createError({
@ -151,7 +153,7 @@ export default defineEventHandler(async (event) => {
dateActivated: new Date().toISOString().split('T')[0],
paymentPlanId: parseInt(paymentPlanId),
customerCode: body.customerCode,
recurringAmount: getTierAmount(tierInfo, cadence),
recurringAmount,
paymentMethod: 'card',
}
@ -167,7 +169,7 @@ export default defineEventHandler(async (event) => {
const member = await Member.findOneAndUpdate(
{ helcimCustomerId: body.customerId },
{ $set: {
contributionTier: body.contributionTier,
contributionAmount: body.contributionAmount,
helcimSubscriptionId: subscription.id,
helcimCustomerId: body.customerId,
paymentMethod: 'card',
@ -178,7 +180,7 @@ export default defineEventHandler(async (event) => {
{ new: true, runValidators: false }
)
logActivity(member._id, 'subscription_created', { tier: body.contributionTier })
logActivity(member._id, 'subscription_created', { amount: body.contributionAmount })
await inviteToSlack(member)
if (isFirstActivation) await sendWelcomeEmail(member)
@ -195,7 +197,7 @@ export default defineEventHandler(async (event) => {
email: member.email,
name: member.name,
circle: member.circle,
contributionTier: member.contributionTier,
contributionAmount: member.contributionAmount,
status: member.status
}
}