const { MongoClient, ObjectId } = require('mongodb'); async function connectToMongo() { const client = new MongoClient('mongodb://localhost:27017'); await client.connect(); return { client, db: client.db('dux2') }; } async function fixTenantCreditInconsistencies() { const { client, db } = await connectToMongo(); try { console.log('šŸ”§ Fixing Tenant Credit Inconsistencies...'); console.log('='.repeat(60)); // Get all tenants const tenants = await db.collection('tenants').find({}).toArray(); for (const tenant of tenants) { const tenantId = tenant._id; console.log(`\nšŸ¢ Processing: ${tenant.name} (${tenantId})`); // Get all credit operations for this tenant const creditOps = await db.collection('creditoperations').find({ tenantId: tenantId }).toArray(); if (creditOps.length === 0) { console.log(' No credit operations found.'); continue; } // Calculate totals from credit operations const totalCreditsUsed = creditOps.reduce((sum, op) => { return sum + Math.abs(op.creditsChanged < 0 ? op.creditsChanged : 0); }, 0); const totalCreditsAdded = creditOps.reduce((sum, op) => { return sum + (op.creditsChanged > 0 ? op.creditsChanged : 0); }, 0); // Get the latest operation for lastCreditOperation const latestOp = creditOps.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))[0]; // Calculate available credits (starting from 100, adding credits added, subtracting credits used) const availableCredits = 100 + totalCreditsAdded - totalCreditsUsed; console.log(` Credit Operations: ${creditOps.length}`); console.log(` Total Credits Used (calculated): ${totalCreditsUsed}`); console.log(` Total Credits Added (calculated): ${totalCreditsAdded}`); console.log(` Available Credits (calculated): ${availableCredits}`); console.log(` Current Total Credits Used: ${tenant.creditBalance?.totalCreditsUsed || 0}`); console.log(` Current Available Credits: ${tenant.creditBalance?.availableCredits || 100}`); // Check if update is needed const needsUpdate = (tenant.creditBalance?.totalCreditsUsed || 0) !== totalCreditsUsed || (tenant.creditBalance?.availableCredits || 100) !== availableCredits; if (needsUpdate) { console.log(' 🚨 INCONSISTENCY DETECTED - Updating...'); const updateResult = await db.collection('tenants').updateOne( { _id: tenantId }, { $set: { 'creditBalance.totalCreditsUsed': totalCreditsUsed, 'creditBalance.availableCredits': availableCredits, 'creditBalance.lastCreditOperation': latestOp.createdAt } } ); if (updateResult.modifiedCount > 0) { console.log(' āœ… Successfully updated tenant credit balance.'); } else { console.log(' āŒ Failed to update tenant credit balance.'); } } else { console.log(' āœ… Credit balance is already consistent.'); } } console.log('\nšŸŽ‰ Credit inconsistency fix completed!'); } catch (error) { console.error('āŒ Error during fix:', error); } finally { await client.close(); console.log('\nšŸ”Œ Disconnected from MongoDB'); } } fixTenantCreditInconsistencies();