تكامل Odoo
هذا الدليل يرشدك لربط متجرك في دُرج مع Odoo 16+.
المتطلبات
- Odoo 16.0+ (Community أو Enterprise)
- متجر دُرج على خطة مدفوعة
- مفتاح API من لوحة التحكم
- خادم Odoo قابل للوصول العام
الخطوة 1: إنشاء بيانات الاعتماد
- لوحة التحكم ← التكاملات ← أنشئ مفتاح API
- أنشئ نقطة Webhook:
https://your-odoo.com/tajir/webhook - احفظ مفتاح التوقيع
الخطوة 2: ربط البيانات
المنتجات
| دُرج | نموذج Odoo | حقل Odoo |
|---|---|---|
products | product.template | name, list_price, default_code, barcode |
product_variants | product.product | product_tmpl_id, attribute_value_ids |
الطلبات
| دُرج | نموذج Odoo | حقل Odoo |
|---|---|---|
orders | sale.order | partner_id, date_order, state |
order_items | sale.order.line | product_id, product_uom_qty, price_unit |
ربط الحالات: pending→draft, processing→sale, completed→done, cancelled→cancel
الخطوة 3: متحكم Webhook
import hmac, hashlib, jsonfrom odoo import httpfrom odoo.http import request
class TajirWebhookController(http.Controller): @http.route('/tajir/webhook', type='json', auth='none', methods=['POST'], csrf=False) def handle_webhook(self): payload = request.httprequest.get_data() signature = request.httprequest.headers.get('X-Tajir-Signature', '') secret = request.env['ir.config_parameter'].sudo().get_param('tajir.webhook_secret') expected = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest() if not hmac.compare_digest(expected, signature): return {'error': 'Invalid signature'}
data = json.loads(payload) event_type = request.httprequest.headers.get('X-Tajir-Event', '') if event_type == 'order.created': self._create_order(data['data']) return {'status': 'ok'}
def _create_order(self, order_data): Partner = request.env['res.partner'].sudo() phone = order_data.get('customer_phone', '') partner = Partner.search([('phone', '=', phone)], limit=1) if not partner: partner = Partner.create({'name': order_data.get('customer_name', 'عميل'), 'phone': phone}) so = request.env['sale.order'].sudo().create({ 'partner_id': partner.id, 'client_order_ref': order_data['id'][:8].upper(), }) for item in order_data.get('items', []): product = request.env['product.product'].sudo().search( [('default_code', '=', item.get('product_id'))], limit=1) if product: request.env['sale.order.line'].sudo().create({ 'order_id': so.id, 'product_id': product.id, 'product_uom_qty': item['quantity'], 'price_unit': item['unit_price'], }) so.action_confirm()الخطوة 4: المزامنة الأولية
import requests, json
API_URL = 'https://api.durj.ly/api/v1'HEADERS = {'Authorization': 'Bearer tjr_your_token'}
def sync_products(): cursor = None while True: params = {'cursor': cursor} if cursor else {} resp = requests.get(f'{API_URL}/products/export', headers=HEADERS, params=params) if resp.status_code == 429: import time; time.sleep(int(resp.headers.get('Retry-After', 60))); continue for line in resp.text.strip().split('\n'): if line: create_odoo_product(json.loads(line)) cursor = resp.headers.get('X-Next-Cursor') if resp.headers.get('X-Has-More') != 'true': breakاستكشاف الأخطاء
| المشكلة | الحل |
|---|---|
| Webhooks لا تصل | تأكد أن النقطة قابلة للوصول العام |
| فشل التحقق من التوقيع | تحقق من البايتات الخام |
| تجاوز حد الاستخدام | احترم رأس Retry-After |
| طلبات مكررة | استخدم client_order_ref للتحقق |