Modul 06: Admin Manajemen Anggota & Sirkulasi Transaksi
Modul 06: Admin Manajemen Anggota & Sirkulasi Transaksi
Berikut adalah seluruh berkas kode program aktual yang digunakan dalam aplikasi SIPAS tanpa potongan atau placeholder. Kode dapat dipelajari dan diketikkan langsung pada Sublime Text 3.
1
Model Sirkulasi Transaksi (Transaksi_model.php)
Lokasi Berkas: application/models/Transaksi_model.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Transaksi_model
* Model untuk menangani peminjaman, pengembalian, dan riwayat transaksi
*/
class Transaksi_model extends CI_Model {
private $table = 'transaksi';
public function __construct() {
parent::__construct();
}
/**
* Mengambil daftar transaksi dengan relasi users dan buku
*/
public function get_all($limit = NULL, $offset = NULL, $status = NULL, $search = NULL) {
$this->db->select('transaksi.*, users.nama as nama_siswa, users.nis, users.kelas, buku.kode_buku, buku.judul as judul_buku');
$this->db->from($this->table);
$this->db->join('users', 'users.id = transaksi.user_id', 'left');
$this->db->join('buku', 'buku.id = transaksi.buku_id', 'left');
if (!empty($status) && $status !== 'semua') {
$this->db->where('transaksi.status', $status);
}
if (!empty($search)) {
$this->db->group_start();
$this->db->like('transaksi.kode_transaksi', $search);
$this->db->or_like('users.nama', $search);
$this->db->or_like('users.nis', $search);
$this->db->or_like('buku.judul', $search);
$this->db->group_end();
}
$this->db->order_by('transaksi.created_at', 'DESC');
if ($limit !== NULL) {
$this->db->limit($limit, $offset);
}
return $this->db->get()->result();
}
/**
* Menghitung total data transaksi untuk pagination
*/
public function count_all($status = NULL, $search = NULL) {
$this->db->from($this->table);
$this->db->join('users', 'users.id = transaksi.user_id', 'left');
$this->db->join('buku', 'buku.id = transaksi.buku_id', 'left');
if (!empty($status) && $status !== 'semua') {
$this->db->where('transaksi.status', $status);
}
if (!empty($search)) {
$this->db->group_start();
$this->db->like('transaksi.kode_transaksi', $search);
$this->db->or_like('users.nama', $search);
$this->db->or_like('users.nis', $search);
$this->db->or_like('buku.judul', $search);
$this->db->group_end();
}
return $this->db->count_all_results();
}
/**
* Mengambil detail transaksi lengkap berdasarkan ID
*/
public function get_by_id($id) {
$this->db->select('transaksi.*, users.nama as nama_siswa, users.nis, users.kelas, users.username, buku.kode_buku, buku.judul as judul_buku, buku.penulis, buku.penerbit, buku.rak');
$this->db->from($this->table);
$this->db->join('users', 'users.id = transaksi.user_id', 'left');
$this->db->join('buku', 'buku.id = transaksi.buku_id', 'left');
$this->db->where('transaksi.id', $id);
return $this->db->get()->row();
}
/**
* Mengambil transaksi berdasarkan user tertentu
*/
public function get_by_user($user_id, $status = NULL, $search = NULL, $limit = NULL, $offset = NULL) {
$this->db->select('transaksi.*, buku.kode_buku, buku.judul as judul_buku, buku.penulis, buku.penerbit, buku.rak, buku.kategori');
$this->db->from($this->table);
$this->db->join('buku', 'buku.id = transaksi.buku_id', 'left');
$this->db->where('transaksi.user_id', $user_id);
if (!empty($status) && $status !== 'semua') {
$this->db->where('transaksi.status', $status);
}
if (!empty($search)) {
$this->db->group_start();
$this->db->like('buku.judul', $search);
$this->db->or_like('transaksi.kode_transaksi', $search);
$this->db->group_end();
}
$this->db->order_by('transaksi.created_at', 'DESC');
if ($limit !== NULL) {
$this->db->limit($limit, $offset);
}
return $this->db->get()->result();
}
/**
* Hitung total transaksi milik user
*/
public function count_by_user($user_id, $status = NULL, $search = NULL) {
$this->db->from($this->table);
$this->db->join('buku', 'buku.id = transaksi.buku_id', 'left');
$this->db->where('transaksi.user_id', $user_id);
if (!empty($status) && $status !== 'semua') {
$this->db->where('transaksi.status', $status);
}
if (!empty($search)) {
$this->db->group_start();
$this->db->like('buku.judul', $search);
$this->db->or_like('transaksi.kode_transaksi', $search);
$this->db->group_end();
}
return $this->db->count_all_results();
}
/**
* Mengambil transaksi aktif (dipinjam) oleh user
*/
public function get_active_by_user($user_id) {
return $this->get_by_user($user_id, 'dipinjam');
}
/**
* Cek apakah user sedang meminjam buku yang sama dan belum dikembalikan
*/
public function is_book_borrowed_by_user($user_id, $buku_id) {
$this->db->where('user_id', $user_id);
$this->db->where('buku_id', $buku_id);
$this->db->where('status', 'dipinjam');
return $this->db->count_all_results($this->table) > 0;
}
/**
* Generate Kode Transaksi Unik: TRX + YYYYMMDD + 4 digit urut
*/
public function generate_kode() {
$date = date('Ymd');
$prefix = 'TRX' . $date;
$this->db->like('kode_transaksi', $prefix, 'after');
$this->db->order_by('kode_transaksi', 'DESC');
$last = $this->db->get($this->table, 1)->row();
if ($last) {
$last_num = (int) substr($last->kode_transaksi, -4);
$next_num = str_pad($last_num + 1, 4, '0', STR_PAD_LEFT);
} else {
$next_num = '0001';
}
return $prefix . $next_num;
}
/**
* Membuat Transaksi Peminjaman Baru dengan Database Transaction
*/
public function create_peminjaman($user_id, $buku_id) {
$this->db->trans_start();
// 1. Ambil info buku & cek stok
$buku = $this->db->get_where('buku', ['id' => $buku_id])->row();
if (!$buku || $buku->stok <= 0) {
$this->db->trans_rollback();
return ['status' => false, 'message' => 'Buku sedang tidak tersedia atau stok habis.'];
}
// 2. Cek apakah user sedang meminjam buku yang sama
if ($this->is_book_borrowed_by_user($user_id, $buku_id)) {
$this->db->trans_rollback();
return ['status' => false, 'message' => 'Anda masih meminjam buku ini. Harap kembalikan terlebih dahulu.'];
}
// 3. Generate kode transaksi & tanggal
$kode_transaksi = $this->generate_kode();
$tanggal_pinjam = date('Y-m-d');
$batas_kembali = date('Y-m-d', strtotime('+7 days'));
$data_transaksi = [
'kode_transaksi' => $kode_transaksi,
'user_id' => $user_id,
'buku_id' => $buku_id,
'tanggal_pinjam' => $tanggal_pinjam,
'batas_kembali' => $batas_kembali,
'tanggal_kembali' => NULL,
'status' => 'dipinjam',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
];
$this->db->insert($this->table, $data_transaksi);
// 4. Kurangi stok buku - 1
$this->db->set('stok', 'stok - 1', FALSE);
$this->db->where('id', $buku_id);
$this->db->update('buku');
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
return ['status' => false, 'message' => 'Gagal memproses transaksi peminjaman.'];
}
return ['status' => true, 'message' => 'Peminjaman berhasil dilakukan. Kode: ' . $kode_transaksi];
}
/**
* Memproses Pengembalian Buku dengan Database Transaction
*/
public function proses_pengembalian($transaksi_id, $allowed_user_id = NULL) {
$this->db->trans_start();
// 1. Ambil data transaksi
$transaksi = $this->db->get_where($this->table, ['id' => $transaksi_id])->row();
if (!$transaksi) {
$this->db->trans_rollback();
return ['status' => false, 'message' => 'Data transaksi tidak ditemukan.'];
}
// Proteksi kepemilikan transaksi jika dipanggil oleh role user
if ($allowed_user_id !== NULL && $transaksi->user_id != $allowed_user_id) {
$this->db->trans_rollback();
return ['status' => false, 'message' => 'Anda tidak memiliki hak untuk mengembalikan transaksi ini.'];
}
// 2. Cek apakah sudah berstatus dikembalikan
if ($transaksi->status === 'dikembalikan') {
$this->db->trans_rollback();
return ['status' => false, 'message' => 'Buku pada transaksi ini sudah pernah dikembalikan.'];
}
// 3. Update status transaksi
$this->db->where('id', $transaksi_id);
$this->db->update($this->table, [
'status' => 'dikembalikan',
'tanggal_kembali' => date('Y-m-d'),
'updated_at' => date('Y-m-d H:i:s')
]);
// 4. Kembalikan stok buku + 1
$this->db->set('stok', 'stok + 1', FALSE);
$this->db->where('id', $transaksi->buku_id);
$this->db->update('buku');
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
return ['status' => false, 'message' => 'Gagal memproses pengembalian buku.'];
}
return ['status' => true, 'message' => 'Buku berhasil dikembalikan. Terima kasih!'];
}
}
💡 Catatan: Baris komentar (// atau /*
*/) bersifat opsional/penjelas logika. Tidak wajib diketik semua agar lebih cepat.
2
Controller Manajemen Anggota (admin/Anggota.php)
Lokasi Berkas: