LabaBersih v2

Accounting, inventory, dan order management untuk seller online Indonesia. Dibangun dengan Elixir/Phoenix, di-deploy di Fly.io.

Apa itu LabaBersih

LabaBersih adalah platform financial management all-in-one untuk seller online Indonesia. Kalau kamu kenal A2X (jembatan Shopify/Amazon ke Xero/QuickBooks), LabaBersih mirip itu — tapi lebih lengkap karena accounting, inventory, dan order management ada dalam satu tempat.

Core Value Proposition Seller Indonesia gak perlu pakai 3 app terpisah (marketplace + accounting + inventory). LabaBersih = satu dashboard, semua terurus.

Perbandingan dengan A2X

Kapabilitas A2X LabaBersih
Accounting (COA, jurnal, laporan, trial balance) Bridge ke Xero Built-in
Reconciliation (per-fee matching, suspense) Ada Ada
Inventory + FEFO Tidak ada Ada
Order management + packing Pakai Shopify Built-in
RTS / Returns + inbound Tidak ada Ada (baik/rusak/hilang)
Purchasing (PO) Tidak ada Ada
Platform Shopify, Amazon TikTok, Shopee, Mengantar
Target market Global (English) Indonesia (Bahasa, Rupiah, WIB)

5 Masalah yang Diselesaikan

MasalahPenjelasan
Laba semu Laba kelihatan besar, tapi saat rekonsiliasi ternyata minus. Fee marketplace tersembunyi. LabaBersih pakai per-fee reconciliation — setiap fee di-match satu-satu, bukan lump sum.
Manual import/export Copy-paste data antar platform setiap hari. LabaBersih punya staging pipeline + XLSX import yang langsung masuk ke sistem.
HPP gak akurat Seller nebak HPP dari harga modal rata-rata. LabaBersih pakai FEFO lot tracking — HPP dihitung dari cost per unit di setiap lot, bukan tebakan.
Laporan keuangan berantakan Trial Balance gak balance, COA gak konsisten. LabaBersih enforce jurnal balanced, COA immutable, dan sequential period closing.
RTS silent killer Return barang gak ke-track, stok gak balik, piutang menggantung. LabaBersih track inbound RTS (baik/rusak/hilang) dengan jurnal otomatis per kondisi.

Tech Stack

LayerTeknologiCatatan
BahasaElixirImmutable, pattern matching, BEAM concurrency
FrameworkPhoenix 1.8Context = DDD, LiveView = realtime tanpa JS
UILiveView + Tailwind v4Server-rendered, 1 bahasa end-to-end
DatabasePostgreSQLDi Fly.io, ACID, proven
DB LibraryEctoSchema, changeset, query, migration
AuthGuardian (JWT) + bcryptCustom auth, full kontrol
Background JobsObanPersistent job queue, retry, scheduling
EmailSwoosh + ResendTransactional email
HTTP ClientReqUntuk API TikTok, Mengantar, Facebook, dll
HostingFly.ioRegion Singapore, ~$10-15/bulan

Arsitektur 6 Domain

Sistem dibagi menjadi 6 domain bisnis yang berkembang di 3 fase. Setiap domain punya bounded context sendiri — gak boleh circular dependency.

DomainScopePhase 1Phase 2Phase 3
Master Data Product, Warehouse, Store, Legal Entity, Supplier, Courier Bundle + unit conv, courier mapping, reserved_stock Multi-warehouse enforcement
Accounting COA, Journal, Reconciliation, Closing, Tax, Reports Daily summary journal (Oban) Recurring expenses, aged receivables, financial health
Order Intake XLSX import, API sync, SKU matching XLSX auto-import, SKU importer API staging pipeline (TikTok/Shopee/Mengantar) Settlement XLSX
Fulfillment Packing, ship, pick, handover, GRN Keep current + reserved_stock FO → PickList → Ship → Handover, GRN PackingIncident QC
Returns RTS, inbound, klaim, supplier return Sudah selesai Customer refund/replacement
Intelligence Demand, ABC-XYZ, spike, campaign, reorder Full implementation

Keputusan Arsitektur Kunci

KeputusanDetail
CustomerDenormalized di order (customer_name, customer_phone). Tidak ada tabel terpisah. Aggregate by phone kalau butuh nanti.
Product2 tipe: simple (punya stok) dan bundle (virtual, dari komponen via BOM). Bundle stok = floor(min(komponen_stok / qty)).
JournalDaily summary per toko per hari + per-order lines. Scale: 300 order/hari = 6 jurnal vs 600 (kalau per-order).
FulfillmentPhase 1: keep packing session + ship_order. Phase 2: full FulfillmentOrder → PickList → Shipment → CourierHandover.
ID GenerationAdvisory lock di PostgreSQL. Format: PS2603-00001, JE2603-00001, RTS-260331-001. Human-readable, anti race condition.

Status Development

Yang Sudah Selesai

Backend Layer 0-9 — 133 tests, 0 failures, 10 context modules
UI Phase 1-5 — semua list page + detail page + shared components
Refactor Step 1-14 — legal entity, COA auto-generate, per-fee rekon, tax, store FK
Deploy — lababersih.id live di Fly.io

Status Per Halaman

HalamanListCreateEditDeleteDetailSearchFilterPagination
Dashboard
Pesananvvxxvvvv
Packingvvxvv
RTSvvvvvv
Produkvvvvvvxv
Pembelian (PO)vvvvvv
Toko / Channelvvvvxvx
Bagan Akunvvvvxvx
JurnalvvVoidvvvv
Rekonsiliasivvxvx
Laporanv
Buku Besarv
Settingsvv

Yang Sedang Dikerjakan (Session 7-10)

SessionScopeStatus
G1Staging Service — backend functions untuk staging pipelineSELANJUTNYA
G2Staging UI — list page, preview, bulk approve/rejectMenunggu
G3XLSX Parser — TikTok, Shopee, Mengantar (3 format)Menunggu
G4Settlement XLSX — parser untuk rekonsiliasiOpsional

Prinsip Akuntansi

10 aturan fundamental yang tidak boleh dilanggar. Semua logic akuntansi di LabaBersih dibangun di atas prinsip ini.

#PrinsipPenjelasan
1Pendapatan selalu di CREDITRevenue accounts normal_balance = credit
2Beban selalu di DEBITExpense accounts normal_balance = debit
3Trial Balance harus balanceTotal debit = total credit. Ada UI khusus untuk verifikasi.
4Kode akun immutableSekali dibuat, kode akun gak boleh diubah.
5Fee estimation bukan faktaSaat kirim = asumsi 80-90%. Saat rekonsiliasi = fakta terungkap.
6Per-fee reconciliationSetiap fee di-match individual, bukan lump sum (pendekatan A2X).
7Unknown fee → suspenseFee tak dikenal masuk akun penampung (61-999), user kategorikan manual.
8Rekonsiliasi validasi tokoorder.store_id harus sama dengan selected store_id. Gak boleh cross-store.
9COA auto-generate per tokoSaat buat toko → auto-create akun (piutang, kas, pendapatan, retur) di bawah platform header.
10COA structure strictSelalu group by platform. Piutang Shopee → leaf per toko. Aggregate di header.

COA Architecture

Chart of Accounts dibangun dengan hierarchy 3 level. Level 1 = template (di-seed otomatis), Level 2 = per platform (auto saat platform pertama), Level 3 = per toko (auto saat toko dibuat).

Level 1: Type header → 12 Piutang (is_header=true, source="template") Level 2: Platform header → 12-2 Piutang Shopee (source="platform") Level 3: Store leaf → 12-201 Piutang Shopee Bestari (source="store")

Auto-generate Flow

1. Org baru dibuat → seed COA template (level 1 headers) 2. Toko baru dibuat → cek platform header ada? | Belum ada → create level 2 header | Sudah ada → skip → create leaf accounts per toko (level 3) → link store record ke accounts via FK 3. Rekonsiliasi → validasi order milik toko yang dipilih 4. Laporan → aggregate dari leaf → platform → type

Auto-generate dilindungi oleh advisory lock per org+platform untuk mencegah race condition saat concurrent store creation.

Journal Architecture

Jurnal menggunakan pendekatan Daily Summary + Per-Order Lines (Opsi 4) — kompromi antara granularity dan scale.

Alur 3 Tahap

TahapApa yang terjadiKapan
SHIP Stok potong (FEFO lot consumption), HPP tercatat per order. Jurnal fee belum dicatat. Real-time per order
DAILY BATCH 1 jurnal penjualan per toko per hari (lines per order: Dr. Piutang + Dr. Fee / Cr. Revenue). 1 jurnal HPP summary. Oban job akhir hari
SETTLEMENT Per-fee matching (estimasi vs aktual). 1 jurnal adjustment per settlement. Unknown fee → suspense. 7-14 hari kemudian

Scale Comparison

Order/hariPer-order approachDaily summary approach
300600 jurnal6 jurnal + 300 line sets
6.30012.600 jurnal~30 jurnal + 6.300 line sets

Audit tetap granular — setiap line punya order_id, bisa di-trace ke order spesifik.

Pipeline Architecture

Status order dipecah menjadi 3 track independen — setiap track punya lifecycle sendiri dan tidak boleh dicampur.

ORDER STATUS (business lifecycle): dibuat → diproses → selesai / dibatalkan FULFILLMENT STATUS (warehouse operation): unfulfilled → picking → packed → shipped → delivered / returned PAYMENT STATUS (money flow): unpaid → settled → refunded

Side Effects Per Event

EventSide Effects
shippedStock deduction (FEFO) + HPP lot consumption + audit trail. Jurnal fee di-batch nanti.
settledPer-fee matching + jurnal rekonsiliasi (Dr. Kas / Cr. Piutang +/- adjustment).
returnedReverse jurnal penjualan + stok kembali (kalau baik) atau jurnal kerugian (kalau rusak/hilang).

3 Trigger Sources, 1 Shared Function

XLSX Import ---+ API Sync ---+--> Orders.create_order() --> Orders.ship_order() Manual ---+

Semua sumber data melewati function yang sama. Logic hanya ada di 1 tempat — gak ada duplikasi per source.

Roadmap

1
Session 1-6 — SELESAI
Bagan Akun hierarchy, Laporan Keuangan, Pesanan enrichment, Stat Cards, Buku Besar, Settings, Error Handling
Session 7-10 — SELANJUTNYA
Staging Pipeline (backend + UI), XLSX Parser (TikTok/Shopee/Mengantar), Settlement XLSX. Fondasi untuk migrasi v1 → v2.
3
Phase 2 — Setelah v2 live
Full fulfillment flow (FO → PickList → Ship → Handover), GRN, recurring expenses, aged receivables, API integration (TikTok/Shopee/Mengantar).
4
Phase 3 — Scale
Intelligence: demand snapshots, ABC-XYZ classification, spike detection, campaign planning, auto-reorder suggestions.
© 2026 LabaBersih — PT Tumbuh Dari Desa