// 📊 CHARO SHEETS KI ID
const foodSheetId = '1NjqHSgvmcD6Oo7Xd6VUcIRLG-5P57x6WQkoTCveUeqg';
const listSheetId = '1e9Wxh3cps3Bgw-9zCzZ7uA88gcLRK5YYlNs7t1-NoYg';
const clothSheetId = '1LvFnqRaWJPp-FoxSR0iomBjXoP-mDbawnBHj26zx23M';
const ownerAccessSheetId = '15KTshizI8H48SbXJfwu7LPQUAo-qkxMYQ4JTcXn2AVw'; // 🚀 NAYI SERVICE (4th Sheet)
// ==========================================
// 📥 1. DATA FETCHING (GET) - WITH EXACT ROW NUMBERS
// ==========================================
function doGet(e) {
try {
const foodSs = SpreadsheetApp.openById(foodSheetId);
const listSs = SpreadsheetApp.openById(listSheetId);
const clothSs = SpreadsheetApp.openById(clothSheetId);
const ownerSs = SpreadsheetApp.openById(ownerAccessSheetId); // Nayi sheet open ki
// 🚀 O(1) ROW NUMBER ENGINE
const getSafeDataWithRow = (ss, name) => {
const sheet = ss.getSheetByName(name);
if (!sheet) return [];
const data = sheet.getDataRange().getValues();
const result = [];
for(let i=1; i
r[0] && String(r[11]).toLowerCase() !== 'delivered' && String(r[11]).toLowerCase() !== 'cancelled' && String(r[11]).toLowerCase() !== 'refunded')
.map(r => [r[1], r[6], r[11], r[r.length-1]]);
const dData = getSafeDataWithRow(foodSs, "DeliveryPartners");
const drivers = dData.filter(r => r[0]).map(r => [r[1], r[2], r[10], r[12], r[r.length-1]]);
const rData = getSafeDataWithRow(foodSs, "Restaurants");
const restaurants = rData.filter(r => r[0]).map(r => [r[3], r[10], r[r.length-1]]);
// --- 📺 PRE-LISTING & ITEMS DATA (WITH UTR) ---
const dealData = getSafeDataWithRow(listSs, "PTSDeals");
const deals = dealData.filter(r => r[0] && String(r[13]).toLowerCase() === 'pending')
.map(r => [r[2], r[8], r[12], r[13], r[r.length-1]]); // r[12] is Col M (UTR)
const iData = getSafeDataWithRow(listSs, "PTSitems");
const items = iData.filter(r => r[0] && String(r[11]).toLowerCase() === 'pending')
.map(r => [r[2], r[3], r[10], r[11], r[r.length-1]]); // r[10] is Col K (UTR)
// --- 👕 CLOTH DATA ---
const coData = getSafeDataWithRow(clothSs, "Orders_Master");
const clothOrders = coData.filter(r => r[0] && String(r[14]).toLowerCase() !== 'delivered' && String(r[14]).toLowerCase() !== 'cancelled')
.map(r => [r[1], r[8], r[14], r[r.length-1]]);
const cdData = getSafeDataWithRow(clothSs, "DeliveryPartners");
const clothDrivers = cdData.filter(r => r[0]).map(r => [r[1], r[2], r[11], r[8], r[r.length-1]]);
const cvData = getSafeDataWithRow(clothSs, "Vendor_Master");
const clothVendors = cvData.filter(r => r[0]).map(r => [r[2], r[8], r[7], r[r.length-1]]);
// --- 🤝 4. CHANNEL LISTING - AFTER OWNER ACCESS (NEW SERVICE) ---
const ownerData = getSafeDataWithRow(ownerSs, "New Channels");
// Columns: r[0]=Timestamp, r[3]=Status (Col D), r[5]=Name (Col F), r[6]=Subs (Col G)
const ownerAccessDeals = ownerData.filter(r => r[0] && String(r[3]).toLowerCase() === 'pending')
.map(r => [r[5], r[6], r[3], r[r.length-1]]);
// Return mapped data safely
return ContentService.createTextOutput(JSON.stringify({
success: true, type: 'READ', orders, drivers, restaurants, deals, items, clothOrders, clothDrivers, clothVendors, ownerAccessDeals // NAYA DATA ADD KIYA
})).setMimeType(ContentService.MimeType.JSON);
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({success: false, error: err.toString()})).setMimeType(ContentService.MimeType.JSON);
}
}
// ==========================================
// 📤 2. DIRECT ROW UPDATING (POST)
// ==========================================
function doPost(e) {
try {
if (!e || !e.postData || !e.postData.contents) {
return ContentService.createTextOutput(JSON.stringify({success: false, error: "Empty Payload"})).setMimeType(ContentService.MimeType.JSON);
}
const data = JSON.parse(e.postData.contents);
const action = data.action;
const rowNum = Number(data.id);
const newValue = data.newValue;
const channelId = data.extraData; // 🚀 HTML se aayi hui Channel ID (Agar ho toh)
if(!rowNum || rowNum < 2) {
return ContentService.createTextOutput(JSON.stringify({success: false, error: "Invalid Row Number"})).setMimeType(ContentService.MimeType.JSON);
}
const foodSs = SpreadsheetApp.openById(foodSheetId);
const listSs = SpreadsheetApp.openById(listSheetId);
const clothSs = SpreadsheetApp.openById(clothSheetId);
const ownerSs = SpreadsheetApp.openById(ownerAccessSheetId); // Nayi sheet open ki
let sheet, colNum;
// Routing Logic to map actions to target sheet & column
if (action === 'update_order') { sheet = foodSs.getSheetByName("Orders"); colNum = 12; }
else if (action === 'update_driver') { sheet = foodSs.getSheetByName("DeliveryPartners"); colNum = 13; }
else if (action === 'update_restaurant') { sheet = foodSs.getSheetByName("Restaurants"); colNum = 11; }
else if (action === 'update_deal') { sheet = listSs.getSheetByName("PTSDeals"); colNum = 14; }
else if (action === 'update_item') { sheet = listSs.getSheetByName("PTSitems"); colNum = 12; }
else if (action === 'update_cloth_order') { sheet = clothSs.getSheetByName("Orders_Master"); colNum = 15; }
else if (action === 'update_cloth_driver') { sheet = clothSs.getSheetByName("DeliveryPartners"); colNum = 9; }
else if (action === 'update_cloth_vendor') { sheet = clothSs.getSheetByName("Vendor_Master"); colNum = 8; }
// 🚀 ACTION FOR: "After Owner Access" Deals (Status is in Column D -> 4)
else if (action === 'update_owner_access') { sheet = ownerSs.getSheetByName("Channel_Deals_Database"); colNum = 4; }
else { return ContentService.createTextOutput(JSON.stringify({success: false, error: "Unknown Action"})).setMimeType(ContentService.MimeType.JSON); }
if(sheet) {
// Step 1: Normal Status Update karein
sheet.getRange(rowNum, colNum).setValue(newValue);
// 🚀 Step 2: Agar Owner Access approve hua hai aur Channel ID aayi hai, toh Col E me likhein
if (action === 'update_owner_access' && newValue === 'APPROVED' && channelId) {
sheet.getRange(rowNum, 5).setValue(channelId); // Column E = 5
}
SpreadsheetApp.flush();
return ContentService.createTextOutput(JSON.stringify({success: true, type: 'WRITE', log: `Row ${rowNum} updated!`})).setMimeType(ContentService.MimeType.JSON);
} else {
return ContentService.createTextOutput(JSON.stringify({success: false, error: "Sheet tab not found"})).setMimeType(ContentService.MimeType.JSON);
}
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({success: false, error: err.toString()})).setMimeType(ContentService.MimeType.JSON);
}
}