Import dan Export Data di Filament

Hampir setiap aplikasi berbasis Filament yang saya kerjakan, terutama di lingkungan klinik dan rumah sakit, cepat atau lambat butuh fitur import dan export data massal. Data pasien lama dari sistem sebelumnya, master obat dari distributor, data tarif dari BPJS, semua sering datang dalam bentuk file, bukan lewat form satu-satu. Filament sudah menyediakan action import dan export bawaan yang cukup matang, tapi ada beberapa hal yang menurut saya perlu dipikirkan dengan sengaja sebelum fitur ini dipakai user awam, bukan sekadar dipasang lalu dianggap selesai.

Format file: jangan asumsikan user paham CSV

Secara teknis, import di Filament bekerja di atas format CSV atau XLSX melalui package spreadsheet. Yang sering luput adalah asumsi bahwa user tahu cara menyiapkan file yang benar. Di lapangan, banyak user membuka template, mengubah urutan kolom, atau menyimpan ulang dari Excel dengan delimiter titik koma alih-alih koma, tergantung region setting komputernya.

Beberapa hal yang saya anggap wajib ada di setiap fitur import:

  • Sediakan tombol unduh template dengan header kolom yang persis sama dengan yang divalidasi sistem.
  • Jangan bergantung pada urutan kolom, cocokkan berdasarkan nama header, bukan posisi index.
  • Tentukan secara eksplisit encoding yang diterima (idealnya UTF-8) supaya karakter seperti nama dengan huruf tertentu tidak berubah jadi karakter aneh.

Misalnya, untuk import data obat, saya biasa mendefinisikan kolom wajib seperti kode_obat, nama_obat, dan satuan, lalu menandai kolom lain sebagai opsional dengan nilai default. Ini jauh lebih tahan banting dibanding mengharuskan urutan kolom persis sama seperti template.

Validasi baris gagal itu bagian dari fitur, bukan pelengkap

Ini bagian yang paling sering diremehkan. Misalnya, import dengan seribu baris data hampir pasti akan punya beberapa baris bermasalah, entah karena kode referensi tidak ditemukan, format tanggal salah, atau nilai numerik yang sebenarnya berupa teks. Kalau sistem hanya bilang "import gagal" tanpa detail baris mana yang bermasalah, user akan kesulitan memperbaikinya dan biasanya balik bertanya ke tim IT.

Pendekatan yang saya pakai adalah memisahkan proses menjadi dua tahap secara konseptual, validasi dan eksekusi. Setiap baris divalidasi dulu terhadap rule yang jelas, seperti aturan validasi Laravel pada umumnya, lalu:

  • Baris yang valid tetap diproses dan disimpan.
  • Baris yang gagal dicatat lengkap dengan nomor baris dan alasan gagalnya, bukan sekadar "data tidak valid".
  • Hasil akhirnya dirangkum: berapa baris berhasil, berapa gagal, dan file gagal itu bisa diunduh ulang untuk diperbaiki.

Filament sendiri mendukung pola ini lewat kelas Importer yang menyediakan hook validasi per baris dan mekanisme pencatatan failure. Prinsipnya sama walau nanti dipakai di framework atau versi lain: jangan biarkan satu baris rusak menggagalkan seluruh proses, dan jangan buang informasi kegagalan begitu saja.

Feedback ke user saat data besar

Untuk import dengan jumlah baris yang besar, misalnya puluhan ribu baris, proses sinkron di request HTTP biasa gampang kena timeout atau bikin user menatap layar loading tanpa tahu apakah sistemnya macet atau memang sedang bekerja. Di sinilah antrean (queue) jadi penting. Filament import action modern sudah mendukung proses via queue secara default, jadi file diunggah dulu, lalu diproses di background, dan user mendapat notifikasi begitu selesai.

Yang perlu ditambahkan di atas itu adalah kejelasan status selama proses berjalan, bukan cuma notifikasi di akhir. Beberapa hal yang saya pastikan ada: indikasi progres kasar, misalnya jumlah baris yang sudah diproses dari total, notifikasi yang jelas antara "berhasil semua", "berhasil sebagian", dan "gagal total", serta tautan langsung ke laporan atau file baris gagal dari notifikasi itu sendiri, supaya user tidak perlu mencari-cari ke menu lain.

Export punya pertimbangan serupa dari sisi performa. Untuk data besar, sebaiknya hindari menarik seluruh dataset ke memori sekaligus, gunakan chunking atau lazy collection, dan proses lewat queue juga kalau ukurannya berpotensi besar, supaya server tidak kehabisan memori saat banyak user export bersamaan.

Ringkasnya

Tiga hal yang saya anggap wajib ada di fitur import/export produksi: template dan validasi format yang toleran terhadap kesalahan kecil user, pelaporan baris gagal yang detail dan bisa ditindaklanjuti, serta feedback proses yang jelas lewat queue dan notifikasi, bukan cuma spinner tanpa informasi. Fitur ini kelihatan sederhana dari luar, tapi kualitas penanganan error-nya yang sebenarnya menentukan apakah user akan mempercayai fitur itu atau menghindarinya dan tetap input data manual satu per satu.