> ## Documentation Index
> Fetch the complete documentation index at: https://docs.quinnsambal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tasks

<style>
  {`
    [class*="max-w-none"][class*="table"] {
      display: block !important;
      overflow-x: auto !important;
      max-width: 100% !important;
      width: 100% !important;
      flex-grow: 0 !important;
    }
    [class*="max-w-none"][class*="table"] > table {
      width: 100% !important;
      max-width: 100% !important;
      table-layout: fixed !important;
    }
    .mermaid {
      max-width: 100% !important;
      overflow-x: auto !important;
    }
    article svg[role="img"] {
      max-width: 100% !important;
      height: auto !important;
    }
    article img, .prose img {
      max-width: 100% !important;
      height: auto !important;
    }
    img[src*="LOGO"], img[src*="logo"] {
      max-width: 120px !important;
      max-height: 40px !important;
      width: auto !important;
      height: auto !important;
      object-fit: contain !important;
    }
    `}
</style>

***

title: "Tasks"
description: "Task management dengan 7 view, Eisenhower Matrix, sub-task, recurring task, Google Calendar sync, dan AI assistant di SNISHOP ERP."
-------------------------------------------------------------------------------------------------------------------------------------------------

# Tasks

<img src="https://mintcdn.com/quinnofspicy/7mQVU6fsgRvm4pNL/docs/mintlify/screenshots/productivity/tasks.png?fit=max&auto=format&n=7mQVU6fsgRvm4pNL&q=85&s=6847e8ab7302c1bcec1e15f1c7b876d6" alt="Tasks" width="1920" height="1080" data-path="docs/mintlify/screenshots/productivity/tasks.png" />

Halaman Tasks adalah pusat manajemen pekerjaan tim kamu. Dibangun di atas `Tasks.jsx` (1549 baris) dengan arsitektur multi-view yang memungkinkan tim melihat tugas dari berbagai perspektif — mulai dari daftar sederhana hingga Eisenhower Matrix untuk prioritas strategis.

Setiap task tersimpan di entity **Task** pada base44 backend dan tersinkronisasi secara realtime melalui BroadcastChannel, Pusher, dan global events. Sistem ini juga terintegrasi dengan gamifikasi (XP), Google Calendar, dan AI assistant.

## Arsitektur Komponen

```mermaid theme={null}
graph TD
    A[Tasks.jsx<br/>1549 lines] --> B[TaskSidebar<br/>193 lines]
    A --> C[TaskForm<br/>369 lines]
    A --> D[7 View Renderer]
    A --> E[TaskFloatingAI]
    D --> F[AllTasksView]
    D --> G[TaskMatrixView<br/>194 lines]
    D --> H[CalendarView]
    D --> I[BoardView]
    D --> J[TimeTrackingView]
    D --> K[MyDayView]
    D --> L[Next7DaysView]
    C --> M[ReactQuill Editor]
    C --> N[SubTaskManager]
    C --> O[RecurringTaskModal]
    A --> P[TaskNotificationChecker]
```

## Entity Task

| Field | Tipe | Deskripsi |
| - | - | - |
| `title` | string | Judul task |
| `content` | rich text (HTML) | Deskripsi detail dengan formatting |
| `workspace_id` | FK → Workspace | Scope task (personal atau company) |
| `status` | enum | `todo`, `in_progress`, `review`, `done`, `cancelled` |
| `priority` | enum | `low`, `medium`, `high`, `urgent` |
| `due_date` | date | Deadline task |
| `assignee_id` | FK → User | Anggota tim yang bertanggung jawab |
| `company_id` | FK → Company | Scope perusahaan |
| `tags` | string\[] | Label untuk kategorisasi |
| `estimated_hours` | number | Estimasi waktu pengerjaan |
| `reminder_config` | object | `{ value, unit }` konfigurasi pengingat |
| `attachments` | array | File lampiran |
| `completed_at` | datetime | Timestamp saat task selesai |
| `google_event_id` | string | ID event Google Calendar (sync) |
| `done` | boolean | Flag selesai (untuk filtering) |
| `created_date` | datetime | Timestamp pembuatan |

## 7 View + 2 Mode Tambahan

TaskSidebar menyediakan navigasi dengan 9 view berbeda, masing-masing dengan filter otomatis:

| View | Filter Otomatis | Kegunaan |
| - | - | - |
| **My Day** | `due_date = hari ini` | Fokus tugas hari ini saja |
| **Next 7 Days** | `due_date ∈ [hari ini, hari ini + 7]` | Planning minggu |
| **All Tasks** | Tidak ada filter | Lihat semua task aktif |
| **Completed** | `status = done` | Review tugas selesai |
| **Calendar** | Tampilan kalender bulanan | Visualisasi timeline |
| **Board** | Kanban per status | Drag-and-drop antar kolom status |
| **Time Tracking** | Task dengan `estimated_hours` | Monitoring alokasi waktu |
| **Habits** | Link ke HabitPage | Tracking kebiasaan |
| **Matrix** | Eisenhower 4 kuadran | Prioritas strategis |

## Eisenhower Matrix

TaskMatrixView memetakan task ke 4 kuadran berdasarkan kombinasi priority dan urgensi:

```mermaid theme={null}
graph LR
    subgraph "Do First"
        A1[urgent + high]
    end
    subgraph "Schedule"
        B1[urgent + low/medium]
    end
    subgraph "Delegate"
        C1[not urgent + high]
    end
    subgraph "Eliminate"
        D1[not urgent + low/medium]
    end
```

* **Do First** (merah): Task urgent dan penting — kerjakan segera
* **Schedule** (kuning): Task urgent tapi kurang penting — jadwalkan
* **Delegate** (biru): Task penting tapi tidak urgent — delegasikan
* **Eliminate** (abu-abu): Task tidak urgent dan tidak penting — pertimbangkan hapus

Drag-and-drop antar kuadran didukung oleh `@hello-pangea/dnd`.

## Status & Prioritas

### Status Workflow

```mermaid theme={null}
stateDiagram-v2
    [*] --> todo
    todo --> in_progress
    in_progress --> review
    review --> done
    review --> in_progress
    todo --> cancelled
    in_progress --> cancelled
    done --> [*]
    cancelled --> [*]
```

### Prioritas Level

| Level | Warna | Deskripsi |
| - | - | - |
| `urgent` | Merah | Harus diselesaikan segera, blocking |
| `high` | Oranye | Penting, perlu perhatian cepat |
| `medium` | Kuning | Normal, sesuai timeline |
| `low` | Hijau | Bisa ditunda, nice-to-have |

## Sub-Task & Recurring Task

### SubTaskManager

Setiap task bisa memiliki sub-task yang lebih kecil. Sub-task memiliki status independen dan progress task induk dihitung dari rasio sub-task yang selesai.

### RecurringTask

Task yang berulang secara otomatis berdasarkan pola yang ditentukan:

* Harian, mingguan, bulanan
* Custom interval
* Entity terpisah: **RecurringTask**

## Integrasi Eksternal

### Google Calendar Sync

Task dengan `due_date` bisa disinkronisasi ke Google Calendar melalui `syncTaskToGoogleCalendar()`. Field `google_event_id` menyimpan ID event di Google untuk update dua arah.

### Gamifikasi

Setiap task yang diselesaikan memberikan XP melalui `gamificationHelper`. XP berkontribusi ke level dan achievement user.

### Notifikasi

`TaskNotificationChecker` memantau deadline yang mendekat dan mengirim notifikasi otomatis berdasarkan `reminder_config`.

## Workspace Policy

```mermaid theme={null}
flowchart TD
    A[User buka Tasks] --> B{Scope?}
    B -->|Company| C[resolveTaskWorkspaceId]
    C --> D{Workspace exists?}
    D -->|Ya| E[Gunakan workspace]
    D -->|Tidak| F[Auto-create workspace]
    F --> E
    B -->|Personal| G[buildTasksWorkspaceQuery]
    G --> H[owner_id scoped query]
    H --> E
    E --> I[Load tasks]
```

`tasksWorkspacePolicy.js` (116 baris) menangani:

* Auto-create workspace company jika belum ada
* Personal scope menggunakan `owner_id`
* SRE self-healing: deteksi duplikat workspace, merge tasks, nonaktifkan duplikat

## Realtime Sync

Sistem sync menggunakan 4 layer untuk memastikan konsistensi data:

| Layer | Mekanisme | Fallback |
| - | - | - |
| 1 | BroadcastChannel API | Tab-to-tab dalam browser yang sama |
| 2 | Pusher events | Cross-device realtime |
| 3 | Global DOM events | In-page component sync |
| 4 | localStorage events | Browser tanpa BroadcastChannel |

Anti-flickering guard (`hasRecentLocalUpdate`) mencegah data lama dari server menimpa update lokal yang baru saja dilakukan.

## Subscription Limit

| Plan | Limit Task |
| - | - |
| Free | 50 tasks |
| Paid | Unlimited |

Storage tracking估算asi penggunaan storage pada setiap create task.

## Cara Akses

Dari sidebar, klik menu **Productivity** > **Tasks**.

## Flow Penggunaan

1. Buka halaman Tasks dari sidebar — default view adalah **My Day**
2. Klik **"Tambah Task"** atau gunakan **Quick Add** inline untuk task cepat
3. Isi judul, deskripsi (rich text dengan ReactQuill), deadline, dan prioritas
4. Assign task ke anggota tim dan tambahkan tags untuk kategorisasi
5. Pilih view yang sesuai: Board untuk Kanban, Matrix untuk prioritas, Calendar untuk timeline
6. Untuk task besar, pecah menjadi sub-task melalui **SubTaskManager**
7. Untuk task berulang, klik **Recurring** dan atur pola pengulangan
8. Tandai task sebagai done saat selesai — XP otomatis bertambah

## Tips

* Gunakan **My Day** setiap pagi untuk menentukan fokus hari ini, jangan langsung buka All Tasks karena bisa overwhelming
* Eisenhower Matrix sangat efektif untuk meeting prioritas tim — mapping task ke kuadran membantu diskusi objektif
* Set `reminder_config` untuk setiap task dengan deadline ketat, jangan andalkan ingatan
* Manfaatkan Board view dengan drag-and-drop untuk update status yang lebih intuitif daripada klik dropdown

***

## Referensi Entity Schema

Bagian ini mendokumentasikan seluruh field dari setiap entity yang terlibat dalam modul task management, bersumber langsung dari definisi JSONC base44.

### Diagram Relasi Entity (ERD)

```mermaid theme={null}
erDiagram
    User ||--o{ Task : "membuat / ditugaskan"
    User ||--o{ Workspace : "memiliki"
    User ||--o{ Comment : "menulis"
    User ||--o{ TimeEntry : "mencatat waktu"
    User ||--o{ RecurringTask : "membuat"

    Workspace ||--o{ Task : "menampung"
    Workspace ||--o{ WorkspaceMember : "memiliki anggota"
    Workspace ||--o{ Comment : "terkait"
    Workspace ||--o{ Label : "memiliki label"
    Workspace ||--o{ RecurringTask : "menampung"

    Task ||--o{ Task : "parent ke sub-task"
    Task ||--o{ Comment : "memiliki komentar"
    Task ||--o{ TimeEntry : "mencatat waktu"
    Task ||--o| RecurringTask : "dihasilkan dari"

    Project ||--o{ Task : "memiliki task"
    Project ||--o{ TimeEntry : "mencatat waktu"

    WorkspaceMember }o--|| User : "anggota adalah"
    WorkspaceMember }o--|| Workspace : "bergabung ke"

    Label }o--|| Workspace : "label milik workspace"

    Task {
        string workspace_id FK
        string company_id FK
        string title "wajib"
        string content "rich text HTML"
        enum status "todo|in_progress|completed|done"
        enum priority "low|medium|high|urgent"
        datetime due_date "deadline"
        string assignee_id FK
        array tags "label kategorisasi"
        number estimated_time "estimasi menit"
        number actual_time "waktu aktual menit"
        boolean is_time_tracked "flag tracking"
        array time_entries "embedded entries"
        string parent_task_id FK "sub-task parent"
        array sub_tasks "array of sub-task IDs"
        string recurring_task_id FK "sumber recurring"
        datetime completed_at "timestamp selesai"
        boolean reminder_sent "flag notifikasi"
        string google_event_id "sync Google Calendar"
        object reminder_config "konfigurasi pengingat"
    }

    RecurringTask {
        string task_id FK "template task"
        string workspace_id FK
        string title "wajib"
        string content "deskripsi"
        enum frequency "daily|weekly|monthly|yearly"
        number interval "default 1"
        array days_of_week "hari berulang"
        number day_of_month "tanggal berulang"
        datetime start_date "wajib"
        datetime end_date "opsional"
        boolean is_active "default true"
        datetime last_generated "terakhir dibuat"
        enum priority "low|medium|high|urgent"
        string assignee_id FK
    }

    Project {
        string company_id FK
        string name "wajib"
        string description "deskripsi proyek"
        string client_id FK
        string client_name "nama klien"
        string project_manager_id FK
        date start_date "wajib"
        date end_date "deadline proyek"
        number budget "anggaran"
        number actual_cost "biaya aktual, default 0"
        enum status "planning|in_progress|on_hold|completed|cancelled"
        enum priority "low|medium|high|urgent"
        number progress "0-100, default 0"
        array team_members "array of employee IDs"
        array milestones "embedded milestones"
        array attachments "file lampiran"
        array tags "label proyek"
    }

    TimeEntry {
        string company_id FK
        string user_id FK "wajib"
        string project_id FK
        string task_id FK
        date entry_date "wajib"
        time start_time "HH:MM"
        time end_time "HH:MM"
        number duration_minutes "wajib"
        string description "deskripsi pekerjaan"
        boolean billable "default false"
        boolean is_approved "default false"
        string approved_by FK
        enum status "submitted|approved|rejected"
    }

    Comment {
        enum entity_type "task|note"
        string entity_id "wajib"
        string workspace_id FK
        string content "wajib"
        string user_id FK "wajib"
        string user_name "nama penulis"
        string user_email "email penulis"
        array mentions "array of user_ids"
        string parent_comment_id FK "untuk reply"
        datetime edited_at "timestamp edit"
    }

    Workspace {
        string company_id FK "null untuk personal"
        string name "wajib"
        string description "deskripsi workspace"
        string icon "icon workspace"
        string color "default #2563eb"
        string owner_id FK "wajib"
        boolean is_personal "default false"
        object settings "konfigurasi workspace"
    }

    WorkspaceMember {
        string workspace_id FK "wajib"
        string user_id FK "wajib"
        enum role "owner|admin|member|viewer"
        string invited_by "email pengundang"
        datetime joined_at "waktu bergabung"
        string description "catatan tambahan"
        object permissions "hak akses member"
    }

    Label {
        string name "wajib"
        string color "default #9CA3AF"
        string icon "default 🏷️"
        string description "maks 1000 karakter"
        string user_id FK "wajib"
        string workspace_id FK
    }

    User {
        string email "wajib"
        string full_name "wajib"
        enum role "admin|user"
        enum subscription_plan "free|pro|business|advanced|enterprise"
        number productivity_score "default 0"
        number current_streak "streak harian"
        number longest_streak "streak terpanjang"
        number total_tasks_completed "total task selesai"
        number achievement_points "poin achievement"
        number user_level "level pengguna"
    }
```

### Tabel Schema Entity: Task

Entity utama untuk menyimpan setiap task dalam sistem. Sumber: `base44/entities/Task.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `workspace_id` | string | Ya | — | ID workspace tempat task bernaung |
| `company_id` | string | Tidak | `null` | ID perusahaan (null untuk task personal) |
| `title` | string | Ya | — | Judul task |
| `content` | string | Tidak | — | Deskripsi detail task dalam format HTML (rich text) |
| `status` | enum | Tidak | `todo` | Status task: `todo`, `in_progress`, `completed`, `done` |
| `priority` | enum | Tidak | `medium` | Tingkat prioritas: `low`, `medium`, `high`, `urgent` |
| `due_date` | datetime | Tidak | — | Tanggal dan waktu deadline task |
| `assignee_id` | string | Tidak | — | ID user yang ditugaskan mengerjakan task |
| `tags` | string\[] | Tidak | — | Array string label untuk kategorisasi task |
| `estimated_time` | number | Tidak | — | Estimasi waktu pengerjaan dalam satuan menit |
| `actual_time` | number | Tidak | — | Waktu aktual yang dihabiskan dalam satuan menit |
| `is_time_tracked` | boolean | Tidak | `false` | Flag apakah task ini sedang dilacak waktunya |
| `time_entries` | array\[object] | Tidak | — | Array embedded time entry: `{ start, end, duration }` |
| `parent_task_id` | string | Tidak | — | ID parent task jika task ini merupakan sub-task |
| `sub_tasks` | string\[] | Tidak | — | Array ID dari sub-task yang dimiliki task ini |
| `recurring_task_id` | string | Tidak | — | ID RecurringTask jika task ini dibuat secara otomatis oleh recurring |
| `completed_at` | datetime | Tidak | — | Timestamp saat task ditandai selesai |
| `reminder_sent` | boolean | Tidak | `false` | Flag apakah notifikasi pengingat sudah dikirim |
| `google_event_id` | string | Tidak | — | ID event di Google Calendar untuk sinkronisasi dua arah |
| `reminder_config` | object | Tidak | — | Konfigurasi notifikasi pengingat sebelum deadline (`{ value, unit }`) |

### Tabel Schema Entity: RecurringTask

Entity untuk mendefinisikan task yang berulang secara otomatis. Sumber: `base44/entities/RecurringTask.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `task_id` | string | Tidak | — | ID task template yang menjadi pola task berulang |
| `workspace_id` | string | Ya | — | ID workspace tempat recurring task bernaung |
| `title` | string | Ya | — | Judul recurring task |
| `content` | string | Tidak | — | Deskripsi detail recurring task |
| `frequency` | enum | Ya | — | Frekuensi pengulangan: `daily`, `weekly`, `monthly`, `yearly` |
| `interval` | number | Tidak | `1` | Interval pengulangan (1 = setiap periode, 2 = setiap 2 periode, dst) |
| `days_of_week` | number\[] | Tidak | — | Array hari dalam seminggu untuk pengulangan (0=Minggu, 6=Sabtu) |
| `day_of_month` | number | Tidak | — | Tanggal dalam sebulan untuk pengulangan (1-31) |
| `start_date` | datetime | Ya | — | Tanggal mulai pengulangan |
| `end_date` | datetime | Tidak | — | Tanggal akhir pengulangan (kosong = tanpa batas) |
| `is_active` | boolean | Tidak | `true` | Flag apakah recurring task masih aktif |
| `last_generated` | datetime | Tidak | — | Timestamp terakhir kali task baru dibuat dari pola ini |
| `priority` | enum | Tidak | `medium` | Tingkat prioritas: `low`, `medium`, `high`, `urgent` |
| `assignee_id` | string | Tidak | — | ID user yang ditugaskan untuk setiap instance task |

### Tabel Schema Entity: Project

Entity untuk mengelola proyek yang menaungi kumpulan task. Sumber: `base44/entities/Project.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `company_id` | string | Ya | — | ID perusahaan pemilik proyek |
| `name` | string | Ya | — | Nama proyek |
| `description` | string | Tidak | — | Deskripsi detail proyek |
| `client_id` | string | Tidak | — | ID klien yang terkait dengan proyek |
| `client_name` | string | Tidak | — | Nama klien (denormalisasi untuk performa) |
| `project_manager_id` | string | Tidak | — | ID user yang menjabat sebagai manajer proyek |
| `start_date` | date | Ya | — | Tanggal mulai proyek |
| `end_date` | date | Tidak | — | Tanggal target selesai proyek |
| `budget` | number | Tidak | — | Anggaran yang dialokasikan untuk proyek |
| `actual_cost` | number | Tidak | `0` | Biaya aktual yang telah dikeluarkan |
| `status` | enum | Tidak | `planning` | Status proyek: `planning`, `in_progress`, `on_hold`, `completed`, `cancelled` |
| `priority` | enum | Tidak | `medium` | Prioritas proyek: `low`, `medium`, `high`, `urgent` |
| `progress` | number | Tidak | `0` | Persentase kemajuan proyek (0-100) |
| `team_members` | string\[] | Tidak | — | Array ID employee yang menjadi anggota tim proyek |
| `milestones` | array\[object] | Tidak | — | Array milestone tertanam: `{ name, description, due_date, status, completed_date }` |
| `attachments` | string\[] | Tidak | — | Array ID file lampiran proyek |
| `tags` | string\[] | Tidak | — | Array string label untuk kategorisasi proyek |

### Tabel Schema Entity: TimeEntry

Entity untuk mencatat waktu yang dihabiskan pada suatu task atau proyek. Sumber: `base44/entities/TimeEntry.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `company_id` | string | Ya | — | ID perusahaan |
| `user_id` | string | Ya | — | ID pengguna yang mencatat waktu |
| `project_id` | string | Tidak | — | ID proyek yang terkait |
| `task_id` | string | Tidak | — | ID task yang dikerjakan |
| `entry_date` | date | Ya | — | Tanggal pencatatan waktu |
| `start_time` | time | Tidak | — | Waktu mulai dalam format HH:MM |
| `end_time` | time | Tidak | — | Waktu selesai dalam format HH:MM |
| `duration_minutes` | number | Ya | — | Durasi pengerjaan dalam satuan menit |
| `description` | string | Tidak | — | Deskripsi pekerjaan yang dilakukan selama durasi tersebut |
| `billable` | boolean | Tidak | `false` | Flag apakah waktu dapat ditagihkan ke klien |
| `is_approved` | boolean | Tidak | `false` | Flag apakah time entry sudah disetujui |
| `approved_by` | string | Tidak | — | ID user yang menyetujui time entry |
| `status` | enum | Tidak | `submitted` | Status persetujuan: `submitted`, `approved`, `rejected` |

### Tabel Schema Entity: Comment

Entity untuk komentar dan diskusi pada task atau note. Sumber: `base44/entities/Comment.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `entity_type` | enum | Ya | — | Jenis entitas yang dikomentari: `task` atau `note` |
| `entity_id` | string | Ya | — | ID dari task atau note yang dikomentari |
| `workspace_id` | string | Tidak | — | ID workspace tempat komentar berada |
| `content` | string | Ya | — | Isi komentar |
| `user_id` | string | Ya | — | ID user penulis komentar |
| `user_name` | string | Tidak | — | Nama lengkap penulis (denormalisasi) |
| `user_email` | string | Tidak | — | Email penulis (denormalisasi) |
| `mentions` | string\[] | Tidak | — | Array ID user yang di-mention dalam komentar |
| `parent_comment_id` | string | Tidak | — | ID komentar induk untuk reply (threaded comment) |
| `edited_at` | datetime | Tidak | — | Timestamp terakhir kali komentar diedit |

### Tabel Schema Entity: Workspace

Entity untuk mengelompokkan task ke dalam scope kerja tertentu. Sumber: `base44/entities/Workspace.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `company_id` | string | Tidak | `null` | ID perusahaan (null untuk workspace personal) |
| `name` | string | Ya | — | Nama workspace |
| `description` | string | Tidak | — | Deskripsi singkat workspace |
| `icon` | string | Tidak | — | Icon emoji atau URL gambar workspace |
| `color` | string | Tidak | `#2563eb` | Warna tema workspace (hex) |
| `owner_id` | string | Ya | — | ID user pemilik workspace |
| `is_personal` | boolean | Tidak | `false` | Flag apakah workspace ini bersifat pribadi |
| `settings` | object | Tidak | — | Konfigurasi workspace: `{ allow_public_sharing, default_task_priority }` |

### Tabel Schema Entity: WorkspaceMember

Entity untuk mengelola keanggotaan dan hak akses dalam workspace. Sumber: `base44/entities/WorkspaceMember.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `workspace_id` | string | Ya | — | ID workspace yang dimasuki |
| `user_id` | string | Ya | — | ID user yang menjadi anggota |
| `role` | enum | Tidak | `member` | Peran dalam workspace: `owner`, `admin`, `member`, `viewer` |
| `invited_by` | string | Tidak | — | Email user yang mengundang anggota ini |
| `joined_at` | datetime | Tidak | — | Timestamp waktu bergabung |
| `description` | string | Tidak | — | Catatan tambahan mengenai anggota (maks 1000 karakter) |
| `permissions` | object | Tidak | — | Hak akses detail: `{ can_create_tasks, can_edit_tasks, can_delete_tasks, can_invite_members, can_access_all_tasks }` |

### Tabel Schema Entity: Label

Entity untuk label/tag yang dapat diterapkan pada task. Sumber: `base44/entities/Label.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `name` | string | Ya | — | Nama label |
| `color` | string | Tidak | `#9CA3AF` | Warna label (hex) |
| `icon` | string | Tidak | `🏷️` | Icon emoji label |
| `description` | string | Tidak | — | Penjelasan singkat kegunaan label (maks 1000 karakter) |
| `user_id` | string | Ya | — | ID user pemilik label |
| `workspace_id` | string | Tidak | — | ID workspace tempat label berlaku |

### Tabel Schema Entity: User

Entity pengguna sistem dengan field terkait task management. Sumber: `base44/entities/User.jsonc`

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `email` | string | Ya | — | Alamat email pengguna |
| `full_name` | string | Ya | — | Nama lengkap pengguna |
| `role` | enum | Tidak | — | Peran global: `admin` atau `user` |
| `subscription_plan` | enum | Tidak | `free` | Paket langganan: `free`, `pro`, `business`, `advanced`, `enterprise` |
| `productivity_score` | number | Tidak | `0` | Skor produktivitas pengguna (dari penyelesaian task) |
| `current_streak` | number | Tidak | `0` | Jumlah hari berturut-turut menyelesaikan task |
| `longest_streak` | number | Tidak | `0` | Rekor streak hari berturut-turut terpanjang |
| `last_active_date` | date | Tidak | — | Tanggal terakhir pengguna aktif |
| `total_tasks_completed` | number | Tidak | `0` | Total kumulatif task yang telah diselesaikan |
| `achievement_points` | number | Tidak | `0` | Poin achievement dari gamifikasi |
| `user_level` | number | Tidak | `1` | Level pengguna berdasarkan achievement points |

***

## Siklus Hidup Task (Task Lifecycle)

Diagram state berikut menggambarkan seluruh transisi status yang valid untuk sebuah task, dari pembuatan hingga penyelesaian atau pembatalan.

```mermaid theme={null}
stateDiagram-v2
    [*] --> todo: Task dibuat

    state "Status Task" as task_status {
        todo --> in_progress: User mulai mengerjakan
        in_progress --> completed: Semua sub-task selesai / user tandai selesai
        completed --> done: Verifikasi final / auto-confirm
        in_progress --> todo: User kembalikan ke antrian
        completed --> in_progress: Ditolak saat review, perlu revisi
    }

    todo --> cancelled: Task dibatalkan
    in_progress --> cancelled: Task dibatalkan saat pengerjaan
    completed --> cancelled: Task dibatalkan sebelum finalisasi

    cancelled --> [*]: Terminal state
    done --> [*]: Terminal state
```

### Keterangan Transisi Status

| Transisi | Pemicu | Deskripsi |
| - | - | - |
| `[*] → todo` | Buat task baru | Setiap task baru selalu dimulai dari status `todo` |
| `todo → in_progress` | User mulai mengerjakan | User mengklik "Start" atau drag ke kolom In Progress di Board view |
| `in_progress → completed` | Task selesai dikerjakan | Semua sub-task selesai atau user menandai selesai manual |
| `completed → done` | Verifikasi final | Auto-confirm setelah jeda atau verifikasi oleh assignee |
| `in_progress → todo` | Dikembalikan | User belum bisa melanjutkan dan mengembalikan ke antrian |
| `completed → in_progress` | Perlu revisi | Task ditolak saat review dan perlu perbaikan |
| `* → cancelled` | Dibatalkan | Task tidak jadi dikerjakan pada tahap manapun |

***

## Diagram Sekuens

### 1. Pembuatan Task Baru

```mermaid theme={null}
sequenceDiagram
    participant U as User
    participant TF as TaskForm
    participant BE as base44 Backend
    participant WS as Workspace Policy
    participant RT as Realtime Sync
    participant XP as Gamifikasi

    U->>TF: Klik "Tambah Task"
    TF->>WS: resolveTaskWorkspaceId(company_id)
    WS-->>TF: workspace_id (auto-create jika perlu)
    U->>TF: Isi judul, deskripsi, deadline, prioritas
    TF->>BE: insertTask({ title, content, workspace_id, priority, due_date })
    BE-->>TF: Task object (dengan ID baru)
    TF->>RT: BroadcastChannel.publish("task_created")
    RT->>RT: Pusher.trigger("task_created")
    RT->>RT: localStorage event sync
    TF->>U: Tampilkan task baru di view aktif
    Note over TF: Jika ada due_date → tawarkan sync ke Google Calendar
```

### 2. Penugasan Task ke Anggota Tim

```mermaid theme={null}
sequenceDiagram
    participant A as Assigner (Manajer)
    participant TF as TaskForm
    participant BE as base44 Backend
    participant RT as Realtime Sync
    participant B as Assignee (Penerima)
    participant NOTIF as Notifikasi

    A->>TF: Pilih task → klik "Assign"
    A->>TF: Pilih assignee dari daftar WorkspaceMember
    TF->>BE: updateTask(id, { assignee_id })
    BE-->>TF: Updated task object
    TF->>RT: BroadcastChannel.publish("task_updated")
    RT->>RT: Pusher.trigger("task_assigned")
    RT->>NOTIF: Kirim notifikasi ke assignee
    NOTIF->>B: Push notification: "Task baru ditugaskan: {title}"
    B->>BE: fetchTask(id)
    BE-->>B: Task detail
    B->>B: Task muncul di My Day / All Tasks
```

### 3. Penyelesaian Task & Gamifikasi

```mermaid theme={null}
sequenceDiagram
    participant U as User (Assignee)
    participant UI as Tasks.jsx
    participant BE as base44 Backend
    participant RT as Realtime Sync
    participant GC as Google Calendar
    participant XP as Gamifikasi
    participant ST as Streak Tracker

    U->>UI: Klik "Done" / drag ke kolom Done
    UI->>BE: updateTask(id, { status: "done", completed_at: now() })
    BE-->>UI: Updated task object
    UI->>RT: BroadcastChannel.publish("task_completed")
    RT->>RT: Pusher.trigger("task_completed")

    UI->>GC: syncTaskToGoogleCalendar(id, "complete")
    GC-->>UI: Event updated

    UI->>XP: gamificationHelper.completeTask(task)
    XP->>XP: Hitung XP berdasarkan priority & complexity
    XP->>BE: updateUser({ productivity_score, total_tasks_completed+1 })
    XP->>ST: Check streak
    ST->>ST: current_streak + 1 (jika hari berturut-turut)
    ST->>BE: updateUser({ current_streak, last_active_date })
    XP-->>UI: Tampilkan XP gained animation

    UI->>BE: Check sub-tasks
    Note over UI: Jika parent_task_id → update progress parent
    UI->>BE: updateTask(parent_id, { progress: hitung_rasio() })
```

### 4. Pembuatan Recurring Task

```mermaid theme={null}
sequenceDiagram
    participant U as User
    participant RM as RecurringTaskModal
    participant BE as base44 Backend
    participant SCH as Scheduler (Cron)
    participant GEN as Task Generator

    U->>RM: Klik "Recurring" pada task
    U->>RM: Atur frequency, interval, start_date, end_date
    RM->>BE: insertRecurringTask({ title, frequency, interval, start_date, ... })
    BE-->>RM: RecurringTask object (dengan ID)
    RM->>BE: updateTask(task_id, { recurring_task_id })

    Note over SCH: Menunggu hingga waktu generate berikutnya

    SCH->>GEN: Trigger generate recurring tasks
    GEN->>BE: fetchRecurringTasks({ is_active: true, last_generated < now })
    loop Untuk setiap recurring task yang perlu di-generate
        GEN->>GEN: Hitung tanggal instance berikutnya
        GEN->>BE: insertTask({ title, recurring_task_id, due_date, assignee_id, ... })
        BE-->>GEN: New task instance
        GEN->>BE: updateRecurringTask(id, { last_generated: now() })
    end
    GEN->>RT: BroadcastChannel.publish("tasks_created")
```

***

## Referensi Enum

### Enum: Task Status

| Nilai | Deskripsi |
| - | - |
| `todo` | Task baru, belum dimulai pengerjaannya |
| `in_progress` | Task sedang dalam pengerjaan aktif |
| `completed` | Task telah selesai dikerjakan, menunggu verifikasi final |
| `done` | Task telah diverifikasi selesai (terminal state) |

### Enum: Priority Level

| Nilai | Warna UI | Bobot Eisenhower | Deskripsi |
| - | - | - | - |
| `low` | Hijau | Eliminate / Schedule | Tugas ringan, bisa ditunda, nice-to-have |
| `medium` | Kuning | Schedule / Delegate | Tugas normal, sesuai timeline standar |
| `high` | Oranye | Delegate / Do First | Tugas penting, perlu perhatian cepat |
| `urgent` | Merah | Do First | Tugas kritis dan blocking, harus diselesaikan segera |

### Enum: RecurringTask Frequency

| Nilai | Deskripsi | Contoh |
| - | - | - |
| `daily` | Pengulangan setiap hari | Standup meeting harian |
| `weekly` | Pengulangan setiap minggu | Review mingguan tim |
| `monthly` | Pengulangan setiap bulan | Laporan bulanan |
| `yearly` | Pengulangan setiap tahun | Audit tahunan |

### Enum: Project Status

| Nilai | Deskripsi |
| - | - |
| `planning` | Proyek dalam tahap perencanaan, belum dimulai |
| `in_progress` | Proyek sedang berjalan aktif |
| `on_hold` | Proyek ditunda sementara |
| `completed` | Proyek telah selesai |
| `cancelled` | Proyek dibatalkan |

### Enum: TimeEntry Status

| Nilai | Deskripsi |
| - | - |
| `submitted` | Time entry baru diajukan, menunggu persetujuan |
| `approved` | Time entry telah disetujui oleh reviewer |
| `rejected` | Time entry ditolak, perlu revisi |

### Enum: WorkspaceMember Role

| Nilai | Deskripsi | Hak Akses Default |
| - | - | - |
| `owner` | Pemilik workspace | Full access, bisa menghapus workspace |
| `admin` | Administrator workspace | Kelola member, kelola task, kelola settings |
| `member` | Anggota biasa | Buat dan edit task sendiri |
| `viewer` | Pengamat | Hanya bisa melihat task, tidak bisa mengubah |

### Enum: Comment Entity Type

| Nilai | Deskripsi |
| - | - |
| `task` | Komentar terlampir pada entity Task |
| `note` | Komentar terlampir pada entity Note |

### Enum: Subscription Plan

| Nilai | Limit Task | Deskripsi |
| - | - | - |
| `free` | 50 task | Paket gratis dengan fitur dasar |
| `pro` | Unlimited | Paket profesional untuk individu |
| `business` | Unlimited | Paket bisnis untuk tim kecil |
| `advanced` | Unlimited | Paket lanjutan untuk tim besar |
| `enterprise` | Unlimited | Paket enterprise dengan fitur lengkap |

***

## Matriks Hak Akses (RBAC)

Tabel berikut merangkum hak akses setiap peran workspace terhadap operasi pada entity Task.

| Operasi | Owner | Admin | Member | Viewer |
| - | - | - | - | - |
| **Buat task baru** | Ya | Ya | Ya (jika `can_create_tasks`) | Tidak |
| **Lihat semua task** | Ya | Ya (jika `can_access_all_tasks`) | Hanya task sendiri | Hanya task sendiri |
| **Edit task sendiri** | Ya | Ya | Ya (jika `can_edit_tasks`) | Tidak |
| **Edit task orang lain** | Ya | Ya | Tidak | Tidak |
| **Hapus task sendiri** | Ya | Ya | Ya (jika `can_delete_tasks`) | Tidak |
| **Hapus task orang lain** | Ya | Ya | Tidak | Tidak |
| **Assign task ke orang lain** | Ya | Ya | Tidak | Tidak |
| **Ubah status task** | Ya | Ya | Ya (jika `can_edit_tasks`) | Tidak |
| **Tambah komentar** | Ya | Ya | Ya | Tidak |
| **Kelola label** | Ya | Ya | Tidak | Tidak |
| **Undang anggota baru** | Ya | Ya (jika `can_invite_members`) | Tidak | Tidak |
| **Hapus anggota** | Ya | Ya | Tidak | Tidak |
| **Ubah peran anggota** | Ya | Tidak | Tidak | Tidak |
| **Kelola recurring task** | Ya | Ya | Ya (jika `can_create_tasks`) | Tidak |
| **Ekspor data task** | Ya | Ya | Tidak | Tidak |
| **Kelola workspace settings** | Ya | Ya | Tidak | Tidak |
| **Hapus workspace** | Ya | Tidak | Tidak | Tidak |

### Detail Permissions Object (WorkspaceMember)

Field `permissions` pada entity WorkspaceMember menyediakan kontrol hak akses granular:

| Permission | Tipe | Default | Deskripsi |
| - | - | - | - |
| `can_create_tasks` | boolean | `true` | Hak membuat task baru dalam workspace |
| `can_edit_tasks` | boolean | `true` | Hak mengedit task (termasuk ubah status) |
| `can_delete_tasks` | boolean | `false` | Hak menghapus task dari workspace |
| `can_invite_members` | boolean | `false` | Hak mengundang anggota baru ke workspace |
| `can_access_all_tasks` | boolean | `false` | Hak melihat semua task terlepas dari penugasan |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.