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

# B2B Partner Portal

> Portal B2B lengkap: katalog khusus partner, harga distributor, order management, dan growth analytics di SNISHOP ERP.

# B2B Partner Portal

<img src="https://mintcdn.com/quinnofspicy/e4f_upKhVWcjsUmM/docs/mintlify/screenshots/b2b/b2b-partner-portal.png?fit=max&auto=format&n=e4f_upKhVWcjsUmM&q=85&s=48b10f1f236fcbf4ee08b82c336bc8cc" alt="B2B Partner Portal" width="1920" height="1080" data-path="docs/mintlify/screenshots/b2b/b2b-partner-portal.png" />

B2B Partner Portal adalah storefront khusus yang memberikan akses terpisah antara tampilan admin dan tampilan partner bisnis. Portal ini membedakan jenis customer (distributor, modern market, reseller, retail) dan menyajikan harga, katalog, serta alur pemesanan yang disesuaikan dengan masing-masing segmen.

Setiap partner melihat katalog yang sama namun dengan harga berbeda tergantung tipe customer mereka. Sistem ini menghilangkan kebutuhan komunikasi manual melalui WhatsApp atau email untuk proses order B2B — partner bisa langsung browse, order, dan tracking pengiriman dari satu portal.

Portal ini juga dilengkapi growth analytics yang memungkinkan admin memantau performa penjualan B2B secara visual.

## Arsitektur Komponen

```mermaid theme={null}
graph TD
    A[B2BPartnerPortal.jsx<br/>774 lines] --> B[Header Tabs<br/>Orders / Shipments / History]
    A --> C[Product Catalog<br/>CompanyPOSProduct + DigitalProduct]
    A --> D[B2BGrowthChart.jsx<br/>362 lines]
    A --> E[Order Management<br/>Idempotency Key]
    
    C --> F[Customer Type Pricing<br/>85% of retail default]
    C --> G[Stock Aggregation<br/>Inventory lookup]
    
    D --> H[Recharts Stacked AreaChart<br/>Monthly Revenue per Retailer]
    D --> I[Growth Metrics<br/>MoM, Total Revenue]
    
    E --> J[Return Conditions<br/>6 return reasons]
    E --> K[Shipment Tracking<br/>3 tabs integration]
```

## Entity & Model

### Customer (B2B)

| Field | Tipe | Deskripsi |
| - | - | - |
| `id` | UUID | Primary key |
| `name` | String | Nama partner/customer |
| `customer_type` | Enum | `distributor`, `modern_market`, `reseller`, `retail` |
| `email` | String | Email kontak partner |
| `phone` | String | Nomor telepon/WhatsApp |
| `address` | Text | Alamat pengiriman utama |
| `company_id` | UUID | Multi-tenant scoping |
| `created_at` | Timestamp | Waktu registrasi |
| `credit_limit` | Number | Batas kredit (opsional) |
| `payment_terms` | Number | Tempo pembayaran dalam hari |

### Pricing Logic

| Parameter | Nilai | Deskripsi |
| - | - | - |
| Base price | `product.price` | Harga retail dari CompanyPOSProduct |
| B2B multiplier | `0.85` (default) | 85% dari harga retail |
| Minimum order | `12` bottles | Batas minimum pemesanan per order |
| Idempotency key | UUID per order | Mencegah duplikasi order |

### B2B Channel Pricing

| Customer Type | Default Multiplier | Min Order | Notes |
| - | - | - | - |
| Distributor | 85% | 12 bottles | Harga terendah, volume terbesar |
| Modern Market | 85% | 12 bottles | Supermarket/minimarket |
| Reseller | 85% | 12 bottles | Reseller skala menengah |
| Retail | 100% | 12 bottles | Harga retail, bisa disesuaikan |

### Order Entity

| Field | Tipe | Deskripsi |
| - | - | - |
| `id` | UUID | Primary key |
| `order_number` | String | Nomor order unik (auto-generated) |
| `customer_id` | FK → Customer | Partner yang order |
| `items` | Array | Daftar produk + qty + harga |
| `subtotal` | Number | Total sebelum diskon |
| `discount` | Number | Potongan harga |
| `total` | Number | Total akhir |
| `status` | Enum | `pending`, `confirmed`, `processing`, `shipped`, `delivered`, `cancelled` |
| `payment_status` | Enum | `unpaid`, `partial`, `paid` |
| `shipping_address` | Text | Alamat pengiriman |
| `notes` | Text | Catatan order |
| `idempotency_key` | UUID | Key untuk cegah duplikasi |
| `company_id` | UUID | Multi-tenant scoping |
| `created_at` | Timestamp | Waktu order |

## Fitur Utama

### 1. Multi-Tab Navigation

Portal menggunakan 3 tab utama untuk memisahkan konteks operasional:

| Tab | Fungsi | Konten |
| - | - | - |
| **Orders** | Buat order baru | Katalog produk, cart, checkout |
| **Shipments** | Tracking pengiriman | Status pengiriman aktif |
| **History** | Riwayat transaksi | Order selesai, return, invoice |

### 2. B2B Growth Chart

Komponen `B2BGrowthChart.jsx` (362 baris) menggunakan Recharts untuk menampilkan performa penjualan B2B secara visual:

**Chart Type**: Stacked AreaChart

**Data Source**: Aggregasi order B2B per retailer per bulan

**Metrics yang Ditampilkan**:

| Metric | Deskripsi |
| - | - |
| Monthly Revenue | Total revenue per retailer per bulan |
| MoM Growth | Month-over-month growth percentage |
| Total Revenue | Akumulasi revenue keseluruhan |
| Top Retailer | Retailer dengan revenue tertinggi |

**Visual Stack**: Setiap retailer di-stack sebagai area terpisah dengan warna berbeda, memungkinkan admin melihat komposisi revenue dan tren pertumbuhan.

```mermaid theme={null}
flowchart TD
    A[Fetch B2B Orders] --> B[Group by Retailer]
    B --> C[Group by Month]
    C --> D[Calculate Revenue]
    D --> E[Build Chart Data]
    E --> F[Render Stacked AreaChart]
    F --> G[Display Growth Metrics]
```

### 3. Product Catalog & Ordering

Katalog produk B2B mengambil data dari 2 sumber:

| Source Entity | Konten |
| - | - |
| `CompanyPOSProduct` | Produk fisik (saos, bumbu, dll) |
| `DigitalProduct` | Produk digital (voucher, e-catalog) |

**Stock Resolution**:

```mermaid theme={null}
sequenceDiagram
    participant P as Partner Portal
    participant CP as CompanyPOSProduct
    participant INV as Inventory
    participant O as Order

    P->>CP: Fetch product list
    CP-->>P: Product data + base price
    P->>INV: Lookup stock per product
    INV-->>P: Available quantity
    P->>P: Apply B2B multiplier (85%)
    P->>P: Display catalog with B2B price
    
    Note over P: Partner browses & adds to cart
    
    P->>P: Validate min order (12 bottles)
    P->>O: Create order with idempotency key
    O-->>P: Order confirmation
```

### 4. Return & Refund Management

Portal mendukung pengelolaan return dengan 6 alasan yang terdefinisi:

| Return Reason | Deskripsi |
| - | - |
| Damaged product | Produk rusak saat pengiriman |
| Wrong item | Barang yang dikirim tidak sesuai |
| Quality issue | Masalah kualitas (kadaluarsa, cacat) |
| Late delivery | Pengiriman terlambat dari SLA |
| Changed mind | Partner berubah pikiran (jika diizinkan) |
| Other | Alasan lain dengan penjelasan manual |

**Return Flow**:

```mermaid theme={null}
stateDiagram-v2
    [*] --> Submitted: Partner submit return request
    Submitted --> Reviewing: Admin review
    Reviewing --> Approved: Admin approve
    Reviewing --> Rejected: Admin reject
    Approved --> ReturnReceived: Barang diterima kembali
    ReturnReceived --> Refunded: Refund diproses
    Refunded --> [*]
    Rejected --> [*]
```

### 5. Idempotency & Data Integrity

Setiap order B2B dikirim dengan **idempotency key** (UUID) untuk mencegah:

* Duplikasi order akibat network retry
* Double-submit dari user yang tidak sabar klik
* Race condition saat order diproses bersamaan

**Implementation**:

```javascript theme={null}
const idempotencyKey = crypto.randomUUID();
await base44.entities.B2BOrder.create({
  customer_id: customerId,
  items: cartItems,
  total: orderTotal,
  idempotency_key: idempotencyKey,
  // ... other fields
});
```

## Integrasi Cross-Module

```mermaid theme={null}
graph LR
    A[B2B Partner Portal] --> B[Inventory<br/>Stock lookup]
    A --> C[Finance<br/>Invoice & payment]
    A --> D[CRM<br/>Partner data]
    A --> E[Distribution<br/>Shipment tracking]
    A --> F[Analytics<br/>Revenue reporting]
    
    B --> G[CompanyPOSProduct]
    B --> H[DigitalProduct]
    C --> I[GL Journal Entries]
    D --> J[Customer entity]
    E --> K[DistributionShipment]
```

## Cara Akses

Dari sidebar, klik menu **B2B** > **Partner Portal**.

## Flow Penggunaan

### Untuk Admin (Setup & Monitoring)

1. Buka halaman Partner Portal dari sidebar
2. Kelola daftar partner dan tentukan `customer_type` masing-masing
3. Atur harga khusus atau multiplier untuk setiap tipe customer
4. Monitor performa penjualan B2B melalui B2BGrowthChart
5. Review order yang masuk dari 3 tab (Orders, Shipments, History)
6. Handle return request berdasarkan 6 kategori alasan

### Untuk Partner (Order & Tracking)

1. Login ke portal partner dengan kredensial yang diberikan
2. Browse katalog produk dengan harga B2B sesuai tipe customer
3. Tambahkan produk ke cart (minimum 12 bottles per order)
4. Checkout dan pilih alamat pengiriman
5. Track status pengiriman dari tab Shipments
6. Lihat riwayat order dari tab History

## Tips

* Set multiplier B2B yang kompetitif namun tetap margin-positive — 85% adalah default, tapi bisa disesuaikan per customer type
* Monitor B2BGrowthChart secara bulanan untuk identifikasi retailer yang tumbuh atau stagnan
* Gunakan data return reason untuk memperbaiki proses packing dan pemilihan logistik partner
* Onboarding partner baru dengan walkthrough 3 tab agar mereka familiar dengan alur order → shipment → history
* Berikan akses training kepada partner tentang cara menggunakan portal agar order masuk dengan benar
* Review credit limit secara berkala untuk partner dengan volume tinggi


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