ربط "سلة" أو "زد" بأنظمة المحاسبة آلياً.


ربط "سلة" أو "زد" بأنظمة المحاسبة آلياً.

يا هلا ومرحباً بالجميع! اليوم بنتكلم عن موضوع مهم جداً لأي تاجر أو مطور شغال على منصات التجارة الإلكترونية زي سلة وزد. كيف نربطها بأنظمة المحاسبة حقتنا بشكل آلي؟ الموضوع مو بس يوفر وقت، يقلل الأخطاء ويخليك مركز على البيزنس الأساسي.

ليش أصلاً نربط آلياً؟

شوف، لو عندك طلبات كثيرة يومياً، بتضيع وقت طويل وأنت تنقل البيانات يدوياً من سلة أو زد لنظام المحاسبة (فاتورة فاتورة، منتج منتج). هذا غير الأخطاء اللي ممكن تصير. الربط الآلي يحل هالمشكلة بالكامل:

  • توفير الوقت والجهد: خلاص، انسخ لصق انتهى.
  • دقة البيانات: الأخطاء البشرية تقل بشكل كبير.
  • تحديث فوري: تشوف وضعك المالي أول بأول.
  • تركيز على النمو: بدال ما تضيع وقتك في أعمال روتينية، ركز على تطوير متجرك.

كيف سلة وزد يعطوني البيانات؟ (الـ APIs والـ Webhooks)

الأساس في الربط الآلي هو الـ APIs (Application Programming Interfaces) والـ Webhooks. باختصار:

  • APIs: زي ما تقول "قناة اتصال" بين نظامك وسلة/زد. نظامك يطلب بيانات محددة (مثلاً: "جيب لي كل الطلبات الجديدة") وسلة/زد ترجع له البيانات هذي.
  • Webhooks: هذي "إشعارات فورية". لما يصير حدث معين في سلة/زد (مثلاً: "جاني طلب جديد"، "تم تحديث حالة طلب")، سلة/زد ترسل إشعار لنظامك مباشرةً بالحدث هذا مع تفاصيله. هذي ممتازة للعمليات اللي تحتاج تحديث فوري.

ملاحظة مهمة: الـ APIs تحتاج منك "تستدعيها" عشان تجيب البيانات. الـ Webhooks هي اللي "تستدعيك" لما يصير شي. الاثنين مكملين لبعض.

ربط سلة بأنظمة المحاسبة (مثال)

سلة توفر API قوي جداً يسمح لك تسوي كل شي تقريباً. عشان تبدأ، لازم تسوي تطبيق في حسابك بسلة وتاخذ الـ Client ID والـ Client Secret. بعدين، بتستخدم بروتوكول OAuth 2.0 عشان تحصل على Access Token اللي بيسمح لك بالوصول للبيانات.

الخطوات الأساسية بتكون كالتالي:

  1. التصريح (Authorization): تحصل على Access Token من سلة.
  2. جلب الطلبات (Fetch Orders): تستخدم الـ API لجلب الطلبات الجديدة أو اللي تغيرت حالتها.

    مثلاً، هذا endpoint لجلب الطلبات:

    GET https://api.salla.dev/admin/v2/orders

  3. تحويل البيانات (Data Transformation): بيانات الطلب من سلة ممكن ما تكون بنفس التنسيق اللي يحتاجه نظام المحاسبة حقك. هنا تحتاج تسوي "mapping" للبيانات.
  4. إرسال البيانات لنظام المحاسبة: تستخدم الـ API الخاص بنظام المحاسبة (سواء كان قيود، دفترة، سمارت فلو، أو نظامك الخاص) عشان تنشئ فاتورة، تسجل دفعة، وتضيف منتجات وعملاء لو ما كانوا موجودين.

مثال كود (جلب طلب من سلة وإنشاء فاتورة)

هذا مجرد مثال توضيحي بـ pseudocode عشان تفهم الفكرة. بافتراض إن عندك access_token جاهز، وعندك API لنظام المحاسبة حقك.

// Pseudocode for fetching orders from Salla and creating an invoice in an accounting system

function syncSallaOrdersToAccountingSystem() {
    // 1. Fetch new orders from Salla
    // You'd typically store the last synced order ID or timestamp
    // to avoid fetching old orders repeatedly.
    const sallaOrders = fetchFromSallaAPI('GET /admin/v2/orders?status=completed&after_date=...');

    sallaOrders.forEach(order => {
        // Check if this order is already synced
        if (isOrderSynced(order.id)) {
            return; // Skip already synced orders
        }

        // 2. Transform Salla order data to accounting system invoice data
        const invoiceData = {
            customer_name: order.customer.name,
            customer_email: order.customer.email,
            invoice_date: order.created_at,
            due_date: calculateDueDate(order.created_at),
            total_amount: order.total.amount,
            currency: order.total.currency,
            items: order.items.map(item => ({
                product_id: mapSallaProductToAccountingProduct(item.product.id), // Important: map product IDs
                description: item.product.name,
                quantity: item.quantity,
                unit_price: item.price.amount,
                total: item.total.amount
            })),
            payment_status: mapSallaPaymentStatusToAccounting(order.payment_status),
            payment_method: mapSallaPaymentMethodToAccounting(order.payment_method.name),
            salla_order_id: order.id // Store Salla order ID for reference and duplicate prevention
        };

        // 3. Create invoice in accounting system
        try {
            const accountingInvoice = createInvoiceInAccountingSystem(invoiceData);
            markOrderAsSynced(order.id, accountingInvoice.id); // Store mapping for future reference
            console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">Invoice created for Salla Order ${order.id}: ${accountingInvoice.id}</code>);
        } catch (error) {
            console.error(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">Failed to create invoice for Salla Order ${order.id}:</code>, error);
            // Implement retry logic or error logging
        }
    });
}

// Helper functions (placeholders)
function fetchFromSallaAPI(endpoint) {
    // Make HTTP request to Salla API with access_token
    // Example: fetch(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">https://api.salla.dev${endpoint}</code>, { headers: { 'Authorization': <code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">Bearer ${ACCESS_TOKEN}</code> } })
    return []; // Return parsed JSON data
}

function createInvoiceInAccountingSystem(invoiceData) {
    // Make HTTP POST request to accounting system API
    // Example: fetch(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">https://your-accounting-system.com/api/invoices</code>, { method: 'POST', body: JSON.stringify(invoiceData) })
    return { id: 'ACC-INV-123' }; // Return created invoice ID
}

function isOrderSynced(sallaOrderId) {
    // Check your local database if this Salla order ID is already synced
    return false;
}

function markOrderAsSynced(sallaOrderId, accountingInvoiceId) {
    // Store sallaOrderId and accountingInvoiceId in your local database
}

function mapSallaProductToAccountingProduct(sallaProductId) {
    // Lookup or create product in accounting system based on Salla product ID/SKU
    return <code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">ACC-PROD-${sallaProductId}</code>; // Placeholder
}

function mapSallaPaymentStatusToAccounting(sallaStatus) {
    // Map Salla payment status (e.g., 'paid', 'pending') to accounting system status
    return sallaStatus === 'paid' ? 'Paid' : 'Unpaid';
}

function mapSallaPaymentMethodToAccounting(sallaMethod) {
    // Map Salla payment methods (e.g., 'mada', 'visa', 'bank_transfer') to accounting system methods
    return sallaMethod.toUpperCase();
}

function calculateDueDate(orderDate) {
    // Logic to calculate due date, e.g., 7 days from order creation
    return new Date(new Date(orderDate).setDate(new Date(orderDate).getDate() + 7)).toISOString();
}

// Call the sync function (e.g., via a cron job or a webhook listener)
syncSallaOrdersToAccountingSystem();

ربط زد بأنظمة المحاسبة (مثال)

زد أيضاً توفر API ممتاز للربط. العملية مشابهة جداً لسلة، لكن بتفاصيل مختلفة في الـ Endpoints وطريقة الـ Authentication (غالباً بتكون عبر API Key أو OAuth أيضاً).

الخطوات الأساسية بتكون:

  1. التصريح (Authentication): تحصل على API Key أو Access Token من لوحة تحكم زد.
  2. جلب الطلبات (Fetch Orders): تستخدم الـ API لجلب الطلبات.

    مثلاً، هذا endpoint لجلب الطلبات في زد:

    GET https://api.zid.sa/v1/orders (هذا مثال، تأكد من التوثيق الرسمي لـ زد)

  3. تحويل البيانات (Data Transformation): نفس الفكرة، تحويل بيانات زد لتناسب نظام المحاسبة.
  4. إرسال البيانات لنظام المحاسبة: استخدام الـ API الخاص بنظام المحاسبة.

نصيحة ذهبية: دائماً ارجع للتوثيق الرسمي لـ Salla API Docs و Zid API Docs. هم المصدر الأكيد لأحدث الـ Endpoints وطرق الـ Authentication.

نقاط مهمة لازم تفكر فيها

  • تحديد وتطابق البيانات (Data Mapping): هذي أهم خطوة. كيف تربط رقم المنتج في سلة/زد برقم المنتج في نظام المحاسبة؟ كيف تربط العميل؟ طريقة الدفع؟ لازم يكون عندك آلية واضحة لهذا الربط، ممكن تكون جدول في قاعدة بياناتك الخاصة.
  • تجنب التكرار (Duplicate Prevention): كيف تضمن إن الطلب الواحد ما يتسجل مرتين في نظام المحاسبة؟ أفضل طريقة هي إنك تسجل ID الطلب من سلة/زد في نظام المحاسبة الخاص بك أو في قاعدة بيانات وسيطة، وقبل ما تسجل أي طلب جديد، تشيك إذا الـ ID هذا موجود مسبقاً.
  • معالجة الأخطاء (Error Handling): وش بيصير لو نظام المحاسبة رجع لك خطأ؟ لازم يكون عندك آلية لتسجيل الأخطاء وإعادة محاولة إرسال البيانات لاحقاً.
  • الجدولة (Scheduling): متى تشغل عملية المزامنة؟ ممكن كل ساعة، كل يوم، أو تستخدم Webhooks للمزامنة الفورية.
  • الأمان (Security): تأكد إنك تتعامل مع الـ Access Tokens والـ API Keys بطريقة آمنة جداً ولا تكشفها في الكود أو الـ Logs.

ربط سلة أو زد بأنظمة المحاسبة آلياً هو استثمار حقيقي بيوفر عليك وقت وجهد كبير على المدى الطويل. الموضوع يحتاج شوية برمجة وتخطيط، لكن النتيجة تستاهل. بالتوفيق!