Lewati ke konten utama

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:

BPMSBahasa Script yang Didukung
Camunda 7Groovy, JavaScript (Rhino), JUEL, Python (Jython)
FlowableGroovy, JavaScript, JUEL
ActivitiGroovy, 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

AspekScript TaskService Task
Dieksekusi olehEngine langsungKode eksternal / worker
Butuh koneksi jaringan?✅ (biasanya)
Bisa akses sistem lain?❌ (terbatas)
PerformaSangat cepatTergantung service
Cocok untukLogika/kalkulasi lokalIntegrasi & otomasi
Retry jika gagalTidak otomatisBisa 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

AspekScript TaskBusiness Rule Task
Aturan bisa diubah tanpa deploy ulang?
Cocok untuk aturan yang sering berubah?
OverheadSangat rendahLebih tinggi
Cocok untukKalkulasi tetapAturan 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 →