Ne yapar
Önce ilişkili Kişi adını, o yoksa Firma adını alır; teklifin ilk ürün satırındaki ürün adını ekler. İkisi de varsa Kişi - Ürün, yalnız biri varsa o. Üretilen başlık mevcutla aynıysa kayda dokunmaz.
Kurulum mantığı
- 01
Workflow Rules altında modül Quotes, tetik On Create ve On Edit (Contact_Name, Account_Name ya da ürün satırı değiştiğinde). Ürün satırı alan değişikliği koşulunda seçilemiyorsa On Edit kuralını alan koşulu olmadan kurun.
- 02
Eylem Function, argüman
quoteId, Quote Id alanına eşlenir. - 03
Fonksiyon başlığın elle yazılıp yazılmadığını ayırt etmez; ürettiği başlık mevcut başlıktan farklıysa her tetiklemede üzerine yazar. Subject zorunlu alan olduğundan oluşturma sırasında girilen başlık da ilk çalışmada değişir. Yalnız kişi, firma ve ürün bilgisinin hiçbiri yoksa mevcut başlık olduğu gibi kalır. Kodda
currentSubject != ""gibi bir boşluk kontrolü işe yaramaz: Subject hiçbir zaman boş gelmediği için fonksiyon hiç yazmaz. Elle başlığı korumak için Quotes modülüne "Başlığı elle koru" gibi özel bir onay kutusu alanı ekleyin ve kurala "bu alan işaretli değilse" koşulunu koyun; kutu işaretlenmeden elle değiştirilen başlık yine ezilir. Tetiği yalnız On Create ile sınırlamak da sonraki elle düzenlemeleri korur, ancak kişi, firma ya da ürün sonradan değişirse başlık güncellenmez.
Alan eşlemesi
Koda yazılan alanlar ve kendi org'unuzda dikkat etmeniz gerekenler.
| Alan | Değer | Not |
|---|---|---|
| Subject | <Kişi veya Firma> - <İlk ürün> | Ayraç kısa tire; kendi standardınızla değiştirin. |
| Contact_Name | okunur | Öncelikli kaynak. |
| Account_Name | okunur | Kişi yoksa. |
| Product_Details | okunur | Yalnız ilk satırın ürünü. |
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.renameQuoteWithContactAndProduct(String quoteId)
{
try
{
info "===== Quote Başlık Güncelleme Başladı =====";
info "Quote ID: " + quoteId;
if(quoteId == null || quoteId.trim() == "")
{
info "Quote ID boş.";
return;
}
quoteRecord = zoho.crm.getRecordById("Quotes",quoteId.toLong());
if(quoteRecord == null || quoteRecord.isEmpty())
{
info "Quote bulunamadı.";
return;
}
customerName = "";
productName = "";
// CONTACT
contactLookup = quoteRecord.get("Contact_Name");
if(contactLookup != null)
{
if(contactLookup.get("name") != null)
{
customerName = contactLookup.get("name").toString().trim();
}
}
// CONTACT YOKSA ACCOUNT
if(customerName == "")
{
accountLookup = quoteRecord.get("Account_Name");
if(accountLookup != null)
{
if(accountLookup.get("name") != null)
{
customerName = accountLookup.get("name").toString().trim();
}
}
}
// İLK ÜRÜN
productLines = quoteRecord.get("Product_Details");
if(productLines != null && productLines.size() > 0)
{
firstLine = productLines.get(0);
productLookup = firstLine.get("product");
if(productLookup != null)
{
if(productLookup.get("name") != null)
{
productName = productLookup.get("name").toString().trim();
}
}
}
newSubject = "";
if(customerName != "" && productName != "")
{
newSubject = customerName + " - " + productName;
}
else if(customerName != "")
{
newSubject = customerName;
}
else if(productName != "")
{
newSubject = productName;
}
if(newSubject == "")
{
info "Başlık oluşturmak için kişi, firma veya ürün bulunamadı.";
return;
}
currentSubject = "";
if(quoteRecord.get("Subject") != null)
{
currentSubject = quoteRecord.get("Subject").toString().trim();
}
if(currentSubject == newSubject)
{
info "Quote başlığı zaten güncel.";
return;
}
updateMap = Map();
updateMap.put("Subject",newSubject);
updateResponse = zoho.crm.updateRecord("Quotes",quoteId.toLong(),updateMap);
info "Güncelleme sonucu: " + updateResponse;
}
catch (e)
{
info "Hata: " + e.toString();
}
}Dikkat edilecekler
- Çok ürünlü teklif
Yalnız ilk satır başlığa girer; "…ve 3 ürün daha" istenirse
productLines.size()kullanılır. - On Edit döngüsü
Kod
updateRecordçağrısınaoptions_mapvermediği için fonksiyonun yazdığıSubjectworkflow kurallarını yeniden tetiklemez; döngü oluşmaz. Aynı başlık kontrolü yalnız gereksiz API çağrısını önler.Subjectdeğ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.
- 12Quotes · Accounts
Firma fatura adresini teklife aktar
Teklif açıldığında bağlı firmanın fatura adresini teklifin Billing alanlarına kopyalar; teklif PDF'inde adres eksik çıkmaz, temsilci beş alanı elle doldurmaz.
- 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.