🐍
📝 Bagian 3 (Jobsheet Praktikum Terstruktur) • Modul JS-06
100% Standar Industri & Vokasi
Jobsheet 06: File Persistence & Mini Proyek
Praktikum terstruktur: Sistem pencatatan buku kas persisten berbasis file TXT/CSV, error handling proteksi input tidak valid, dan laporan ringkasan berkala.
1. Kompetensi Dasar & Capaian Akhir
Capaian Proyek Tingkat Akhir:
- Mampu merancang aplikasi CLI yang tahan banting terhadap error (crash-proof) dengan
try-except. - Menerapkan paradigma OOP untuk entitas
Produk,Keranjang, danTransaksi. - Menyimpan dan memuat katalog barang dari file
database_produk.json. - Mencetak struk belanja fisik dalam bentuk file teks
.txtsecara otomatis.
2. Aktivitas Terbimbing: Arsitektur Engine POS Kasir
Ketik dan jalankan kode fondasi berikut pada file capstone_pos.py:
python (capstone_pos.py)
import json
import os
from datetime import datetime
FILE_KATALOG = "katalog.json"
class Produk:
def __init__(self, kode: str, nama: str, harga: float, stok: int):
self.kode = kode
self.nama = nama
self.harga = harga
self.stok = stok
def to_dict(self):
return {"kode": self.kode, "nama": self.nama, "harga": self.harga, "stok": self.stok}
class TokoPOS:
def __init__(self):
self.katalog = {}
self.muat_katalog()
def muat_katalog(self):
if not os.path.exists(FILE_KATALOG):
# Data Awal Standar
default_data = {
"P01": {"kode": "P01", "nama": "Kopi Arabika 250g", "harga": 65000, "stok": 20},
"P02": {"kode": "P02", "nama": "Susu UHT 1 Liter", "harga": 22000, "stok": 15},
"P03": {"kode": "P03", "nama": "Roti Gandum", "harga": 18000, "stok": 10}
}
with open(FILE_KATALOG, "w", encoding="utf-8") as f:
json.dump(default_data, f, indent=4)
try:
with open(FILE_KATALOG, "r", encoding="utf-8") as f:
raw = json.load(f)
for k, v in raw.items():
self.katalog[k] = Produk(v["kode"], v["nama"], v["harga"], v["stok"])
except Exception as e:
print(f"[ERROR] Gagal membaca katalog: {e}")
def simpan_katalog(self):
data = {k: v.to_dict() for k, v in self.katalog.items()}
with open(FILE_KATALOG, "w", encoding="utf-8") as f:
json.dump(data, f, indent=4)
def tampilkan_katalog(self):
print("\n" + "="*50)
print(" KATALOG PRODUK TOKO ")
print("="*50)
print(f"{'KODE':<6} | {'NAMA PRODUK':<22} | {'HARGA':<10} | {'STOK':<4}")
print("-"*50)
for p in self.katalog.values():
print(f"{p.kode:<6} | {p.nama:<22} | Rp {p.harga:>7,.0f} | {p.stok:>4}")
print("="*50)
# Inisialisasi Engine
app_pos = TokoPOS()
app_pos.tampilkan_katalog()
3. Tugas Mandiri: Lengkapi Fitur Kasir & Cetak Struk
Tantangan Capstone: Sistem Kasir Full-Featured
Lengkapi class TokoPOS pada file capstone_pos.py dengan menambahkan alur transaksi penjualan:
Fitur yang Wajib Diimplementasikan:
- Keranjang Belanja: Kasir dapat memasukkan kode produk dan jumlah qty. Stok di katalog otomatis berkurang. Jika stok kurang, beri notifikasi error.
- Kalkulasi Diskon & Pajak (PPN 11%): Jika total belanja ≥ Rp 100.000, berikan diskon 5%. Tambahkan PPN 11% dari total setelah diskon.
- Input Pembayaran: Minta input nominal uang tunai pembeli. Hitung uang kembalian. Jika uang kurang, minta input ulang (looping validasi).
- Cetak Struk TXT Otomatis: Buat file teks
struk_YYYYMMDD_HHMMSS.txtyang memuat rincian transaksi kasir, tanggal, barang, total, bayar, dan kembalian. - Pencatatan Riwayat JSON: Catat data transaksi ke file
riwayat_transaksi.json.
Kriteria Keberhasilan: Program dapat melayani transaksi berkali-kali tanpa crash, stok barang ter-update permanen di file
katalog.json, dan file struk .txt berhasil terbuat di folder kerja.
4. Rubrik Penilaian Capstone
| Aspek Capaian | Bobot | Kriteria Sempurna |
|---|---|---|
| Integrasi OOP & Data Persisten | 30% | Model Class Produk & Toko mengelola data JSON secara sinkron. |
| Pencetakan Struk File Teks (.txt) | 25% | File struk dibuat dengan format rapi dan timestamp akurat. |
| Ketahanan Error (Exception Resilience) | 25% | Semua input salah (huruf pada nominal, kode salah) tertangani aman. |
| Alur Pengalaman Pengguna (CLI UX) | 20% | Menu kasir mudah digunakan, informatif, dan jelas. |