# Panduan Integrasi 12 Modul Nexus Scholar

Dokumen ini menjelaskan strategi integrasi dari 12 modul utama yang telah dibangun menggunakan PHP Native, beserta alur data dan implementasi event sederhana (tanpa queue worker modern).

## 1. Dependensi Antar Modul

Sistem yang dibangun monolitis, namun secara logika memiliki dependensi hierarkis:

*   **Core / Foundation**
    *   **Modul 1 (Auth & Role)**: Pondasi dasar. Modul 2-12 sangat bergantung pada Users dan Roles. Semua validasi akses bergantung pada tabel `users`.
*   **Journal & Publishing Core**
    *   **Modul 2 (Journal Management)**: Bergantung pada M1 (Editor Role).
    *   **Modul 3 (Submission)**: Bergantung pada M1 (Author Role) & M2 (Journal selection).
    *   **Modul 5 (Editorial)**: Bergantung pada M3 (Submissions).
    *   **Modul 4 (AI Reviewer)**: Berjalan bersamaan dengan / sebelum Reviewer manusia di M5. Bergantung pada file M3.
    *   **Modul 6 (Reviewer Ecosystem)**: Bergantung pada M5 (Assignment) dan M1 (Reviewer Role).
    *   **Modul 7 (Publication)**: Bergantung pada hasil final Modul 5 (Accepted Submissions).
    *   **Modul 8 (Interactive Article)**: Bergantung penuh pada data artikel di Modul 7.
*   **Ecosystem & Networking**
    *   **Modul 9 (Author Analytics)**: Bergantung pada data views/downloads/citations dari M8 dan M7.
    *   **Modul 10 (Research Profile)**: Bergantung pada M1 dan M7 (untuk sinkronisasi artikel author).
    *   **Modul 11 (Matchmaking)**: Bergantung penuh pada profile data dan skill tags dari M10.
    *   **Modul 12 (Research Community)**: Bergantung M1 (Users), dan opsional saling menautkan artikel dari M7.

## 2. Alur Data: Submission -> Published Article
1.  **Modul 3 (Submission)**: Author submit Naskah (PDF/Word) ke sebuah Journal. Status awal: `submitted`.
2.  **Modul 5 (Editorial)**: Editor melihat submission baru. Editor bisa melakukan `desk-reject` atau lanjut ke review.
3.  **Modul 4 (AI Reviewer)**: Editor memicu AI Review (atau otomatis oleh cron). Hasil AI dilampirkan ke dashboard Editor.
4.  **Modul 6 (Reviewer System)**: Editor memilih reviewer manusia. Status submission menjadi `under_review`. Reviewer mensubmit hasil review.
5.  **Modul 5 (Editorial Decision)**: Editor membuat keputusan berdasarkan AI dan Manusia (Accept, Revise, Reject). Jika `revision_required`, author merevisi di M3. Jika `accepted`, status selesai.
6.  **Modul 7 (Publication)**: Editor mengubah status Submission yang `accepted` menjadi `Published Articles` dengan menambahkan info Volume, Issue, DOI, dan DOI prefix.
7.  **Publikasi**: Data di-insert ke tabel `published_articles`, secara publik tayang di depan.

## 3. Alur Data: Published Article -> Analytics
1.  **Modul 8 (Interactive Article)**: Setiap kali reader (pengunjung) membuka halaman publik artikel, sistem (via middleware/logger) mencatat log "view" ke database.
2.  **Modul 8 (Download)**: Jika PDF didownload, log "download" tercatat.
3.  **Modul 9 (Author Analytics)**: Dashboard author men-query tabel logs tersebut dengan aggregasi `.GROUP BY article_id, date` untuk menampilkan grafik Chart.js total views dan downloads bulanan.

## 4. Alur Data: User Profile -> Matchmaking
1.  **Modul 10 (Research Profile)**: User mengisi profil: `academic_title`, `affiliation`, `bio`. User mengisi `profile_skills` (misal: "AI", "Qualitative", "Machine Learning").
2.  **Modul 11 (Matchmaking)**: User membuat `matchmaking_requests` (mencari kolaborator dengan skill tertentu).
3.  **Query Matchmaking**: Algoritma (query JOIN & LIKE pada MySQL) akan mencocokkan `request_skills` dengan `profile_skills` user lain, menghitung persentase kecocokan, dan menyimpannya di `research_match_results`.
4.  **Koneksi**: User mengundang kandidat yang disarankan.

## 5. Alur Data: Reviewer Assignment -> Reviewer Reputation
1.  **Modul 6 (Reviewer Ecosystem)**: Reviewer merespon "Accept" atas undangan review. Waktu dihitung.
2.  **Penyelesaian**: Reviewer mensubmit review. Sistem mencatat `review_date`.
3.  **Kalkulasi Poin**: Sistem memberikan skor (misalnya +10 untuk on-time, -5 untuk late). Papan peringkat (leaderboard) reviewer diperbarui berbasis akumulasi poin ini dari tabel `review_assignments`. Editor juga bisa memberikan rating 1-5 bintang atas kualitas teks review.

## 6. Alur Data: AI Reviewer -> Editorial Dashboard
1.  **Pemicu (Event)**: Di halaman Editorial, editor menekan tombol "Generate AI Review".
2.  **Service**: PHP membaca file layout artikel, mengirimkan teks (prompt + manuskrip parsial) ke Google Gemini API via cURL.
3.  **Penyimpanan**: Response Gemini disimpan di tabel `ai_reviews` dengan mengikat ke `submission_id`.
4.  **Penyajian**: Di Editorial Dashboard, terdapat dua tab di bawah detail submission: "Human Reviews" dan "AI Reviews". Editor melihat insight AI sebagai panduan pre-screening.

---

## 7. Daftar Event Penting dalam Sistem
Beberapa kejadian yang memicu "buntut" aktivitas:
1.  `submission_created`: Memicu notifikasi ke Editor.
2.  `review_assigned`: Memicu email ke Reviewer.
3.  `review_submitted`: Memicu notifikasi ke Editor.
4.  `article_accepted`: Memicu author analytics event / notifikasi.
5.  `article_published`: Pembaruan profile author secara otomatis (sinkronisasi list publikasi).

---

## 8. Implementasi Event Sederhana Tanpa Queue Worker (via Cron)
Di PHP Native + cPanel, kita tidak memiliki "Artisan Queue Daemon". Sebagai gantinya:

### A. Tabel `system_events`
Menyimpan log tugas background:
```sql
CREATE TABLE system_events (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_name VARCHAR(100) NOT NULL,
    payload TEXT NOT NULL, -- JSON data
    status ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    processed_at TIMESTAMP NULL
);
```

### B. Service Class (Merekam Event)
Setiap kali terjadi action, kita panggil fungsi helper:
```php
function dispatch_event($name, $data_array) {
    global $db;
    $db->query("INSERT INTO system_events (event_name, payload) VALUES (:name, :json)");
    $db->bind(':name', $name);
    $db->bind(':json', json_encode($data_array));
    $db->execute();
}
```

### C. Cron Processor (`cron/process_events.php`)
File ini dipanggil oleh cPanel Cronjob setiap 5-10 menit.
```php
<?php
require_once __DIR__ . '/../app/core/Database.php';
// ... inisialisasi dll
$db = new Database();
$db->query("SELECT * FROM system_events WHERE status = 'pending' LIMIT 50");
$events = $db->resultSet();

foreach ($events as $event) {
    // Flag processing
    $db->query("UPDATE system_events SET status = 'processing' WHERE id = :id");
    $db->bind(':id', $event['id']);
    $db->execute();
    
    $payload = json_decode($event['payload'], true);
    
    try {
        if ($event['event_name'] == 'send_email') {
            // mail($payload['to'], $payload['subject'], ...)
        } elseif ($event['event_name'] == 'ai_review_trigger') {
            // Call Gemini API via cURL (operasi lambat)
        }
        
        $db->query("UPDATE system_events SET status = 'completed', processed_at = NOW() WHERE id = :id");
    } catch (Exception $e) {
         $db->query("UPDATE system_events SET status = 'failed' WHERE id = :id");
    }
    $db->bind(':id', $event['id']);
    $db->execute();
}
```

---

## 9. Checklist Integrasi Top-ke-Bawah
- [ ] **Database Constraints**: Seluruh `user_id` di tabel berbagai modul mengarah (Foreign Key) valid ke tabel `users`. ON DELETE CASCADE dipastikan aman.
- [ ] **Global Helpers**: Fungsi `is_logged_in()`, `current_user_role()`, `verify_csrf_token()` berjalan merata di seluruh Controller (Modul 1-12).
- [ ] **Layouting**: Sidebar atau Menu navigasi merefleksikan otorisasi dengan tepat (contoh: "Community" terlihat oleh semua, "Journal Settings" spesifik Editor).
- [ ] **Routing Bundling**: Penyatuan seluruh route M1 sampai M12 di `app/routes.php`.
- [ ] **File Storage Management**: File uploads dari M3 (Submission) dan M8 (Interactive) tak saling menimpa, dengan rule `storage/uploads/submissions/...` dan `storage/uploads/published/...`.

## 10. Urutan Testing Integrasi (End-to-End E2E)
Lakukan skenario berikut secara berurutan untuk menjamin integrasi 12 Modul mulus.

1.  **Register 3 User** (Admin/System, User A, User B). (Modul 1)
2.  Admin membuat **Journal** baru (Modul 2) dan menugaskan User A sebagai Editor in Chief.
3.  User B melengkapi **Research Profile** dan menambahkan *skills* (Modul 10).
4.  User B melakukan **Submission** manuskrip PDF ke Jurnal tersebut. (Modul 3).
5.  User A login. Masuk ke **Editorial Dashboard**. Melihat submission B. (Modul 5).
6.  User A mengklik **Generate AI Review**. (Modul 4).
7.  User A meng-assign Admin (sebagai reviewer manusia). (Modul 6).
8.  Admin mengisi review PDF. User A membuat Final Decision "Accepted". (Modul 5 & 6).
9.  User A melakukan **Publication** dan menghasilkan DOI simulasi. (Modul 7).
10. Artikel tayang di homepage (Modul 8). User lain membuka artikel (Memicu Log Views).
11. User B mengecek **Author Analytics** untuk melihat grafiknya bertambah (Modul 9).
12. User B masuk ke **Community** dan memberitakan "Artikel saya baru terbit" sambil mencantumkan link DOI artikel. (Modul 12).
13. Admin mencari kolaborator dengan **Matchmaking** dan menemukan profil User B (berkat profile M10 yang matching). (Modul 11).

Dengan skenario E2E ini, 12 modul sudah terbukti berjalan sebagai 1 Single Information System.
