Spaces:
Running
Running
| const { google } = require('googleapis'); | |
| const path = require('path'); | |
| const fs = require('fs'); | |
| const SHEET_ID = process.env.GOOGLE_SHEET_ID; | |
| const SHEET_NAME = 'Orders'; // The tab name in your Google Sheet | |
| // Path to the service account credentials JSON file | |
| const CREDENTIALS_PATH = path.join(__dirname, '../config/samoulla-490417-daa7176c0091.json'); | |
| const getAuth = () => { | |
| // Option 1: Load from environment variable (useful for production like Vercel/Heroku) | |
| if (process.env.GOOGLE_SERVICE_ACCOUNT_JSON) { | |
| try { | |
| const credentials = JSON.parse(process.env.GOOGLE_SERVICE_ACCOUNT_JSON); | |
| return new google.auth.GoogleAuth({ | |
| credentials, | |
| scopes: ['https://www.googleapis.com/auth/spreadsheets'], | |
| }); | |
| } catch (err) { | |
| console.error('❌ Failed to parse GOOGLE_SERVICE_ACCOUNT_JSON:', err.message); | |
| } | |
| } | |
| // Option 2: Load from file | |
| if (fs.existsSync(CREDENTIALS_PATH)) { | |
| return new google.auth.GoogleAuth({ | |
| keyFile: CREDENTIALS_PATH, | |
| scopes: ['https://www.googleapis.com/auth/spreadsheets'], | |
| }); | |
| } | |
| throw new Error(`Google credentials not found (JSON file missing at ${CREDENTIALS_PATH} and no GOOGLE_SERVICE_ACCOUNT_JSON env var)`); | |
| }; | |
| /** | |
| * Appends a new order row to the Google Sheet. | |
| * Called after a successful order creation — fails silently so it never blocks the user. | |
| */ | |
| const appendOrderToSheet = async (order) => { | |
| if (!SHEET_ID) { | |
| console.warn('⚠️ GOOGLE_SHEET_ID not set in env — skipping Google Sheets sync'); | |
| return; | |
| } | |
| try { | |
| const auth = await getAuth(); | |
| const sheets = google.sheets({ version: 'v4', auth }); | |
| const createdAt = order.createdAt | |
| ? new Date(order.createdAt).toLocaleString('ar-EG', { timeZone: 'Africa/Cairo' }) | |
| : new Date().toLocaleString('ar-EG', { timeZone: 'Africa/Cairo' }); | |
| const row = [ | |
| order.orderNumber || '', // A: رقم الطلب | |
| order.name || '', // B: الاسم | |
| order.mobile || '', // C: الهاتف | |
| order.address?.governorate || '', // D: المحافظة | |
| order.address?.city || '', // E: المدينة | |
| order.address?.district || '', // F: المنطقة | |
| order.address?.street || '', // G: الشارع | |
| order.totalPrice || 0, // H: الإجمالي | |
| order.shippingPrice || 0, // I: الشحن | |
| order.payment?.method || '', // J: طريقة الدفع | |
| order.payment?.status || '', // K: حالة الدفع | |
| order.orderStatus || 'created', // L: حالة الطلب | |
| order.source || 'direct', // M: المصدر | |
| order.promoCode || '', // N: كود الخصم | |
| order.discountAmount || 0, // O: قيمة الخصم | |
| order.items?.length || 0, // P: عدد المنتجات | |
| order.items?.map(i => `${i.name} (${i.quantity})`).join(' | ') || '', // Q: المنتجات | |
| createdAt, // R: التاريخ | |
| ]; | |
| await sheets.spreadsheets.values.append({ | |
| spreadsheetId: SHEET_ID, | |
| range: `${SHEET_NAME}!A:R`, | |
| valueInputOption: 'USER_ENTERED', | |
| insertDataOption: 'INSERT_ROWS', | |
| resource: { values: [row] }, | |
| }); | |
| console.log(`✅ Order syncing: Success for #${order.orderNumber}`); | |
| } catch (error) { | |
| console.error(`❌ Google Sheets sync FAILED for order #${order.orderNumber || 'unknown'}:`, error.message); | |
| } | |
| }; | |
| module.exports = { appendOrderToSheet }; | |