// NOTE: @OnlyCurrentDoc tag hataya gaya hai taaki doosri sheets update ho sakein. function testRun() { // Deployment se pehle ek baar is function ko 'Run' karna zaroori hai // Taaki Google baaki sheets ko edit karne ki permission maang sake. var ss = SpreadsheetApp.getActiveSpreadsheet(); Logger.log("All Permissions Granted for Master Console!"); } function doGet(e) { // ========================================== // 1. LIVE STATUS UPDATE LOGIC (Action Router) // ========================================== if (e && e.parameter && e.parameter.action === 'updateStatus') { return handleStatusUpdate(e.parameter.module, e.parameter.id, e.parameter.status); } // ========================================== // 2. DATA FETCHING LOGIC (For Dashboard Load) // ========================================== var masterSS = SpreadsheetApp.getActiveSpreadsheet(); function getChannelOperations() { var sheet = masterSS.getSheetByName("Operations"); if (!sheet) return []; var data = sheet.getDataRange().getDisplayValues(); var result = []; for (var i = 1; i < data.length; i++) { result.push({ date: data[i][0] || "", sellerWa: data[i][1] || "", status: data[i][3] || "PENDING", channelId: data[i][4] || "", purchasePrice: data[i][23] || 0, // Col X (23) soldDate: data[i][24] || "" // Col Y (24) }); } return result; } function getChannelFinance() { var sheet = masterSS.getSheetByName("Finance"); if (!sheet) return []; var data = sheet.getDataRange().getDisplayValues(); var result = []; for (var i = 1; i < data.length; i++) { result.push({ date: data[i][0] || "", channelId: data[i][1] || "General", category: data[i][2] || "", type: data[i][3] || "", amountIn: data[i][4] || 0, amountOut: data[i][5] || 0, remarks: data[i][6] || "" }); } return result; } function getEscrowChannels() { var sheet = masterSS.getSheetByName("PTSDeals"); if (!sheet) return []; var data = sheet.getDataRange().getDisplayValues(); var result = []; for (var i = 1; i < data.length; i++) { result.push({ date: data[i][0] || "", channelName: data[i][2] || "", wa: data[i][3] || "", fee: data[i][11] || 0, utr: data[i][12] || "", status: data[i][13] || "PENDING" }); } return result; } function getEscrowItems() { var sheet = masterSS.getSheetByName("PTSitems"); if (!sheet) return []; var data = sheet.getDataRange().getDisplayValues(); var result = []; for (var i = 1; i < data.length; i++) { result.push({ date: data[i][0] || "", itemName: data[i][2] || "", wa: data[i][8] || "", fee: data[i][9] || 0, utr: data[i][10] || "", status: data[i][11] || "PENDING" }); } return result; } function getSikkaTxns() { var sheet = masterSS.getSheetByName("Sikka Transactions"); if (!sheet) return []; var data = sheet.getDataRange().getDisplayValues(); var result = []; for (var i = 1; i < data.length; i++) { var reqType = data[i][3] ? data[i][3].toString().toUpperCase() : ""; var waPhone = data[i][2] || ""; var utrData = data[i][6] || ""; // Agar Withdrawal hai toh mobile number, warna Deposit hai toh UTR var utrOrNumFinal = reqType.includes("WITHDRAW") ? waPhone : utrData; result.push({ date: data[i][1] || "", phone: waPhone, reqType: data[i][3] || "", amount: data[i][4] || 0, status: data[i][5] || "PENDING", utrOrNum: utrOrNumFinal }); } return result; } function getSikkaProfit() { var sheet = masterSS.getSheetByName("Admin_Profit"); if (!sheet) return []; var data = sheet.getDataRange().getDisplayValues(); var result = []; for (var i = 1; i < data.length; i++) { result.push({ date: data[i][4] || "", // Col E profit: data[i][2] || 0 // Col C }); } return result; } // Final Master Payload var payload = { channelDeals: { operations: getChannelOperations(), finance: getChannelFinance() }, escrow: { channels: getEscrowChannels(), items: getEscrowItems() }, sikka: { transactions: getSikkaTxns(), profit: getSikkaProfit() } }; return ContentService.createTextOutput(JSON.stringify(payload)).setMimeType(ContentService.MimeType.JSON); } // ========================================= // SOURCE SHEET UPDATE ENGINE (Live Edits) // ========================================== function handleStatusUpdate(module, targetId, newStatus) { try { var ssId, tabName, statusColIndex; // Routing Logic if (module === 'cd') { ssId = '1zLtoIoTeWDYUY8RXSCESpPuSYf6jNkpGw_HRAKOMzJo'; tabName = 'New Channels'; statusColIndex = 4; // Col D (1-based index) } else if (module === 'ptsc') { ssId = '1e9Wxh3cps3Bgw-9zCzZ7uA88gcLRK5YYlNs7t1-NoYg'; tabName = 'PTSDeals'; statusColIndex = 14; // Col N (1-based index) } else if (module === 'ptsi') { ssId = '1e9Wxh3cps3Bgw-9zCzZ7uA88gcLRK5YYlNs7t1-NoYg'; tabName = 'PTSitems'; statusColIndex = 12; // Col L (1-based index) } else if (module === 'sikka') { ssId = '1jx9_P3lr54pVZ0XMCUki2b82w6Ltgb4v5rT6zhNZM8s'; tabName = 'Transactions'; statusColIndex = 6; // Col F (1-based index) } var sourceSheet = SpreadsheetApp.openById(ssId).getSheetByName(tabName); var data = sourceSheet.getDataRange().getValues(); var rowIndex = -1; // Searching for the Exact Row in Original Sheet for (var i = 1; i < data.length; i++) { // Safe Data Fetching var colC = data[i].length > 2 ? data[i][2].toString() : ""; var colE = data[i].length > 4 ? data[i][4].toString() : ""; var colG = data[i].length > 6 ? data[i][6].toString() : ""; var colK = data[i].length > 10 ? data[i][10].toString() : ""; var colM = data[i].length > 12 ? data[i][12].toString() : ""; if (module === 'sikka') { if ((colG && colG === targetId) || (colC && colC === targetId)) { rowIndex = i + 1; break; } } else if (module === 'cd') { if (colE && colE === targetId) { rowIndex = i + 1; break; } } else if (module === 'ptsc') { if ((colM && colM === targetId) || (colC && colC === targetId)) { rowIndex = i + 1; break; } } else if (module === 'ptsi') { if ((colK && colK === targetId) || (colC && colC === targetId)) { rowIndex = i + 1; break; } } } if (rowIndex !== -1) { // Update Status in Original Sheet sourceSheet.getRange(rowIndex, statusColIndex).setValue(newStatus); // Bonus: Add "Sold Date" if Channel is marked "SOLD OUT" if (module === 'cd' && newStatus.toString().toUpperCase() === "SOLD OUT") { var today = new Date(); var formattedDate = ('0' + today.getDate()).slice(-2) + '/' + ('0' + (today.getMonth()+1)).slice(-2) + '/' + today.getFullYear(); sourceSheet.getRange(rowIndex, 25).setValue(formattedDate); // Col Y } return ContentService.createTextOutput(JSON.stringify({success: true})).setMimeType(ContentService.MimeType.JSON); } else { return ContentService.createTextOutput(JSON.stringify({success: false, error: "ID not found in Source Sheet"})).setMimeType(ContentService.MimeType.JSON); } } catch(e) { return ContentService.createTextOutput(JSON.stringify({success: false, error: e.message})).setMimeType(ContentService.MimeType.JSON); } }