Tokoku ERP API

REST API untuk integrasi aplikasi mobile Tokokumo dan layanan pihak ketiga dengan platform Tokoku ERP.

Base URL

https://tokoku.kuroragidigital.my.id/api/v1

Autentikasi

Bearer Token (Sanctum)

Format

JSON

Authentication

Semua endpoint (kecuali POST /auth/login) memerlukan Bearer Token di header:

Authorization: Bearer <token_dari_login>

Token diperoleh melalui endpoint login. Setiap token memiliki abilities berdasarkan peran pengguna:

RoleAbilities
superadmin * (semua akses)
pemilik dashboard:view, sales:*, stock:view, stock:opname, reports:view, units:switch
karyawan dashboard:view, sales:view, sales:create, stock:view

Format Response

Semua response menggunakan format JSON yang konsisten:

Success Response
{
    "success": true,
    "message": "OK",
    "data": { ... }
}
Paginated Response
{
    "success": true,
    "message": "OK",
    "data": [ ... ],
    "meta": {
        "current_page": 1,
        "last_page": 5,
        "per_page": 20,
        "total": 96
    }
}
Error Response
{
    "success": false,
    "message": "Deskripsi error",
    "errors": { ... }  // (opsional, untuk validasi)
}

Error Handling

CodeDeskripsi
200OK — Request berhasil
201Created — Data berhasil dibuat
401Unauthorized — Token tidak valid atau expired
403Forbidden — Tidak memiliki izin untuk aksi ini
404Not Found — Resource tidak ditemukan
422Unprocessable Entity — Data validasi gagal
429Too Many Requests — Rate limit terlampaui
500Internal Server Error — Kesalahan server

Auth Endpoints

POST /auth/login Public

Login dan mendapatkan access token. Mendukung login via email atau username.

Request Body
ParameterTipeWajibKeterangan
loginstringEmail atau username
passwordstringPassword akun
device_namestringNama perangkat (contoh: "Samsung Galaxy S24")
device_platformstringandroid atau ios
fcm_tokenstringFirebase Cloud Messaging token untuk push notification
Response (200)
{
    "success": true,
    "message": "Login berhasil.",
    "data": {
        "user": {
            "id": 1,
            "name": "John Doe",
            "username": "johndoe",
            "email": "john@example.com",
            "roles": ["pemilik"],
            "business_unit_id": 1,
            "owned_units": [{ "id": 1, "name": "Toko Utama" }],
            "last_login_at": "2026-03-19T10:30:00+07:00"
        },
        "token": "1|abc123def456...",
        "abilities": ["dashboard:view", "sales:view", ...]
    }
}
POST /auth/logout 🔒 Auth

Logout dan mencabut token saat ini. Juga menghapus FCM token.

GET /auth/profile 🔒 Auth

Mendapatkan data profil pengguna yang sedang login.

PUT /auth/profile 🔒 Auth

Memperbarui data profil pengguna.

Request Body
ParameterTipeWajibKeterangan
namestringNama lengkap
emailstringAlamat email (unik)
fcm_tokenstringToken FCM baru
PUT /auth/password 🔒 Auth

Mengubah password pengguna.

Request Body
ParameterTipeWajibKeterangan
current_passwordstringPassword saat ini
passwordstringPassword baru (min: 8)
password_confirmationstringKonfirmasi password baru
POST /auth/switch-unit 🔒 Auth

Pindah unit usaha aktif.

Request Body
ParameterTipeWajibKeterangan
business_unit_idintegerID unit usaha tujuan
GET /auth/units 🔒 Auth

Mendapatkan daftar unit usaha yang dapat diakses pengguna.

Dashboard Endpoints

GET /dashboard 🔒 dashboard:view

Data dashboard lengkap: ringkasan, grafik penjualan, cashflow, produk terlaris, stok rendah, dll.

Query Parameters
ParameterTipeWajibKeterangan
business_unit_idintegerID unit usaha. Default: unit aktif pengguna
GET /dashboard/summary 🔒 dashboard:view

Ringkasan ringan untuk home screen mobile: kartu ringkasan + info stok rendah.

Response (200)
{
    "success": true,
    "data": {
        "summary_cards": { ... },
        "low_stock_count": 3,
        "low_stock_items": [ ... ]
    }
}

Sales Endpoints

GET /sales 🔒 sales:view

Daftar penjualan dengan pagination dan filter.

Query Parameters
ParameterTipeWajibKeterangan
per_pageintegerJumlah per halaman (1-100, default: 20)
statusstringdraft, confirmed, completed, cancelled
payment_statusstringunpaid, partial, paid
start_datedateFilter dari tanggal (YYYY-MM-DD)
end_datedateFilter sampai tanggal (YYYY-MM-DD)
searchstringCari berdasarkan nomor invoice atau nama pelanggan
business_unit_idintegerID unit usaha
GET /sales/{id} 🔒 sales:view

Detail penjualan lengkap termasuk item, pembayaran, dan pelanggan.

POST /sales 🔒 sales:create

Membuat transaksi penjualan baru.

Request Body
ParameterTipeWajibKeterangan
customer_idintegerID pelanggan
sale_typestringgoods, saldo, service, mix
sale_datedateTanggal penjualan (YYYY-MM-DD)
due_datedateTanggal jatuh tempo
notesstringCatatan (max: 500)
discountnumericDiskon total
taxnumericPajak
payment_typestringcash, credit, partial, down_payment, prepaid_deduction
payment_sourcestringkas_utama, kas_kecil, bank_utama
paid_amountnumericJumlah yang dibayar
itemsarrayDaftar item penjualan (min: 1)
items.*.item_typestringgoods, saldo, service
items.*.stock_idintegerID stok (wajib untuk goods)
items.*.quantitynumericJumlah (min: 0.01)
items.*.unit_pricenumericHarga satuan
items.*.discountnumericDiskon per item
DELETE /sales/{id} 🔒 sales:delete

Menghapus penjualan. Tidak bisa menghapus penjualan berstatus completed.

GET /sales/customers 🔒 sales:view

Daftar pelanggan aktif untuk dropdown di form penjualan mobile.

Stock Endpoints

GET /stocks 🔒 stock:view

Daftar stok/produk dengan pagination dan filter.

Query Parameters
ParameterTipeWajibKeterangan
per_pageintegerJumlah per halaman (1-100, default: 20)
searchstringCari berdasarkan kode, nama, atau barcode
category_group_idintegerFilter berdasarkan grup kategori
is_activebooleanFilter berdasarkan status aktif
low_stockbooleanHanya tampilkan stok di bawah minimum
business_unit_idintegerID unit usaha
GET /stocks/{id} 🔒 stock:view

Detail stok/produk termasuk kategori dan satuan.

GET /stocks/opnames 🔒 stock:view

Daftar stock opname dengan pagination.

Query Parameters
ParameterTipeWajibKeterangan
per_pageintegerJumlah per halaman (default: 20)
statusstringdraft, approved, cancelled
searchstringCari berdasarkan nomor opname atau PIC
POST /stocks/opnames 🔒 stock:opname

Membuat stock opname baru.

Request Body
ParameterTipeWajibKeterangan
opname_datedateTanggal opname (YYYY-MM-DD)
pic_namestringNama penanggung jawab (max: 100)
notesstringCatatan (max: 1000)
detailsarrayDetail item opname (min: 1)
details.*.stock_idintegerID stok
details.*.actual_qtynumericQty aktual (min: 0)
details.*.notesstringCatatan per item
Catatan Umum
  • Semua endpoint yang memerlukan autentikasi harus menyertakan header Authorization: Bearer <token>.
  • Parameter business_unit_id opsional pada semua endpoint — jika tidak diisi, akan menggunakan unit usaha aktif pengguna.
  • Request body menggunakan format Content-Type: application/json.
  • Tanggal menggunakan format YYYY-MM-DD, datetime menggunakan format ISO 8601.