96. Studi Kasus: Sistem Inventaris Barang
Inventarisasi merupakan komponen fundamental dalam banyak bisnis, mulai dari toko ritel kecil hingga perusahaan multinasional. Sistem Inventaris Barang yang terkelola dengan baik tidak hanya memperlancar rantai pasok, tetapi juga meminimalisir pemborosan dan kehilangan aset. Pada artikel ini, saya akan membahas sebuah studi kasus bagaimana merancang, mengimplementasikan, dan mensimulasikan Sistem Inventaris Barang sederhana dengan sudut pandang seorang engineer profesional.
Kita akan mengupas desain sistem, contoh implementasi kode berbasis Python (dengan SQLite sebagai storage), pendekatan data flow, serta simulasi sederhana. Mari kita mulai!
1. Analisis Kebutuhan Sistem
Sebelum menulis satu baris kode pun, penting untuk merumuskan skenario spesifik:
Kebutuhan Sistem Inventaris:
- Menyimpan data barang (nama, kode, kategori, stok, harga beli, harga jual)
- Mendata proses masuk (penambahan stok) dan keluar barang (penjualan/permintaan)
- Mencatat histori transaksi (log perubahan stok)
- Menyediakan laporan inventaris saat ini
Tabel berikut mendefinisikan kebutuhan dan field utama:
| Entitas | Field yang Relevan |
|---|---|
| Barang | id, kode, nama, kategori, stok, harga_beli, harga_jual |
| Transaksi | id, barang_id, jumlah, tipe (masuk/keluar), tanggal |
2. Desain Arsitektur Sederhana
Untuk studi kasus ini, kita akan menggunakan arsitektur sederhana monolith dengan database SQLite. Pertimbangkan skema berikut:
erDiagram
BARANG {
INT id PK
STRING kode
STRING nama
STRING kategori
INT stok
FLOAT harga_beli
FLOAT harga_jual
}
TRANSAKSI {
INT id PK
INT barang_id FK
INT jumlah
STRING tipe
DATE tanggal
}
BARANG ||--o{ TRANSAKSI: memiliki
3. Flow Operasional Sistem
Alur kerja tipikal sistem ini melibatkan berikut:
flowchart TD
A[User Input] --> B{Tambah Barang?}
B -- Ya --> C[Tambah Data Barang baru]
B -- Tidak --> D{Stok Masuk?}
D -- Ya --> E[Update Stok & Catat Transaksi Masuk]
D -- Tidak --> F{Stok Keluar?}
F -- Ya --> G[Cek Stok & Catat Transaksi Keluar]
F -- Tidak --> H[Laporan Inventaris]
E --> H
G --> H
C --> D
4. Implementasi Contoh Kode (Python + SQLite)
Berikut contoh sederhana menggunakan Python (via modul sqlite3):
a. Membuat Database dan Tabel
import sqlite3
conn = sqlite3.connect('inventaris.db')
c = conn.cursor()
# Membuat tabel barang
c.execute("""
CREATE TABLE IF NOT EXISTS barang (
id INTEGER PRIMARY KEY AUTOINCREMENT,
kode TEXT UNIQUE,
nama TEXT,
kategori TEXT,
stok INTEGER,
harga_beli REAL,
harga_jual REAL
)
""")
# Membuat tabel transaksi
c.execute("""
CREATE TABLE IF NOT EXISTS transaksi (
id INTEGER PRIMARY KEY AUTOINCREMENT,
barang_id INTEGER,
jumlah INTEGER,
tipe TEXT,
tanggal TEXT,
FOREIGN KEY (barang_id) REFERENCES barang(id)
)
""")
conn.commit()
b. Fungsi CRUD Dasar
Menambahkan Data Barang
def tambah_barang(kode, nama, kategori, stok, harga_beli, harga_jual):
c.execute("INSERT INTO barang (kode, nama, kategori, stok, harga_beli, harga_jual) VALUES (?, ?, ?, ?, ?, ?)",
(kode, nama, kategori, stok, harga_beli, harga_jual))
conn.commit()
Proses Stok Masuk/Keluar
from datetime import datetime
def transaksi_barang(kode, jumlah, tipe): # tipe: "masuk" atau "keluar"
c.execute("SELECT id, stok FROM barang WHERE kode=?", (kode,))
row = c.fetchone()
if not row:
print("Barang tidak ditemukan.")
return
barang_id, stok_sekarang = row
if tipe == "masuk":
stok_baru = stok_sekarang + jumlah
elif tipe == "keluar":
if stok_sekarang < jumlah:
print("Stok tidak cukup.")
return
stok_baru = stok_sekarang - jumlah
else:
print("Tipe transaksi tidak valid.")
return
# Update stok barang
c.execute("UPDATE barang SET stok=? WHERE id=?", (stok_baru, barang_id))
# Catat transaksi
tanggal = datetime.now().isoformat()
c.execute("INSERT INTO transaksi (barang_id, jumlah, tipe, tanggal) VALUES (?, ?, ?, ?)",
(barang_id, jumlah, tipe, tanggal))
conn.commit()
c. Menampilkan Laporan Inventaris
def laporan_inventaris():
print(f"{'Kode':<10} {'Nama':<20} {'Stok':<6} {'Harga Jual':<10}")
print("="*48)
for row in c.execute("SELECT kode, nama, stok, harga_jual FROM barang"):
print(f"{row[0]:<10} {row[1]:<20} {row[2]:<6} {row[3]:<10}")
5. Simulasi Penggunaan
Mari simulasikan skenario nyata:
# Tambah data barang
tambah_barang("A001", "Mouse Wireless", "Elektronik", 20, 35000, 50000)
tambah_barang("B002", "Keyboard USB", "Elektronik", 15, 50000, 75000)
# Stok masuk 10 mouse wireless
transaksi_barang("A001", 10, "masuk")
# Stok keluar 5 keyboard USB
transaksi_barang("B002", 5, "keluar")
# Cetak laporan
laporan_inventaris()
Output Simulasi:
Kode Nama Stok Harga Jual
================================================
A001 Mouse Wireless 30 50000.0
B002 Keyboard USB 10 75000.0
6. Diskusi: Praktik dan Challenge
Sistem di atas sudah bisa digunakan untuk kebutuhan dasar inventarisasi. Namun dalam penerapan nyata, ada beberapa tantangan engineering yang sering muncul, antara lain:
- Concurrency: Jika sistem multi-user, race condition bisa terjadi pada update stok, sehingga wajib implementasi locking atau transaction di DBMS.
- Audit Trail: Untuk compliance audit, jejak perubahan stok harus immutable (tidak bisa dihapus atau diubah).
- Notifikasi Otomatis: Sistem dapat dikembangkan untuk memperingatkan saat stok barang < threshold tertentu.
- Integrasi: Integrasi dengan e-commerce, ERP, dan akuntansi akan jauh meningkatkan value sistem.
7. Penutup
Membangun Sistem Inventaris Barang yang reliable bukan hanya perkara implementasi CRUD, tetapi juga memikirkan data integrity, scalability, dan kemudahan integrasi ke sistem lain. Studi kasus ini hanyalah pengantar sederhana. Jika ingin memperluas sistem, pertimbangkan untuk menggunakan pola Design Pattern (seperti Repository, CQRS), REST API, bahkan event sourcing di arsitektur microservices.
Semoga contoh kode serta alur studi kasus ini membantu, baik untuk Anda yang sedang belajar membangun sistem internal maupun skala enterprise. Jangan ragu mengembangkan serta menyesuaikan sesuai kebutuhan Anda!
Referensi:
Happy coding 🚀