Micro and small enterprises in India wait far too long to be paid. The MSMED Act, 2006 gives them statutory weapons — section 15 requires buyers to pay within an agreed period not exceeding 45 days from acceptance, and section 16 makes late buyers liable to compound interest with monthly rests at three times the RBI-notified bank rate — yet an individual supplier still tracks invoices in Excel, computes interest by hand and argues over tampered-looking printouts when a dispute reaches the MSEFC (filed through the MSME Samadhaan / MSME ODR portals).
This project builds a tamper-evident invoice and payment-event ledger in Node.js for that fight. Every business event — invoice issued, delivery, objection, acceptance (actual or deemed), payment, dispute, MSEFC referral — is appended with a SHA-256 hash chained to the previous event, so any later edit breaks the chain and the verifier flags it. A daily anchor root hash, exported and preserved outside the system (printed register, e-mail, or a public service), proves the ledger state existed on a given day. A statutory-clock module implements deemed acceptance (the 15-day written-objection window), the 45-day due date and the section 16 interest calculation; a dispute state machine mirrors the Samadhaan workflow; and a React dashboard shows ageing, interest statements, defaulter rankings and chain-integrity status.
No cryptocurrency, tokens or consensus network are involved — the ledger borrows blockchain's tamper-evidence without pretending two parties will run nodes. The stack is IGNOU-approved and the design stores no government ID numbers.
Team: 1 (2 only with prior written approval for ≥ 1 person-year effort)
15–20-page proposal (DFD, ER, PERT/Gantt, schema, security); 100–125-page report excluding code; must include software development. Prohibited: dBASE/FoxPro/MS-Access, VB + Access, C/C++ for information systems
When a micro or small supplier chases a delayed payment, three things repeatedly go wrong. First, the record-keeping: invoices, delivery proofs and payment entries live in editable spreadsheets, so the buyer can allege manipulation and the supplier cannot prove otherwise. Second, the arithmetic: deemed acceptance (the 15-day written-objection rule), the 45-day due date and section 16's compound interest with monthly rests at three times the RBI bank rate are consistently miscalculated by hand, weakening legitimate claims. Third, the escalation path: the MSME Samadhaan/ODR workflow has clear stages — application, buyer response, MSEFC conciliation, arbitration — but the supplier has no tool that tracks an invoice through those states. What is needed is a small, verifiable system in which every invoice event is appended to a hash-linked ledger that any later tampering would break, the statutory clock and interest are computed automatically and reproducibly, and disputes are tracked as first-class states all the way to MSEFC referral.
Synopsis
Abstract
Delayed payments are the single biggest working-capital complaint of Indian MSMEs. The MSMED Act, 2006 answers them with a 45-day payment rule (section 15), compound interest with monthly rests at three times the bank rate (section 16) and a facilitation-council remedy (section 18) now filed online through the MSME Samadhaan portal, with new applications moving to the MSME ODR portal. But when a supplier reaches that forum, the evidence is usually a set of Excel sheets and e-mails that a buyer can easily contest. This project delivers a Node.js event ledger that records every invoice, acceptance and payment as a hash-linked, append-only event, automates the statutory clock and interest computation, and exports court-ready statements — making the supplier's record tamper-evident by construction.
Introduction
Section 2 of the MSMED Act defines acceptance, including deemed acceptance when the buyer files no written objection within 15 days of delivery; section 15 then fixes the payment deadline; section 16 fixes the interest. These are date-driven rules — perfect for software — yet most small suppliers apply them with a calculator. At the same time, examiners and employers keep asking what "blockchain" actually contributes to a business application beyond the buzzword. This project answers both: it uses the core cryptographic idea (a hash chain over an append-only log, with periodic root anchoring) where it genuinely helps — proving a record was not edited after the fact — and it refuses where it does not (no token, no distributed consensus for a one-party ledger).
Existing system vs proposed system
Excel registers / Tally exports / e-mail threads: mutable, unversioned, no proof of when an entry was made; interest computed by hand; disputes become word-versus-word.
GST e-invoicing: built for tax compliance, not for tracking acceptance dates, the 45-day clock or section 16 interest.
Proposed: an event-sourced, hash-chained ledger with an integrity verifier, a statutory-clock engine (15-day objection window, 45-day due date, compound monthly-rest interest at 3× the configurable bank rate), dispute states mirroring the Samadhaan/ODR workflow, optional daily root-hash anchoring, and a dashboard with ageing buckets and defaulter rankings.
Feasibility study
Technical: SHA-256 chaining is a few lines with the standard node:crypto module; SQLite in WAL mode gives a safe append-only store; React covers the dashboard. All steps run on a student laptop.
Economic: zero licence cost — Node.js, SQLite, MySQL and React are free.
Operational: single-supplier deployment with three roles (admin, accountant, read-only auditor); the interest engine is configurable so an RBI bank-rate change is a config edit, not a code change.
Legal fit: the design never stores government ID numbers (GSTIN, Udyam, PAN, Aadhaar), and an integrity-verified log supports the kind of reliable electronic records the Information Technology Act contemplates — though admissibility questions stay outside the project's claims.
Objectives
01Design an event-sourced ledger schema in which every invoice-lifecycle event is an immutable row with sequence number, payload, previous-hash and own hash.
02Implement the SHA-256 hash chain with node:crypto and a full-chain integrity verifier that walks and recomputes the chain on demand.
03Automate the statutory clock: acceptance and deemed acceptance under the MSMED Act's 15-day written-objection rule, the 45-day due date of section 15, and overdue ageing buckets (0–45, 46–90, 90+ days).
04Implement the section 16 interest engine — compound interest with monthly rests at three times a configurable RBI bank rate — with partial-payment application and a hand-verifiable statement.
05Model the dispute workflow as a state machine (normal → disputed → resolved, or referred to MSEFC/ODR) mirroring the MSME Samadhaan process.
06Provide an optional anchoring service that exports a daily root hash for preservation outside the system.
07Build a React dashboard with ageing reports, interest statements, buyer defaulter rankings and a visible chain-integrity status.
08Secure the system with role-based access (admin, accountant, auditor), input validation and the deliberate exclusion of all government ID numbers from the schema.
Scope
In scope
A single supplier organisation (the MSME) recording invoices against many buyers; users are supplier staff plus a read-only auditor.
Full invoice lifecycle: issue → delivery → objection/acceptance (actual or deemed) → due → paid / overdue → dispute → resolution or MSEFC referral.
Hash-chained append-only event store (SQLite, WAL) with a MySQL read model for fast queries, an interest engine, an anchoring exporter and a React dashboard.
Section 16 interest statements and an event-history annexure formatted for MSEFC/ODR filing support.
Out of scope (v1)
No cryptocurrency, tokens, smart contracts on public chains, or multi-party consensus — the buyer does not run a node.
No GST return filing, e-invoicing (IRN) generation or accounting-ledger replacement; the ledger complements, not replaces, Tally-style books.
No payment-gateway integration; payments are recorded with a reference number (NEFT/UPI reference).
No storage of statutory identifiers: GSTIN, Udyam registration number, PAN and Aadhaar are deliberately absent from the schema; parties are referenced by name and an internal code.
No legal-advice features — the tool produces statements; filing and advocacy remain with the supplier and counsel.
Methodology
The project follows an incremental SDLC with risk retired early — the hash chain and the interest engine are built first because everything else depends on them. It spans 16 weeks, matching the MCSP-232 project semester.
Testing approach: the interest engine is pinned by golden test cases computed by hand (including month-end and leap-month boundaries); the ledger has a property test that appends random valid events and asserts verifier success, and a tamper test that silently modifies a row and asserts the verifier fails; the API gets Jest integration tests; a 12-invoice demo dataset is validated with user-acceptance checklists.
Architecture & tech stack
4 diagrams · 8 technologies · 2 min read
Node.js 20
Express
JavaScript (ES modules)
node:crypto (SHA-256)
SQLite (append-only, WAL)
MySQL
React
Jest
The system is a small three-tier application with an event-sourced core. The presentation tier is a React dashboard for the supplier's staff and auditor. The application tier is an Express REST API that validates input, enforces roles, appends events and serves the read models. The data tier has two stores: SQLite in WAL mode holds the append-only event ledger (the system of record), and MySQL holds derived, rebuildable read models for fast queries — a separation that keeps the evidence store pure while the query side stays flexible.
Every mutation is an event: nothing in the ledger is ever updated or deleted. Corrections are new compensating events, which is what makes the hash chain meaningful. Each event stores its sequence number, type, canonical-JSON payload, timestamp, the previous event's hash, and its own SHA-256(previousHash + canonical JSON). The verifier recomputes the chain; a daily job exports the latest hash as an anchor that can be preserved outside the system (printed register, e-mail, or later a public timestamping service) to prove the state existed that day.
flowchart TD
S(["Supplier admin / accountant"]) -->|"invoice, acceptance, payment events"| API["Express REST API"]
A(["Auditor (read-only)"]) -->|"verify, view"| API
API --> V["Payload validation + role check"]
V --> EV["Append event: seq, type, payload, recorded_at"]
EV --> HC["Hash chain: SHA-256(prevHash + canonical JSON)"]
HC --> ST[("SQLite ledger - append-only, WAL")]
ST --> VF["Integrity verifier: recompute full chain"]
ST --> RM["Read-model builder (rebuildable)"]
RM --> MY[("MySQL query index")]
RM --> IE["Statutory engine: 15-day objection, 45-day due date, s.16 monthly-rest interest"]
ST --> AN["Anchor service: daily root hash export"]
AN --> EXT["Preserved outside: printed register / e-mail / public timestamping"]
MY --> UI["React dashboard: ageing, statements, defaulters, integrity badge"]
IE --> UI
Ledger schema (core tables)
erDiagram
INVOICE_STATE ||--o{ LEDGER_EVENT : "is built from"
INVOICE_STATE ||--o{ DISPUTE : "may enter"
LEDGER_EVENT {
int seq PK
string event_type
string payload_json
string prev_hash
string hash
datetime recorded_at
}
INVOICE_STATE {
int invoice_seq PK
string invoice_no
string buyer_code
int amount_paise
string state
date acceptance_date
date due_date
int overdue_days
}
DISPUTE {
int dispute_seq PK
string invoice_no
string status
date raised_on
date resolved_on
}
Invoice lifecycle and dispute states
flowchart TD
I["Issued"] --> DL["Delivered"]
DL -->|"no written objection in 15 days"| DA["Deemed accepted (s.2)"]
DL -->|"objection filed"| OR["Objection raised"]
OR -->|"objection removed"| DA
DL -->|"accepted in writing"| DA
DA --> DUE["Due within 45 days (s.15)"]
DUE --> P["Paid in full"]
DUE --> OV["Overdue - s.16 interest running"]
OV --> PP["Part payment recorded"]
PP --> OV
OV --> DP["Disputed by buyer"]
DP --> RS["Resolved / settled"]
DP --> MF["Referred to MSEFC / ODR (s.18)"]
An Express REST API where the accountant records events — invoice issued, delivery, buyer objection, acceptance, payment with a NEFT/UPI reference, dispute raised or resolved. Every request is validated for required fields and dates before it may touch the ledger, and every response carries the resulting event hash for the user's own records.
Module 02
Hash-Linked Ledger Store
The system of record: an append-only SQLite (WAL) table of events, each storing the previous event's hash and its own SHA-256 over the canonical JSON. There is no update or delete path in code; corrections happen as new compensating events. A verifier endpoint recomputes the entire chain and reports the first broken link if any.
Module 03
Statutory Clock & Interest Engine
Implements the MSMED Act's date rules: deemed acceptance when no written objection arrives within 15 days of delivery, the 45-day due date under section 15, ageing buckets (0–45, 46–90, 90+ days), and section 16 interest — compound, with monthly rests, at three times the configurable bank rate — applied from the day after the due date, with part payments recorded against the running balance.
Module 04
Dispute & MSEFC Workflow
A state machine mirroring the MSME Samadhaan / ODR process: normal → disputed → resolved, or disputed → referred to MSEFC → awarded/settled. Each transition is an event, so the ledger shows who said what and when. An annexure exporter prints the invoice's full event history and interest statement in the sequence a facilitation council would want to read.
Module 05
Anchoring Service
Each night the service computes the current chain tip's root hash and writes an anchor file with the date. The supplier preserves it outside the system — printed and signed in a register, or e-mailed to themselves — so that even if the database were later replaced wholesale, yesterday's anchor proves the ledger content existed on that date. Instructions for future public timestamping are included.
Module 06
Supplier Dashboard & Reports
A React dashboard with role-specific views: accountant (event entry, statements), admin (buyer master, configuration), auditor (read-only history and integrity badge). Reports cover overdue ageing by buyer, a buyer-defaulters ranking, section 16 interest statements per invoice, and a prominent chain-integrity indicator fed by the verifier.
Slides
13 slides · titles free · bullets, notes and the .pptx unlock
Slide 1
MSME Invoice Acceptance and Delayed-Payment Interest Ledger
Slide 2
The MSME delayed-payment problem
Slide 3
Problem Statement
Slide 4
Proposed System
Slide 5
Objectives
Slide 6
Technology Stack
Slide 7
System Architecture
Slide 8
Hash Chain — How Tamper-Evidence Works
Slide 9
Statutory Engine (s.2, s.15, s.16)
Slide 10
Dispute Workflow & MSEFC Mapping
Slide 11
Security & Privacy by Design
Slide 12
Testing & Demo
Slide 13
Conclusion & Future Scope
Bullets, speaker notes and the .pptx · ₹2,000
The titles above are the real outline. The rest is what you present from.
Read each answer, close it, and say it in your own words. Your viva will ask. Now you'll know.
01Concept
How does a hash chain make records tamper-evident?
Each event stores the SHA-256 hash of the previous event together with its own content, so its hash depends on everything before it. If anyone edits an old row, its recomputed hash changes, which breaks the link stored in the next row and every link after it. The verifier walks the whole chain, so a single silent edit anywhere is detected.
02Concept
Is this a blockchain? Why did you not build a full one?
It borrows the blockchain's core construction — an append-only, hash-linked log with periodic anchoring — but it is not a distributed blockchain because there is no second party running a node and no consensus to reach. A single supplier's evidence ledger gains nothing from tokens or mining; claiming otherwise would be architecture theatre, so I scoped it honestly.
03Concept
What does 'compound interest with monthly rests' mean under section 16?
Interest accrues at three times the RBI-notified bank rate, and at each month-end the accrued interest is added to the outstanding amount, so the next month's interest is calculated on principal plus accumulated interest — that is the 'monthly rest'. My engine iterates month boundaries between the day after the due date and each payment, compounding exactly this way.
+15 more questions, with answers
Try the free ones out loud first. Your examiner will not accept “it's in the PPT”.
Merkle-tree anchoring with inclusion proofs and an OpenTimestamps-style public anchor, so a single invoice's event can be proven against the daily root without revealing the rest.
Two-party lite network: a signed-event exchange where the buyer's system countersigns acceptance events, adding non-repudiation without full consensus.
Accounting integration: Tally XML import/export so the ledger mirrors an existing books of account without re-entry.
MSEFC filing pack generator: a single ZIP with the interest statement, event annexure and anchor log laid out for the ODR portal's attachment requirements.
Buyer risk scoring: defaulter rankings across the supplier's history with trend charts for credit decisions.
Mobile companion for delivery-recording with geotagged proof photos hashed into the chain at capture time.
Keep browsing
More MCA Blockchain projects
Same degree, same syllabus slot, different idea. Pick the one your guide will actually approve.