-- =====================================================================
-- SIMAP — Kas sekolah dan pemantauan keuangan oleh yayasan
--
--   mysql -u root -p simap_db < database/06_kas_sekolah.sql
--
-- Sebelum berkas ini, sistem hanya mencatat penerimaan iuran siswa.
-- Yayasan tidak dapat menilai kesehatan keuangan hanya dari uang masuk,
-- sehingga arus keluar perlu tercatat pula.
-- =====================================================================


CREATE TABLE IF NOT EXISTS kas_kategori (
  id       SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  kode     VARCHAR(20) NOT NULL UNIQUE,
  nama     VARCHAR(100) NOT NULL,
  arah     ENUM('MASUK','KELUAR') NOT NULL,
  urutan   SMALLINT NOT NULL DEFAULT 10,
  is_aktif TINYINT(1) NOT NULL DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS kas_transaksi (
  id           BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  no_bukti     VARCHAR(40) NOT NULL UNIQUE,
  tanggal      DATE NOT NULL,
  arah         ENUM('MASUK','KELUAR') NOT NULL,
  kategori_id  SMALLINT UNSIGNED NULL,
  sumber_dana  ENUM('BOS','BOP','YAYASAN','KOMITE','IURAN','LAINNYA')
               NOT NULL DEFAULT 'IURAN',
  uraian       VARCHAR(255) NOT NULL,
  nominal      DECIMAL(14,2) NOT NULL,
  penerima     VARCHAR(150) NULL COMMENT 'Pihak yang menerima atau menyetor',
  bukti        VARCHAR(255) NULL,
  -- Diisi otomatis bila transaksi berasal dari pembayaran siswa,
  -- supaya penerimaan iuran tidak perlu dicatat dua kali
  pembayaran_id BIGINT UNSIGNED NULL,
  dicatat_oleh INT UNSIGNED NULL,
  created_at   DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY idx_tanggal (tanggal, arah),
  KEY idx_kategori (kategori_id),
  CONSTRAINT fk_kas_kategori FOREIGN KEY (kategori_id)
    REFERENCES kas_kategori(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT IGNORE INTO kas_kategori (kode, nama, arah, urutan) VALUES
 ('IURAN',    'Penerimaan iuran siswa',        'MASUK',  1),
 ('BOS',      'Dana BOS',                      'MASUK',  2),
 ('BANTUAN',  'Bantuan dan donasi',            'MASUK',  3),
 ('LAIN_M',   'Penerimaan lain-lain',          'MASUK',  9),
 ('GAJI',     'Gaji dan honor pegawai',        'KELUAR', 1),
 ('OPS',      'Operasional harian',            'KELUAR', 2),
 ('LISTRIK',  'Listrik, air, dan internet',    'KELUAR', 3),
 ('SARANA',   'Sarana dan pemeliharaan',       'KELUAR', 4),
 ('KEGIATAN', 'Kegiatan siswa',                'KELUAR', 5),
 ('ATK',      'Alat tulis dan bahan ajar',     'KELUAR', 6),
 ('LAIN_K',   'Pengeluaran lain-lain',         'KELUAR', 9);

INSERT IGNORE INTO permissions (kode, nama, modul) VALUES
 ('kas.view',   'Melihat kas sekolah',   'keuangan'),
 ('kas.manage', 'Mencatat kas sekolah',  'keuangan');

INSERT IGNORE INTO role_permission (role_id, permission_id)
SELECT r.id, p.id FROM roles r JOIN permissions p ON p.kode IN ('kas.view','kas.manage')
 WHERE r.kode IN ('SUPERADMIN','TU');

INSERT IGNORE INTO role_permission (role_id, permission_id)
SELECT r.id, p.id FROM roles r JOIN permissions p ON p.kode = 'kas.view'
 WHERE r.kode IN ('KEPALA_SEKOLAH','YAYASAN');

-- Yayasan perlu menelusuri keuangan, bukan sekadar melihat ringkasannya
INSERT IGNORE INTO role_permission (role_id, permission_id)
SELECT 10, id FROM permissions WHERE kode IN ('keuangan.view');

-- ------------------------------------------------------- CONTOH TRANSAKSI
INSERT IGNORE INTO kas_transaksi
 (no_bukti, tanggal, arah, kategori_id, sumber_dana, uraian, nominal, penerima)
SELECT * FROM (
  SELECT 'KAS-2601' AS a, DATE_SUB(CURDATE(), INTERVAL 55 DAY) AS b, 'MASUK' AS c,
         (SELECT id FROM kas_kategori WHERE kode='BOS') AS d, 'BOS' AS e,
         'Pencairan dana BOS triwulan III' AS f, 42000000.00 AS g, 'Rekening sekolah' AS h
  UNION ALL SELECT 'KAS-2602', DATE_SUB(CURDATE(), INTERVAL 50 DAY), 'KELUAR',
         (SELECT id FROM kas_kategori WHERE kode='GAJI'), 'YAYASAN',
         'Honor guru dan tendik bulan lalu', 28500000.00, '18 pegawai'
  UNION ALL SELECT 'KAS-2603', DATE_SUB(CURDATE(), INTERVAL 42 DAY), 'KELUAR',
         (SELECT id FROM kas_kategori WHERE kode='LISTRIK'), 'BOS',
         'Listrik, air, dan internet', 3150000.00, 'PLN, PDAM, ISP'
  UNION ALL SELECT 'KAS-2604', DATE_SUB(CURDATE(), INTERVAL 35 DAY), 'KELUAR',
         (SELECT id FROM kas_kategori WHERE kode='ATK'), 'BOS',
         'Pengadaan buku dan alat tulis semester ganjil', 6800000.00, 'CV Sumber Ilmu'
  UNION ALL SELECT 'KAS-2605', DATE_SUB(CURDATE(), INTERVAL 28 DAY), 'KELUAR',
         (SELECT id FROM kas_kategori WHERE kode='SARANA'), 'YAYASAN',
         'Perbaikan atap ruang kelas 3A', 4500000.00, 'Tukang bangunan'
  UNION ALL SELECT 'KAS-2606', DATE_SUB(CURDATE(), INTERVAL 20 DAY), 'MASUK',
         (SELECT id FROM kas_kategori WHERE kode='BANTUAN'), 'LAINNYA',
         'Donasi wali murid untuk perpustakaan', 2500000.00, 'Komite sekolah'
  UNION ALL SELECT 'KAS-2607', DATE_SUB(CURDATE(), INTERVAL 14 DAY), 'KELUAR',
         (SELECT id FROM kas_kategori WHERE kode='KEGIATAN'), 'KOMITE',
         'Kegiatan Pramuka dan lomba kecamatan', 3200000.00, 'Panitia kegiatan'
  UNION ALL SELECT 'KAS-2608', DATE_SUB(CURDATE(), INTERVAL 7 DAY), 'KELUAR',
         (SELECT id FROM kas_kategori WHERE kode='OPS'), 'IURAN',
         'Konsumsi rapat dan operasional kantor', 1750000.00, 'Kantor TU'
) x;

SELECT 'kas sekolah siap' AS info, (SELECT COUNT(*) FROM kas_transaksi) AS transaksi;
