A. Entity Relationship Diagram (ERD)
ER Diagram ngegambarin struktur data sistem — entitasnya apa aja, atributnya apa, sama relasi antar entitasnya gimana.
erDiagram
Anggota ||--o{ Peminjaman : "melakukan (1:N)"
Buku ||--o{ Peminjaman : "terdiri dari (1:N)"
Anggota {
string Kd_Anggota PK
string Nm_Anggota
date Tgl_Lahir
date Tgl_Daftar
}
Buku {
string Kd_Buku PK
string Judul
string Penerbit
string Pengarang
int Stok
}
Peminjaman {
string No_Pinjam PK
string Kd_Anggota FK
string Kd_Buku FK
date Tgl_Pinjam
date Tgl_Kembali
}
Penjelasan Relasi
- Anggota → Peminjaman (1:N): Satu anggota bisa minjem berkali-kali (banyak transaksi). Tapi setiap transaksi peminjaman ya cuma buat satu anggota doang.
- Buku → Peminjaman (1:N): Satu buku bisa muncul di banyak catatan peminjaman (dipinjem berkali-kali). Tapi setiap catatan peminjaman cuma ngerujuk ke satu buku.
📊
ER Diagram — Notasi Alternatif (Crow's Foot)
Versi alternatif ER diagram pake notasi crow's foot: Anggota 1---N Peminjaman N---1 Buku
B. Kamus Data (Data Dictionary)
B.1 Struktur Data Store
Data Store: Anggota
| Field | Tipe | Panjang | Constraint | Deskripsi |
| Kd_Anggota | String | 10 | Primary Key | Kode unik anggota (auto-generated, format: AGT-001) |
| Nm_Anggota | String | 100 | Not Null | Nama lengkap anggota |
| Tgl_Lahir | Date | — | Not Null | Tanggal lahir anggota |
| Tgl_Daftar | Date | — | Default: today | Tanggal pendaftaran anggota |
Data Store: Buku
| Field | Tipe | Panjang | Constraint | Deskripsi |
| Kd_Buku | String | 10 | Primary Key | Kode unik buku (BKU-001) |
| Judul | String | 200 | Not Null | Judul buku |
| Penerbit | String | 100 | Not Null | Nama penerbit |
| Pengarang | String | 100 | Not Null | Nama pengarang |
| Stok | Integer | — | ≥ 0 | Jumlah buku tersedia (ngurang kalo ada yang minjem) |
Data Store: Peminjaman
| Field | Tipe | Panjang | Constraint | Deskripsi |
| No_Pinjam | String | 15 | Primary Key | Nomor transaksi peminjaman (format: PJM-YYYYMMDD-001) |
| Kd_Anggota | String | 10 | Foreign Key | Mereferensi ke Anggota(Kd_Anggota) |
| Kd_Buku | String | 10 | Foreign Key | Mereferensi ke Buku(Kd_Buku) |
| Tgl_Pinjam | Date | — | Default: today | Tanggal peminjaman |
| Tgl_Kembali | Date | — | Tgl_Pinjam + 7 hari | Tanggal jatuh tempo pengembalian |
B.2 Spesifikasi Data Flow
| Data Flow | Dari | Ke | Komposisi |
| Id-Anggota | Anggota | Proses 1.1 | Kd_Anggota |
| Kartu Anggota | Proses 1.3 | Anggota | Kd_Anggota + Nm_Anggota + Tgl_Daftar |
| Id-buku | Bag. Pengadaan | Proses 2.0 | Kd_Buku + Judul + Penerbit + Pengarang + Stok |
| Info Status Buku | Proses 3.0 | Anggota | Kd_Buku + Judul + Stok + Status (Tersedia/Tidak) |
| Kd-Buku Pinjaman | Anggota | Proses 4.1 | Kd_Buku + Kd_Anggota |
| Bukti Pinjaman | Proses 4.2 | Anggota | No_Pinjam + Kd_Anggota + Kd_Buku + Tgl_Pinjam + Tgl_Kembali |
| Daftar Pengeluaran Buku | Proses 5.2 | Bag. Pengadaan | Kd_Buku + Judul + Jumlah_Dipinjam + Sisa_Stok (periode) |
| Laporan Peminjaman | Proses 5.1 | Pimpinan | No_Pinjam + Nm_Anggota + Judul + Tgl_Pinjam (periode) |
C. Spesifikasi Proses (Process Specifications)
Dibawah ini spesifikasi logika prosesnya, pake structured English / pseudocode biar jelas alurnya.
PSPEC 2.0 — Rekam Data Buku
PROCEDURE Rekam_Data_Buku
INPUT: Id_buku (dari Bag. Pengadaan)
OUTPUT: Konfirmasi pencatatan
BEGIN
IF Id_buku.Kd_Buku IS NULL OR Id_buku.Judul IS NULL THEN
DISPLAY "Error: Data buku ga lengkap"
EXIT
END IF
READ Buku WHERE Kd_Buku = Id_buku.Kd_Buku
IF FOUND THEN
Buku.Stok = Buku.Stok + Id_buku.Stok
DISPLAY "Stok buku berhasil ditambahin"
ELSE
INSERT INTO Buku
VALUES (Id_buku.Kd_Buku, Id_buku.Judul,
Id_buku.Penerbit, Id_buku.Pengarang, Id_buku.Stok)
DISPLAY "Buku baru berhasil direkam"
END IF
END
PSPEC 4.1 — Rekam Peminjaman
PROCEDURE Rekam_Peminjaman
INPUT: Id-Anggota, Kd-Buku Pinjaman (dari Anggota)
OUTPUT: Data peminjaman (ke Proses 4.2 dan 4.3)
BEGIN
READ Anggota WHERE Kd_Anggota = Id_Anggota
IF NOT FOUND THEN
DISPLAY "Error: Anggota ga terdaftar"
EXIT
END IF
READ Buku WHERE Kd_Buku = Kd_Buku_Pinjaman
IF NOT FOUND THEN
DISPLAY "Error: Buku ga ketemu"
EXIT
END IF
IF Buku.Stok <= 0 THEN
DISPLAY "Error: Stok buku abis"
EXIT
END IF
No_Pinjam = "PJM-" + TODAY() + "-" + SEQUENCE()
Tgl_Pinjam = TODAY()
Tgl_Kembali = Tgl_Pinjam + 7
INSERT INTO Peminjaman
VALUES (No_Pinjam, Id_Anggota, Kd_Buku_Pinjaman,
Tgl_Pinjam, Tgl_Kembali)
SEND dt_Peminjaman TO Proses 4.2
SEND Kd_Buku_Pinjaman TO Proses 4.3
END
PSPEC 5.1 — Cetak Laporan Peminjaman
PROCEDURE Cetak_Laporan_Peminjaman
INPUT: Periode (tanggal awal, tanggal akhir)
OUTPUT: Laporan Peminjaman (ke Pimpinan)
BEGIN
IF Tgl_Awal > Tgl_Akhir THEN
DISPLAY "Error: Periode ga valid"
EXIT
END IF
READ Peminjaman, Anggota, Buku
WHERE Peminjaman.Kd_Anggota = Anggota.Kd_Anggota
AND Peminjaman.Kd_Buku = Buku.Kd_Buku
AND Peminjaman.Tgl_Pinjam BETWEEN Tgl_Awal AND Tgl_Akhir
ORDER BY Peminjaman.Tgl_Pinjam ASC
Total_Peminjaman = COUNT(*)
PRINT "LAPORAN PEMINJAMAN BUKU"
PRINT "Periode: " + Tgl_Awal + " s/d " + Tgl_Akhir
PRINT "================================="
PRINT "No | Tgl Pinjam | Anggota | Buku | Jatuh Tempo"
FOR EACH record IN result_set DO
PRINT record.No_Pinjam + " | " +
record.Tgl_Pinjam + " | " +
record.Nm_Anggota + " | " +
record.Judul + " | " +
record.Tgl_Kembali
END FOR
PRINT "================================="
PRINT "Total Peminjaman: " + Total_Peminjaman
SEND Laporan_Peminjaman TO Pimpinan
END
PSPEC 4.3 — Update Buku
PROCEDURE Update_Buku
INPUT: Kd_Buku_Pinjaman (dari Proses 4.1)
OUTPUT: Stok buku ter-update
BEGIN
READ Buku WHERE Kd_Buku = Kd_Buku_Pinjaman
IF NOT FOUND THEN
DISPLAY "Error: Buku ga ketemu"
EXIT
END IF
IF Buku.Stok <= 0 THEN
DISPLAY "Error: Stok udah 0, gabisa minjem"
EXIT
END IF
Buku.Stok = Buku.Stok - 1
UPDATE Buku SET Stok = Buku.Stok
WHERE Kd_Buku = Kd_Buku_Pinjaman
DISPLAY "Stok buku berhasil diupdate. Sisa: " + Buku.Stok
END
PSPEC 1.1 — Cari Data Anggota
PROCEDURE Cari_Data_Anggota
INPUT: Id-Anggota (dari Anggota)
OUTPUT: Status anggota (terdaftar/belum) & data anggota
BEGIN
IF Id_Anggota IS NULL OR Id_Anggota = "" THEN
DISPLAY "Error: ID Anggota ga boleh kosong"
EXIT
END IF
READ Anggota WHERE Kd_Anggota = Id_Anggota
IF FOUND THEN
DISPLAY "Anggota udah terdaftar"
DISPLAY "Nama: " + Anggota.Nm_Anggota
DISPLAY "Tgl Daftar: " + Anggota.Tgl_Daftar
SEND dt_Anggota TO Proses 1.3
ELSE
DISPLAY "Anggota belum terdaftar"
SEND Id_Anggota TO Proses 1.2
END IF
END