fix(server): treat contributionAmount as cadence-unit (drop ×12)

ContributionAmountField now emits cadence-unit values (180 for $180/yr,
15 for $15/mo). Server endpoints were still multiplying annual by 12,
which would have charged $2160/yr instead of $180/yr after the form
ports in Tasks 2–3.

- helcim/subscription.post.js: recurringAmount = contributionAmount
  (no more × 12 for annual)
- members/update-contribution.post.js: same drop in both Case 1
  (free→paid) and Case 3 (paid→paid)
- slack.ts notifyNewMember: new positional `cadence` param so the
  Slack notification suffix renders /yr or /mo instead of hardcoded
  /month; all three call sites updated to pass member.billingCadence
- tests updated to match the new contract:
  - helcim-subscription.test.js: annual tests now send the cadence-
    unit amount (180, 600) and expect the same recurringAmount
  - update-contribution.test.js: annual Case 1 and Case 3 tests
    updated likewise
This commit is contained in:
Jennie Robinson Faber 2026-05-23 15:37:52 +01:00
parent e0e7da5cca
commit 5023fb14ad
6 changed files with 24 additions and 22 deletions

View file

@ -47,6 +47,7 @@ export default defineEventHandler(async (event) => {
member.email,
member.circle,
member.contributionAmount,
member.billingCadence,
'manual_invitation_required'
)
}
@ -79,9 +80,7 @@ export default defineEventHandler(async (event) => {
const cadence = body.cadence
const paymentPlanId = getHelcimPlanId(cadence)
const recurringAmount = cadence === 'annual'
? body.contributionAmount * 12
: body.contributionAmount
const recurringAmount = body.contributionAmount
if (!paymentPlanId) {
throw createError({
@ -159,6 +158,7 @@ export default defineEventHandler(async (event) => {
member.email,
member.circle,
member.contributionAmount,
member.billingCadence,
'manual_invitation_required'
)
}

View file

@ -43,6 +43,7 @@ export default defineEventHandler(async (event) => {
member.email,
member.circle,
member.contributionAmount,
member.billingCadence,
'manual_invitation_required'
)
}

View file

@ -88,7 +88,7 @@ export default defineEventHandler(async (event) => {
dateActivated: new Date().toISOString().split("T")[0],
paymentPlanId: parseInt(paymentPlanId),
customerCode,
recurringAmount: cadence === 'annual' ? newAmount * 12 : newAmount,
recurringAmount: newAmount,
paymentMethod: "card",
},
idempotencyKey,
@ -217,7 +217,7 @@ export default defineEventHandler(async (event) => {
try {
const subscriptionData = await updateHelcimSubscription(
member.helcimSubscriptionId,
{ recurringAmount: memberCadence === 'annual' ? newAmount * 12 : newAmount }
{ recurringAmount: newAmount }
);
await Member.findByIdAndUpdate(

View file

@ -90,6 +90,7 @@ export class SlackService {
memberEmail: string,
circle: string,
contributionAmount: number,
cadence: string = 'monthly',
invitationStatus: string = "manual_invitation_required",
): Promise<void> {
try {
@ -148,7 +149,7 @@ export class SlackService {
},
{
type: "mrkdwn",
text: `*Contribution:*\n$${contributionAmount}/month`,
text: `*Contribution:*\n$${contributionAmount}/${cadence === 'annual' ? 'yr' : 'mo'}`,
},
],
},