Panduan Lengkap Implementasi Workflow Pengadaan: PR, RFQ, PO, GRN (2024)
N
Kembali ke Blog

Panduan Lengkap Implementasi Workflow Pengadaan: PR, RFQ, PO, GRN (2024)

Tutorial
Nugroho Setiawan 18 Jun 2026 9 min baca 1,754 kata 72 views
Artikel ini membedah implementasi workflow pengadaan PR, RFQ, PO, GRN secara teknis dan praktis, cocok untuk manajer operasional dan IT. Pelajari langkah demi langkah membangun sistem yang efisien dan transparan, didukung contoh kode dan best practice.

Manajemen pengadaan barang dan jasa yang tidak efisien adalah salah satu ‘lubang hitam’ terbesar dalam operasional bisnis, terutama di sektor kesehatan seperti rumah sakit dan klinik. Bayangkan skenario umum: departemen farmasi membutuhkan obat-obatan esensial, namun proses pengajuan (PR) masih manual, otorisasi memakan waktu berhari-hari karena dokumen fisik, permintaan penawaran (RFQ) ke vendor dilakukan via email terpisah, pesanan pembelian (PO) rentan kesalahan input, dan pencatatan penerimaan barang (GRN) seringkali tidak sinkron dengan stok. Akibatnya, terjadi penundaan pengiriman vital, pembelian berlebih atau kekurangan stok kritis, inefisiensi biaya operasional hingga 10-15% dari total pengeluaran, serta risiko fraud yang meningkat. Problem ini bukan hanya sekadar administratif, melainkan berpotensi mengganggu pelayanan pasien, menurunkan kualitas layanan, dan membengkakkan anggaran. Artikel ini akan memandu Anda secara mendalam tentang cara mengimplementasikan workflow pengadaan yang terstruktur dan terotomatisasi, mencakup Purchase Requisition (PR), Request for Quotation (RFQ), Purchase Order (PO), dan Goods Receipt Note (GRN), dengan fokus pada solusi teknologi yang praktis dan dapat diimplementasikan.

Konsep Dasar dan Manfaat Workflow Pengadaan Terstruktur

Workflow pengadaan yang terstruktur dengan empat pilar utama—Purchase Requisition (PR), Request for Quotation (RFQ), Purchase Order (PO), dan Goods Receipt Note (GRN)—adalah fondasi untuk efisiensi dan transparansi operasional. Setiap tahapan memiliki peran krusial dan saling terkait, memastikan setiap pengeluaran perusahaan memiliki dasar yang kuat dan dapat dipertanggungjawabkan. Tanpa alur yang jelas, organisasi berisiko mengalami kebocoran anggaran, salah pembelian, keterlambatan pengiriman, dan bahkan praktik tidak etis. Contoh konkret, sebuah rumah sakit yang tidak memiliki sistem PR yang terintegrasi mungkin menemukan bahwa dua departemen berbeda membeli item yang sama dalam jumlah besar secara terpisah, kehilangan potensi diskon volume dan menyebabkan penumpukan stok.

Purchase Requisition (PR) adalah dokumen internal yang dibuat oleh departemen yang membutuhkan barang atau jasa. Ini adalah langkah pertama yang secara resmi menginisiasi proses pengadaan. PR harus mencakup detail seperti jenis barang, kuantitas, spesifikasi, tujuan penggunaan, dan tanggal dibutuhkan. Misalnya, Departemen Radiologi membutuhkan 50 unit film X-ray dengan spesifikasi tertentu pada tanggal 15 Juli. PR ini akan diajukan ke manajer departemen untuk persetujuan awal, kemudian diteruskan ke departemen pengadaan. Sistem PR digital memastikan setiap permintaan terdokumentasi, dapat dilacak, dan melalui proses otorisasi yang sesuai dengan hierarki organisasi, mengurangi risiko pembelian yang tidak perlu atau di luar anggaran.

Request for Quotation (RFQ) adalah proses di mana departemen pengadaan mengundang beberapa vendor untuk mengajukan penawaran harga dan kondisi untuk barang atau jasa yang diminta dalam PR. RFQ yang efektif harus sangat detail, mencakup semua spesifikasi teknis, kuantitas, jadwal pengiriman, dan persyaratan garansi. Bayangkan Anda mengirim RFQ untuk pasokan 1000 liter cairan desinfektan ke tiga pemasok medis terkemuka: PT Medika Jaya, CV Sehat Selalu, dan PT Mitra Farmasi. Proses RFQ yang transparan dan kompetitif ini sangat penting untuk mendapatkan harga terbaik, memastikan kualitas, dan menghindari kolusi. Pencatatan semua penawaran secara digital memudahkan perbandingan dan audit di kemudian hari.

Purchase Order (PO) adalah dokumen resmi yang dibuat oleh pembeli kepada penjual, berisi detail produk, kuantitas, harga yang disepakati, syarat pembayaran, dan tanggal pengiriman. PO adalah kontrak hukum yang mengikat setelah diterima dan disetujui oleh vendor. Setelah RFQ dievaluasi dan vendor terbaik dipilih (misalnya, PT Medika Jaya karena menawarkan harga 5% lebih rendah dan garansi 2 tahun), PO akan diterbitkan. PO ini menjadi instruksi resmi kepada vendor untuk mengirimkan barang atau menyediakan jasa. Tanpa PO yang terstruktur, organisasi berisiko menerima barang yang salah atau tidak sesuai standar, serta menghadapi sengketa pembayaran yang rumit.

Goods Receipt Note (GRN), atau kadang disebut Goods Received Note, adalah dokumen yang dibuat saat barang atau jasa diterima. GRN mengonfirmasi bahwa barang yang dipesan telah tiba, sesuai dengan PO, dan dalam kondisi baik. Misalnya, saat 980 liter cairan desinfektan dari PT Medika Jaya tiba, staf gudang akan mencatatnya dalam GRN, mencocokkan dengan PO, dan mencatat selisih 20 liter jika ada. GRN menjadi bukti fisik penerimaan yang penting untuk proses pembayaran ke vendor dan pembaruan stok di sistem inventaris. Integrasi GRN dengan sistem akuntansi memastikan bahwa pembayaran hanya dilakukan untuk barang yang benar-benar diterima, mengurangi risiko pembayaran ganda atau untuk barang fiktif. Dengan implementasi keempat pilar ini, organisasi dapat mencapai akuntabilitas tinggi, efisiensi operasional yang signifikan, dan pengurangan biaya pengadaan hingga 8-12%.

Detail Implementasi Teknis Sistem Pengadaan

Implementasi sistem pengadaan yang efektif membutuhkan arsitektur teknis yang solid dan pemilihan teknologi yang tepat. Dalam konteks Nugroho Setiawan yang berpengalaman dengan ERP dan SIMRS, pendekatan modular berbasis web service sangat direkomendasikan. Kita akan membangun sistem ini menggunakan framework modern yang terbukti skalabel dan mudah dikelola. Untuk backend, kita bisa memanfaatkan Laravel 11.x (PHP 8.2+) yang menyediakan ekosistem kaya untuk pengembangan API RESTful dan manajemen database. Sebagai database, PostgreSQL 16 adalah pilihan superior karena keandalan, kemampuan penanganan data transaksional yang kuat, dan fitur JSONB untuk fleksibilitas skema. Untuk frontend, bisa menggunakan Vue.js 3 atau React 18, terintegrasi melalui API.

Arsitektur sistem akan terdiri dari beberapa modul utama: (1) Modul Pengadaan (inti PR, RFQ, PO, GRN), (2) Modul Master Data (Vendor, Item/Produk, Unit Pengukuran), (3) Modul Manajemen Pengguna & Peran, (4) Modul Laporan & Analitik, dan (5) Modul Integrasi. Modul Pengadaan akan mengelola siklus hidup setiap dokumen, dari pembuatan PR hingga penerimaan barang. Setiap dokumen akan memiliki status yang jelas (misalnya: Draft, Submitted, Approved, Rejected, In Progress, Completed) dan transisi status akan dikelola oleh sebuah workflow engine internal. Untuk otorisasi, kita akan menerapkan Role-Based Access Control (RBAC) yang ketat, di mana hanya pengguna dengan peran tertentu (misalnya, 'Manajer Departemen' atau 'Kepala Pengadaan') yang dapat menyetujui dokumen pada tahapan tertentu. Misalnya, PR hanya bisa disetujui oleh 'Manajer Departemen' terkait, sementara PO hanya bisa disetujui oleh 'Direktur Keuangan' jika nilainya di atas ambang batas tertentu (misalnya Rp 50.000.000).

Integrasi adalah kunci keberhasilan sistem ini. Sistem pengadaan harus mampu berkomunikasi dengan sistem lain seperti Sistem Informasi Manajemen Rumah Sakit (SIMRS) atau ERP yang sudah ada. Misalnya, setelah GRN disetujui, sistem pengadaan harus memicu pembaruan stok di modul inventaris SIMRS dan membuat entri hutang usaha di modul akuntansi ERP. Ini dapat dicapai melalui API RESTful. Untuk sistem SIMRS, Nugroho Setiawan memiliki pengalaman dengan integrasi BPJS/SatuSehat/FHIR. Meskipun FHIR (Fast Healthcare Interoperability Resources, versi R4 atau STU3) lebih fokus pada data klinis, prinsip interoperabilitasnya dapat diadopsi. Kita bisa mendefinisikan standar payload JSON untuk pertukaran data antara sistem pengadaan dan sistem lain. Contohnya, saat GRN selesai, sebuah event akan memicu panggilan API ke endpoint inventaris SIMRS dengan payload JSON berisi item yang diterima, kuantitas, dan lokasi gudang. Untuk notifikasi, dapat diintegrasikan dengan layanan email (misalnya, Postmark atau Mailgun) atau SMS gateway untuk pemberitahuan persetujuan atau penolakan dokumen.

Keamanan data juga menjadi prioritas utama. Semua komunikasi antar sistem harus menggunakan HTTPS. Autentikasi API dapat menggunakan token JWT (JSON Web Tokens) atau OAuth 2.0. Data sensitif seperti detail vendor atau harga item harus dienkripsi saat transit dan di-hash jika disimpan. Audit trail yang lengkap harus mencatat setiap aksi pengguna, termasuk siapa yang membuat, mengedit, atau menyetujui dokumen, beserta stempel waktu. Ini sangat penting untuk kepatuhan regulasi dan investigasi jika terjadi anomali. Misalnya, setiap perubahan status PR dari 'Submitted' menjadi 'Approved' harus mencatat ID pengguna yang menyetujui dan waktu persetujuan. Dengan pendekatan ini, sistem pengadaan tidak hanya efisien tetapi juga aman dan terintegrasi penuh dalam ekosistem IT organisasi.

Contoh Kode Implementasi Workflow Sederhana

Untuk memberikan gambaran konkret, mari kita lihat contoh implementasi sederhana menggunakan Laravel 11.x dan PostgreSQL 16. Kita akan fokus pada model untuk Purchase Requisition (PR) dan bagaimana kita dapat mengelola status serta persetujuan.

Model PurchaseRequisition di Laravel

Pertama, kita definisikan model `PurchaseRequisition` yang akan merepresentasikan permintaan pembelian di database. Ini mencakup atribut penting seperti item yang diminta, kuantitas, status, dan siapa yang meminta serta menyetujui.

<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Factories\HasFactory;use Illuminate\Database\Eloquent\Model;class PurchaseRequisition extends Model{    use HasFactory;    protected $fillable = [        'item_id',        'quantity',        'unit_price',        'total_amount',        'status', // e.g., 'draft', 'submitted', 'approved_manager', 'approved_procurement', 'rejected'        'requested_by_user_id',        'approved_by_manager_id',        'approved_by_procurement_id',        'request_date',        'needed_by_date',        'remarks'    ];    protected $casts = [        'request_date' => 'date',        'needed_by_date' => 'date',    ];    public function item()    {        return $this->belongsTo(Item::class);    }    public function requester()    {        return $this->belongsTo(User::class, 'requested_by_user_id');    }    public function managerApprover()    {        return $this->belongsTo(User::class, 'approved_by_manager_id');    }    public function procurementApprover()    {        return $this->belongsTo(User::class, 'approved_by_procurement_id');    }}

Penjelasan Kode: Model `PurchaseRequisition` ini mendefinisikan kolom-kolom penting untuk sebuah permintaan pembelian. Kolom `status` adalah kunci untuk mengelola alur kerja, dengan nilai-nilai seperti 'draft', 'submitted', 'approved_manager', 'approved_procurement', atau 'rejected'. Relasi `belongsTo` menghubungkan PR dengan `Item` yang diminta dan `User` yang mengajukan serta menyetujui. Kolom `item_id` akan merujuk ke tabel master `items`, `requested_by_user_id` ke tabel `users` (pengaju), dan seterusnya. Penggunaan `$fillable` mengizinkan mass assignment, sementara `$casts` memastikan kolom tanggal diinterpretasikan sebagai objek tanggal PHP.

Logika Persetujuan PR di Controller

Selanjutnya, mari kita lihat bagaimana sebuah PR dapat disetujui oleh seorang manajer. Ini akan menjadi metode dalam `PurchaseRequisitionController`.

<?phpnamespace App\Http\Controllers;use App\Models\PurchaseRequisition;use Illuminate\Http\Request;use Illuminate\Support\Facades\Auth;use Illuminate\Validation\ValidationException;class PurchaseRequisitionController extends Controller{    // ... other methods ...    public function approveByManager(Request $request, PurchaseRequisition $pr)    {        // 1. Authorization: Only managers can approve PRs        if (!Auth::user()->hasRole('manager')) {            throw ValidationException::withMessages([                'message' => 'Anda tidak memiliki otorisasi untuk menyetujui PR ini.'            ]);        }        // 2. Validate PR status: Only 'submitted' PRs can be approved        if ($pr->status !== 'submitted') {            throw ValidationException::withMessages([                'message' => 'PR ini tidak dalam status yang dapat disetujui oleh manajer.'            ]);        }        // 3. Update PR status and approver        $pr->update([            'status' => 'approved_manager',            'approved_by_manager_id' => Auth::id()        ]);        // 4. Optionally, dispatch an event for further actions (e.g., notify procurement)        // event(new PrManagerApproved($pr));        return response()->json([            'message' => 'Purchase Requisition berhasil disetujui oleh manajer.',            'pr' => $pr        ]);    }    // ... other methods ...}

Penjelasan Kode: Metode `approveByManager` ini bertanggung jawab untuk memproses persetujuan PR oleh manajer. Pertama, dilakukan otorisasi menggunakan `Auth::user()->hasRole('manager')` untuk memastikan hanya pengguna dengan peran 'manager' yang dapat melakukan tindakan ini. Jika tidak, akan dilempar `ValidationException`. Kedua, status PR divalidasi; hanya PR dengan status 'submitted' yang dapat disetujui oleh manajer. Ini mencegah persetujuan ganda atau PR yang sudah ditolak. Ketiga, jika validasi berhasil, status PR diperbarui menjadi 'approved_manager' dan `approved_by_manager_id` diisi dengan ID manajer yang sedang login. Terakhir, respons JSON dikirim kembali ke klien. Anda bisa menambahkan event dispatching (`event(new PrManagerApproved($pr));`) untuk memicu aksi lanjutan seperti mengirim notifikasi ke departemen pengadaan atau mencatat aktivitas di audit trail.

Contoh Payload Integrasi dan Penanganan Error

Dalam sistem yang terintegrasi, pertukaran data antar modul atau antar sistem adalah hal yang esensial. Mari kita ambil contoh payload JSON untuk membuat Purchase Order (PO) melalui API, serta bagaimana kita menangani error yang mungkin terjadi.

Contoh Payload JSON untuk Membuat Purchase Order

Misalkan setelah PR disetujui dan vendor dipilih, departemen pengadaan ingin membuat PO. Ini dapat dilakukan melalui endpoint API `/api/purchase-orders` dengan metode POST. Payload JSON akan terlihat seperti ini:

{  
Terakhir diperbarui 18 Jun 2026

Komentar

Komentar ditinjau sebelum tampil.

Belum ada komentar. Jadilah yang pertama!