# Modul Kerja Sama - Dokumentasi

## Overview
Modul Kerja Sama adalah sistem manajemen kerjasama antara Admin dan Media Partner. Modul ini mengelola seluruh flow dari pengajuan kerjasama hingga pelaporan.

## Flow Kerja Sama

### 1. Admin Mengajukan Kerja Sama
- Admin membuat data Cooperation baru dengan informasi:
  - Judul Kerja Sama
  - Tanggal Pengajuan Awal (initial_submission_date)
  - Tanggal Pengajuan Akhir (final_submission_date)
  - Deadline Penugasan (assignment_deadline)
  - Deadline Verifikasi (verification_deadline)
  - Deskripsi
- Admin mengirim pengajuan ke Media Partner (CooperationMedia)
- Status awal: **MENUNGGU**

### 2. Media Menerima/Menolak Pengajuan
- Media mereview pengajuan kerjasama dalam periode initial_submission_date sampai final_submission_date
- Media dapat:
  - **MENERIMA**: Status berubah menjadi ACCEPTED, lanjut ke step 3
  - **MENOLAK**: Status berubah menjadi REJECTED, flow selesai (dengan alasan penolakan/rejection reason)

### 3. Media Mengajukan Proposal
- Jika Media menerima, Media mengajukan proposal (CooperationProposal)
- Proposal berisi:
  - Deskripsi
  - Tanggal mulai dan akhir proposed
  - E-Catalog
  - File dokumen (via Spatie Media Library)
  - Jurnalis yang terlibat
- Status proposal: **MENUNGGU**

### 4. Admin Meninjau Proposal
- Admin mereview proposal yang diajukan Media
- Admin dapat:
  - **MENERIMA**: Status proposal menjadi ACCEPTED, lanjut ke step 5
  - **MENOLAK**: Status proposal menjadi REJECTED, Media harus ajukan ulang (dengan alasan penolakan)

### 5. Admin Kirim Penugasan
- Jika Admin menerima proposal, Admin membuat Task Assignment
- Task Assignment berisi:
  - Start Date
  - End Date
  - Task Description
  - Report Amount (jumlah report yang harus dibuat)
- Admin assign task ke Media Partner (TaskAssignmentMedia)
- Status: **MENUNGGU**

### 6. Media Mengirim Laporan
- Media membuat Report berdasarkan Task Assignment
- Report berisi:
  - Title
  - Publication Date
  - Link
  - Description
  - Image (via Spatie Media Library)
- Status report: **MENUNGGU** (untuk verifikasi admin)
- Media dapat membuat multiple reports sesuai report_amount yang diminta

### 7. Admin Menerima/Menolak Laporan
- Admin mereview laporan yang dikirim Media
- Admin dapat:
  - **MENERIMA**: Status report menjadi ACCEPTED
  - **MENOLAK**: Status report menjadi REJECTED, Media harus kirim ulang (dengan alasan penolakan)

## Status Otomatis Berdasarkan Deadline

### Status Cooperation (otomatis berubah berdasarkan waktu):
- **MENUNGGU**: Status awal ketika admin kirim kerja sama
- **PENUGASAN**: Ketika tanggal final_submission_date habis (media sudah tidak bisa ajukan proposal)
- **VERIFIKASI**: Ketika assignment_deadline habis (media sudah selesai kirim laporan)
- **PEMBAYARAN**: Ketika verification_deadline habis (admin sudah selesai verifikasi laporan)
- **COMPLETED**: Ketika pembayaran sudah selesai (payment_date diisi)

### Status Individual Components:
- **ACCEPTED**: Diterima (untuk proposal, report, dll)
- **REJECTED**: Ditolak (untuk proposal, report, dll) - selalu dengan alasan penolakan

## Database Schema

### Table: cooperations
- id
- title (varchar 200)
- initial_submission_date (date) - Tanggal mulai pengajuan proposal
- final_submission_date (date) - Tanggal akhir pengajuan proposal
- assignment_deadline (date, nullable) - Deadline penyelesaian penugasan
- verification_deadline (date, nullable) - Deadline verifikasi laporan
- description (text)
- payment_amount (unsigned integer, nullable) - Jumlah pembayaran
- payment_date (date, nullable) - Tanggal pembayaran
- status (enum: MENUNGGU, PENUGASAN, VERIFIKASI, PEMBAYARAN, COMPLETED, ACCEPTED, REJECTED)
- created_at, updated_at, deleted_at

### Table: cooperation_media (Pivot)
- id
- cooperation_id (FK)
- partner_media_id (FK)
- status (enum: PENDING, ACCEPTED, REJECTED)
- created_at, updated_at

### Table: cooperation_proposals
- id
- cooperation_id (FK)
- partner_media_id (FK)
- description (text, nullable)
- e_catalog (varchar 50, nullable)
- status (enum: PENDING, ACCEPTED, REJECTED)
- created_at, updated_at

### Table: task_assignments
- id
- cooperation_id (FK)
- start_date (date)
- end_date (date)
- task_description (text)
- report_amount (unsigned integer)
- status (enum: PENDING, ACCEPTED, REJECTED)
- created_at, updated_at

### Table: task_assignment_media (Pivot)
- id
- task_assignment_id (FK)
- partner_media_id (FK)
- status (enum: PENDING, ACCEPTED, REJECTED)
- created_at, updated_at

### Table: reports
- id
- task_assignment_id (FK)
- title (varchar 200)
- publication_date (date)
- link (varchar 50, nullable)
- description (text, nullable)
- status (enum: MENUNGGU, ACCEPTED, REJECTED)
- created_at, updated_at, deleted_at
- Media files (handled by Spatie Media Library)

### Table: rejection_reasons (Polymorphic)
- id
- rejectable_type (morphs)
- rejectable_id (morphs)
- reason (text)
- created_at, updated_at

## Models

### Cooperation
**Location**: `app/Models/Cooperation.php`

**Relationships**:
- `partnerMedia()`: BelongsToMany - Media yang terlibat dalam kerjasama
- `cooperationMedia()`: HasMany - Pivot records dengan status
- `cooperationProposals()`: HasMany - Proposal yang diupload media
- `taskAssignments()`: HasMany - Task yang diberikan ke media

### CooperationMedia (Pivot)
**Location**: `app/Models/CooperationMedia.php`

**Relationships**:
- `cooperation()`: BelongsTo
- `partnerMedia()`: BelongsTo
- `rejectionReasons()`: MorphMany

### CooperationProposal
**Location**: `app/Models/CooperationProposal.php`

**Relationships**:
- `cooperation()`: BelongsTo
- `partnerMedia()`: BelongsTo
- `rejectionReasons()`: MorphMany

### TaskAssignment
**Location**: `app/Models/TaskAssignment.php`

**Relationships**:
- `cooperation()`: BelongsTo
- `partnerMedia()`: BelongsToMany (via task_assignment_media)
- `taskAssignmentMedia()`: HasMany
- `rejectionReasons()`: MorphMany
- `reports()`: HasMany (commented, needs to be uncommented)

### Report
**Location**: `app/Models/Report.php`

**Relationships**:
- `taskAssignment()`: BelongsTo
- `rejectionReasons()`: MorphMany

**Implements**: HasMedia (Spatie Media Library) untuk handle image dan file attachments

**Implements**: HasMedia (Spatie Media Library)

### RejectionReason
**Location**: `app/Models/RejectionReason.php`

**Relationships**:
- `rejectable()`: MorphTo - Dapat digunakan untuk CooperationMedia, CooperationProposal, TaskAssignment, Report

## Filament Resources

### CooperationResource
**Location**: `app/Filament/Resources/Manage/Cooperations/CooperationResource.php`

**Navigation**:
- Group: Manage
- Label: Kerja Sama
- Icon: HandRaised
- Sort: 20
- Slug: manage/cooperations

**Pages**:
- List: `/manage/cooperations`
- Create: `/manage/cooperations/create`
- Edit: `/manage/cooperations/{record}/edit`

**Form Fields** (CooperationForm):
- Title (required, max 200)
- Initial Submission Date (required, date)
- Final Submission Date (required, date, after initial_submission_date)
- Description (required, textarea)

**Table Columns** (CooperationsTable):
- Title
- Initial Submission Date
- Final Submission Date
- Description
- Created At
- Updated At

## Status Enum

### CooperationStatus
**Location**: `app/Enums/CooperationStatus.php`

**Values**:
- `MENUNGGU` (1): Menunggu - Status awal kerja sama
- `PENUGASAN` (2): Penugasan - Ketika deadline proposal habis
- `VERIFIKASI` (3): Verifikasi - Ketika deadline penugasan habis
- `PEMBAYARAN` (4): Pembayaran - Ketika verifikasi selesai
- `COMPLETED` (5): Selesai - Ketika pembayaran selesai
- `ACCEPTED` (6): Diterima - Untuk proposal/report yang diterima
- `REJECTED` (7): Ditolak - Untuk proposal/report yang ditolak

**Colors**:
- MENUNGGU: warning (yellow)
- PENUGASAN: info (blue)
- VERIFIKASI: primary (blue)
- PEMBAYARAN: secondary (gray)
- COMPLETED: success (green)
- ACCEPTED: success (green)
- REJECTED: danger (red)

## Next Steps / TODO

1. **Uncomment Report Relationship** di TaskAssignment model
2. **Fix Status Colors** di CooperationStatus enum (ACCEPTED should be success, REJECTED should be danger)
3. **Create Relation Managers** untuk:
   - CooperationMedia (di Cooperation Resource)
   - CooperationProposal (di Cooperation Resource)
   - TaskAssignment (di Cooperation Resource)
   - Report (di TaskAssignment Resource)
4. **Create Custom Actions** untuk:
   - Send to Media (dari Cooperation)
   - Accept/Reject Cooperation (dari Media side)
   - Upload Proposal (dari Media side)
   - Accept/Reject Proposal (dari Admin side)
   - Create Task Assignment (dari Admin side)
   - Create Report (dari Media side)
5. **Add Permissions** untuk role Admin dan Media
6. **Create Notifications** untuk setiap perubahan status
7. **Add Validation** untuk memastikan flow berjalan dengan benar
8. **Create Dashboard Widgets** untuk monitoring kerjasama

## File Structure

```
app/
├── Enums/
│   └── CooperationStatus.php
├── Filament/
│   └── Resources/
│       └── Manage/
│           └── Cooperations/
│               ├── CooperationResource.php
│               ├── Pages/
│               │   ├── ListCooperations.php
│               │   ├── CreateCooperation.php
│               │   └── EditCooperation.php
│               ├── Schemas/
│               │   └── CooperationForm.php
│               └── Tables/
│                   └── CooperationsTable.php
└── Models/
    ├── Cooperation.php
    ├── CooperationMedia.php
    ├── CooperationProposal.php
    ├── TaskAssignment.php
    ├── Report.php
    └── RejectionReason.php

database/
└── migrations/
    ├── 2025_12_12_111212_create_cooperations_table.php
    ├── 2025_12_12_111307_create_cooperation_media_table.php
    ├── 2025_12_12_132245_create_cooperation_proposals_table.php
    ├── 2025_12_12_132453_create_task_assignments_table.php
    ├── 2025_12_12_133823_create_media_task_assignment_table.php
    ├── 2025_12_12_135847_create_reports_table.php
    └── 2025_12_12_135855_create_rejection_reasons_table.php
```

## Notes

- Semua tabel sudah di-migrate
- Model Cooperation sudah dilengkapi dengan relationships
- Resource Cooperation sudah dibuat dan siap digunakan
- Typo di migration task_assignments sudah diperbaiki (task_description dari date ke text)
- Icon Handshake diganti dengan HandRaised karena tidak tersedia di Heroicon
