from model import ItemFactory
class ControllerPerpustakaan:
"""
Controller dalam MVC + Observer.
Tugasnya hanya memvalidasi input dan memanggil Model.
Update View terjadi otomatis via Observer pattern.
"""
def __init__(self, model, view):
self.model = model
self.view = view
# Registrasi View sebagai Observer dari Model
self.model.add_observer(self.view)
# Trigger refresh awal
self.model.refresh_data()
def force_refresh(self):
self.model.refresh_data()
def add_member(self, nama, alamat):
if not nama or not alamat:
self.view.show_message("Error", "Data tidak lengkap", True)
return
from model import Member
new_member = Member(nama, alamat)
self.model.add_member(new_member) # Model akan notify View
self.view.show_message("Sukses", f"Member {nama} berhasil ditambahkan")
self.view.clear_forms()
def add_item(self, tipe, item_id, judul, **kwargs):
if not item_id or not judul:
self.view.show_message("Error", "Data item tidak lengkap", True)
return
try:
new_item = ItemFactory.create_item(tipe, item_id, judul, **kwargs)
self.model.add_item(new_item) # Model akan notify View
self.view.show_message("Sukses", "Item berhasil ditambahkan")
self.view.clear_forms()
except Exception as e:
self.view.show_message("Error", str(e), True)
def pinjam_item(self, member_id, item_id):
if not member_id or not item_id:
self.view.show_message("Error", "Pilih Member dan Item", True)
return
try:
trx = self.model.create_transaction(member_id, item_id) # Model notify View
self.view.show_message("Sukses", f"Transaksi {trx.transaksi_id} dibuat")
self.view.clear_forms()
except ValueError as e:
self.view.show_message("Gagal", str(e), True)
except Exception as e:
self.view.show_message("Error", str(e), True)
def kembalikan_item(self, trx_id):
if not trx_id:
self.view.show_message("Error", "Pilih Transaksi", True)
return
try:
trx = self.model.return_transaction(trx_id) # Model notify View
denda = trx.denda
msg = "Pengembalian Sukses."
if denda > 0:
msg += f"\nTotal Denda: Rp{denda:,.2f}"
self.view.show_message("Sukses", msg)
self.view.clear_forms()
except ValueError as e:
self.view.show_message("Gagal", str(e), True)
def save_and_exit(self):
try:
self.model.save_data()
self.view.show_message("Info", "Data tersimpan. Keluar aplikasi.")
self.view.root.destroy()
except Exception as e:
self.view.show_message("Error", f"Gagal menyimpan: {e}", True)