Pelan Produk & Teknikal — Idea Baharu (bukan daripada imbasan 5-idea)

Enjin Padanan Kesediaan Audit untuk Firma Akauntan

Satu "% kesediaan audit" bagi setiap klien yang tidak boleh dipalsukan oleh 200+ klien SME firma akauntan dengan hanya memuat naik fail rawak — kerana ia dikira dengan memadankan transaksi bank sebenar terhadap resit (dibaca secara automatik melalui OCR, bukan ditaip manual) dan, jika berkenaan, rekod e-Invois MyInvois. Bukan peti masuk permintaan dokumen; pengesan jurang yang turut melakukan kerja pengkategorian.

Pembeli: rakan kongsi firma akauntan ("HQ")
Pengguna akhir: klien SME HQ
Metrik teras: % transaksi dengan dokumen sepadan, bagi setiap klien, setiap bulan
Dokumen A — Gambaran Perniagaan & Produk, untuk pengasas komersial
A·1

Apa yang kita jual, dan kepada siapa

Apa dia: aplikasi web yang memberi firma akauntan satu nombor bagi setiap klien, setiap bulan — berapa peratus transaksi bank klien itu yang mempunyai resit atau e-Invois yang sepadan dalam rekod. Klien hanya perlu tangkap gambar resit setiap hari; OCR membaca jumlah, tarikh dan pembekal secara automatik serta mencadangkan kategori (pendapatan/perbelanjaan, cth. "Bekalan Pejabat") — tiada taip manual. Sistem kemudian memadankan data itu dengan penyata bank klien dan menyenaraikan dengan tepat apa yang masih tertinggal. Firma dapat melihat semua klien dalam satu jadual, disusun mengikut siapa yang paling ketinggalan, sebelum LHDN bertanya.

Siapa patut beli: rakan kongsi (partner) atau pengurus praktis di firma akauntan/pembukuan yang mempunyai cukup klien (sekurang-kurangnya 50, dibina untuk 200+) sehingga "mengejar resit" sudah menjadi kos operasi yang nyata — bukan pengamal solo dengan 5 klien yang boleh terus menelefon setiap seorang.

Masalah yang diselesaikan

Titik jualan utama

Cadangan nilai teras, satu ayatTukar "adakah klien membalas permintaan kami" kepada "adakah dokumen klien ini sebenarnya cukup lengkap untuk bertahan semasa audit" — menggunakan transaksi bank mereka sendiri sebagai asas kebenaran, bukan senarai semak.

A·2

Realiti persaingan — jujur sebelum pitching

Ini bukan pasaran yang kosong. Dua kategori global yang matang dan bermodal kukuh sudah wujud dan bertindih sebahagian:

Portal permintaan dokumen

Content Snare (1,900+ firma, $35–215/bulan), Financial Cents, Canopy, TaxDome, SmartVault, Clustdoc. Mereka menghantar pautan muat naik berjenama, mengingatkan klien secara automatik, dan memaparkan papan pemuka penyiapan setiap klien.

Apa yang mereka tidak boleh buat: memberitahu sama ada dokumen yang dimuat naik sebenarnya merangkumi apa yang berlaku dalam akaun bank. Penyiapan dilaporkan sendiri, bukan disahkan terhadap transaksi sebenar.

Padanan resit-ke-transaksi

Dext (dahulunya Receipt Bank), Hubdoc, SparkReceipt, Booke.ai. Mereka membaca resit dengan OCR dan memadankannya dengan transaksi suapan bank, menandakan transaksi yang tiada apa-apa di sebaliknya — sangat hampir dengan idea ini.

Apa yang mereka tidak boleh buat: tiada satu pun menyentuh MyInvois, sistem e-Invois kerajaan Malaysia, atau membingkai output khusus mengikut undang-undang audit Malaysia.

Apa maksudnya dari segi komersialJual idea ini sebagai "logik OCR-dan-padanan Dext, disesuaikan untuk Malaysia dan dibingkai sekitar risiko audit LHDN" — bukan sebagai kategori yang tiada siapa pernah fikirkan. Pengekstrakan OCR dan pengkategorian automatik (membaca jumlah/tarikh/pembekal daripada gambar resit, mencadangkan pendapatan/perbelanjaan dan kategori) kini adalah standard asas dalam kategori ini, bukan pembeza dengan sendirinya — itu asas yang klien jangkakan, bukan pitching utama. Kelebihan daya saing adalah nipis (Dext boleh menambah sokongan MyInvois bila-bila masa), jadi kelajuan mendapatkan hubungan sebenar dengan firma akauntan lebih penting daripada teknologi itu sendiri.

A·3

Bagaimana ia berfungsi — dua jenis pengguna yang berbeza

Terdapat dua perjalanan berasingan: firma akauntan (HQ), dan setiap klien SME HQ. Bahan pitching memerlukan kedua-duanya.

Perjalanan HQ

flowchart TD
  A["Rakan kongsi HQ dengar tentang produk
daripada pengasas komersial"] --> B["Demo: muat naik penyata bank
satu klien sebenar + folder resit"] B --> C{"Lihat senarai jurang
yang boleh dipercayai?"} C -- "tidak, data kelihatan salah" --> D["Pengasas laraskan peraturan padanan,
demo semula dengan sampel lebih bersih"] C -- "ya" --> E["HQ tandatangan perjanjian rintis
untuk 5-10 klien"] E --> F["HQ jemput klien tersebut
secara pukal melalui e-mel"] F --> G["HQ semak papan pemuka setiap minggu"] G --> H{"Jurang semakin
mengecil?"} H -- "tidak" --> I["HQ kejar klien secara terus,
produk ditandakan tidak cukup bersendirian"] H -- "ya" --> J["HQ kembangkan kepada senarai penuh klien"]

Perjalanan klien SME

flowchart TD
  A["Klien terima e-mel/WhatsApp jemputan
daripada firma akauntan mereka"] --> B["Klien buat akaun,
tiada pilihan — firma yang wajibkan"] B --> C["Tabiat harian: klien tangkap gambar
setiap resit/invois sebaik sahaja berlaku"] C --> D["OCR ekstrak jumlah, tarikh,
pembekal; cadangkan kategori"] D --> E["Sekali sebulan: klien muat naik
penyata bank (PDF/CSV)"] E --> F["Enjin padanan bandingkan resit
dengan transaksi bank"] F --> G["Sistem papar: X% sepadan,
ini senarai yang masih tertinggal"] G --> H{"Klien muat naik
yang tertinggal?"} H -- "ya" --> I["Peratusan naik,
senarai tertinggal mengecil"] H -- "tidak, bulan ini" --> J["Peringatan harian diteruskan
sehingga penutupan akhir bulan"]

Klien tidak memilih untuk membeli produk ini — firma akauntan yang mewajibkannya. Nada komunikasi semasa pendaftaran dan peringatan perlu mencerminkan "akauntan anda memerlukan ini," bukan pendaftaran SaaS biasa. Tabiat menangkap gambar resit setiap hari (bukan kelam-kabut sekali sebulan) ialah tabiat yang produk ini perlu bina — muat naik penyata bank adalah bukti bahawa tabiat itu benar-benar merangkumi semuanya.

A·4

Apa yang disertakan dalam keluaran pertama

KeutamaanCiri
P0Klien muat naik penyata bank (PDF atau CSV); sistem ekstrak senarai transaksi (tarikh, jumlah, keterangan)
P0Klien muat naik imej/PDF resit; OCR ekstrak jumlah, tarikh, pembekal secara automatik — tiada taip manual
P0Data resit yang diekstrak dipadankan dengan transaksi bank mengikut jumlah + kedekatan tarikh
P0Papan pemuka HQ: satu jadual, semua klien, % sepadan bulan ini, disusun paling ketinggalan dahulu
P0Senarai jurang bagi setiap klien: transaksi dinamakan yang tiada dokumen sepadan
P0Peringatan e-mel kepada klien yang belum muat naik apa-apa bulan ini
P1Kategori cadangan AI (pendapatan/perbelanjaan, cth. "Bekalan Pejabat") bagi setiap resit; akauntan semak dan sahkan sebelum ia dianggap muktamad — ini kemudahan pelabelan untuk eksport, tidak menjejaskan % penyiapan itu sendiri
P1Rujuk silang MyInvois — bergantung pada penyelesaian andaian akses data di bawah
P1Peringatan asli WhatsApp selain/bersama e-mel
P1Peringatan harian untuk bina tabiat "tangkap sebaik sahaja berlaku," bukan hanya tekanan akhir bulan
P2Integrasi terus perisian perakaunan (AutoCount, SQL Account) melebihi eksport/import manual
P2Penanda aras kadar penyiapan klien berbanding klien lain firma
P2Eksport data yang dikategorikan dan dipadankan terus ke format lejar/kunci kira-kira (CSV/Excel)

Sengaja dikecualikan semasa pelancaran: pembukuan penuh, pemfailan cukai, atau penggantian perisian perakaunan. Produk ini melakukan satu tugas — beritahu firma siapa yang berisiko audit dan sebabnya — dan berhenti di situ.

A·5

Onboarding dan garis masa penghantaran

Onboarding, langkah demi langkah: HQ mendaftar → HQ jemput kumpulan rintis klien secara pukal (mulakan dengan 5–10, bukan 200) → setiap klien terima e-mel, buat akaun, muat naik penyata bank dan resit satu bulan → HQ lihat papan pemuka pertama dalam masa beberapa hari, bukan minggu.

Andaian garis masa — bukan janjiP0 yang berfungsi (penguraian penyata bank + pengekstrakan resit OCR + padanan + papan pemuka HQ) secara realistik mengambil masa 9–11 minggu untuk pembangun solo, dengan andaian kepelbagaian format penyata bank dan ketepatan OCR pada resit Malaysia sebenar adalah risiko teknikal utama (lihat B.2). Ini mengandaikan tiada integrasi MyInvois semasa pelancaran — ia sengaja ditangguhkan. Jika firma rintis berkeras mahukan MyInvois dari hari pertama, tambah 4–6 minggu dan anggap ia sebagai rundingan berasingan, bukan sebahagian garis masa ini.

A·6

Batasan untuk ditetapkan jangkaan, sebelum rintis bermula

Dokumen B — Pelan Teknikal, untuk pengasas teknikal
B·1

Dokumen Keperluan Produk

Gambaran keseluruhan produk

Aplikasi web dua peringkat penyewa. Peringkat 1: firma akauntan ("akaun HQ") dengan kakitangan sendiri. Peringkat 2: setiap klien HQ ("sub-akaun Klien") dengan pengguna sendiri, memuat naik penyata bank dan resit sendiri. Sistem menguraikan penyata bank kepada transaksi, memadankan resit yang dimuat naik terhadap transaksi tersebut mengikut jumlah + kedekatan tarikh + persamaan teks, dan mengira peratusan penyiapan bagi setiap klien setiap bulan kalendar. HQ melihat setiap klien dalam satu jadual boleh susun.

Pelanggan sasaran

Pembeli utama: rakan kongsi firma akauntan/pembukuan yang menguruskan 50+ klien SME. Pengguna sekunder, tiada kuasa membeli: kakitangan klien SME sendiri (pemilik, jurubuku, atau kakitangan pentadbiran) yang melakukan muat naik sebenar.

Fungsi teras

  1. Pengambilan penyata bank → pengekstrakan transaksi
  2. Muat naik resit/dokumen → pengekstrakan OCR bagi jumlah, tarikh, pembekal (P1: kategori cadangan)
  3. Enjin padanan: resit yang diekstrak ↔ transaksi (dan kemudian, transaksi ↔ e-Invois MyInvois)
  4. Peratusan penyiapan bagi setiap klien, setiap bulan + senarai jurang bernama
  5. Papan pemuka merentasi klien untuk HQ, disusun mengikut penyiapan
  6. Sistem peringatan untuk klien yang ketinggalan

Peranan pengguna

PerananSkopBoleh buat
hq_adminSemua klien di bawah akaun HQ iniJemput/keluarkan klien, lihat semua papan pemuka, urus bil/tempat duduk HQ
hq_staffSemua klien di bawah akaun HQ iniLihat semua papan pemuka, semak padanan samar, tidak boleh urus bil
client_ownerSub-akaun klien sendiri sahajaMuat naik penyata/resit, jemput kakitangan sendiri, lihat % penyiapan sendiri
client_staffSub-akaun klien sendiri sahajaMuat naik penyata/resit, lihat % penyiapan sendiri

Peraturan perniagaan utama

Produk Boleh Jual Minimum

Satu akaun HQ, boleh menjemput sub-akaun klien, di mana setiap klien boleh memuat naik penyata bank dan gambar resit (diekstrak OCR secara automatik), dan HQ melihat jadual semua kliennya dengan % penyiapan dan boleh klik masuk ke mana-mana klien untuk melihat senarai jurang bernama. Tiada MyInvois, tiada pengkategorian AI, tiada WhatsApp — muat naik, ekstrak OCR, padan, dan laporkan.

Soalan terbuka — jangan bina berdasarkan andaian jawapan Sama ada sistem MyInvois LHDN menyediakan sebarang laluan akses data pihak ketiga yang didelegasikan (API atau eksport dengan persetujuan) untuk sejarah e-Invois klien sendiri adalah belum disahkan. P0 tidak bergantung pada ini — ia berfungsi sepenuhnya daripada penyata bank dan resit yang dimuat naik secara manual. Rujukan silang MyInvois P1 bergantung pada penyelesaian ini, berkemungkinan melalui perkongsian dengan pakej perakaunan yang sudah berintegrasi MyInvois (AutoCount, SQL Account) berbanding API kerajaan secara terus, kerana tiada bukti API sedemikian terbuka kepada pihak ketiga ditemui semasa imbasan ini.
Andaian model pengebilan — sahkan sebelum membina logik bil Andaian reka bentuk lalai: HQ membayar platform secara pukal, mengikut tempat duduk klien aktif, dan mengebil kliennya sendiri secara berasingan di luar platform ini (tiada kutipan bayaran daripada klien SME dalam produk semasa MVP). Ini adalah seni bina pengebilan paling mudah dan sepadan dengan cara Content Snare dan Dext sebenarnya menjual kepada firma hari ini. Taklimat asal pengguna menyatakan "klien membayar yuran bulanan" — ini mungkin bermaksud firma menyalurkan kos pada invois mereka sendiri, bukan platform mengebil klien secara terus. Sahkan ini dengan firma akauntan sebenar sebelum membina sebarang kutipan bayaran dalam aplikasi untuk klien; membina model pengebilan yang salah mahal untuk diubah kemudian.
B·2

Seni Bina Teknikal

Monolit modular. Tiada mikroservis berasingan — "enjin padanan" adalah modul dalam aplikasi yang sama, bukan perkhidmatan yang digunakan secara berasingan, sehingga beban sebenarnya memerlukan.

flowchart LR
  subgraph Client["Pelayar - Pengguna HQ dan SME"]
    UI["Aplikasi Next.js
(App Router)"] end subgraph App["Vercel - Lapisan aplikasi"] API["Laluan API
(pengesahan, muat naik, papan pemuka)"] Parser["Modul penghurai penyata
(PDF/CSV ke transaksi)"] OCR["Modul pengekstrakan OCR/AI
(resit ke jumlah, tarikh, pembekal)"] Matcher["Modul enjin padanan
(resit diekstrak ke transaksi)"] Jobs["Tugas latar belakang
(Vercel Cron)"] end subgraph Data["Lapisan data terurus"] DB[("Postgres
Neon atau Supabase")] Storage[("Storan objek
Supabase Storage atau R2")] end subgraph Ext["Perkhidmatan luaran"] Email["Pembekal e-mel
cth. Resend"] WA["API WhatsApp Business
(P1)"] OCRAPI["Pembekal OCR/AI
(cth. Google Document AI,
AWS Textract, atau LLM multimodal)"] end UI -->|HTTPS| API API --> Parser API --> OCR API --> Matcher API --> DB API --> Storage OCR -->|panggilan async| OCRAPI OCR --> Matcher Jobs --> Matcher Jobs --> Email Jobs -.->|P1| WA Matcher --> DB

Tindanan yang disyorkan

Bahagian hadapan + belakang

Next.js (App Router), digunakan di Vercel. Satu pangkalan kod melayan kedua-dua papan pemuka HQ dan aplikasi muat naik klien, dikawal mengikut peranan.

Pangkalan data

Postgres melalui Neon atau Supabase, dengan Drizzle ORM. Penyewaan peringkat baris dikuatkuasakan pada lapisan pertanyaan (lihat B.4), tidak bergantung semata-mata pada Postgres RLS semasa MVP untuk mengekalkan model mental mudah bagi pembangun solo.

Storan & tugas

Storan objek (Supabase Storage atau Cloudflare R2) untuk penyata/resit yang dimuat naik. Vercel Cron untuk kitaran peringatan bulanan dan padanan semula setiap malam bagi dokumen baharu yang dimuat naik.

Penguraian penyata — risiko teknikal sebenar

Bank Malaysia mengeksport penyata dalam susun atur PDF dan susunan lajur CSV yang tidak konsisten. Reka bentuk secara khusus untuk ini: corak adapter penghurai mengikut bank (satu modul penghurai kecil bagi setiap format bank), dengan fallback generik yang meminta pengguna memetakan lajur secara manual pada muat naik pertama jika format tidak dikenali. Jangan cuba membina satu penghurai sejagat yang mengendalikan setiap bank terlebih dahulu — tambah adapter apabila bank klien rintis sebenar ditemui.

Pengekstrakan OCR — jangan bina dari awal

Gunakan API OCR/dokumen-AI sedia ada (Google Document AI, AWS Textract, atau panggilan LLM multimodal dengan prompt output berstruktur) berbanding melatih atau membina penghuraian resit sendiri — ini masalah yang sudah diselesaikan dan masa pembangun solo lebih baik digunakan untuk logik padanan, iaitu pembeza sebenar. Anggap output OCR sebagai cadangan, bukan kebenaran mutlak: isi awal medan jumlah/tarikh/pembekal tetapi biarkan klien atau akauntan membetulkannya sebelum rekod digunakan untuk padanan, kerana jumlah yang salah dibaca boleh secara senyap menghasilkan padanan palsu atau jurang palsu.

Keselamatan, pemantauan, sandaran

B·3

Aliran kerja

Operasi teras: enjin padanan

flowchart TD
  A["Klien muat naik penyata bank"] --> B["Penghurai ekstrak transaksi
(tarikh, jumlah, keterangan)"] B --> C["Transaksi disimpan,
status: belum sepadan"] D["Klien muat naik gambar resit"] --> D1["OCR ekstrak jumlah, tarikh,
pembekal; cadangkan kategori"] D1 --> D2{"Klien/akauntan sahkan
data yang diekstrak betul?"} D2 -- "tidak, betulkan" --> D1 D2 -- "ya" --> E["Pemadan bandingkan resit disahkan
dengan transaksi belum sepadan"] C --> E E --> F{"Jumlah + jendela tarikh
+ persamaan teks
melebihi ambang?"} F -- "ya, keyakinan tinggi" --> G["Padan automatik,
transaksi ditandakan sepadan"] F -- "sempadan" --> H["Baris untuk pengesahan manual
oleh klien atau kakitangan HQ"] F -- "tiada padanan ditemui" --> I["Transaksi kekal belum sepadan,
muncul dalam senarai jurang"] H --> J{"Disahkan oleh pengguna?"} J -- "ya" --> G J -- "tidak / ditolak" --> I G --> K["% penyiapan dikira semula
untuk klien itu, bulan itu"] I --> K

Peranan & kebenaran pengguna

flowchart TD
  HQAdmin["hq_admin"] -->|urus| HQStaff["hq_staff"]
  HQAdmin -->|jemput &
keluarkan| Clients["akaun client_owner"] HQAdmin -->|lihat| AllDash["Semua papan pemuka klien"] HQStaff -->|lihat| AllDash HQStaff -->|semak| Ambiguous["Padanan samar,
mana-mana klien"] ClientOwner["client_owner"] -->|jemput| ClientStaff["client_staff"] ClientOwner -->|muat naik ke| OwnData["Penyata & resit sendiri sahaja"] ClientStaff -->|muat naik ke| OwnData

Langganan & pembayaran (andaian lalai: HQ bayar, mengikut tempat duduk)

flowchart TD
  A["HQ tandatangan perjanjian rintis
(5-10 tempat duduk klien)"] --> B["HQ masukkan kaedah pembayaran"] B --> C["Platform mengebil HQ setiap bulan,
mengikut tempat duduk klien aktif"] C --> D{"HQ tambah
lebih ramai klien?"} D -- "ya" --> E["Bilangan tempat duduk meningkat,
invois seterusnya mencerminkannya"] D -- "tidak" --> F["Caj bulanan tetap
diteruskan"] E --> G["HQ mengebil kliennya sendiri
secara berasingan
(di luar platform ini)"] F --> G

Aliran kerja pentadbiran — HQ mengejar klien yang ketinggalan

flowchart TD
  A["Tugas cron bulanan berjalan
pada 25hb"] --> B{"Klien di bawah
80% sepadan?"} B -- "tidak" --> C["Tiada tindakan diperlukan"] B -- "ya, ketinggalan" --> D["Peringatan e-mel automatik
dihantar kepada klien"] D --> E{"Klien muat naik
dalam 5 hari?"} E -- "ya" --> F["% dikira semula,
klien keluar daripada senarai ketinggalan"] E -- "tidak" --> G["Kakitangan HQ nampak klien ditanda
dalam papan pemuka mereka,
susuli secara terus"]
B·4

Reka bentuk Data & API

Gambar rajah Hubungan Entiti

erDiagram
  HQ_ACCOUNT ||--o{ HQ_USER : employs
  HQ_ACCOUNT ||--o{ CLIENT_ACCOUNT : manages
  CLIENT_ACCOUNT ||--o{ CLIENT_USER : employs
  CLIENT_ACCOUNT ||--o{ STATEMENT_UPLOAD : submits
  CLIENT_ACCOUNT ||--o{ TRANSACTION : has
  CLIENT_ACCOUNT ||--o{ RECEIPT : uploads
  STATEMENT_UPLOAD ||--o{ TRANSACTION : produces
  TRANSACTION ||--o| MATCH : "resolved by"
  RECEIPT ||--o| MATCH : "resolved by"
  CLIENT_ACCOUNT ||--o{ MONTHLY_SUMMARY : generates

  HQ_ACCOUNT {
    uuid id PK
    string name
    string billing_status
    int seat_count
  }
  HQ_USER {
    uuid id PK
    uuid hq_account_id FK
    string email
    string role
  }
  CLIENT_ACCOUNT {
    uuid id PK
    uuid hq_account_id FK
    string name
    string status
  }
  CLIENT_USER {
    uuid id PK
    uuid client_account_id FK
    string email
    string role
  }
  STATEMENT_UPLOAD {
    uuid id PK
    uuid client_account_id FK
    string file_url
    string bank_name
    string parse_status
    timestamp uploaded_at
  }
  TRANSACTION {
    uuid id PK
    uuid client_account_id FK
    uuid statement_upload_id FK
    date txn_date
    decimal amount
    string description
    string match_status
  }
  RECEIPT {
    uuid id PK
    uuid client_account_id FK
    string file_url
    decimal extracted_amount
    date extracted_date
    string extracted_vendor
    string suggested_category
    string ocr_confidence
    boolean confirmed_by_user
    timestamp uploaded_at
  }
  MATCH {
    uuid id PK
    uuid transaction_id FK
    uuid receipt_id FK
    string confidence
    string confirmed_by
    timestamp matched_at
  }
  MONTHLY_SUMMARY {
    uuid id PK
    uuid client_account_id FK
    string month
    int total_transactions
    int matched_transactions
    decimal completion_pct
  }
    

Model penyewaan

Dua peringkat, dikuatkuasakan dalam setiap pertanyaan: hq_account_id menetapkan skop akses kakitangan HQ merentasi semua klien mereka; client_account_id menetapkan skop pengguna klien kepada data sendiri sahaja. Setiap jadual di bawah peringkat akaun membawa kedua-dua kunci asing (secara terus atau melalui join) supaya pertanyaan tidak boleh secara tidak sengaja bocor merentasi akaun HQ atau merentasi klien dalam HQ yang sama.

Titik akhir API teras

Titik akhirPengesahanTujuan
POST /api/clients/invitehq_adminJemput sub-akaun klien baharu melalui e-mel
GET /api/hq/dashboardhq_admin, hq_staffMengembalikan semua klien dengan % penyiapan bulan semasa, disusun menaik
POST /api/statements/uploadclient_owner, client_staffMuat naik fail penyata bank; mencetuskan tugas penguraian async
POST /api/receipts/uploadclient_owner, client_staffMuat naik fail resit; mencetuskan tugas pengekstrakan OCR async
PATCH /api/receipts/:id/confirmclient_owner, client_staff, hq_staffSahkan atau betulkan jumlah/tarikh/pembekal/kategori yang diekstrak OCR; mencetuskan tugas padanan selepas disahkan
GET /api/clients/:id/gapshq_*, atau pengguna klien itu sendiriSenarai bernama transaksi belum sepadan bagi satu klien/bulan
POST /api/matches/:id/confirmhq_staff, client_ownerSahkan atau tolak padanan sempadan secara manual
GET /api/clients/:id/summaryhq_*, atau pengguna klien itu sendiriSejarah penyiapan bulanan bagi satu klien

Semua titik akhir memerlukan sesi yang ditetapkan skop sama ada hq_account_id atau client_account_id; permintaan merentasi penyewa mengembalikan 403, bukan hasil kosong yang ditapis, supaya pepijat kawalan akses gagal dengan jelas dan bukan secara senyap.

B·5

Perancangan UI/UX

Dua aplikasi berasingan berkongsi satu pangkalan kod, dikawal mengikut peranan semasa log masuk.

Papan pemuka penyeliaan HQ

  • Laman utama: satu jadual, semua klien, lajur: nama, % penyiapan, tarikh muat naik terakhir, anak panah trend. Disusun paling ketinggalan dahulu secara lalai.
  • Butiran klien: senarai jurang bernama bagi klien/bulan itu, sejarah muat naik.
  • Baris semakan: padanan sempadan dan pengekstrakan OCR berkeyakinan rendah menunggu pengesahan, merentasi semua klien.
  • Keadaan kosong (belum ada klien): satu tindakan "Jemput klien pertama anda," bukan papan pemuka penuh carta sifar.
  • Tetapan: bilangan tempat duduk/pengebilan, pengurusan pengguna kakitangan.

Aplikasi muat naik klien — UI dalam Bahasa Malaysia secara lalai

  • Laman utama: "X% lengkap bulan ini", senarai ringkas "apa yang tertinggal", dua butang besar — "Muat naik penyata bank", "Muat naik resit".
  • Aliran muat naik: seret-dan-lepas atau tangkap gambar, maklum balas OCR serta-merta ("dibaca: RM45.00, 12 Mac, Tesco — sahkan atau betulkan"), kemudian "12 transaksi dijumpai / 9 daripada 12 sepadan" selepas disahkan.
  • Sejarah: % penyiapan bulan-bulan lepas, kebanyakannya untuk ketenangan fikiran klien sendiri.
  • Keadaan kosong (log masuk pertama): "Akauntan anda meminta anda sambungkan penyata bank bulan ini" — bingkai sebagai permintaan firma, bukan onboarding SaaS generik.
  • Keadaan ralat (penyata tidak boleh dihurai): "Kami tidak dapat membaca fail ini secara automatik, anda boleh masukkan transaksi secara manual" — BM jelas, bukan jalan buntu.
  • Togol bahasa: pilihan Bahasa Inggeris wujud untuk minoriti yang lebih suka, boleh diakses tetapi bukan lalai.

Gaya visual

Minimal, profesional, padat data tetapi tidak bersepah — lebih hampir dengan alat kewangan/operasi berbanding aplikasi pengguna, kerana pangkalan pengguna utama (kakitangan firma akauntan) menghabiskan sepanjang hari dalam antara muka seperti hamparan dan akan menilai kredibiliti sebahagiannya berdasarkan betapa "serius" alat itu kelihatan. Responsif ke mudah alih khusus untuk aliran muat naik sisi klien, kerana pemilik SME sering mengendalikan ini daripada telefon.

Keputusan bahasa produk — keputusan sebenar, bukan togol untuk ditangguhkan

Aplikasi muat naik klien lalai kepada Bahasa Malaysia, bukan Bahasa Inggeris, kerana pengguna akhir sebenar produk ini — pemilik SME, jurubuku, dan kakitangan pentadbiran di klien firma — kebanyakannya penutur BM dalam urusan harian perniagaan. Setiap label, mesej ralat, e-mel/WhatsApp peringatan, dan teks keadaan kosong dalam aplikasi berhadapan klien dihantar dalam BM dahulu. Togol Bahasa Inggeris boleh wujud untuk minoriti klien yang lebih suka, tetapi ia bukan lalai dan bukan tempat usaha reka bentuk diberi keutamaan.

Papan pemuka penyeliaan HQ kekal dalam Bahasa Inggeris yang jelas secara lalai — rakan kongsi dan kakitangan firma akauntan yang menyemak jadual pelbagai klien selesa dengan alat B2B Bahasa Inggeris, dan Bahasa Inggeris juga bahasa pelan ini ditulis untuk pengasas. Togol BM untuk kakitangan HQ adalah tambahan P1 yang munasabah, bukan keperluan pelancaran.

Ini keputusan produk langsung, bukan "nice-to-have": menghantar aplikasi klien dalam Bahasa Inggeris dahulu dan "menambah BM kemudian" berisiko kepada masalah kepercayaan dan penerimaan yang sama seperti ditandakan dalam B·7 — klien yang tidak faham sepenuhnya apa yang diminta untuk dimuat naik kurang berkemungkinan membina tabiat menangkap gambar resit setiap hari yang produk ini bergantung padanya.

B·6

Pelan pembangunan

FasaObjektifHasil utamaKriteria penyiapan
1
~3 mgg
Buktikan penguraian penyata berfungsi pada data sebenar Aliran muat naik, adapter penghurai untuk 2–3 format bank sebenar daripada klien sebenar firma rintis, transaksi disimpan dalam DB Penyata bank sebenar daripada klien rintis yang sanggup berjaya diuraikan kepada senarai transaksi yang betul
2
~4 mgg
Pengekstrakan OCR + enjin padanan + senarai jurang Muat naik resit, pengekstrakan OCR (jumlah/tarikh/pembekal melalui API pihak ketiga) dengan langkah sahkan-atau-betulkan, logik padanan terhadap transaksi, baris pengesahan manual, senarai jurang bagi setiap klien Satu set resit sebenar diekstrak OCR dengan cukup tepat sehingga hanya memerlukan pembetulan ringan, dan dipadankan dengan betul dengan kebanyakan transaksi; senarai jurang tepat apabila disemak secara manual
3
~2 mgg
Papan pemuka HQ + penyewaan Jadual pelbagai klien disusun mengikut % penyiapan, akses berasaskan peranan, aliran jemputan HQ → klien Satu akaun HQ dengan 2+ sub-akaun klien sebenar, diasingkan dengan betul antara satu sama lain
4
~2 mgg
Peringatan + pelancaran rintis E-mel peringatan cron bulanan, pengebilan asas (invois manual memadai pada peringkat ini, tiada get laluan pembayaran diperlukan lagi) Satu firma akauntan sebenar menjalankan rintis 5–10 klien untuk satu bulan penuh dari hujung ke hujung

Sengaja tidak termasuk dalam pelan ini: integrasi MyInvois, peringatan WhatsApp, cadangan kategori AI, pemformatan lejar/eksport, dan skala kepada 200 klien — semuanya ditangguhkan sehingga rintis membuktikan logik OCR-dan-padanan teras berfungsi pada data bank dan resit Malaysia sebenar, iaitu ketidakpastian terbesar.

B·7

Pelaksanaan selari pengasas & pengesahan

PeringkatPengasas teknikalPengasas komersial
PenemuanSahkan kebolehlaksanaan penguraian penyata pada 2-3 sampel format bankDapatkan satu rakan kongsi firma akauntan bersetuju untuk perbincangan rintis — pitching kepada firma, bukan klien SME individu, kerana HQ yang mewajibkan penerimaan
PerancanganKunci skop P0 (penyata bank + padanan resit + papan pemuka HQ sahaja)Sahkan andaian model pengebilan secara terus dengan firma itu: adakah mereka bayar mengikut tempat duduk dan mengebil klien secara berasingan, atau jangkakan sesuatu yang lain?
PembangunanBina Fasa 1–4 di atasDapatkan 5–10 klien sebenar daripada firma rintis yang sanggup memuat naik data kewangan sensitif kepada vendor baharu — jurang kepercayaan ini adalah halangan jualan sebenar, tangani secara langsung (postur keselamatan, pengendalian data) berbanding abaikan
PengujianBetulkan isu penghurai/padanan yang didedahkan oleh data rintis sebenarKumpul maklum balas sama ada senarai jurang sebenarnya boleh bertindak untuk kakitangan firma
PelancaranLancarkan, pantau tugas cron peringatan bulanan, selenggara secara soloKembangkan bilangan tempat duduk firma rintis; gunakannya sebagai rujukan untuk 2–3 firma seterusnya

Andaian komersial yang mesti disahkan sebelum — atau sangat awal dalam — pembangunan