Optimalkan Stok: Konfigurasi Min-Max & Auto Purchase Request untuk Efisiensi
N
Back to Blog

Optimalkan Stok: Konfigurasi Min-Max & Auto Purchase Request untuk Efisiensi

Tutorial
Nugroho Setiawan 22 Jul 2026 8 min baca 1,745 kata 7 views
Pelajari cara konfigurasi min-max stock dan otomatisasi permintaan pembelian untuk SIMRS, klinik, dan ERP. Tingkatkan efisiensi, kurangi biaya, dan hindari stockout dengan panduan praktis ini.

Dalam operasional rumah sakit, klinik, atau bahkan rantai pasok dalam sistem ERP, manajemen stok yang tidak efisien adalah masalah krusial yang sering dihadapi. Bayangkan skenario di mana obat vital untuk pasien rawat inap tiba-tiba habis (stockout), atau sebaliknya, Anda memiliki stok berlebih yang menumpuk di gudang, menghabiskan modal dan ruang penyimpanan. Masalah ini diperparah dengan proses permintaan pembelian manual yang rentan kesalahan, memakan waktu, dan seringkali tidak responsif terhadap fluktuasi permintaan riil. Dampaknya bisa fatal: penundaan layanan pasien, kerugian finansial akibat kadaluarsa, atau hilangnya kesempatan penjualan. Oleh karena itu, adopsi sistem manajemen stok yang cerdas menjadi keharusan. Artikel ini akan memandu Anda secara mendalam tentang bagaimana mengimplementasikan konfigurasi min-max stock yang dilengkapi dengan fitur otomatisasi permintaan pembelian (auto purchase request). Kami akan membahas konsep dasar, detail implementasi teknis, contoh kode nyata, hingga praktik terbaik yang dapat Anda terapkan segera dalam sistem informasi Anda, baik itu SIMRS, SIM Klinik, atau modul ERP yang lebih luas, untuk mencapai efisiensi operasional dan akurasi data yang optimal.

Konsep Dasar Min-Max Stock dan Otomatisasi Permintaan Pembelian

Konsep manajemen stok Min-Max adalah strategi fundamental yang telah terbukti efektif dalam menjaga keseimbangan antara ketersediaan barang dan efisiensi biaya penyimpanan. Intinya, sistem ini menetapkan dua ambang batas utama untuk setiap item stok: level minimum (Min) dan level maksimum (Max). Level Min adalah titik pemicu di mana sistem harus melakukan pemesanan ulang untuk mencegah kekurangan stok (stockout). Sementara itu, level Max adalah jumlah stok target yang ingin dicapai setelah pemesanan ulang dilakukan. Misalnya, untuk obat Paracetamol di apotek rumah sakit, Anda mungkin menetapkan Min 50 box dan Max 200 box. Jika stok Paracetamol saat ini turun menjadi 40 box (di bawah Min), sistem akan memicu permintaan pembelian otomatis untuk 160 box (200 - 40) agar stok kembali ke level Max.

Penerapan Min-Max stock sangat krusial dalam lingkungan yang dinamis seperti fasilitas kesehatan. Dengan Min-Max, risiko stockout untuk obat-obatan esensial atau alat kesehatan vital dapat diminimalisir, memastikan bahwa layanan pasien tidak terganggu. Di sisi lain, overstocking, yang mengikat modal kerja dan meningkatkan biaya penyimpanan serta risiko kadaluarsa, juga dapat dihindari. Otomatisasi permintaan pembelian menjadi langkah logis berikutnya dalam evolusi manajemen stok. Alih-alih menunggu staf gudang atau apotek secara manual mengecek stok dan membuat formulir permintaan, sistem secara proaktif memantau level stok secara real-time. Ketika ambang batas Min terlampaui, sistem secara otomatis menghasilkan draf permintaan pembelian, lengkap dengan detail item, kuantitas yang dibutuhkan, dan bahkan rekomendasi supplier berdasarkan riwayat atau kontrak yang ada. Proses ini secara signifikan mengurangi beban kerja manual, meminimalisir kesalahan manusia, dan mempercepat siklus pengadaan.

Manfaat dari sistem Min-Max dengan auto purchase request ini sangat beragam. Pertama, peningkatan efisiensi operasional. Staf dapat fokus pada tugas-tugas bernilai lebih tinggi daripada sekadar memantau stok. Kedua, akurasi data yang lebih baik karena proses digerakkan oleh sistem, bukan interpretasi manual. Ketiga, penghematan biaya yang signifikan, baik dari pengurangan biaya penyimpanan akibat overstock maupun penghindaran kerugian akibat stockout atau kadaluarsa. Keempat, visibilitas inventaris yang lebih baik, memungkinkan manajemen membuat keputusan strategis berdasarkan data yang akurat dan terkini. Bagi SIMRS, SIM Klinik, atau ERP Poultry/Layer yang saya kembangkan, fitur ini adalah tulang punggung untuk operasional yang lancar, memastikan ketersediaan pakan dan obat ternak, atau ketersediaan obat dan alat medis untuk pasien.

Integrasi fitur ini dengan modul lain seperti Purchase Order (PO) dan modul keuangan akan menciptakan ekosistem manajemen rantai pasok yang terpadu. Ketika permintaan pembelian otomatis dibuat, sistem dapat langsung meneruskannya ke proses persetujuan elektronik (E-Office) dan kemudian secara otomatis menghasilkan PO kepada supplier yang telah ditentukan. Ini tidak hanya mempercepat proses pengadaan tetapi juga memastikan bahwa setiap transaksi tercatat dengan benar dalam buku besar akuntansi, memberikan laporan keuangan yang akurat dan real-time. Standar seperti FHIR R4 atau HL7 v2.5.1 dapat digunakan untuk pertukaran data stok dan pengadaan antar sistem yang berbeda dalam ekosistem kesehatan yang lebih luas, meskipun untuk internal ERP, RESTful API seringkali lebih praktis.

Detail Implementasi Teknis dalam Sistem Informasi

Implementasi sistem min-max stock dengan otomatisasi permintaan pembelian memerlukan desain arsitektur yang solid, terutama pada bagian skema database dan logika bisnis. Kita akan menggunakan contoh di mana sistem backend dibangun dengan PHP 8.2+ menggunakan framework Laravel 10.x atau 11.x, dan database relasional PostgreSQL 15 atau 16. Untuk sistem yang lebih besar dengan volume transaksi tinggi, Node.js 20 LTS dengan Express.js juga merupakan pilihan yang sangat baik, seringkali dipadukan dengan RabbitMQ atau Apache Kafka untuk antrean pesan.

Pertama, kita perlu mendefinisikan skema database yang relevan. Minimal, kita memerlukan tabel-tabel berikut:

  • products: Menyimpan informasi dasar produk. Kolom penting: id (PK), name, unit, min_stock_level (integer), max_stock_level (integer), supplier_id (FK ke tabel supplier), is_active.
  • stock_levels: Menyimpan level stok saat ini untuk setiap produk di setiap lokasi (jika ada multi-lokasi). Kolom penting: id (PK), product_id (FK), location_id (FK jika multi-lokasi), current_quantity (integer), last_updated_at.
  • purchase_requests: Menyimpan detail permintaan pembelian yang dibuat. Kolom penting: id (PK), product_id (FK), requested_quantity (integer), requested_by_user_id (FK), requested_at, status (e.g., 'pending', 'approved', 'rejected', 'ordered'), approved_by_user_id (FK), approved_at.
  • purchase_orders: Menyimpan detail PO yang dibuat dari PR. (Opsional, jika PR langsung jadi PO)

Logika inti sistem bekerja sebagai berikut:

  1. Pembaruan Stok: Setiap kali ada perubahan stok (penjualan, penggunaan, penerimaan barang, penyesuaian inventaris), sistem akan memicu pembaruan pada tabel stock_levels untuk produk dan lokasi yang relevan.
  2. Pengecekan Ambang Batas: Setelah current_quantity diperbarui, sistem akan membandingkannya dengan min_stock_level yang didefinisikan di tabel products.
  3. Pemicu Permintaan Pembelian: Jika current_quantity turun di bawah min_stock_level, sistem akan menghitung kuantitas yang perlu dipesan: quantity_to_order = product.max_stock_level - stock_level.current_quantity.
  4. Pembuatan Entri PR: Sebuah entri baru kemudian dibuat di tabel purchase_requests dengan product_id, requested_quantity, dan status 'pending'.
  5. Notifikasi dan Alur Persetujuan: Sistem akan mengirimkan notifikasi (email, push notification, atau pesan internal) kepada manajer pembelian atau pihak berwenang lainnya bahwa ada permintaan pembelian otomatis yang menunggu persetujuan. Proses persetujuan ini dapat diintegrasikan dengan modul E-Office untuk alur kerja yang lebih terstruktur.

Penting untuk mengimplementasikan mekanisme transaksi database yang kuat untuk memastikan integritas data. Misalnya, saat stok diperbarui dan PR dibuat, kedua operasi ini harus menjadi bagian dari satu transaksi atomik. Jika salah satu gagal, keduanya harus di-rollback. Untuk integrasi dengan sistem eksternal seperti BPJS atau SatuSehat, meskipun bukan langsung tentang stok, data konsumsi obat yang dihasilkan dari modul ini dapat dikirim melalui API berbasis FHIR R4, yang memerlukan implementasi HAPI FHIR 6.8 atau sejenisnya di sisi integrator.

Contoh Kode Implementasi

Berikut adalah contoh implementasi logika Min-Max Stock dan otomatisasi permintaan pembelian menggunakan Laravel 11.x (PHP) dan PostgreSQL 16. Kita akan asumsikan Anda memiliki model Eloquent untuk Product, StockLevel, dan PurchaseRequest.

Kode Block 1: Service untuk Memperbarui Stok dan Memicu Permintaan Pembelian (Laravel/PHP)

<?phpnamespace App\'Services;use App\Models\Product;use App\Models\StockLevel;use App\Models\PurchaseRequest;use Illuminate\Support\Facades\DB;class StockManagementService{    public function updateStockAndCheckMinMax(string $productId, int $quantityChange, string $locationId = 'main'): bool    {        DB::beginTransaction();        try {            $product = Product::findOrFail($productId);            $stockLevel = StockLevel::firstOrCreate([                'product_id' => $productId,                'location_id' => $locationId            ], [                'current_quantity' => 0            ]);            // Update stock quantity            $stockLevel->current_quantity += $quantityChange;            if ($stockLevel->current_quantity < 0) {                throw new \Exception('Insufficient stock for product ' . $product->name);            }            $stockLevel->save();            // Check Min-Max and create Purchase Request if needed            if ($stockLevel->current_quantity < $product->min_stock_level) {                $quantityToOrder = $product->max_stock_level - $stockLevel->current_quantity;                // Prevent creating duplicate pending PR for the same product in a short period                $existingPendingPR = PurchaseRequest::where('product_id', $productId)                                                    ->where('status', 'pending')                                                    ->first();                if (!$existingPendingPR) {                    PurchaseRequest::create([                        'product_id' => $productId,                        'requested_quantity' => $quantityToOrder,                        'requested_by_user_id' => auth()->id() ?? 1, // Or a system user ID                        'status' => 'pending'                    ]);                    // Optional: Log or send notification here                }            }            DB::commit();            return true;        } catch (\Exception $e) {            DB::rollBack();            // Log the error: Log::error($e->getMessage());            return false;        }    }}

Penjelasan Kode 1: Kode ini mendemonstrasikan sebuah service method `updateStockAndCheckMinMax` yang bertanggung jawab untuk memperbarui level stok suatu produk dan, jika perlu, memicu pembuatan permintaan pembelian. Metode ini menggunakan transaksi database (`DB::beginTransaction`, `DB::commit`, `DB::rollBack`) untuk memastikan bahwa semua operasi (pembaruan stok dan pembuatan PR) berjalan secara atomik. Jika stok turun di bawah batas minimum yang ditentukan pada model `Product`, sistem akan menghitung kuantitas yang diperlukan untuk mencapai level maksimum dan membuat entri baru di tabel `purchase_requests` dengan status 'pending'. Ada juga pengecekan dasar untuk mencegah stok menjadi negatif dan duplikasi PR yang masih pending.

Kode Block 2: Fungsi PostgreSQL untuk Pemicu Stok (Alternatif/Pelengkap)

CREATE OR REPLACE FUNCTION check_min_max_and_create_pr()RETURNS TRIGGER AS $$DECLARE    product_min_stock INTEGER;    product_max_stock INTEGER;    quantity_to_order INTEGER;    existing_pending_pr_count INTEGER;BEGIN    -- Get min_stock_level and max_stock_level for the product    SELECT min_stock_level, max_stock_level    INTO product_min_stock, product_max_stock    FROM products    WHERE id = NEW.product_id;    -- Check if current quantity is below min_stock_level    IF NEW.current_quantity < product_min_stock THEN        quantity_to_order := product_max_stock - NEW.current_quantity;        -- Check for existing pending purchase requests for this product        SELECT COUNT(*)        INTO existing_pending_pr_count        FROM purchase_requests        WHERE product_id = NEW.product_id AND status = 'pending';        -- If no pending PR, create one        IF existing_pending_pr_count = 0 THEN            INSERT INTO purchase_requests (product_id, requested_quantity, requested_by_user_id, requested_at, status)            VALUES (NEW.product_id, quantity_to_order, 1, NOW(), 'pending'); -- User ID 1 for system generated        END IF;    END IF;    RETURN NEW;END;$$ LANGUAGE plpgsql;-- Create a trigger that calls the function after an update on stock_levelsCREATE TRIGGER after_stock_level_updateAFTER UPDATE OF current_quantity ON stock_levelsFOR EACH ROWEXECUTE FUNCTION check_min_max_and_create_pr();

Penjelasan Kode 2: Ini adalah contoh fungsi dan trigger di PostgreSQL. Fungsi `check_min_max_and_create_pr` akan dieksekusi setiap kali kolom `current_quantity` di tabel `stock_levels` diperbarui. Fungsi ini mengambil `min_stock_level` dan `max_stock_level` dari tabel `products`, kemudian membandingkan stok saat ini (`NEW.current_quantity`) dengan batas minimum. Jika di bawah minimum dan belum ada permintaan pembelian 'pending' untuk produk tersebut, maka akan menyisipkan entri baru ke tabel `purchase_requests`. Pendekatan ini memindahkan sebagian logika bisnis langsung ke tingkat database, yang bisa sangat efisien untuk operasi stok berfrekuensi tinggi, namun perlu dikelola dengan hati-hati agar tidak terlalu kompleks.

Payload, Error Handling, dan Integrasi

Dalam sistem yang terintegrasi, pembaruan stok seringkali terjadi melalui API. Berikut adalah contoh payload JSON untuk endpoint API yang digunakan untuk mencatat transaksi stok, misalnya, setelah penjualan obat di apotek atau penggunaan alat medis di ruang operasi. Payload ini sangat penting untuk memastikan data yang dikirimkan terstruktur dan valid.

{  
Terakhir diperbarui 22 Jul 2026

Komentar

Komentar ditinjau sebelum tampil.

Belum ada komentar. Jadilah yang pertama!