Stock Opname
Prosedur perhitungan fisik stok barang secara berkala, penyesuaian selisih stok, dan pencatatan riwayat audit opname.
Gambaran Umum
Secanggih apa pun sebuah perangkat lunak kasir mencatat pergerakan barang, pada akhirnya data digital (stok di komputer) dan realitas fisik (stok di rak gudang) akan mengalami perbedaan. Selisih ini bisa disebabkan oleh banyak faktor yang tak terlihat oleh sistem: pencurian, kelalaian kasir yang lupa menginput pesanan, tikus yang merusak kemasan beras, atau penyusutan alami bahan baku cair.
Untuk menyeimbangkan kembali data sistem dengan realitas, dunia ritel dan F&B memiliki ritual wajib bernama “Stock Opname” (atau Inventory Audit). Stock Opname adalah prosedur di mana operasional (atau bagian gudang) secara fisik menghitung ulang semua barang yang ada dengan tangan mereka sendiri, lalu membandingkannya dengan catatan sistem. Jika ada selisih, sistem akan melakukan koreksi/penyesuaian (adjustment).
Dalam Temuya POS, fitur Stock Opname dirancang untuk membuat proses yang melelahkan ini menjadi lebih terstruktur, minim kesalahan input ganda, dan sepenuhnya tercatat (auditable). Fitur ini merubah kegiatan yang biasanya penuh coretan kertas buram menjadi alur digital sistematis yang dapat dilacak oleh manajer kapan saja.
Alur Kerja
Stock Opname biasanya dilakukan setelah toko tutup (Closing) atau di pagi buta sebelum toko buka. Hal ini karena jika ada transaksi penjualan yang berjalan saat perhitungan dilakukan, angkanya akan menjadi kacau dan berubah-ubah.
Skenario alur kerja standar tim gudang:
- Memulai Sesi (Draft/In Progress): Manajer gudang masuk ke sistem dan mengklik “Mulai Stock Opname Baru”. Sistem akan langsung membekukan status stok digital saat itu sebagai acuan (Snapshot) dan membuat nomor referensi sesi (misalnya:
SO-20231012). - Perhitungan Fisik: Manajer dapat mencetak lembar kerja dari sistem, atau menggunakan fitur ekspor ke Microsoft Excel (Template Opname). Template ini hanya berisi nama barang, SKU, dan kolom kosong untuk diisi angka hasil hitungan fisik. Staf lapangan kemudian berkeliling gudang dan menghitung barang: “Sirup Vanila ada 5 botol, Kopi Arabika sisa 2.5 Kg”, dan mencatatnya.
- Input Data ke Sistem: Lembar yang sudah terisi dibawa kembali ke komputer, atau file Excel hasil hitungan diimpor (Upload) kembali ke sistem POS.
- Kalkulasi Selisih (Variance): Sistem menyandingkan data. Misalnya: Sistem mencatat Sirup Vanila harusnya 7 botol, tapi fisik (hasil input Excel) hanya ada 5 botol. Sistem akan menyalakan tanda bahaya dan menampilkan tabel selisih (Variance) = -2 botol.
- Finalisasi & Koreksi Otomatis: Setelah manajer memvalidasi bahwa selisih -2 botol itu wajar (atau sudah diinvestigasi penyebab hilangnya), ia menekan tombol “Finalisasi Opname”. Pada titik inilah efek ajaib terjadi: Sistem secara otomatis membuat entri mutasi stok keluar (adjustment out) sebesar -2 botol ke kartu stok, sehingga stok akhir sistem sekarang resmi dan selaras dengan fisik: 5 botol.
stateDiagram-v2
[*] --> Draft : Manajer Buat Sesi Baru
Draft --> InProgress : Mulai Hitung Fisik\n(Ambil Snapshot Data Sistem)
InProgress --> InProgress : Staf Input Angka Fisik\n(Manual / Import Excel)
InProgress --> Reviewing : Proses Kalkulasi Selisih
Reviewing --> InProgress : Ada salah hitung,\nUlangi input
Reviewing --> Finalized : Manajer Setuju & Finalisasi Sesi
Finalized --> [*] : Sistem Otomatis\nUpdate Kartu Stok Akhir
Teknologi & Infrastruktur
Tantangan teknis utama dalam membangun fitur ini adalah “Waktu Berjalan”. Jika opname dilakukan di gudang besar dan memakan waktu 3 hari, stok sistem akan terus berubah karena ada penjualan di kasir depan.
Oleh karena itu, arsitektur kita memisahkan konsep “Stok Aktual” dan “Stok Hitungan Fisik” di dalam database. Ketika sesi Stock Opname dibuat, sistem menyimpan system_quantity_snapshot (jumlah di sistem tepat pada detik tombol ditekan) ke dalam tabel stock_opname_items. Ketika hasil perhitungan lapangan dimasukkan ke kolom actual_physical_quantity, selisih (Variance) dihitung dengan mengurangkan Actual dikurangi Snapshot.
Ketika difinalisasi, sistem backend tidak me-reset paksa jumlah current_stock utama dengan hasil hitungan fisik. Alih-alih, backend menghitung nilai Variance tersebut, lalu mengirimkan perintah mutasi (Adjust In/Out) sebesar jumlah variance ke modul Ledgers/Kartu Stok. Cara ini jauh lebih aman untuk integritas akuntansi karena jejak audit selisih tetap permanen terekam.
Proses import file hitungan (Excel) dilakukan secara asinkron (background job) pada arsitektur skala besar, untuk mencegah peramban web (browser) hang/timeout saat sistem mencerna file Excel berisi 10.000 baris inventori barang ritel.
Tabel Database Terkait
| Nama Tabel | Deskripsi | Kolom Penting |
|---|---|---|
stock_opnames | Menyimpan header atau sesi dari kegiatan opname. | id, reference_number, status (DRAFT, PROGRESS, FINALIZED), created_by, finalized_at |
stock_opname_items | Rincian setiap barang yang dihitung dalam satu sesi. | id, stock_opname_id, inventory_item_id, system_quantity_snapshot, actual_physical_quantity, variance, notes |
stock_ledgers | (Keterkaitan) Tempat sistem menyuntikkan hasil selisih di tahap final. | Menambah baris mutasi dengan transaction_type = 'ADJUSTMENT_OPNAME' |
Endpoint API
| Metode | Endpoint | Fungsi dan Kegunaan |
|---|---|---|
POST | /api/v1/stock-opname | Menginisiasi sesi baru dan mencatat snapshot stok sistem seluruh barang di toko. |
GET | /api/v1/stock-opname/:id/export | Men-generate file Excel kosong untuk diisi staf gudang. |
POST | /api/v1/stock-opname/:id/import | Mengunggah kembali Excel yang sudah diisi, memperbarui kolom angka fisik. |
PUT | /api/v1/stock-opname/:id/items | Endpoint untuk input hitungan fisik secara manual via antarmuka UI. |
POST | /api/v1/stock-opname/:id/finalize | Mengeksekusi penutupan sesi. Di titik ini backend membuat entri ledger penyesuaian ke tabel master stok. |
Keterkaitan dengan Fitur Lain
- Modul Kartu Stok (Ledgers): Stock Opname bertindak sebagai produsen pembuat mutasi penyesuaian (Adjustment) terbesar di kartu stok. Setiap kali opname ditutup, puluhan baris penyesuaian otomatis tercipta di riwayat kartu stok.
- Laporan Keuangan (P&L): Selisih barang yang hilang (Variance Negatif) selama opname bukan sekadar angka statistik. Kehilangan tersebut akan langsung dihitung valuasinya berdasarkan Harga Pokok Pembelian rata-rata, lalu dikirim ke laporan keuangan sebagai “Beban Kehilangan/Kerugian Inventori”, yang mengurangi total profit kotor bulan tersebut.
- Role & Hak Akses (Permissions): Karena fitur ini memanipulasi aset dasar perusahaan, tidak sembarang akun bisa menyetujui selisih yang hilang. Biasanya staf biasa hanya bisa menginput angka, sedangkan eksekusi “Finalisasi” terkunci rapat oleh validasi kode PIN atau persetujuan level Manajer/Owner.
Hal Penting yang Perlu Diketahui
- Partial Opname (Opname Parsial): Sistem mendukung opname per bagian. Toko ritel seringkali memiliki ribuan barang dan tidak mungkin menghitung semuanya dalam semalam. Manajer dapat memfilter kategori saat inisiasi sesi, misal “Hari ini kita hanya Stock Opname kategori Susu Formula”, membiarkan kategori barang lain tetap operasional tanpa ikut masuk ke snapshot.
- Investigasi Selisih Signifikan: Aplikasi frontend dirancang untuk menyorot baris data (highlight warna merah) jika ada Variance (selisih jumlah stok fisik vs sistem) yang jumlah atau nilai uangnya melebihi ambang batas toleransi (misal selisih lebih dari 10%). Ini memaksa tim lapangan untuk berbalik menghitung ulang rak tersebut sebelum manajer berani memfinalisasi hilangnya uang bernilai besar.
erDiagram
STOCK_OPNAMES ||--|{ STOCK_OPNAME_ITEMS : "memiliki detail hitungan"
STOCK_OPNAME_ITEMS }o--|| INVENTORY_ITEMS : "menghitung barang"
STOCK_OPNAMES {
string id PK
string reference_no "ex: SO-2023-11"
string status "DRAFT/FINAL"
datetime finalized_at
}
STOCK_OPNAME_ITEMS {
string id PK
string stock_opname_id FK
string inventory_item_id FK
decimal system_snapshot "Stok di komputer sblm mulai"
decimal physical_actual "Stok di lapangan hasil hitung"
decimal variance "Selisih (Actual - Snapshot)"
}
INVENTORY_ITEMS {
string id PK
string name "Barang"
}