@@ -931,31 +931,15 @@ export class StripeService {
931931 originalPeriodEnd : new Date ( periodEnd * 1000 ) . toISOString ( ) ,
932932 }
933933
934- // Step 1: Try to mark the old subscription for currency conversion
935- // This helps the webhook handler skip status updates for this subscription
936- // If this fails (e.g., subscription already canceled or currency not supported), we continue anyway
937- try {
938- await this . stripeClient . subscriptions . update ( subscription . id , {
939- metadata : {
940- ...subscription . metadata ,
941- cancelReason : 'currency_conversion' ,
942- currencyConvertedTo : newCurrency . toUpperCase ( ) ,
943- currencyConvertedAt : new Date ( ) . toISOString ( ) ,
944- } ,
945- } )
946- } catch ( error ) {
947- Logger . warn (
948- `[Stripe] Could not update subscription metadata for ${ subscription . id } : ${ error . message } . ` +
949- `Continuing with conversion anyway.` ,
950- )
951- }
952-
953- // Step 2: Cancel the old subscription immediately
934+ // Cancel the old subscription immediately
954935 // We need to cancel immediately because Stripe doesn't allow customers to have
955936 // active subscriptions in multiple currencies at the same time
956937 try {
957938 await this . stripeClient . subscriptions . cancel ( subscription . id , {
958939 prorate : false , // Don't create prorated credit, we'll use trial instead
940+ cancellation_details : {
941+ comment : `currency_conversion:${ newCurrency . toUpperCase ( ) } ` ,
942+ } ,
959943 } )
960944 } catch ( error ) {
961945 // If the subscription is already canceled, that's fine - continue with creating the new one
@@ -1035,6 +1019,33 @@ export class StripeService {
10351019 newCurrency : Currency ,
10361020 newAmount : number ,
10371021 ) : Promise < void > {
1022+ // First check for the 'converting:' prefix since that's what markRecurringDonationForConversion sets
1023+ const convertingRecord = await this . prisma . recurringDonation . findFirst ( {
1024+ where : { extSubscriptionId : `converting:${ oldSubscriptionId } ` } ,
1025+ } )
1026+
1027+ if ( convertingRecord ) {
1028+ await this . prisma . recurringDonation . update ( {
1029+ where : { id : convertingRecord . id } ,
1030+ data : {
1031+ extSubscriptionId : newSubscriptionId ,
1032+ currency : newCurrency ,
1033+ amount : newAmount ,
1034+ // Set status to active - the Stripe "trial" is just a technical mechanism
1035+ // to preserve the billing cycle, not an actual trial period
1036+ status : RecurringDonationStatus . active ,
1037+ } ,
1038+ } )
1039+ Logger . debug (
1040+ `[Stripe] Updated recurring donation ${ convertingRecord . id } : ` +
1041+ `subscription converting:${ oldSubscriptionId } -> ${ newSubscriptionId } , ` +
1042+ `currency -> ${ newCurrency } , amount -> ${ newAmount } , status -> active` ,
1043+ )
1044+ return
1045+ }
1046+
1047+ // Fallback: check for old subscription ID directly (in case markRecurringDonationForConversion
1048+ // was skipped or failed)
10381049 const recurringDonation = await this . prisma . recurringDonation . findFirst ( {
10391050 where : { extSubscriptionId : oldSubscriptionId } ,
10401051 } )
@@ -1046,41 +1057,21 @@ export class StripeService {
10461057 extSubscriptionId : newSubscriptionId ,
10471058 currency : newCurrency ,
10481059 amount : newAmount ,
1049- // Set status to active - the Stripe "trial" is just a technical mechanism
1050- // to preserve the billing cycle, not an actual trial period
10511060 status : RecurringDonationStatus . active ,
10521061 } ,
10531062 } )
10541063 Logger . debug (
1055- `[Stripe] Updated local recurring donation ${ recurringDonation . id } : ` +
1064+ `[Stripe] Updated recurring donation ${ recurringDonation . id } : ` +
10561065 `subscription ${ oldSubscriptionId } -> ${ newSubscriptionId } , ` +
10571066 `currency -> ${ newCurrency } , amount -> ${ newAmount } , status -> active` ,
10581067 )
1059- } else {
1060- // Check if it was marked for conversion (extSubscriptionId prefixed with 'converting:')
1061- const convertingRecord = await this . prisma . recurringDonation . findFirst ( {
1062- where : { extSubscriptionId : `converting:${ oldSubscriptionId } ` } ,
1063- } )
1064- if ( convertingRecord ) {
1065- await this . prisma . recurringDonation . update ( {
1066- where : { id : convertingRecord . id } ,
1067- data : {
1068- extSubscriptionId : newSubscriptionId ,
1069- currency : newCurrency ,
1070- amount : newAmount ,
1071- status : RecurringDonationStatus . active ,
1072- } ,
1073- } )
1074- Logger . debug (
1075- `[Stripe] Updated converting recurring donation ${ convertingRecord . id } : ` +
1076- `subscription converting:${ oldSubscriptionId } -> ${ newSubscriptionId } ` ,
1077- )
1078- } else {
1079- Logger . warn (
1080- `[Stripe] No local recurring donation found for subscription ${ oldSubscriptionId } ` ,
1081- )
1082- }
1068+ return
10831069 }
1070+
1071+ Logger . warn (
1072+ `[Stripe] No local recurring donation found for subscription ${ oldSubscriptionId } ` +
1073+ `(checked both 'converting:${ oldSubscriptionId } ' and '${ oldSubscriptionId } ')` ,
1074+ )
10841075 }
10851076
10861077 /**
0 commit comments