simedkom/COOPERATION_MODULE.md

10 KiB

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