tutorial

  1. Studi Kasus: Sistem Inventaris Barang

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:

EntitasField yang Relevan
Barangid, kode, nama, kategori, stok, harga_beli, harga_jual
Transaksiid, 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 🚀

comments powered by Disqus