# Implementasi Kartu Perpustakaan dengan Barcode

## Deskripsi
Implementasi fitur cetak kartu perpustakaan dengan barcode untuk guru dan siswa. Barcode menggunakan NIP untuk guru dan NIS untuk siswa yang dapat digunakan untuk sistem peminjaman buku di perpustakaan.

## Tanggal Implementasi
2 Agustus 2026

## Package yang Diinstall

### Picqer PHP Barcode Generator
```bash
composer require picqer/php-barcode-generator
```

Package ini digunakan untuk generate barcode CODE-128 format yang dapat di-scan untuk identifikasi anggota perpustakaan.

## File yang Dibuat/Dimodifikasi

### 1. Controller
**File:** `app/Http/Controllers/KartuPerpustakaanController.php`

Controller dengan method:
- `index()` - Menampilkan halaman utama untuk memilih siswa/guru
- `printSiswa($id)` - Cetak kartu perpustakaan siswa (single)
- `printGuru($id)` - Cetak kartu perpustakaan guru (single)
- `printBulkSiswa(Request $request)` - Cetak kartu perpustakaan siswa (multiple)
- `printBulkGuru(Request $request)` - Cetak kartu perpustakaan guru (multiple)

### 2. Routes
**File:** `routes/web.php`

Routes yang ditambahkan di group `perpustakaan`:
```php
Route::middleware('role:admin,kepala_perpustakaan')->group(function () {
    Route::get('kartu', [KartuPerpustakaanController::class, 'index'])->name('kartu.index');
    Route::get('kartu/siswa/{id}/print', [KartuPerpustakaanController::class, 'printSiswa'])->name('kartu.print-siswa');
    Route::get('kartu/guru/{id}/print', [KartuPerpustakaanController::class, 'printGuru'])->name('kartu.print-guru');
    Route::post('kartu/siswa/bulk-print', [KartuPerpustakaanController::class, 'printBulkSiswa'])->name('kartu.bulk-print-siswa');
    Route::post('kartu/guru/bulk-print', [KartuPerpustakaanController::class, 'printBulkGuru'])->name('kartu.bulk-print-guru');
});
```

### 3. Views

#### a. Index Page (Halaman Utama)
**File:** `resources/views/perpustakaan/kartu/index.blade.php`

Fitur:
- Tab untuk memilih antara Siswa atau Guru
- Tabel data siswa dengan kolom: NIS, Nama, Kelas
- Tabel data guru dengan kolom: NIP, Nama, Mata Pelajaran
- Checkbox untuk select multiple
- Tombol cetak single untuk setiap baris
- Tombol cetak bulk untuk selected items
- Alpine.js untuk interaktivitas

#### b. Print Siswa (Single)
**File:** `resources/views/perpustakaan/kartu/print-siswa.blade.php`

Desain kartu:
- Ukuran: 85.6mm x 53.98mm (ukuran kartu standar)
- Header: Gradient biru (KARTU PERPUSTAKAAN)
- Foto siswa (jika ada)
- Informasi: NIS, Nama, Kelas
- Barcode CODE-128 dari NIS
- Footer: Icon perpustakaan sekolah
- Responsive untuk print

#### c. Print Guru (Single)
**File:** `resources/views/perpustakaan/kartu/print-guru.blade.php`

Desain kartu:
- Ukuran: 85.6mm x 53.98mm (ukuran kartu standar)
- Header: Gradient hijau-biru (KARTU PERPUSTAKAAN)
- Foto guru (jika ada)
- Informasi: NIP, Nama, Mata Pelajaran
- Badge: "GURU" dengan background hijau
- Barcode CODE-128 dari NIP
- Footer: Icon perpustakaan sekolah
- Responsive untuk print

#### d. Print Bulk Siswa
**File:** `resources/views/perpustakaan/kartu/print-bulk-siswa.blade.php`

Fitur:
- Grid 2 kolom untuk efisiensi kertas
- Multiple kartu dalam 1 halaman
- Page break untuk setiap halaman
- Tombol cetak dan tutup

#### e. Print Bulk Guru
**File:** `resources/views/perpustakaan/kartu/print-bulk-guru.blade.php`

Fitur:
- Grid 2 kolom untuk efisiensi kertas
- Multiple kartu dalam 1 halaman
- Page break untuk setiap halaman
- Tombol cetak dan tutup

### 4. Sidebar Menu
**File:** `resources/views/simaju/layouts/main.blade.php`

Menu "Kartu Perpustakaan" ditambahkan di dropdown Perpustakaan:
- Icon: `fa-id-card`
- Route: `perpustakaan.kartu.index`
- Posisi: Setelah menu Anggota, sebelum Peminjaman

## Hak Akses

Fitur ini dapat diakses oleh:
- ✅ Admin
- ✅ Kepala Perpustakaan
- ❌ Guru (tidak ada akses)

## Fitur Utama

### 1. Halaman Index
- **Tab Interface**: Switch antara Siswa dan Guru
- **Daftar Data**: Menampilkan semua siswa dan guru
- **Select Multiple**: Checkbox untuk pilih banyak sekaligus
- **Cetak Single**: Tombol cetak untuk masing-masing orang
- **Cetak Bulk**: Tombol cetak muncul ketika ada yang dipilih

### 2. Barcode Generation
- **Format**: CODE-128 (standard barcode format)
- **Siswa**: Barcode berisi NIS siswa
- **Guru**: Barcode berisi NIP guru
- **Output**: Base64 encoded PNG image
- **Scannable**: Bisa di-scan dengan barcode scanner

### 3. Desain Kartu
- **Ukuran**: 85.6mm x 53.98mm (credit card size)
- **Border**: Rounded corners dengan shadow
- **Header**: Gradient color (biru untuk siswa, hijau-biru untuk guru)
- **Layout**: Photo, Info, Barcode, Footer
- **Print Ready**: Optimized untuk print

### 4. Print Options
- **Single Print**: Cetak 1 kartu per halaman
- **Bulk Print**: Cetak multiple kartu (2 per halaman)
- **Button**: Print dan Close button
- **Responsive**: Auto adjust untuk print media

## Cara Menggunakan

### A. Cetak Kartu Single

#### Untuk Siswa:
1. Login sebagai Admin/Kepala Perpustakaan
2. Buka **Perpustakaan → Kartu Perpustakaan**
3. Tab "Siswa" aktif
4. Klik tombol **"Cetak"** pada baris siswa yang diinginkan
5. Halaman baru terbuka dengan preview kartu
6. Klik tombol **"Cetak Kartu"** untuk print
7. Pilih printer dan cetak

#### Untuk Guru:
1. Login sebagai Admin/Kepala Perpustakaan
2. Buka **Perpustakaan → Kartu Perpustakaan**
3. Klik tab **"Guru"**
4. Klik tombol **"Cetak"** pada baris guru yang diinginkan
5. Halaman baru terbuka dengan preview kartu
6. Klik tombol **"Cetak Kartu"** untuk print
7. Pilih printer dan cetak

### B. Cetak Kartu Bulk (Multiple)

#### Untuk Siswa:
1. Login sebagai Admin/Kepala Perpustakaan
2. Buka **Perpustakaan → Kartu Perpustakaan**
3. Tab "Siswa" aktif
4. Centang checkbox di sebelah nama siswa yang diinginkan
5. Tombol **"Cetak X Kartu"** akan muncul di header
6. Klik tombol tersebut
7. Halaman baru dengan semua kartu terpilih (2 per halaman)
8. Klik **"Cetak X Kartu"** untuk print
9. Pilih printer dan cetak

#### Untuk Guru:
1. Login sebagai Admin/Kepala Perpustakaan
2. Buka **Perpustakaan → Kartu Perpustakaan**
3. Klik tab **"Guru"**
4. Centang checkbox di sebelah nama guru yang diinginkan
5. Tombol **"Cetak X Kartu"** akan muncul di header
6. Klik tombol tersebut
7. Halaman baru dengan semua kartu terpilih (2 per halaman)
8. Klik **"Cetak X Kartu"** untuk print
9. Pilih printer dan cetak

## Penggunaan Barcode untuk Peminjaman

### Scanning Barcode
1. Saat proses peminjaman buku
2. Gunakan barcode scanner untuk scan kartu perpustakaan
3. Scanner akan membaca NIS (siswa) atau NIP (guru)
4. Sistem dapat mencari anggota berdasarkan NIS/NIP yang ter-scan
5. Proses peminjaman dapat dilanjutkan

### Integrasi dengan Sistem Peminjaman
Barcode dapat diintegrasikan dengan form peminjaman:
- Input field untuk NIS/NIP dapat diisi otomatis dari hasil scan
- Auto-fill data anggota setelah scan
- Mempercepat proses peminjaman/pengembalian buku

## Spesifikasi Teknis

### Barcode
- **Library**: Picqer PHP Barcode Generator v3.2.4
- **Type**: CODE-128
- **Format**: PNG
- **Encoding**: Base64 (untuk embed di HTML)
- **Data Source**: NIS (siswa) / NIP (guru)

### Kartu
- **Width**: 85.6mm (3.37 inches)
- **Height**: 53.98mm (2.12 inches)
- **Border**: 2px solid
- **Border Radius**: 12px
- **Shadow**: 0 4px 6px rgba(0,0,0,0.1)

### Print Settings
- **Page Margin**: 10mm
- **Cards per Page**: 2 (untuk bulk print)
- **Layout**: Grid 2 columns
- **Page Break**: Avoid inside card
- **Media**: @media print optimized

## Customization

### Mengubah Ukuran Kartu
Edit file print view (`.blade.php`):
```css
.card {
    width: 85.6mm;    /* Ubah lebar */
    height: 53.98mm;  /* Ubah tinggi */
}
```

### Mengubah Warna Header
Edit gradient di style:
```css
/* Siswa (Biru) */
background: linear-gradient(135deg, #3B82F6 0%, #06B6D4 100%);

/* Guru (Hijau-Biru) */
background: linear-gradient(135deg, #10B981 0%, #3B82F6 100%);
```

### Mengubah Tipe Barcode
Edit controller method:
```php
// Ganti TYPE_CODE_128 dengan:
// TYPE_CODE_39, TYPE_EAN_13, TYPE_UPC_A, dll
$barcode = base64_encode($generator->getBarcode($nis, $generator::TYPE_CODE_128));
```

## Testing

Setelah implementasi, lakukan testing:

1. ✅ Akses halaman kartu perpustakaan
2. ✅ Tab switching (Siswa/Guru) berfungsi
3. ✅ Checkbox select multiple berfungsi
4. ✅ Cetak single siswa dengan barcode
5. ✅ Cetak single guru dengan barcode
6. ✅ Cetak bulk siswa (multiple selection)
7. ✅ Cetak bulk guru (multiple selection)
8. ✅ Barcode dapat di-scan dengan scanner
9. ✅ Print hasil bagus di kertas
10. ✅ Akses ditolak untuk role guru

## Troubleshooting

### Barcode tidak muncul
- Pastikan package `picqer/php-barcode-generator` sudah terinstall
- Run `composer dump-autoload`
- Clear cache: `php artisan cache:clear`

### Foto tidak muncul
- Pastikan symlink storage sudah dibuat: `php artisan storage:link`
- Check path foto di database
- Pastikan file foto ada di `storage/app/public/`

### Print tidak sesuai
- Check print preview di browser
- Adjust margin di printer settings
- Gunakan kertas A4 atau ukuran kartu khusus

### Scan barcode gagal
- Pastikan barcode cukup besar dan jelas
- Gunakan scanner yang support CODE-128
- Check kualitas print barcode

## Rekomendasi

### Kertas untuk Print
- **Material**: PVC Card / Kertas Glossy
- **Thickness**: 0.76mm (untuk PVC card)
- **Size**: 85.6mm x 53.98mm
- **Finishing**: Laminating untuk durability

### Barcode Scanner
- **Type**: 1D Barcode Scanner
- **Format Support**: CODE-128, CODE-39, EAN-13
- **Connection**: USB atau Wireless
- **Brand**: Honeywell, Zebra, Datalogic

### Printer
- **Type**: ID Card Printer (untuk kualitas terbaik)
- **Alternative**: Laser Printer dengan glossy paper
- **Resolution**: Minimum 300 DPI
- **Color**: Full color untuk hasil terbaik

## Future Enhancement

Fitur yang bisa ditambahkan di masa depan:

1. **QR Code**: Tambah QR Code selain barcode
2. **Expiry Date**: Tambah tanggal berlaku kartu
3. **Photo Upload**: Upload foto langsung dari form
4. **Template Custom**: Multiple template design
5. **Export PDF**: Save as PDF sebelum print
6. **Barcode Scan Input**: Input field dengan auto-scan
7. **Card History**: Track print history kartu
8. **Email Card**: Kirim kartu digital via email

## File yang Terlibat

```
app/
├── Http/
│   └── Controllers/
│       └── KartuPerpustakaanController.php

resources/
└── views/
    └── perpustakaan/
        └── kartu/
            ├── index.blade.php
            ├── print-siswa.blade.php
            ├── print-guru.blade.php
            ├── print-bulk-siswa.blade.php
            └── print-bulk-guru.blade.php

routes/
└── web.php

composer.json (updated with package)
```

## Dokumentasi Package

Library Barcode Generator yang digunakan:
- Repository: https://github.com/picqer/php-barcode-generator
- Documentation: https://github.com/picqer/php-barcode-generator/blob/master/README.md
- Supported Types: CODE-128, CODE-39, EAN-13, UPC-A, dan lainnya


