Mini Sesi 2 — Stok & Purchasing untuk Retail/Grocery + POS

Sesi ini memandu Anda merancang proses purchasing (PO → GRN → Invoice/RTV) dan manajemen stok (receiving, putaway, lokasi, FEFO, transfer, penyesuaian, opname) yang rapi, dapat diaudit, dan sinkron dengan POS. Disertai template CSV PO/GRN/Transfer/Adjustment/Stock Take, SOP ringkas, rumus ROP–Safety Stock–EOQ, serta SQL contoh (fill rate, aging/expiry, selisih opname, kartu stok/ledger).

Grocery bergerak cepat: banyak SKU, volume transaksi tinggi, dan risiko shrink (selisih) dari expired hingga kerusakan. Kunci kendali ada pada alur pembelian yang disiplin dan stok yang terdokumentasi baik sejak barang masuk. Tujuan sesi ini: memberi kerangka operasional yang sederhana namun kuat sehingga keputusan Anda (harga, promosi, replenishment) berbasis data yang benar.

1. Desain Proses Purchasing (PO → GRN → Invoice/RTV)

1.1. Perencanaan & Otorisasi

  • Perencanaan: berbasis min–max/ROP, data penjualan, dan kalender promo.
  • Otorisasi: nilai PO ≥ ambang B harus disetujui manajer; simpan jejak persetujuan.

1.2. Purchase Order (PO)

  • Isi minimum: supplier, item (SKU), qty & UoM, harga beli, diskon dagang, tanggal kirim (ETA), lokasi tujuan.
  • PO final dikirim ke supplier (PDF/email); nomor PO bersifat unik dan berurutan.

1.3. Goods Receipt Note (GRN)

  • GRN mencocokkan barang datang dengan PO: qty, harga (jika ada), batch/lot & expiry untuk FEFO.
  • Selisih dicatat: short, over, atau damage; gunakan notifikasi ke purchasing untuk tindak lanjut.

1.4. Invoice & 3-Way Match

  • 3-Way Match: PO ↔ GRN ↔ Invoice. Hanya tagihan yang lolos kecocokan yang dibayar.
  • Termin pembayaran mengikuti master supplier (COD/7/14/30 hari).

1.5. RTV (Return to Vendor)

  • Barang rusak/salah kirim → RTV dengan referensi GRN/PO, volume, dan alasan yang jelas.

2. Receiving & Putaway (Lokasi, Label, FEFO)

2.1. Receiving

  • Periksa segel, hitung fisik, verifikasi suhu untuk cold chain.
  • Catat batch/lot & expiry pada saat masuk.

2.2. Putaway

  • Barang disalurkan ke lokasi: Backroom, Rak Display, Chiller/Freezer, Damage.
  • Gunakan label lokasi dan arahkan staf dengan pick/putaway list.

2.3. FEFO (First Expired, First Out)

  • Produk kadaluarsa mengikuti FEFO. Staf wajib merotasi display agar batch terdekat kadaluarsa berada di depan.
  • Monitor near-expiry (mis. 30/14/7 hari menuju kadaluarsa) untuk keputusan diskon/RTV.

3. Skema Lokasi & Penomoran Rak

  • Skema disarankan: AREA-RACK-SHELF-BIN (mis. BR-RA03-SH2-B04 untuk BackRoom, Rak 3, Shelf 2, Bin 4).
  • Lokasi khusus: DAM (Damage), RET (Return), HLD (Hold/QA), CHL (Chiller), FRZ (Freezer).

4. Perencanaan Replenishment (Min–Max, ROP, EOQ)

4.1. Min–Max

Set stok minimum dan maksimum per SKU per lokasi. Saat SOH ≤ min → buat PO hingga mendekati max.

4.2. ROP + Safety Stock

# ROP = (Permintaan Harian Rata-rata × Lead Time) + Safety Stock
# Safety Stock = Z × σ(LT) × D
# Z = faktor service level (1.65 ≈ 95%), σ(LT) = deviasi standar permintaan harian selama lead time, D = permintaan harian rata-rata

4.3. EOQ (Economic Order Quantity)

# EOQ = SQRT( (2 × D × K) / H )
# D = demand tahunan (unit)
# K = biaya pemesanan per PO
# H = biaya simpan per unit per tahun

Gunakan EOQ sebagai referensi; realistiskan dengan MOQ supplier dan kapasitas gudang.

5. Mutasi Stok: Transfer & Penyesuaian

5.1. Transfer Antarlokasi

  • Gunakan transfer order (TO) dengan lokasi sumber & tujuan, daftar SKU, dan qty.
  • Proses: issue dari sumber → in-transitreceive di tujuan (wajib ditutup).

5.2. Penyesuaian (Adjustment)

  • Kategori alasan (kode): WST (waste), EXP (expired), BRK (breakage), MSC (misc).
  • Semua penyesuaian harus ada reference, penanggung jawab, dan bukti.

6. Stock Opname & Cycle Count

6.1. Metode

  • Full count: seluruh SKU (1–2x/tahun).
  • Cycle count: giliran per kategori/lorong mingguan (disarankan untuk grocery).

6.2. Prosedur Singkat

  1. Bekukan transaksi atau tetapkan cut-off jelas.
  2. Generate daftar hitung (by lokasi atau kategori).
  3. Hitung fisik (dua tim bila mungkin), masukkan hasil ke sistem.
  4. Review selisih & buat jurnal koreksi dengan alasan.

7. Template CSV: PO/GRN/Transfer/Adjustment/Stock Take

7.1. Purchase Order (PO)

po_number,date,supplier,location,sku,order_qty,order_uom,unit_cost,discount_note,expected_date,notes
PO-2025-001,2025-11-25,PT Sumber Jaya,STORE-001,GRY-SNCK-INDO-CHIT-68G-0012,10,CTN,252000,Diskon 2% s.d. 10 ctn,2025-11-28,Promo awal bulan

7.2. GRN (Goods Receipt)

gr_number,date,po_number,location,sku,received_qty,receive_uom,unit_cost,batch,expiry,condition,notes
GR-2025-010,2025-11-28,PO-2025-001,STORE-001,GRY-SNCK-INDO-CHIT-68G-0012,10,CTN,252000,L2401,2026-01-31,OK,Sesuai PO

7.3. Transfer

transfer_number,date,from_location,to_location,sku,qty,uom,reason,notes
TF-2025-003,2025-12-02,BR-RA01,STORE-001,GRY-DRNK-UHT-INDO-250-0007,48,PCS,REPLEN,Replenish rak minuman

7.4. Adjustment

adj_number,date,location,sku,qty_change,uom,reason,ref_doc,notes
ADJ-2025-022,2025-12-05,STORE-001,GRY-SNCK-INDO-CHIT-68G-0012,-6,PCS,EXP,GR-2025-010,Expired saat audit

7.5. Stock Take (Hasil Hitung)

count_batch,date,location,sku,system_qty,uom,physical_qty,counter,remarks
STK-2025-W48,2025-11-30,STORE-001,GRY-DRNK-UHT-INDO-250-0007,240,PCS,238,Tim A,Rak bawah sulit diakses

8. SQL Contoh: Fill Rate, Aging/Expiry, Selisih Opname, Ledger

Catatan: sesuaikan nama tabel/kolom dengan sistem Anda. SQL di bawah bersifat generik untuk gudang data sederhana.

8.1. Supplier Fill Rate (berdasarkan GRN vs PO)

-- po_lines (po_number, sku, order_qty, expected_date, supplier)
-- grn_lines (gr_number, po_number, sku, received_qty, date)
SELECT
  p.supplier,
  p.sku,
  SUM(p.order_qty) AS ordered,
  SUM(COALESCE(g.received_qty,0)) AS received,
  ROUND(100.0 * SUM(COALESCE(g.received_qty,0)) / NULLIF(SUM(p.order_qty),0), 2) AS fill_rate_pct
FROM po_lines p
LEFT JOIN grn_lines g ON g.po_number = p.po_number AND g.sku = p.sku
GROUP BY p.supplier, p.sku
ORDER BY fill_rate_pct ASC;

8.2. Aging & Near-Expiry

-- stock_lots (sku, location, batch, expiry, qty, uom)
SELECT
  sku, location, batch, expiry, qty,
  CASE
    WHEN expiry IS NULL THEN 'NO EXPIRY'
    WHEN expiry < CURRENT_DATE THEN 'EXPIRED'
    WHEN expiry < CURRENT_DATE + INTERVAL '7 day' THEN 'D-7'
    WHEN expiry < CURRENT_DATE + INTERVAL '14 day' THEN 'D-14'
    WHEN expiry < CURRENT_DATE + INTERVAL '30 day' THEN 'D-30'
    ELSE 'OK'
  END AS expiry_bucket
FROM stock_lots
ORDER BY expiry NULLS LAST;

8.3. Selisih Opname

-- stock_count (count_batch, date, location, sku, physical_qty)
-- stock_balance_view (location, sku, system_qty)
SELECT
  c.location, c.sku,
  b.system_qty, c.physical_qty,
  (c.physical_qty - b.system_qty) AS diff_qty
FROM stock_count c
JOIN stock_balance_view b ON b.location = c.location AND b.sku = c.sku
ORDER BY ABS(c.physical_qty - b.system_qty) DESC;

8.4. Ledger Stok (Kartu Stok per SKU-Lokasi)

-- stock_moves(date, sku, location, qty_in, qty_out, cost_per_base, ref)
WITH m AS (
  SELECT date, sku, location, qty_in, qty_out, cost_per_base, ref FROM stock_moves
),
acc AS (
  SELECT
    sku,
    location,
    date,
    SUM(qty_in - qty_out) OVER (PARTITION BY sku, location ORDER BY date
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS saldo,
    AVG(NULLIF(cost_per_base,0)) OVER (PARTITION BY sku, location
      ORDER BY date ROWS UNBOUNDED PRECEDING) AS moving_avg_cost
  FROM m
)
SELECT date, sku, location, saldo, moving_avg_cost
FROM acc
ORDER BY sku, location, date;

9. SOP Ringkas Harian/Mingguan/Bulanan

9.1. Harian

  • Terima barang & catat batch/expiry; letakkan di lokasi yang benar (putaway).
  • Periksa near-expiry D-30/D-14/D-7; siapkan rencana diskon atau RTV.
  • Replenish rak berdasarkan min–max; catat transfer.

9.2. Mingguan

  • Cycle count kategori/lorong; tindak lanjuti selisih > ambang.
  • Tinjau fill rate supplier, waktu tunggu (lead time), dan kasus selisih berulang.

9.3. Bulanan

  • Audit stok dan penyesuaian; ulas shrink%.
  • Kalibrasi parameter ROP/EOQ berdasarkan data 3 bulan terakhir.

10. Checklist Implementasi

  • Definisikan kode alasan adjustment dan latih staf (WST/EXP/BRK/MSC).
  • Aktifkan batch & expiry untuk kategori berisiko (dairy, frozen, bakery).
  • Terapkan skema lokasi yang konsisten dan mudah dipahami.
  • Gunakan min–max atau ROP per SKU–lokasi; dokumentasikan parameternya.
  • Jalankan cycle count mingguan; simpan arsip selisih & tindakan korektif.
  • Monitor fill rate supplier; tindak lanjuti di vendor review bulanan.

Kesimpulan

Dengan alur PO → GRN → Invoice/RTV yang tertib, receiving yang mencatat batch/expiry, putaway ke lokasi yang jelas, serta disiplin FEFO dan cycle count, Anda membangun kontrol stok yang kuat. Tambahkan parameter min–max/ROP yang realistis dan evaluasi rutin terhadap supplier (fill rate, lead time), maka risiko out-of-stock dan shrink turun drastis—sementara keputusan pembelian menjadi cepat dan berbasis data yang konsisten.

Sumber/Referensi


Share the Post:

Related Posts