Backend 6 min read

Otomatisasi EOD (End of Day) Settlement dan Dompet Digital Multi-Cabang Sekolah

Membahas alur rekonsiliasi kas harian otomatis (EOD) dan arsitektur multi-tenant dompet digital siswa (Utama, Wisata, Qurban) berbasis constraint database.

0 views

Pada manajemen keuangan yayasan sekolah modern yang memiliki banyak cabang (multi-branching), dua tantangan operasional terbesar adalah:

  1. Rekonsiliasi Kas Harian: Memastikan total penerimaan kas fisik di meja kasir sesuai dengan angka pembukuan sistem sebelum toko/kantor tutup di sore hari.
  2. Manajemen Alokasi Dana Siswa: Mengelola tabungan siswa untuk berbagai peruntukan (seperti Uang Saku Utama, Tabungan Wisata, dan Tabungan Qurban) tanpa risiko pencampuran saldo.

Di dalam ForgeLenta / ForgeSPP, kedua kebutuhan ini dijawab melalui modul EOD (End of Day) Settlement dan Multi-Wallet Student Account.


1. Fitur EOD (End of Day) Settlement

Setiap pukul 17:00 WIB, sebuah background job (eodJob.js berbasis cron) mengeksekusi rekonsiliasi penutupan kas harian untuk setiap cabang sekolah:

async function executeEodSettlement(idCabang, tglSettlement) {
  return await prisma.$transaction(async (tx) => {
    const totalPemasukan = await tx.pembayaran.aggregate({
      where: {
        id_cabang: idCabang,
        tgl_bayar: {
          gte: startOfDay(tglSettlement),
          lte: endOfDay(tglSettlement)
        }
      },
      _sum: { jumlah_bayar: true }
    });

    const totalPengeluaran = await tx.pengeluaran.aggregate({
      where: {
        id_cabang: idCabang,
        tgl_transaksi: {
          gte: startOfDay(tglSettlement),
          lte: endOfDay(tglSettlement)
        },
        status: 'APPROVED'
      },
      _sum: { jumlah: true }
    });

    const settlement = await tx.settlement.create({
      data: {
        tanggal: tglSettlement,
        total_pemasukan: totalPemasukan._sum.jumlah_bayar || 0,
        total_pengeluaran: totalPengeluaran._sum.jumlah || 0,
        status: 'COMPLETED'
      }
    });

    return settlement;
  });
}

2. Arsitektur Dompet Digital Siswa (Multi-Wallet)

Setiap siswa memiliki tiga tipe dompet terpisah:

  • UTAMA: Digunakan untuk penerimaan kembalian SPP atau uang saku harian.
  • WISATA: Tabungan khusus kegiatan karya wisata tahunan.
  • QURBAN: Tabungan partisipasi program kurban sekolah.
enum TipeDompet {
  UTAMA
  WISATA
  QURBAN
}

model Dompet {
  id_dompet  Int              @id @default(autoincrement())
  nisn       String           @db.VarChar(20)
  tipe       TipeDompet       @default(UTAMA)
  saldo      Int              @default(0)
  id_cabang  Int?
  transaksi  TransaksiDompet[]

  @@unique([nisn, tipe])
}

Untuk mencegah terjadinya penarikan saldo negatif (negative balance), MySQL database ditambahkan penegasan aturan (CHECK Constraint):

ALTER TABLE dompet ADD CONSTRAINT check_saldo_positif CHECK (saldo >= 0);

Kesimpulan

Modul EOD Settlement dan Multi-Wallet pada ForgeSPP menghadirkan standar pengelolaan keuangan sekolah modern yang rapi, otomatis, serta siap mendukung ekspansi banyak cabang sekolah secara fleksibel.