BASE is a web application built on CodeIgniter 4. Its primary purpose is to act as a Web Service Client for Neo Feeder — the application that synchronizes data with the PDDIKTI database.
Currently, BASE acts as a client of the Neo Feeder web service. Going forward, the application will be developed to integrate with other academic applications.
The name BASE (Backbone for Academic Services & Education) reflects that the application will serve as the foundation for integrating other systems.
The application is functional and covers both authentication and the Neo Feeder data-browsing / administration flows:
- Login / Authentication - The login system uses the Neo Feeder API (
GetToken) for authentication, with session-based auth via CodeIgniter 4 and an auth filter protecting all routes except the login flow. - AdminLTE 3 → AdminLTE 4 Migration - The UI layer migrated from AdminLTE 3.2 (Bootstrap 4, jQuery) to AdminLTE 4 (Bootstrap 5, vanilla JS, Font Awesome 7).
- Institution & student data pages - Pages browsing Neo Feeder data read-only through the service layer:
- Profil Perguruan Tinggi (
/profil-pt) - institution profile (identity, contact, address, legalitas). - Mahasiswa (
/mahasiswa) - student list with edit and read-only detail. - Aktivitas Kuliah (
/aktivitas-kuliah) - course-activity list with edit. - Mahasiswa Lulus / DO (
/mahasiswa-lulus-do) - graduated / dropped-out student list.
- Profil Perguruan Tinggi (
- PISN Graduation wizard (
/graduation) - Excel upload of prospective graduates, sequential per-student verification (identity → academic → transcript completeness → PISN eligibility → graduation fields), pre-submit preview, and submission to Neo Feeder viaInsertMahasiswaLulusDO(UpdateNilaiPerkuliahanKelasfor missing thesis grades). Progress survives auth-session expiry via a resume cookie + cache-backed store. - Verifikasi IPK (
/verifikasi-ipk) - bulk check and correction of last-semester IPK against an Excel file, applying fixes viaUpdatePerkuliahanMahasiswa.
| Component | Technology | Version |
|---|---|---|
| Framework | CodeIgniter 4 | ^4.0 (installed v4.7.4) |
| UI Template | AdminLTE 4 | ^4.0 (Bootstrap 5) |
| Frontend Package | npm / Node.js | - |
| Database | MySQL / SQLite3 (testing) | - |
| Testing | PHPUnit | 10.5 |
| HTTP Client | CI4 CURLRequest | framework built-in |
BASE/
|-- app/
| |-- Config/ # Configuration (Routes, Filters, NeoFeeder, Services, etc.)
| |-- Controllers/ # Home, Login, Dashboard, ProfilPT, Mahasiswa, AktivitasKuliah,
| | # MahasiswaLulusDo, Graduation, VerifikasiIpk, BaseController
| |-- Database/ # Migrations & Seeds
| |-- Filters/ # AuthFilter (route protection middleware)
| |-- Helpers/ # Helper functions
| |-- Libraries/ # Auth, NeoFeeder, PisnService, WizardProgress, VerifikasiIpkStore (service layer)
| |-- Models/ # Database models
| |-- Views/ # login/, layout/, dashboard/, profil_pt/, mahasiswa/,
| | # aktivitas_kuliah/, mahasiswa_lulus_do/, graduation/, verifikasi_ipk/, errors/
|-- docs/ # Project documentation (with docs/archived/ for archives)
|-- public/ # Document root (index.php)
| |-- adminlte/ # AdminLTE 4 CSS/JS (from npm build)
| |-- bootstrap/ # Bootstrap 5 CSS/JS (from npm build)
| |-- fontawesome/ # Font Awesome 7 CSS/webfonts (from npm build)
|-- tests/ # Unit & integration tests
|-- package.json # Frontend dependencies (npm)
|-- node_modules/ # Frontend packages (generated)
|-- vendor/ # Backend dependencies (Composer)
|-- writable/ # Logs, cache, uploads
The API base URL is configured via neofeeder.apiBaseUrl in .env (see the env template).
Request:
{
"act": "GetToken",
"username": "...",
"password": "..."
}Response (success):
{
"error_code": 0,
"error_desc": "",
"data": {
"token": "..."
}
}Every WS call answers with a standard envelope:
{
"error_code": 0,
"error_desc": "",
"data": null
}error_code is 0 on success (with data populated for list/Get* calls). Negative values are produced by the app itself for connection failure (-1) and malformed responses (-2); 100/-2 from the API mean the session/token is invalid.
All API calls are server-side (PHP via CI4 CURLRequest) using the token from session('auth.token') — the token never reaches the browser. Payload keys are limited to act, token, filter, order, limit, offset (plus record/key for mutations).
These use the { act, token, filter?, order?, limit?, offset? } shape. filter is a SQL-style WHERE string (e.g. "nim='202010087'"), not a JSON object. order is a column name, optionally DESC.
| WS act | Purpose |
|---|---|
GetProfilPT |
Institution (PT) profile |
GetListMahasiswa |
Student list (biodata) |
GetAktivitasKuliahMahasiswa |
Per-semester course-activity summary (IPK, IPS, sks, status) |
GetListRiwayatPendidikanMahasiswa |
Study-history list; carries id_pembiayaan needed for UpdatePerkuliahanMahasiswa |
GetStatusMahasiswa |
Reference list of student statuses |
GetJenisKeluar |
Reference list of graduation exit reasons |
GetSemester |
Reference list of semesters |
GetListMahasiswaLulusDO |
Graduated / dropped-out student list |
GetCountMahasiswa |
Total student row count (for pagination) |
GetCountAktivitasKuliahMahasiswa |
Total activity row count (rejects nim/id_mahasiswa filters) |
GetCountMahasiswaLulusDO |
Total graduated/dropped-out row count |
GetTranskripMahasiswa |
Student transcript grade rows |
GetBiodataMahasiswa |
Single student biodata (filter: id_mahasiswa='...') |
GetDetailPerkuliahanMahasiswa |
Single course-activity record (filter: id_registrasi_mahasiswa='...' AND id_semester='...') |
These use the { act, token, key?, record? } shape — key holds the primary key for Update/Delete, record holds the fields for Insert/Update.
| WS act | key |
Notes |
|---|---|---|
InsertMahasiswaLulusDO |
— | Graduated/dropped-out record |
InsertBiodataMahasiswa / UpdateBiodataMahasiswa / DeleteBiodataMahasiswa |
id_mahasiswa (Update/Delete) |
Student biodata |
InsertPerkuliahanMahasiswa / UpdatePerkuliahanMahasiswa / DeletePerkuliahanMahasiswa |
id_registrasi_mahasiswa + id_semester |
Course-activity record |
UpdateNilaiPerkuliahanKelas |
id_registrasi_mahasiswa + id_kelas_kuliah |
Class grade (e.g. nilai_huruf) |
Mutations require a complete record: Neo Feeder rejects partial updates, so every NOT-NULL field (plus fields such as biaya_kuliah_smt and id_pembiayaan from GetListRiwayatPendidikanMahasiswa) must be present.
The transcript-check feature (getCekTranskripMahasiswa) calls two cloud REST endpoints under the same API base host instead of a WS act. They authenticate with Authorization: Bearer <token> (the same token issued by GetToken).
| Endpoint | Query | Purpose |
|---|---|---|
/ws/transkrip/cari_mahasiswa |
nm_pd=<nim> |
Find a student |
/ws/transkrip/nilai_mahasiswa |
mahasiswa=<json> |
Transcript grade rows for one student |
Query one student at a time; multi-student queries can overflow the URL length (HTTP 414).
GetDictionary inspects the actual key/record schema of any WS function at runtime — useful before implementing a new endpoint, so the schema is not guessed. In this project it is called ad-hoc as a schema-inspection tool (development-time), not as part of the application's runtime request path.
Request:
{
"act": "GetDictionary",
"token": "...",
"fungsi": "<NamaFungsi>"
}Response (simplified) — the schema of the requested function:
{
"error_code": 0,
"error_desc": "",
"data": {
"nama": "UpdatePerkuliahanMahasiswa",
"key": ["id_registrasi_mahasiswa", "id_semester"],
"record": [
{ "name": "id_status_mahasiswa", "mandatory": true },
{ "name": "ips", "mandatory": false },
{ "name": "ipk", "mandatory": false }
]
}
}- Clone this repository into your web server directory.
- Copy
envto.envand adjust thebaseURLand database connection configuration. - Run
composer installto install backend dependencies. - Run
npm install && npm run buildto install and copy frontend assets topublic/. - Point your web server to the
public/folder.
See CONTRIBUTING.md for the contribution workflow, coding conventions, and pull request checklist.
This project is licensed under the MIT License.