Panduan Lengkap Integrasi ERP dengan Mesin Absensi Fingerprint Efisien
T
Kembali ke Blog

Panduan Lengkap Integrasi ERP dengan Mesin Absensi Fingerprint Efisien

Tutorial
Tim Pilar Inovasi 08 Jun 2026 11 min baca 2,937 kata 261
Artikel ini menyajikan panduan mendalam tentang integrasi sistem ERP dengan mesin absensi fingerprint, membahas arsitektur, implementasi teknis, dan praktik terbaik. Ditujukan bagi manajer IT, pemilik klinik, dan pengambil keputusan untuk meningkatkan efisiensi operasional dan akurasi data HR.

Manajemen waktu karyawan adalah tulang punggung operasional yang efisien di setiap organisasi, mulai dari klinik kecil hingga rumah sakit besar dan perusahaan manufaktur. Namun, seringkali proses pencatatan absensi masih menjadi momok yang memakan waktu dan rentan kesalahan. Bayangkan skenario di mana departemen HR harus secara manual mengunduh data absensi dari puluhan mesin fingerprint setiap akhir bulan, memvalidasi ribuan entri, dan kemudian mengunggahnya ke sistem ERP untuk penggajian. Proses ini tidak hanya memakan waktu berhari-hari, tetapi juga memiliki tingkat kesalahan data hingga 5-10% akibat human error, seperti salah input ID karyawan atau duplikasi data. Akibatnya, penggajian bisa tertunda, akurasi laporan kehadiran dipertanyakan, dan produktivitas tim HR menurun drastis. Sebuah studi menunjukkan bahwa perusahaan dapat kehilangan hingga 2% dari total biaya gaji tahunan karena kesalahan pencatatan waktu dan absensi. Tantangan ini semakin kompleks dengan adanya kebijakan lembur, shift kerja yang dinamis, dan kebutuhan audit yang ketat. Artikel ini hadir sebagai solusi praktis, menyajikan panduan komprehensif untuk mengintegrasikan sistem ERP Anda dengan mesin absensi fingerprint. Kami akan mengupas tuntas mulai dari konsep dasar, detail implementasi teknis dengan contoh kode yang bisa dijalankan, hingga praktik terbaik dan penanganan error, memastikan Anda dapat membangun sistem yang akurat, efisien, dan andal.

Konsep Dasar Integrasi ERP dan Absensi Biometrik

Integrasi ERP (Enterprise Resource Planning) dengan mesin absensi biometrik seperti fingerprint adalah langkah strategis untuk mengotomatisasi dan menyinkronkan data kehadiran karyawan dengan modul HR & Payroll. ERP, seperti Odoo, SAP Business One, atau sistem kustom seperti SIMRS dan SIM Klinik yang saya kembangkan, bertindak sebagai pusat data operasional yang mengelola berbagai fungsi bisnis, termasuk keuangan, inventaris, dan tentu saja, sumber daya manusia. Modul HR dalam ERP sangat bergantung pada data kehadiran yang akurat untuk perhitungan gaji, tunjangan, lembur, dan cuti. Tanpa integrasi yang baik, data absensi menjadi silo informasi yang terpisah, memerlukan intervensi manual yang rentan kesalahan dan memakan waktu.

Mesin absensi fingerprint, seperti model ZKTeco seri UBio-X Pro atau Bio-Rad iCAM7000, berfungsi sebagai titik pengumpul data primer. Perangkat ini mencatat waktu masuk dan keluar karyawan berdasarkan identifikasi biometrik yang unik, memastikan akurasi data yang tinggi dan mencegah praktik 'titip absen'. Data yang dihasilkan oleh mesin ini biasanya berupa log mentah yang mencakup Employee ID (ID karyawan di mesin), Timestamp (waktu kejadian), Event Type (masuk/keluar), dan Device ID (identitas mesin). Tantangannya adalah bagaimana mentransfer data log ini dari perangkat fisik ke database ERP secara real-time atau mendekati real-time, kemudian memprosesnya agar sesuai dengan struktur data yang dibutuhkan oleh sistem HR & Payroll.

Arsitektur integrasi umumnya melibatkan tiga komponen utama: mesin absensi, sebuah middleware atau service penghubung, dan sistem ERP. Mesin absensi akan mengirimkan atau menyediakan data log-nya. Middleware adalah jembatan kritis yang bertanggung jawab untuk mengambil data dari mesin, melakukan transformasi dasar (misalnya, memetikan Employee ID dari mesin ke Employee ID di ERP, menyesuaikan zona waktu), dan kemudian mengirimkannya ke ERP melalui API. Pendekatan ini memisahkan logika pengambilan data dari logika bisnis ERP, memungkinkan fleksibilitas dan skalabilitas. Misalnya, jika Anda memiliki 50 mesin absensi yang tersebar di beberapa lokasi, satu middleware terpusat dapat mengelola semua koneksi, mengurangi beban pada server ERP.

Manfaat utama dari integrasi ini sangat signifikan. Pertama, akurasi data meningkat drastis. Dengan menghilangkan entri manual, risiko kesalahan ketik atau duplikasi data hampir nol. Kedua, efisiensi operasional HR meningkat. Tim HR dapat mengalihkan fokus dari tugas administratif berulang ke aktivitas strategis yang lebih bernilai. Sebuah studi menunjukkan bahwa otomatisasi absensi dapat mengurangi waktu pemrosesan payroll hingga 70%. Ketiga, data real-time tersedia. Manajer dapat memantau kehadiran karyawan secara langsung, memungkinkan pengambilan keputusan yang lebih cepat dan responsif terhadap perubahan operasional. Keempat, kepatuhan audit dan regulasi. Data yang konsisten dan otomatis lebih mudah diaudit dan memenuhi persyaratan regulasi ketenagakerjaan, seperti perhitungan lembur sesuai UU Cipta Kerja atau Peraturan Menteri Ketenagakerjaan No. 11 Tahun 2022 tentang Tata Cara Penetapan Upah Minimum. Integrasi ini bukan hanya tentang teknologi, tetapi tentang mentransformasi manajemen SDM menjadi lebih strategis dan data-driven.

Detail Implementasi Teknis dan Pilihan Arsitektur

Implementasi integrasi ERP dengan mesin absensi fingerprint memerlukan pemahaman mendalam tentang konektivitas perangkat, metode pengambilan data, dan proses transformasi data. Sebagian besar mesin absensi modern, terutama yang populer di pasar Indonesia seperti ZKTeco seri iClock atau Biofinger, mendukung konektivitas melalui TCP/IP. Ini adalah metode yang paling direkomendasikan karena memungkinkan komunikasi jaringan secara langsung. Mesin absensi akan memiliki alamat IP statis dan port komunikasi standar, seringkali port 4370 untuk perangkat ZKTeco. Penting untuk memastikan mesin dan server middleware berada dalam jaringan yang sama atau dapat dijangkau melalui konfigurasi firewall yang tepat.

Ada beberapa metode utama untuk mengambil data dari mesin absensi. Pertama, menggunakan SDK (Software Development Kit) atau API yang disediakan oleh produsen perangkat. Misalnya, ZKTeco menyediakan SDK untuk berbagai bahasa pemrograman (C#, Java) yang memungkinkan pengembang untuk membuat aplikasi kustom yang terhubung langsung ke perangkat untuk mengambil log absensi, mengelola pengguna, atau bahkan melakukan kontrol pintu. Kedua, melalui protokol komunikasi non-standar yang bisa diparsing oleh library pihak ketiga. Untuk ZKTeco, ada beberapa library open-source di Python (misalnya, pyzk) atau Node.js (misalnya, zklib) yang mengimplementasikan protokol komunikasi perangkat, memungkinkan Anda berinteraksi dengan mesin tanpa SDK resmi.

Pilihan arsitektur middleware sangat krusial. Untuk skala kecil hingga menengah (misalnya, 1-10 mesin absensi), sebuah aplikasi standalone yang berjalan sebagai service di server Linux (misalnya, Ubuntu Server 22.04 LTS) atau Windows Server (misalnya, Windows Server 2022) sudah cukup. Aplikasi ini bisa ditulis dalam Node.js (versi 20 LTS ke atas) dengan framework Express.js atau PHP (versi 8.2 ke atas) dengan framework Laravel 11.x, menggunakan cron job atau service manager (systemd) untuk menjalankan polling data secara periodik (misalnya, setiap 5-10 menit). Untuk skala yang lebih besar atau lingkungan yang membutuhkan throughput tinggi, arsitektur berbasis message queue seperti RabbitMQ atau Apache Kafka bisa dipertimbangkan. Dalam skenario ini, middleware akan mengambil data dari mesin, memasukkannya ke dalam queue, dan ERP akan mengonsumsi data dari queue tersebut secara asinkron, memastikan data tidak hilang bahkan jika ERP sedang sibuk atau offline sementara.

Proses ETL (Extract, Transform, Load) adalah inti dari middleware. Extract melibatkan pengambilan log mentah dari mesin. Transform adalah tahap paling penting, di mana data mentah diubah menjadi format yang dapat diterima oleh ERP. Ini termasuk: (1) Pemetaan Employee ID: Mesin mungkin menggunakan ID numerik sederhana (misal: 101), sedangkan ERP menggunakan ID alfanumerik (misal: EMP-001) atau NIK. Middleware harus memiliki tabel mapping. (2) Penanganan Waktu: Sinkronisasi waktu sangat penting. Pastikan NTP (Network Time Protocol) aktif di server middleware dan mesin absensi untuk menghindari selisih waktu. Data timestamp dari mesin harus dikonversi ke zona waktu server ERP. (3) Validasi Data: Memfilter entri duplikat, entri tidak valid (misalnya, ID karyawan tidak dikenal). Load adalah tahap akhir, di mana data yang sudah bersih dan terstruktur dikirim ke ERP. Ini paling sering dilakukan melalui API RESTful (menggunakan JSON sebagai format data) yang disediakan oleh ERP, atau dalam kasus tertentu, bisa juga melalui direct database insert (meskipun kurang disarankan karena melangkahi logika bisnis ERP).

Sebagai contoh, jika ERP Anda dibangun dengan Laravel 11.x dan menggunakan PostgreSQL 16 sebagai database, Anda akan membuat endpoint API di Laravel yang menerima data absensi. Middleware yang ditulis dalam Node.js akan terhubung ke mesin ZKTeco, mengambil log, memprosesnya, dan kemudian melakukan HTTP POST request ke endpoint Laravel tersebut. Setiap data absensi yang masuk akan divalidasi dan disimpan ke tabel attendance_records di PostgreSQL, yang kemudian dapat diakses oleh modul HR & Payroll. Pendekatan ini memastikan decoupling yang baik antara perangkat keras, middleware, dan sistem ERP inti.

Contoh Kode Implementasi (Node.js & PHP Laravel)

Untuk memberikan gambaran konkret, mari kita lihat contoh kode sederhana menggunakan Node.js sebagai middleware untuk mengambil data dari mesin ZKTeco dan PHP Laravel untuk menerima serta menyimpan data tersebut di sistem ERP. Kita akan menggunakan library zklib untuk Node.js dan axios untuk HTTP request, serta framework Laravel untuk sisi ERP.

Pertama, pastikan Anda telah menginstal Node.js (minimal versi 20 LTS) dan PHP (minimal versi 8.2) dengan Composer untuk Laravel. Instalasi library zklib di Node.js dapat dilakukan dengan perintah:

npm install zklib axios

Berikut adalah contoh kode Node.js untuk mengambil log absensi dari mesin ZKTeco dan mengirimkannya ke API ERP Laravel Anda:

// middleware_absensi.jsconst ZKLib = require('zklib');const axios = require('axios');const ZK_IP = '192.168.1.201'; // Ganti dengan IP mesin absensi Andaconst ZK_PORT = 4370;const ERP_API_URL = 'http://your-erp-domain.com/api/attendance-logs'; // Ganti dengan URL API ERP Andaasync function fetchAndSendAttendance() {    const zk = new ZKLib(ZK_IP, ZK_PORT, 5000); // Timeout 5 detik    try {        // 1. Koneksi ke mesin ZKTeco        await zk.createSocket();        console.log(`Terhubung ke mesin ZKTeco di ${ZK_IP}:${ZK_PORT}`);        // 2. Ambil log absensi        const logs = await zk.getAttendance();        console.log(`Ditemukan ${logs.data.length} log absensi.`);        if (logs.data.length === 0) {            console.log('Tidak ada log baru.');            return;        }        // 3. Proses dan kirim ke ERP API        for (const log of logs.data) {            const payload = {                device_serial: 'ZKT-ABCDEF', // Ganti dengan serial mesin                employee_id_device: log.uid, // ID karyawan di mesin                timestamp: new Date(log.timestamp * 1000).toISOString().slice(0, 19).replace('T', ' '), // Konversi ke format YYYY-MM-DD HH:MM:SS                status: log.status === 0 ? 'IN' : 'OUT', // Sesuaikan dengan status (0=IN, 1=OUT, dll)                verified_mode: 'FINGERPRINT' // Atau CARD, PASSWORD, dll.            };            try {                await axios.post(ERP_API_URL, payload);                console.log(`Log absensi untuk UID ${log.uid} pada ${payload.timestamp} berhasil dikirim.`);            } catch (apiError) {                console.error(`Gagal mengirim log ke ERP untuk UID ${log.uid}: ${apiError.message}`);                // Log detail error dari response jika ada                if (apiError.response) {                    console.error('Response data:', apiError.response.data);                }            }        }        // Opsional: Hapus log di mesin setelah berhasil dikirim (gunakan dengan hati-hati!)        // await zk.clearAttendance();        // console.log('Log absensi di mesin berhasil dihapus.');    } catch (error) {        console.error(`Error saat proses absensi: ${error.message}`);    } finally {        if (zk.socket) {            zk.socket.end();            console.log('Koneksi ZKTeco ditutup.');        }    }}// Jalankan setiap 5 menit (300000 ms)setInterval(fetchAndSendAttendance, 300000);fetchAndSendAttendance(); // Jalankan saat startup

Kode Node.js di atas akan terhubung ke mesin ZKTeco, mengambil semua log absensi, memformatnya, dan mengirimkannya satu per satu ke endpoint API ERP. Log uid dari mesin adalah ID karyawan yang perlu dipetakan ke ID karyawan di ERP. Untuk production, Anda perlu menambahkan mekanisme last_processed_timestamp untuk menghindari pengiriman log yang sama berulang kali dan hanya mengambil log baru.

Selanjutnya, di sisi ERP Laravel Anda, Anda perlu membuat endpoint API untuk menerima data ini. Pertama, definisikan model AttendanceLog dan migrasi database. Contoh migrasi:

<?php// database/migrations/xxxx_xx_xx_create_attendance_logs_table.phpuse Illuminate\Database\Migrations\Migration;use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema;return new class extends Migration{    public function up(): void    {        Schema::create('attendance_logs', function (Blueprint $table) {            $table->id();            $table->string('device_serial', 50);            $table->string('employee_id_device', 50); // ID dari mesin            $table->unsignedBigInteger('employee_id_erp')->nullable(); // ID karyawan di ERP            $table->timestamp('timestamp');            $table->string('status', 10); // IN, OUT, BREAK_IN, BREAK_OUT, etc.            $table->string('verified_mode', 20)->nullable();            $table->timestamps();            $table->unique(['device_serial', 'employee_id_device', 'timestamp'], 'unique_attendance_log');            $table->foreign('employee_id_erp')->references('id')->on('employees')->onDelete('cascade'); // Jika ada tabel employees        });    }    public function down(): void    {        Schema::dropIfExists('attendance_logs');    }};

Kemudian, buat Controller dan rute API di Laravel:

<?php// app/Http/Controllers/Api/AttendanceController.phpnamespace App\Http\Controllers\Api;use App\Http\Controllers\Controller;use App\Models\AttendanceLog;use App\Models\Employee; // Asumsi ada model Employee untuk mappinguse Illuminate\Http\Request;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Log;class AttendanceController extends Controller{    public function store(Request $request)    {        $validated = $request->validate([            'device_serial' => 'required|string|max:50',            'employee_id_device' => 'required|string|max:50',            'timestamp' => 'required|date_format:Y-m-d H:i:s',            'status' => 'required|string|in:IN,OUT,BREAK_IN,BREAK_OUT', // Sesuaikan            'verified_mode' => 'nullable|string|max:20',        ]);        // Cek apakah log sudah ada untuk mencegah duplikasi (idempotency)        $existingLog = AttendanceLog::where('device_serial', $validated['device_serial'])                                    ->where('employee_id_device', $validated['employee_id_device'])                                    ->where('timestamp', $validated['timestamp'])                                    ->first();        if ($existingLog) {            Log::info('Duplicate attendance log received, skipping.', $validated);            return response()->json(['message' => 'Attendance log already exists'], 200);        }        // Lakukan mapping employee_id_device ke employee_id_erp        $employee = Employee::where('device_id', $validated['employee_id_device'])->first();        if (!$employee) {            Log::warning('Employee not found for device ID: ' . $validated['employee_id_device'], $validated);            // Anda bisa menyimpan log tanpa employee_id_erp atau mengembalikan error            // Untuk demo, kita akan menyimpan dengan null            // return response()->json(['message' => 'Employee not found'], 404);        }        DB::beginTransaction();        try {            $attendanceLog = AttendanceLog::create([                'device_serial' => $validated['device_serial'],                'employee_id_device' => $validated['employee_id_device'],                'employee_id_erp' => $employee ? $employee->id : null,                'timestamp' => $validated['timestamp'],                'status' => $validated['status'],                'verified_mode' => $validated['verified_mode'],            ]);            DB::commit();            Log::info('Attendance log created successfully.', ['id' => $attendanceLog->id, 'data' => $validated]);            return response()->json(['message' => 'Attendance log recorded successfully', 'data' => $attendanceLog], 201);        } catch (\Exception $e) {            DB::rollBack();            Log::error('Failed to create attendance log: ' . $e->getMessage(), $validated);            return response()->json(['message' => 'Failed to record attendance log', 'error' => $e->getMessage()], 500);        }    }}
// routes/api.phpuse App\Http\Controllers\Api\AttendanceController;use Illuminate\Support\Facades\Route;Route::post('/attendance-logs', [AttendanceController::class, 'store']);

Kode Laravel ini menyediakan endpoint POST /api/attendance-logs yang menerima payload JSON dari middleware Node.js. Ini melakukan validasi, memeriksa duplikasi log (idempotency), memetakan ID karyawan perangkat ke ID karyawan ERP (jika ada model Employee dengan kolom device_id), dan kemudian menyimpan data ke database. Penggunaan transaksi database (DB::beginTransaction()) memastikan integritas data.

Contoh Payload Data dan Penanganan Error

Memahami struktur data yang dipertukarkan antara middleware dan ERP adalah kunci untuk integrasi yang sukses. Berikut adalah contoh payload JSON yang realistis yang akan dikirim dari middleware Node.js ke API ERP Laravel:

Berikut adalah contoh payload JSON yang realistis yang akan dikirim dari middleware Node.js ke API ERP Laravel:

{  "device_id": "FP-01",  "employee_device_id": "1001",  "timestamp": "2025-01-15T08:05:23+07:00",  "status": "in",  "verified_mode": "fingerprint"}

Dari payload di atas, field device_id menunjukkan mesin absensi mana yang mengirim data, employee_device_id adalah ID karyawan yang tersimpan di memori mesin, dan timestamp adalah waktu kejadian dalam format ISO 8601 dengan zona waktu. Field status menandakan apakah karyawan masuk atau keluar, sedangkan verified_mode mencatat metode verifikasi yang digunakan (fingerprint, kartu, atau PIN). Untuk penanganan error, middleware Node.js sebaiknya menerapkan mekanisme retry dengan exponential backoff ketika API ERP mengembalikan status 5xx, serta menyimpan log lokal sementara agar data tidak hilang saat koneksi terputus. Di sisi ERP, validasi harus mencakup pengecekan format timestamp, keberadaan karyawan, dan duplikasi berdasarkan kombinasi employee_device_id + timestamp.

Tips Praktis Implementasi Integrasi ERP dengan Mesin Absensi Fingerprint

Pertama, selalu gunakan middleware sebagai lapisan perantara antara mesin absensi dan ERP. Mesin fingerprint umumnya hanya mendukung protokol sederhana seperti TCP/IP push atau UDP, sehingga middleware Node.js berperan penting untuk menerjemahkan data mentah menjadi payload JSON yang terstruktur. Middleware juga memungkinkan Anda melakukan buffering ketika ERP sedang dalam pemeliharaan, sehingga tidak ada data absensi yang hilang. Pastikan middleware berjalan sebagai service yang selalu aktif, misalnya menggunakan PM2 atau systemd, dan dilengkapi dengan mekanisme monitoring.

Kedua, terapkan idempotency pada endpoint API ERP. Karena mesin absensi bisa mengirim ulang data yang sama akibat gangguan jaringan, endpoint harus mampu mendeteksi duplikasi. Gunakan kombinasi unik seperti employee_device_id, timestamp, dan device_id sebagai kunci idempotency. Simpan juga request_id unik dari middleware untuk audit trail. Dengan cara ini, Anda mencegah data ganda yang bisa mengacaukan perhitungan payroll dan laporan kehadiran.

Ketiga, lakukan sinkronisasi master data secara berkala. Data karyawan di mesin absensi harus selalu selaras dengan data di ERP. Buatlah proses sinkronisasi dua arah: ketika ada karyawan baru di ERP, middleware otomatis mendaftarkannya ke mesin fingerprint; sebaliknya, jika ada perubahan data di mesin, middleware memperbarui ERP. Jadwalkan sinkronisasi minimal sekali sehari dan gunakan queue untuk menghindari beban berlebih pada server ERP. Selain itu, terapkan timezone handling yang konsisten agar tidak terjadi selisih jam antara mesin dan server.

FAQ

Bagaimana jika koneksi antara middleware dan ERP terputus saat pengiriman data?

Middleware harus menyimpan data absensi ke dalam local queue atau database sementara (misalnya SQLite atau Redis) sebelum mengirimkannya ke ERP. Ketika koneksi pulih, middleware akan mengirim ulang data yang tertunda secara berurutan. Pastikan mekanisme retry menggunakan exponential backoff dan batas maksimal percobaan untuk menghindari infinite loop.

Apakah data absensi bisa langsung dikirim ke ERP tanpa middleware?

Secara teknis bisa, tetapi sangat tidak disarankan. Mesin fingerprint umumnya tidak mendukung autentikasi API modern, format JSON, atau penanganan error yang kompleks. Middleware memberikan lapisan keamanan, validasi, dan fleksibilitas untuk transformasi data. Selain itu, middleware memudahkan pemeliharaan ketika ada perubahan pada API ERP.

Bagaimana cara menangani perbedaan zona waktu antara mesin absensi dan server ERP?

Selalu simpan timestamp dalam format UTC di database ERP, lalu konversikan ke zona waktu lokal saat menampilkan laporan. Middleware harus mengirim timestamp dengan informasi zona waktu (ISO 8601) atau mengonversinya ke UTC sebelum dikirim. Pastikan juga mesin absensi dikonfigurasi dengan zona waktu yang benar dan sinkron dengan NTP server.

Apakah integrasi ini aman dari penyadapan data?

Gunakan HTTPS/TLS untuk komunikasi antara middleware dan ERP, serta autentikasi berbasis token (misalnya JWT atau API key) pada setiap request. Batasi akses endpoint hanya dari IP middleware yang dikenal, dan enkripsi data sensitif seperti ID karyawan jika diperlukan. Lakukan audit log secara berkala untuk mendeteksi aktivitas mencurigakan.

Kesimpulan

Integrasi ERP dengan mesin absensi fingerprint bukan sekadar menghubungkan dua sistem, tetapi membangun alur data yang andal, aman, dan efisien. Dengan middleware sebagai perantara, endpoint API yang idempotent, serta sinkronisasi master data yang terjadwal, Anda dapat memastikan data kehadiran karyawan tercatat akurat dan real-time di ERP. Tips praktis di atas—mulai dari penggunaan queue, penanganan zona waktu, hingga keamanan komunikasi—akan membantu Anda menghindari jebakan umum dalam implementasi.

Jika Anda ingin mempercepat implementasi atau menghadapi tantangan spesifik seperti integrasi dengan SAP, Odoo, atau sistem HRIS kustom, tim kami siap membantu. Konsultasikan kebutuhan integrasi ERP dan mesin absensi Anda sekarang untuk mendapatkan solusi yang disesuaikan dengan infrastruktur dan skala bisnis Anda. Hubungi kami melalui halaman kontak atau jadwalkan sesi demo gratis untuk melihat langsung bagaimana sistem ini bekerja.

Solusi terkait dari PT Pilar Inovasi Informatika (produk IT Pilar Inovasi): SIMRS SIM Klinik. Butuh konsultasi gratis?

Terakhir diperbarui 18 Oct 2026

Komentar

Komentar ditinjau sebelum tampil.

Belum ada komentar. Jadilah yang pertama!