[migration] fix issues found in finalization script during stage 3b (#32472)

* accept taxInfoPending as tax id comparison point
* convert recurly unit amount to minor units correctly for no cent currencies
* Use original subscription currency in finalization check
* make it easier to spot migrated with tax info pending

---------

Co-authored-by: John Lees-Miller <jdleesmiller@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
GitOrigin-RevId: d3c74032bc06369fcf6bafb4cfaff85c49a3cfef
This commit is contained in:
Kristina
2026-03-27 10:53:06 +01:00
committed by Copybot
parent 251ccbf1ad
commit ad853d661a
2 changed files with 23 additions and 9 deletions

View File

@@ -1459,13 +1459,8 @@ export async function compareAccountFields({
if (taxIdTypeResult.type && address?.country) {
expectedTaxIdType = taxIdTypeResult.type
expectedTaxIdValue = vatNumber
} else {
expectedMetadata.taxInfoPending = vatNumber
}
}
if (!expectedMetadata.taxInfoPending) {
expectedMetadata.taxInfoPending = ''
}
for (const [key, expectedValue] of Object.entries(expectedMetadata)) {
const stripeValue = stripeCustomer.metadata?.[key] ?? ''
@@ -1504,7 +1499,19 @@ export async function compareAccountFields({
// Tax ID
if (expectedTaxIdType && expectedTaxIdValue) {
const normalizedExpectedTaxIdValue = normalizeTaxIdValue(expectedTaxIdValue)
const stripeTaxIds = stripeCustomer.tax_ids?.data || []
const stripePendingTaxId = stripeCustomer.metadata?.taxInfoPending
? [
{
type: expectedTaxIdType,
value: stripeCustomer.metadata.taxInfoPending,
},
]
: null
const stripeTaxIdsFromStripe = stripeCustomer.tax_ids?.data
const stripeTaxIds =
Array.isArray(stripeTaxIdsFromStripe) && stripeTaxIdsFromStripe.length > 0
? stripeTaxIdsFromStripe
: stripePendingTaxId || []
const matchingTaxId = stripeTaxIds.find(
tid =>
tid.type === expectedTaxIdType &&

View File

@@ -56,7 +56,7 @@ import AccountMappingHelper from '../../app/src/Features/Analytics/AccountMappin
import PlansLocator from '../../app/src/Features/Subscription/PlansLocator.mjs'
import UserAnalyticsIdCache from '../../app/src/Features/Analytics/UserAnalyticsIdCache.mjs'
import CustomerIoHandler from '../../modules/customer-io/app/src/CustomerIoHandler.mjs'
import { ReportError } from './helpers.mjs'
import { ReportError, convertToMinorUnits } from './helpers.mjs'
import isEqual from 'lodash/isEqual.js'
import { compareAccountFields } from '../helpers/migrate_recurly_customers_to_stripe.helpers.mjs'
import {
@@ -472,6 +472,12 @@ async function processMigration(input, commit) {
result.status = 'migrated'
result.note = 'Successfully migrated to Stripe'
if (stripeCustomer.metadata?.taxInfoPending) {
result.status += '-tax-info-pending'
result.note += '; Tax info pending'
}
return result
} else {
result.status = 'validated'
@@ -511,12 +517,13 @@ function detectSubscriptionChanges(
(targetRecurlySubscription.addOns || []).find(
addOn => addOn.addOn.code === 'additional-license'
)?.quantity || 0
const currency = recurlySubscription.currency
const recurlyItems = [
{
code: simplifiedPlanCode,
quantity: recurlyPlanItem.quantity + additionalLicenseQuantity,
amount:
Math.round(targetRecurlySubscription.unitAmount * 100) /
convertToMinorUnits(targetRecurlySubscription.unitAmount, currency) /
recurlyPlanItem.quantity,
},
...(targetRecurlySubscription.addOns || [])
@@ -524,7 +531,7 @@ function detectSubscriptionChanges(
.map(addOn => ({
code: addOn.addOn.code,
quantity: addOn.quantity,
amount: Math.round(addOn.unitAmount * 100),
amount: convertToMinorUnits(addOn.unitAmount, currency),
})),
].sort((a, b) => a.code.localeCompare(b.code))