Shared 

/* ============================================================
shared.js — الإعدادات المشتركة بين صفحة العمل وصفحة البيانات
عدّل هنا مرة واحدة، والتعديل هيتطبق في الصفحتين تلقائي
============================================================ */

/* رابط الـ Apps Script Web App — انسخه من Deploy > Manage deployments بعد نشر Code.gs */
const ENDPOINT_URL = “https://script.google.com/macros/s/AKfycbww9dPshtKoP8LrN5V7MVHec1LrfIE__3Pontj914wuo1Nei27oECt_sIqjzkLfLJ9J/exec”;

const ACTION_OPTIONS = [
“تم اعلان في المراجعه ✅”,”تم التزويد”,”ناقص شوف الملاحظات ❌”,”تم التواصل تلفون”,
“تم التأكيد 💰 ✅✅”,”تم مراجعة الناقص”,”شغال فيه عمرو”,”مع محمد خالد”,”موقف قديم وانتهي”,
“مخالف”,”متاجل”,”اعلان مكررر”,”شغال فيه صلاح”,”شغال فيه ملك”,
“تم اعلان تيك توك المعرف فالملاحظات”,”تم التعديله”,”تم اعلان بيدج لايك”,”تم اعلان اتصال”,
“تم اعلان vip”,”تم اعلان انستا”,”تم اعلان ويب سايت”
];
const CASH_OPTIONS = [
“وصل ✅”,”مراجعه 💰”,”موصلش”,”لسا مبعتش الكاش”,”فيها شك مراجعة”,”متبقي اعلان”,”متبقي كاش”,”باقي اعلان”
];
const OPERATOR_OPTIONS = [“الزعيييم”,”ملك”,”صلاح”];

/* لما الأكشن يبقى واحد من دول، الإعلان يعتبر خلص وبيختفي من “قيد العمل” */
const CONFIRMED_ACTIONS = [“تم التأكيد 💰 ✅✅”];

/* دي الحالات اللي لسه محتاجة شغل من الموظف — فاضية أو “تم اعلان في المراجعه” فقط */
const WORK_QUEUE_ACTIONS = [“”, “تم اعلان في المراجعه ✅”];

/* الإعدادات الافتراضية لأول ما “شغل دلوقتي” تفتح — تحميل سريع مع الشيتات الكبيرة */
const DEFAULT_SHEET = ‘new3′;
const DEFAULT_DAYS = 30;

const DEMO_ORDERS = [
{ sheet:’new’, rowId:2, timestamp:new Date(Date.now()-1000*60*30).toISOString(), employee:’مؤمن’, action:”, phone:’201014488507′, cash:”, operator:’الزعيييم’, addedBy:”, postLink:’https://www.facebook.com/ad_center/manage/’, amount:190, days:1, gender:”, governorate:’مصر كلها’, note:”, adType:’شوف المناسب واعلنو’ },
{ sheet:’new’, rowId:3, timestamp:new Date(Date.now()-1000*60*60*5).toISOString(), employee:’يوسف’, action:’تم التأكيد 💰 ✅✅’, phone:’201221526367′, cash:’وصل ✅’, operator:’الزعيييم’, addedBy:’محمد خالد جوده’, postLink:’https://www.facebook.com/share/p/1ESU8gmEJ’, amount:300, days:3, gender:”, governorate:’الشرقية’, note:”, adType:’شوف المناسب واعلنو’ },
{ sheet:’new2′, rowId:3, timestamp:new Date(Date.now()-1000*60*60*26).toISOString(), employee:’مؤمن’, action:’ناقص شوف الملاحظات ❌’, phone:’201229127280′, cash:’وصل ✅’, operator:’الزعيييم’, addedBy:’Mohamed Khaled Afrad’, postLink:’https://www.facebook.com/share/p/1BtcQaoimN’, amount:400, days:2, gender:”, governorate:’السعودي’, note:’محتاج مراجعة تانية’, adType:’شوف المناسب واعلنو’ },
{ sheet:’new3′, rowId:2, timestamp:new Date(Date.now()-1000*60*8).toISOString(), employee:’مصطفى عريس’, action:”, phone:’201098765432′, cash:”, operator:”, addedBy:’تزويد’, postLink:”, amount:250, days:2, gender:’الكل’, governorate:’الجيزة’, note:”, adType:’اعلان انستا’ }
];

function money(n){
const num = Number(n) || 0;
return num.toLocaleString(‘ar-EG’) + ‘ ج.م’;
}

function actionStyle(v){
if(!v) return {c:’#A6ABBA’, bg:’#1E222B’};
if(v.includes(‘✅’) || v.includes(‘💰’) || v.includes(‘تم التزويد’) || v.includes(‘تم التأكيد’)) return {c:’#3FC9AE’, bg:’#132E29′};
if(v.includes(‘❌’) || v.includes(‘مخالف’) || v.includes(‘متاجل’)) return {c:’#E2596B’, bg:’#33191D’};
if(v.includes(‘شغال فيه’) || v.includes(‘مع محمد خالد’)) return {c:’#5B9BE0′, bg:’#182333′};
return {c:’#DDA843′, bg:’#3A311F’};
}
function cashStyle(v){
if(!v) return {c:’#A6ABBA’, bg:’#1E222B’};
if(v.includes(‘وصل’)) return {c:’#3FC9AE’, bg:’#132E29′};
if(v.includes(‘موصلش’) || v.includes(‘شك’)) return {c:’#E2596B’, bg:’#33191D’};
return {c:’#DDA843′, bg:’#3A311F’};
}

function normalizeRow(row){
return {
sheet: row.sheet || ”,
rowId: row.rowId || row.rowid || ”,
timestamp: row.timestamp || new Date().toISOString(),
employee: row.employee || ”,
action: row.action || ”,
phone: String(row.phone || ”),
cash: row.cash || ”,
operator: row.operator || ”,
addedBy: row.addedBy || ”,
postLink: row.postLink || ”,
amount: row.amount || 0,
days: row.days || ”,
gender: row.gender || ”,
governorate: row.governorate || ”,
note: row.note || ”,
adType: row.adType || ”
};
}

/* بيرجع { orders, isDemo, error } */
async function fetchOrders(sheet, days){
if(!ENDPOINT_URL || !ENDPOINT_URL.startsWith(‘http’)){
return { orders: DEMO_ORDERS.map(normalizeRow), isDemo:true, error:null };
}
try{
const params = new URLSearchParams();
if(sheet) params.set(‘sheet’, sheet);
if(days) params.set(‘days’, days);
const url = params.toString() ? (ENDPOINT_URL + ‘?’ + params.toString()) : ENDPOINT_URL;
const res = await fetch(url, { method:’GET’ });
const data = await res.json();
if(data && data.error){ throw new Error(data.message || ‘server error’); }
return { orders: (Array.isArray(data) ? data : []).map(normalizeRow), isDemo:false, error:null };
}catch(err){
return { orders: DEMO_ORDERS.map(normalizeRow), isDemo:true, error: String(err) };
}
}

/* بيرجع { ok, error } */
async function pushUpdate(sheet, rowId, field, value){
if(!ENDPOINT_URL || !ENDPOINT_URL.startsWith(‘http’)){
return { ok:true, offline:true };
}
try{
await fetch(ENDPOINT_URL, {
method: ‘POST’,
mode: ‘no-cors’,
headers: { ‘Content-Type’: ‘text/plain;charset=utf-8′ },
body: JSON.stringify({ action:’update’, sheet, rowId:String(rowId), field, value })
});
return { ok:true };
}catch(err){
return { ok:false, error:String(err) };
}
}