Ne yapar
Önce Firma adını, o yoksa Kişi adını alır; fırsata bağlı ilk ürünün adını getRelatedRecords ile çeker ve ekler. Ürün ilişkisi alınamazsa hata vermez, yalnız firma/kişi adıyla devam eder. Üretilen ad mevcutla aynıysa kayda dokunmaz; farklıysa, kullanıcının elle yazdığı ad olsa bile her tetiklemede üzerine yazar. Firma, kişi ve ürün adının hiçbiri bulunamazsa mevcut ad olduğu gibi kalır. Elle yazılan adı korumak isterseniz Deals modülüne "Adı elle koru" gibi özel bir onay kutusu alanı ekleyip kurala "bu alan işaretli değilse" koşulunu koyabilirsiniz.
Kurulum mantığı
- 01
Workflow Rules altında modül Deals, tetik On Create ve On Edit (On Edit koşulu: Account_Name ya da Contact_Name değiştiğinde). İlişkili listeye ürün eklemek fırsat alanlarını değiştirmediği için kuralın bu anda çalışmasını beklemeyin. Kayıt oluşturulurken ürün henüz bağlı değilse ad yalnız firma ya da kişi adıyla yazılır; sonradan eklenen ürün, kural bir sonraki çalıştığında (ör. Account_Name ya da Contact_Name değiştiğinde) ada eklenir.
- 02
Eylem Function, argüman
dealId, Deal Id alanına eşlenir. - 03
Ürün ilişkisi, Deals kaydındaki Products ilişkili listesinden okunur; org'unuzda ürünler alt form ya da farklı bir modüldeyse o bölüm uyarlanır.
Alan eşlemesi
Koda yazılan alanlar ve kendi org'unuzda dikkat etmeniz gerekenler.
| Alan | Değer | Not |
|---|---|---|
| Deal_Name | <Firma veya Kişi> - <İlk ürün> | Ayraç kısa tire. |
| Account_Name | okunur | Öncelikli kaynak. |
| Contact_Name | okunur | Firma yoksa. |
| Products (ilişkili) | okunur | Yalnız ilk ürünün Product_Name'i. |
Deluge kodu
Kodu olduğu gibi kopyalayın; değiştirmeniz gereken yerler yukarıdaki tabloda işaretli. İzle düğmesi, fonksiyonu adım adım okutur.
void automation.updateDealNameWithAccountContactAndProduct(String dealId)
{
try
{
info "===== Deal Adı Güncelleme Başladı =====";
info "Deal ID: " + dealId;
if(dealId == null || dealId.trim() == "")
{
info "Deal ID boş.";
return;
}
dealRecord = zoho.crm.getRecordById("Deals",dealId.toLong());
if(dealRecord == null || dealRecord.isEmpty())
{
info "Deal bulunamadı.";
return;
}
accountName = "";
contactName = "";
productName = "";
accountLookup = dealRecord.get("Account_Name");
if(accountLookup != null)
{
if(accountLookup.get("name") != null)
{
accountName = accountLookup.get("name").toString().trim();
}
}
contactLookup = dealRecord.get("Contact_Name");
if(contactLookup != null)
{
if(contactLookup.get("name") != null)
{
contactName = contactLookup.get("name").toString().trim();
}
}
try
{
relatedProducts = zoho.crm.getRelatedRecords("Products","Deals",dealId.toLong(),1,200);
if(relatedProducts != null && relatedProducts.size() > 0)
{
firstProduct = relatedProducts.get(0);
if(firstProduct.get("Product_Name") != null)
{
productName = firstProduct.get("Product_Name").toString().trim();
}
}
}
catch (productError)
{
info "Ürün ilişkisi alınamadı: " + productError.toString();
}
baseName = "";
if(accountName != "")
{
baseName = accountName;
}
else if(contactName != "")
{
baseName = contactName;
}
newDealName = "";
if(baseName != "" && productName != "")
{
newDealName = baseName + " - " + productName;
}
else if(baseName != "")
{
newDealName = baseName;
}
else if(productName != "")
{
newDealName = productName;
}
if(newDealName == "")
{
info "Firma, kişi veya ürün adı bulunamadı.";
return;
}
currentDealName = "";
if(dealRecord.get("Deal_Name") != null)
{
currentDealName = dealRecord.get("Deal_Name").toString().trim();
}
if(currentDealName == newDealName)
{
info "Deal adı zaten güncel.";
return;
}
updateMap = Map();
updateMap.put("Deal_Name",newDealName);
updateResponse = zoho.crm.updateRecord("Deals",dealId.toLong(),updateMap);
info "Güncelleme sonucu: " + updateResponse;
}
catch (e)
{
info "Hata: " + e.toString();
}
}Dikkat edilecekler
- İç try/catch
Ürün ilişkisi okuması ayrı
tryiçinde; Products ilişkili listesi kapalı org'larda fonksiyon yine de firma adıyla tamamlanır. - On Edit döngüsü
Kod
updateRecordçağrısınaoptions_mapvermediği için fonksiyonun yazdığıDeal_Nameworkflow kurallarını yeniden tetiklemez; döngü oluşmaz. Aynı ad kontrolü yalnız gereksiz API çağrısını önler.Deal_Namedeğişikliğini izleyen başka bir workflow kuralınız varsa, bu yazma onu da çalıştırmaz.
İlgili kayıtlar
- 01Quotes
Teklif fatura adresini teslimat adresine kopyala
Teklifin fatura adresini teslimat adresine kopyalar. Fatura adresi tamamen boşsa dokunmaz; dolu teslimat adresini korumaz, üstüne yazar.
- 02Quotes
Teklif başlığını müşteri ve üründen üret
Teklif başlığını "Ahmet Yılmaz - FUE Standart" biçiminde otomatik yazar; teklif listesi, PDF adı ve e-posta konusu kim için hangi ürün olduğunu ilk bakışta söyler.
- 03Leads
Mükerrer lead'leri telefondan birleştir
Aynı telefon numarasıyla ikinci kez gelen lead'leri elle karşılaştırmadan tek kayda indirir; reklam formu, WhatsApp ve web sitesinden ayrı ayrı gelen kayıtlar tek lead'de toplanır.