⚙️ أتمتة الطلبات: Google Sheets + بوت تيليجرام

نموذج تجريبي لمتجر خيالي (دار عَبير) — البيانات وهمية لغرض العرض

كيف يشتغل النظام

🛒 طلب جديد في الجدول
←
📄 فاتورة PDF تلقائية (Apps Script)
←
📊 تقرير يومي في ورقة التقارير
←
✉️ ملخص بالإيميل 11 مساءً
←
🤖 استعلام فوري من تيليجرام

هذا نموذج أعمال تجريبي. الكود الكامل: Google Apps Script (JavaScript) لتوليد الفواتير والتقارير والمشغلات الزمنية، وبوت Python (python-telegram-bot v21 + openpyxl).

1) جدول الطلبات مع قائمة «⚙️ الأتمتة»

ملفتعديلعرضالإضافات⚙️ الأتمتة ▾ : توليد الفواتير الجديدة · تحديث التقرير اليومي · تفعيل التشغيل التلقائي
رقم الطلبالتاريخاسم العميلالمدينةالمنتجالكميةسعر الوحدةالحالةالفاتورة
10012026-10-06هيا الزهرانيالرياضعباية الدرعية السوداء1560جديد📄 فاتورة-1001.pdf
10022026-10-06عبدالله الحربيالرياضبخور مروكي فاخر3195قيد التجهيز📄 فاتورة-1002.pdf
10032026-10-06فهد العتيبيالخبرعباية الدرعية السوداء1560جديد📄 فاتورة-1003.pdf
10042026-10-06محمد الغامديجدةبخور مروكي فاخر1195تم الشحن📄 فاتورة-1004.pdf
10052026-10-07خالد المطيريالرياضبخور مروكي فاخر3195جديد📄 فاتورة-1005.pdf
10062026-10-07خالد المطيريالرياضبخور مروكي فاخر3195تم الشحن📄 فاتورة-1006.pdf
10072026-10-07سارة الدوسريالدمامعطر صباح الرياض1330قيد التجهيز📄 فاتورة-1007.pdf
10082026-10-07محمد الغامديالدماممسك الحرير3145تم التوصيل📄 فاتورة-1008.pdf
10092026-10-07نورة القحطانيالدمامدهن عود ملكي3690تم الشحن📄 فاتورة-1009.pdf
10102026-10-07محمد الغامديالرياضدهن عود ملكي1690جديد
10112026-10-08فهد العتيبيجدةدهن عود ملكي3690تم التوصيل
10122026-10-08خالد المطيريالخبردهن عود ملكي2690تم الشحن
10132026-10-08لمى السبيعيأبهامسك الحرير1145تم الشحن
10142026-10-08فهد العتيبيجدةبخور مروكي فاخر1195تم التوصيل

2) فاتورة PDF يولدها السكربت تلقائياً

فاتورة ضريبية مبسطة#1001

دار عَبير — الرقم الضريبي: 300000000000003 (تجريبي)
التاريخ: 2026-10-06
العميل: هيا الزهراني — الرياض

المنتجالكميةالسعرالمجموع
عباية الدرعية السوداء1560560.00
ضريبة القيمة المضافة 15%84.00
الإجمالي644.00 ر.س

3) بوت تيليجرام يرد من ملف الطلبات

الردود التالية ناتجة فعلياً من تشغيل منطق البوت على ملف الطلبات التجريبي.

🤖 بوت طلبات دار عَبير
/today 2026-10-06
📊 ملخص 2026-10-06 عدد الطلبات: 4 الإيرادات: 1,900.00 ر.س
/order 1001
🧾 طلب #1001 العميل: هيا الزهراني (الرياض) المنتج: عباية الدرعية السوداء × 1 الإجمالي: 560.00 ر.س الحالة: جديد
/pending
⏳ طلبات معلّقة: 29 #1001 - هيا الزهراني - جديد #1002 - عبدالله الحربي - قيد التجهيز #1003 - فهد العتيبي - جديد #1004 - محمد الغامدي - تم الشحن #1005 - خالد المطيري - جديد #1006 - خالد المطيري - تم الشحن …
/top
🏆 الأكثر مبيعاً: 1. بخور مروكي فاخر — 26 2. دهن عود ملكي — 20 3. عباية الدرعية السوداء — 13 4. عطر صباح الرياض — 10 5. عطر ليالي نجد — 6

4) الملخص اليومي بالبريد + ورقة التقارير

من: Apps Script
الموضوع: ملخص طلبات دار عَبير اليومي
اليومعدد الطلباتالإيرادات
2026-10-0641,900 ر.س
2026-10-0764,695 ر.س
2026-10-0866,460 ر.س
2026-10-0964,755 ر.س
2026-10-1055,370 ر.س

5) مقتطف من الكود (Code.gs)

/**
 * أتمتة الطلبات في Google Sheets
 * - يولّد فاتورة PDF لكل طلب جديد (عمود "حالة الفاتورة" فارغ)
 * - يبني تقريراً يومياً في ورقة "التقارير"
 * - يرسل ملخصاً يومياً بالبريد
 * الأعمدة المتوقعة في ورقة "الطلبات":
 * رقم الطلب | التاريخ | اسم العميل | الجوال | البريد | المدينة | المنتج | الكمية | سعر الوحدة | الحالة | حالة الفاتورة
 */
const CONFIG = {
  ORDERS_SHEET: 'الطلبات',
  REPORT_SHEET: 'التقارير',
  STORE_NAME: 'دار عَبير',
  VAT_NUMBER: '300000000000003', // رقم ضريبي تجريبي
  VAT_RATE: 0.15,
  SUMMARY_EMAIL: 'owner@example.com', // غيّره لبريدك
  INVOICE_FOLDER_NAME: 'الفواتير',
  SEND_INVOICE_TO_CUSTOMER: false,
};

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⚙️ الأتمتة')
    .addItem('توليد الفواتير الجديدة', 'generateInvoices')
    .addItem('تحديث التقرير اليومي', 'buildDailyReport')
    .addItem('إرسال الملخص اليومي الآن', 'sendDailySummary')
    .addSeparator()
    .addItem('تفعيل التشغيل التلقائي اليومي', 'installTriggers')
    .addToUi();
}

function getOrders_() {
  const sh = SpreadsheetApp.getActive().getSheetByName(CONFIG.ORDERS_SHEET);
  const values = sh.getDataRange().getValues();
  const headers = values.shift();
  const idx = name => headers.indexOf(name);
  return { sh, headers, rows: values, idx };
}

function getFolder_() {
  const it = DriveApp.getFoldersByName(CONFIG.INVOICE_FOLDER_NAME);
  return it.hasNext() ? it.next() : DriveAp…