Ana içeriğe atla
Veri ambarınızdaki ürün verileriyle Twenty’yi senkron tutmak için bu kalıbı kullanın (örn. Snowflake, BigQuery, PostgreSQL).

İş Akışı Yapısı

  1. Tetikleyici: Zamanlanmış
  2. Kod: Veri ambarınızı sorgulayın
  3. Kod (isteğe bağlı): Veriyi dizi olarak biçimlendirin
  4. Yineleyici: Her ürün üzerinde döngü kurun
  5. Kaydı Ekle/Güncelle: Twenty’de oluşturun veya güncelleyin

Adım 1: Tetiklemeyi Zamanlayın

İş akışını, veri tazelik gereksinimlerinize uygun bir sıklıkta çalışacak şekilde ayarlayın:
  • Neredeyse gerçek zamanlı eşitleme için her 5 dakikada bir
  • Daha az kritik veriler için saatte bir
  • Toplu güncellemeler için günlük

Adım 2: Veri Ambarınızı Sorgulayın

En son verileri almak için bir Kod eylemi ekleyin:
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 };
};
updated_at >= last X minutes ile filtreleyerek yalnızca yakın zamanda değişen kayıtları alın. Bu, eşitlemeyi verimli tutar.

Adım 3: Verileri Biçimlendirin (İsteğe Bağlı)

Veri ambarınız dönüştürme gerektiren bir biçimde veri döndürüyorsa, başka bir Kod eylemi ekleyin. Yaygın dönüşümler arasında tür dönüştürmeleri, alan yeniden adlandırma ve veri temizleme bulunur.

Örnek: Boolean ve Durum Alanlarına Sahip Kullanıcı Verileri

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),
    })),
  };
};

Örnek: Tür Dönüşümleri Olan Ürün Verileri

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
    }))
  };
};

Örnek: Tarih ve Para Birimi Biçimlendirme

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, " ")
    }))
  };
};

Yaygın Dönüşümler

Kaynak FormatHedef FormatKod
"true" / "false"true / falsev === true || v === "true"
"123.45"123.45parseFloat(value)
"active""ACTIVE"value.toUpperCase()
1704067200 (Unix)ISO tarihinew Date(v * 1000).toISOString()
"$1,234.56"1234.56parseFloat(v.replace(/[^0-9.-]/g, ""))
null / undefined""value || ""

Adım 4: Ürünler Üzerinde Yineleyin

Bir Iterator eylemi ekleyin:
  • Girdi: {{code.products}}
Bu, dizideki her ürün üzerinde döngü kurar.

Adım 5: Her Kaydı Ekle/Güncelleyin

Yineleyici içinde bir Kaydı Ekle/Güncelle eylemi ekleyin:
AyarDeğer
NesneÖzel Ürün nesneniz
Şuna göre eşleştirHarici ID veya SKU (benzersiz tanımlayıcı)
Ad{{iterator.item.name}}
SKU{{iterator.item.sku}}
Fiyat{{iterator.item.price}}
Oluşturma ve güncelleme için ayrı dallar oluşturmak yerine Upsert (güncelle veya oluştur) kullanın. Oluşturmak daha hızlı ve hata ayıklamak daha kolaydır.

Örnek Kullanım Durumları

KaynakVeri
ERP sistemiÜrün kataloğu, fiyatlandırma, envanter
E-ticaret platformuSiparişler, müşteriler, ürün güncellemeleri
Veri ambarıToplanmış metrikler, zenginleştirilmiş veriler
Envanter sistemiStok seviyeleri, yeniden sipariş uyarıları

İlgili