diff options
Diffstat (limited to 'doc/manual/LedgerSMB-manual.tex')
-rw-r--r-- | doc/manual/LedgerSMB-manual.tex | 2431 |
1 files changed, 2431 insertions, 0 deletions
diff --git a/doc/manual/LedgerSMB-manual.tex b/doc/manual/LedgerSMB-manual.tex new file mode 100644 index 00000000..dabe5a98 --- /dev/null +++ b/doc/manual/LedgerSMB-manual.tex @@ -0,0 +1,2431 @@ +\documentclass{article} +\usepackage{metatron} +\renewcommand{\abstractname}{Executive Summary} +\newcommand{\mycustomer}[1][]{#1\space} +\newcommand{\myproject}[1][]{#1\space} +\title{Ledger-SMB Manual} +\author{Chris Travers (\metamail{chris})} +\date{\today} +\begin{document} +\maketitle + + Copyright \copyright 2006 Metatron Technology Consulting. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License" (Appendix \ref{fdl}). + + +\tableofcontents + +\listoffigures + +\clearpage + +\part{Ledger-SMB and Business Processes} +\section{Introduction to Ledger-SMB} +\subsection{Why Ledger-SMB} +\subsubsection{Advantages of Ledger-SMB} +\begin{itemize} +\item Flexibility and Central Management +\item Accessibility over the Internet (for some users) +\item Data is in a relatively open format +\item Integration with other tools +\item One of the best accounting options for Linux users. +\item Open Source +\item A flexible, open framework that can be extended or modified to fit your +business. +\item Security-conscious development community. +\end{itemize} +\subsubsection{Key Features} +\begin{itemize} +\item Accounts Receivable + \begin{itemize} + \item Track sales by customer + \item Issue Invoices, Statements, Receipts, and more + \item Job costing and time entry for customer projects. + \item Manage sales orders and quotations + \item Ship items from sales orders + \end{itemize} +\item Accounts Payable + \begin{itemize} + \item Track purchases and debts by vendor. + \item Issue RFQ's Purchase Orders, etc. + \item Track items received from purchase orders. + \end{itemize} +\item Budgeting + \begin{itemize} + \item Track expenditures and income across multiple departments. + \item Track all transactions across departments. + \end{itemize} +\item Check Printing + \begin{itemize} + \item Can customize template for any check form + \end{itemize} +\item General Ledger +\item Inventory Management + \begin{itemize} + \item Track sales and orders of parts + \item Track cost of goods sold using First In/First Out method + \item List all parts below reorder point. + \item Track ordering requirements. + \item Track, ship, receive, and transfer parts to and from multiple + warehouses. + \end{itemize} +\item Localization + \begin{itemize} + \item Provide Localized Translations for Part Descriptions + \item Provide Localized Templates for Invoices, Orders, Checks, and more. + \item Select language per customer, invoice, order, etc. + \end{itemize} +\item Manufacturing + \begin{itemize} + \item Track cost of goods sold for manufactured goods (assemblies) + \item Create assemblies and stock assemblies, tracking materials on hand. + \end{itemize} +\item Multi-company/Multiuser + \begin{itemize} + \item One isolated database per company + \item Users can have localized systems independent of company data set. + \end{itemize} +\item Point of Sale + \begin{itemize} + \item Run multiple cash registers against main Ledger-SMB installation. + \item Suitable for retail stores and more. + \item Supports some POS hardware out of the box. + \item Third party add-ons available for more functionality. + \end{itemize} +\item Price Matrix + \begin{itemize} + \item Track different prices for vendors and customers across the board. + \item Provide discounts to groups of customers per item or across the board. + \item Store vendors' prices independent of the other last cost in the + parts record. + \end{itemize} +\item Reporting + \begin{itemize} + \item All basic financial statements supported. + \item Customer history, sales data, and additional information can be easily + displayed. + \item Open framework allows for ODBC connections to be used to generate + reports using third party reporting tools. + \end{itemize} +\item Tax + \begin{itemize} + \item Supports Retail Sales Tax and Value Added Tax type systems + \item Flexible framework allows one to customize reports to change the tax + reporting framework to meet any local requirement. + \end{itemize} +\end{itemize} + +\subsection{Limitations of Ledger-SMB} +\begin{itemize} +\item No payroll module (Payroll must be done manually) +\item Some integration limitations +\item Further development/maintenance requires a knowledge of a relatively + broad range of technologies. +\end{itemize} + +\subsection{System Requirements of Ledger-SMB} +\begin{itemize} +\item PostgreSQL +\item A CGI-enabled Web Server (for example, Apache) +\item Perl with the DBI and DBD::Pg modules +\item An operating system which supports the above software (usually Linux, + though Windows, MacOS X, etc. do work). +\item \LaTeX\ (optional) is required to create PDF or Postscript invoices. +\end{itemize} + +\section{User Account and Database Administration Basics} + +These functions are accessed by going to the admin.pl script in the installed +directory of Ledger-SMB. + +\subsection{Companies and Datasets} + +Ledger-SMB stores its information in locale-specific data sets. When a dataset +is created, it sets various defaults such as currency, a basic chart of accounts +setup, and so forth. Note that the default setup is for Canada, where the +author of the software resides. + +Datasets are generally tracked as PostgreSQL databases. The application is +designed with the idea that each dataset will represent exactly one company. If +a customer is working with multiple companies, he/she must create a dataset to +for each. + +\subsection{How to Create a User} + +Users are created by going to the admin.pl page and clicking on "Add User." One +then fills out the form and when it is saved, the user is created. + +\subsection{Permissions} + +The permissions system is not rigorously enforced within Ledger-SMB, in the +sense that the permissions API is generally not used in the application itself. +Instead permissions are used to enable/disable menu options. Setting an +enforcement of such permissions would require some custom programming at the +present time. Most organizations, however, find that the current system is +adequate. + +The checkboxes which are marked enable menu entries. Those that are unchecked +disable those entries on the menu. + +\subsection{User Account Types} + +\begin{itemize} +\item User is a general user of the system +\item Managers often are able to see a larger amount of data +\item Administrators have full access to the system +\end{itemize} + +\subsection{Other Features} +\begin{itemize} +\item Lock System allows one to lock users out of the system while maintenance +is performed. This is only necessary during upgrades or maintenance which +results in the RDBMS being offline. +\item Change Admin Password. +\item Logout terminates the admin session. +\end{itemize} + +\section{Chart of Accounts} +The Chart of Accounts provides a basic overview of the logical structure of the +accounting program. One can customize this chart to allow for tracking of +different sorts of information. + +\subsection{Introduction to Double Entry Bookkeeping} + +Ledger-SMB is a double entry system, meaning that every transaction consists of +an equal sum of credits and debits (see below). A transaction is said to be +balanced when the debits and credits are equal. This is an oversimplification +and doesn't cover more complex processes involving closing books properly. In +general customers should be referred to their accountants for information beyond +the capabilities of the software. This module is just designed to provide +enough familiarity with the concepts to be able to have an intelligent +conversation with a bookkeeper or accountant who has specific requirements in +this regard. + +\subsubsection{Account Types} + +\begin{itemize} +\item Assets represent tangible or intangible property or money +retained by the company. This includes money owed to the company. +\item Liabilities are money that the company owes others. +\item Equity is the valuation of the company as a whole. Includes investment +capital, and money paid out to owners either as dividends or as withdrawals (for +sole proprietorships). Normally one will have at least three equity accounts: +One for tracking investment in the business, one for tracking withdrawals or +dividends, and one for tracking retained earnings. +\item Income accounts track the category of money as it is earned by the +business. +\item Expense accounts track the category of money flowing out as expenses are +accrued. +\end{itemize} + +\subsubsection{Debits and Credits} + +Debits and credits are the basic unit of double-entry bookkeeping. When money +is removed from the business by the owners (as an equity payment) that is a +debit, while when money is invested in the business, that is a credit. Every +other transaction is set to balance these concepts. Therefore asset accounts +normally have a debit balance because this allows for the equity account to be +debited, while expense accounts normally have a credit balance. + +If the total debits is not equal to the total credits in the chart of accounts, +something is very wrong, and the customer should get technical support +immediately. + +\subsubsection{A few Examples} + +One might have a business that rents an office space. When +rent is due, the accounts payable account would be credited, while the rent +expense account would be debited. When this is paid, the accounts payable +account would be debited while the asset account would be credited. This may +seem backwards, but the result is to reduce by the amount owed for rent the +amount that the owners can withdraw from the business as a debit. Let's say the +office rent is \$300. + +\begin{itemize} +\item Rent expense account is debited \$300 +\item Accounts Payable is credited \$300 +\item When this is paid, the checking account is credited \$300 +\item And the Accounts Payable is debited \$300 +\end{itemize} + +Let us say one performs a small consulting project for \$600. At the completion +of this project, the following transaction would be made: + +\begin{itemize} +\item Accounts Receivable is debited \$600 +\item Income (Consulting) is credited \$600. +\end{itemize} + +Then the customer pays the \$600, the following transaction is entered. +\begin{itemize} +\item Accounts Receivable is credited \$600 +\item Payments Received is debited \$600. +\end{itemize} + +\subsection{General Guidelines on Numbering Accounts} +In general, most drop-down boxes in Ledger-SMB order the accounts by account +number. Therefore by setting appropriate account numbers, one can affect the +default values. + +A second consideration is to try to keep things under each heading appropriate +tot hat heading. Thus setting an account number for a bank loan account in the +assets category is not generally advisable. + +\subsection{Adding/Modifying Accounts} + +These features are listed under System-\textgreater Chart of Accounts. +One can list the accounts and click on the account number to modify them or +click on the "add account" option to create new accounts. + +\begin{itemize} +\item Headings are just broad categories and do not store values themselves, +while accounts are used to store the transactional information. +\item One cannot have an account that is both a summary account (like AR) but +also has another function. +\item GIFI is mostly of interest to Canadian customers but it can be used to +create reports of account hierarchies. +\end{itemize} + +\subsection{Listing Account Balances and Transactions} +One can list the account balances via the Reports-\textgreater Chart of Accounts report. +Clicking on the account number will provide a ledger for that account. + +\section{Administration} + +This section will cover other (non-Chart of Accounts) aspects to the setup of +the Ledger-SMB accounting package. These are generally accessed in the System +submenu. + +\subsection{Taxes, Defaults, and Preferences} +\subsubsection{Adding A Sales Tax Account} + +Sales Tax is collected on behalf of a state of national government by the +individual store. Thus a sales tax account is a liability-- it represents money +*owed* by the business to the government. + +To add a sales tax account, one would create an account in the COA as a +liability account, check all of the "tax" checkboxes, and answer the following +question as "yes:" + +"Include this account on the customer/vendor forms to flag customer/vendor as +taxable?" + +Once this account is created, one can set the tax amount. + +\subsubsection{Setting a Sales Tax Amount} +Go to System-\textgreater Defaults and the tax account will be listed near the bottom of the +page. The rate can be set there. + +\subsubsection{Default Account Setup} +These accounts are the default accounts for part creation and foreign exchange +tracking. + +\subsubsection{Currency Setup} +The US accounts list this as USD:CAD:EUR. One can add other currencies in here, +such as IDR (Indonesian Rupiah), etc. Currencies are separated by colons. + +\subsubsection{Sequence Settings} +These sequences are used to generate user identifiers for quotations, invoices, +and the like. If an identifier is not added, the next number will be used. + +A common application is to set invoices, etc. to start at 1000 in order to hide +the number of issued invoices from a customer. + +\subsection{Audit Control} + +Auditibility is a core concern of the architects of any accounting system. Such +ensures that any modification to the accounting information leaves a trail which +can be followed to determine the nature of the change. Audits can help ensure +that the data in the accounting system is meaningful and accurate, and that no +foul play (such as embezzlement) is occurring. + +\subsubsection{Explaining transaction reversal} +In paper accounting systems, it was necessary to have a means to authoritatively +track corrections of mistakes. The means by which this was done was known as +"transaction reversal." + +When a mistake would be made, one would then reverse the transaction and then +enter it in correctly. For example, let us say that an office was renting space +for \$300 per month. Let us say that they inadvertently entered it in as a +\$200 expense. + +The original transaction would be: + +\begin{tabular}{l|r|r} +Account & Debit & Credit \\ +\hline +5760 Rent & \$200 & \\ +2100 Accounts Payable & & \$200\\ +\end{tabular} + +The reversal would be: + +\begin{tabular}{l|r|r} +Account & Debit & Credit \\ +\hline +5760 Rent & & \$200\\ +2100 Accounts Payable &\$200 & \\ +\end{tabular} + +This would be followed by re-entering the rent data with the correct numbers. +This was meant to ensure that one did not erase data from the accounting books +(and as such that erasing data would be a sign of foul play). + +Ledger-SMB has a capability to require such reversals if the business deems this +to be necessary. When this option is enabled, existing transactions cannot be +modified and one will need to post reversing transactions to void existing +transactions before posting corrected ones. + +Most accountants prefer this means to other audit trails because it is well +proven and understood by them. + +\subsubsection{Close books option} +The option to close books requires transaction reversal for any transaction up +to a certain date. + +\subsubsection{Audit Trails} +This option stores additional information in the database to help auditors trace +individual transactions. The information stored, however, is limited and it is +intended to be supplemental to other auditing facilities. + +The information added includes which table stored the record, which employee +entered the information, which form was used, and what the action was. No +direct financial information is included. + +\subsection{Departments} +Departments are logical divisions of a business. They allow for budgets to be +prepared for the individual department as well as the business as a whole. This +allows larger businesses to use Ledger-SMB to meet their needs. + +\subsubsection{Cost v Profit Centers.} + +In general business units are divided into cost and profit centers. Cost +centers are generally regarded as business units where the business expects to +lose money and profit centers are where they expect to gain money. For example, +the legal department in most companies is a cost center. + +One of the serious misunderstandings people run up against is that Ledger-SMB +tends to more narrowly define cost and profit centers than most businesses do. +In Ledger-SMB a cost center is any department of the business that does not +issue AR transactions. Although many businesses may have cost centers (like +technical support) where customer fees may subsidize the cost of providing the +service, in Ledger-SMB, these are profit centers. + +Ledger-SMB will not allow cost centers to be associated with AR transactions. +So if you want this functionality, you must create the department as a profit +center. + +\subsection{Warehouses} + +Ledger-SMB has the ability to track inventory by warehouse. Inventory items can +be moved between warehouses, and shipped from any warehouse where the item is in +stock. We will explore this concept more later. + +\subsection{Languages} +Languages allow for goods and services to be translated so that one can +maintain offices in different countries and allow for different goods and +service descriptions to be translated to different languages for localization +purposes. + +\subsection{Types of Businesses} +One can create types of businesses and then give them discounts across the +board. For example, one might give a firm that uses one's services as a +subcontractor a 10\% discount or more. + +\subsection{Misc.} +\subsubsection{GIFI} + +GIFI is a requirement for Canadian customers. This feature allows one to link +accounts with Canadian tax codes to simplify the reporting process. + +It also has another use in that non-Canadians can use this functionality to +create customized reports by categorizing accounts using this field. This +allows for a sort of shallow "account hierarchy" like some users are used to +with other products. + +\subsubsection{SIC} + +Standard Industrial Classification is a way of tracking the type of business +that a vendor or customer is in. For example, an accountant would have an SIC +of 8721 while a graphic design firm would have an SIC of 7336. The +classification is hierarchical so one could use this field for custom reporting +and marketing purposes. + +\subsubsection{Overview of Template Editing} + +The templates for invoices, orders, and the like can be edited from within +Ledger-SMB. The submenus within the System submenu such as HTML Templates, +Text Templates and LaTeX templates provide access to this functionality. + +\subsubsection{Year-end} + +Although the Year-end functionality in Ledger-SMB is very useful, it does not +entirely make the process simple and painless. One must still manually enter +adjustments prior to closing the books. The extent to which these adjustments +are necessary for any given business is a matter best discussed with an +accountant. + +The standard way books are normally closed at the end of the year is by moving +all adjusted\footnote{Adjustments would be entered via the General Ledger. The +exact process is beyond the scope of this class, however.} income and expenses +to an equity account usually called "Retained +Earnings." Assets and liabilities are not moved. Equity drawing/dividend +accounts are also moved, but the investment accounts are not. The reasoning +behind this process is that one wants a permanent record of the amount invested +in a business, but any dividends ought not to count against their recipients +when new investors are brought on board. + +Ledger-SMB automatically moves all income and expense into the specified +year-end/retained earnings account. It does not move the drawing account, and +this must be done manually, nor does it automate the process of making +adjustments. + +Contrary to its name, this function can close the books at any time, though this +would likely be of limited use. + +\subsection{Options in the ledger-smb.conf} + +For those who are unfamiliar with Perl as a programming language, the +ledger-smb.conf configures the software by assigning site-wide variables. Most +of these should be left alone unless one knows what one is doing. However, on +some systems some options might need to be changed, so all options are presented +here for reference: + +\begin{itemize} +\item \$userspath is the directory where Ledger-SMB will store the user +accounts. The web server process must be able to read from and write to this +directory. +\item \$templates is the directory where the templates are stored. +\item \$memberfile is the master list of user configuration information +\item \$sendmail is the command to use to send a message. It must read the +email from standard input. +\item \$language allows one to set the language for the login screen and admin +page. +\item \$latex tells Ledger-SMB whether LaTeX is installed. LaTeX is required +for generating Postscript and PDF invoices and the like. +\item Various environmental variables (\$ENV...) can be set here too. One can +add paths for searching for LaTeX, etc. +\item \%printer can be used to set a hash table of printers for the software. +The primary example is\\ +\%printer = ( 'Default' =\textgreater 'lpr', 'Color' =\textgreater 'lpr -PEpson' ); \\ +However, this can use any program that can accept print documents (in +Postscript) from standard input, so there are many more possibilities. +\end{itemize} + +I have omitted the variables used to configure Oracle as I do not believe it is +still supported (it could be with a small amount of work though). + +\section{Goods and Services} + +The Goods and Services module will focus on the definition of goods and services +and the related accounting concepts. + +\subsection{Basic Terms} +\begin{description} +\item[COGS] is Cost of Goods Sold. When an item is sold, then the expense of +its purchase is accrued as attached to the income of the sale. It is tracked as +COGS. +\item[List Price] is the recommended retail price. +\item[Markup] is the percentage increase that is applied to the last cost to get the sell price. +\item[ROP] Re-order point. Items with fewer in stock than this will show up on +short reports. +\item[Sell Price] is the price at which the item is sold. +\end{description} + +\subsection{The Price Matrix} + +It is possible to set different prices for different groups of customers, or for +different customers individually. Similarly, one can track different prices +from different vendors along with the required lead time for an order. + +\subsection{Pricegroups} + +Pricegroups are used to help determine the discount a given customer may have. + +\subsection{Groups} + +Groups represent a way of categorizing POS items for a touchscreen environment. +It is not fully functional yet, but is sufficient that with some stylesheet +changes, it could be made to work. + +\subsection{Labor/Overhead} + +Labor/overhead is usually used for tracking manufacturing expenses. It is not +directly billed to a customer. It is associated with an expense/Cost of Goods +Sold (COGS) account + +\subsection{Services} + +Services include any labor that is billed directly to the customer. It is +associated with an expense/COGS account and an income account. Services can be +associated with sales tax. + +\subsubsection{Shipping and Handling as a Service} + +One approach to dealing with shipping and handling is to add it as a service. +Usually I place the unit as a dollar (USD) and then bill it as \$1 per unit. +This allows me to add the exact amount of shipping and handling as necessary. + +\subsection{Parts} + +A part is any single item you might purchase and either might resell or use in +manufacturing an assembly. It is linked to an expense/COGS +account, an income account, and an inventory account. Parts can be associated +with sales tax. + +\subsection{Assemblies and Manufacturing} + +Manufacturers order parts but they sell the products of their efforts. +Ledger-SMB supports manufacturing using the concept of assemblies. An assembly +is any product which is manufactured on site. It consists of a selection of +parts, services, and/or labor and overhead. Assemblies are treated as parts in +most other regards. + +However, one cannot order assemblies from vendors. One must instead order the +components and stock them once they are manufactured. + +%Excersize 1 + +\subsubsection{Stocking Assemblies} + +One stocks assemblies in the Stock Assembly entry on the Goods and Services +submenu. When an assembly is stocked the inventory is adjusted properly. + +The Check Inventory option will cause Ledger-SMB to refuse to stock an assembly +if the inventory required to produce the assembly would drop the part below the +reorder point. + +\subsection{Reporting} +\subsubsection{All Items and Parts Reports} + +The All Items provides a unified view of assemblies, parts, services, and labor +for the company, while the Parts report confines it to parts. + +Types of reports are: +\begin{description} +\item[Active] lists all items not marked as obsolete. +\item[On Hand] lists current inventory +\item[Short] Lists all items which are stocked below their ROP +\item[Obsolete] Lists all items which are marked as obsolete +\item[Orphaned] Lists all items which have never had a transaction associated +with them. +\end{description} + +One can also list these goods by invoice, order, or quotation. + +For best results, it is a good idea to enter some AR and AP data before running +these reports. + +\subsubsection{Requirements} + +This report is designed to assist managers determine the quantities of goods to +order and/or stock. It compares the quantity on hand with the activity in a +given time frame and provides a list of goods which need to be ordered and the +relevant quantity. + +\subsubsection{Services and Labor} +This is similar to the Parts and All Items menu but only supports active, +obsolete, and orphaned reports. + +\subsubsection{Assemblies} + +This is similar to the Parts and All Items reports but it also provides an +ability to list individual items in the assemblies as well. + +AP Invoices, Purchase Orders, and RFQ's are not available on this report. + +\subsubsection{Groups and Pricegroups} + +These reports provide a simple interface for locating groups and pricegroups. +The report types are similar to what they are for services. + +\subsection{Translations} +One can add translations so that they show up in the customer's native language +in the issued invoice. + +To issue translations, one must have languages defined. One can then add +translations to descriptions and part groups. + +\subsection{How Cost of Goods Sold is tracked} +Cost of Goods Sold is tracked on a First-In, First-out (FIFO) basis. When a +part is purchased, its cost is recorded in the database. The cost of the item +is then added to the inventory asset account. When the good is sold, the cost +of the item is moved to the cost of goods sold account. + +This means that one must actually provide invoices for all goods entered at +their actual cost. If one enters in \$0 for the cost, the cost of goods sold +will also be \$0 when the item is sold. We will cover this entire process in +more depth after we cover the AP and AR units below. + +\section{AP} +\subsection{Basic AP Concepts} +The Accounts Payable module tracks all financial commitments that the company +makes to other businesses. This includes rent, utilities, etc. as well as +orders of goods and services. + +\subsection{Vendors} +A vendor is any business that the company agrees to pay money to. + +One can enter vendor information under AP-\textgreater Vendors-\textgreater Add Vendor. The vendor list +can be searched under AP-\textgreater Vendors-\textgreater Reports-\textgreater Search. + +In older versions of Ledger-SMB, vendors would continue to populate the list of +active vendors forever and there was no way to delete them. Now one can enter +start and end-dates and this can be used to filter out vendors in searches or +drop-down boxes. + +A few fields that need explanation are: +\begin{description} +\item[BIC] Bank Identifier Code is often the same as the S.W.I.F.T. code. This +is a code for the bank a customer uses for automated money transfers. +\item[IBAN] International Bank Account Number is related to the BIC and is used +for cross-border automated money transfers. +\item[Terms] is the number of days one has to pay the invoice. +\item[Vendor Number] is automatically generated. +\end{description} + +\subsection{AP Transactions} +AP Transactions are generally used for items other than goods and services. +Utilities, rent, travel expenses, etc. could be entered in as an AP transaction. + +If the item is paid partially or in full when the transaction is entered, one +can add payments to the payment section. + +All other payments can and should be entered under cash payment (below). + +The PO Number and Order Number fields are generally used to track associations +with purchase orders sent to vendors, etc. These fields can be helpful for +adding misc. expenses to orders for reporting purposes. + +The department drop-down box appears when one has created one or more +departments. A transaction is not required to be associated with a department, +but one can use this feature for budget tracking. + +With AP Transactions, there is no option for internal notes. All notes will +appear on any printed version of the transaction. + +Note: Printing a transaction does not post it. No data is committed until the +invoice is posted. + +\subsection{AP Invoices} +AP Invoices are used to enter in the receipt of goods and services. Goods and +services are deemed entered into the inventory when they are invoiced. + +This screen is reasonably similar to the AP Transaction Screen, though the part +entry section is a bit different. + +The AP Invoice section has a capacity to separate internal notes from notes +printed on the invoice. Note, however, that since these are received invoices, +it is rare that one needs this ability. + +Note that Ledger-SMB can search for partial part numbers or descriptions. + +Also if you have a group you can use this to select the part. + +To remove a line item from an invoice or order, delete the partnumber and click +update. + +\subsubsection{Correcting an AP Invoice} +If an invoice is entered improperly, the methods used to correct it will vary +depending on whether transaction reversal is enforced or not. If transaction +reversal is not enforced, one can simply correct the invoice or transaction and +repost. + +If not, one needs to create a *duplicate* invoice with exactly opposite values +entered. If one part was listed as received, then one should enter a negative +one for the quantity. Then one can enter the invoice number as the same as the +old one (though I like to add an R to the end to show that it is a reversing +transaction). Once this is posted, one can enter the invoice correctly. + +\subsection{Cash payment And Check Printing} +In general, it is a bad idea to repost invoices/transactions just in order to +enter a payment. The Cash-\textgreater Payment window allows one to enter payments against +AP invoices or transactions. + +The printing capability can be used to print checks. The default template is +NEBS 9085, though you can use 9082 as well (as Quickbooks does). + +The source field is used to store an identifying number of the source document, +such as the check number. One must select the item to have it paid, and then +enter the amount. One can then print a check. + +\subsubsection{Rapid Payment Entry Screen} + +One can also use the rapid payment entry screen to print multiple checks. +However, this does not allow you to print the multiple checks to the screen as a +separate document is created for each check. In this event, one must print +directly to a printer as postscript. + +\subsection{Transaction/Invoice Reporting} +\subsubsection{Transactions Report} + +This report is designed to help you locate AP transactions based on various +criteria. One can search by vendor, invoice number, department, and the like. +One can even search by the shipping method. + +The summary button will show what was placed where, while the details button +will show all debits and credits associated with the transaction. + +To view the invoice, click on the invoice number. In the detail view, to view +the account transactions as a whole, click on the account number. + +Open invoices are ones not fully paid off, while paid closed invoices are those +that have been paid. + +\subsubsection{Outstanding Report} +The outstanding report is designed to help you locate AP transactions that are +not paid yet. The ID field is mostly useful for locating the specific database +record of a duplicate invoice number exists. + +\subsubsection{AP Aging Report} +This report can tell you how many invoices are past due and by how much. + +A summary report just shows vendors while a detail report shows individual +invoices. + +\subsubsection{Tax Paid and Non-taxable Report} +These reports are not generally used in the US because most of the time +wholesale goods are not taxable. However, for businesses with offices in other +countries including Canada, it is often important for them to be aware of this +functionality. In these countries, one generally pays sales tax even on +wholesale goods and then takes a tax credit for these when when paying the sales +tax to the country of province. Thus one needs to be able to track taxable and +non-taxable expenses, and how much was paid. For now, it is sufficient to know +that they are there. + +\subsection{Vendor Reporting} +\subsubsection{Vendor Search} +The Vendor Search screen can be used to locate vendors or AP transactions +associated with those vendors. + +The basic types of reports are: + +\begin{description} +\item[All] Lists all vendors +\item[Active] Lists those vendors currently active +\item[Inactive] Lists those vendors who are currently inactive. +time frame. +\item[Orphaned] Lists those vendors who do not have transactions associated with +them. These vendors can be deleted. +\end{description} + +One can include purchase orders, Requests for Quotations, AP invoices, and AP +transactions on this report as well if they occur between the from and to dates. + + +\subsubsection{Vendor History} +This report can be used to obtain information about the past goods and services +ordered or received from vendors. One can find quantities, partnumber, and +sell prices on this report. This facility can be used to search RFQ's, Purchase +Orders, and AP Invoices. + +\section{AR} +\subsection{Customers} +Customers are entered in using the AR-\textgreater Customers-\textgreater Add Customer menu. + +The salesperson is autopopulated with the current user who is logged in. +Otherwise, it looks fairly similar to the Vendor input screen. Customers, like +vendors can be assigned languages, but it is more important to do so because +invoices will be printed and sent to them. + +The credit limit field can be used to assign an amount that one is willing to do +for a customer on credit. + +\subsubsection{Customer Price Matrix} +The price list button can be used to enter specific discounts to the customer, +and groups of customers can be assigned a pricegroup for the purpose of offering +specific discounts on specific parts to the customer. Such discounts can be +temporary or permanent. + +\subsection{AR Transactions} +AR Transactions are where one can add moneys owed the business by customers. +One can associate these transactions with income accounts, and add payments if +the item is paid when the invoice is issued. + +The PO number field is used to track the PO that the customer sent. This makes +it easier to find items when a customer is asking for clarification on a bill, +for example. + +\subsection{AR Invoices} +AR Invoices are designed to provide for the delivery of goods and services to +customers. One would normally issue these invoices at the time when the +everything has been done that is necessary to get paid by the customer. + +As with AP invoices, one can search for matches to partial part numbers and +descriptions, and enter initial payments at this screen. + +\subsection{Cash Receipt} +The Cash-\textgreater Receipt screen allows you to accept prepayments from customers or pay +single or multiple invoices after they have been posted. One can print a +receipt, however the current templates seem to be based on check printing +templates and so are unsuitable for this purpose. This presents a great +opportunity for improvement. + +\subsubsection{Cash Receipts for multiple customers} +The cash-\textgreater receipts screen allows you to accept payments on all open customer +invoices of all customers at once. One could print (directly to a printer only) +all receipts to be sent out if this was desired. + +\subsection{AR Transaction Reporting} + +The AR Outstanding report is almost identical to the AP Outstanding report and +is not covered in any detail in this document. + +\subsubsection{AR Transactions Report} +This is almost identical to the AP Transactions Report. + +If a customer's PO has been associated with this transaction, one can search +under this field as well. + +\subsubsection{AR Aging Report} +This report is almost identical to the AP Aging report, with the exception that +one can print up statements for customer accounts that are overdue. One more +application is to calculate interest based on balance owed so that these can be +entered as AR transactions associated with the customer. + +\subsection{Customer Reporting} +These reports are almost identical tot he AP Vendor reports and are not +discussed in these notes. + +\section{Projects} +\subsection{Project Basics} +A project is a logical collection of AR and AP transactions, orders, and the +like that allow one to better manage specific service or product offerings. +Ledger-SMB does not offer comprehensive project management capabilities, and +projects are only used here as they relate to accounting. + +One can also add translated descriptions to the project names as well. + +\subsection{Timecards} +Timecards allow one to track time entered on specific services. These can then +be used to generate invoices for the time entered. + +The non-chargeable is the number of hours that are not billed on the invoice. + +One can then generate invoices based on this information. + +The project field is not optional. + +\subsection{Projects and Invoices} +One can select the project id for line items of both AR and AP invoices. These +will then be tracked against the project itself. + +\subsection{Reporting} +\subsubsection{Timecard Reporting} + +The Timecard Report allows one to search for timecards associated with one or +more projects. One can then use the total time in issuing invoices (this is not +automated yet). + +\subsubsection{Project Transaction Reporting} + +The Standard or GIFI options can be used to create different reports (for +example, for Canadian Tax reporting purposes). + +This report brings up a summary that looks sort of like a chart of accounts. Of +one clicks on the account numbers, one can see the transactions associated with +the project. + +\subsubsection{List of Projects} + +This provides a simple way of searching for projects to edit or modify. + +\subsection{Possibilities for Using Projects} +\begin{itemize} +\item One can use them similar to departments for tracking work done for a +variety of customers. +\item One can use them for customer-specific projects, such as this training. +\end{itemize} +\section{Quotations and Order Management} + +This unit will introduce the business processes that Ledger-SMB allows. These +processes are designed to allow various types of businesses to manage their +orders allow for rudimentary customer relationship management processes to be +built around this software. In this module, we will introduce the work flow +options that many businesses may use in their day-to-day use of the software. + +\subsection{Sales Orders} +Sales orders represent orders from customers that have not been delivered or +shipped yet. These orders can be for work in the future, or for back ordered +products, or work in progress. A sales order can be generated form an AR +invoice or from a quotation automatically. + +\subsection{Quotations} +Quotations are offers made to a customer but to which the customer has not +committed to the work. Quotations can be created from Sales orders or AR +Invoice automatically. + +\subsection{Shipping} +The Shipping module (Shipping-\textgreater Shipping) allows one to ship portions or +entireties of existing sales orders, printing pick lists and packing slips. + +One can then generate invoices for those parts that were shipped. + +In general, one will be more likely to use these features if they have multiple +warehouses that they ship from. More likely most customers will just generate +invoices from orders. + +\subsection{AR Work Flow} +\subsubsection{Service Example} + +A customer contacts your firm and asks for a quote on some services. Your +company would create a quotation for the job and email it to the customer or +print it and mail it. Once the customer agrees to pay, one creates an order +from the quotation. + +When the work is completed, the order is converted into a sales invoice and this +is presented to the customer as a bill. + +Note that in some cases, this procedure may be shortened. If the customer +places an order without asking for a quotation and is offered a verbal quote, +then one might merely prepare the order. + +\begin{figure}[hbtp] +\caption{Simple AR Service Invoice Workflow Example} +\input{simple_ar_dataflow} +\end{figure} + +\subsubsection{Single Warehouse Example} + +A customer contacts your firm and asks for a quotation for shipping a part. You +would create the quotation and when you get confirmation, convert it to an +order. Once the parts are in place you could go to shipping and ship the part. + +The billing department can then generate the invoice from the sales order based +on what merchandise has been shipped and mail it to the customer. + +Note that this requires that you have the part in your inventory. + +\begin{figure}[hbtp] +\caption{AR Workflow with Shipping} +\input{ar_workflow_ship} +\end{figure} + +\subsubsection{Multiple Warehouse Example} +A customer contacts your firm and asks for a quotation for a number of different +parts. You would create a quotation and when you get confirmation, convert it +to an order. When you go to ship the item, you would select the warehouse in +the drop-down menu, and select the parts to ship. One would repeat with other +warehouses until the entire order is shipped. + +Then the billing department would go to the sales order and generate the +invoice. It would then be mailed to the customer. + +\begin{figure}[hbtp] +\caption{Complex AR Workflow with Shipping} +\input{ar_workflow_complex} +\end{figure} + +\subsection{Requests for Quotation (RFQ)} +A request for quotation would be a formal document one might submit to a vendor +to ask for a quote on a product or service they might offer. These can be +generated from Purchase Orders or AP Invoices + +\subsection{Purchase Orders} +A purchase order is a confirmation that is issued to the vendor to order the +product of service. Many businesses will require a purchase order with certain +terms in order to begin work on a product. These can be generated from RFQ's or +AP Invoices. + +\subsection{Receiving} + +The Shipping-\textgreater Receiving screen allows you to track the parts +received from an existing purchase order. Like shipping, it does not post an +invoice but tracks the received parts in the order. + +\subsection{AP Work Flow} +\subsubsection{Bookkeeper entering the received items, order completed in full} + +Your company inquires about the price of a given good or service from another +firm. You submit an RFQ to the vendor, and finding that the price is +reasonable, you convert it to an order, adjust the price to what they have +quoted, and save it. When the goods are delivered you convert the +order into an AP invoice and post it. + + +\begin{figure}[hbtp] +\caption{Simple AP Workflow} +\input{simple_ap_workflow} +\end{figure} + +\subsubsection{Bookkeeper entering received items, order completed in part} + +Your company inquires about the price of a given good or service from another +firm, You submit an RFQ to the vendor, and finding that the price is +acceptable, you convert it into an order, adjusting the price to what they have +quoted, and save it. When some of the goods are received, you open up the +purchase order, enter the number of parts received, convert that order into +an invoice, and post it. Repeat until all parts are received. + +\begin{figure}[hbtp] +\caption{AP Workflow with Receiving} +\input{ap_workflow_ship} +\end{figure} + +\subsubsection{Receiving staff entering items} + +Your company inquires about the price of a given good or service from another +firm, You submit an RFQ to the vendor, and finding that the price is +acceptable, you convert it into an order, adjusting the price to what they have +quoted, and save it. When some or all of the goods are received, the receiving +staff goes Shipping-Receiving, locates the purchase order, and fills in the +number of items received. + +The bookkeeper can then determine when all items have been received and post the +invoice at that time. + +\begin{figure}[hbtp] +\caption{Complex AP Workflow} +\input{ap_workflow_complex} +\end{figure} + +\subsection{Generation and Consolidation} +\subsubsection{Generation} +The Generation screen allows you to generate Purchase Orders based on sales +orders. One selects the sales orders one wants to use, and clicks "Generate +Purchase Orders." Then one selects clicks on the parts to order, adjusts the +quantity if necessary, and clicks "Select Vendor." This process is repeated +for every vendor required. Then the Generate Orders button is clicked. + +\subsubsection{Consolidation} +One can consolidate sales and/or purchase orders using this screen. For the +consolidation to work you must have more than one order associated with the +relevant customer or vendor. + +\subsection{Reporting} +The reporting functionality in the order management is largely limited to the +ability to locate purchase orders, sales orders, RFQ's, and quotations. + +\subsection{Shipping Module: Transferring Inventory between Warehouses} +One can transfer inventory between warehouses if necessary by using the +Shipping-\textgreater Transfer Inventory screen. + +\section{HR} +The HR module is currently limited to tracking employees for and their start and +end dates. It has very little other functionality. One could build payroll +systems that could integrate with it however. + +\section{POS} + +The Point of Sale screen is still fairly rudimentary, and it is one of the least +mature aspects of Ledger-SMB. It is suitable for small retail environments at +the moment but not much else. + +\subsection{Sales Screen} +The sales screen looks very much like a normal invoice entry screen with a few +differences. + +\begin{itemize} +\item The discount text field is not available, nor is the unit field.. +\item The next part number is automatically focused when the data loads for +rapid data entry. +\item Hot keys for the buttons are Alt-U for update, Alt-P for print, Alt-O for +post, and Alt-R for print and post. +\item Part Groups appear at the bottom of the screen. +\end{itemize} + +\subsection{Possibilities for Data Entry} +\begin{itemize} +\item Barcode scanners can be used to scan items in as they are being rung in. +\item One could use touch screens, though this would ideally require some custom +stylesheets to make it efficient. +\end{itemize} + +\subsection{Hardware Support} +As Ledger-SMB is a web-based application, the web browser usually does not allow +the page to write to arbitrary files. Therefore hardware support for pole +displays, etc. is not readily possible from the application itself. In some +cases, there are add-on packages (such as SL-POS) which offer some additional +hardware options via simple additional networking programs. + +Notes for specific types of hardware are as follows: + +\begin{description} +\item[Touch screens:] The default stylesheet is not really usable from a +touchscreen as the items are often too small. One would need to modify the +stylesheets to ensure that the relevant items would be reasonable. Setting down +the resolution would also help. +\item[Receipt Printers:] ESC/POS printers generally work in text mode. Control +sequences can be embedded in the template as necessary. +\item[Pole Displays:] Generally are unsupported in Ledger-SMB without add-on +patches and special network clients. +\item[Cash Drawers:] These should be attached to the printer. The control codes +can then be embedded in the invoices so that the drawer opens whenever an +invoice is printed. +\item[Barcode Scanners:] Most customers use decoded barcode scanners through a +keyboard wedge interface. This allows them to scan items as if they were typing +them on the keyboard. +\end{description} + +\subsection{Reports} +\subsubsection{Open Invoices} +The POS-\textgreater Open screen allows one to find any POS receipts that are +not entirely paid off. + +\subsubsection{Receipts} +The POS-\textgreater Receipts screen allows one to bring up a basic record of +the POS terminals. It is not sufficient for closing the till, however, though +it may help for reconciliation. + +The till column is the last component or octet of the terminal's IP address. +Therefore it is a good idea to try to avoid having IP addresses where the last +octet is the same. + +All entries are grouped by date and source in this report. + +\section{General Ledger} +\subsection{GL Basics} + +The General Ledger is the heart of Ledger-SMB. Indeed, Ledger-SMB is designed +to be as close as possible to a software equivalent of a paper-based accounting +program (but with no difference between the General Ledger and General Journal). + +\subsubsection{Paper-based accounting systems and the GL} + +In order to understand the principle of the General Ledger, one must have a +basic understanding of the general process of bookkeeping using double-entry +paper-based accounting systems. + +Normally when a transaction would be recorded, it would first be recorded in the +"General Journal" which would contain detailed information about the +transaction, notes, etc. Then the entries from the General Journal would be +transcribed to the General Ledger, where one could keep closer tabs on what was +going on in each account. + +In the general journal, all transactions are listed chronologically with +whatever commentary is deemed necessary, while in +the general ledger each account has its own page and transactions are recorded +in a simple and terse manner. The General Journal is the first place the +transaction is recorded and the General Ledger is the last. + +At the end of the accounting period, the GL transactions would be summarized +into a trial balance and this would be used for creating financial statements +and closing the books at the end of the year. + +\subsubsection{Double Entry Examples on Paper} + +Let us say that John starts his business with an initial investment of \$10,000. + +This is recorded in the General Journal as follows (in this example, suppose it +is page 1): + +\begin{tabular}{|l|l|l|r|r|} +\hline +Date & Accounts and Explanation & Ref & DEBIT & CREDIT \\ +\hline +March 1 & Checking Account & 1060 & 10000.00 & \\ + & John Doe Capital & 3011 & & 10000.00\\ + & John Doe began a business & & & \\ + & with an investment of & & & \\ + & \$10000 & & & \\ +\hline +\end{tabular}\medskip + +This would then be transcribed into two pages of the General Ledger. The first +page might be the Checking Account page:\medskip + +\begin{tabular}{|l|l|l|r|l|l|l|r|} +\hline +DATE & EXPLANATION & REF. & DEBITS & DATE & EXPLANATION & REF. & CREDITS\\ +\hline +March 1 & & J1 & 10000.00 & & & & \\ +\hline +\end{tabular}\medskip + +On the John Doe Capital page, we would add a similar entry:\medskip + +\begin{tabular}{|l|l|l|r|l|l|l|r|} +\hline +DATE & EXPLANATION & REF. & DEBITS & DATE & EXPLANATION & REF. & CREDITS\\ +\hline + & & & & March 1 & & J1 & 10000.00\\ +\hline +\end{tabular}\medskip + +\subsubsection{The GL in Ledger-SMB} + +The paper-based accounting procedure works well when one is stuck with paper +recording requirements but it has one serious deficiency--- all of this +transcribing creates an opportunity for errors. + +Relational databases relieve the need for such transcription as it is possible +to store everything physically in a way similar to the way a General Journal is +used in the paper-based systems and then present the same information in ways +which are more closely related to the General Ledger book. + +This is the exact way that the General Ledger is used in Ledger-SMB. The actual +data is entered and stored as if it was a general journal, and then the data can +be presented in any number of different ways. + +All modules of Ledger-SMB that involve COA accounts store their data in the +General Ledger (it is a little more complex than this but this is very close to +the actual mechanism). + +\subsection{Cash Transfer} +The simplest form of GL entry in Ledger-SMB is the Cash-\textgreater Transfer +screen. This screen shows two transaction lines, and fields for reference, +department, description, and notes. + +The field descriptions are as follows: + +\begin{description} +\item[Reference] refers to the source document for the transfer. One can use +transfer sheets, bank receipt numbers, etc for this field. +\item[Description] is optional but really should be filled in. It ought to be a +description of the transaction. +\item[Notes] provide supplemental information for the transaction. +\item[FX] indicates whether foreign exchange is a factor in this transaction. +\item[Debit] indicates money going {\bf into} the asset account. +\item[Credit] indicates money coming {\bf out} of the asset account. +\item[Source] is the source document for that portion of the transaction. +\item[Memo] lists additional information as necessary +\item[Project] allows you to assign this line to a project. +\end{description} + +The credit and debit options seem to be the opposite of what one would think o +concerning one's bank account. The reason is that credits and debits are +recorded so as to balance any money that may be invested in or withdrawn from +the business. A debit to an asset account will be credited when money is +withdrawn from the business, for example. + +Also note that in this screen, when an item is updated, it will reduce the +number of lines to those already filled in plus an extra line for the new line +in the data entry. + +\subsection{GL Transactions} + +The GL Transaction screen (General Ledger-\textgreater Add Transaction) is +identical to the Cash Transfer screen with the exception that it starts with +nine instead of two lines. Otherwise, they are identical. + +Again, one must be careful with debits and credits. Often it is easy to get +confused. It is generally worth while to go back to the principle that one +tracks them with regard to their impact on the equity accounts. So expenses are +credits because they debit the equity accounts, and income is a debit because it +credits the retained earning equity account. + +\subsection{Payroll as a GL transaction} + +Currently payroll must be done as a GL transaction. The attempts to create a +payroll system that would ship with SL have largely stalled. + +Most customers running their businesses will have an idea of how to do this. + +\begin{figure}[hbtp] +\caption{Payroll as a GL Transaction (Purely fictitious numbers)} +\begin{tabular}{|l|r|r|} +\hline +Account & Debit & Credit \\ +5101 Wages and Salaries & 500 & \\ +2032 Accrued Wages & & 450 \\ +2033 Fed. Income Tax wthd & & 30 \\ +2034 State Inc. Tax. wthd & & 15 \\ +2035 Social Security wthd & & 3 \\ +2036 Medicare wthd & & 2 \\ +2032 Accrued Wages & 450 & \\ +1060 Checking Acct & & 450 \\ +\hline +\end{tabular} +\end{figure} + + +\subsection{Reconciliation} + +To reconcile an account (say, when one would get a checking account statement), +one would go to cash/reconciliation, and check off the items that have cleared. +One can then attempt to determine where any errors lie by comparing the total on +the statement with the total that SL generates. + +This can be done for other accounts too, such as petty cash.\footnote{Petty cash +denotes a drawer of cash that is used to pay small expenses. When an expense is +paid, it is recorded on a slip of paper that is stored for reconciliation +purposes.} + +\subsection{Reports} + +The most flexible report in Ledger-SMB is the GL report because it has access to +the entire set of financial transactions of a business. Every invoice posted, +payment made or received, etc. can be located here. + +The search criteria include: + +\begin{description} +\item[Reference] is the invoice number, or other reference number associated +with the transaction. +\item[Source] is the field related to the source document number in a payment or +other transaction.\footnote{Source documents are things like receipts, canceled +checks, etc. that can be used to verify the existence and nature of a +transaction.} +\item[Memo] relates to the memo field on a payment +\item[Department] can be used to filter results by department. +\item[Account Type] can be used to filter results by type of account (Asset, +Liability, etc.) +\item[Description] can be used to filter out by GL description or by +customer/vendor name. +\end{description} + +The actual format of the report looks more like what one would expect in a paper +accounting system's general journal than a general ledger per se. A +presentation of the data that is more like the paper general ledger is found in +the Chart of Accounts report. + +\subsubsection{GL as access to almost everything else} + +The GL reports can be used to do all manner of things. One can determine, for +example, which AP invoice or transaction was paid with a certain check number, +which invoice by a specific customer was paid by a specific check number. + +\section{Recurring Transactions} +Any transaction or invoice may be repeated a number of times in regular +intervals. To schedule any GL, AR, or AP transaction or invoice, click the +schedule button. + +In general the reference number should be left blank as this will force +Ledger-SMB to create a new invoice or transaction number for each iteration. +The rest of the options are self-explanatory. Note that a blank number if +iterations will result in no recurrences of the transaction. + +To process the recurring transactions, click on the Recurring Transactions +option on the main menu select the ones you want to process and click "Process +Transactions." + +\section{Financial Statements and Reports} +Financial statements and reports are a very important part of any accounting +system. Accountants and businesspeople rely on these reports to determine the +financial soundness of the business and its prospects for the next accounting +period. + +\subsection{Cash v. Accrual Basis} +Financial statements, such as the Income Statement and Balance Sheet can be +prepared either on a cash or accrual basis. In cash-basis accounting, the +income is deemed earned when the customer pays it, and the expenses are deemed +incurred when the business pays them. + +There are a number of issues with cash-basis accounting from a business point of +view. The most extreme is that one can misrepresent the wellbeing of a business +by paying a large expense after a deadline. Thus cash-basis accounting does not +allow one to accurately pair the income with the related expense as these are +recorded at different times. If one cannot accurately pair the income with the +related expense, then financial statements cannot be guaranteed to tell one much +of anything about the well-being of the business. + +In accrual basis accounting, income is considered earned when the invoice is +posted, +and expenses are considered incurred at the time when the goods or services are +delivered to the business. This way, one can pair the income made from the sale +of a product with the expense incurred in bringing that product to sale. This +pairing allows for greater confidence in business reporting. + +\subsection{Viewing the Chart of Accounts and Transactions} +The Reports--\textgreater Chart of Accounts will provide the chart of accounts +along with current totals in each account. + +If you click on an account number, you will get a screen that allows you to +filter out transactions in that account by various criteria. One can also +include AR/AP, and Subtotal in the report. + +The report format is similar to that of a paper-based general ledger, + +\subsection{Trial Balance} +\subsubsection{The Paper-based function of a Trial Balance} +In paper-based accounting systems, the accountant at the end of the year would +total up the debits and credits in every account and transfer them onto another +sheet called the trial balance. The accountant would check to determine that +the total debits and credits were equal and would then transfer this information +onto the financial statements. It was called a trial balance because it was the +main step at which the error-detection capabilities of double-entry accounting +systems were used. + +\subsubsection{Running the Trial Balance Report} +This report is located under Reports --\textgreater Trial Balance. One can +filter out items by date, accounting period, or department. One can run the +report by accounts or using GIFI classifications to group accounts together. + +From this report, you can click on the account number and see all transactions +on the trial balance as well as whether or not they have been reconciled. + +\subsubsection{What if the Trial Balance doesn't Balance?} +If the trial balance does not balance, get technical support immediately. This +usually means that transactions were not entered properly. Some may have been +out of balance, or some may have gone into non-existent accounts (believe it or +not, Ledger-SMB does not check this latter issue). + +\subsubsection{Trial Balance as a Summary of Account Activity} +The trial balance offers a glance at the total activity in every account. It +can provide a useful look at financial activity at a glance for the entire +business. + +\subsubsection{Trial Balance as a Budget Planning Tool} +By filtering out departments, one can determine what a department earned and +spent during a given financial interval. This can be used in preparing budgets +for the next accounting period. + +\subsection{Income Statement} +The Income Statement is another tool that can be used to assist with budgetary +planning as well as provide information on the financial health of a business. + +The report is run from Reports--\textgreater Income Statement. The report +preparation screen shows the following fields: + +\begin{description} +\item[Department] allows you to run reports for individual departments. This is +useful for budgetary purposes. +\item[Project] allows you to run reports on individual projects. This can show +how profitable a given project was during a given time period. +\item[From and To] allow you to select arbitrary from and to dates. +\item[Period] allows you to specify a standard accounting period. +\item[Compare to fields] allow you to run a second report for comparison +purposes for a separate range of dates or accounting period. +\item[Decimalplaces] allows you to display numbers to a given precision. +\item[Method] allows you to select between accrual and cash basis reports. +\item[Include in Report] provides various options for reporting. +\item[Accounts] allows you to run GIFI reports instead of the standard ones. +\end{description} + +The report shows all income and expense accounts with activity during the period +when the report is run, the balances accrued during the period, as well as the +total income and expense at the bottom of each section. The total expense is +subtracted from the total income to provide the net income during the period. +If there is a loss, it appears in parentheses. + +\subsubsection{Uses of an Income Statement} +The income statement provides a basic snapshot of the overall ability of the +business to make money. It is one of the basic accounting statements and is +required, for example, on many SEC forms for publicly traded firms. + +Additionally, businessmen use the income statement to look at overall trends in +the ability of the business to make money. One can compare a given month, +quarter, or year with a year prior to look for trends so that one can make +adjustments in order to maximize profit. + +Finally, these reports can be used to provide a look at each department's +performance and their ability to work within their budget. One can compare a +department or project's performance to a year prior and look for patterns that +can indicate problems or opportunities that need to be addressed. + +\subsection{Balance Sheet} +The balance sheet is the second major accounting statement supported by +Ledger-SMB. The balance sheet provides a snapshot of the current financial +health of the business by comparing assets, liabilities, and equity. + +In essence the balance sheet is a statement of the current state of owner +equity. Traditionally, it does not track changes in owner equity in the same +way the Statement of Owner Equity does. + +The Balance Sheet report preparation screen is much simpler than the Income +Statement screen. Balance sheets don't apply to projects, but they do apply to +departments. Also, unlike an income statement, a balance sheet is fixed for a +specific date in time. Therefore one does not need to select a period. + +The fields in creating a balance sheet are: + +\begin{description} +\item[Department] allows you to run separate balance sheets for each department. +\item[As at] specifies the date. If blank this will be the current date. +\item[Compare to] specifies the date to compare the balance sheet to. +\item[Decimalplaces] specifies the number of decimal places to use. +\item[Method] selects between cash and accrual basis. +\item[Include in report] allows you to select supplemental information on the +report. +\item[Accounts] allows you to select between standard and GIFI reports. +\end{description} + +The balance sheet lists all asset, liability, and equity accounts with a +balance. Each category has a total listed, and the total of the equity and +liability accounts is also listed. + +The total assets should be equal to the sum of the totals of the liability and +equity accounts. + +\subsection{What if the Balance Sheet doesn't balance?} + +Get technical support immediately, This may indicate that out of balance +transactions were entered or that transactions did not post properly. + +\subsection{No Statement of Owner Equity?} + +The Statement of Owner Equity is the one accounting statement that Ledger-SMB +does not support. However, it can be simulated by running a balance sheet at +the end of the time frame in question and comparing it to the beginning. One +can check this against an income statement for the period in question to verify +its accuracy. The statement of owner equity is not as commonly used now as it +once was. + +\section{The Template System} +Ledger-SMB allows most documents to be generated according to a template system. +This allows financial statements, invoices, orders, and the like to be +customized to meet the needs of most businesses. Company logos can be inserted, +the format can be radically altered, one can print letters to be included with +checks to vendors instead of the checks themselves, and the like. In the end, +there is very little that cannot be accomplished regarding modification of these +documents with the template system. + +One can define different templates for different languages, so that a customer +in Spain gets a different invoice than a customer in Canada. + +\subsection{Text Templates} +The only template that uses a text-only format is the POS receipt. This example +provides the simplest way to understand the template system. + +The first two lines are:\\ +\textless\%company align=center width=40\%\textgreater\\ +\textless\%address align=center width=40\%\textgreater\\ + +The first line tells Ledger-SMB to print the company name as passed to it via a +variable, centered, with a page width of 40 characters. The second line does +the same thing with the address. + +These variables are usually passed to the invoice using form fields (hidden or +otherwise) in the submitting web page. The printing script, however, can +disable some of these fields or add others via database lookups and the like. + +In all types of templates, variable substitution occurs between \textless\% and +\%\textgreater. One can optionally specify an alignment or a width but these +are really only useful in text templates. + +\subsection{HTML Templates} +The following templates exist in HTML format: + +\begin{itemize} +\item Income Statement +\item Balance Sheet +\item Invoice (AR) +\item AR Transaction +\item AP Transaction +\item Packing List +\item Pick List +\item Sales Order +\item Work Order +\item Purchase Order +\item Bin List +\item Statement +\item Quotation +\item RFQ +\item Time Card +\end{itemize} + +These templates can be edited by an HTML editor. However, it is generally +recommended that one back up templates first. The reason is that some HTML +editors will fully re-parse the HTML and save it back without what they see as +invalid tags. Most editors, however, will save the variable substitution tags +because similar tags are also used by Microsoft's active server pages. + +Finally, some editors are known to mangle formatting, so many problems can be +avoided by ensuring that one has a backup of the templates, especially if they +have already been customized. + +\subsection{\LaTeX\ Templates} +The following templates, by default, are available in \LaTeX\ : + +\begin{itemize} +\item Invoice +\item AR Transaction +\item AP Transaction +\item Packing List +\item Pick List +\item Sales Order +\item Work Order +\item Purchase Order +\item Bin List +\item Statement +\item Check +\item Receipt +\item Quotation +\item RFQ +\item Time Card +\end{itemize} + +\LaTeX\ templates allow one to generate PDF and postscript documents and print +directly to a postscript-enabled printer or print software (like CUPS). + +\LaTeX\ templates can be edited using a standard text editor (like vim or emacs), +or using a synchronous \LaTeX\ implementation such as LyX. + +\subsubsection{What is \LaTeX\ ?} +\LaTeX\ (pronounced LAY-tech) is an extension on the \TeX\ typesetting system. It +largely consists of a set of macros that allow one to focus on the structure of +the document while letting the \TeX\ engine do the heavy lifting in terms of +determining the optimal formatting for the page. \LaTeX\ is used in a large +number of academic journals (including those of the American Mathematics +Association). It is available at \url{http://www.tug.org}. + +Like HTML, \LaTeX\ uses plain text documents to store the formatting information +and then when the document is rendered, attempts to fit it onto a page. \LaTeX\ +supports the concept of stylesheets, allowing one to separate content from +format, and this feature is used in many higher-end applications, like journal +publication. + +Unlike HTML, \LaTeX\ is a complete though simple programming language that allows +one to redefine internals of the system for formatting purposes. + +This document is written in \LaTeX. + +\subsubsection{Using LyX to Edit \LaTeX\ Templates} +LyX is a synchronous \LaTeX\ editor that runs on Windows, UNIX/Linux, and +Mac OS X. It requires an installed \LaTeX-2e implementation and can be obtained +at \url{http://www.lyx.org}. Like the most common \LaTeX\ implementations, it is +open source. + +In \LaTeX, the \% sign is used to begin a comment. Therefore in order to edit +the documents effectively, you must convert the \% signs into another character +combination, such as @@@. This can be done with a sed script such as:\\ +sed -e "s$\vert$\%$\vert$@@@$\vert$ig" template.tex \textgreater\ +template-edit.tex \\ +Then when you are done:\\ +sed -e "$\vert$@@@$\vert$\%$\vert$ig" template-edit.tex \textgreater\ +template.tex + +One can edit the template-edit.tex without worrying about LyX disregarding lines +when it encounters a \%. + +\subsection{Customizing Logos} +\LaTeX\ requires different formats of logos depending on whether the document is +going to be generated as a PDF or as postscript. Postscript requires an +embedded postscript graphic, while PDF requires any type of graphic other than +embedded postscript. Usually one uses a PNG's for PDF's, though GIF's could be +used as well. The logo for a \LaTeX\ document resides in the users directory. + +HTML documents can have logos in many different formats. PNG's are generally +preferred for printing reasons. The image can be stored anywhere and merely +referenced in the HTML. + +Note: Always test the an invoice with an image on it to ensure that the rest of +the page format is not thrown off by it. + +\subsection{How are They Stored in the Filesystem?} +The template directory ("templates" in the root Ledger-SMB install directory) +contains all the root templates used by Ledger-SMB. These follow a naming +convention of COAType-templatename.ext where COAType is the type of dataset that +was created when the user was created, templatename is the name of the template, +and ext is either txt, html, or tex (for text, html, and \LaTeX\ respectively). + +Inside this directory are one or more subdirectories where the relevant +templates have been copied as default language templates for the user. Many +users can use the same user directory (which bears the name of the Ledger-SMB +username). Within this directory are more subdirectories for translated +templates, one for each language created. + +\subsection{Upgrade Issues} +When Ledger-SMB is upgraded, the templates are not replaced. This is designed +to prevent the upgrade script from overwriting changes made during the course of +customizing the templates. + +Occasionally, however, the data model changes in a way which can cause the +templates to stop printing certain information. When information that was +showing up before an upgrade stops showing up, one can either upgrade the +templates by copying the source template over the existing one, or one can edit +the template to make the change. + +\clearpage +\part{Technical Overview} +\section{Basic Architecture} + +Ledger-SMB is a web-based Perl program that interfaces with PostgreSQL using the +relevant Perl modules. The code is well partitioned, and the main operation +modules are written in an object oriented way. + +\subsection{The Software Stack} + +\begin{figure}[hbtp] +\label{fig-sl-stack} +\input{sl-stack.latex} +\caption{The Ledger-SMB software stack in a Typical Implementation} +\end{figure} + +Ledger-SMB runs in a Perl interpreter. I do not currently know if it is +possible to run it with Perl2C or other language converters to run in other +environments. However, except for high-capacity environments, Perl is a good +language choice for this sort of program. + +Ledger-SMB used to support DB2 and Oracle as well as PostgreSQL. However, +currently some of the functionality is implemented using PostgreSQL user-defined +functions. These would need to be ported to other database managers in order to +make the software work on these. It should not be too hard, but the fact that +it has not been done yet may mean that there is no real demand for running the +software under other RDBMS's. + +One can substitute other web servers for Apache. Normally Ledger-SMB is run as +a CGI program but it may be possible to run it in the web server process (note +that this may not be entirely thread-safe). + +The operating system can be any that supports a web server and Perl (since +PostgreSQL need not run on the same system). However, there are a few issues +running Ledger-SMB on Windows (most notably in trying to get Postscript +documents to print properly). + +On the client side, any web-browser will work. Currently, the layout is +different for Lynx (which doesn't support frames), and the layout is not really +useful under eLinks (the replacement for Lynx which does support frames). Some +functionality requires Javascript to work properly, though the application is +usable without these features. + +\subsection{Capacity Planning} +Some companies may ask how scalable Ledger-SMB is. In general, it is assumed +that few companies are going to have a need for a high-concurrency accounting +system. However, with all the features available in Ledger-SMB, the staff that +may have access to some of the application may be high enough to make the +question worthwhile. + +This question also becomes more important when companies might look at +integrating Ledger-SMB with a CRM solution, online store, or other environment. +This section looks at a number of the known issues and their solutions. + +\subsubsection{Scalability Strategies} +As Ledger-SMB is a fairly standard web-based application. However, sometimes +during upgrades, the database schema changes. In these cases, it becomes +impossible to use different versions of the software against the same database +version safely. Ledger-SMB checks the version of the database and if the +version is higher than the version of the software that is running, will refuse +to run. + +Therefore although one strategy might be to run several front-end web servers +with Ledger-SMB, in reality this can be a bit of a problem. One solution is to +take half of the front-end servers off-line while doing the initial upgrade, and +then take the other offline to upgrade when these are brought back online. + +The database manager is less scalable in the sense that one cannot just add more +database servers and expect to carry on as normal. However, aside from the +known issues listed below, there are few performance issues with it. If +complex reports are necessary, these can be moved to a replica database +(perhaps using Slony-I). + +If this solution is insufficient for database scalability, one might be able to +move staff who do not need real-time access to new entries onto a +PG-Pool/Slony-I cluster where new transactions are entered on the master and +other data is looked up on the replica. In certain circumstances, one can also +offload a number of other queries from the master database in order to minimize +the load. Ledger-SMB has very few issues in the scalability of the application. + +\subsubsection{Database Maintenance} +PostgreSQL uses a technique called Multi-version Concurrency Control (MVCC) to +provide a snapshot of the database at the beginning of a statement or +transaction (depending on the transaction isolation level). When a row is +updated, PostgreSQL leaves the old row in the database, and inserts a new +version of that row into the table. Over time, unless those old rows are +removed, performance can degrade as PostgreSQL has to search through all the old +versions of the row in order to determine which one ought to be the current one. + +Due to the way the SQL statements are executed in Ledger-SMB, most inserts will +also create a dead row. + +A second problem occurs in that each transaction is given a transaction id. +These id's are numbered using 32-bit integers. If the transaction id wraps +around (prior to 8.1), data from transactions that appear (due to the +wraparound) to be in the +future suddenly becomes inaccessible. This problem was corrected in PostgreSQL +8.1, where the database will refuse to accept new transactions if the +transaction ID gets too close to a wraparound. So while the problem is not as +serious in 8.1, the application merely becomes inaccessible rather than +displaying apparent data loss. Wraparound would occur after +about a billion transactions between all databases running on that instance of +PostgreSQL. + +Prior to 8.1, the main way to prevent both these problems was to run a periodic +vacuumdb command from cron (UNIX/Linux) or the task scheduler (Windows). In +8.1 or later, autovacuum capabilities are part of the back-end and can be +configured with the database manager. See the PostgreSQL documentation for +treatment of these subjects. + +In general, if performance appears to be slowly degrading, one should try to run +vacuumdb -z from the shell in order to attempt to reclaim space and +provide the planner with accurate information about the size and composition of +the tables. If this fails, then one can go to other methods of determining the +bottleneck and what to do about it. + +\subsubsection{Known issues} +The PostgreSQL planner assumes a minimum page size of ten pages for a physically +empty table. The reasoning behind this choice is that a table could grow +rapidly and one could end up with bad database performance if the planner +assumes a very small table. + +However, if you end up with joins between a very large table with millions of +rows and a physically empty table, one can end up with a very bad query plan. +In this case, the planner will choose a nested loop join and run through this +loop for every row in the large table. As a result, performance will suddenly +drop once the large table becomes too large to effectively do index scans of the +join criteria on both tables. This problem most often occurs when people have +no warehouses, departments, or projects defined and are running systems with a +large number of transactions (such as a point of sale environment). + +Last time I saw this problem, the server would wait for thirty seconds to +display a new point of sale screen while the server CPU activity would spike to +100\%. + +One solution is to define one warehouse, department, and project, and then run +vacuumdb -z from the shell to force the planner to acknowledge these tables as +single-row tables. The other option is to go into the source code and edit the +database queries to omit unused tables. + +\section{Customization Possibilities} +Ledger-SMB is designed to be customized relatively easily and rapidly. In +general, the source code is well written and compartmentalized. This section +covers the basic possibilities involving customization. + +\subsection{Brief Guide to the Source Code} +Ledger-SMB is an application with over 34000 lines of code. While it is not +possible to cover the entire application here, a brief overview of the source +code is in order. + +In the root of the install directory, one will find a setup.pl program, a number +of other .pl programs, and a number of directories. The setup.pl program is +used to update or install Ledger-SMB. The other .pl programs provide a basic +set of services for the framework (including authentication) and then pass the +work on to the data entry screen file in the bin directory. + +The bin directory contains another directory for each terminal type. The main +two offered are lynx and mozilla. Lynx would be used for web browsers that do +not support frames and is ideal for a text-mode VGA terminal. Mozilla is the +terminal type used for most other web browsers. The perl files within these +directories provides the user interface of the software. + +The css directory in the root install directory contains CSS documents to +provide various stylesheets one can select for changing various aspects of the +look and feel of the application. + +The locale directory contains translation files that Ledger-SMB uses to +translate between different languages. One could add translations to these +files if necessary. + +The SL directory is where the Perl modules reside that provide the core business +logic in Ledger-SMB. These modules provide functionality such as form handling, +email capabilities, and access to the database through its at least partially +object oriented API. + +Finally, the sql directory provides the database schemas and upgrade scripts. + +\subsection{Data Entry Screens} + +One can customize the data entry screens to optimize work flow, display +additional information, etc. + +\subsubsection{Examples} + +We set up hot keys for payment lines, automatically focused +the keyboard on the last partnumber field, removed separate print and post +buttons to ensure that invoices were always printed and posted together, and +removed the ability to print to the screen, and even the ability to scan items +in when an invoice was received (using a portable data terminal) and import this +data into Ledger-SMB. Finally we added the ability to reconcile the till online +in a paperless manner. + +For another customer, we added the ability to print AR invoices in plain text +format and added templates (based on the POS sales template) to do this. + +\subsection{Extensions} +One can add functionality to the Perl modules in the SL directory and often add +missing functions easily. + +\subsubsection{Examples} +For one customer, we added a module to take data from a portable data terminal +collected when inventory items were taken and use that to add shrinkage and loss +adjustments. We also extended the parts model to add a check id flag (for +alcohol sales) and added this flag to the user interface. + +For another customer, we added a complex invoice/packing slip tracking system +that allowed one to track all the printed documents associated with an order or +invoice. + +\subsection{Templates} +As noted before templates can be modified or extended, though sometimes this +involves extending the user interface scripts. Most templates are easy enough +to modify. +\subsubsection{Examples} +For one customer we added text-only invoices for AR and AP +transactions/Invoices and an ability to use Javascript in them to automatically +print them on load. + +\subsection{Reports} +The fact that all the data is available within the database manager is a huge +advantage of Ledger-SMB over Quickbooks and the like. The rapid development of +reports allows for one to easily develop reports of any sort within Ledger-SMB. + +\subsubsection{Examples} +For one customer, we developed a report of parts sold and received during +arbitrary time frames. The report allows one to go back and look up the invoices +involved. + +\section{Integration Possibilities} +An open database system and programming API allows for many types of +integration. There are some challenges, but in the end, one can integrate a +large number of tools. + +\subsection{Reporting Tools} +Any reporting tool which can access the PostgreSQL database can be used with +Ledger-SMB for custom reporting. These can include programs like Microsoft +Access and Excel (using the ODBC drivers), PgAccess (A PostgreSQL front-end +written in TCL/Tk with a similar feel to Access), Rekall, Crystal Reports, +OpenOffice and more. + +\subsubsection{Examples} +We have created spreadsheets of the summaries of activity by day and used the +ODBC driver to import these into Excel. Excel can also read HTML tables, so one +can use PostgreSQL to create an HTML table of the result and save it with a .xls +extension so that Windows opens it with Excel. These could then be served via +the same web server that serves Ledger-SMB. + +\subsection{Line of Business Tools on PostgreSQL} +Various line of business tools have been written using PostgreSQL in large part +due to the fact that it is far more mature than MySQL in areas relating to data +integrity enforcement, transactional processing, and the like. These tools can +be integrated with Ledger-SMB in various ways. One could integrate this program +with the HERMES CRM framework, for example. + +\subsubsection{Known Issues} +Ledger-SMB uses a single 'id' sequence across many tables. At the same time it +is expected that these tables do not have identical id values in their records +as they are used as a sort of pseudo-foreign key by the acc\_trans table which +stores the financial transaction information. + +If the integration solution does not keep this in mind, it is possible to create +a situation where the account transactions are ambiguously associated with a +number of different types of financial transactions. This would lead to a large +number of problems. + +\subsubsection{Strategies} +In general, it is advisable to run all such programs that benefit from +integration in the same database but under different schemas. This allows +PostgreSQL to become the main method of synchronizing the data in real time. +However, sometimes this can require dumping the database recreating the tables +etc. in a different schema and importing the data back into Ledger-SMB. + +One possibility for this sort of integration is to use database triggers to +replicate the data between the applications in real-time. This can avoid the +main issue of duplicate id's. One issue that can occur however relates to +updates. If one updates a customer record in HERMES, for example, how do we +know which record to update in Ledger-SMB? There are solutions to this problem +but they do require some forethought. + +A second possibility is to use views to allow one application to present the +data from the other as its own. This can be cleaner regarding update issues, +but it can also pose issues regarding duplicate id fields. + +\subsubsection{Examples} +Others have integrated L'ane POS and Ledger-SMB in order to make it work better +with touch screen devices. Still others have successfully integrated Ledger-SMB +and Interchange. In both cases, I believe that triggers were used to perform +the actual integration. + +\subsection{Line of Business Tools on other RDBMS's} +Often there are requests to integrate Ledger-SMB with applications like +SugarCRM, OSCommerce, and other applications running on MySQL or other database +managers. This is a far more complex field and it requires a great deal more +effort than integrating applications within the same database. + +\subsubsection{Strategies} +Ordinarily real-time integration is not always possible. MySQL does not support +the SQL extension SQL/MED (Management of External Data) so it is not possible to +replicate the data in real-time. Therefore one generally resorts to integrating +the system using time-based updates. Replication may be somewhat error-prone +unless the database manager supports triggers (first added to MySQL in 5.0) or +other mechanisms to ensure that +all changed records can be detected and replicated. In general, it is usually +advisable to add two fields to the record-- one that shows the insert time and +one that shows the last update. + +Additionally, I would suggest adding additional information to the Ledger-SMB +tables so that you can track the source record from the other application in the +case of an update. + +In general, one must write replication scripts that dump the information from +one and add it to the other. This must go both ways. + +\subsubsection{Integration Products and Open Source Projects} +While many people write Perl scripts to accomplish the replication, an open +source project exists called DBI-Link. This package requires PL/Perl to be +installed in PostgreSQL, and it allows PostgreSQL to present any data accessible +via Perl's DBI framework as PostgreSQL tables. DBI-Link can be used to allow +PostgreSQL to pull the data from MySQL or other database managers. + +DBI-Link can simplify the replication process by reducing the operation to a set +of SQL queries. + +\section{Customization Guide} +This section is meant to provide a programmer with an understanding of the +technologies enough information to get up to speed quickly and minimize the time +spent familiarizing themselves with the software. Topics in this section are +listed in order of complexity. As it appeals to a narrower audience than +previous discussions of this topic, it is listed separately. + +\subsection{General Information} +The main framework scripts (the ar.pl, ap.pl, etc. scripts found in the root of +the installation directory) handle such basic features as instantiating the form +object, ensuring that the user is logged in, and the like. They then pass the +execution off to the user interface script (usually in the bin/mozilla +directory). + +Ledger-SMB in many ways may look sort of object oriented in its design, but in +reality, it is far more data-driven than object oriented. The Form object is +used largely as a global symbol table and also as a collection of fundamental +routines for things like database access. It also breaks down the query string +into sets of variables which are stored in its attribute hash table. + +In essence one can and often will store all sorts of data structures in the +primary Form object. These can include almost anything. It is not uncommon to +see lists of hashes stored as attributes to a Form object. + +\subsection{Customizing Templates} +Templates are used to generate printed checks, invoices, receipts, and more in +Ledger-SMB. Often the format of these items does not fit a specific set of +requirements and needs to be changed. This document will not include LaTeX or +HTML instruction, but will include a general introduction to editing templates. +Also, this is not intended to function as a complete reference. + +Template instructions are contained in tags \textless\% and \%\textgreater. +The actual parsing is done by the parse\_template function in SL/Form.pm. + +\subsubsection{Page Breaks in \LaTeX} +The first tag one will see with \LaTeX\ templates is \textless\%pagebreak num1 +num2 num3\%\textgreater + +\begin{itemize} +\item num1 represents characters per line +\item num2 represents lines on first page +\item num3 represents lines on second page. +\end{itemize} + +The pagebreak block is terminated by \textless\%end pagebreak\%\textgreater +Any text within the pagebreak block is ignored by the template. + +\subsubsection{Conditionals} +\begin{itemize} +\item \textless\%if not varname\%\textgreater tells the parser to ignore + include the next block only if varname was posted by the submitting form + (or set via the form hash elsewhere in the scripts). The block ends with + \textless\%end varname\%\textgreater +\item \textless\%if varname\%\textgreater tells the parser to ignore the + block if varname was not posted in the submitting form (or set via the form + hash elsewhere in the scripts). The block ends with \textless\%end + varname\%\textgreater +\item Lines conditionals are otherwise ignored by the parser. +\item Conditionals cannot be nested, but IF's can be nested inside loops as of + 2.6.4 +\end{itemize} + +\subsubsection{Loops} +\textless\%foreach varname\%\textgreater is used to iterate through a list of +vars set by the user interface system (usually one of the files under +bin/mozilla (or otherwise). The block is repeated for each varname in a list. +Block ends with \textless\%end varname\%\textgreater + +\subsubsection{File Inclusion} +\begin{itemize} +\item Files may be included with the syntax \textless\%include + template\_name\%\textgreater where templatename is the name of the + template within the current template directory (usually + templates/\$username/) +\item Cannot be used with conditionals +\item Filenames cannot use slashes (/) or .. due to directory transversal + considerations. +\item Files can force other files to be included, but the same file cannot be + included more than once. +\end{itemize} + +\subsubsection{Cross-referencing and multiple passes of \LaTeX} +In \LaTeX\ cross-references require two passes with latex to resolve. This is +because the type is set page by page and the program really doesn't know on +which page a given reference will fall. This becomes an even larger issue where +floats are concerned as they can move between pages for formatting reasons. + +In rare cases, cross-references may point at incorrect pages even with two +passes (if the inclusion of the cross-reference data moves the object to another +page). In this case you will need to use three passes of \LaTeX\ in order to +have accurate references. + +Ledger-SMB as of the time of this writing (2.6.8) only makes one pass at the +\LaTeX\ file. To force it to make more than one pass, open Form.pm with your +favorite text editor. Look for the line: + +system("latex --interaction=nonstopmode +\$self-\textgreater$\lbrace$ tmpfile$\rbrace$\ +\textgreater\ \$ self-\textgreater$\lbrace$ tmpfile$\rbrace$ .err"); + +Duplicate this line for two passes, or add two copies if you need three passes. + +\subsubsection{Variable Substitution} +The following format is used for variable substitution: +\begin{itemize} +\item \textless\%varname options\%\textgreater Options are one or more + (whitespace separated) of: + \begin{itemize} + \item align=left/right/center + \item width=chars where chars is the width in characters before wrapping + \item offset=chars where chars is the number of spaces to (depending on +alignment). + \end{itemize} + +\end{itemize} + +\subsection{Customizing Forms} +Data entry forms and other user interface pieces are in the bin directory. In +Ledger-SMB 2.4 and below, most files were symlinked to the equivalent file in +the bin/mozilla directory. In 2.6 and later, symlinks are not generally used. + +Each module is identified with a two letter combination: ar, ap, cp, etc. +These combinations are generally explained in the comment headers on each file. + +Execution in these files begins with the function designated by the +form->$\lbrace$action$\rbrace$ variable. This variable is usually derived from +configuration parameters in the menu.ini or the name of the button that was +clicked on to submit the previous page. Due to localization requirements, the +following process is used to determine the appropriate action taken: + +The \$locale-\textgreater getsub routine is called. This routine checks the +locale package to determine if the value needs to be translated back into an +appropriate SL function. If not, the variable is lower-cased, and all spaces +are converted into underscores. + +In general there is no substitute for reading the code to understand how this +can be customized and how one might go about doing this. + +\subsection{Customizing Modules} + +The Perl Modules (.pm files) in the SL directory contain the main business logic +of the application including all database access. Most of these modules are +fairly easy to follow, and there is an effort to document all API's at the wiki +(\url{http://www.metatrontech.com/ledger-smb-wiki?APIReference}). + +Many of these modules have a fair bit of dormant code in them which was written +for forthcoming features, such as payroll and bills of materials. + +One can add a new module through the normal means and connect it to other +existing modules. + +\subsubsection{Database Access} +The \$form object provides two methods for accessing the database. The +\$form-\textgreater dbconnect(\%myconfig) method commits each individual +statement as its own transaction. The \$form-\textgreater +dbconnect\_noauto(\%myconfig) method requires a manual commit. Both these +functions are thin wrappers around the standard Perl DBI operations. + +\subsection{Examples} +\subsubsection{Adding a New Report for Sales Data} +One of our customers required a report of inventory activity during an arbitrary +time period. So we added this customization. This report required merely +adding a few functions to the rp.pl user interface script (bin/mozilla/rp.pl) +and slightly altering a few more. +However, as they eventually wanted to pull up invoices (AP and AR) containing +those part numbers, we also had to customize the AA.pm module to accept this +sort of filtering. + +The patch is available at +\url{http://www.metatrontech.com/downloads/sl-inv\_report-2.6.7.diff} and was +built against Ledger-SMB 2.6.7. + +\subsubsection{Truncating Number of Invoices on a Check Stub} + +One of our customers required an ability to truncate the list of invoices +printed on a stub so that an additional report could be printed as an +attachment. This patch required truncating the list of invoices in the +bin/mozilla/cp.pl file, and slightly patching the ledger-smb.conf to allow for +the number of listed invoices to be a runtime parameter. Finally a very small +modification was made to the template. + +The patch is available at +\url{http://www.metatrontech.com/downloads/sl-check-max-2.6.7.diff} + +\subsubsection{Adding the a Check ID flag for Alcohol Purchases} + +One of our customers is a retail store that sells alcoholic beverages. As the +law requires them to ask customers purchasing these beverages for ID, they +needed a reminder set to the screen when an alcoholic beverage was sold. + +To make this change, we added a field to the parts table of the database, had to +change a few aspects of the IC.pm to handle inserting and updating this field. +Then we modified the ps.pl to display a red banner on invoices which had +alcoholic beverages associated with them. + +This patch is part of SL-POS which can be downloaded at +\url{http://www.metatrontech.com/downloads/SL-POS-0.5.0.tar.gz} (note: this +patch has not been ported to Ledger-SMB 2.6.x yet). + +\clearpage +\part{Appendix} +\appendix +\section{Where to Go for More Information} + +There are a couple of relevant sources of information on Ledger-SMB in +particular. + +\begin{itemize} +\item The latest version of this document will always be advertised at +\url{http://www.metatrontech.com/projects/}. +\item We also maintain a community wiki with more information including +programming, customization, and links to other sites. The wiki can be found at +\url{http://www.metatrontech.com/ledger-smb-wiki} +\end{itemize} + +In addition, it is generally recommended that the main bookkeeper of a company +using Ledger-SMB work through at least one accounting textbook. Which textbook +is not as important as the fact that a textbook is used however. + +\section{Quick Tips} +\subsection{Understanding Shipping Addresses and Carriers} + +Each customer can have a default shipping address. This address is displayed +prominantly in the add new customer screen. To change the shipping address for +a single order, one can use the ship to button at the bottom of the quote, +order, or invoice screen. + +The carrier can be noted in the Ship Via field. However, this is a freeform +field and is largely used as commentary (or instructions for the shipping crew). + +\subsection{Handling bad debts} +In the event that a customer's check bounces or a collection requirement is +made, one can flag the customer's account by setting the credit limit to a +negative number. + +If a debt needs to be written off, one can either use the allowance method (by +writing it against the contra asset account of "Allowance for Bad Debts" or +using the direct writeoff method where it is posted as an expense. + +\section{Step by Steps for Vertical Markets} +\subsection{Common Installation Errors} +\begin{itemize} +\item Ledger-SMB is generally best installed in its own directory outside of the +wwwroot directory. While it is possible to install it inside the wwwroot +directory, the instructions and the faq don't cover the common problems here. +\item When the chart of accounts (COA) is altered such that it is no longer set +up with appropriate items, you can make it impossible to define goods and +services properly. In general, until you are familiar with the software, it is +best to rename and add accounts rather than deleting them. +\end{itemize} +\subsection{Retail With Light Manufacturing} +For purposes of this example we will use a business that assembles computers and +sells them on a retail store. +\begin{enumerate} +\item Install Ledger-SMB +\item Set preferences, and customize chart of accounts + \begin{enumerate} + \item Before customizing the COA it is often worth consulting an accountant. + \end{enumerate} +\item Define Goods, Labor, and Services as raw parts ordered from the vendors. + \begin{itemize} + \item These are located under the goods and services menu node. + \end{itemize} +\item Define assemblies + \begin{itemize} + \item These are also located under goods and services. + \item Component goods and services must be defined prior to creating assembly + \end{itemize} +\item Enter an AP Invoice to populate inventory with proper raw materials. + \begin{itemize} + \item One must generally add a generic vendor first. The vendor is added + under AP-\textgreater Vendors-\textgreater Add Vendor. + \end{itemize} +\item To pay an AP invoice like a check, go to cash->payment. Fill out + approrpiate fields and click print. + \begin{itemize} + \item Note that one should select an invoice and enter in the payment amount + in the appropriate line of the invoice list. If you add amounts to the + master amount list, you will find that they are added to the amount paid + on the invoice as a prepayment. + \item The source field is the check number. + \end{itemize} +\item Stock assemblies +\item One can use AR Invoices or the POS interface to sell goods and services. + \begin{itemize} + \item Sales Invoice + \begin{itemize} + \item Can be generated from orders or quotations + \item Cannot include labor/overhead except as part of an assembly + \item One can make the mistake of printing the invoice and forgetting to + post it. In this event, the invoice does not officially exist in the + accounting system. + \item For new customers, you must add the customer first (under + AR-\textgreater Customers-\textgreater Add Customer. + \end{itemize} + \item POS Interface + \begin{itemize} + \item Cannot include labor/overhead except as part of an assembly + \item Printing without posting is often even easier in the POS because of + the rapid workflow. Yet it is just as severe a problem. + \end{itemize} + \item Ecommerce and Mail Order Operations + \begin{itemize} + \item See the shipping workflow documentation above. + \end{itemize} + \item Customers are set up by going to AR-\textgreater Customers-\textgreater + Add Customer (or the + equivalent localized translation). The appropriate fields are filled + out and the buttons are used at the bottom to save the record and + optionally use it to create an invoice, etc. + \begin{itemize} + \item Saving a customer returns to the customer screen. After the + appropriate invoice, transaction, etc. is entered and posted, Ledger-SMB + will return to the add customer screen. + \end{itemize} + \end{itemize} +\item One can use the requirements report to help determine what parts need to +be ordered though one cannot generate PO's directly from this report. Note that +prior to 2.6.8 sales orders for assemblies are not properly tracked regarding. +\end{enumerate} + +Note, the needs of Ledger-SMB are mostly useful for light manufacturing +operations (assembling computers, for example). More manufacturing capabilities +are expected to be released in the next version. + +A custom assembly is a bit difficult to make. One must add the assembly prior +to invoice (this is not true of goods and services). If the assembly is based +on a different assembly but may cost more (due to non-standard parts) you can +load the old assembly using Goods and Services-\textgreater Reports-\textgreater +Assemblies and then make necessary changes (including to the SKU/Partnumber) and +save it as new. + +Then one can add it to the invoice. + +\section{Glossary} +\begin{description} +\item[BIC] Bank Identifier Code is often the same as the S.W.I.F.T. code. This +is a code for the bank a customer uses for automated money transfers. +\item[COGS] is Cost of Goods Sold. When an item is sold, then the expense of +its purchase is accrued as attached to the income of the sale. It is tracked as +COGS. +\item[Credit]: A logical transactional unit in double entry accounting. It is +the opposite of a debit. Credits affect different account types as +follows: + \begin{description} + \item[Equity]: Credits are added to the account when money is invested in the + business. + \item[Asset]: Credits are added when money is deducted from an asset account. + \item[Liability]: Credits are added when money is owed to the business + account. + \item[Income]: Credits are added when income is earned. + \item[Expense]: Credits are used to apply adjustments at the end of accounting + periods to indicate that not all the expense for an AP transaction has + been fully accrued. + \end{description} +\item[Debit]: A logical transactional unit in double entry accounting systems. +It is the opposite of a credit. Debits affect different account types as +follows: + \begin{description} + \item[Equity]: Debits are added when money is paid to business owners. + \item[Asset]: Debits are added when money is added to an account. + \item[Liability]: Debits are added when money that is owed is paid off. + \item[Income]: Debits are used to temporarily adjust income to defer unearned + income to the next accounting period. + \item[Expense]: Debits are added as expenses are incurred. + \end{description} +\item[IBAN] International Bank Account Number is related to the BIC and is used +for cross-border automated money transfers. +\item[List Price] is the recommended retail price. +\item[Markup] is the percentage increase that is applied to the last cost to get the sell price. +\item[ROP] Re-order point. Items with fewer in stock than this will show up on +short reports. +\item[Sell Price] is the price at which the item is sold. +\item[Source Document]: a paper document that can be used as evidence that a +transaction occurred. Source documents can include canceled checks, receipts, +credit card statements and the like. +\item[Terms] is the number of days one has to pay the invoice. Most businesses +abbreviate the terms as Net n where n is the number of days. For example, Net 30 +means the customer has 30 days to pay the net due on an invoice before it is +late and incurs late fees. +\end{description} + +\input{fdl.tex} +\end{document} + |