{"id":27058873,"url":"https://github.com/kdandy/lendify","last_synced_at":"2025-04-05T12:17:28.895Z","repository":{"id":281902701,"uuid":"946819763","full_name":"kdandy/Lendify","owner":"kdandy","description":"Lendify adalah sistem manajemen perpustakaan berbasis Java yang menerapkan konsep Pemrograman Berorientasi Objek (OOP) dengan relasi agregasi, komposisi, dan inheritance. Sistem ini memungkinkan perpustakaan untuk mengelola koleksi buku, anggota, dan transaksi peminjaman dengan cara yang efisien.","archived":false,"fork":false,"pushed_at":"2025-03-24T15:16:47.000Z","size":994,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T16:27:41.990Z","etag":null,"topics":["book","booking","lendify"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kdandy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-11T18:14:27.000Z","updated_at":"2025-03-24T15:16:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"912b8eee-3fee-49ef-ba28-7078a1de87dc","html_url":"https://github.com/kdandy/Lendify","commit_stats":null,"previous_names":["kdandy/lendify"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdandy%2FLendify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdandy%2FLendify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdandy%2FLendify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kdandy%2FLendify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kdandy","download_url":"https://codeload.github.com/kdandy/Lendify/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247332564,"owners_count":20921854,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["book","booking","lendify"],"created_at":"2025-04-05T12:17:28.381Z","updated_at":"2025-04-05T12:17:28.880Z","avatar_url":"https://github.com/kdandy.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lendify\nLendify adalah sistem manajemen perpustakaan berbasis Java yang menerapkan konsep Pemrograman Berorientasi Objek (OOP) dengan relasi agregasi, komposisi, dan inheritance. Sistem ini memungkinkan perpustakaan untuk mengelola koleksi buku, anggota, dan transaksi peminjaman dengan cara yang efisien.\n\n## Fitur Utama\n- Manajemen anggota (reguler dan mahasiswa) dengan perbedaan hak dan batas peminjaman\n- Manajemen koleksi buku, salinan fisik (book items), dan kategori\n- Sistem peminjaman dan pengembalian buku dengan validasi status\n- Reservasi buku yang sedang dipinjam dengan sistem antrian\n- Perhitungan denda otomatis untuk keterlambatan pengembalian\n- Pencarian buku berdasarkan judul, pengarang, dan kategori\n- Pengelolaan akses pustakawan berbasis tingkat hak akses (BASIC, FULL, ADMIN)\n- Pengelolaan status buku (tersedia, referensi saja, dipinjam, rusak, hilang)\n- Perpanjangan masa peminjaman dengan validasi reservasi\n- Pembayaran denda keterlambatan\n- Pemantauan status anggota (aktif, tidak aktif, diblokir)\n- Pengelolaan tanggal kadaluarsa keanggotaan dengan perpanjangan\n\n## UML Class Diagram\n\n[Diagram Class Lendify](https://mermaid.live/view#pako:eNq1WuuOIrcSfpUWUiQmw7wAWkVigNklhwEEs6uco_1jGgOd7QvH3T1ZtMk8e3y_lhvIZufH0O0q21Wfy-Wqcn_rpdUO94a9NEd1PcnQgaDic5nQv59-SmblEZOsQWWKRdsKk7oqk3d_Pjwkz7jYYiLaxbNo3zTtDpdNjLzGhzZHxCbbo86zLUEkQ6UgaVHGVXGq6qzJKkkRjOfkZ93pPK7yHKeG5bGqvnA6e5g1uPDGHB0OBB9QOGYVChJMwZnYwGPU4ENFzmZO1aJZHBRU47xClpxMPIBk9VnjGpNXS1rxny-cgvCbaGN_D5uGZOUhyXZhW4kKHLai3Y7gug4Jp2NV4kVrFswm4gJluWm-F5L078KmbDdMRKcBl8C8yZlNgzWjarQHPOBmtuvfKZJLWdChY7SRmChGXplpYyxTpi5IrOXUtmqU77WyV4BxKSE8rUFeWyIIFKiPEJGvC8j3V2g-0swA8yk4ZWYb0YSad0I3TlY3hJsja_Dp-OspI2ePsq2qHKMyyeoR3UOvNklIsGlQ09ZJzX8s6pzO9aZ2xluylU8Bi7VH3qiI-sVm3FXtNsdJUzUof8pKXK-Qg6CQxDFg2XTidjyUm22gsYmY6LMkx0xp7UHI-FzAuMFpIAG6ApKRJLhubwEoI9sAuzwKV87mIu0LbADVvDbkLvuLgzDrIKD3rNXoZ2xGKArvHqEw4j9aa5BVKi-syUUg5E9RntKDqcFM4j6zsKF2zJDomt-oCaqYHnH6pWo5yuGwrrfnHQhuWlJy9pxSDE8o8wmdubSoqNqyUZOHfASX-A-hfn3MTv2iKpsjRSQrG4iZLSj25KV8wQEkcaDRQW7R-ta-czqFU7FNgr6y4Tl2VJyAyBSfoDNMH7eEqsahrccMAocL8HNObAK5u1owzIBDc4_oejfnkLDDJ0SaAtvSPVApkjNGZLlnc1q97h0ZHDfjUoR3UWY7MKKZY1KKBPmf7x1rYKll2iyNhPX43kYOG3N5T2KSGHmip4xx_NcIEFpEbUsQqAi6CCWQjyTEa0kXYgP2sKUNoPvXdgNg506QDdl5labtydvKJqI75dUZk4UbJZrDe0VwkbWFJZ0zn2PTLsW3QyMGZMO39h04optWLbE5Llxkl3qoeNhnBgZ59BzwUVw7kwBqw4GcNSmkGhwySjlOvs4_0uB0tgQ7VbTfQy7VzehM8Ph7lZWU7kWPMnCrEbWJsxP5yblpXFZkdc2Ss5N-tFTSjI6FmlY_vpNyW2mJlBcy1u8YZiB1Ugf4wBJ_mADqBW6XTxDNauR0MfqvBm04BN1w6cDohg2vxRIxYSBtEJRxYT1UYFNWkgfAg-GeENPFEh7XiHwJ6aA7zdpU_GaFR4NkiwgrpVgSulUH1RnMJXR87niUuhVRmO_5tnLgGyJJlTF1RZPtaUeXng9Z7itHuSZrcjtfb5tjRSyDpkhn9RETN1KInHPbHKVfKD8cnEABaVGJeFSDHmjvB8akSmlqfXNUGvVsZ8ivXVtGCWtHqVepMhmstsG3JFePdeBmzv3OAsrdv1YRMTKbzR3U2X5Q-YMyGKeqwbC2acxUbu1VU1tNj4_nF2blfcfW7Yz4Degy4juh726IS51UfbCfyoehUzYEusft0jKqb1DBRBRLwFqKmu8tkXJk2OZ7RieHbWBJpbucH93R7wOx-ndhtcGtNHhlg7EWxuHS0oa-2E1To96jk40OdXlZwKFv7ialfql0T9vVXjuKgnJW3m5OtjXy5fh_i8m5w3wB--PFdajeXG-BnIJvKsBX8n0DBIbqQPEyat6ecr_NcisoF69Tkp08z8q6lrxwutyv0AGD24GdJG9JRv_bZEZ5qkiBmmTPf-yuqDy0dLgklw8Wutzg7vwGBo7x2t9zqv6wkQc2hlYXBptkEEAIKxPYDDQE1Hbkk1-w3zwuYqeMcLyxE0q42Fhwq1TpZDAmAyY6E6Nx9FbBNh9wEGY_rsviFuUVQDhc_TsbPJdDwcdHCu2qlkja6w0es_BhBhzHkRMMiJo11IH9xPkt5DtCwtpdA8ACwT7uohgThUs9AvrQeEFuvQyAYXfmBNmF0NSLZi-xsw3wirIc0Vym08IiLprfKwJuWqYrnqfjwQJ8YaOEAKlrvMcElylelvnZz-ZPLT1nUI3hdP5EstQXI3YNJGXPq9QvXcVvlu6vyta8g1VQY75A-PahdbWrLmMUSHARyMMpemmzsgCDM_IVAy2WkJs7H4Ol52MkgJFKVtedUm3ZYx-pp-57GFdrYr91dxRqcgvpzOe9ix6jNry1lfbKjrr945X3Teqepx8hZWX_UqrpfDtwdb4Jhjz39lhesgh51-sTxktn5dV54C0OPwIWq2M4QMmCd-HVUh60J9wGNRnho3ixBbrH3sHNorQCe7R9VkZa3ZvmByZ-xNXdK_WuKf5A1859qKQkfRf3hnCBisUxCgrY9Uy6iGsNC0znt5URt_UkAbrs1gxuvp_Rs5v16bhK5tKwdel0LloutYK3uCIjasid1ctXTKiBwZ7WvZCGQMFfG1zu1ILs0FlHP85o4P2Qrn9BjsaqlTll-67t5YcOcpvogby9YkkQ2wJ29Q7aBTKVj36jEK-IX94iwPHuDt5RLdd2GujYaSoBN_SNgn_Xft2HPRJha6XfvcM0Icbi45NffjGE0fhl9mlq3mcLv2XzcbOaLibTiWl6nI_G_5nPNi-qseuGyLqluUagx9FmNjavTx_nc0vayfNs0XlEyNz9mpk-jNaT8fLTdG2aVqPVdP1IlTNN08fl0nodfZzMlqYJUlxVCa6RYbp4T3H8YOM_WS6mm9loYdp-Ha1GtM1ak6f1dDG2er2frp_tHsuXD0qtCE63mMin0Ww-epxb86-pNOtPtknMl1RE533zYt4mo-fR-y5jMSfjPzHa8fJ5NZ--2POzdZ18nEICdfvHG8Rg22K2eO8Y69NsPrflGI8W46nbNP1tNVtrMHqDHh27oOdMb9jjs37uNUdMI7_ekD7uEPnyufe5ZHw0Z6825zLtDRvS4kGPVO3h2BvuUV7TN3GdIz_pVSwnVP6vqgrNhHdZU5Fn-Q0w-_nrbylGt-g)\n\n## Struktur Class\n1. Person: Class dasar untuk Member dan Librarian, berisi informasi umum seperti nama dan kontak.\n2. Member: Mewakili anggota perpustakaan (extends Person), mengelola peminjaman dan reservasi.\n3. StudentMember: Jenis anggota mahasiswa (extends Member) dengan atribut khusus seperti ID mahasiswa dan fakultas.\n4. RegularMember: Jenis anggota reguler (extends Member) dengan atribut khusus seperti pekerjaan dan status premium.\n5. Librarian: Petugas perpustakaan (extends Person), mengelola operasi perpustakaan seperti peminjaman dan pengembalian.\n6. Library: Class utama yang mewakili perpustakaan, berisi koleksi dan data pustakawan.\n7. LibraryCollection: Mengelola koleksi buku dan kategori buku.\n8. Book: Mewakili informasi tentang buku seperti judul, pengarang, dan penerbit.\n9. BookItem: Mewakili salinan fisik dari buku (item yang dapat dipinjam).\n10. BookCategory: Mewakili kategori untuk mengelompokkan buku.\n11. BookLoan: Mewakili transaksi peminjaman buku oleh anggota.\n12. Reservation: Mewakili pemesanan buku yang sedang dipinjam.\n13. Main: Class utama yang berisi method main untuk menjalankan program.\n\n## Struktur Direktori\n```\nsrc/\n├── com/\n│   └── library/\n│       ├── enums/\n│       │   ├── BookFormat.java\n│       │   ├── BookStatus.java\n│       │   ├── Language.java\n│       │   ├── LibrarianPermission.java\n│       │   ├── LoanStatus.java\n│       │   ├── MemberStatus.java\n│       │   └── ReservationStatus.java\n│       ├── exception/\n│       │   ├── BookNotFoundException.java\n│       │   ├── InactiveAccountException.java\n│       │   ├── InvalidOperationException.java\n│       │   ├── MaxBooksReachedException.java\n│       │   └── ReferenceOnlyException.java\n│       ├── gui/\n│       │   ├── utils/\n│       │   │   ├── DialogUtils.java\n│       │   │   ├── GUIUtils.java\n│       │   │   └── TableModels.java\n│       │   ├── BookPanel.java\n│       │   ├── CategoryPanel.java\n│       │   ├── LendifyGUI.java\n│       │   ├── LibrarianPanel.java\n│       │   ├── LoanPanel.java\n│       │   ├── LoginPanel.java\n│       │   ├── MainPanel.java\n│       │   ├── MemberPanel.java\n│       │   ├── ReservationPanel.java\n│       │   ├── SearchPanel.java\n│       │   └── StatisticsPanel.java\n│       ├── model/\n│       │   ├── Book.java\n│       │   ├── BookCategory.java\n│       │   ├── BookItem.java\n│       │   ├── BookLoan.java\n│       │   ├── Library.java\n│       │   ├── LibraryCollection.java\n│       │   ├── Librarian.java\n│       │   ├── Member.java\n│       │   ├── Person.java\n│       │   ├── RegularMember.java\n│       │   ├── Reservation.java\n│       │   └── StudentMember.java\n│       └── Main.java\n├── .gitignore\n├── LICENSE\n└── README.md\n```\n\n## Cara Menjalankan Aplikasi\n1. Clone repositori:\n```bash\ngit clone https://github.com/kdandy/lendify.git\ncd lendify\n```\n\n2. Buat direktori untuk file hasil kompilasi:\n```bash\nmkdir -p bin\n```\n\n3. Kompilasi semua file Java:\n```bash\njavac -d bin src/com/library/enums/*.java src/com/library/exception/*.java src/com/library/model/*.java src/com/library/gui/*.java src/com/library/gui/utils/*.java src/com/library/Main.java\n```\n\n4. Jalankan program:\n```bash\njava -cp bin com.library.Main\n```\n\n## Penggunaan Interface Interaktif\n\nSetelah menjalankan program, Anda akan melihat tampilan menu utama. Berikut adalah panduan penggunaan interface interaktif:\n\n### Menu Utama\nMenu utama menampilkan berbagai opsi untuk mengelola perpustakaan:\n```\n==== MENU UTAMA ====\n1. Kelola Pustakawan\n2. Kelola Kategori Buku\n3. Kelola Buku\n4. Kelola Anggota\n5. Kelola Peminjaman dan Pengembalian\n6. Kelola Reservasi\n7. Cari Buku\n8. Lihat Statistik Perpustakaan\n9. Jalankan Demo Mode\n0. Keluar\n```\n\n### Demo Mode\nUntuk pengguna pertama kali, pilih opsi \"9. Jalankan Demo Mode\" untuk mengisi database dengan data sampel. Ini akan memungkinkan Anda untuk menguji fitur-fitur tanpa perlu membuat data manual.\n\n### Kelola Pustakawan\nMenu ini memungkinkan Anda untuk:\n- Melihat daftar pustakawan\n- Menambah pustakawan baru dengan tingkat akses berbeda (BASIC, FULL, ADMIN)\n- Mengubah informasi pustakawan\n- Menghapus pustakawan\n\n### Kelola Kategori Buku\nMenu ini memungkinkan Anda untuk:\n- Melihat daftar kategori\n- Menambah kategori baru\n- Mengubah informasi kategori\n- Menghapus kategori\n\n### Kelola Buku\nMenu ini memungkinkan Anda untuk:\n- Melihat daftar buku\n- Menambah buku baru\n- Menambah salinan buku (BookItem)\n- Mengubah informasi buku\n- Melihat detail buku termasuk salinan yang tersedia\n- Menghapus buku\n\n### Kelola Anggota\nMenu ini memungkinkan Anda untuk:\n- Melihat daftar anggota\n- Menambah anggota baru (mahasiswa atau reguler)\n- Mengubah informasi anggota\n- Melihat detail anggota termasuk peminjaman aktif\n- Memperpanjang keanggotaan\n- Mengaktifkan/menonaktifkan anggota\n\n### Kelola Peminjaman dan Pengembalian\nMenu ini memungkinkan Anda untuk:\n- Pinjamkan buku kepada anggota\n- Kembalikan buku\n- Lihat daftar peminjaman aktif\n- Lihat riwayat peminjaman\n- Perpanjang masa peminjaman\n\n### Kelola Reservasi\nMenu ini memungkinkan Anda untuk:\n- Membuat reservasi buku yang sedang dipinjam\n- Melihat daftar reservasi\n- Memproses reservasi ketika buku tersedia\n- Membatalkan reservasi\n\n### Cari Buku\nMenu ini memungkinkan Anda untuk mencari buku berdasarkan:\n- Judul\n- Pengarang\n- Kategori\n\n### Statistik Perpustakaan\nMenampilkan berbagai statistik perpustakaan seperti:\n- Jumlah buku\n- Jumlah anggota\n- Jumlah peminjaman aktif\n- Jumlah denda yang terkumpul\n\n## Contoh Penggunaan\nBerikut adalah contoh alur penggunaan dasar sistem Lendify:\n\n1. Jalankan program dan pilih mode demo (opsi 9) untuk mengisi database dengan data sampel.\n2. Tambahkan kategori buku menggunakan menu \"Kelola Kategori Buku\".\n3. Tambahkan buku dan salinannya menggunakan menu \"Kelola Buku\".\n4. Tambahkan anggota menggunakan menu \"Kelola Anggota\".\n5. Pinjamkan buku kepada anggota melalui menu \"Kelola Peminjaman dan Pengembalian\".\n6. Kembalikan buku yang dipinjam dan proses denda jika ada.\n7. Buat reservasi untuk buku yang sedang dipinjam menggunakan menu \"Kelola Reservasi\".\n\n## Exception Handling\nSistem ini menggunakan beberapa class exception khusus yang masing-masing menangani kesalahan spesifik:\n\n- BookNotFoundException: Dilemparkan ketika buku yang dicari tidak ditemukan dalam koleksi.\n- InactiveAccountException: Dilemparkan ketika operasi dilakukan pada akun anggota yang tidak aktif.\n- InvalidOperationException: Dilemparkan untuk operasi yang tidak valid (misalnya, ketika pustakawan tidak memiliki izin yang cukup).\n- MaxBooksReachedException: Dilemparkan ketika anggota mencoba meminjam buku melebihi batas maksimum yang diizinkan.\n- ReferenceOnlyException: Dilemparkan ketika mencoba meminjam buku yang hanya untuk referensi.\n\nSemua Class exception ini merupakan turunan dari class Exception Java standar, sehingga memiliki semua fungsionalitas dari Class tersebut seperti pesan kesalahan, stack trace, dll.\n\n### Exception Handling pada Method Peminjaman (checkoutBook)\nMethod checkoutBook di Class Member mengimplementasikan exception handling sebagai berikut:\n```bash\npublic BookLoan checkoutBook(BookItem book) throws InactiveAccountException, MaxBooksReachedException {\n    if (!isActive) {\n        throw new InactiveAccountException(\"Your account is not active. Please contact the librarian.\");\n    }\n    \n    if (getCurrentBooksCount() \u003e= getMaxBooks()) {\n        throw new MaxBooksReachedException(\"You have reached the maximum number of books that can be checked out.\");\n    }\n    \n    BookLoan loan = new BookLoan(this, book);\n    bookLoans.add(loan);\n    book.checkout();\n    return loan;\n}\n```\nMethod ini menangani dua kondisi error potensial:\n- Jika akun anggota tidak aktif, InactiveAccountException dilemparkan.\n- Jika anggota telah mencapai batas maksimum peminjaman buku, MaxBooksReachedException dilemparkan.\n\n### Exception Handling pada Method Pengembalian (returnBook)\nMethod returnBook di Class Librarian mengimplementasikan exception handling sebagai berikut:\n```bash\npublic void returnBook(BookLoan bookLoan) throws InvalidOperationException {\n    if (bookLoan.getStatus() != LoanStatus.ACTIVE \u0026\u0026 bookLoan.getStatus() != LoanStatus.OVERDUE) {\n        throw new InvalidOperationException(\"Cannot return a book that is not active or overdue: \" + bookLoan.getStatus());\n    }\n    \n    Member member = bookLoan.getMember();\n    member.returnBook(bookLoan);\n    \n    // Check if there are any reservations for this book\n    Book book = bookLoan.getBookItem().getBook();\n    for (Reservation reservation : book.getReservations()) {\n        if (reservation.getStatus() == ReservationStatus.PENDING) {\n            reservation.setStatus(ReservationStatus.FULFILLED);\n            break;\n        }\n    }\n}\n```\nMethod ini memeriksa apakah status peminjaman adalah ACTIVE atau OVERDUE. \nJika tidak, method melemparkan InvalidOperationException. \nIni memastikan bahwa hanya buku yang benar-benar dipinjam yang dapat dikembalikan.\n\n### Exception Handling pada Method Pembayaran Denda (payFine)\nMethod payFine di Class Member cukup sederhana dan tidak melemparkan exception secara langsung:\n```bash\npublic void payFine(double amount) {\n    totalFinesPaid += amount;\n}\n```\nMeskipun tidak ada exception khusus yang dilemparkan di sini, method ini dapat menjadi bagian dari blok try-catch yang lebih besar untuk menangani exception dari operasi database atau sistem eksternal dalam implementasi yang lebih kompleks.\n\n### Exception Handling pada Method Reservasi (reserveBook)\nMethod reserveBook di Class Member mengimplementasikan exception handling sebagai berikut:\n\n```bash\npublic Reservation reserveBook(Book book) throws InactiveAccountException {\n    if (!isActive) {\n        throw new InactiveAccountException(\"Your account is not active. Please contact the librarian.\");\n    }\n    \n    Reservation reservation = new Reservation(this, book);\n    reservations.add(reservation);\n    return reservation;\n}\n```\nMethod ini memeriksa apakah akun anggota aktif sebelum membuat reservasi. Jika tidak aktif, method melemparkan InactiveAccountException.\n\n### Exception Handling pada Method addBookItem di Librarian\nMethod addBookItem di class Librarian mengimplementasikan exception handling sebagai berikut:\n```bash\npublic BookItem addBookItem(Book book, String barcode) throws InvalidOperationException {\n    if (permission == LibrarianPermission.BASIC) {\n        throw new InvalidOperationException(\"You do not have permission to add book items. Required: FULL or ADMIN.\");\n    }\n    \n    BookItem bookItem = new BookItem(book, barcode);\n    book.addBookItem(bookItem);\n    return bookItem;\n}\n```\nMethod ini memeriksa apakah pustakawan memiliki izin yang cukup untuk menambahkan item buku. Jika pustakawan hanya memiliki izin BASIC, method melemparkan InvalidOperationException.\n\n### Try-Catch di Main Class\nClass Main menggunakan try-catch untuk menangani berbagai exception yang mungkin dilemparkan selama eksekusi program:\n```bash\ntry {\n    // Create a library\n    Library library = new Library(\"Perpustakaan Kota\", \"Jl. Utama No. 123, Kotaville\");\n    // ... rest of the code ...\n} catch (Exception e) {\n    System.out.println(\"Terjadi kesalahan: \" + e.getMessage());\n    e.printStackTrace();\n}\n```\nBlok try-catch ini melingkupi seluruh kode utama, memastikan bahwa program tidak akan crash akibat exception yang tidak tertangani. Jika terjadi exception, pesan kesalahan akan ditampilkan dan stack trace akan dicetak untuk membantu debugging.\n\n### Nested Try-Catch untuk Operasi Spesifik\nClass Main juga menggunakan nested try-catch untuk menangani exception yang mungkin terjadi dalam operasi tertentu:\n```bash\ntry {\n    BookLoan loan1 = assistantLibrarian.issueBook(regularMember, book1Copy1);\n    System.out.println(\"Meminjamkan '\" + book1.getTitle() + \"' kepada \" + regularMember.getName());\n    System.out.println(\"  Tanggal jatuh tempo: \" + dateFormat.format(loan1.getDueDate()));\n    \n    // ... more code ...\n    \n    // Try to issue reference book (should throw exception)\n    try {\n        BookLoan loan3 = assistantLibrarian.issueBook(studentMember, book2Copy3);\n    } catch (ReferenceOnlyException e) {\n        System.out.println(\"Pengecualian: \" + e.getMessage());\n    }\n    \n    // ... rest of the code ...\n} catch (Exception e) {\n    System.out.println(\"Terjadi kesalahan: \" + e.getMessage());\n    e.printStackTrace();\n}\n```\nDalam contoh ini, ada try-catch bersarang yang spesifik menangani ReferenceOnlyException saat mencoba meminjam buku referensi. Ini memungkinkan program untuk menangani kesalahan ini secara khusus dan melanjutkan eksekusi, sementara exception lain akan ditangani oleh try-catch luar.\nContoh lain nested try-catch adalah saat memproses reservasi:\n```bash\ntry {\n    assistantLibrarian.processReservation(reservation);\n    System.out.println(\"Reservasi diproses untuk \" + studentMember.getName());\n    System.out.println(\"Buku '\" + book2.getTitle() + \"' telah dipinjamkan\");\n    System.out.println(\"Status Reservasi: \" + reservation.getStatus());\n} catch (InvalidOperationException e) {\n    System.out.println(\"Tidak dapat memproses reservasi: \" + e.getMessage());\n}\n```\nIni menangani InvalidOperationException yang mungkin dilemparkan saat mencoba memproses reservasi. Jika gagal, program akan menampilkan pesan kesalahan spesifik tetapi tetap berjalan.\n\n### Penggunaan Reflection dengan Exception Handling\nClass Main juga menggunakan exception handling saat memanipulasi tanggal menggunakan reflection API:\n```bash\ntry {\n    java.lang.reflect.Field issueDateField = BookLoan.class.getDeclaredField(\"issueDate\");\n    issueDateField.setAccessible(true);\n    issueDateField.set(loan1, pastCalendar.getTime());\n    \n    java.lang.reflect.Field dueDateField = BookLoan.class.getDeclaredField(\"dueDate\");\n    dueDateField.setAccessible(true);\n    \n    Calendar dueDateCalendar = Calendar.getInstance();\n    dueDateCalendar.setTime(pastCalendar.getTime());\n    dueDateCalendar.add(Calendar.DAY_OF_MONTH, regularMember.getMaxLoanDays());\n    dueDateField.set(loan1, dueDateCalendar.getTime());\n} catch (Exception e) {\n    System.out.println(\"Tidak dapat mensimulasikan buku terlambat: \" + e.getMessage());\n}\n```\n\n## Penjelasan Relasi Antar Class\n### Relasi Inheritance (Pewarisan)\n1. Person ← Member\n```bash\nJenis Relasi: Inheritance\nMultiplicity: 1:1 (Setiap Member adalah tepat satu Person)\nNavigability: Unidirectional dari Member ke Person\nPenjelasan: Member adalah jenis spesifik dari Person. Member mewarisi semua atribut dan perilaku dari Person, seperti nama, alamat, dan informasi kontak, namun memiliki atribut dan metode tambahan terkait keanggotaan seperti tanggal pendaftaran dan tanggal kedaluwarsa.\n```\n2. Member ← StudentMember\n```bash\nJenis Relasi: Inheritance\nMultiplicity: 1:1 (Setiap StudentMember adalah tepat satu Member)\nNavigability: Unidirectional dari StudentMember ke Member\nPenjelasan: StudentMember adalah jenis spesifik dari Member. StudentMember memiliki atribut dan metode tambahan yang berkaitan dengan mahasiswa, seperti NIM, fakultas, dan jurusan.\n```\n3. Member ← RegularMember\n```bash\nJenis Relasi: Inheritance\nMultiplicity: 1:1 (Setiap RegularMember adalah tepat satu Member)\nNavigability: Unidirectional dari RegularMember ke Member\nPenjelasan: RegularMember adalah jenis spesifik dari Member. RegularMember memiliki atribut dan metode tambahan yang berkaitan dengan anggota umum, seperti pekerjaan dan status premium.\n```\n4. Person ← Librarian\n```bash\nJenis Relasi: Inheritance\nMultiplicity: 1:1 (Setiap Librarian adalah tepat satu Person)\nNavigability: Unidirectional dari Librarian ke Person\nPenjelasan: Librarian adalah jenis spesifik dari Person. Librarian memiliki atribut dan metode tambahan yang berkaitan dengan tugas sebagai pustakawan, seperti ID staf, posisi, dan wewenang.\n```\n### Relasi Composition (Komposisi)\n1. Library → LibraryCollection\n```bash\nJenis Relasi: Composition\nMultiplicity: 1:1 (Setiap Library memiliki tepat satu LibraryCollection)\nNavigability: Unidirectional dari Library ke LibraryCollection\nPenjelasan: LibraryCollection adalah bagian yang tidak terpisahkan dari Library. LibraryCollection tidak dapat ada tanpa Library. Jika Library dihapus, maka LibraryCollection juga dihapus.\n```\n2. Book → BookItem\n```bash\nJenis Relasi: Composition\nMultiplicity: 1:* (Setiap Book dapat memiliki banyak BookItem)\nNavigability: Unidirectional dari Book ke BookItem\nPenjelasan: BookItem adalah bagian yang tidak terpisahkan dari Book. BookItem merepresentasikan salinan fisik dari sebuah buku. Satu buku dapat memiliki beberapa salinan fisik. Jika Book dihapus, maka semua BookItem terkait juga dihapus.\n```\n### Relasi Aggregation (Agregasi)\n1. Library ○─ Librarian\n```bash\nJenis Relasi: Aggregation\nMultiplicity: 1:* (Setiap Library dapat memiliki banyak Librarian)\nNavigability: Unidirectional dari Library ke Librarian\nPenjelasan: Library memiliki Librarian, tetapi Librarian dapat ada tanpa Library tertentu. Librarian dapat dipindahkan ke Library lain tanpa mempengaruhi eksistensinya.\n```\n2. LibraryCollection ○─ BookCategory\n```bash\nJenis Relasi: Aggregation\nMultiplicity: 1:* (Setiap LibraryCollection dapat memiliki banyak BookCategory)\nNavigability: Unidirectional dari LibraryCollection ke BookCategory\nPenjelasan: LibraryCollection memiliki BookCategory, tetapi BookCategory dapat ada tanpa LibraryCollection tertentu. BookCategory dapat digunakan di LibraryCollection lain.\n```\n3. BookCategory ○─ Book\n```bash\nJenis Relasi: Aggregation\nMultiplicity: 1:* (Setiap BookCategory dapat memiliki banyak Book)\nNavigability: Unidirectional dari BookCategory ke Book\nPenjelasan: BookCategory memiliki Book, tetapi Book dapat ada tanpa dikategorikan. Book dapat masuk ke dalam beberapa kategori dan dapat dipindahkan antar kategori.\n```\n4. Member ○─ BookLoan\n```bash\nJenis Relasi: Aggregation\nMultiplicity: 1:* (Setiap Member dapat memiliki banyak BookLoan)\nNavigability: Unidirectional dari Member ke BookLoan\nPenjelasan: Member memiliki BookLoan yang merepresentasikan peminjaman buku. Member dapat meminjam banyak buku, dan catatan peminjaman (BookLoan) tetap ada bahkan setelah buku dikembalikan untuk tujuan pencatatan.\n```\n5. BookItem ○─ BookLoan\n```bash\nJenis Relasi: Aggregation\nMultiplicity: 1:* (Setiap BookItem dapat terlibat dalam banyak BookLoan seiring waktu)\nNavigability: Unidirectional dari BookItem ke BookLoan\nPenjelasan: BookItem terkait dengan BookLoan yang merepresentasikan peminjaman. Satu BookItem dapat dipinjam berkali-kali oleh anggota yang berbeda seiring waktu.\n```\n6. Member ○─ Reservation\n```bash\nJenis Relasi: Aggregation\nMultiplicity: 1:* (Setiap Member dapat memiliki banyak Reservation)\nNavigability: Unidirectional dari Member ke Reservation\nPenjelasan: Member dapat membuat reservasi untuk buku yang sedang dipinjam. Member dapat membuat banyak reservasi untuk buku yang berbeda.\n```\n\n## Author\n### Kelompok 2 Kelas B Pemrograman Berorientasi Objek(PBO) - Lendify (Sistem Peminjaman Buku di Perpustakaan)\n- Nama    : Dandy Faishal Fahmi         - 24060123140136\n- Nama    : Fauzan Hadi                 - 24060123140176\n- Nama    : Gaza Al-ghazali Chansa      - 24060123140183\n- Nama    : Diva Arvis Permata          - 24060123130102\n- Nama    : Ganendra Dzahwan Yulianto   - 24060123140148\n\n\n## Kontribusi\nKontribusi sangat diterima! Silakan buat pull request atau buka issue untuk diskusi.\n\n## Lisensi\n[MIT License](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkdandy%2Flendify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkdandy%2Flendify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkdandy%2Flendify/lists"}