Subscribe

RSS Feed (xml)

Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

Rabu, 27 Januari 2016

Custom Emal Notifikasi Workflow AX

Di dalam AX, fitur workflow akan menghasilkan notifikasi pada setiap step nya. Ketika submit, approve, reject, dan lainnya. Isi dari notifikasi tersebut dapat dibuat sesuai kebutuhan. Namun terbatas sesuai field-field yang telah di sediakan. Pada workflow tabel yang memiliki master dan detail maka tampilan detailnya secara standart sangat tidak informatif, yaitu memanjang ke samping, bukan per baris kebawah. Alhamdulillah, ada cara untuk mendesain notifikasi tersebut lebih bagus. Namun notifikasi via email. Pada dasarnya, yang di custom adalah tag pada mail template, bukan tag pada workflow instruction.

Sumber blog sebagai rujukan: https://workflowax.wordpress.com/2012/12/12/customize-your-ax-workflow-email-templates/

1. Membuat template email untuk workflow

Contoh yang saya buat:
Microsoft Dynamics AX alert
%for%

Alert Message
%message%
Additional Information:
%lpiwflinesdescription%
Sent by Dynamics AX Workflow System  
Please do not reply this email

Tag tambahan yang saya buat adalah %lpiwflinesdescription%.  Sedangkan tag-tag lain (seperti %for%) adalah standart yang ada di AX. Jika dijalankan sekarang, maka custom tag tersebut tidak akan di parsing.

2. Melakukan modifikasi kode untuk custom tag di email template

Ada dua bagian utama yang perlu di tambah, yaitu di tabel SysEmailTable dan di class EventNotificationWorkflow.
Pada tabel SysEmailTable, lakukan modifikasi pada method htmlEncodeParameters
(line 16)

while (mapEnum.moveNext()) { 
 //Modified by shindu 
 //10 Nov 2015 
 //Disable htmlEncode for customEmailTag 
 //OLD code: //encodedMap.insert(mapEnum.currentKey(),SysEmailTable::htmlEncode(mapEnum.currentValue())); 
 //New Code: 
if (subStr(mapEnum.currentKey(),1,3) == 'lpi') //All custom tag must start with lpi    encodedMap.insert(mapEnum.currentKey(), mapEnum.currentValue()); 
else encodedMap.insert(mapEnum.currentKey(),SysEmailTable::htmlEncode(mapEnum.currentValue())); //end by shindu 
 }

Fungsi modifikasi ini adalah agar tag HTML tidak diencode menjadi plain text. Jika standartnya semua HTML tag akan di konversi menjadi plain text. Namun tidak semua, hanya untuk tag tertentu. Dalam hal ini tag yang huruf depannya adalah lpi, karena nama tag barunya lpiwflinesdescription.

Kemudian lakukan modifikasi pada class EventNotificationWorkflow. Tambah method baru addCustomMergeValues

///
/// Function to add custom merge values.//////
/// Created by shindu 10 Nov 2015///
private void addCustomMergeValues(){
SysDictTable dictTable; 
ExecutePermission perm; 
str description; ; 
// 
if (!record) 
return; 
dictTable = new SysDictTable(record.tableid); 
if (!dictTable) return; 
if (dictTable.isMethodActual('lpiWFLinesDescription')) 
// Grants permission to execute the DictClass.callObject method. // DictClass.callObject is protected by code access security. 
perm = new ExecutePermission(); 
perm.assert(); 
try
description = dictTable.callObject('lpiWFLinesDescription',record); 
} catch (Exception::Error){ 
description = ""; 
} // // Closes the code access permission scope. 
CodeAccessPermission::revertAssert(); 
} else { 
description = ""; 
} this.addMergeValue("lpiwflinesdescription", description);
}

Method baru ini digunakan untuk mengisi data di tag baru yang telah dibuat. Karena tujuannya mencustom semua message dari workflow yang tabelnya berbeda-beda maka di method ini terlihat dilakukan proses call ke object table referensi ke method: lpiWFLinesDescription. Contoh jika refernsinya PurchTable maka akan dipanggil methode  lpiWFLinesDescription di tabel PurchTable. Untuk itu di langkah nomor 3 dibuat method tersebut pada setiap tabel yang ada workflownya.

Setelah dibuat method baru di class ini, pada method sendMail dilakukan modifikasi sehingga custom tag yang kita buat dimasukkan di list xml yang dikirim ke template email.
(line 25)

 if (sysUserInfo && userInfo && SysEmailDistributor::validateEmail(sysUserInfo.emailDisplay()))
    {
        this.addBaseMergeValues();
        //
        //Add by Shindu
        //to enable custom merge values
        //6 Nov 2015
        this.addCustomMergeValues();
        //endd add


        mergeValuesXml = EventActionEmail::createEmailParameterXml(mergeValues);

3. Tambah method lpiWFLinesDescription di semua tabel yang memiliki workflow

Seperti yang telah dijelaskan dilangkah 2, dibagian ini lah isi message custom yang kita buat harus ditambahkan. Kita ambil contoh kasus workflow untuk Purchase Order. Maka kita buat method baru ini di tabel PurchTable.



Kita lakukan formating di bagian ini. 

Hasil akhir

Setelah semua proses compile dilakukan, maka hasilnya akan seperti dabawah ini: