← Back to Work

Case Study · Hardware Automation

Direct-to-Printer Robot

Client: PT. Mada Wikri Tunggal
Role: Backend & Automation Engineer
Stack: PowerShell, SumatraPDF CLI, Laravel API
Result: 90% Reduction in SPK Distribution Time

The Situation

Setiap kali admin merilis sebuah SPK (Surat Perintah Kerja) dari sistem ERP, dokumen itu harus sampai ke tangan operator di lantai produksi dalam hitungan detik. Produksi tidak bisa menunggu.

Kenyataannya, operator harus melakukan ini sendiri: buka browser → login ke ERP → cari nomor SPK → unduh PDF → buka PDF Reader → tekan Ctrl+P → pilih printer yang benar → konfirmasi cetak. 2 sampai 3 menit untuk setiap SPK. Di pabrik yang merilis puluhan SPK per hari, itu bottleneck yang nyata.

Yang lebih parah: operator pabrik bukan pengguna komputer yang terlatih. Mis-print karena salah pilih ukuran kertas, orientasi terpotong, atau salah printer bukan kejadian langka — itu kejadian harian yang menghambat lini produksi.

The Insight

Masalah ini bukan masalah UX — bukan soal membuat tampilannya lebih mudah. Masalahnya adalah operator tidak seharusnya terlibat dalam proses cetak sama sekali. Begitu SPK dirilis, printer harusnya langsung mencetak. Otomatis. Tanpa satu pun klik dari operator.

Solusinya adalah sebuah agen kecil yang berjalan diam-diam di background server lokal pabrik — memonitor antrean cetak dari cloud setiap 3 detik, dan mengeksekusi print job secara silent langsung ke printer fisik yang dituju.

The Architecture

1. Laravel Cloud ERP
Admin rilis SPK → job masuk ke tabel TPrintQueue dengan status pending.
2. PS Agent (3s loop)
Script PowerShell lokal polling GET /api/print-queue/pending setiap 3 detik. Berjalan di background.
3. SumatraPDF CLI
PDF diunduh, dicetak silent tanpa GUI. Parameter printer sudah hardcoded di server — operator tidak bisa salah.
4. Callback
POST /api/print-queue/complete/{id} dikirim ke server. Status diupdate, job selesai.

The Hard Parts

Dua masalah OS-level yang tidak terlihat di permukaan tapi menjadi blocker kritis:

1. Windows Session 0 Isolation
Task Scheduler menjalankan script di Session 0 — sebuah sesi terisolasi yang diblokir Windows dari akses ke GDI dan printer spooler. Print job menggantung tanpa pesan error. Solusinya: mendaftarkan script lewat wrapper yang secara eksplisit mengaktifkan interaksi desktop, atau mengalihkan ke sesi terotentikasi via Windows Auto-Logon terenkripsi.

2. Double-Hop Authentication
Ketika script dipicu dari remote connection, kredensial hilang di hop pertama. Script kehilangan akses ke network printer dan menghasilkan "Access Denied" diam-diam. Diselesaikan dengan PSCredential eksplisit atau konfigurasi CredSSP.

# Mengatasi Double-Hop: PSCredential eksplisit untuk Windows Spooler
$PasswordSec = ConvertTo-SecureString "P@ssword" -AsPlainText -Force
$Creds = New-Object System.Management.Automation.PSCredential("Administrator", $PasswordSec)

# Silent print — operator tidak terlibat sama sekali
Start-Process -FilePath "$SumatraPath" -ArgumentList "-print-to `"$PrinterName`" -silent `"$safePdf`"" -Credential $Creds -NoNewWindow -Wait

The Outcome

ΔT = (Tmanual − Tauto) / Tmanual × 100%
ΔT = (150s − 15s) / 150s × 100% = 90%
BEFORE
2–3 menit rata-rata dari SPK dirilis hingga dokumen di tangan operator (150 detik)
AFTER
<15 detik. Printer bergerak sendiri. Operator fokus bekerja, bukan mengoperasikan komputer
ERROR RATE
0% kesalahan cetak. Semua parameter hardcoded di server — tidak ada variabel dari sisi operator

"Solusi terbaik untuk masalah UX kadang bukan memperbaiki UI-nya. Tapi menghilangkan kebutuhan user untuk berinteraksi dengan UI sama sekali."