Full-Stack
🧾 Machhapuchhre ERP System
Nepal-compliant cloud ERP: double-entry ledger, VAT/TDS tax engine, and BS↔AD fiscal calendar in one modular monolith.
JavaSpring Boot 3PostgreSQLFlywayThymeleafJWTREST APIs
The Problem
The accounting firm I worked with was still running client books on Oracle Forms 6i — a brittle, desktop-bound system with a UI two decades old. It couldn't keep pace with Nepal's Finance Act, which revises VAT and TDS rates every fiscal year, had no path to the Inland Revenue Department's CBMS/VCTS e-invoicing mandate, and offered no way to safely extend it without risking the one thing that can't be wrong: the ledger.The Solution
Rebuilt it as a Spring Boot 3 modular monolith that keeps the legacy double-entry ledger and BS↔AD Nepali-calendar tables as the system of record, but replaces everything hardcoded around them. Every VAT/TDS rate is an effective-dated row resolved at transaction date, never a constant, so a Finance Act change doesn't need a redeploy. Every module posts through a single LedgerPostingService chokepoint — enforced by an ArchUnit build rule so no module can write the ledger directly — which is where balanced-entry assertion, fiscal-period locking and the audit trail all live. Added a multi-company bill-ingestion pipeline (SHA-256 dedup, per-row validation, a quarantine + correction workbench for bad rows), a durable DB-queued sync to the government's CBMS/VCTS gateway, and payroll/SSF on top.The Impact
An auditable accounting core that survives an annual statutory rate change without touching code, a ledger that can't be corrupted by a careless module because the architecture won't let it compile that way, and a real migration path off Oracle Forms for small Nepali businesses — compliant from as little as 10 lakh annual turnover — onto a modern, testable, government-integrated stack.Migrated from a legacy Oracle Forms 6i accounting system used by a Nepali accounting practice, keeping the proven double-entry table vocabulary (comp_code, sldg_code, voucher_no, dr_cr_flag) while rebuilding everything around it on Spring Boot 3.
- Ledger & vouchers — journal/cash/bank/contra vouchers post through one enforced chokepoint; no module writes the ledger table directly.
- Statutory tax engine — VAT, TDS and fiscal-year rules are effective-dated data, resolved per transaction, tracking Nepal's annual Finance Act changes.
- BS↔AD fiscal calendar — auto-detects the current Nepali fiscal year (Shrawan–Ashad) from today's Gregorian date.
- Government e-invoicing — CBMS/VCTS sync via a durable DB-backed queue, retriable without a message broker.
- Ingestion pipeline — multi-company bill ingestion with SHA-256 dedup, validation, and a quarantine/correction workbench for bad rows.
- Inventory, payroll/SSF and treasury modules extend the same ledger core.
Stack: Java 17, Spring Boot 3.3, PostgreSQL + Flyway, Thymeleaf SSR with JWT-secured REST APIs, ArchUnit for architectural enforcement.