Poslite Service — API Reference
Port internal: 8096
Proxy publik: POST|GET /merchant/poslite/* via core_api (JWT required)
Auth internal: X-Internal-API-Key + X-Merchant-ID (di-inject core_api proxy)
Semua path di bawah ini adalah path setelah prefix /merchant distrip oleh core_api.
Mobile memanggil https://api-merchant.kesles.com/merchant/poslite/...; core_api forward ke
http://127.0.0.1:8096/poslite/....
Catalog — Outlets
GET /poslite/catalog/outlets
List semua outlet merchant.
Response 200:
{
"outlets": [
{
"id": "uuid",
"merchant_id": "uuid",
"code": "OUTLET-01",
"name": "Toko Pusat",
"address_line": "Jl. Sudirman 1",
"city": "Makassar",
"province": "Sulawesi Selatan",
"phone": "0411-123456",
"nmid": "ID1234567890123",
"qris_static_payload": "00020101...",
"is_active": true,
"created_at": "...",
"updated_at": "..."
}
]
}
POST /poslite/catalog/outlets
Buat outlet baru.
Body:
{
"code": "OUTLET-01",
"name": "Toko Pusat",
"address_line": "Jl. Sudirman 1",
"city": "Makassar",
"province": "Sulawesi Selatan",
"phone": "0411-123456"
}
code dan name wajib. Conflict uk_outlets_merchant_code → 409 code_conflict.
Response 201: Objek outlet.
GET /poslite/catalog/outlets/{id}
Ambil detail outlet.
Response 200: Objek outlet. 404 not_found jika tidak ada.
PATCH /poslite/catalog/outlets/{id}
Update outlet (semua field opsional).
Body:
{
"name": "Toko Baru",
"address_line": "...",
"city": "...",
"province": "...",
"phone": "...",
"is_active": false,
"nmid": "ID...",
"qris_static_payload": "00020101..."
}
nmid dan qris_static_payload di-pull dari merchant.merchant_outlets — update manual
hanya untuk sinkronisasi manual atau koreksi.
Response 200: Objek outlet terupdate.
DELETE /poslite/catalog/outlets/{id}
Soft-delete outlet (deleted_at = now()). Response 204.
Catalog — Categories
GET /poslite/catalog/categories
List semua kategori merchant.
Response 200: { "categories": [...] }
POST /poslite/catalog/categories
Buat kategori baru. Field name wajib.
Body: { "name": "...", "parent_id": null, "sort_order": 0, "icon_name": "category" }
Response 201: Objek kategori.
GET /poslite/catalog/categories/{id}
Ambil detail satu kategori.
Response 200: Objek kategori. 404 jika tidak ada.
PATCH /poslite/catalog/categories/{id}
Update kategori (semua field opsional).
Body: { "name": "...", "parent_id": "...", "sort_order": 1, "icon_name": "...", "is_active": true }
Response 200: Objek kategori.
DELETE /poslite/catalog/categories/{id}
Soft-delete. Response 204.
GET /poslite/catalog/categories/defaults?business_type_name=<nama>
Template kategori default dari db_reference berdasarkan jenis usaha.
Response 200: { "business_type_name": "...", "categories": [{ "name": "...", "icon_name": "...", "sort_order": 0 }] }
503 reference_db_unavailable jika DB_REFERENCE_POSTGRES_DSN tidak dikonfigurasi.
POST /poslite/catalog/categories/provision
Provisi kategori awal merchant dari daftar pilihan. Idempotent — jika merchant sudah punya kategori, return existing tanpa insert baru.
Body:
{
"selected": [{ "name": "Makanan", "icon_name": "food" }],
"custom": [{ "name": "Lainnya", "icon_name": "category" }]
}
Response 200: { "categories": [...] }
Catalog — Products
GET /poslite/catalog/products
List produk. Query params opsional: category_id, q, active=true, limit, offset.
Response 200: { "products": [...] } — setiap produk menyertakan barcode (dari
default variant, atau null jika belum di-set).
POST /poslite/catalog/products
Buat produk baru.
Body:
{
"name": "Nasi Goreng",
"sku": "NAGO-01",
"category_id": "uuid",
"product_type": "good",
"sell_price_amount": 15000,
"cost_price_amount": 8000,
"unit_label": "porsi",
"description": "",
"image_url": "",
"tax_rate_bps": 0,
"track_stock": false,
"barcode": "8999909096004"
}
name + sku wajib. product_type: good (default) atau service.
Auto-buat 1 default variant transparan (untuk referensi variant_id di sales).
Conflict:
409 sku_conflict— SKU sudah dipakai merchant409 barcode_conflict— Barcode sudah dipakai produk lain (unique global)
Response 201: Objek produk.
GET /poslite/catalog/products/{id}
Ambil produk termasuk barcode. Response 200. 404 jika tidak ada.