Skip to content
himture.dev

They were reconciling payments with a printout and a pen

A pharma wholesaler matched payments on printed bank statements. I built a local desktop app to import the statements and keep those matches searchable.

2 min read#Electron#Desktop#SQLite

A pharma wholesaler I work with used to print bank statements and mark each incoming payment with a pen: which customer sent it, and which bill it belonged to.

It took hours each week. Once the paper went into a drawer, looking up an old match meant finding that printout again.

I built BalCal to do that matching on their computer.

What I learned from watching the work

At first this looked like something a spreadsheet could handle. Watching the process made the problem clearer. A bank statement gives you a description and an amount. The person holding the pen knows how to connect those to a customer and a bill.

The app needed to preserve those matches and make them searchable. Totals, outstanding balances, and reports would be useful only if the imported transactions were right.

Keeping the data local

The business wanted its financial records to stay on a machine it owned. That requirement led me to a desktop app with SQLite for storage.

There are no accounts to create and no server to operate. The user opens the app, imports a statement, and works with the records locally. Reconciliation works without an internet connection, and the statements don't need to be uploaded.

Electron let me build the interface in React and read files from the machine. For this job, the larger application bundle was an acceptable cost.

Each bank needs its own parser

Bank exports vary in small but consequential ways. Columns arrive in a different order. Dates might be text or Excel serial numbers. Amounts can have currency symbols, parentheses, or trailing CR and DR markers. Some files separate debits and credits; others put signed values in one column.

The transaction descriptions vary too. UPI, NEFT, IMPS, RTGS, cheque references, and wallet payments each leave different strings to work with.

The app detects the bank format and uses the corresponding parser. It reads more than 25 Indian bank formats. Most of that work was going through exports, checking how each represented a transaction, and handling the differences explicitly.

There wasn't one especially difficult format. There were many ordinary differences, and missing any of the ones this business used would make the import unreliable.

Where it stands

BalCal is in daily use. The portable build runs without an installer, and reconciliation that used to involve hours with a printout now takes minutes.

The same wholesaler is piloting Pharmulo, which lets retailers place orders against the stock in its existing ERP. I plan to bring reconciliation into that workflow. For now, the desktop app handles the job the business originally asked me to solve.

For a role or a project, email hi@himture.dev, or see my freelance services.

résumé, PDFGitHubLinkedIn