> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# طاحونة الهواء

> قم بتشغيل سير العمل والبرامج النصية لطاحونة الهواء بناءً على أحداث مدفوعات دودو لأتمتة مخصصة.

## المقدمة

نفذ سير العمل والبرامج النصية المخصصة في طاحونة الهواء عند حدوث أحداث الدفع. قم بتشغيل عمليات قاعدة البيانات، إرسال الإشعارات، معالجة البيانات، وأتمتة منطق الأعمال المعقد باستخدام محرك سير العمل القوي في طاحونة الهواء.

<Info>
  تتطلب هذه التكامل عنوان URL الخاص بويب هوك Windmill من تكوين سير العمل الخاص بك.
</Info>

## البدء

<Steps>
  <Step title="Open the Webhook Section">
    في لوحة معلومات Dodo Payments الخاصة بك، انتقل إلى <b>Webhooks → + إضافة نقطة نهاية</b> وقم بتوسيع القائمة المنسدلة للتكاملات.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/slbAEdrLLwKHfaRf/images/integrations/windmill.png?fit=max&auto=format&n=slbAEdrLLwKHfaRf&q=85&s=695fe639c086c3d899efae177d646591" alt="إضافة نقطة نهاية وقائمة التكاملات المنسدلة" style={{ maxHeight: '500px', width: 'auto' }} width="1678" height="954" data-path="images/integrations/windmill.png" />
    </Frame>
  </Step>

  <Step title="Select Windmill">
    اختر بطاقة التكامل <b>Windmill</b>.
  </Step>

  <Step title="Create Windmill Workflow">
    في Windmill، أنشئ سير عمل جديد ونسخ عنوان URL الخاص بويب هوك من تكوين المشغل.
  </Step>

  <Step title="Paste Webhook URL">
    الصق عنوان URL الخاص بويب هوك Windmill في تكوين نقطة النهاية.
  </Step>

  <Step title="Configure Transformation">
    حرر شفرة التحويل لتنسيق الأحداث لسير عمل Windmill الخاص بك.
  </Step>

  <Step title="Test & Create">
    اختبر باستخدام حمولات نموذجية وانقر على <b>Create</b> لتنشيط التكامل.
  </Step>

  <Step title="Done!">
    🎉 ستؤدي أحداث الدفع الآن إلى تشغيل سير عمل Windmill الخاص بك تلقائيًا.
  </Step>
</Steps>

## أمثلة على كود التحويل

### حمولة سير العمل الأساسية

```javascript basic_workflow.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType === "payment.succeeded") {
    const p = webhook.payload.data;
    webhook.payload = {
      event_type: webhook.eventType,
      payment_id: p.payment_id,
      amount: (p.total_amount / 100).toFixed(2),
      currency: p.currency || "USD",
      customer_email: p.customer.email,
      customer_name: p.customer.name,
      payment_method: p.payment_method || "unknown",
      timestamp: webhook.payload.timestamp,
      metadata: {
        business_id: p.business_id,
        product_id: p.product_id
      }
    };
  }
  return webhook;
}
```

### معالج سير عمل الاشتراك

```javascript subscription_workflow.js icon="js" expandable theme={null}
function handler(webhook) {
  const s = webhook.payload.data;
  switch (webhook.eventType) {
    case "subscription.active":
      webhook.payload = {
        event_type: "subscription_started",
        subscription_id: s.subscription_id,
        customer_email: s.customer.email,
        customer_name: s.customer.name,
        product_id: s.product_id,
        amount: (s.recurring_pre_tax_amount / 100).toFixed(2),
        frequency: s.payment_frequency_interval,
        next_billing: s.next_billing_date,
        customer_id: s.customer.customer_id,
        timestamp: webhook.payload.timestamp
      };
      break;
    case "subscription.cancelled":
      webhook.payload = {
        event_type: "subscription_cancelled",
        subscription_id: s.subscription_id,
        customer_email: s.customer.email,
        cancelled_at: s.cancelled_at,
        cancel_at_next_billing: s.cancel_at_next_billing_date,
        customer_id: s.customer.customer_id,
        timestamp: webhook.payload.timestamp
      };
      break;
  }
  return webhook;
}
```

### معالج سير عمل النزاع

```javascript dispute_workflow.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType.startsWith("dispute.")) {
    const d = webhook.payload.data;
    webhook.payload = {
      event_type: webhook.eventType,
      dispute_id: d.dispute_id,
      payment_id: d.payment_id,
      amount: (d.amount / 100).toFixed(2),
      status: d.dispute_status,
      stage: d.dispute_stage,
      remarks: d.remarks || "",
      urgent: webhook.eventType === "dispute.opened",
      business_id: d.business_id,
      timestamp: webhook.payload.timestamp
    };
  }
  return webhook;
}
```

## حالات استخدام طاحونة الهواء الشائعة

<AccordionGroup>
  <Accordion title="Database Operations">
    * تحديث سجلات العملاء في PostgreSQL/MySQL
    * تسجيل أحداث الدفع إلى مخازن البيانات
    * مزامنة البيانات مع الأنظمة الخارجية
    * تحديث مستويات المخزون
    * تتبع مقاييس التحليلات
  </Accordion>

  <Accordion title="Business Logic">
    * حساب مقاييس الإيرادات
    * معالجة المردودات والتعديلات
    * التعامل مع دورة حياة الاشتراك
    * إنشاء التقارير والتصديرات
    * التحقق من صحة بيانات الدفع
  </Accordion>

  <Accordion title="External Integrations">
    * إرسال البيانات إلى منصات التحليلات
    * تحديث أنظمة إدارة علاقات العملاء
    * تشغيل حملات البريد الإلكتروني
    * إنشاء أحداث في التقويم
    * إرسال إشعارات SMS
  </Accordion>
</AccordionGroup>

## نصائح

* هيكل بيانات الحمولة لسهولة معالجة سير العمل
* تضمين جميع البيانات الوصفية ذات الصلة لمنطق الأعمال
* استخدام أسماء حقول متسقة عبر الأحداث
* تضمين الطوابع الزمنية لتوقيت سير العمل
* الاستفادة من معالجة الأخطاء المدمجة في طاحونة الهواء

## استكشاف الأخطاء وإصلاحها

<AccordionGroup>
  <Accordion title="Workflows not triggering">
    * التأكد من صحة عنوان URL للويب هوك ونشاطه
    * التحقق من نشر سير عمل Windmill ونشاطه
    * التأكد من تطابق هيكل الحمولة مع توقعات سير العمل
    * مراجعة سجلات تنفيذ Windmill للأخطاء
  </Accordion>

  <Accordion title="Data processing issues">
    * التحقق من تعيين معلمات إدخال سير العمل
    * التأكد من تطابق أنواع البيانات مع التنسيقات المتوقعة
    * اختبار سير العمل ببيانات نموذجية
    * مراجعة سجلات تنفيذ نصوص Windmill
  </Accordion>
</AccordionGroup>
