simedkom/COOPERATION_MODULE.md

321 lines
10 KiB
Markdown

# 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
- `taskAssignment()`: HasOne - 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