🐍 📝 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, dan Transaksi.
  • Menyimpan dan memuat katalog barang dari file database_produk.json.
  • Mencetak struk belanja fisik dalam bentuk file teks .txt secara 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:
  1. Keranjang Belanja: Kasir dapat memasukkan kode produk dan jumlah qty. Stok di katalog otomatis berkurang. Jika stok kurang, beri notifikasi error.
  2. Kalkulasi Diskon & Pajak (PPN 11%): Jika total belanja ≥ Rp 100.000, berikan diskon 5%. Tambahkan PPN 11% dari total setelah diskon.
  3. Input Pembayaran: Minta input nominal uang tunai pembeli. Hitung uang kembalian. Jika uang kurang, minta input ulang (looping validasi).
  4. Cetak Struk TXT Otomatis: Buat file teks struk_YYYYMMDD_HHMMSS.txt yang memuat rincian transaksi kasir, tanggal, barang, total, bayar, dan kembalian.
  5. 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.