Lewati ke konten utama

Script Task

Simbol Script Task dalam BPMN 2.0

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 →

Artikel Terkait

💡

Sudah memahami konsep BPMN?

Wujudkan diagram Anda menjadi workflow automation nyata tanpa coding - dengan AlurKerja, platform BPM buatan Indonesia.