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)