Author: Massimo Di Pierro <[email protected]>
License: BSD <http://opensource.org/licenses/BSD-3-Clause>
Created on: 2013-02-20
This program is named after Luca Pacioli (1445โ1517), inventor of accounting and double-entry bookkeeping. Pacioli maintained that business people must insist on justice, honour, and truth.
The program contains three parts:
- Assets, Liabilities, Equity, Income, Expenses
- Computations of Balance Sheet and Profit/Losses
- Automatic computation FIFO capital-gains
- API
- Scenario analysis (WORK IN PROGRESS)
Functions to read and write a general ledger in the beancount format
- list of accounts
- support for ofx records
- transactions with multiple postings
- tags
- checks
- support for multiple files and partial output
- The output of the program is in HTML
- Reporting in Latex/PDF (can be improved)
- Reporting in JSON (WORKM IN PROGRESS)
- Charting
This program uses a single file to store the input ledger. This is only appropriate for small bussinesses. Our benchmark indicates that the program requires 0.0004 seconds/transactions. Therefore if a business processes about 1000 transaction/day, the system can process one year of trasactions in about 2 minutes. Additional time is required to generate reports.
This program is usable but:
- It is a work in progress.
- It may need more testing.
- We plan to add feature.
- We may break the API. The documentation is incomplete.
- I am not an accountant
./pacioli.py -h
Consider a simple business that buys wood and sells wood toys.
; file: toystore.ledger
; define your accounts
@defaccount De Assets:Cash
@defaccount De Assets:AccountsReceivable
@defaccount Cr Liabilities:Loan
@defaccount Cr Liabilities:AccountPayable
@defaccount Cr Equity:Opening-Balances
@defaccount De Income:ToySale
@defaccount De Income:Capital-Gains
@defaccount Cr Expense:ShippingCosts
@defaccount Cr Expense:Monthly:LoanInterest
; put initial money in cash account
@pad 2013-01-01 Assets:Cash Equity:Opening-Balances
@check 2013-01-01 Assets:Cash 2000 USD
; transactions
2013-01-01 * Receive a loan
Assets:Cash +10000 USD
Liabilities:Loan -10000 USD
2013-02-01 * Pay load interest
Assets:Cash -300 USD
Liabilities:Loan +125 USD
Expense:Monthly:LoanInterest ; automatically computed as 300-125 = 275 USD
2013-03-01 * buy wood
Expense:ShippingCosts 500 USD
Assets:Cash ; automatically computes as -(9*1000+500) USD
@begintag client-0001
2013-04-01 * first toy sale (cash transaction)
Income:ToySale -230 USD ; $230 from client #0001
Assets:Cash ; automatically computed as 230 USD
@endtag client-0001
@check 2013-04-01 Assets:Cash 2430 USD ; 2000+10000-9*1000-500+230 = 2430 USD
; read more about AccountsReceivable
; http://www.investopedia.com/terms/a/accountsreceivable.asp
@begintag client-0002
2013-04-02 * second toy sale (invoice)
Income:ToySale -230 USD ; $230 billed to client #0001
Assets:AccountsReceivable ; automatically computed as 230 USD
2013-04-10 * second toy sale (payment received after one week)
Assets:AccountsReceivable -230 USD ; $230 received from client #0001
Assets:Cash ; automatically computed as 230 USD
@endtag client-0002
@check 2013-04-10 Assets:Cash 2660 USD ; 2000+10000-9*1000-500+230*2 = 2460 USD
Run it with
./pacioli.py -B -i toystore.ledger > toystore.balance
The output will be in toystore.ledger.output and toystore.balance
banchmark: 4.11e-04 sec/transaction
Assets : 2660.0 USD
Assets:AccountsReceivable : 0.0 USD
Assets:Cash : 2660.0 USD
Equity : -2000.0 USD
Equity:Opening-Balances : -2000.0 USD
Expense : 675.0 USD
Expense:Monthly : 175.0 USD
Expense:Monthly:LoanInterest : 175.0 USD
Expense:ShippingCosts : 500.0 USD
Expenses :
Income : -460.0 USD
Income:Capital-Gains :
Income:ToySale : -460.0 USD
Liabilities : -9875.0 USD
Liabilities:AccountPayable :
Liabilities:Loan : -9875.0 USD
Most of the documentation about ledger and beancount applies to pacioli.
So why pacioli.py when we have beancount? I mostly made it for myself. I wanted to rewrite beancount from scratch to understand it. The result (pacioli) performs the same functions but it is much smaller (~800 lines of code). I believe pacioli has better API. I have plans to turn it into a web application and integrate it with d3.js. Beancount is GPL. Pacioli is BSD.
Pacioli can be used programmatically:
>>> from pacioli import *
>>> p = Pacioli()
>>> p.add_account('Assets:Cash','De','USD')
>>> p.add_account('Equity','Cr','USD')
>>> p.ledger.append(Transaction('2008-10-20','info',postings=[
... Posting('Assets:Cash',amount=Amount(100,'USD')),
... Posting('Equity')]))
>>> p.ledger.sort()
>>> p.save('test.ledger')
>>> p.run()
>>> p.report()
>>> p.dump_html('folder')
>>> p.dump_latex('folder/report.latex')
>>> assert p.accounts['Assets'].wallet['USD'] == +100
>>> assert p.accounts['Equity'].wallet['USD'] == -100
Pacioli uses Tornado to serve the genarated documents:
./pacioli.py -i demo.ledger -w 8080
The generated documents are just static html files therefore they can served using other server.
Pacioli generates also a <input.ledger>.output/<input.ledger>.latex file. You can process it with
./pacioli.py -i demo.ledger
cd demo.ledger.output
pdflatex demo.ledger.latex
open demo.ledger.pdf
Pacioli includes the file demo.ledger which we stole from beancount and we used for testing purposes. It also includes a demo.ledger.output generated from this example.
Pacioli also includes a gaap.lendger (GAAP = General Accepted Accounting Practices) which you can customized and use for your business.
BSD v3