> ## 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.

# Content studio

<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: "AI Content Studio"
description: "Studio konten AI enterprise dengan 7 tab — Smart Insight, Copy Generator, Visual Studio, Video Script, Kalender Konten, WhatsApp CS, dan Basis Pengetahuan."
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

# AI Content Studio

<img src="https://mintcdn.com/quinnofspicy/ny1xnfpEa_OBdv6T/docs/mintlify/screenshots/ai/ai-content-studio.png?fit=max&auto=format&n=ny1xnfpEa_OBdv6T&q=85&s=f22ca2ac7248967d2fd0cd729d5134e9" alt="AI Content Studio" width="1920" height="1080" data-path="docs/mintlify/screenshots/ai/ai-content-studio.png" />

AI Content Studio adalah suite produksi konten enterprise yang terintegrasi penuh dengan data bisnis SNISHOP ERP. Bukan sekadar generator teks — ini adalah ekosistem konten end-to-end mulai dari analisis data, pembuatan copy, desain visual, script video, penjadwalan, layanan pelanggan WhatsApp, hingga manajemen pengetahuan brand.

Studio ini dirancang untuk tim marketing, content creator, dan owner bisnis yang ingin mengotomatisasi seluruh siklus konten — dari insight data, produksi, penjadwalan, distribusi, hingga layanan pelanggan — semuanya dalam satu antarmuka yang kohesif dan didukung oleh kecerdasan buatan.

***

## Arsitektur 7-Tab Studio

```mermaid theme={null}
graph TD
    A[AIContentStudio.jsx<br/>388 baris] --> B[Collapsible Sidebar<br/>240px → 68px]
    A --> C[7 Tab Content]
    
    B --> B1[Desktop: Sidebar +<br/>tooltips saat collapse]
    B --> B2[Mobile: Horizontal<br/>tab bar]
    
    C --> T1[Smart Insight<br/>SmartDashboard.jsx]
    C --> T2[Copy Generator<br/>ContentGenerator.jsx]
    C --> T3[Visual Studio<br/>VisualStudio.jsx]
    C --> T4[Video Script<br/>VideoScriptGenerator.jsx]
    C --> T5[Kalender Konten<br/>ContentCalendar.jsx]
    C --> T6[WhatsApp CS<br/>WAChatAIEngine.js]
    C --> T7[Basis Pengetahuan<br/>BrandKnowledgeBase.jsx]
    
    T1 -.-> |Error Boundary| EB[StudioTabErrorBoundary]
    T2 -.-> EB
    T3 -.-> EB
    T4 -.-> EB
    T5 -.-> EB
    T6 -.-> EB
    T7 -.-> EB
```

Setiap tab dibungkus `StudioTabErrorBoundary` sehingga error di satu tab tidak mempengaruhi tab lainnya. Arsitektur ini memastikan isolasi fault dan stabilitas keseluruhan studio.

### Prinsip Desain Arsitektur

| Prinsip | Implementasi |
| - | - |
| **Fault Isolation** | Setiap tab memiliki error boundary independen |
| **Responsive Design** | Sidebar collapse di desktop, horizontal tab di mobile |
| **Shared Design System** | `AIStudioShared.jsx` menyediakan komponen UI konsisten |
| **Brand Knowledge Integration** | Semua tab mengakses brand knowledge untuk konteks AI |
| **Multi-Company Support** | Data diisolasi per `company_id` untuk keamanan multi-tenant |

***

## Tab 1: Smart Insight (521 baris)

Dashboard intelijen data yang menganalisis data POS dan produk secara otomatis. Tab ini merupakan titik awal yang direkomendasikan sebelum membuat konten, karena memberikan pemahaman mendalam tentang kondisi bisnis terkini.

### Data Sources

| Source | Entity | Data |
| - | - | - |
| Produk | `CompanyProduct.filter` | Semua produk perusahaan |
| Transaksi | `CompanyPOSTransaction.filter` | 200 transaksi terbaru |

### Computed Metrics

| Metrik | Perhitungan |
| - | - |
| `totalProducts` | Count semua produk |
| `totalTransactions30d` | Count transaksi 30 hari terakhir |
| `thisWeekRevenue` | Sum revenue minggu ini |
| `revTrend` | Week-over-week revenue % |
| `topProducts` | Top 5 produk berdasarkan penjualan |
| `lowProducts` | Bottom 4 produk |
| `lowStockProducts` | `stock > 0 && stock <= min_stock` |
| `outOfStock` | `stock <= 0` |

### AI Recommendations

```mermaid theme={null}
sequenceDiagram
    participant SD as SmartDashboard
    participant LLM as InvokeLLM
    participant UI as Recommendation Cards

    SD->>SD: Compute metrics
    SD->>LLM: JSON Schema: recommendations[]
    Note right of LLM: {title, description,<br/>content_type, product_name,<br/>urgency, suggested_prompt}
    LLM-->>SD: Array of recommendations
    SD->>UI: Render cards with urgency badges
    
    UI --> U1[High — Red pulse]
    UI --> U2[Medium — Amber]
    UI --> U3[Low — Green]
```

Sistem rekomendasi AI menganalisis metrik bisnis dan menghasilkan saran konten yang dapat ditindaklanjuti langsung. Setiap rekomendasi dilengkapi dengan:

* **Judul** — Deskripsi singkat rekomendasi
* **Tipe Konten** — Jenis konten yang disarankan (copy, visual, video)
* **Nama Produk** — Produk yang terkait dengan rekomendasi
* **Tingkat Urgensi** — High/Medium/Low dengan indikator visual
* **Prompt yang Disarankan** — Prompt siap pakai untuk generator konten

### 4 MetricCards

| Kartu | Isi |
| - | - |
| Total Produk | Jumlah produk aktif |
| Transaksi 30H | Volume transaksi 30 hari |
| Revenue Minggu Ini | Total revenue + trend arrow |
| Perlu Perhatian | Low stock + out of stock count |

***

## Tab 2: Copy Generator (665 baris)

Studio copywriting enterprise dengan multi-variant dan platform adaptation. Tab ini menghasilkan konten teks yang siap pakai untuk berbagai platform marketing.

### Form Input

| Field | Tipe | Deskripsi |
| - | - | - |
| Product | Text | Nama produk |
| Key Benefits | Textarea | USP dan keunggulan |
| Audience | Text | Target audiens |
| Offer | Text | Penawaran/promo |
| Content Type | Select | 5 tipe konten |
| Tone | Select | 5 gaya bahasa |
| Platforms | Multi-select | 5 platform |
| Generate Image | Toggle | Generate gambar juga |

### Content Types & Tones

| Content Types | Tones | Platforms |
| - | - | - |
| 5 tipe konten | 5 gaya bahasa | Instagram |
| | | WhatsApp |
| | | TikTok |
| | | Facebook |
| | | Email Subject |

### Output Schema (InvokeLLM JSON)

```json theme={null}
{
  "headline": "...",
  "primary_text": "...",
  "call_to_action": "...",
  "hashtags": ["...", "..."],
  "alternative_1": "...",
  "alternative_2": "...",
  "platform_adaptations": {
    "instagram": "...",
    "whatsapp": "...",
    "tiktok": "...",
    "facebook": "...",
    "email_subject": "..."
  },
  "image_prompt_suggestion": "..."
}
```

### Fitur Tambahan

| Fitur | Detail |
| - | - |
| **A/B/C Variants** | 3 variasi output untuk testing |
| **History** | localStorage, max 20 item per company |
| **Key** | `ai_content_history_${companyId}` |

### Alur Kerja Copy Generator

```mermaid theme={null}
sequenceDiagram
    participant U as User
    participant CG as ContentGenerator
    participant LLM as InvokeLLM
    participant LS as localStorage

    U->>CG: Isi form (produk, benefits, audience)
    CG->>CG: Validasi input
    CG->>LLM: Kirim prompt + JSON schema
    LLM-->>CG: Return headline, primary_text, CTA, variants
    CG->>CG: Generate 3 variasi (A/B/C)
    CG-->>U: Tampilkan hasil dengan copy button
    
    alt Simpan ke History
        U->>CG: Klik simpan
        CG->>LS: Push ke array (max 20)
        LS-->>CG: Konfirmasi tersimpan
    end
```

***

## Tab 3: Visual Studio (534 baris)

Studio desain AI dengan image generation dan text overlay editor. Tab ini memungkinkan pembuatan visual marketing tanpa memerlukan software desain terpisah.

### Color Themes

| Theme | Warna | Penggunaan |
| - | - | - |
| `spicy_red` | Merah pedas | Branding utama |
| `warm_wood` | Cokelat hangat | Natural/organic |
| `dark_luxe` | Hitam mewah | Premium/exclusive |
| `fresh_herbs` | Hijau segar | Healthy/fresh |
| `clean_studio` | Putih bersih | Minimalis |

### Image Styles

| Style | Aspect Ratio |
| - | - |
| 6 style | Berbagai rasio aspek |

### Text Overlay Editor

| Properti | Opsi |
| - | - |
| Position | 5 posisi (top-left, top-right, center, bottom-left, bottom-right) |
| Color | Color picker |
| Size | 4 ukuran |

### Gallery

Max 30 gambar tersimpan per sesi. Galeri ini memungkinkan pengguna untuk meninjau, memilih, dan mengunduh semua visual yang telah dihasilkan selama sesi kerja.

***

## Tab 4: Video Script (464 baris)

Generator script video dan storyboard. Tab ini menghasilkan naskah video lengkap dengan visual direction, audio suggestion, dan storyboard per-scene.

### Video Styles

| Style | Deskripsi |
| - | - |
| `product_showcase` | Pameran produk |
| `mukbang` | Makan/review makanan |
| `behind_scenes` | Di balik layar |
| `tutorial` | Tutorial/resep |
| `testimonial` | Testimoni pelanggan |
| `trend_hook` | Hook trend sosial media |

### Output Schema

```json theme={null}
{
  "hook": "Kalimat pembuka yang menarik",
  "hook_visual": "Deskripsi visual pembuka",
  "body_script": "Script isi video",
  "cta": "Call-to-action penutup",
  "music_mood": "Suasana musik latar",
  "broll_shots": ["Shot 1", "Shot 2"],
  "storyboard": [
    {"scene": 1, "visual": "...", "audio": "...", "duration": "5s"}
  ]
}
```

### Video Durations

| Durasi | Penggunaan |
| - | - |
| 15 detik | Stories/Reels pendek |
| 30 detik | TikTok/Reels standar |
| 60 detik | YouTube Shorts/detail |

History: max 15 item.

***

## Tab 5: Kalender Konten (732 baris)

Kalender interaktif untuk perencanaan dan penjadwalan konten. Tab ini merupakan pusat orkestrasi konten yang menghubungkan semua hasil generate dari tab lain ke dalam timeline terstruktur.

### Views

| View | Deskripsi |
| - | - |
| **Month Matrix** | Grid 7 kolom (Sen-Min) dengan item per hari |
| **List** | Daftar linear dengan filter |
| **Day Agenda** | Detail item per hari |

### Status Config

| Status | Warna | Deskripsi |
| - | - | - |
| `draft` | Abu-abu | Belum dijadwalkan |
| `scheduled` | Kuning | Sudah dijadwalkan |
| `published` | Hijau | Sudah dipublikasi |
| `archived` | Abu-abu | Diarsipkan |

### AI Auto-Scheduling

Sistem otomatis menjadwalkan 5 item pada hari +2, +4, +7, +9, +14 dari hari ini. Algoritma penjadwalan mempertimbangkan:

* Frekuensi posting optimal per platform
* Waktu terbaik untuk engagement
* Variasi tipe konten agar tidak monoton
* Ketersediaan konten dari generator lain

### Localization

Menggunakan nama hari dan bulan Bahasa Indonesia. Format tanggal mengikuti konvensi lokal (DD/MM/YYYY).

***

## Tab 6: WhatsApp CS (423 baris)

Layanan pelanggan WhatsApp berbasis AI yang terintegrasi dengan data ERP. Tab ini mengubah WhatsApp menjadi channel customer service otomatis yang cerdas dan kontekstual.

### 7 Intent Classification

| Intent | Confidence | Respons |
| - | - | - |
| `complaint` | 0.95 | Empati + solusi |
| `human_request` | 0.98 | Transfer ke agen |
| `order_status` | 0.90 | Cek status order |
| `pricing` | 0.88 | Daftar harga |
| `hours` | 0.85 | Jam operasional |
| `product_inquiry` | 0.87 | Info produk |
| `greeting` | 0.92 | Sapaan + menu |

### Arsitektur

```mermaid theme={null}
sequenceDiagram
    participant WA as WhatsApp Message
    participant Engine as WAChatAIEngine
    participant BK as Brand Knowledge
    participant LLM as InvokeLLM
    participant ERP as ERP Data

    WA->>Engine: analyzeMessageSignals()
    Engine->>Engine: classifyIntent() — 7 intents
    Engine->>Engine: calculateQualificationScore() — 0-100
    
    alt Escalation Needed
        Engine->>Engine: detectEscalation()
        Engine-->>WA: Transfer ke human
    else Standard Reply
        Engine->>BK: Load brand knowledge
        Engine->>ERP: Find matching products
        Engine->>LLM: JSON schema response
        LLM-->>Engine: AI response
        Engine-->>WA: Reply
    end
```

### Fallback Replies

Setiap intent memiliki fallback response jika LLM gagal. Sistem fallback memastikan pelanggan selalu mendapat respons, meskipun dalam bentuk yang lebih umum.

### Skor Kualifikasi Prospek

Sistem menghitung `qualification_score` (0-100) untuk setiap percakapan berdasarkan:

* Frekuensi interaksi
* Nilai transaksi historis
* Tingkat engagement
* Intent pattern

***

## Tab 7: Basis Pengetahuan (1.016 baris)

Manajemen pengetahuan brand paling kompleks di studio. Tab ini merupakan fondasi kontekstual untuk semua fitur AI di seluruh studio.

### 4 Sub-Tab

| Sub-Tab | Isi |
| - | - |
| **Katalog Produk & Stok** | 41 canonical products + data produk real |
| **Pelanggan & Persona CRM** | Data pelanggan, VIP detection, persona |
| **Intelijen Penjualan** | Analisis penjualan, trend, pattern |
| **Galeri & Brankas Memori Owner** | Media, catatan owner, brand guidelines |

### Brand Knowledge Service (500 baris)

```mermaid theme={null}
graph TD
    A[brandKnowledgeService.js] --> B[loadCompleteBrandKnowledge]
    B --> B1[CompanyProduct — parallel]
    B --> B2[Customer — parallel]
    B --> B3[CompanyPOSTransaction — parallel]
    
    A --> C[compileBrandPromptContext]
    C --> C1[Dense Indonesian<br/>Brand Prompt]
    
    A --> D[CANONICAL_PRODUCTS<br/>41 items]
    
    A --> E[Health Score<br/>0-100]
```

### VIP Detection

Threshold: `total_spent >= 300.000` atau tags mengandung `'VIP'`

### 3 Modals

| Modal | Fungsi |
| - | - |
| Add Memory | Tambah catatan pengetahuan |
| Upload Photo | Upload foto ke galeri |
| Brand Guidelines | Kelola guideline brand |

***

## Shared Design System (461 baris)

`AIStudioShared.jsx` menyediakan design system konsisten untuk seluruh tab di studio.

### Komponen

| Komponen | Fungsi |
| - | - |
| `GlassCard` | Kartu glassmorphism |
| `SectionHeader` | Header section |
| `ShimmerBlock` | Loading skeleton |
| `MetricCard` | Kartu metrik |
| `EmptyIllustration` | Ilustrasi kosong |
| `EmptyState` | State kosong |
| `CopyButton` | Tombol copy |
| `GhostIconAction` | Aksi ikon ghost |

### Animasi (Framer Motion)

| Variant | Detail |
| - | - |
| `fadeInUp` | Fade + slide up |
| `staggerContainer` | Delay 0.05s antar child |
| `scaleIn` | Scale dari 0.95 ke 1 |

### Icon System

Proxy-based self-healing: 50+ Lucide icons, `strokeWidth=1.5`, auto-fallback jika ikon tidak ditemukan.

***

## Greeting System

Sapaan berubah berdasarkan waktu:

| Waktu | Sapaan |
| - | - |
| 05:00-11:59 | Selamat Pagi |
| 12:00-14:59 | Selamat Siang |
| 15:00-18:59 | Selamat Sore |
| 19:00-04:59 | Selamat Malam |

***

## Cara Akses

Dari sidebar, klik menu **AI & Analitik** > **Content Studio**.

***

## Tips

* Mulai dari Smart Insight untuk memahami kondisi bisnis sebelum membuat konten
* Generate 3 variasi (A/B/C) dan test mana yang paling efektif
* Gunakan Visual Studio dengan color theme yang konsisten dengan brand
* Manfaatkan Kalender Konten untuk perencanaan mingguan
* Update Basis Pengetahuan secara berkala agar AI CS memberikan informasi akurat
* Video Script: pilih `product_showcase` untuk katalog, `behind_scenes` untuk engagement

***

## Relasi Entitas (Entity Relationship Diagram)

```mermaid theme={null}
erDiagram
    User ||--o{ AIAgentRun : "menjalankan"
    User ||--o{ Conversation : "memulai"
    User ||--o{ AILearningData : "memiliki (personal)"
    User ||--o{ BlogContent : "menulis"
    User ||--o{ BlogComment : "memberikan"
    User ||--o{ NewsletterSubscriber : "berlangganan"

    AIAgentTemplate ||--o{ AIAgentRun : "digunakan oleh"
    AIAgentTemplate ||--o{ AIAgentModel : "menggunakan"
    AIAgentTemplate ||--o{ AIAgentSchedule : "dijadwalkan"

    AIAgentRun }o--|| AIAgentModel : "memakai model"
    AIAgentSettings ||--o{ AIAgentTemplate : "mengatur biaya"

    BlogContent ||--o{ BlogComment : "memiliki"
    BlogContent ||--o{ EmailCampaign : "dipromosikan via"

    EmailCampaign }o--|| Company : "milik"
    WhatsAppChatLog }o--|| Company : "milik"
    Document }o--o| Company : "milik"
    ChatChannel }o--|| Company : "milik"

    AILearningData }o--o| Company : "scope business"
    AIAgentSchedule }o--|| Company : "milik"

    User {
        string id PK
        string email UK
        string full_name
        string role "admin | user"
        string subscription_plan "free | pro | business | advanced | enterprise"
        string admin_type "owner | basic"
        string admin_tier "none | business | advanced | enterprise"
        number ai_credits
        number ai_monthly_usage
        number balance
    }

    AIAgentTemplate {
        string agent_key PK
        string name
        string tagline
        string description
        string category "business | content | writing | social | other"
        string icon
        string color
        number price_per_run
        number credit_cost
        array features
        array use_cases
        array input_fields
        string system_prompt
        string model
        boolean use_internet
        string status "active | coming_soon | inactive"
        number order
    }

    AIAgentModel {
        string model_key PK
        string name
        string description
        number price_multiplier
        string tier "standard | advanced | premium"
        boolean supports_internet
        boolean is_active
        number order
    }

    AIAgentRun {
        string id PK
        string user_id FK
        string company_id FK
        string agent_key FK
        string model_used
        object input_data
        string output
        number cost_amount
        number cost_credit
        string payment_method "balance | credit | free"
        string status "success | failed"
    }

    AIAgentSettings {
        string setting_key PK
        string description
        number credit_to_rupiah_rate
        number base_price_per_run
        boolean allow_credit_payment
        boolean allow_balance_payment
    }

    AIAgentSchedule {
        string id PK
        string agent_id FK
        string company_id FK
        string trigger_type "schedule_daily | schedule_weekly | schedule_monthly | event_low_stock | event_invoice_overdue | event_new_transaction | event_task_due | event_custom"
        object trigger_config
        boolean is_active
        datetime last_triggered_at
        number trigger_count
        string notification_channel "in_app | whatsapp | email | all"
        string created_by
        datetime created_date
    }

    AILearningData {
        string id PK
        string scope_key UK
        string user_id FK
        string company_id FK
        object keyword_map
        array corrections
        number positive_count
        number correction_count
        datetime last_updated
    }

    BlogContent {
        string id PK
        string title
        string slug UK
        string excerpt
        string content
        string category "Bisnis | Teknologi | Tips & Trik | Case Study | Product Update | Tutorial"
        string author
        string author_email
        string cover_image
        boolean featured
        number read_time
        array tags
        boolean published
        datetime published_date
        number views
        number likes
        string seo_title
        string seo_description
        array seo_keywords
    }

    BlogComment {
        string id PK
        string article_id FK
        string user_id FK
        string user_name
        string user_email
        string comment_text
        string parent_comment_id FK
        boolean is_approved
        boolean is_pinned
    }

    EmailCampaign {
        string id PK
        string company_id FK
        string campaign_name
        string subject
        string content
        array recipient_list
        datetime send_date
        string status "draft | scheduled | sent | failed"
        number sent_count
        number opened_count
        number clicked_count
        string template_id
    }

    WhatsAppChatLog {
        string id PK
        string phone_number
        string customer_name
        string direction "incoming | outgoing"
        string message_body
        string intent "greeting | product_inquiry | order_status | complaint | pricing | location | hours | human_request | out_of_scope"
        number confidence
        number qualification_score
        boolean is_auto_reply
        boolean is_handoff
        string status "auto_replied | waiting_human | human_handled | failed"
        string company_id FK
        datetime timestamp
    }

    Document {
        string id PK
        string company_id FK
        string title
        string description
        string category "contract | invoice | report | presentation | spreadsheet | other"
        string file_url
        string file_type
        number file_size
        array tags
        array shared_with
        string folder
        number version
        boolean is_locked
        date expiry_date
    }

    Conversation {
        string id PK
        string user_id FK
        string title
        string description
        array messages
        boolean pinned
    }

    ChatChannel {
        string id PK
        string company_id FK
        string channel_name
        string channel_type "public | private | direct"
        string description
        array members
        array admins
        string created_by
        boolean is_archived
        string last_message
        datetime last_message_at
        number unread_count
    }

    NewsletterSubscriber {
        string id PK
        string email UK
        string name
        string description
        string subscribed_from "blog | home | about | partnership | other"
        boolean is_active
        datetime unsubscribed_date
        array interests
    }
```

***

## Entity Schema Tables

### AIAgentTemplate

Template agen AI yang mendefinisikan berbagai jenis agen tersedia di platform, termasuk prompt sistem, field input, dan konfigurasi biaya.

| Field | Type | Required | Description |
| - | - | - | - |
| `agent_key` | string | Ya | Kunci unik agen (contoh: `business_analysis`) |
| `name` | string | Ya | Nama tampilan AI Agent |
| `tagline` | string | Tidak | Deskripsi singkat satu baris |
| `description` | string | Tidak | Penjelasan lengkap fungsi agent (maks. 2000 karakter) |
| `category` | string | Tidak | Kategori agen: `business`, `content`, `writing`, `social`, `other` (default: `other`) |
| `icon` | string | Tidak | Nama ikon lucide-react (default: `Sparkles`) |
| `color` | string | Tidak | Warna tema agen (default: `#3b82f6`) |
| `price_per_run` | number | Tidak | Biaya per penggunaan dalam Rupiah (default: 5000) |
| `credit_cost` | number | Tidak | Biaya alternatif dalam kredit AI (default: 1) |
| `features` | array\[string] | Tidak | Daftar fitur utama agen |
| `use_cases` | array\[string] | Tidak | Daftar kasus penggunaan |
| `input_fields` | array\[object] | Tidak | Field input yang diminta dari user, masing-masing memiliki `key`, `label`, `type` (`text`/`textarea`/`url`), `placeholder`, `required` |
| `system_prompt` | string | Tidak | Instruksi sistem untuk LLM (maks. 4000 karakter) |
| `model` | string | Tidak | Model LLM yang dipakai (default: `automatic`) |
| `use_internet` | boolean | Tidak | Gunakan konteks internet (default: `false`) |
| `status` | string | Tidak | Status agen: `active`, `coming_soon`, `inactive` (default: `active`) |
| `order` | number | Tidak | Urutan pengurutan (default: 0) |

### AIAgentModel

Definisi model AI yang tersedia untuk digunakan oleh agen, termasuk pengali biaya dan tingkatan kualitas.

| Field | Type | Required | Description |
| - | - | - | - |
| `model_key` | string | Ya | Kunci model untuk InvokeLLM (contoh: `automatic`, `gpt_5_mini`, `claude_sonnet_4_6`) |
| `name` | string | Ya | Nama tampilan model (contoh: `Standar (Cepat & Hemat)`) |
| `description` | string | Tidak | Penjelasan singkat kualitas/kecepatan model (maks. 500 karakter) |
| `price_multiplier` | number | Tidak | Pengali biaya. Biaya akhir = harga dasar x multiplier (default: 1) |
| `tier` | string | Tidak | Tingkatan kualitas: `standard`, `advanced`, `premium` (default: `standard`) |
| `supports_internet` | boolean | Tidak | Model mendukung konteks internet (default: `false`) |
| `is_active` | boolean | Tidak | Status keaktifan model (default: `true`) |
| `order` | number | Tidak | Urutan pengurutan (default: 0) |

### AIAgentRun

Log eksekusi agen AI yang merekam setiap penggunaan, termasuk input, output, biaya, dan status.

| Field | Type | Required | Description |
| - | - | - | - |
| `user_id` | string | Ya | ID user yang menjalankan |
| `user_email` | string | Tidak | Email user |
| `company_id` | string | Tidak | ID perusahaan aktif (null untuk personal) |
| `company_name` | string | Tidak | Nama perusahaan saat agent dijalankan |
| `agent_key` | string | Ya | Kunci agen yang dijalankan |
| `agent_name` | string | Tidak | Nama tampilan agen |
| `model_used` | string | Tidak | Model AI yang dipakai pada run ini |
| `model_name` | string | Tidak | Nama tampilan model yang dipakai |
| `input_data` | object | Tidak | Input yang diberikan user |
| `output` | string | Tidak | Hasil dari AI Agent (maks. 100.000 karakter) |
| `cost_amount` | number | Tidak | Biaya rupiah yang dipotong (default: 0) |
| `cost_credit` | number | Tidak | Kredit yang dipotong (default: 0) |
| `payment_method` | string | Tidak | Metode pembayaran: `balance`, `credit`, `free` (default: `balance`) |
| `status` | string | Tidak | Status eksekusi: `success`, `failed` (default: `success`) |

### AIAgentSettings

Pengaturan global sistem AI Agent termasuk konfigurasi billing dan metode pembayaran.

| Field | Type | Required | Description |
| - | - | - | - |
| `setting_key` | string | Ya | Kunci pengaturan (selalu `global` untuk pengaturan utama) |
| `description` | string | Tidak | Catatan pengaturan AI Agent (maks. 1000 karakter) |
| `credit_to_rupiah_rate` | number | Tidak | Nilai 1 kredit dalam Rupiah (default: 10) |
| `base_price_per_run` | number | Tidak | Harga dasar default per penggunaan dalam Rupiah (default: 1000) |
| `allow_credit_payment` | boolean | Tidak | Izinkan user membayar dengan kredit (default: `true`) |
| `allow_balance_payment` | boolean | Tidak | Izinkan user membayar dengan saldo Rupiah (default: `true`) |

### AIAgentSchedule

Konfigurasi penjadwalan dan trigger otomatis untuk agen AI, mendukung trigger berbasis waktu dan event.

| Field | Type | Required | Description |
| - | - | - | - |
| `agent_id` | string | Ya | Referensi ke AIAgent (agent\_key) |
| `company_id` | string | Ya | ID perusahaan |
| `trigger_type` | string | Ya | Jenis trigger: `schedule_daily`, `schedule_weekly`, `schedule_monthly`, `event_low_stock`, `event_invoice_overdue`, `event_new_transaction`, `event_task_due`, `event_custom` |
| `trigger_config` | object | Tidak | Konfigurasi trigger. Schedule: `{hour, minute, day_of_week?, day_of_month?}`. Event: `{threshold?, product_category?, days_before?}` |
| `is_active` | boolean | Tidak | Apakah schedule/trigger aktif (default: `true`) |
| `last_triggered_at` | datetime | Tidak | Waktu terakhir trigger fired |
| `trigger_count` | number | Tidak | Berapa kali trigger sudah fired (default: 0) |
| `notification_channel` | string | Tidak | Channel notifikasi hasil agent: `in_app`, `whatsapp`, `email`, `all` (default: `in_app`) |
| `created_by` | string | Ya | Email user yang membuat schedule |
| `created_date` | datetime | Tidak | Tanggal pembuatan schedule |

### AILearningData

Data pembelajaran AI yang merekam koreksi dan konfirmasi dari user untuk meningkatkan akurasi klasifikasi.

| Field | Type | Required | Description |
| - | - | - | - |
| `scope_key` | string | Ya | Kunci scope pembelajaran (`ai_learn_personal_<userId>` atau `ai_learn_business_<companyId>`) |
| `user_id` | string | Tidak | ID user pemilik scope (untuk scope personal) |
| `company_id` | string | Tidak | ID perusahaan (untuk scope business) |
| `keyword_map` | object | Tidak | Peta keyword -> `{category, confidence, type}` hasil pembelajaran |
| `corrections` | array\[object] | Tidak | Log koreksi yang diberikan user, masing-masing memiliki `input_text`, `original_category`, `correct_category`, `type`, `timestamp`, `record_id` |
| `positive_count` | number | Tidak | Jumlah konfirmasi 'benar' dari user (default: 0) |
| `correction_count` | number | Tidak | Jumlah koreksi dari user (default: 0) |
| `last_updated` | datetime | Tidak | Terakhir diperbarui |

### BlogContent

Konten artikel blog yang dapat dihasilkan atau dibantu oleh AI Content Studio.

| Field | Type | Required | Description |
| - | - | - | - |
| `title` | string | Ya | Judul artikel |
| `slug` | string | Tidak | URL-friendly slug |
| `excerpt` | string | Tidak | Ringkasan artikel |
| `content` | string | Ya | Konten lengkap artikel (HTML/Markdown) |
| `category` | string | Tidak | Kategori: `Bisnis`, `Teknologi`, `Tips & Trik`, `Case Study`, `Product Update`, `Tutorial` (default: `Bisnis`) |
| `author` | string | Tidak | Nama penulis (default: `SNISHOP Team`) |
| `author_email` | string | Tidak | Email penulis |
| `cover_image` | string | Tidak | URL gambar cover |
| `featured` | boolean | Tidak | Artikel unggulan (default: `false`) |
| `read_time` | number | Tidak | Estimasi waktu baca dalam menit (default: 5) |
| `tags` | array\[string] | Tidak | Tag artikel |
| `published` | boolean | Tidak | Status publikasi (default: `false`) |
| `published_date` | datetime | Tidak | Tanggal publikasi |
| `views` | number | Tidak | Jumlah views (default: 0) |
| `likes` | number | Tidak | Jumlah likes (default: 0) |
| `seo_title` | string | Tidak | SEO title (opsional) |
| `seo_description` | string | Tidak | SEO description (opsional) |
| `seo_keywords` | array\[string] | Tidak | SEO keywords |

### BlogComment

Komentar pada artikel blog, mendukung reply threaded dan moderasi.

| Field | Type | Required | Description |
| - | - | - | - |
| `article_id` | string | Ya | ID artikel blog |
| `user_id` | string | Ya | ID user yang comment |
| `user_name` | string | Ya | Nama user |
| `user_email` | string | Tidak | Email user |
| `comment_text` | string | Ya | Isi komentar |
| `description` | string | Tidak | Konteks atau metadata tambahan (maks. 1000 karakter) |
| `parent_comment_id` | string | Tidak | ID comment parent (untuk reply) |
| `is_approved` | boolean | Tidak | Apakah comment disetujui admin (default: `true`) |
| `is_pinned` | boolean | Tidak | Apakah comment di-pin (default: `false`) |

### EmailCampaign

Kampanye email marketing yang dapat dibuat dan dijadwalkan dari Content Studio.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Tidak | ID perusahaan |
| `campaign_name` | string | Ya | Nama kampanye |
| `subject` | string | Ya | Subjek email |
| `content` | string | Ya | HTML email content |
| `recipient_list` | array\[string] | Tidak | Array of customer emails |
| `send_date` | datetime | Tidak | Tanggal pengiriman |
| `status` | string | Tidak | Status: `draft`, `scheduled`, `sent`, `failed` (default: `draft`) |
| `sent_count` | number | Tidak | Jumlah email terkirim (default: 0) |
| `opened_count` | number | Tidak | Jumlah email dibuka (default: 0) |
| `clicked_count` | number | Tidak | Jumlah link diklik (default: 0) |
| `template_id` | string | Tidak | Referensi template yang digunakan |

### WhatsAppChatLog

Log percakapan WhatsApp CS yang merekam setiap interaksi pelanggan dengan sistem AI.

| Field | Type | Required | Description |
| - | - | - | - |
| `phone_number` | string | Ya | Nomor telepon WhatsApp pelanggan |
| `customer_name` | string | Tidak | Nama pelanggan |
| `direction` | string | Tidak | Arah pesan: `incoming`, `outgoing` (default: `incoming`) |
| `message_body` | string | Ya | Isi pesan WhatsApp |
| `intent` | string | Tidak | Klasifikasi intent AI: `greeting`, `product_inquiry`, `order_status`, `complaint`, `pricing`, `location`, `hours`, `human_request`, `out_of_scope` |
| `confidence` | number | Tidak | Tingkat keyakinan AI (0-1 atau 0-100) |
| `qualification_score` | number | Tidak | Skor kualifikasi prospek/pelanggan |
| `is_auto_reply` | boolean | Tidak | Apakah pesan dijawab otomatis oleh AI (default: `false`) |
| `is_handoff` | boolean | Tidak | Apakah pesan dialihkan ke CS manusia (default: `false`) |
| `status` | string | Tidak | Status penanganan: `auto_replied`, `waiting_human`, `human_handled`, `failed` (default: `auto_replied`) |
| `company_id` | string | Tidak | ID Perusahaan |
| `timestamp` | datetime | Tidak | Waktu stempel transaksi pesan |

### Document

Manajemen dokumen dan file yang dapat diorganisir dalam folder dan dibagikan ke tim.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Tidak | ID perusahaan (null untuk personal) |
| `title` | string | Ya | Judul dokumen |
| `description` | string | Tidak | Deskripsi dokumen |
| `category` | string | Tidak | Kategori: `contract`, `invoice`, `report`, `presentation`, `spreadsheet`, `other` (default: `other`) |
| `file_url` | string | Ya | URL file dokumen |
| `file_type` | string | Tidak | Tipe file: pdf, docx, xlsx, dll |
| `file_size` | number | Tidak | Ukuran file dalam bytes |
| `tags` | array\[string] | Tidak | Tag dokumen |
| `shared_with` | array\[string] | Tidak | Array of user emails yang bisa akses |
| `folder` | string | Tidak | Nama folder |
| `version` | number | Tidak | Versi dokumen (default: 1) |
| `is_locked` | boolean | Tidak | Apakah dokumen dikunci (default: `false`) |
| `expiry_date` | date | Tidak | Tanggal kedaluwarsa |

### Conversation

Riwayat percakapan AI yang disimpan per user, mendukung pin dan deskripsi konteks.

| Field | Type | Required | Description |
| - | - | - | - |
| `user_id` | string | Ya | ID pengguna yang memulai percakapan |
| `title` | string | Ya | Judul percakapan, dibuat otomatis dari pesan pertama |
| `description` | string | Tidak | Ringkasan atau konteks singkat (maks. 1000 karakter) |
| `messages` | array\[object] | Ya | Seluruh riwayat pesan, masing-masing memiliki `role` (`user`/`assistant`) dan `content` |
| `pinned` | boolean | Tidak | Apakah percakapan di-pin (default: `false`) |

### ChatChannel

Channel komunikasi internal tim untuk kolaborasi dalam perusahaan.

| Field | Type | Required | Description |
| - | - | - | - |
| `company_id` | string | Ya | ID perusahaan |
| `channel_name` | string | Ya | Nama channel |
| `channel_type` | string | Ya | Tipe channel: `public`, `private`, `direct` (default: `public`) |
| `description` | string | Tidak | Deskripsi channel |
| `members` | array\[string] | Tidak | Array of member emails |
| `admins` | array\[string] | Tidak | Array of admin emails |
| `created_by` | string | Tidak | Pembuat channel |
| `is_archived` | boolean | Tidak | Apakah channel diarsipkan (default: `false`) |
| `last_message` | string | Tidak | Pesan terakhir |
| `last_message_at` | datetime | Tidak | Waktu pesan terakhir |
| `unread_count` | number | Tidak | Jumlah pesan belum dibaca (default: 0) |

### NewsletterSubscriber

Data subscriber newsletter yang dapat menjadi target kampanye konten.

| Field | Type | Required | Description |
| - | - | - | - |
| `email` | string | Ya | Email subscriber |
| `name` | string | Tidak | Nama subscriber (opsional) |
| `description` | string | Tidak | Catatan atau preferensi konten (maks. 1000 karakter) |
| `subscribed_from` | string | Tidak | Halaman asal subscribe: `blog`, `home`, `about`, `partnership`, `other` (default: `blog`) |
| `is_active` | boolean | Tidak | Status aktif subscription (default: `true`) |
| `unsubscribed_date` | datetime | Tidak | Tanggal unsubscribe |
| `interests` | array\[string] | Tidak | Topik yang diminati |

***

## Diagram Siklus Hidup Pembuatan Konten

```mermaid theme={null}
stateDiagram-v2
    [*] --> Insight: Smart Insight menganalisis data bisnis
    Insight --> Ideasi: AI memberikan rekomendasi konten
    
    Ideasi --> DraftCopy: Copy Generator membuat variasi teks
    Ideasi --> DraftVisual: Visual Studio membuat desain
    Ideasi --> DraftVideo: Video Script membuat naskah
    
    DraftCopy --> Review: Review & edit manual
    DraftVisual --> Review
    DraftVideo --> Review
    
    Review --> Scheduled: Masukkan ke Kalender Konten
    Review --> DraftCopy: Revisi copy
    Review --> DraftVisual: Revisi visual
    Review --> DraftVideo: Revisi script
    
    Scheduled --> Published: Konten dipublikasi
    Published --> Archived: Diarsipkan setelah campaign selesai
    Published --> Insight: Data performa masuk kembali ke Smart Insight
    
    Archived --> [*]
    
    state Review {
        [*] --> ApprovalNeeded
        ApprovalNeeded --> Approved: Disetujui
        ApprovalNeeded --> Rejected: Ditolak
        Rejected --> [*]: Kembali ke draft
        Approved --> [*]
    }
```

***

## Diagram Alur: Pemilihan Template Agen AI

```mermaid theme={null}
sequenceDiagram
    participant U as User
    participant UI as Agent Gallery
    participant CFG as Config Form
    participant SET as AIAgentSettings
    participant RUN as AIAgentRun
    participant LLM as InvokeLLM

    U->>UI: Buka AI Content Studio
    UI->>UI: Load AIAgentTemplate (status=active)
    UI-->>U: Tampilkan grid agen dengan kategori

    U->>UI: Pilih agen (klik card)
    UI->>CFG: Load input_fields dari template
    CFG->>SET: Load pricing (price_per_run, credit_cost)
    SET-->>CFG: Return biaya & metode pembayaran
    CFG-->>U: Tampilkan form input + info biaya

    U->>CFG: Isi form & pilih model (AIAgentModel)
    CFG->>CFG: Validasi input required fields
    CFG->>RUN: Create run record (status=pending)
    
    RUN->>LLM: Invoke dengan system_prompt + input_data
    LLM-->>RUN: Return output (max 100K chars)
    
    alt Success
        RUN->>RUN: Update status=success, hitung cost
        RUN-->>U: Tampilkan hasil + opsi simpan
    else Failed
        RUN->>RUN: Update status=failed
        RUN-->>U: Tampilkan error + opsi retry
    end
```

***

## Diagram Alur: Publikasi Konten via Kalender

```mermaid theme={null}
sequenceDiagram
    participant U as Content Creator
    participant CC as ContentCalendar
    participant CG as Copy Generator
    participant VS as Visual Studio
    participant DB as Database
    participant WA as WhatsApp CS

    U->>CG: Generate copy untuk campaign
    CG-->>U: Return 3 variasi (A/B/C)
    U->>U: Pilih variasi terbaik

    U->>VS: Generate visual dengan color theme
    VS-->>U: Return gambar + text overlay

    U->>CC: Buat item kalender baru
    Note right of CC: title, date, platform,<br/>status=draft, content_ref
    CC->>DB: Save content item

    U->>CC: Schedule ke tanggal target
    CC->>DB: Update status=scheduled

    Note over CC,DB: Pada tanggal terjadwal

    CC->>CC: Check scheduled items
    CC->>DB: Update status=published
    DB-->>WA: Notifikasi: konten sudah published

    U->>CC: Setelah campaign selesai
    U->>CC: Archive item
    CC->>DB: Update status=archived
```

***

## Diagram Alur: WhatsApp CS Intelligence

```mermaid theme={null}
sequenceDiagram
    participant Cust as Pelanggan
    participant WA as WhatsApp Gateway
    participant ENG as WAChatAIEngine
    participant BK as BrandKnowledge
    participant ERP as ERP Data
    participant LLM as InvokeLLM
    participant LOG as WhatsAppChatLog

    Cust->>WA: Kirim pesan
    WA->>ENG: analyzeMessageSignals()
    ENG->>LOG: Create log (direction=incoming)

    ENG->>ENG: classifyIntent() — 9 intents
    
    alt Intent = human_request (conf >= 0.98)
        ENG->>ENG: detectEscalation()
        ENG->>LOG: Update is_handoff=true, status=waiting_human
        ENG-->>WA: Notify transfer ke human agent
        WA-->>Cust: "Mohon tunggu, kami sambungkan ke tim kami..."
    else Intent = complaint (conf >= 0.95)
        ENG->>BK: Load brand knowledge
        ENG->>ERP: Find order data pelanggan
        ENG->>LLM: Prompt dengan empathy + data order
        LLM-->>ENG: Response dengan solusi
        ENG->>LOG: Update intent=complaint, status=auto_replied
        ENG-->>WA: Kirim respons
        WA-->>Cust: Respons empati + solusi
    else Intent standar (product_inquiry, pricing, hours, greeting)
        ENG->>BK: Load relevant knowledge
        ENG->>LLM: Generate response
        LLM-->>ENG: AI response
        ENG->>LOG: Update status=auto_replied
        ENG-->>WA: Kirim respons
        WA-->>Cust: Informasi yang diminta
    else LLM Gagal
        ENG->>ENG: Use fallback reply for intent
        ENG->>LOG: Update status=auto_replied
        ENG-->>WA: Fallback response
        WA-->>Cust: Respons fallback
    end

    ENG->>ENG: calculateQualificationScore()
    ENG->>LOG: Update qualification_score
```

***

## Referensi Enum

### Status Agen AI (`AIAgentTemplate.status`)

| Nilai | Deskripsi |
| - | - |
| `active` | Agen aktif dan dapat digunakan oleh user |
| `coming_soon` | Agen akan segera hadir, ditampilkan sebagai preview |
| `inactive` | Agen dinonaktifkan, tidak tampil di galeri |

### Kategori Agen AI (`AIAgentTemplate.category`)

| Nilai | Deskripsi |
| - | - |
| `business` | Agen untuk analisis dan operasi bisnis |
| `content` | Agen untuk pembuatan konten marketing |
| `writing` | Agen untuk penulisan dokumen dan artikel |
| `social` | Agen untuk manajemen media sosial |
| `other` | Kategori lainnya |

### Tingkatan Model AI (`AIAgentModel.tier`)

| Nilai | Deskripsi |
| - | - |
| `standard` | Model standar, cepat dan hemat biaya |
| `advanced` | Model lanjutan, keseimbangan kualitas dan kecepatan |
| `premium` | Model premium, kualitas tertinggi |

### Status Eksekusi Agen (`AIAgentRun.status`)

| Nilai | Deskripsi |
| - | - |
| `success` | Eksekusi berhasil, output tersedia |
| `failed` | Eksekusi gagal, periksa log error |

### Metode Pembayaran AI (`AIAgentRun.payment_method`)

| Nilai | Deskripsi |
| - | - |
| `balance` | Dibayar dari saldo Rupiah user |
| `credit` | Dibayar dari kredit AI user |
| `free` | Gratis (tidak ada biaya) |

### Jenis Trigger Schedule (`AIAgentSchedule.trigger_type`)

| Nilai | Deskripsi |
| - | - |
| `schedule_daily` | Trigger harian pada waktu tertentu |
| `schedule_weekly` | Trigger mingguan pada hari tertentu |
| `schedule_monthly` | Trigger bulanan pada tanggal tertentu |
| `event_low_stock` | Trigger saat stok produk rendah |
| `event_invoice_overdue` | Trigger saat invoice jatuh tempo |
| `event_new_transaction` | Trigger saat ada transaksi baru |
| `event_task_due` | Trigger saat tugas mendekati deadline |
| `event_custom` | Trigger kustom yang dikonfigurasi user |

### Channel Notifikasi Schedule (`AIAgentSchedule.notification_channel`)

| Nilai | Deskripsi |
| - | - |
| `in_app` | Notifikasi dalam aplikasi |
| `whatsapp` | Notifikasi via WhatsApp |
| `email` | Notifikasi via email |
| `all` | Semua channel notifikasi |

### Intent WhatsApp CS (`WhatsAppChatLog.intent`)

| Nilai | Deskripsi | Threshold Confidence |
| - | - | - |
| `greeting` | Sapaan awal dari pelanggan | 0.92 |
| `product_inquiry` | Pertanyaan tentang produk | 0.87 |
| `order_status` | Cek status pesanan | 0.90 |
| `complaint` | Keluhan pelanggan | 0.95 |
| `pricing` | Pertanyaan tentang harga | 0.88 |
| `location` | Pertanyaan tentang lokasi | 0.85 |
| `hours` | Pertanyaan tentang jam operasional | 0.85 |
| `human_request` | Permintaan berbicara dengan manusia | 0.98 |
| `out_of_scope` | Di luar cakupan layanan | 0.80 |

### Status Penanganan WhatsApp (`WhatsAppChatLog.status`)

| Nilai | Deskripsi |
| - | - |
| `auto_replied` | Pesan dijawab otomatis oleh AI |
| `waiting_human` | Menunggu penanganan CS manusia |
| `human_handled` | Sudah ditangani oleh CS manusia |
| `failed` | Gagal diproses |

### Arah Pesan WhatsApp (`WhatsAppChatLog.direction`)

| Nilai | Deskripsi |
| - | - |
| `incoming` | Pesan masuk dari pelanggan |
| `outgoing` | Pesan keluar dari sistem/bot |

### Status Kampanye Email (`EmailCampaign.status`)

| Nilai | Deskripsi |
| - | - |
| `draft` | Kampanye masih dalam tahap penyusunan |
| `scheduled` | Kampanye dijadwalkan untuk dikirim |
| `sent` | Kampanye sudah berhasil dikirim |
| `failed` | Kampanye gagal dikirim |

### Kategori Dokumen (`Document.category`)

| Nilai | Deskripsi |
| - | - |
| `contract` | Dokumen kontrak dan perjanjian |
| `invoice` | Faktur dan tagihan |
| `report` | Laporan bisnis dan keuangan |
| `presentation` | Materi presentasi |
| `spreadsheet` | Spreadsheet dan data |
| `other` | Kategori lainnya |

### Kategori Artikel Blog (`BlogContent.category`)

| Nilai | Deskripsi |
| - | - |
| `Bisnis` | Artikel tentang bisnis dan manajemen |
| `Teknologi` | Artikel tentang teknologi dan inovasi |
| `Tips & Trik` | Tips dan trik praktis |
| `Case Study` | Studi kasus pelanggan |
| `Product Update` | Pembaruan fitur produk |
| `Tutorial` | Tutorial penggunaan |

### Tipe Channel (`ChatChannel.channel_type`)

| Nilai | Deskripsi |
| - | - |
| `public` | Channel publik, semua anggota perusahaan bisa bergabung |
| `private` | Channel privat, hanya anggota yang diundang |
| `direct` | Direct message antar pengguna |

### Asal Subscribe Newsletter (`NewsletterSubscriber.subscribed_from`)

| Nilai | Deskripsi |
| - | - |
| `blog` | Berlangganan dari halaman blog |
| `home` | Berlangganan dari halaman utama |
| `about` | Berlangganan dari halaman tentang |
| `partnership` | Berlangganan dari halaman partnership |
| `other` | Berlangganan dari sumber lainnya |

### Role Pengguna (`User.role`)

| Nilai | Deskripsi |
| - | - |
| `admin` | Administrator dengan akses penuh ke semua fitur |
| `user` | Pengguna reguler dengan akses terbatas |

### Tipe Admin (`User.admin_type`)

| Nilai | Deskripsi |
| - | - |
| `owner` | Owner aplikasi — full access ke seluruh fitur dan konfigurasi |
| `basic` | Admin basic — hanya mengelola transaksi produk digital |

### Tier Admin (`User.admin_tier`)

| Nilai | Deskripsi |
| - | - |
| `none` | Bukan admin perusahaan |
| `business` | Tier business — akses manajemen perusahaan dasar |
| `advanced` | Tier advanced — akses manajemen perusahaan lanjutan |
| `enterprise` | Tier enterprise — akses penuh manajemen perusahaan |

### Paket Langganan (`User.subscription_plan`)

| Nilai | Deskripsi |
| - | - |
| `free` | Paket gratis dengan fitur dasar |
| `pro` | Paket profesional untuk bisnis kecil |
| `business` | paket bisnis untuk bisnis menengah |
| `advanced` | Paket lanjutan untuk bisnis besar |
| `enterprise` | Paket enterprise untuk korporasi |

***

## Tabel Hak Akses RBAC

Berikut adalah matriks hak akses untuk fitur-fitur utama AI Content Studio berdasarkan role pengguna:

| Fitur / Operasi | Admin (Owner) | Admin (Basic) | User |
| - | :-: | :-: | :-: |
| **Smart Insight — Lihat Dashboard** | Ya | Ya | Ya |
| **Smart Insight — AI Recommendations** | Ya | Ya | Ya |
| **Copy Generator — Generate Konten** | Ya | Ya | Ya |
| **Copy Generator — Simpan History** | Ya | Ya | Ya |
| **Visual Studio — Generate Gambar** | Ya | Ya | Ya |
| **Visual Studio — Download Gambar** | Ya | Ya | Ya |
| **Video Script — Generate Script** | Ya | Ya | Ya |
| **Kalender Konten — Buat Item** | Ya | Ya | Ya |
| **Kalender Konten — Schedule/Publish** | Ya | Ya | Terbatas |
| **Kalender Konten — Hapus Item** | Ya | Tidak | Tidak |
| **WhatsApp CS — Lihat Chat Log** | Ya | Ya | Tidak |
| **WhatsApp CS — Konfigurasi Intent** | Ya | Tidak | Tidak |
| **WhatsApp CS — Handoff ke Human** | Ya | Ya | Tidak |
| **Basis Pengetahuan — Lihat** | Ya | Ya | Ya |
| **Basis Pengetahuan — Edit Katalog** | Ya | Tidak | Tidak |
| **Basis Pengetahuan — Upload Media** | Ya | Ya | Tidak |
| **Basis Pengetahuan — Brand Guidelines** | Ya | Tidak | Tidak |
| **Kelola AIAgentTemplate** | Ya | Tidak | Tidak |
| **Kelola AIAgentModel** | Ya | Tidak | Tidak |
| **Kelola AIAgentSettings (Billing)** | Ya (Owner) | Tidak | Tidak |
| **Kelola AIAgentSchedule** | Ya | Ya | Tidak |
| **Kelola EmailCampaign** | Ya | Ya | Tidak |
| **Kelola BlogContent** | Ya | Ya | Terbatas |
| **Kelola Document** | Ya | Ya | Milik Sendiri |
| **Kelola ChatChannel** | Ya | Ya | Tidak |
| **Lihat AIAgentRun (semua user)** | Ya | Tidak | Tidak |
| **Lihat AIAgentRun (milik sendiri)** | Ya | Ya | Ya |

### Catatan RBAC

* **Admin (Owner)**: Merujuk pada user dengan `role=admin` dan `admin_type=owner`. Memiliki akses penuh ke seluruh fitur studio termasuk konfigurasi billing dan manajemen agen.
* **Admin (Basic)**: Merujuk pada user dengan `role=admin` dan `admin_type=basic`. Dapat menggunakan fitur-fitur konten tetapi tidak dapat mengubah konfigurasi sistem.
* **User**: User reguler (`role=user`). Dapat menggunakan fitur generate konten dan melihat data, tetapi tidak dapat mengubah konfigurasi atau menghapus data bersama.
* **Multi-Company Isolation**: Semua data diisolasi berdasarkan `company_id`. User hanya dapat mengakses data dari perusahaan yang aktif (`active_company_id`).
* **AI Credits & Billing**: Penggunaan AI Agent dikenakan biaya berdasarkan `price_per_run` x `price_multiplier` dari model yang dipilih. Pembayaran dapat menggunakan saldo (`balance`) atau kredit AI (`credit`).

***

## Integrasi Lintas Entitas

AI Content Studio tidak berdiri sendiri — ia terintegrasi mendalam dengan ekosistem SNISHOP ERP:

```mermaid theme={null}
graph LR
    subgraph Content Studio
        SI[Smart Insight]
        CG[Copy Generator]
        VS[Visual Studio]
        VSG[Video Script]
        CC[Kalender Konten]
        WACS[WhatsApp CS]
        BKB[Basis Pengetahuan]
    end

    subgraph ERP Data Layer
        CP[CompanyProduct]
        PT[POSTransaction]
        CU[Customer]
        INV[Invoice]
    end

    subgraph AI Infrastructure
        AIT[AIAgentTemplate]
        AIM[AIAgentModel]
        AIR[AIAgentRun]
        AIS[AIAgentSettings]
        AISch[AIAgentSchedule]
        AIL[AILearningData]
    end

    subgraph Content Output
        BC[BlogContent]
        EC[EmailCampaign]
        WCL[WhatsAppChatLog]
        DOC[Document]
        CONV[Conversation]
    end

    SI --> CP
    SI --> PT
    WACS --> CU
    WACS --> CP
    
    CG --> AIT
    CG --> AIR
    VS --> AIR
    VSG --> AIR
    WACS --> AIR
    
    BKB --> CP
    BKB --> CU
    BKB --> PT
    
    CC --> BC
    CC --> EC
    
    AIT --> AIM
    AIR --> AIM
    AIS --> AIT
    AISch --> AIT
    AIL --> AIR
```

### Alur Data End-to-End

1. **Insight ke Konten**: Smart Insight menganalisis `CompanyProduct` dan `CompanyPOSTransaction` untuk menghasilkan rekomendasi konten berbasis data real.
2. **Generate ke Kalender**: Hasil dari Copy Generator, Visual Studio, dan Video Script langsung dapat dijadwalkan di Kalender Konten.
3. **Brand Knowledge sebagai Konteks**: Semua generasi AI menggunakan `brandKnowledgeService` yang mengkompilasi data dari produk, pelanggan, dan transaksi menjadi prompt kontekstual.
4. **WhatsApp CS sebagai Distributor**: Konten yang sudah dipublikasi dapat dipromosikan melalui WhatsApp CS yang memiliki akses penuh ke knowledge base.
5. **Learning Loop**: `AILearningData` merekam koreksi user untuk meningkatkan akurasi AI secara berkelanjutan.

***

## Konfigurasi & Biaya AI

### Struktur Biaya

```
Biaya Per Run = base_price_per_run (dari AIAgentSettings)
               ATAU price_per_run (dari AIAgentTemplate)
               x price_multiplier (dari AIAgentModel)
```

### Contoh Perhitungan

| Skenario | Base Price | Model Multiplier | Total Biaya |
| - | - | - | - |
| Standard model, base price | Rp1.000 | 1.0x | Rp1.000 |
| Advanced model, base price | Rp1.000 | 2.5x | Rp2.500 |
| Premium model, base price | Rp1.000 | 5.0x | Rp5.000 |
| Custom price agent, standard | Rp5.000 | 1.0x | Rp5.000 |
| Custom price agent, premium | Rp5.000 | 5.0x | Rp25.000 |

### Kredit AI

* 1 kredit = `credit_to_rupiah_rate` x Rupiah (default: 1 kredit = Rp10)
* User mendapatkan `ai_credits` default 10 kredit saat registrasi
* Kredit dapat ditambahkan melalui pembelian addon
* Reset kredit mengikuti `ai_usage_period_start`

***

## Best Practices

### Untuk Content Creator

1. **Mulai dari Data**: Selalu periksa Smart Insight sebelum membuat konten untuk memastikan relevansi dengan kondisi bisnis terkini.
2. **Manfaatkan Variasi**: Generate minimal 3 variasi (A/B/C) dan pilih yang paling sesuai dengan target audiens.
3. **Konsistensi Visual**: Gunakan color theme yang sama untuk seluruh konten dalam satu campaign.
4. **Schedule Strategis**: Gunakan Kalender Konten untuk merencanakan minimal 2 minggu ke depan.

### Untuk Admin

1. **Update Knowledge Base**: Pastikan Basis Pengetahuan selalu terkini agar AI CS memberikan informasi akurat.
2. **Monitor AI Run**: Periksa `AIAgentRun` secara berkala untuk mengoptimalkan `system_prompt` dan memilih model yang tepat.
3. **Kelola Biaya**: Sesuaikan `AIAgentSettings` untuk mengontrol pengeluaran AI perusahaan.
4. **Review WhatsApp Log**: Analisis `WhatsAppChatLog` untuk mengidentifikasi intent yang sering muncul dan memperbaiki response.

### Untuk Owner

1. **Brand Guidelines**: Tetapkan brand guidelines yang jelas di Basis Pengetahuan agar semua konten AI konsisten dengan identitas brand.
2. **VIP Detection**: Manfaatkan data VIP dari Basis Pengetahuan untuk membuat konten eksklusif bagi pelanggan setia.
3. **ROI Tracking**: Gunakan data dari `EmailCampaign` (opened\_count, clicked\_count) dan `BlogContent` (views, likes) untuk mengukur efektivitas konten AI.


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