A Windows desktop ledger application for small GCash / e-wallet agents in the Philippines. Built with Lazarus 3.x + Free Pascal Compiler 3.2+, using SQLdb + SQLite. Free for all uses — including commercial.
Tracks daily cash and wallet balances, records Cash-In / Cash-Out / E-Load / Bills Payment / Send Money / Utang / Manual Adjustment transactions, auto-computes service fees from configurable rules, manages customer utang with partial payments, and produces end-of-day reconciliation and reports.
Download Lazarus 3.0 or newer from https://www.lazarus-ide.org/. The Windows installer is around 150 MB and bundles FPC. During install you can choose any destination drive (e.g. D:\Lazarus).
No account, no email, no license tier.
This app needs sqlite3.dll (on Windows) findable by the OS. Either:
- Use the one bundled with Lazarus — usually at
<lazarus-install>\sqlite3.dll, automatically on PATH; or - Drop
sqlite3.dll(32-bit if you compile Win32, 64-bit if Win64) next to the compiled EXE. Get the official build from https://sqlite.org/download.html.
If the app starts but fails the database init with a "can't load library" error, this is the cause.
- Open
AgentLedgerPH.lpiin Lazarus. - Run → Build (
Ctrl+F9). - Run → Run (
F9).
On first launch the app creates data\agentledger.db next to the executable and seeds a default Owner:
| Username | Password | Role |
|---|---|---|
admin |
admin123 |
Owner |
Change this password immediately from Master → Users.
After logging in, use File → Seed sample data to populate:
- Default fee rules for Cash-In, Cash-Out, E-Load, Bills Payment, Send Money
- A few sample customers
- Two extra users (
staff1/staff123andviewer1/viewer123)
AgentLedger PH Lazarus/
├── AgentLedgerPH.lpr — program entry point
├── AgentLedgerPH.lpi — Lazarus project file
├── data/ — SQLite database (created at runtime)
├── backups/ — backup files (created on first backup)
└── src/
├── DataModule/
│ ├── uDM.pas — TSQLite3Connection + TSQLTransaction
│ └── uDM.lfm
├── Models/
│ └── uModels.pas
├── Services/
│ ├── uSession.pas — current-user / session state
│ ├── uAuthService.pas — login, password hashing (SHA-1+salt), user CRUD
│ ├── uSessionService.pas — open/close daily session, expected totals
│ ├── uTransactionService.pas — record txns, compute cash/wallet impact
│ ├── uCustomerService.pas
│ ├── uFeeService.pas — configurable fee rule lookup
│ ├── uUtangService.pas — debt + partial-payment tracking
│ ├── uAuditService.pas
│ ├── uBackupService.pas — DB file backup / restore
│ └── uSeedService.pas
├── Reports/
│ └── uReportService.pas
└── Forms/
├── uFormLogin (.pas + .lfm)
├── uFormMain (.pas + .lfm) ← dashboard + main menu
├── uFormSession (.pas + .lfm)
├── uFormTransaction (.pas + .lfm)
├── uFormCustomers (.pas + .lfm)
├── uFormUtang (.pas + .lfm)
├── uFormFeeRules (.pas + .lfm)
├── uFormUsers (.pas + .lfm)
├── uFormReconciliation (.pas + .lfm)
├── uFormReports (.pas + .lfm)
└── uFormAuditLog (.pas + .lfm)
Same layered design as the Delphi version:
- Forms (LCL UI) call services. No SQL in form code.
- DataModule owns one
TSQLite3Connection+ oneTSQLTransactionwith helpers:NewQuery,ExecSQL,Commit,LastInsertRowId,ScalarInt/Float/Str. - Models are plain records and enums.
- Services hold business logic, parameterized SQL, role checks, and audit writes.
- Reports are read-only aggregation queries returning typed records.
Pascal language mode is {$mode delphi} throughout — code reads almost identically to Delphi.
| Topic | Delphi | Lazarus port |
|---|---|---|
| Database driver | FireDAC (TFDConnection, TFDQuery) |
SQLdb (TSQLite3Connection, TSQLQuery, TSQLTransaction) |
| Transaction model | Auto-commit | Explicit CommitRetaining via DM.Commit after each DML |
| Password hash | SHA-256 (System.Hash.THashSHA2) |
SHA-1 + salt (FPC stdlib sha1 unit) — hash values are not interoperable with the Delphi build's DB |
| File I/O | System.IOUtils.TPath/TFile/TDirectory |
SysUtils + FileUtil + LazFileUtils |
| Form files | .dfm |
.lfm |
| Project file | .dpr / .dproj |
.lpr / .lpi |
| Generics | System.Generics.Collections |
Generics.Collections (FPC's port — same syntax) |
| Cost | Free for non-commercial; paid otherwise | Free, commercial use included |
The SQLite schema, the cash/wallet math, the role model, the audit log structure, and every UI screen are identical to the Delphi build. You cannot, however, swap a database file between the two builds: passwords are hashed differently. Either rotate passwords after switching builds, or pick one build and stick with it.
Identical to the Delphi build. See those sections in the original README for the full spec. In short:
- Roles — Owner (full control), Staff (transactions + reconcile + customer add/edit), Viewer (read-only).
- Sessions — start with
Open Session(starting cash + starting wallet). One open at a time. - Cash & wallet impact per transaction type:
- Cash-In:
cash += amount+fee,wallet -= amount - Cash-Out:
cash -= amount,wallet += amount+fee - E-Load / Bills / Send Money:
cash += amount+fee,wallet -= amount - Utang Payment:
cash += amount - Manual Adjustment: amount field = signed cash, fee field = signed wallet
- Cash-In:
- Reconcile — enter counted cash and wallet; system shows short / over.
- Utang — tick the utang box on a transaction (with a chosen customer) to log it as outstanding. Pay it back later via Master → Utang, partial payments allowed.
- Reports — Daily Closing, Service Fee Profit, Cash-In vs Cash-Out, Staff Activity.
- Backup — File → Backup writes a
.dbfile tobackups\with a timestamp; Restore replaces the live DB after a safety copy. - Audit log — every privileged action is recorded with user, action, entity, entity_id, details, timestamp.
- Passwords use SHA-1 with a fixed application salt. For local single-shop use this is fine; for production deployment to many agents, swap to PBKDF2 / bcrypt via a third-party FPC crypto package (
DCPcrypt,HashLib4Pascal). - Backups are unencrypted SQLite files. Treat them with the same care as the live DB.
- Single-machine app — SQLite, one user at a time. No network/multi-station support.
- Amounts are stored as SQLite
REAL(binary floating point). For very high-precision accounting, switch to integer centavos.
| Username | Password | Role |
|---|---|---|
admin |
admin123 |
Owner |
staff1 |
staff123 |
Staff |
viewer1 |
viewer123 |
Viewer |
Change all of these before going live.