// Команда для исправления ВСЕХ незасчитанных рефералов // Выполните в mongosh: load('backend/scripts/fixAllReferrals.mongosh.js') print("🔍 Поиск всех пользователей с referredBy...\n"); var fixed = 0; var needMoreDays = 0; var alreadyCounted = 0; var noReferrer = 0; var errors = 0; // Функция для получения начала дня по московскому времени function getMoscowStartOfDay(date) { if (!date) date = new Date(); var d = new Date(date); // Получаем UTC timestamp var utcTimestamp = d.getTime(); // Добавляем московское смещение (UTC+3) var moscowOffset = 3 * 60 * 60 * 1000; var moscowTime = new Date(utcTimestamp + moscowOffset); // Устанавливаем начало дня var year = moscowTime.getUTCFullYear(); var month = moscowTime.getUTCMonth(); var day = moscowTime.getUTCDate(); var moscowStartOfDay = new Date(Date.UTC(year, month, day, 0, 0, 0, 0)); return new Date(moscowStartOfDay.getTime() - moscowOffset); } // Найти всех пользователей с referredBy db.users.find({ referredBy: { $exists: true, $ne: null } }).forEach(function(user) { try { // Пропускаем уже засчитанных if (user.referralCounted === true) { alreadyCounted++; return; } // Получить реферера var referrer = db.users.findOne({ _id: user.referredBy }); if (!referrer) { print("⚠️ " + (user.username || user._id) + " -> реферер не найден (ID: " + user.referredBy + ")\n"); noReferrer++; return; } // Получить уникальные даты var uniqueDates = new Set(); if (user.loginDates && Array.isArray(user.loginDates)) { user.loginDates.forEach(function(date) { if (!date) return; try { var normalizedDate = getMoscowStartOfDay(new Date(date)); uniqueDates.add(normalizedDate.getTime()); } catch (e) { // Игнорируем ошибки парсинга дат } }); } var uniqueCount = uniqueDates.size; // Если есть 2+ уникальные даты, засчитать if (uniqueCount >= 2) { var currentCount = referrer.referralsCount || 0; var newCount = currentCount + 1; // Увеличить счетчик рефералов db.users.updateOne( { _id: referrer._id }, { $set: { referralsCount: newCount } } ); // Пометить как засчитанного db.users.updateOne( { _id: user._id }, { $set: { referralCounted: true, loginDates: [] } } ); print("✅ ЗАСЧИТАН: " + (user.username || user._id) + " -> " + (referrer.username || referrer._id) + " (счетчик: " + currentCount + " -> " + newCount + ")\n"); fixed++; } else if (uniqueCount > 0) { print("⏳ " + (user.username || user._id) + " -> нужно еще " + (2 - uniqueCount) + " дат (сейчас: " + uniqueCount + ")\n"); needMoreDays++; } else { // Если нет дат входа, но пользователь существует более суток - засчитать как исключение var userAge = new Date() - new Date(user.createdAt || user._id.getTimestamp()); var oneDay = 24 * 60 * 60 * 1000; if (userAge > oneDay) { // Пользователь существует более суток, засчитываем var currentCount = referrer.referralsCount || 0; var newCount = currentCount + 1; db.users.updateOne( { _id: referrer._id }, { $set: { referralsCount: newCount } } ); db.users.updateOne( { _id: user._id }, { $set: { referralCounted: true, loginDates: [] } } ); print("✅ ЗАСЧИТАН (по возрасту >24ч): " + (user.username || user._id) + " -> " + (referrer.username || referrer._id) + " (счетчик: " + currentCount + " -> " + newCount + ")\n"); fixed++; } else { print("📅 " + (user.username || user._id) + " -> нет дат входа, возраст: " + Math.round(userAge / (60 * 60 * 1000)) + " часов\n"); needMoreDays++; } } } catch (error) { print("❌ Ошибка для " + (user.username || user._id) + ": " + error.message + "\n"); errors++; } }); print("\n📊 ИТОГО:"); print(" ✅ Засчитано: " + fixed); print(" ✅ Уже были засчитаны: " + alreadyCounted); print(" ⏳ Требуется больше дней: " + needMoreDays); print(" ⚠️ Реферер не найден: " + noReferrer); print(" ❌ Ошибок: " + errors); print("\n✅ Готово!");