Transform Map
ETL Transform Map mendefinisikan bagaimana data yang diekstrak ditransformasi dan dimuat ke dalam DocType target. Ini mencakup pemetaan kolom, transformasi nilai, script logika bisnis, dan aturan upsert.
Referensi Kolom
Konfigurasi Dasar
| Kolom | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| Transform Name | Data | Ya | Pengenal unik untuk transform map ini |
| Target DocType | Link | Ya | DocType untuk membuat/memperbarui record |
| Application | Link | Ya | Aplikasi tempat transform map ini berada |
| Active | Check | Tidak | Aktifkan/nonaktifkan transform ini (default: tidak dicentang) |
Kontrol Operasi
| Kolom | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| Allow Insert | Check | Tidak | Izinkan pembuatan record baru |
| Allow Update | Check | Tidak | Izinkan pembaruan record yang sudah ada |
| Skip Business Logic | Check | Tidak | Abaikan document event dan trigger |
| Update Modified Fields | Check | Tidak | Perbarui timestamp modified (ketika Skip Business Logic diaktifkan) |
Catatan: Salah satu dari Allow Insert atau Allow Update harus diaktifkan.
Pemetaan Kolom
Tabel Field Map mendefinisikan bagaimana kolom sumber dipetakan ke kolom target DocType:
| Kolom | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| Source Path | Data | Ya | Nama kolom sumber atau ekspresi JSONPath |
| Target Field | Data | Ya | Nama kolom DocType target |
| Coalesce | Check | Tidak | Gunakan kolom ini untuk pencocokan record (upsert) |
| Default Value | Data | Tidak | Nilai fallback jika kolom sumber kosong |
Pemetaan Nilai
Tabel Value Map mentransformasi nilai sumber ke nilai target:
| Kolom | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| Source Field | Data | Ya | Kolom sumber yang akan diperiksa |
| Source Value | Data | Ya | Nilai sumber yang akan dicocokkan |
| Target Field | Data | Ya | Kolom target yang akan diatur |
| Target Value | Data | Ya | Nilai yang akan diatur dalam kolom target |
Script Transform
Script transform adalah potongan kode Python yang berjalan pada tahap-tahap berbeda dari proses transformasi. Semua script memiliki akses ke objek result untuk mengembalikan nilai dan mengatur flag.
On Start Script
Tujuan: Berjalan sekali sebelum seluruh proses transformasi dimulai.
Variabel yang Tersedia:
transform_map(dict): Konfigurasi transform map lengkapimport_batch(dict): Detail batch impor
Kemampuan Script:
- Atur
result['skip'] = Trueuntuk melewati seluruh transformasi - Inisialisasi counter atau setup struktur data
- Validasi batch sebelum pemrosesan
Contoh:
# Skip transformation if too many records
if import_batch['rows'] > 10000:
result['skip'] = True
result['skip_reason'] = 'Batch too large for processing'
mantera.log_info("ETL", f"Starting transform for {import_batch['rows']} rows")
On Before Script
Tujuan: Berjalan sebelum setiap baris ditransformasi.
Variabel yang Tersedia:
source_record(dict): Data sumber mentah untuk baris saat iniresult(dict): Objek hasil yang dapat diubah
Kemampuan Script:
- Atur
result['skip'] = Trueuntuk melewati baris saat ini - Tambah/modifikasi kolom melalui
result['set_values'] - Terapkan logika kondisional dan pembersihan data
Contoh:
# Skip rows with invalid email
if not source_record.get('email') or '@' not in source_record.get('email', ''):
result['skip'] = True
result['skip_reason'] = 'Invalid email address'
else:
# Set values for field mapping
result['set_values'] = {}
result['set_values']['status'] = 'Active' if source_record.get('active') else 'Inactive'
result['set_values']['full_name'] = f"{source_record.get('first_name', '')} {source_record.get('last_name', '')}"
On After Script
Tujuan: Berjalan setelah setiap baris berhasil ditransformasi dan disimpan.
Variabel yang Tersedia:
source_record(dict): Data sumber aslidoc_values(dict): Nilai akhir yang disimpandoc_name(str): Nama dokumen yang dibuat/diperbaruiaction(str): "insert", "update", atau "skip"
Contoh:
# Log successful operations
if action == "insert":
mantera.log_info("ETL Success", f"Created new customer: {doc_name}")
elif action == "update":
mantera.log_info("ETL Success", f"Updated customer: {doc_name}")
On Complete Script
Tujuan: Berjalan sekali setelah seluruh proses transformasi selesai.
Variabel yang Tersedia:
stats(dict): Statistik akhir dengan kunci: inserts, updates, skipped, errors
Contoh:
total_processed = stats['inserts'] + stats['updates']
result['summary'] = f"Processed {total_processed} records, {stats['errors']} errors"
# Send notification for high error rates
if stats['errors'] > total_processed * 0.1:
frappe.sendmail(
recipients=['admin@company.com'],
subject='ETL High Error Rate',
message=f"ETL job completed with {stats['errors']} errors out of {total_processed + stats['errors']} records"
)
Logika Upsert
Record dicocokkan untuk update menggunakan kolom Coalesce dari Field Map:
- Insert: Jika tidak ada record yang cocok ditemukan dan Allow Insert diaktifkan
- Update: Jika record yang cocok ditemukan dan Allow Update diaktifkan
- Skip: Jika tidak ada operasi yang diizinkan atau kedua flag dinonaktifkan
Aksi
Run Transform
Meluncurkan dialog untuk memilih ETL Import Batch untuk transformasi. Membuat ETL Transform Run dengan pencatatan event yang detail.
Contoh Penggunaan
Contoh Impor Customer
Transform Name: Customer Data Import
Target DocType: Customer
Allow Insert: ✓
Allow Update: ✓
Field Map:
- Source: customer_id → Target: customer_code (Coalesce: ✓)
- Source: company_name → Target: customer_name
- Source: email → Target: email_id
- Source: phone → Target: mobile_no
Value Map:
- Source Field: status, Source Value: A → Target Field: disabled, Target Value: 0
- Source Field: status, Source Value: I → Target Field: disabled, Target Value: 1
Validasi Script
Script transform divalidasi untuk memastikan keamanan:
- Statement
importtidak diizinkan - Tidak ada definisi fungsi
def - Tidak ada statement
return - Akses hanya ke method script yang disetujui
- Harus menggunakan objek
resultuntuk output