Customization is about adding or changing behavior of an application in ways that were not foreseen when it was written. This differs from configuration, because the latter can be used to select between planned behaviors. Since the functionality or behavior to be added wasn’t foreseen, this means that customization implies application code being added or changed. Especially changing existing behavior has proven problematic (in the IT industry at large) in terms of being able to later upgrade the underlying software to newer releases. This problem can be mitigated by creation of specific “extension points”: places in the software which are designed to expand or replace existing behaviors.
LedgerSMB has several such “extension points”:
Workflow configuration
Dependency-injection based configuration:
Document formatters
Bank statement importers
HTTP request handlers/interceptors
Outgoing mail transport
Sales/VAT tax calculation
Each bank has its own format for bank statement exports, making it impossible to develop import functionality that’s generically usable. Some default importers come with LedgerSMB - mostly as example code for those developing their own. The dependency injection-based configuration supports adding these user-specific developments without changing any of the files that come in the standard distribution.
Another example is changing “Workflow configuration”, by which the life cycle of invoices and GL transactions can be changed. This way, additional steps can be introduced into the life cycle, or steps can be combined (from a user perspective) by automatically executing steps after another has been triggered manually.
Customization usually means additional or modified Perl code needs to be loaded.
@@@TODO: describe where to store this new or overriding code…