Script Task
Script Task adalah task yang dieksekusi oleh BPMS menggunakan script yang ditulis langsung di dalam elemen — bukan memanggil service atau kode eksternal, melainkan menjalankan logika langsung di dalam engine.
Simbol: Ikon gulungan kertas di sudut kiri atas persegi panjang sudut membulat
Definisi yang Tepat
Script Task menjawab: "Logika sederhana apa yang perlu dijalankan engine secara langsung, tanpa memanggil sistem lain?"
Kata kunci untuk mengenali Script Task:
- Kalkulasi nilai dari variabel proses yang sudah ada
- Transformasi format data (reformat string, konversi tipe)
- Manipulasi koleksi data (filter list, mapping, aggregasi sederhana)
- Logika kondisional ringan yang tidak membutuhkan koneksi ke luar
Bahasa Script yang Didukung
Bahasa yang tersedia bergantung pada BPMS, tapi yang paling umum:
| BPMS | Bahasa Script yang Didukung |
|---|---|
| Camunda 7 | Groovy, JavaScript (Rhino), JUEL, Python (Jython) |
| Flowable | Groovy, JavaScript, JUEL |
| Activiti | Groovy, JavaScript, JUEL |
| Camunda 8 (SaaS) | FEEL (Friendly Enough Expression Language) |
Groovy adalah yang paling umum digunakan di Camunda 7/Flowable karena sintaksnya lebih bersih dari Java namun tetap bisa mengakses library Java.
Contoh Script Task
Kalkulasi Angsuran
// Script Task: Hitung Angsuran Bulanan
def P = pokokPinjaman // variabel proses
def r = sukuBungaBulanan / 100
def n = tenorBulan
def angsuran = P * (r * Math.pow(1 + r, n)) / (Math.pow(1 + r, n) - 1)
execution.setVariable("angsuranPerBulan", Math.round(angsuran))
execution.setVariable("totalPembayaran", Math.round(angsuran * n))
execution.setVariable("totalBunga", Math.round(angsuran * n) - P)
Normalisasi Data
// Script Task: Normalisasi Nomor Telepon
def noHp = execution.getVariable("nomorHp").toString()
// Hapus karakter non-digit
noHp = noHp.replaceAll("[^0-9]", "")
// Konversi 08xx → 628xx
if (noHp.startsWith("0")) {
noHp = "62" + noHp.substring(1)
}
execution.setVariable("nomorHpNormal", noHp)
Klasifikasi Sederhana
// Script Task: Tentukan Kategori Risiko
def skor = skorKredit as Integer
def kategori
if (skor >= 750) {
kategori = "RENDAH"
} else if (skor >= 600) {
kategori = "SEDANG"
} else {
kategori = "TINGGI"
}
execution.setVariable("kategoriRisiko", kategori)
Manipulasi List
// Script Task: Filter Dokumen yang Belum Lengkap
def semuaDokumen = execution.getVariable("daftarDokumen") as List
def dokumenKurang = semuaDokumen.findAll { !it.sudahUpload }
def namaDokumenKurang = dokumenKurang.collect { it.nama }
execution.setVariable("dokumenKurang", namaDokumenKurang)
execution.setVariable("jumlahKurang", dokumenKurang.size())
execution.setVariable("semuaLengkap", dokumenKurang.isEmpty())
Script Task vs. Service Task
| Aspek | Script Task | Service Task |
|---|---|---|
| Dieksekusi oleh | Engine langsung | Kode eksternal / worker |
| Butuh koneksi jaringan? | ❌ | ✅ (biasanya) |
| Bisa akses sistem lain? | ❌ (terbatas) | ✅ |
| Performa | Sangat cepat | Tergantung service |
| Cocok untuk | Logika/kalkulasi lokal | Integrasi & otomasi |
| Retry jika gagal | Tidak otomatis | Bisa dikonfigurasi |
Aturan sederhana:
- Jika butuh panggil API, database, atau sistem lain → Service Task
- Jika hanya mengolah data yang sudah ada di variabel proses → Script Task
Script Task vs. Business Rule Task
| Aspek | Script Task | Business Rule Task |
|---|---|---|
| Aturan bisa diubah tanpa deploy ulang? | ❌ | ✅ |
| Cocok untuk aturan yang sering berubah? | ❌ | ✅ |
| Overhead | Sangat rendah | Lebih tinggi |
| Cocok untuk | Kalkulasi tetap | Aturan bisnis yang berubah |
Kapan Menggunakan Script Task
Gunakan Script Task untuk:
- Kalkulasi matematis (angsuran, bunga, diskon, pajak)
- Format/normalisasi data (format tanggal, nomor telepon, NIK)
- Set nilai default variabel
- Operasi sederhana pada list/map
- Persiapan data sebelum Service Task
Hindari Script Task untuk:
- Koneksi ke database atau API eksternal
- Logika bisnis yang kompleks atau sering berubah
- Script yang panjang (>50 baris) — pisahkan ke Java delegate
- Logika yang perlu di-test secara independen
Praktik Terbaik
Jaga Script Tetap Pendek
Script Task ideal berisi 5–20 baris. Jika lebih panjang, pertimbangkan pindahkan ke Java delegate (Service Task) yang bisa di-unit test.
Selalu Gunakan Tipe Eksplisit
// ❌ Rawan error tipe
def nilai = execution.getVariable("nilaiKredit")
// ✅ Eksplisit
def nilai = execution.getVariable("nilaiKredit") as Long
Tangani Null
// ❌ NullPointerException jika variabel belum diset
def nama = execution.getVariable("nama").toUpperCase()
// ✅ Aman
def nama = execution.getVariable("nama")?.toString()?.toUpperCase() ?: "TIDAK DIKETAHUI"
Selanjutnya: Business Rule Task →