📄 Contract Request System – ERD & UX Flow

🧱 ERD (Entity Relationship Diagram)

1. contract_requests

- id (uuid / bigint)
- contract_number (string, unique) // CTR-001/03-2026
- created_by (user_id)
- notes (text, nullable)
- status (enum: submitted, completed)
- handled_by (user_id, nullable)
- handled_at (timestamp, nullable)
- created_at
- updated_at
- deleted_at (soft delete)

2. contract_request_items

- id
- contract_request_id (FK)
- pipeline_id (FK)
- created_at

Rules:

1 contract → multiple SO
1 SO → hanya boleh ada di 1 contract aktif

3. contract_request_files

- id
- contract_request_id (FK)
- file_path
- file_name
- uploaded_by (user_id)
- created_at

Rules:

hanya file PDF
bisa multiple file
tidak ada versioning

4. sales_orders (existing)

- id
- contract_request_id (nullable, optional)

🔗 Relasi Antar Tabel

users (1) ---- (N) contract_requests
contract_requests (1) ---- (N) contract_request_items
contract_requests (1) ---- (N) contract_request_files
sales_orders (1) ---- (1) contract_request_items

🧠 Status Logic

IF contract_request_files.count > 0
→ status = completed

ELSE
→ status = submitted

🔐 Business Rules

- Contract bisa dibuat tanpa SO (via pipeline)
- Contract bisa memiliki multiple SO
- SO hanya boleh ada di 1 contract aktif
- File hanya bisa upload/delete oleh admin sales
- File dihapus → status kembali ke submitted
- Sales hanya melihat miliknya sendiri
- Admin sales & superadmin melihat semua data

🖥️ UX FLOW

👤 SALES / LEAD SALES FLOW

1. Entry Point

- Menu: Request Contract
- Atau dari Pipeline (Draft Stage)

2. Create Contract Request
   Field:

- Contract Number (auto-generate)
- Pilih SO/Pipeline Name (optional)
- Notes

Action:

- Klik Submit

Result:

- Status = submitted

3. List View

Summary:
[ Total: 24 ] [ Pending: 10 ] [ Completed: 14 ] [ This Month: 6 ]

Filter:
[ Contract No ] [ SO No ] [ Status ] [ Date Range ]

## Table Example:

## | Contract | SO | Status | Date |

Kolom:

- Contract Number
- No SO / Nama Pipeline (bentuk list di dalam table)
- Status
- Created At

Status:

- Submitted → Menunggu kontrak
- Completed → Sudah ada kontrak

4. Detail View
   Menampilkan:

- List SO
- Notes
- File (jika ada)

Akses:

- Tidak bisa edit
- Tidak bisa upload file

🔔 Notifikasi

- Saat contract completed → sales mendapat notifikasi

👨‍💼 ADMIN SALES FLOW

1. List View

Summary:
[ Need Action: 18 ] [ Completed Today: 5 ] [ Total: 120 ]

Filter:
[ Sales ] [ Contract No ] [ SO No ] [ Status ] [ Date ]

## Table Example:

## | Contract | Sales | SO | Status | Date |

Filter:

- Submitted (butuh action)
- Completed

Default fokus:

- Submitted

2. Detail Contract
   Menampilkan:

- Info contract
- No SO / Nama Pipeline
- Notes
- File section

3. Upload File
   Action:

- Upload file PDF

Result:

- Status → completed
- handled_by → admin
- handled_at → current timestamp

4. Delete File
   Action:

- Hapus file

Result:

- Status → submitted

🔔 Notifikasi

- Saat ada request baru → admin & superadmin dapat notifikasi

🎯 UX Enhancements (Recommended)

1. Badge Counter
   Request Contract (jumlah submitted)

2. Empty State
   "Belum ada file kontrak di-upload"

3. Disable SO
   SO yang sudah punya contract → tidak bisa dipilih

4. Auto Contract Number Format
   CTR-{running_number}/{bulan}-{tahun}/

Contoh:
CTR-001/03-2026

⚠️ Edge Cases

- SO dihapus:
  - jika masih ada SO lain → contract tetap
  - jika tidak ada → contract bisa dihapus / invalid

- File dihapus:
  → status kembali ke submitted

- Duplicate SO:
  → dicegah di backend

✅ Summary

- Flow sederhana: submitted → completed
- Tidak ada approval / reject
- Fokus pada tracking dokumen kontrak
- Design scalable untuk future enhancement
