尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证PajakWajar — platform pra-lapor pajak: cek kelayakan skema sebelum menghitung. ITechno Cup 2026.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
PajakWajar Cek dulu skemanya, baru hitung pajaknya. Submission for ITECHNO CUP 2026 - Web Development Pekerja mandiri perlu memahami cara menghitung pajak yang sesuai dengan kondisi pekerjaannya sebelum menyiapkan laporan tahunan. Istilah perpajakan, pilihan skema, dan pertanyaan tentang riwayat pelaporan dapat terasa rumit bagi pengguna yang belum terbiasa. PajakWajar dikembangkan sebagai platform web pra-lapor untuk membantu pekerja lepas, kreator konten, dan pelaku usaha mikro di Indonesia memahami proses tersebut melalui pertanyaan sederhana.查看完整 README ↗
Submission for ITECHNO CUP 2026 - Web Development
By AkuSukaProject
| Nama | Peran | GitHub |
|---|---|---|
| Sheva Ramadhan | Rule Engine & Kalkulator | @Shevaramadhan |
| Mikail Samyth Habibillah | Frontend & Antarmuka Pengguna | @samythh |
| Muhammad Habib | Integrasi, OCR & Dokumentasi | @muhammadhabib16 |
Pekerja mandiri perlu memahami cara menghitung pajak yang sesuai dengan kondisi pekerjaannya sebelum menyiapkan laporan tahunan. Istilah perpajakan, pilihan skema, dan pertanyaan tentang riwayat pelaporan dapat terasa rumit bagi pengguna yang belum terbiasa.
PajakWajar dikembangkan sebagai platform web pra-lapor untuk membantu pekerja lepas, kreator konten, dan pelaku usaha mikro di Indonesia memahami proses tersebut melalui pertanyaan sederhana.
PajakWajar bekerja dengan urutan kelayakan → perhitungan → konsekuensi → berkas. Pengguna mengisi profil, melihat skema mana yang sah dipakai beserta pasal yang mendasarinya, lalu melihat perkiraan pajak hanya untuk skema yang memang berhak, dan menyimpannya sebagai kertas kerja PDF.
Seluruh keputusan kelayakan dan seluruh perhitungan lahir dari aturan yang ditulis eksplisit di data/klu_rules.json. Tidak ada model bahasa yang ikut memutuskan hak hukum atau menghitung angka. AI dipakai pada tepat satu titik, yaitu membaca foto bukti potong menjadi angka terstruktur, dengan persetujuan eksplisit pengguna dan mode ketik manual yang selalu tersedia.
Repositori utama: samythh/Pajak-Wajar. Nama tim tetap AkuSukaProject. Panduan pengumpulan karya.
Status saat ini: demo publik tersedia di pajak-wajar.vercel.app, dari repo pribadi
samythh/Pajak-Wajar. Tim tetap AkuSukaProject. Formulir, kalkulator, PDF, dan OCR dengan bukti potong contoh sudah diuji. Kasus pajak keluarga, riwayat final 2025, multi-kegiatan, serta peralihan tertentu masih memerlukan pemeriksaan tambahan; sistem menahan nominal yang belum dapat dipastikan. Ini alat bantu, bukan nasihat pajak.
| Fitur | Deskripsi | Keunggulan |
|---|---|---|
| Uji kelayakan di hulu | Empat saringan menguji hak pengguna sebelum satu angka pun dihitung: pekerjaan bebas, ambang peredaran bruto gabungan, pintu satu arah tarif umum, serta pemberitahuan dan ambang Norma. | Menjawab pertanyaan yang dilewati kalkulator lain: skema mana yang sah untuk saya? |
| Kartu hasil tiga status | BOLEH, TIDAK_BOLEH, dan PERLU_DIPASTIKAN untuk tiga skema, lengkap dengan alasan per syarat. | Skema yang tidak boleh tetap ditampilkan dalam keadaan diredam, bukan disembunyikan. |
| Setiap vonis bersitasi | Tiap kartu memuat nama regulasi, nomor pasal dan ayat, fungsi kutipan, serta tautan ke JDIH Kemenkeu atau pajak.go.id. | Rujukan yang belum tuntas diperiksa ditandai “masih diperiksa”, bukan disamarkan. |
| Perhitungan tiga skema | PPh Final 0,5%, Norma NPPN, dan tarif umum Pasal 17 dengan tarif progresif berlapis dan kredit bukti potong. | Panel “Lihat cara menghitungnya” memperlihatkan tiap lapisan tarif, bukan hanya hasil akhir. |
| Perhitungan menolak menebak | Nominal tidak ditampilkan bila haknya belum pasti, bila pengguna punya lebih dari satu kegiatan (Norma), atau bila biaya usaha belum diisi (tarif umum). | Biaya usaha yang dikosongkan tidak pernah dianggap Rp0 karena akan melambungkan pajak. |
| Pilihan “Tidak yakin” | Setara dengan pilihan lain pada setiap pertanyaan riwayat. | Jawaban tidak pasti menghasilkan PERLU_DIPASTIKAN beserta langkah untuk memastikannya, bukan tebakan. |
| Bukti potong manual dan OCR | Ketik manual sebagai jalur utama; pembacaan foto opsional dan hanya berjalan setelah persetujuan dicentang. | Hasil OCR masuk ke kolom yang sama dengan isian manual sehingga wajib ditinjau pengguna. |
| Kertas kerja PDF | Ringkasan vonis, sitasi, dan rincian perhitungan dalam satu berkas. | Dirakit di peramban; angka finansial tidak dikirim ke server. |
| Tanpa akun | Langsung dipakai; jawaban hidup di state peramban. | Tidak ada registrasi, tidak ada basis data. |
auditPajakMandiri.npm run test:ocr dengan GEMINI_API_KEY sungguhan.Buka PajakWajar atau langsung cek kelayakan. Deployment terhubung ke main pada repo pribadi samythh/Pajak-Wajar; repo organisasi tetap menjadi repositori tim. Lihat panduan deployment dan skenario demo.
Screenshot berikut diambil dari build produksi lokal pada 5 September 2026 memakai data fiktif. Angka pada gambar dihasilkan mesin aturan yang sama dengan yang dipakai pengguna, bukan data mock.
Unduh rekaman demo aplikasi. Rekaman tanpa narasi ini menelusuri keenam langkah untuk pedagang daring yang punya dua kegiatan usaha dan menikah dengan pasangan tanpa penghasilan: pengisian omzet, penambahan kegiatan kedua, penjelasan istilah yang muncul saat ditunjuk, lalu halaman hasil dengan rincian Norma yang dihitung per kegiatan. Skenario narasi tersedia untuk presentasi tim, termasuk bagian bukti potong dan unduhan PDF yang tidak masuk rekaman ini.
Contoh keluaran kertas kerja tersedia sebagai berkas: contoh-kertas-kerja.pdf.
Skenario presentasi dan panduan menjalankan demo tersedia untuk persiapan video submission akhir.
Framework : Next.js 15.5.23 (App Router), React 19
Language : TypeScript
Styling : Tailwind CSS 3, CSS khusus proyek
State Mgmt : React useState
Validation : Zod (profil, bukti potong, dan jawaban OCR)
Form Library : tidak dipakai; validasi berjalan di batas orkestrator `auditPajakMandiri`
PDF : @react-pdf/renderer (kertas kerja dirakit di peramban, dimuat saat tombol ditekan)
Runtime : Node.js untuk menjalankan Next.js
API : POST /api/ocr-bupot (satu-satunya endpoint; perantara kunci API)
Database : Tidak digunakan
ORM : Tidak digunakan
Auth : Tidak digunakan; akses tanpa akun
OCR : Gemini API, structured JSON, temperature 0; opsional dan butuh persetujuan
Package Mgmt : npm dengan package-lock.json
Deployment : Vercel (region sin1), https://pajak-wajar.vercel.app/
CI/CD : GitHub Actions (lint, tipe, tes, build, audit) dan deployment Vercel
Testing : Vitest; 248 tes rutin pada 14 berkas. Ajv 2020 untuk integritas data aturan
Type Check : TypeScript (tsc --noEmit), tanpa `any`
Monitoring : Belum dikonfigurasi
| Teknologi | Peruntukan dalam Proyek |
|---|---|
| Next.js & React | Menyediakan routing halaman dan komponen interaktif untuk alur pemeriksaan. |
| TypeScript | Mendefinisikan kontrak profil, skema pajak, dan hasil yang dipakai bersama antar-modul. |
| Tailwind CSS | Menyusun tampilan responsif dengan warna, tipografi, dan komponen khusus PajakWajar. |
| Zod | Memvalidasi profil, bukti potong, dan jawaban layanan OCR sebelum satu pun aturan dievaluasi. |
| Vitest | Menguji kelayakan dan perhitungan terpisah dari antarmuka; 80 kasus. |
| Ajv (Draft 2020-12) | Menjaga bentuk data/klu_rules.json dengan additionalProperties: false agar regulasi tidak berubah diam-diam. |
| @react-pdf/renderer | Merakit kertas kerja di peramban agar angka finansial tidak perlu dikirim ke server. |
| Gemini API | Hanya membaca foto bukti potong menjadi angka terstruktur; tidak menyentuh keputusan hukum atau perhitungan. |
Cuplikan versi yang dideklarasikan di package.json:
{
"dependencies": {
"@react-pdf/renderer": "^4.1.5",
"next": "15.5.23",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"zod": "^3.24.1"
}
}
Garis penuh berjalan di peramban. Hanya kotak bergaris putus-putus yang meninggalkan perangkat pengguna.
flowchart TD
A[Pengguna] --> C[Formulir enam langkah]
C --> D[Profil dalam state peramban]
J[Bukti potong manual] --> D
D --> V[Validasi Zod]
V --> O[auditPajakMandiri]
R[data/klu_rules.json] --> RG[regulasi.ts]
RG --> F[eligibility.ts: empat saringan]
F --> O
O --> G[calculator.ts: fungsi murni]
G --> O
O --> E[Kartu vonis + perkiraan + sitasi]
E --> I[Kertas kerja PDF]
K[Foto + persetujuan eksplisit] -.-> L["/api/ocr-bupot"]
L -.-> M[Gemini API]
M -.-> J
Profil hanya berada dalam state React dan tidak dipersistenkan; memuat ulang halaman menghapus jawaban. Satu-satunya data yang keluar dari perangkat adalah foto bukti potong, dan hanya setelah pengguna mencentang persetujuan. Rinciannya di docs/ARSITEKTUR.md.
Proyek tidak menggunakan basis data. Struktur utamanya adalah:
| Berkas / Tipe | Isi |
|---|---|
ProfilWajibPajak | Tahun pajak, KLU, wilayah, PTKP, bentuk kegiatan, status pasangan, dua himpunan omzet, dan jawaban kepatuhan. |
KreditPajakItem | Bukti potong, terpisah dari profil agar OCR tidak mencampuri data profil. |
HasilSkema | Union terdiskriminasi: status kelayakan, syarat, sitasi, status kalkulasi, dan rincian bertipe per skema. |
data/klu_rules.json | Seluruh parameter, aturan kelayakan, sitasi, dan daftar KLU. Satu-satunya sumber regulasi. |
data/klu_rules.schema.json | Kontrak bentuk berkas di atas, JSON Schema Draft 2020-12, diuji dengan Ajv. |
Kontrak TypeScript ada di src/types/pajak.ts. Dua himpunan omzet tidak boleh dicampur: omzetPribadiTahunPajak untuk perhitungan, dan omzet tahun sebelumnya (pribadi + pasangan + perseroan perorangan) hanya untuk uji ambang Rp4,8 miliar.
Pajak-Wajar/
├── data/
│ ├── klu_rules.json # Parameter, aturan kelayakan, sitasi, daftar KLU
│ └── klu_rules.schema.json # Kontrak bentuk berkas di atas (Draft 2020-12)
├── docs/
│ ├── ARSITEKTUR.md # Batas modul, dua himpunan omzet, privasi
│ ├── REGULASI.md # Register pasal + koreksi dokumen internal
│ ├── DEPLOYMENT.md # Langkah ke Vercel dan variabel lingkungan
│ ├── TESTING.md # Laporan pemeriksaan
│ ├── DEMO.md # Skenario presentasi dan pertanyaan juri
│ ├── sumber/ # Salinan teks regulasi untuk jejak audit
│ ├── demo/ # Rekaman demo dan contoh kertas kerja
│ └── screenshots/
├── src/
│ ├── app/
│ │ ├── page.tsx # Landing page
│ │ ├── cek-kelayakan/ # Halaman formulir
│ │ └── api/ocr-bupot/ # Perantara OCR, kunci API tidak ke peramban
│ ├── components/
│ │ ├── eligibility/ # Formulir, kartu vonis, input bukti potong
│ │ └── berkas/ # Kertas kerja PDF
│ ├── lib/
│ │ ├── regulasi.ts # Pemuat bertipe untuk data aturan
│ │ ├── eligibility.ts # Empat saringan kelayakan
│ │ ├── calculator.ts # Matematika murni
│ │ ├── index.ts # Orkestrator auditPajakMandiri
│ │ ├── schemas.ts # Skema Zod
│ │ ├── ocr.ts # Klien OCR dengan gerbang persetujuan
│ │ └── format.ts # Pembantu tampilan
│ ├── mock/ # Profil contoh untuk demo dan tangkapan layar
│ └── types/ # Kontrak tipe domain
├── tests/ # 248 tes: schema, calculator, eligibility, audit, keluarga, istilah, ocr, format
│ └── fixtures/ # Lembar bukti potong contoh untuk uji OCR
├── vitest.config.ts
├── vercel.json
├── eslint.config.mjs
├── LICENSE
├── .env.example
├── package.json
└── README.md
Dokumentasi pendukung: Arsitektur, Desain UI, Regulasi, Deployment, Pemeriksaan, Riset regulasi, dan Rencana Implementasi.
Riwayat koreksi regulasi ada di docs/REGULASI.md. Bagian I angka 3 pada catatan riset sudah diperbaiki agar mengacu ke Pasal 57 ayat (2) huruf a, ayat (3), dan ayat (4). Penyatuan engine tim dan produksi dijelaskan di laporan integrasi.
git clone https://github.com/samythh/Pajak-Wajar.git
cd Pajak-Wajar
npm ci
Perintah ini memasang dependensi sesuai package-lock.json.
Aplikasi berjalan penuh tanpa file environment; hanya pembacaan foto bukti potong yang membutuhkannya. Untuk mengaktifkannya, salin .env.example menjadi .env.local.
PowerShell:
Copy-Item .env.example .env.local
macOS / Linux:
cp .env.example .env.local
Isi contoh:
# Hanya diperlukan bila pembacaan foto bukti potong (OCR) diaktifkan.
GEMINI_API_KEY=
# Opsional. Bawaan: gemini-3.6-flash
GEMINI_MODEL=
Tanpa kunci ini, /api/ocr-bupot menjawab 503 dan antarmuka mengarahkan pengguna mengetik angkanya manual. Kunci rahasia tidak boleh memakai awalan NEXT_PUBLIC_ atau dimasukkan ke repositori.
Tidak diperlukan. Proyek tidak menggunakan database, migrasi, atau seed.
npm run dev
Buka http://localhost:3000.
# Development mode
npm run dev
# Production build dan server
npm run build
npm run start
# Menjalankan daftar pengujian
npm test
# Memeriksa tipe TypeScript
npx tsc --noEmit
Jalankan npm run lint untuk memeriksa aturan Next.js, React, dan TypeScript melalui ESLint. Perintah npm run typecheck tersedia untuk pemeriksaan tipe.
Bila sebuah skema berstatus PERLU DICEK DULU, nominalnya sengaja tidak ditampilkan. Selesaikan dulu bagian yang perlu dipastikan, lalu ulangi.
Tidak ada akun atau panel admin. Pengembangan data aturan dilakukan melalui berkas dalam data/ dan dokumentasi regulasi dalam docs/.
| Metode | Path | Fungsi |
|---|---|---|
GET | / | Halaman utama. |
GET | /cek-kelayakan | Formulir dan hasil pemeriksaan. |
POST | /api/ocr-bupot | Membaca foto bukti potong menjadi angka terstruktur. |
POST /api/ocr-bupot menerima { persetujuan: true, mimeType, dataBase64 } dan mengembalikan { nomorBuktiPotong, pemotong, tanggal, penghasilanBruto, pphDipotong }. Route menolak permintaan tanpa persetujuan (403), jenis berkas di luar JPG/PNG/WebP (415), berkas terlalu besar (413), dan menjawab 503 bila GEMINI_API_KEY tidak diisi. Setiap jawaban divalidasi ulang dengan Zod sebelum dikirim ke peramban. Foto tidak ditulis ke penyimpanan mana pun.
| Modul | Kontrak | Peran |
|---|---|---|
lib/index.ts | auditPajakMandiri(input): HasilAuditPajak | Orkestrator: validasi, kelayakan, lalu perhitungan untuk skema yang berhak. |
lib/eligibility.ts | periksaKelayakan(profil), agregasiPrioritas(syarat), hitungOmzetKonsolidasi(profil) | Empat saringan kelayakan. Tidak menghitung nominal apa pun. |
lib/calculator.ts | hitungPphFinal, hitungNppn, hitungTarifUmum, hitungTarifProgresifBerlapis | Fungsi murni; menerima parameter regulasi sebagai argumen. Tidak menilai hukum. |
lib/regulasi.ts | basisAturan, cariKlu, daftarKlu, persenNorma | Pemuat bertipe untuk data/klu_rules.json. |
lib/schemas.ts | profilWajibPajakSchema, inputAuditPajakSchema, hasilBupotOcrSchema | Validasi masukan dan jawaban OCR. |
lib/ocr.ts | bacaBupotDenganPersetujuan(file, setuju, signal) | Melempar GalatPersetujuan bila persetujuan belum diberikan. |
Pemeriksaan penuh berjalan di peramban; ini bukan request ke server:
import { auditPajakMandiri } from '@/lib';
const hasil = auditPajakMandiri({
profil: {
tahunPajak: 2026,
kluKode: '90002', // kreator konten
wilayah: 'kelompok1',
statusPtkp: 'TK/0',
bentukKegiatan: 'PEKERJAAN_BEBAS',
statusPerpajakanPasangan: 'TIDAK_ADA_PASANGAN',
punyaLebihDariSatuKegiatan: false,
omzetPribadiTahunPajak: 420_000_000, // dasar PERHITUNGAN
biayaOperasionalRiil: 95_000_000,
omzetPribadiThnSebelumnya: 310_000_000, // dasar UJI AMBANG
omzetPasanganThnSebelumnya: 0,
omzetSeluruhPerseroanPeroranganThnSebelumnya: 0,
sudahMemberitahukanNppn: true,
pernahPilihTarifUmum: false,
jugaPegawaiTetap: false,
pernahMelewatiAmbang: false
},
kreditPajak: []
});
for (const skema of hasil.skema) {
console.log(skema.id, skema.statusKelayakan, skema.statusKalkulasi);
}
// PPH_FINAL_05 TIDAK_BOLEH TIDAK_RELEVAN ← Pasal 56 ayat (4) huruf b
// NPPN BOLEH TERSEDIA
// TARIF_UMUM BOLEH TERSEDIA
statusKalkulasi adalah union terdiskriminasi: hanya TERSEDIA yang membawa pajakTerutang dan rincianKalkulasi, sehingga nominal mustahil muncul pada skema yang haknya belum pasti.
# Menjalankan Vitest satu kali
npm test
# Mode watch selama pengembangan
npm run test:watch
# Pemeriksaan tipe
npx tsc --noEmit
# Memeriksa build produksi
npm run build
248 tes rutin pada empat belas berkas, ditambah satu tes integrasi OCR opsional:
| Berkas | Tes | Fokus |
|---|---|---|
| tests/schema.test.ts | 11 | Integritas data/klu_rules.json lewat Ajv Draft 2020-12; domain sumber primer; larangan menyitasi Pasal 59 yang sudah dihapus; persentase Norma ke-22 KLU dikunci pada fixture Lampiran I. |
| tests/klasifikasi.test.ts | 13 | Padanan 22 kegiatan ke KBLI 2020, perubahan dan pemecahan kode, batas alias kegiatan, serta pencegahan pemberian Norma otomatis untuk kode yang belum didukung. |
| tests/calculator.test.ts | 14 | Tarif progresif berlapis, termasuk bukti bahwa PKP Rp337 juta ≠ PKP × 25% dan kecocokan dengan contoh resmi UU HPP (PKP Rp6 miliar → Rp1.794.000.000). |
| tests/eligibility.test.ts | 32 | Agregasi prioritas dan empat saringan kelayakan. |
| tests/audit-pajak.test.ts | 17 | Konsistensi status kalkulasi dan batasan perhitungan. |
| tests/kegiatan.test.ts | 17 | Norma untuk lebih dari satu kegiatan: neto dihitung per kegiatan memakai persentasenya sendiri lalu dijumlahkan (PER-17/PJ/2015 Pasal 5), dengan penjaga bahwa hasilnya berbeda dari cara keliru mengalikan omzet gabungan dengan satu persentase; ambang Norma dan dasar tarif umum memakai omzet seluruh kegiatan; kegiatan yang belum dirinci tetap ditahan; jawaban yang bertentangan ditolak Zod; vonis dinyatakan berlaku atas kegiatan utama saja. |
| tests/istilah.test.ts | 6 | Mutu kamus istilah sebagai teks antarmuka: tiap entri terisi, ringkas agar muat di popover, judulnya unik, dan tidak menyitasi pasal — dasar hukum hanya boleh datang dari mesin aturan. |
Pemeriksaan ulang 6 September 2026 mencakup lint, tipe, build produksi, regresi pembulatan PKP dan gaji, input ganda, browser mobile/desktop, serta PDF. Rinciannya di laporan pemeriksaan.
Persentase coverage belum diukur. Script E2E dan coverage belum dikonfigurasi sebagai perintah npm.
npm audit melaporkan 0 kerentanan setelah pembaruan Vitest dan dependensi transitif PostCSS serta sharp. Versi terkunci di package-lock.json; gunakan npm ci untuk instalasi yang sama.
Proyek ini dilisensikan di bawah MIT License. Hak cipta © 2026 AkuSukaProject.
PajakWajar adalah alat bantu pra-lapor, bukan nasihat pajak. Verifikasi hasil dan ketentuan yang berlaku melalui Direktorat Jenderal Pajak sebelum digunakan untuk pelaporan.
Made with ❤️ by AkuSukaProject for ITECHNO CUP 2026
PH/MT menghitung pajak dari neto gabungan dan PTKP K/I, lalu menampilkan bagian pajak Anda beserta porsi dan pajak keluarga sebelum pembagian. Kredit pajak milik Anda dikurangkan setelah pembagian; gaji pasangan satu pemberi kerja tetap digabung pada PH/MT.
Pada langkah bukti potong tersedia catatan bunga deposito/tabungan biasa, penjualan saham bursa Indonesia nonpendiri, dan dividen dalam negeri. Pajak final serta bagian bukan objek ditampilkan terpisah dari pajak usaha dan ikut disertakan pada PDF. Semua hasil bersumber dari parameter terverifikasi, dengan rincian verifikasi dan contoh angka. Kondisi khusus atau jawaban belum pasti tetap memerlukan pemeriksaan.
| tests/keluarga.test.ts | 41 | Perhitungan keluarga: pasangan tanpa penghasilan; penggabungan neto pasangan menurut UU PPh Pasal 8 ayat (1) berikut tambahan PTKP PMK 101/PMK.010/2016 Pasal 1 huruf c; pengecualian gaji dari satu pemberi kerja yang sudah dipotong PPh 21; matriks lengkap status pelaporan × jawaban penghasilan pasangan dengan jaminan tiap keadaan yang ditahan menyebut alasannya sendiri; kasus dokter multi-sumber; pembagian PH/MT sebelum kredit dan jumlah kedua bagian yang konsisten. |
| tests/saran.test.ts | 7 | Saran kontekstual, perbandingan sebelum kredit, nilai sama, serta data keluarga atau Norma yang belum pasti. |
| tests/schemas.test.ts | 15 | Kontrak masukan formulir dan bukti potong. |
| tests/audit-regression.test.ts | 15 | Pembulatan PKP, gaji, kelebihan kredit, duplikasi bukti potong, batas pajak keluarga dan riwayat 2025/2026. |
| tests/format.test.ts | 13 | Pemisah ribuan pada isian nominal, termasuk jaminan titik tidak bocor ke perhitungan. |
| tests/investasi.test.ts | 24 | Deposito, saham, dividen penuh/sebagian, pengecualian, pemisahan kredit, bukti ganda, dan parameter dalam review. |
| tests/ocr.test.ts | 23 (+1 opsional) | Gerbang persetujuan, batas berkas, dan seluruh kode galat route OCR. Tes nyata dijalankan khusus dengan npm run test:ocr dan GEMINI_API_KEY; npm test tidak mengirim gambar. |