# Sistem Disposisi Surat KOPASSUS

Sistem manajemen dan disposisi surat digital untuk Komando Pasukan Khusus (KOPASSUS) TNI AD.

![Laravel](https://img.shields.io/badge/Laravel-11.x-red?logo=laravel)
![PHP](https://img.shields.io/badge/PHP-8.2+-blue?logo=php)
![MySQL](https://img.shields.io/badge/MySQL-8.0+-blue?logo=mysql)
![License](https://img.shields.io/badge/License-Proprietary-yellow)

## Tentang Aplikasi

Sistem Disposisi Surat KOPASSUS adalah aplikasi web untuk mengelola surat masuk dan surat keluar di lingkungan KOPASSUS. Aplikasi ini memfasilitasi proses pengagendaan, disposisi, dan tracking surat secara digital dengan hierarki organisasi yang kompleks.

### Fitur Utama

- **Manajemen Surat Masuk**: Upload, agenda, dan disposisi surat masuk
- **Manajemen Surat Keluar**: Buat surat keluar dengan approval berjenjang dan tanda tangan digital
- **Sistem Disposisi**: Disposisi surat ke pejabat terkait dengan tracking
- **Dashboard & Statistik**: Monitoring surat dan disposisi real-time
- **Multi-Level User**: Hierarki pengguna sesuai struktur KOPASSUS (~300 user)
- **Role & Permission**: Kontrol akses berbasis peran dan izin
- **Lembar Disposisi per Satuan**: Template lembar disposisi customizable per satuan
- **Sistem Backdate**: Penomoran surat dengan tanggal mundur (slot terbatas)
- **PDF Preview & Annotation**: Preview dan anotasi langsung file PDF surat
- **Multi-Page PDF Stamping**: Penomoran dan stamp pada halaman berbeda secara independen
- **Cap Satuan & Tanda Tangan Digital**: Cap satuan dan tanda tangan tersimpan untuk stamping PDF
- **BSrE TTE (Tanda Tangan Elektronik)**: Integrasi TTE tersertifikasi dari BSrE/BSSN (hidden feature, siap diaktifkan)
- **Export Excel/PDF**: Export data surat ke Excel dan PDF

---

## Tech Stack

### Backend
- **Framework**: Laravel 11.x
- **Language**: PHP 8.2+
- **Database**: MySQL 8.0+
- **Authentication**: Laravel Breeze
- **Authorization**: Spatie Laravel Permission
- **Queue**: Database Queue Driver

### Frontend
- **Template Engine**: Blade
- **CSS Framework**: Bootstrap 5.3
- **Icons**: Bootstrap Icons
- **JavaScript**: Vanilla JS + jQuery
- **PDF Viewer**: PDF.js 3.11.174
- **Build Tool**: Vite 5.x

### Additional Libraries
- **File Upload**: Laravel File Storage
- **PDF Generation**: DomPDF / TCPDF
- **Excel Export**: Maatwebsite Excel
- **Date Handling**: Carbon
- **BSrE TTE**: Integrasi API BSrE (BSSN) via Laravel Http Client (hidden feature)

---

## Requirements

### Development
- PHP >= 8.2
- Composer >= 2.6
- Node.js >= 20.x
- NPM >= 10.x
- MySQL >= 8.0
- Git

---

## Instalasi

### 1. Clone Repository

```bash
git clone https://gitlab.com/papaarra/disposisi-kopassus.git
cd disposisi-kopassus
```

### 2. Install Dependencies

```bash
# Install PHP dependencies
composer install

# Install Node dependencies
npm install
```

### 3. Environment Setup

```bash
# Copy environment file
cp .env.example .env

# Generate application key
php artisan key:generate
```

### 4. Database Configuration

Edit file `.env`:

```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=disposisi_kopassus
DB_USERNAME=root
DB_PASSWORD=your_password

# Default password untuk user yang di-seed
DEFAULT_USER_PASSWORD=password123

# BSrE Electronic Signature (TTE) - Opsional
# Aktifkan jika sudah memiliki akses API BSrE dari BSSN
BSRE_ENABLED=false
BSRE_API_URL=https://esign.bssn.go.id/api
BSRE_API_KEY=
BSRE_TIMEOUT=30
```

### 5. Database Migration & Seeding

```bash
# Run migrations
php artisan migrate

# Seed dengan user lengkap (~300 user) - RECOMMENDED
php artisan db:seed --class=KopassusFullOrganizationSeeder
```

**Full Organization Seeder** akan membuat user dengan struktur:
- 1 Admin (Administrator Sistem)
- 2 Pimpinan Tertinggi (Panglima, Wakil Panglima)
- 9 Sekretariat Pimpinan (KASMIN, PAURMIN, Staff SMIN)
- 17 Pimpinan Staf (Asisten)
- 17 Pimpinan Satuan (Komandan)
- 107 Kepala Bagian (Pabandya, Kasi, dll)
- 18 Tata Usaha
- 94+ Staf Pelaksana

### 6. Storage Link

```bash
php artisan storage:link
```

### 7. Build Assets

```bash
# Development
npm run dev

# Production
npm run build
```

### 8. Run Application

```bash
php artisan serve
# Access: http://localhost:8000
```

### 9. Run Queue Worker (untuk background jobs)

```bash
php artisan queue:work
```

---

## Struktur Role & Hierarki

### Hierarki Organisasi KOPASSUS

```
PIMPINAN TERTINGGI
├── Panglima KOPASSUS
└── Wakil Panglima KOPASSUS

SEKRETARIAT MILITER (SMIN)
├── KASMIN (verifikasi surat ke Panglima)
├── PAURMIN (proses surat ke Panglima)
└── Operator SMIN

UNSUR PEMBANTU PIMPINAN (Staf)
├── ASREN (Asisten Perencanaan)
│   ├── WAASREN
│   └── Bagian-bagian SREN
├── ASINTEL (Asisten Intelijen)
├── ASOPS (Asisten Operasi)
├── ASPERS (Asisten Personel)
├── ASLOG (Asisten Logistik)
└── PAMEN AHLI

UNSUR PELAYANAN
├── KA PUSKODALOPS
├── KA JEN
├── DAN DESMA
└── KA SETUM (input surat masuk pusat)

UNSUR PELAKSANA (Satuan)
├── DAN PUSDIK LATPASUS
├── DAN GRUP 1, 2, 3
├── DANSAT 81, 71
├── DANSAT SIBER
├── DANSAT DUKLOG
├── DANSAT DUKMIN
├── DANDEN POM
├── DANDEN INTEL
└── dll

IT (Satuan Khusus)
├── IR (Inspektur)
├── WAIR
├── IRUTUM
├── IRUTBEN
└── SES IT (gateway untuk surat IT)
```

### Daftar Role

| Role | Deskripsi | Bisa Disposisi | Bisa Approve SK |
|------|-----------|----------------|-----------------|
| `admin` | Administrator Sistem | Ya (semua) | Ya |
| `pimpinan_tertinggi` | Panglima, Wakil Panglima | Ya | Ya (TTD) |
| `sekretariat_pimpinan` | KASMIN, PAURMIN | Ya | Ya (counter) |
| `pimpinan_staf` | Asisten (ASREN, ASINTEL, dll) | Ya | Ya (TTD) |
| `pimpinan_satuan` | Komandan Satuan | Ya | Ya (TTD) |
| `kepala_bagian` | Pabandya, Kasi, Kabag | Ya | Ya (counter) |
| `tata_usaha` | TU tiap satuan | Tidak | Tidak |
| `staf_pelaksana` | Kaur, Paur, Operator | Tidak | Tidak |

### Role Khusus

| Role | Fungsi |
|------|--------|
| `KASMIN` | Verifikasi surat ke Panglima, forward dari PAURMIN |
| `PAURMIN` | Proses surat untuk Panglima/Wakil Panglima |
| `Operator SMIN` | Input & forward surat ke KASMIN |
| `SETUM` | Input surat masuk pusat, penomoran surat keluar eksternal |
| `TU Satuan` | Lengkapi lembar disposisi, penomoran surat keluar satuan |
| `TU Bagian` | TU di level kepala bagian |
| `Operator TU` | Input surat, forward ke TU atasan |
| `SES IT` | Gateway surat masuk & keluar untuk satuan IT |

---

## Flow Surat Masuk

### Diagram Umum

```
┌─────────────┐
│   SETUM     │ Input Surat + Pilih Tujuan Akhir
└──────┬──────┘
       │
       ↓
  Status: menunggu_agenda
  File PDF: TERKUNCI
  Tampil: SETUM, Panglima, TU/KASMIN tujuan
       │
       ↓
┌─────────────┐
│  TU/KASMIN  │ Lengkapi Lembar Disposisi
└──────┬──────┘
       │
       ↓
  Status: diagendakan
  File PDF: TERBUKA
  Tampil: Semua unit terkait
       │
       ↓
┌─────────────┐
│  PIMPINAN   │ Buat Disposisi (jika perlu)
└──────┬──────┘
       │
       ↓
┌─────────────┐
│  PENERIMA   │ Tindak Lanjut / Selesaikan
└─────────────┘
```

### Flow Surat ke Panglima/Wakil Panglima

```
SETUM
   │
   ↓ (tujuan: Panglima)
PAURMIN
   │
   ↓ (lengkapi lembar & teruskan)
KASMIN
   │
   ↓ (verifikasi & teruskan) PANGLIMA/WAKIL
   │
   ↓ (disposisi)
PENERIMA DISPOSISI
```

### Flow Surat ke Pimpinan Satuan/Staf

```
SETUM
   │
   ↓ (tujuan: ASREN/DANSAT/dll)
TU Satuan
   │
   ↓ (lengkapi lembar & teruskan)
PIMPINAN (ASREN/DANSAT)
   │
   ↓ (disposisi)
KEPALA BAGIAN / STAFF
   │
   ↓ (tindak lanjut / disposisi lanjut)
PELAKSANA
```

### Flow Khusus Satuan IT

```
SETUM
   │
   ↓ (tujuan: IR IT)
TU IT
   │
   ↓ (HANYA teruskan, tidak lengkapi lembar)
SES IT
   │
   ↓ (lengkapi lembar & pilih pimpinan IT)
IR / WAIR / IRUTUM / IRUTBEN
   │
   ↓ (disposisi)
PENERIMA
```

### Flow Disposisi Antar Satuan

Ketika pimpinan satuan A disposisi ke satuan B:

```
PIMPINAN SATUAN A (misal: ASPERS)
   │
   ↓ (disposisi ke SATDUKMIN)
TU SATDUKMIN (menerima disposisi)
   │
   ↓ (lengkapi lembar disposisi untuk SATDUKMIN)
DANSAT DUKMIN
   │
   ↓ (disposisi internal)
PELAKSANA SATDUKMIN
```

---

## Flow Surat Keluar

### Diagram Umum

```
┌─────────────┐
│  OPERATOR   │ Buat Draft Surat Keluar
└──────┬──────┘
       │
       ↓
  Status: draft
       │
       ↓ (submit)
┌─────────────┐
│  APPROVER   │ Counter Paraf (berjenjang)
│  BERJENJANG │ Kepala Bagian → Pimpinan Staf/Satuan
└──────┬──────┘
       │
       ↓
  Status: pending_approval → approved
       │
       ↓
┌─────────────┐
│  PIMPINAN   │ Tanda Tangan
│  PENANDATGN │
└──────┬──────┘
       │
       ↓
  Status: signed
       │
       ↓ (routing berdasarkan tipe)
┌─────────────┐
│  TU/SETUM   │ Penomoran & Pengiriman
└──────┬──────┘
       │
       ↓
  Status: sent → completed
```

### Path A: Internal + TTD Non-Panglima + Penomoran TU Satuan

```
OPERATOR → APPROVER → PIMPINAN (TTD) → TU SATUAN (nomor & kirim)
```

Contoh: Surat internal SREN ditandatangani ASREN, dinomori TU SREN.

### Path B: Eksternal + TTD Non-Panglima

```
OPERATOR → APPROVER → PIMPINAN (TTD) → TU SATUAN → SETUM (nomor & kirim)
```

Contoh: Surat eksternal SREN ditandatangani ASREN, dinomori SETUM.

### Path C: Eksternal + TTD Panglima/Wakil

```
OPERATOR → APPROVER → PIMPINAN (TTD) → TU → PAURMIN → KASMIN → SETUM (nomor)
```

Contoh: Surat eksternal ditandatangani Panglima, melalui jalur SMIN ke SETUM.

### Path D: Internal + TTD Panglima/Wakil

```
OPERATOR → APPROVER → WAKIL PANGLIMA (approve) → PANGLIMA (TTD) → SMIN → SETUM
```

### Path E: Penomoran SETUM (dipilih saat buat surat)

```
OPERATOR → APPROVER → PIMPINAN (TTD) → TU → SETUM (nomor & kirim)
```

### Flow Khusus Satuan IT (Surat Keluar)

```
OPERATOR IT → APPROVER → PIMPINAN IT (TTD) → SES IT (review) → TU IT/SETUM (nomor)
```

Setelah TTD pimpinan IT, surat keluar HARUS melewati SES IT untuk dicek sebelum diteruskan ke TU/SETUM untuk penomoran.

### Status Surat Keluar

| Status | Deskripsi |
|--------|-----------|
| `draft` | Draft, bisa diedit |
| `pending_approval` | Menunggu persetujuan/counter paraf |
| `revision_required` | Dikembalikan untuk revisi |
| `approved` | Disetujui semua approver |
| `pending_signature` | Menunggu tanda tangan |
| `pending_wapang_approval` | Menunggu persetujuan Wakil Panglima |
| `pending_pangwapang_signature` | Menunggu TTD Panglima/Wakil |
| `signed` | Sudah ditandatangani |
| `pending_tu_forward` | Menunggu TU meneruskan |
| `pending_paurmin_forward` | Menunggu Operator SMIN meneruskan |
| `pending_kasmin_forward` | Menunggu KASMIN meneruskan |
| `pending_ses_it_review` | Menunggu SES IT review (khusus IT) |
| `pending_numbering` | Menunggu penomoran TU satuan |
| `pending_setum_numbering` | Menunggu penomoran SETUM |
| `pending_send` | Siap dikirim |
| `sent` | Terkirim |
| `completed` | Selesai |

---

## Sistem Penomoran

### Format Nomor Surat Keluar

```
B/123/II/2026          → Kategori B, nomor 123, bulan Februari 2026
ST/45/I/SREN/2026      → Surat Telegram, nomor 45, bulan Januari, satuan SREN
SP/10/III/2026         → Surat Perintah, nomor 10, bulan Maret
```

### Sistem Backdate (Slot Terbatas)

Untuk surat dengan tanggal mundur, sistem menggunakan slot per hari:
- **SP, ST, B**: 4 slot/hari
- **Kategori lain**: 2 slot/hari

SETUM dapat melihat kalender slot backdate dan memilih tanggal yang masih tersedia.

### Nomor Agenda Surat Masuk

```
B/001/II/2026              → SETUM/Pusat
ST/015/I/SREN/2026         → Satuan SREN
SP/003/III/SAT SIBER/2026  → Satuan SIBER
```

---

## Template Lembar Disposisi

Setiap satuan dapat memiliki template lembar disposisi sendiri dengan:
- Header (nama satuan)
- Sub header
- Logo
- Daftar "Kepada Yth" (checkbox penerima)
- Footer

Template dikonfigurasi di menu Admin > Template Lembar Disposisi.

### Instruksi Disposisi

Setiap satuan dapat memiliki daftar instruksi disposisi sendiri:
- Tindak Lanjuti
- Untuk Diketahui
- Segera Laksanakan
- Koordinasikan
- dll.

Instruksi dikonfigurasi di menu Admin > Instruksi Disposisi.

---

## PDF Stamping & Tanda Tangan Digital

### Fitur Multi-Page Stamping

Sistem mendukung penempatan elemen stamp pada halaman berbeda secara independen:

| Elemen | Deskripsi | Konfigurasi |
|--------|-----------|-------------|
| **Nomor Surat** | Nomor surat resmi | Pilih halaman (bisa multiple) |
| **Tanggal Surat** | Tanggal surat | Pilih halaman (bisa multiple) |
| **Cap Satuan** | Cap/stempel satuan | Pilih halaman (bisa multiple) |
| **Tanda Tangan** | TTD pejabat penandatangan | Pilih halaman (bisa multiple) |

Setiap elemen dapat ditempatkan pada:
- Satu halaman saja (misal: hanya halaman 1)
- Beberapa halaman (misal: halaman 1 dan 3)
- Semua halaman

### Opsi Stamping

| Opsi | Deskripsi |
|------|-----------|
| **Format Nomor** | Full (B/001/I/2026) atau Nomor Saja (001) |
| **Format Tanggal** | Full (29/01/2026) atau Tanggal Saja (29) |
| **Ukuran Font** | 6px - 20px |
| **Bold** | Tebal/tidak |
| **Tampilkan Tanggal** | Checkbox untuk show/hide tanggal |

### Preview & Draggable Positioning

- Preview PDF real-time dengan navigasi halaman
- Drag-and-drop untuk mengatur posisi setiap elemen
- Posisi ditampilkan dalam mm (koordinat X, Y)
- Elemen tampil/sembunyi sesuai halaman yang dipilih
- Reset posisi ke default

### Cap Satuan (Stempel)

Setiap satuan dapat memiliki cap/stempel sendiri:

```
Admin > Master Data > Cap Satuan
├── Upload gambar cap (PNG dengan transparansi)
├── Pilih satuan
├── Set aktif/nonaktif
└── Deskripsi
```

Cap akan otomatis muncul di modal penomoran jika:
- Penandatangan surat dari satuan yang memiliki cap
- Cap satuan dalam status aktif
- File gambar cap tersedia

### Tanda Tangan Tersimpan

Pejabat dapat menyimpan tanda tangan untuk digunakan saat penandatanganan:

```
Admin > Master Data > Tanda Tangan
├── Pilih pejabat
├── Upload gambar tanda tangan (PNG dengan transparansi)
├── Deskripsi
└── Set aktif/nonaktif
```

Opsi penandatanganan surat:
1. **Tanda Tangan Tersimpan** - Gunakan tanda tangan yang sudah di-upload, akan ditempatkan bersama cap satuan di area penomoran
2. **Anotasi PDF Manual** - Tandatangani langsung di preview PDF menggunakan tool anotasi

### Alur Penandatanganan

```
PIMPINAN (canSign)
   │
   ├─→ [Opsi 1] Gunakan TTD Tersimpan
   │      │
   │      ↓
   │   use_uploaded_signature = true
   │   TTD ditempatkan di penomoran
   │
   ├─→ [Opsi 2] Tandatangani Manual
   │      │
   │      ↓
   │   Anotasi PDF
   │   Simpan anotasi
   │   Teruskan ke TU
   │
   └─→ [Opsi 3] Setujui & Gunakan TTE BSrE (jika BSrE enabled)
          │
          ↓
       use_bsre_tte = true
       Approve seperti biasa
       QR BSrE ditambahkan otomatis setelah penomoran
```

---

## BSrE TTE (Tanda Tangan Elektronik)

> **Status**: Hidden feature — tersembunyi di balik feature flag `BSRE_ENABLED=false`.
> Aktifkan dengan set `BSRE_ENABLED=true` di `.env` setelah memiliki akses API BSrE dari BSSN.

### Tentang BSrE

BSrE (Balai Sertifikasi Elektronik) adalah layanan tanda tangan elektronik tersertifikasi dari BSSN (Badan Siber dan Sandi Negara). TTE BSrE menambahkan QR code dan digital signature pada dokumen PDF yang terverifikasi secara hukum.

### Flow BSrE TTE

```
┌──────────────────┐
│   PENANDATANGAN   │  Klik "Setujui & Gunakan TTE BSrE"
│   (Signer)        │  → Set flag use_bsre_tte = true
└────────┬─────────┘  → Approve surat seperti biasa
         │
         ↓
┌──────────────────┐
│   TU / SETUM      │  Melihat badge info:
│   (Penomoran)     │  "TTE BSrE Aktif — akan di-sign setelah penomoran"
└────────┬─────────┘  → Nomori surat seperti biasa
         │
         ↓
┌──────────────────┐
│   BACKEND         │  Setelah PDF dinomori disimpan:
│   (Otomatis)      │  1. Cek flag use_bsre_tte = true
│                    │  2. Cek signer punya NIK + BSrE active
│                    │  3. Kirim PDF ke BSrE API
│                    │  4. Simpan PDF signed BSrE
└────────┬─────────┘
         │
         ↓
    signed_with_bsre = true
    Badge "TTE BSrE" muncul di halaman detail
```

### Konfigurasi BSrE

#### 1. Environment Variables

```env
BSRE_ENABLED=true                         # Aktifkan fitur BSrE
BSRE_API_URL=https://esign.bssn.go.id/api # URL API BSrE
BSRE_API_KEY=your-api-key-here            # API Key dari BSSN
BSRE_TIMEOUT=30                           # Timeout API dalam detik
```

#### 2. Setup User untuk BSrE

Di menu **Admin > Manajemen Hierarki > Edit User**:
- **NIK**: Isi 16 digit NIK pejabat penandatangan (wajib untuk BSrE)
- **Status BSrE**: Set ke "Aktif" setelah user terdaftar di BSrE

| Status BSrE | Deskripsi |
|-------------|-----------|
| Belum Terdaftar | User belum terdaftar di BSrE (default) |
| Terdaftar | User sudah terdaftar tapi belum aktif |
| Aktif | User aktif dan bisa menggunakan TTE BSrE |

#### 3. Syarat User Bisa Menggunakan BSrE

User dapat menggunakan TTE BSrE jika **semua** kondisi terpenuhi:
1. `BSRE_ENABLED=true` di `.env`
2. User memiliki **NIK** (16 digit) terisi
3. Status BSrE user = **Aktif**
4. User memiliki role **canSign** (pimpinan/penandatangan)

### File & Komponen BSrE

| File | Fungsi |
|------|--------|
| `config/bsre.php` | Konfigurasi BSrE (feature flag, API URL, API key, timeout) |
| `app/Services/BsreService.php` | Service untuk komunikasi dengan BSrE API |
| `database/migrations/*_add_bsre_fields.php` | Migration kolom BSrE di tabel users & surat_keluar_workflow |

### Kolom Database BSrE

**Tabel `users`:**
| Kolom | Tipe | Deskripsi |
|-------|------|-----------|
| `nik` | string(16), nullable | NIK untuk BSrE |
| `bsre_status` | string, nullable | null / registered / active |

**Tabel `surat_keluar_workflow`:**
| Kolom | Tipe | Deskripsi |
|-------|------|-----------|
| `use_bsre_tte` | boolean, default false | Flag dari signer bahwa surat akan di-TTE BSrE |
| `signed_with_bsre` | boolean, default false | Flag bahwa BSrE berhasil applied |
| `bsre_signed_file` | string, nullable | Path file PDF signed BSrE |

### Graceful Fallback

- Jika BSrE API gagal/timeout → surat **tetap terkirim normal** tanpa TTE BSrE
- Error dicatat di log (`Log::warning`)
- Badge "Menunggu TTE BSrE" tetap tampil sampai BSrE berhasil
- Tidak ada gangguan pada flow penomoran yang sudah berjalan

### Catatan Teknis

- BSrE API biasanya memerlukan **passphrase** dari penandatangan. Parameter ini sudah disiapkan di `BsreService::signPdf()` sebagai nullable. Implementasi detail passphrase disesuaikan nanti saat spesifikasi API BSrE sudah jelas.
- PDF signed BSrE disimpan di: `storage/app/private/surat-keluar-workflow/bsre-signed/`
- BSrE diterapkan di 3 jalur penomoran: `processNumbering()` (TU), `setumNumbering()` (SETUM), dan `tuForward()` (TU forward)

---

## Default Users

### Admin
| Email | Jabatan |
|-------|---------|
| `admin@kopassus.mil.id` | Administrator Sistem |

### Pimpinan Tertinggi
| Email | Jabatan |
|-------|---------|
| `panglima@kopassus.mil.id` | Panglima KOPASSUS |
| `wakil.panglima@kopassus.mil.id` | Wakil Panglima KOPASSUS |

### Sekretariat Pimpinan
| Email | Jabatan |
|-------|---------|
| `kasmin@kopassus.mil.id` | KASMIN |
| `paurmin@kopassus.mil.id` | PAURMIN |

### Pimpinan Staf
| Email | Jabatan |
|-------|---------|
| `asren@kopassus.mil.id` | ASREN |
| `asintel@kopassus.mil.id` | ASINTEL |
| `asops@kopassus.mil.id` | ASOPS |
| `aspers@kopassus.mil.id` | ASPERS |
| `aslog@kopassus.mil.id` | ASLOG |

### Pimpinan Satuan (Contoh)
| Email | Jabatan |
|-------|---------|
| `dandenma@kopassus.mil.id` | DANDENMA |
| `kasetum@kopassus.mil.id` | KASETUM |
| `dansatsiber@kopassus.mil.id` | DANSAT SIBER |
| `dansatdukmin@kopassus.mil.id` | DANSAT DUKMIN |

### Tata Usaha (Contoh)
| Email | Jabatan |
|-------|---------|
| `tu.asren@kopassus.mil.id` | TU ASREN |
| `tu.siber@kopassus.mil.id` | TU SIBER |
| `katuud.satdukmin@kopassus.mil.id` | KATUUD SATDUKMIN |

### IT Satuan
| Email | Jabatan |
|-------|---------|
| `ir.it@kopassus.mil.id` | IR IT |
| `wair.it@kopassus.mil.id` | WAIR IT |
| `ses.it@kopassus.mil.id` | SES IT |
| `tu.it@kopassus.mil.id` | TU IT |

**Password:** Lihat `DEFAULT_USER_PASSWORD` di file `.env`

---

## Artisan Commands

### User Management

```bash
# Buat/Update Admin
php artisan admin:create

# Reset semua password user
php artisan users:reset-passwords "passwordBaru123"
```

### Surat Management

```bash
# Set nomor urut terakhir
php artisan surat:set-last-nomor --group=B --nomor=50

# Hapus surat
php artisan surat:delete keluar "DRAFT/005/SK/II/SREN/2026"
php artisan surat:delete masuk 123

# Generate stok backdate
php artisan surat:generate-stok --tahun=2026

# Reset status surat keluar (testing)
php artisan surat:reset-status 42
```

### Data Management

```bash
# Reset semua data surat (HATI-HATI!)
php artisan app:reset-surat-data

# Bersihkan log aktivitas
php artisan logs:clean --days=30

# Hapus user account duplikat
php artisan users:delete-duplicates

# Perbaiki superior_id yang rusak/tidak valid
php artisan users:fix-superior-id
```

### Queue Management

```bash
# Retry failed jobs
php artisan jobs:retry --all

# Lihat failed jobs
php artisan jobs:retry --list
```

---

## Troubleshooting

### 419 PAGE EXPIRED Error

```bash
# Clear cache
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear

# Pastikan .env
APP_ENV=local
APP_URL=http://127.0.0.1:8000
```

### Storage Permission Error

```bash
chmod -R 775 storage bootstrap/cache
```

### PDF Preview Tidak Muncul

1. Clear cache: `php artisan cache:clear`
2. Check browser console
3. Verify PDF.js CDN accessible
4. Check file permissions di storage

### Queue Jobs Tidak Jalan

```bash
# Pastikan queue worker berjalan
php artisan queue:work

# Atau untuk development
php artisan queue:listen
```

---

## Struktur Folder

```
disposisi-kopassus/
├── app/
│   ├── Http/Controllers/
│   │   ├── SuratMasukController.php
│   │   ├── SuratKeluarWorkflowController.php
│   │   ├── DisposisiController.php
│   │   └── DashboardController.php
│   ├── Models/
│   │   ├── SuratMasuk.php
│   │   ├── SuratKeluarWorkflow.php
│   │   ├── Disposisi.php
│   │   ├── User.php
│   │   ├── TemplateLembarDisposisi.php
│   │   ├── InstruksiDisposisi.php
│   │   ├── SatuanStamp.php
│   │   └── UserSignature.php
│   ├── Services/
│   │   ├── PdfNumberingService.php
│   │   └── BsreService.php
│   └── Jobs/
│       └── GenerateSuratMasukFromDisposisi.php
├── database/
│   ├── migrations/
│   └── seeders/
│       └── KopassusFullOrganizationSeeder.php
├── resources/views/
│   ├── surat-masuk/
│   ├── surat-keluar-workflow/
│   ├── disposisi/
│   └── dashboard.blade.php
├── storage/app/
│   ├── public/
│   │   ├── surat-masuk/
│   │   ├── surat-keluar/
│   │   └── disposisi/
│   └── private/surat-keluar-workflow/
│       └── bsre-signed/
└── routes/web.php
```

---

## License

Proprietary software © 2026 KOPASSUS TNI AD

---

**Last Updated**: 10 February 2026
**Version**: 1.4.0

### Changelog v1.4.0
- **BSrE TTE (Tanda Tangan Elektronik)**: Integrasi infrastruktur TTE tersertifikasi dari BSrE/BSSN untuk surat keluar
  - Hidden feature di balik feature flag `BSRE_ENABLED=false` (siap diaktifkan saat API ready)
  - Opsi baru "Setujui & Gunakan TTE BSrE" di halaman penandatangan
  - Info badge di modal penomoran jika surat akan di-TTE BSrE
  - BSrE signing otomatis setelah penomoran (processNumbering, setumNumbering, tuForward)
  - Badge status "Menunggu TTE BSrE" dan "TTE BSrE" di halaman detail surat
  - Kolom NIK dan Status BSrE di form admin user (create & edit)
  - Graceful fallback: jika BSrE gagal, surat tetap terkirim normal
  - Service `BsreService.php` untuk komunikasi API BSrE
  - Konfigurasi `config/bsre.php` dengan environment variables
  - Migration kolom BSrE di tabel `users` dan `surat_keluar_workflow`

### Changelog v1.3.1
- **Full Height PDF Preview**: PDF preview ditampilkan dengan tinggi penuh (tidak terpotong) di semua ukuran layar termasuk desktop, tablet, dan mobile
- **Default Tool untuk Signer**: Tool anotasi default untuk penandatangan diubah dari "pen" menjadi "select/move" untuk pengalaman pengguna yang lebih baik
- Responsif layout untuk halaman detail Surat Masuk dan Surat Keluar

### Changelog v1.3.0
- **Multi-page PDF Stamping**: Pilih halaman berbeda untuk nomor, tanggal, cap, dan tanda tangan secara independen
- **Separate Nomor & Tanggal Selection**: Checkbox terpisah untuk memilih halaman nomor surat dan tanggal
- **Cap Satuan**: Manajemen cap/stempel per satuan dengan upload gambar PNG
- **Tanda Tangan Tersimpan**: Upload dan gunakan tanda tangan pejabat untuk penandatanganan surat
- **Draggable Preview**: Drag-and-drop positioning untuk semua elemen stamp dengan preview real-time
- **Enhanced Stamping Options**: Format nomor (full/number only), format tanggal, ukuran font, bold
- **Visibility Toggle**: Elemen draggable tampil/sembunyi sesuai halaman yang dipilih
- **TU Modal, SETUM Modal, Bagian Modal**: Semua modal penomoran mendukung multi-page stamping
- Perbaikan per-satuan counter untuk penomoran TU Satuan
- Command untuk fix superior_id references yang rusak
- Command untuk delete duplicate user accounts

### Changelog v1.2.0
- Tambah flow khusus satuan IT (SES IT sebagai gateway)
- Tambah status `pending_ses_it_review` untuk surat keluar IT
- Perbaikan konsistensi badge status antara dashboard dan halaman index
- Update form lengkapi lembar disposisi untuk disposisi antar satuan
- Perbaikan visibilitas surat keluar untuk SES IT di dashboard
