There is no single universally accepted “Gang of Four for accounting software,” because accounting systems sit at the intersection of accounting rules, internal controls, databases, and application design. The most reliable approach is to use authoritative accounting sources for the business rules and established software-engineering sources for implementation.
For the accounting side, the strongest references are the applicable accounting standards and professional guidance:
- FASB / U.S. GAAP for U.S. financial accounting
- IASB / IFRS for international accounting
- professional accounting and auditing guidance from organizations such as the AICPA
- internal-control frameworks such as COSO
These sources define what the system ultimately has to produce and preserve, even though they usually do not tell you what your database schema should look like.
For software design itself, several principles are widely accepted.
Money should normally be represented with exact decimal or integer arithmetic, not binary floating point. A common design is to store an integer number of the smallest currency unit, such as cents, together with a currency code, or to use a fixed-precision decimal type. This avoids errors such as amounts that should equal 0.30 internally becoming 0.30000000000000004.
Accounting records should be modeled around double-entry bookkeeping. A journal transaction contains two or more postings, and the total debits and credits must balance:
∑Debits=∑Credits.\sum \text{Debits}=\sum \text{Credits}.
The transaction should usually be the indivisible unit of posting. You generally do not want software to permit half of an accounting entry to be committed successfully while the other half fails.
Another important principle is immutability or controlled correction. In a serious accounting system, posted transactions normally should not simply disappear when someone edits them. Corrections are commonly made through reversing entries, adjusting entries, or an audit-controlled amendment process. That preserves the audit trail.
Reconciliation should also be treated separately from changing the underlying accounting records. For example, bank reconciliation normally means matching your ledger transactions against an external bank statement, identifying outstanding checks, deposits in transit, fees, errors, etc. An unexplained difference should not simply be silently altered by the program to make the numbers agree.
Period-end processing is likewise primarily an accounting issue. The application may support:
- open and closed accounting periods,
- adjusting entries,
- accruals and deferrals,
- depreciation,
- foreign-exchange adjustments,
- closing entries,
- financial-statement generation, and
- controls preventing unauthorized posting into closed periods.
Modern systems often do not need to perform a destructive “month close.” Instead, the underlying journal remains intact while permissions and reporting periods determine what can still be changed.
For data modeling, Martin Fowler's Patterns of Enterprise Application Architecture is useful for transaction-processing and domain-model ideas, although it is not accounting-specific. Eric Evans's Domain-Driven Design is also useful because accounting is a domain in which terms such as account, posting, journal, invoice, payment, and balance have very specific meanings and should be modeled explicitly.
It is also worth studying mature open-source accounting systems such as GnuCash or ERP systems such as Apache OFBiz. They should not be regarded as accounting standards, but their data models can provide useful examples of how real systems represent accounts, currencies, transactions, splits/postings, reconciliation, and reports.
For user interfaces and reports, the safest rule is to design around established accounting artifacts rather than inventing new ones. Business users already understand structures such as:
- general ledger,
- trial balance,
- balance sheet,
- income statement,
- cash-flow statement,
- aging reports, and
- bank reconciliation.
A good accounting application should therefore make the underlying accounting model rigorous while allowing the user interface to hide unnecessary bookkeeping complexity from non-accountants.
So the most authoritative design strategy is not to search for one software-design document. Combine:
Accounting standards for what the numbers must mean,
internal-control/audit guidance for integrity and traceability,
and established software architecture practices for how to implement the system safely.
The most fundamental technical rules are: use exact monetary arithmetic, enforce double entry, make posting atomic, preserve an audit trail, separate reconciliation from alteration, support controlled accounting periods, and generate reports directly from the underlying ledger rather than from independently maintained totals.