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

# جلب بيانات المنتج إلى Twenty

> زامِن بيانات كتالوج المنتجات من مستودع بيانات إلى نظام إدارة علاقات العملاء (CRM) لديك وفق جدول زمني.

استخدم هذا النمط للحفاظ على مزامنة Twenty مع بيانات المنتجات من مستودع البيانات لديك (مثل Snowflake وBigQuery وPostgreSQL).

## بنية سير العمل

1. **المحفّز**: وفق جدول زمني
2. **Code**: الاستعلام عن مستودع البيانات لديك
3. **Code** (اختياري): تنسيق البيانات كمصفوفة
4. **Iterator**: التكرار عبر كل منتج
5. **Upsert Record**: أنشئ أو حدّث في Twenty

<img src="https://mintcdn.com/clara-1b8b12e1/sHXKG8rWt8DAIbvx/images/user-guide/workflows/create_users_workflow.png?fit=max&auto=format&n=sHXKG8rWt8DAIbvx&q=85&s=7af72cfbb3206228a84ea9bb88838b0d" style={{width:'100%'}} width="4550" height="7720" data-path="images/user-guide/workflows/create_users_workflow.png" />

## الخطوة 1: جدولة المُحفّز

اضبط سير العمل ليعمل بتواتر يتوافق مع احتياجاتك من حداثة البيانات:

* كل 5 دقائق لمزامنة شبه فورية
* كل ساعة للبيانات الأقل أهمية
* يوميًا للتحديثات الدفعية

## الخطوة 2: الاستعلام عن مستودع البيانات لديك

أضِف إجراء **Code** لجلب البيانات الحديثة:

```javascript theme={null}
export const main = async () => {
  const intervalMinutes = 10; // Match your schedule frequency
  const cutoffTime = new Date(Date.now() - intervalMinutes * 60 * 1000).toISOString();

  // Replace with your actual data warehouse connection
  const response = await fetch("https://your-warehouse-api.com/query", {
    method: "POST",
    headers: {
      "Authorization": "Bearer YOUR_API_KEY",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      query: `
        SELECT id, name, sku, price, stock_quantity, updated_at
        FROM products
        WHERE updated_at >= '${cutoffTime}'
      `
    })
  });

  const data = await response.json();
  return { products: data.results };
};
```

<Tip>
  قم بالتصفية حسب `updated_at >= last X minutes` لاسترجاع السجلات التي تغيّرت حديثًا فقط. هذا يحافظ على كفاءة المزامنة.
</Tip>

## الخطوة 3: تنسيق البيانات (اختياري)

إذا كان مستودعك يُرجع البيانات بتنسيق يحتاج إلى تحويل، فأضف إجراء **Code** آخر. تشمل التحويلات الشائعة تحويل الأنواع، وإعادة تسمية الحقول، وتنظيف البيانات.

### مثال: بيانات المستخدم مع حقول منطقية وحقول الحالة

```javascript theme={null}
export const main = async (params: {
  users: any;
}): Promise<object> => {
  const { users } = params;
  const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;

  // Convert string "true"/"false" to actual booleans
  const toBool = (v: any) => v === true || v === "true";

  return {
    users: usersFormatted.map((user) => ({
      ...user,
      activityStatus: String(user.activityStatus).toUpperCase(),
      isActiveLast30d: toBool(user.isActiveLast30d),
      isActiveLast7d: toBool(user.isActiveLast7d),
      isActiveLast24h: toBool(user.isActiveLast24h),
      isTwenty: toBool(user.isTwenty),
    })),
  };
};
```

### مثال: بيانات المنتج مع تحويلات الأنواع

```javascript theme={null}
export const main = async (params: { products: any }) => {
  const products = typeof params.products === "string"
    ? JSON.parse(params.products)
    : params.products;

  return {
    products: products.map(product => ({
      externalId: product.id,
      name: product.name,
      sku: product.sku,
      price: parseFloat(product.price),        // String → Number
      stockQuantity: parseInt(product.stock_quantity),
      isActive: product.status === "active"    // String → Boolean
    }))
  };
};
```

### مثال: تنسيق التاريخ والعملة

```javascript theme={null}
export const main = async (params: { deals: any }) => {
  const deals = typeof params.deals === "string"
    ? JSON.parse(params.deals)
    : params.deals;

  return {
    deals: deals.map(deal => ({
      ...deal,
      // Convert Unix timestamp to ISO date
      closedAt: deal.closed_timestamp
        ? new Date(deal.closed_timestamp * 1000).toISOString()
        : null,
      // Ensure amount is a number (remove currency symbols)
      amount: parseFloat(String(deal.amount).replace(/[^0-9.-]/g, "")),
      // Normalize stage names
      stage: deal.stage?.toLowerCase().replace(/_/g, " ")
    }))
  };
};
```

### التحويلات الشائعة

| تنسيق المصدر         | تنسيق الهدف      | كود                                      |
| -------------------- | ---------------- | ---------------------------------------- |
| `"true"` / `"false"` | `true` / `false` | `v === true \|\| v === "true"`           |
| `"123.45"`           | `123.45`         | `parseFloat(value)`                      |
| `"active"`           | `"ACTIVE"`       | `value.toUpperCase()`                    |
| `1704067200` (Unix)  | تاريخ ISO        | `new Date(v * 1000).toISOString()`       |
| `"$1,234.56"`        | `1234.56`        | `parseFloat(v.replace(/[^0-9.-]/g, ""))` |
| `null` / `undefined` | `""`             | `value \|\| ""`                          |

## الخطوة 4: التكرار عبر المنتجات

أضِف إجراء **Iterator**:

* المدخل: `{{code.products}}`

يقوم هذا بالتكرار عبر كل منتج في المصفوفة.

## الخطوة 5: إجراء Upsert لكل سجل

داخل المُكرِّر، أضف إجراء **Upsert Record**:

| الإعداد          | القيمة                               |
| ---------------- | ------------------------------------ |
| **الكائن**       | كائن المنتج المخصص لديك              |
| **المطابقة حسب** | المعرّف الخارجي أو SKU (مُعرّف فريد) |
| **الاسم**        | `{{iterator.item.name}}`             |
| **SKU**          | `{{iterator.item.sku}}`              |
| **السعر**        | `{{iterator.item.price}}`            |

<Tip>
  استخدم **Upsert** (تحديث أو إنشاء) بدلًا من إنشاء فروع منفصلة للإنشاء مقابل التحديث. إنه أسرع في الإنشاء وأسهل في استكشاف الأخطاء وإصلاحها.
</Tip>

## أمثلة لحالات الاستخدام

| المصدر                             | بيانات                               |
| ---------------------------------- | ------------------------------------ |
| **نظام تخطيط موارد المؤسسة (ERP)** | كتالوج المنتجات، التسعير، المخزون    |
| **منصة التجارة الإلكترونية**       | الطلبات، العملاء، تحديثات المنتجات   |
| **مستودع البيانات**                | مقاييس مجمّعة، بيانات مُثرَاة        |
| **نظام إدارة المخزون**             | مستويات المخزون، تنبيهات إعادة الطلب |

## ذات صلة

* [مشغلات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-triggers)
* [إجراءات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-actions)
* [التعامل مع المصفوفات في إجراءات Code](/l/ar/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)
