H2H match and sikka game app script code
// =======================================================
// 🚀 ARENA 11 - ULTIMATE MASTER BACKEND (v12.1 PRO FINAL)
// 🔒 All Limits, Cancel Refund, Toss Logic & Admin Lock
// =======================================================
const MIN_BET = 20;
const MAX_BET = 500;
const MIN_WITHDRAW = 100;
const MAX_WITHDRAW = 5000;
const ADMIN_SECRET = "ARENA_ADMIN_786"; // 🚨 H2H Match Settlement ke liye Secret Password
function doPost(e) {
try {
var payload = JSON.parse(e.postData.contents);
var action = payload.action;
// --- PUBLIC ROUTES ---
if (action === "register") return jsonResponse(handleRegister(payload));
if (action === "login") return jsonResponse(handleLogin(payload));
if (action === "getDashboardData") return jsonResponse(getDashboardData());
// --- SECURE ROUTES (Session Token Required) ---
if (!verifySession(payload.phone, payload.token)) {
return jsonResponse({ success: false, message: "Session Expired! Logged in from another device." });
}
if (action === "getUserData") return jsonResponse(handleGetUserData(payload));
if (action === "deposit") return jsonResponse(handleDeposit(payload));
if (action === "withdraw") return jsonResponse(handleWithdraw(payload));
// --- H2H ARENA GAMES ---
if (action === "createChallenge") return jsonResponse(handleCreateChallenge(payload));
if (action === "acceptChallenge") return jsonResponse(handleAcceptChallenge(payload));
if (action === "cancelChallenge") return jsonResponse(handleCancelChallenge(payload)); // 🔥 NEW: Auto Refund
if (action === "resolveH2HMatch") return jsonResponse(handleResolveH2HMatch(payload));
// --- TOSS GAME ---
if (action === "tossGetRound") return jsonResponse(handleTossGetRound(payload));
if (action === "tossPlaceBet") return jsonResponse(handleTossPlaceBet(payload));
if (action === "tossResolve") return jsonResponse(handleTossResolve(payload));
} catch (err) {
return jsonResponse({ success: false, message: "Server Error: " + err.message });
}
}
function jsonResponse(data) {
return ContentService.createTextOutput(JSON.stringify(data)).setMimeType(ContentService.MimeType.JSON);
}
// ====================================================
// 1. SIGNUP & LOGIN (WITH AUTO-REACTIVATION)
// ====================================================
function handleRegister(payload) {
var phone = String(payload.phone).trim();
var otp = String(payload.otp).trim();
var otpSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Common OTP");
if (!otpSheet) return { success: false, message: "System Error: OTP sheet missing!" };
var validOtp = String(otpSheet.getRange("A2").getValue()).trim();
if (otp !== validOtp) return { success: false, message: "Invalid OTP! Admin se sahi OTP lein." };
if (/^(\d)\1{9}$/.test(phone)) return { success: false, message: "Fake number not allowed!" };
if (phone.length !== 10) return { success: false, message: "Enter exactly 10 digits!" };
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetsToCheck = ["Users", "Inactive_Users", "Archive_Users"];
for (var s = 0; s < sheetsToCheck.length; s++) {
var checkSheet = ss.getSheetByName(sheetsToCheck[s]);
if (checkSheet) {
var cData = checkSheet.getDataRange().getValues();
for (var i = 1; i < cData.length; i++) {
if (String(cData[i][2]) === phone) return { success: false, message: "Number already registered!" };
}
}
}
var newId = Utilities.getUuid().split('-')[0];
var userSheet = ss.getSheetByName("Users");
userSheet.appendRow([newId, payload.name, phone, "N/A", 0, new Date(), "Active", payload.pass, ""]);
return { success: true, message: "Registered Successfully! Please Login." };
}
function handleLogin(payload) {
var phone = String(payload.phone).trim();
var pass = String(payload.pass).trim();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sessionToken = Utilities.getUuid();
var found = false;
var balance = 0;
var userSheet = ss.getSheetByName("Users");
var data = userSheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (String(data[i][2]) === phone) {
if (String(data[i][7]) !== pass) return { success: false, message: "Wrong Password!" };
userSheet.getRange(i + 1, 9).setValue(sessionToken);
userSheet.getRange(i + 1, 6).setValue(new Date());
balance = parseFloat(data[i][4]) || 0;
found = true; break;
}
}
if (!found) {
var reactivated = reactivateUser(phone, pass, sessionToken);
if (reactivated.success) { found = true; balance = reactivated.balance; }
}
if (found) return { success: true, balance: balance, token: sessionToken };
return { success: false, message: "User not found!" };
}
function reactivateUser(phone, pass, token) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var userSheet = ss.getSheetByName("Users");
var sheetsToSearch = ["Inactive_Users", "Archive_Users"];
for (var s = 0; s < sheetsToSearch.length; s++) {
var oldSheet = ss.getSheetByName(sheetsToSearch[s]);
if (!oldSheet) continue;
var data = oldSheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (String(data[i][2]) === phone) {
if (String(data[i][7]) !== pass) return { success: false, message: "Wrong Password!" };
var rowData = data[i];
rowData[5] = new Date();
rowData[6] = "Active";
rowData[8] = token;
userSheet.appendRow(rowData);
oldSheet.deleteRow(i + 1);
return { success: true, balance: parseFloat(rowData[4]) || 0 };
}
}
}
return { success: false };
}
function verifySession(phone, token) {
if (!phone || !token) return false;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (String(data[i][2]) === String(phone)) {
if (String(data[i][8]) === String(token)) {
sheet.getRange(i + 1, 6).setValue(new Date());
return true;
}
}
}
return false;
}
function handleGetUserData(payload) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (String(data[i][2]) === String(payload.phone)) {
return { success: true, balance: parseFloat(data[i][4]) || 0 };
}
}
return { success: false };
}
// ====================================================
// 2. SECURE WITHDRAW & DEPOSIT
// ====================================================
function handleWithdraw(payload) {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return { success: false, message: "System busy. Try again." };
try {
var amount = parseFloat(payload.amount) || 0;
var upi = String(payload.upi).trim();
if (amount < MIN_WITHDRAW || amount > MAX_WITHDRAW) return { success: false, message: "Withdrawal limit: ₹" + MIN_WITHDRAW + " to ₹" + MAX_WITHDRAW };
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (String(data[i][2]) === String(payload.phone)) {
var balance = parseFloat(data[i][4]) || 0;
if (balance < amount) return { success: false, message: "Insufficient Wallet Balance!" };
sheet.getRange(i + 1, 5).setValue(balance - amount);
if(upi !== "") sheet.getRange(i + 1, 4).setValue(upi);
else upi = String(data[i][3]);
var txnSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions");
var txnId = "TXN" + Math.floor(Math.random() * 900000 + 100000);
txnSheet.appendRow([txnId, new Date(), payload.phone, "Withdrawal", amount, "Pending", upi]);
return { success: true };
}
}
return { success: false, message: "User not found!" };
} finally { lock.releaseLock(); }
}
function handleDeposit(payload) {
var amount = parseFloat(payload.amount) || 0;
if (amount <= 0) return { success: false, message: "Invalid Amount!" };
var txnSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions");
var txnId = "TXN" + Math.floor(Math.random() * 900000 + 100000);
txnSheet.appendRow([txnId, new Date(), payload.phone, "Deposit", amount, "Pending", payload.utr]);
return { success: true };
}
// ====================================================
// 3. 🏏 H2H CHALLENGE ARENA & SETTLEMENT LOGIC
// ====================================================
function getDashboardData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var matches = [], bets = [];
var matchSheet = ss.getSheetByName("Matches");
if(matchSheet) {
var mData = matchSheet.getDataRange().getValues();
for(var i = 1; i < mData.length; i++) {
if(mData[i][5] === "Upcoming" || mData[i][5] === "Live") {
matches.push({
matchId: mData[i][0], matchName: mData[i][1], matchDate: mData[i][2],
teamA: mData[i][3], teamB: mData[i][4],
teamAPlayers: mData[i][7] || "Not Announced", teamBPlayers: mData[i][8] || "Not Announced"
});
}
}
}
var betSheet = ss.getSheetByName("Bets");
if(betSheet) {
var bData = betSheet.getDataRange().getValues();
for(var j = 1; j < bData.length; j++) {
if(bData[j][6] === "Open") {
bets.push({
betId: bData[j][0], matchId: bData[j][1], creatorPhone: bData[j][2],
creatorName: "Player", team: bData[j][3], amount: bData[j][4]
});
}
}
}
return { success: true, upcomingMatches: matches, openChallenges: bets };
}
function handleCreateChallenge(payload) {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return { success: false, message: "System busy." };
try {
var amount = parseFloat(payload.amount) || 0;
if (amount < MIN_BET || amount > MAX_BET) return { success: false, message: "Bet limit: ₹" + MIN_BET + " to ₹" + MAX_BET };
var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var userData = userSheet.getDataRange().getValues();
for (var i = 1; i < userData.length; i++) {
if (String(userData[i][2]) === String(payload.phone)) {
var balance = parseFloat(userData[i][4]) || 0;
if (balance < amount) return { success: false, message: "Insufficient Balance!" };
userSheet.getRange(i + 1, 5).setValue(balance - amount);
var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bets");
var betId = "BET-" + Utilities.getUuid().split('-')[0];
betSheet.appendRow([betId, payload.matchId, payload.phone, payload.team, amount, "", "Open"]);
return { success: true, message: "Challenge Created!" };
}
}
return { success: false, message: "User error." };
} finally { lock.releaseLock(); }
}
function handleAcceptChallenge(payload) {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return { success: false, message: "System busy." };
try {
var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bets");
var betData = betSheet.getDataRange().getValues();
var betRow = -1, amount = 0, creatorPhone = "";
for (var j = 1; j < betData.length; j++) {
if (String(betData[j][0]) === payload.betId && String(betData[j][6]) === "Open") {
betRow = j + 1;
creatorPhone = String(betData[j][2]);
amount = parseFloat(betData[j][4]) || 0;
break;
}
}
if (betRow === -1) return { success: false, message: "Challenge already accepted or doesn't exist." };
if (creatorPhone === String(payload.phone)) return { success: false, message: "You cannot accept your own challenge!" };
var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var userData = userSheet.getDataRange().getValues();
for (var i = 1; i < userData.length; i++) {
if (String(userData[i][2]) === String(payload.phone)) {
var balance = parseFloat(userData[i][4]) || 0;
if (balance < amount) return { success: false, message: "Insufficient Balance!" };
userSheet.getRange(i + 1, 5).setValue(balance - amount);
betSheet.getRange(betRow, 6).setValue(payload.phone);
betSheet.getRange(betRow, 7).setValue("Matched");
return { success: true, message: "Challenge Accepted!" };
}
}
return { success: false, message: "User error." };
} finally { lock.releaseLock(); }
}
// 🔥 NEW: Auto Refund for unaccepted bets
function handleCancelChallenge(payload) {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return { success: false, message: "System busy." };
try {
var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bets");
var betData = betSheet.getDataRange().getValues();
var betRow = -1, amount = 0;
for (var j = 1; j < betData.length; j++) {
if (String(betData[j][0]) === payload.betId && String(betData[j][6]) === "Open") {
if (String(betData[j][2]) !== String(payload.phone)) return { success: false, message: "You can only cancel your own challenge!" };
betRow = j + 1;
amount = parseFloat(betData[j][4]) || 0;
break;
}
}
if (betRow === -1) return { success: false, message: "Challenge cannot be cancelled (Already Matched or Settled)." };
// Refund Money
var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var userData = userSheet.getDataRange().getValues();
for (var i = 1; i < userData.length; i++) {
if (String(userData[i][2]) === String(payload.phone)) {
var balance = parseFloat(userData[i][4]) || 0;
userSheet.getRange(i + 1, 5).setValue(balance + amount);
betSheet.getRange(betRow, 7).setValue("Cancelled"); // Mark as Cancelled
return { success: true, message: "Challenge Cancelled. ₹" + amount + " Refunded!" };
}
}
return { success: false, message: "User error." };
} finally { lock.releaseLock(); }
}
// 🔥 SECURED H2H Match Settlement (With Admin Password Protection)
function handleResolveH2HMatch(payload) {
if(payload.adminPass !== ADMIN_SECRET) return { success: false, message: "Unauthorized! Incorrect Admin Password." };
var lock = LockService.getScriptLock();
if (!lock.tryLock(10000)) return { success: false, message: "System busy processing results." };
try {
var matchId = String(payload.matchId);
var winnerTeam = String(payload.winnerTeam).trim().toUpperCase();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var betSheet = ss.getSheetByName("Bets");
var betData = betSheet.getDataRange().getValues();
var userSheet = ss.getSheetByName("Users");
var userData = userSheet.getDataRange().getValues();
var userPhoneMap = {};
for (var u = 1; u < userData.length; u++) {
userPhoneMap[String(userData[u][2])] = { row: u + 1, balance: parseFloat(userData[u][4]) || 0 };
}
var totalMatchPool = 0;
var totalAdminCommission = 0;
var totalGivenToWinners = 0;
for (var j = 1; j < betData.length; j++) {
if (String(betData[j][1]) === matchId && String(betData[j][6]) === "Matched") {
var creatorPhone = String(betData[j][2]);
var creatorTeam = String(betData[j][3]).toUpperCase();
var betAmount = parseFloat(betData[j][4]) || 0;
var opponentPhone = String(betData[j][5]);
var totalPool = betAmount * 2;
var adminCommission = betAmount * 0.2; // 10% of Total Pool
var winnerPayout = totalPool - adminCommission; // 1.8x Payout
var actualWinnerPhone = (creatorTeam === winnerTeam) ? creatorPhone : opponentPhone;
if (userPhoneMap[actualWinnerPhone]) {
userPhoneMap[actualWinnerPhone].balance += winnerPayout;
userSheet.getRange(userPhoneMap[actualWinnerPhone].row, 5).setValue(userPhoneMap[actualWinnerPhone].balance);
}
betSheet.getRange(j + 1, 7).setValue("Settled");
totalMatchPool += totalPool;
totalAdminCommission += adminCommission;
totalGivenToWinners += winnerPayout;
}
}
var profitSheet = ss.getSheetByName("Admin_Profit");
if(profitSheet && totalMatchPool > 0) {
profitSheet.appendRow([matchId, totalMatchPool, totalAdminCommission, totalGivenToWinners, new Date()]);
}
var matchSheet = ss.getSheetByName("Matches");
var matchData = matchSheet.getDataRange().getValues();
for(var m = 1; m < matchData.length; m++) {
if(String(matchData[m][0]) === matchId) {
matchSheet.getRange(m + 1, 6).setValue("Completed");
matchSheet.getRange(m + 1, 7).setValue(winnerTeam);
break;
}
}
return { success: true, message: "Match Resolved! Admin Profit: ₹" + totalAdminCommission };
} finally { lock.releaseLock(); }
}
// ====================================================
// 4. 🪙 TOSS GAME LOGIC
// ====================================================
function handleTossGetRound(payload) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Rounds");
var data = sheet.getDataRange().getValues();
var activeRound = null;
for (var i = data.length - 1; i > 0; i--) {
if (data[i][2] === "Active") {
activeRound = { roundId: data[i][0], timestamp: data[i][1], status: data[i][2] };
break;
}
}
if (!activeRound) {
var newRoundId = "TOSS-" + new Date().getTime();
var timestamp = new Date().getTime();
sheet.appendRow([newRoundId, timestamp, "Active", "Pending"]);
activeRound = { roundId: newRoundId, timestamp: timestamp, status: "Active" };
}
return { success: true, round: activeRound };
}
function handleTossPlaceBet(payload) {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return { success: false, message: "System busy. Try again." };
try {
var amount = parseFloat(payload.amount) || 0;
var side = String(payload.side).trim().toUpperCase();
if (amount < MIN_BET || amount > MAX_BET) return { success: false, message: "Bet limit: ₹" + MIN_BET + " to ₹" + MAX_BET };
var roundSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Rounds");
var roundData = roundSheet.getDataRange().getValues();
var isRoundActive = false, roundTimestamp = 0;
for (var i = roundData.length - 1; i > 0; i--) {
if (String(roundData[i][0]) === payload.roundId && String(roundData[i][2]) === "Active") {
isRoundActive = true;
roundTimestamp = parseFloat(roundData[i][1]);
break;
}
}
if (!isRoundActive) return { success: false, message: "Round closed!" };
if (new Date().getTime() - roundTimestamp > 25000) return { success: false, message: "Betting time over! Coin is spinning." };
var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var userData = userSheet.getDataRange().getValues();
for (var j = 1; j < userData.length; j++) {
if (String(userData[j][2]) === String(payload.phone)) {
var balance = parseFloat(userData[j][4]) || 0;
if (balance < amount) return { success: false, message: "Insufficient Balance!" };
userSheet.getRange(j + 1, 5).setValue(balance - amount);
var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Bets");
var betId = "TBET-" + Utilities.getUuid().split('-')[0];
betSheet.appendRow([betId, payload.roundId, payload.phone, side, amount, "Pending", 0]);
return { success: true, message: "Bet Placed on " + side };
}
}
return { success: false, message: "User error." };
} finally { lock.releaseLock(); }
}
function handleTossResolve(payload) {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return { success: false, message: "System busy. Try again." };
try {
var roundSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Rounds");
var roundData = roundSheet.getDataRange().getValues();
var roundRow = -1;
for (var i = roundData.length - 1; i > 0; i--) {
if (String(roundData[i][0]) === payload.roundId) {
if (String(roundData[i][2]) === "Completed") return { success: true, message: "Round already resolved." };
roundRow = i + 1;
break;
}
}
if (roundRow === -1) throw new Error("Round not found!");
var betSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Toss_Bets");
var betData = betSheet.getDataRange().getValues();
var totalHeadAmount = 0, totalTailAmount = 0;
for (var b = 1; b < betData.length; b++) {
if (String(betData[b][1]) === payload.roundId && String(betData[b][5]) === "Pending") {
var betSide = String(betData[b][3]).toUpperCase();
var betAmt = parseFloat(betData[b][4]) || 0;
if (betSide === "HEAD") totalHeadAmount += betAmt;
else if (betSide === "TAIL") totalTailAmount += betAmt;
}
}
var result = (totalHeadAmount > totalTailAmount) ? "TAIL" : (totalTailAmount > totalHeadAmount) ? "HEAD" : (Math.random() > 0.5 ? "HEAD" : "TAIL");
var totalPool = totalHeadAmount + totalTailAmount;
var totalPayout = 0;
var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var userData = userSheet.getDataRange().getValues();
var userPhoneMap = {};
for (var u = 1; u < userData.length; u++) {
userPhoneMap[String(userData[u][2])] = { row: u + 1, balance: parseFloat(userData[u][4]) || 0 };
}
for (var k = 1; k < betData.length; k++) {
if (String(betData[k][1]) === payload.roundId && String(betData[k][5]) === "Pending") {
var userPhone = String(betData[k][2]);
var userSide = String(betData[k][3]).toUpperCase();
var userAmt = parseFloat(betData[k][4]) || 0;
if (userSide === result) {
var winnings = userAmt * 1.9;
totalPayout += winnings;
betSheet.getRange(k + 1, 6).setValue("Won");
betSheet.getRange(k + 1, 7).setValue(winnings);
if (userPhoneMap[userPhone]) {
userPhoneMap[userPhone].balance += winnings;
userSheet.getRange(userPhoneMap[userPhone].row, 5).setValue(userPhoneMap[userPhone].balance);
}
} else {
betSheet.getRange(k + 1, 6).setValue("Lost");
betSheet.getRange(k + 1, 7).setValue(0);
}
}
}
roundSheet.getRange(roundRow, 3).setValue("Completed");
roundSheet.getRange(roundRow, 4).setValue(result);
var adminProfit = totalPool - totalPayout;
var profitSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Admin_Profit");
if(profitSheet && totalPool > 0) {
profitSheet.appendRow([payload.roundId, totalPool, adminProfit, totalPayout, new Date()]);
}
return { success: true, result: result };
} finally { lock.releaseLock(); }
}
// ====================================================
// 5. AUTO-WALLET APPROVAL TRIGGER
// ====================================================
function onEdit(e) {
var range = e.range;
var sheet = range.getSheet();
if (sheet.getName() === "Transactions" && range.getColumn() === 6) {
var row = range.getRow();
if (row == 1) return;
var status = range.getValue();
var prevStatus = e.oldValue;
var phone = sheet.getRange(row, 3).getValue();
var type = sheet.getRange(row, 4).getValue();
var amount = parseFloat(sheet.getRange(row, 5).getValue()) || 0;
if (status === "Approved" && prevStatus !== "Approved" && type === "Deposit") {
updateUserBalance(phone, amount);
}
else if (status === "Rejected" && prevStatus !== "Rejected" && type === "Withdrawal") {
updateUserBalance(phone, amount);
}
}
}
function updateUserBalance(phone, amountToAdd) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Users");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (String(data[i][2]) === String(phone)) {
var bal = parseFloat(data[i][4]) || 0;
sheet.getRange(i + 1, 5).setValue(bal + amountToAdd); break;
}
}
}
// ====================================================
// 6. BACKGROUND CRON JOBS (Set in Triggers)
// ====================================================
function autoCleanupTossData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var cutoff = new Date().getTime() - (6 * 60 * 60 * 1000);
var roundSheet = ss.getSheetByName("Toss_Rounds");
if (roundSheet) {
var rData = roundSheet.getDataRange().getValues();
for (var i = rData.length - 1; i > 0; i--) {
if (String(rData[i][2]) === "Completed" && (parseFloat(rData[i][1]) || 0) < cutoff) roundSheet.deleteRow(i + 1);
}
}
var betSheet = ss.getSheetByName("Toss_Bets");
if (betSheet) {
var bData = betSheet.getDataRange().getValues();
for (var j = bData.length - 1; j > 0; j--) {
var rId = String(bData[j][1]);
if (rId.indexOf("TOSS-") === 0 && (parseFloat(rId.replace("TOSS-", "")) || 0) < cutoff) betSheet.deleteRow(j + 1);
}
}
}
function userLifecycleManagement() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var usersSheet = ss.getSheetByName("Users");
var inactiveSheet = ss.getSheetByName("Inactive_Users");
var archiveSheet = ss.getSheetByName("Archive_Users");
if(!usersSheet || !inactiveSheet || !archiveSheet) return;
var now = new Date().getTime();
var msPerDay = 24 * 60 * 60 * 1000;
var aData = archiveSheet.getDataRange().getValues();
for (var k = aData.length - 1; k > 0; k--) {
var aDate = new Date(aData[k][5]).getTime();
if ((now - aDate) > (90 * msPerDay)) archiveSheet.deleteRow(k + 1);
}
var iData = inactiveSheet.getDataRange().getValues();
for (var j = iData.length - 1; j > 0; j--) {
var iDate = new Date(iData[j][5]).getTime();
if ((now - iDate) > (60 * msPerDay)) {
var row = iData[j];
row[6] = "Archived";
archiveSheet.appendRow(row);
inactiveSheet.deleteRow(j + 1);
}
}
var uData = usersSheet.getDataRange().getValues();
for (var i = uData.length - 1; i > 0; i--) {
var uDate = new Date(uData[i][5]).getTime();
if ((now - uDate) > (30 * msPerDay)) {
var uRow = uData[i];
uRow[6] = "Inactive";
inactiveSheet.appendRow(uRow);
usersSheet.deleteRow(i + 1);
}
}
}