Documentation / Release Notes

Release Notes & Changelog

Every Ledgr release, categorised by change type. Ledgr v1.0.3+ updates itself automatically — see Getting Started for details.

v1.0.4
2026-06-21
Latest

🛡️ Full-App Financial Integrity Audit (60 fixes)

Systematic end-to-end audit of every module that touches money: invoices, purchases, credit/debit notes, payments, stock, POS, reports, and payroll. Every journal entry, stock movement, and report query has been verified and corrected.

✨ Features

  • Recurring invoice auto-generation. Templates with weekly/monthly/quarterly/yearly schedules now automatically create invoices when due. Triggered on every app start.
  • Stock adjustment journal entries. Adjustments (damaged, lost, found, recount) now post proper accounting entries — Dr Stock Written Off / Cr Inventory for losses, Dr Inventory / Cr Stock Adjustment Gain for increases. Balance Sheet stays in sync with actual inventory.
  • Salary disbursement journal. "Mark All Paid" on a payroll run now posts Dr Salaries Payable / Cr Bank — clearing the liability instead of leaving it open forever.

🐛 Critical Bug Fixes

  • GSTR-3B runtime crash. The tax summary report referenced a non-existent column (tr.tax_amount) — fixed to tt.tax_amount.
  • POS Cancel button never worked. All POS bills are status "paid", but cancel rejected paid invoices. Guard removed.
  • Credit Notes had zero tax reversal. tax_group_id wasn't sent from the form, so populate_tax_transactions() skipped every line. GSTR-3B output tax was overstated.
  • Credit/Debit Notes never moved stock. Neither form passed warehouse_id, so the backend's if let Some(wh_id) guard silently skipped stock. Now loads default warehouse.
  • Credit Notes sent negative rates. Tax engine can't calculate on negative amounts; removed the hack. Backend already handles sign internally for CN type.
  • Receivables aging ignored Credit Notes. Customer showed as owing more than actual. Now subtracts CN amounts with sign=-1.
  • Payables aging ignored Debit Notes. Same fix for vendor outstanding.
  • CSV import always failed. Missing 25th SQL parameter + naive comma-split that broke on quoted fields. Both fixed.
  • Reorder report "Last Supplier" always NULL. Query filtered type='purchase' instead of 'purchase_order'.
  • Inventory Summary/Valuation showed wrong numbers. Was summing the running-balance column (meaningless). Now correctly reads the latest entry per product via MAX(id).
  • Duplicate invoice numbers. When no number_series row existed, increment silently failed. Now auto-creates the row on first use.
  • New companies had no warehouse. Stock operations failed until user manually created one. create_company now seeds a default warehouse.

📊 Report Accuracy

  • GSTR-1 now filters to outward supplies only (was including purchases).
  • GSTR-1 & GSTR-3B totals subtract credit note values (net turnover).
  • Sales by Customer/Product/Period reports include credit notes with sign flip.
  • Dashboard outstanding receivables/payables subtract CN/DN.
  • Sales & Purchase registers exclude draft/cancelled invoices.
  • POS day summary fixed (was cross-joining payments × invoices).

🔧 Other Improvements

  • Credit Note form: warehouse picker, "Add back to stock" checkbox now functional.
  • Debit Note form: niche-aware vendor label (Distributor for pharmacy/garment).
  • Voucher Form: contra limited to bank/cash accounts; allocation amounts editable.
  • POS: stock reloads on warehouse switch; edit-bill restores full UOM + batch data.
  • E-Invoice: GstRt snaps to nearest NIC-valid slab (prevents IRP rejection).
  • Backup restore: proper semantic version comparison (v1.0.10 > v1.0.9).
  • Opening stock deletion now reverses its journal entry.
  • Refund payment type fixed: credit notes create "payment" (money out), not "receipt".
v1.0.3
2026-06-20

✨ Features

  • In-app auto-updates (OTA). A pill in the StatusBar tells you when a new version is available; click to view release notes and install with one button. Updates are signed end-to-end (Ed25519) so you only ever install official builds.
  • Tax registration status. Pick Registered, Unregistered (below threshold), or Composition Scheme at onboarding. Unregistered businesses issue Bill of Supply (no tax); composition dealers get the mandatory CGST Rule 5 declaration on every invoice.
  • Per-tax-system invoice templates. India GST, UAE/UK/EU VAT, US/Canada Sales Tax, and Custom each get their own jurisdiction-correct template — HSN/SAC, place of supply, CGST+SGST/IGST split, TRN/VAT No., multi-component sales tax breakdown, all where they statutorily belong.
  • Smarter onboarding. State pickers for India / US / Canada / UAE; PAN auto-extracts from a valid GSTIN; per-system required-fields enforcement so you can't skip the GSTIN/TRN/EIN your country mandates.

🐛 Bug fixes

  • Company logo set during onboarding now appears on every invoice (preview, print, and PDF). It was being read from the wrong path before — straightforward bug, surprisingly long-lived.
  • Tax-group rates now resolve correctly from CSV storage. A silent JSON-vs-CSV parser mismatch meant some custom tax groups were ignored when calculating totals.
  • VAT and Sales Tax engines no longer apply zero-rated supplies the standard rate. The filter that decided "this rate applies" was too strict for unregistered or below-threshold businesses.

🔧 Other

  • State-aware GST detection — supplier vs recipient state is detected automatically from your GSTIN + the buyer's GSTIN, so the right CGST+SGST or IGST split happens with no manual intervention.
  • Auto-generated, categorised changelogs in CI — every release builds its own changelog from feat: / fix: / perf: commit prefixes.
v1.0.2
2026-06-19
  • Biometric attendance integration (LAN-pull for ZKTeco / eSSL / CPPlus over TCP 4370).
  • E-invoice (IRP) submission — direct NIC and via GSP.
  • GSTIN auto-lookup on contact form, PAN auto-extract from GSTIN.
  • Per-line tax-group picker on invoices for multi-rate setups.
v0.9.0
2026-05-31
  • First public preview — billing, accounting, inventory, POS, CRM in a single offline-first desktop app.
  • Five business niches out of the box (pharmacy / garment / wholesale / auto-parts / general).
  • Multi-country tax engine (GST / VAT / Sales Tax / Custom).