Name: penny-lib
Version: 0.2.0.0
Cabal-version: >=1.8
Build-Type: Simple
License: MIT
Copyright: 2012 Omari Norman.
author: Omari Norman
maintainer: omari@smileystation.com
stability: Experimental
homepage: http://www.github.com/massysett/penny
bug-reports: omari@smileystation.com
Category: Console, Finance
License-File: LICENSE
synopsis: Extensible double-entry accounting system - library
description: Penny is a double-entry accounting system. It is inspired
by, but incompatible with, John Wiegley's Ledger, which is available
at . You will want to install the package
penny-bin by using cabal install penny-bin, which will install the
executable program and this library as well. Features:
.
* Penny is a double-entry accounting system. It uses traditional
accounting terminology, such as the terms \"Debit\" and
\"Credit\". If you need a refresher on the basics of double-entry
accounting, pick up a used accounting textbook from your favorite
bookseller (they can be had cheaply, for less than ten U.S. dollars
including shipping) or check out
, a great free online text.
.
* Penny is based around "Penny.Lincoln", a core library to represent
transactions and postings and their components, such as their
amounts and whether they are debits and credits. You can use
Lincoln all by itself even if you don't use the other components
of Penny, which you may find handy if you are a Haskell
programmer. I wrote Penny because I wanted a precise library to
represent my accounting data so I could analyze it programatically
and verify its consistency. I wrote it in Haskell not because I
wanted to write something in Haskell but because Haskell is the
best tool for this job (I used to use the shell, combined with
Ledger, which is a messy combination.)
.
* Penny's command line interface, Zinc, and its reports, Cabin, give
you unparalleled flexibility to filter and sort postings. Each
posting within a transaction may have its own flags assigned
(e.g. to indicate whether the posting is cleared) and each posting
may have infinite \"tags\" assigned to it, giving you another way
to categorize your postings. For instance, you might have vacation
related postings in several different accounts, but you can give
them all a \"vacation\" tag.
.
* Full Unicode support. Also, you may set which characters you wish
to use to represent the radix point and the digit grouping
character in your ledger file.
.
* Penny's reports, in "Penny.Cabin", have color baked in from the
beginning. You do not have to use color, though, which is handy if
you are sending output to a file or if, well, you just don't like
color.
.
* Penny's reports are customizable in Haskell, giving you an easy
and powerful way to make your own reports without writing cryptic
formatting strings.
.
* Penny handles multiple commodities (for example, multiple
currencies, stocks and bonds, tracking other assets, etc.) in an
easy and transparent way that is consistent with double-entry
accounting principles. It embraces the philosophy outlined in this
tutorial on multiple commodity accounting:
.
.
* Penny stores amounts using only integers, building from the
Data.Decimal library available at
. This ensures the
accuracy of your data, as using floating point values to represent
money is a bad idea. Here is one explanation:
. The
use of integer arithmetic also makes Penny simpler internally, as
there is no need for arbitrary rounding to compensate for the
bizarre and inaccurate results that sometimes arise from the use of
floating-point values to represent currencies.
.
* Freely licensed under the MIT license. If you take this code,
improve it, lock it up and make it proprietary, and sell it,
AWESOME! I haven't lost anything because I still have my code and,
what's more, then maybe I can buy your product and not have to
maintain this one any more!
.
* Uses no GHC extensions. However, the code is only tested under GHC
and for all practical purposes it will only run under GHC at this
time because it uses libraries such as Data.Text that are
available only under GHC. Despite this I expect I will continue to
avoid language extensions.
.
Non-features / disadvantages:
.
* Written in Haskell. Yes, I think Haskell is the best tool ever,
but its compiler is not as commonly installed as compilers for C
or C++, and non-Haskellers will probably find Penny to be more
difficult to install than Ledger, as the latter is written in C++.
.
* Handling commodities requires that you set up multiple accounts;
some might find this cumbersome.
.
* Young and not well tested yet. Also, only tested on Unix. It
probably would not be difficult to make Penny run on Windows; if
someone wants to do that, go ahead.
.
* Full Penny functionality is available without a Haskell compiler;
you could even use a pre-compiled binary. However, to fully
customize Penny, you will need a Haskell compiler installed.
.
* Can be slow and memory hungry with large data sets. I have a
ledger file with about 28,000 lines. On my least capable machine
(which has an Intel Core 2 Duo at 1.6 GHz) this takes about 1.4
seconds to parse. Not horrible but not instantaneous
either. Generating a report about all these transactions can take
about seven seconds and a little less than 300 MB of memory. I
have eliminated all the obvious slowness from the code and
attempted a rewrite of the parser, which made no difference; other
ideas to speed up Penny with large data sets would involve
substantial changes and this is not at the top of my list because
the program is currently usable with relatively recent hardware.
.
More details about the organization of the Penny modules is
available by examining the top "Penny" module.
.
This is only a library. For the executable package, which also
includes more documentation, search for the penny-bin package on
Hackage.
source-repository head
type: git
location: git://github.com/massysett/penny.git
Library
Build-depends:
base ==4.*,
text ==0.11.*,
explicit-exception ==0.1.*,
containers ==0.4.*,
transformers == 0.2.*,
time ==1.2.*,
Decimal >= 0.2.2 && < 0.3,
parsec >= 3.1.2 && < 3.2,
multiarg ==0.4.*,
matchers ==0.2.*,
old-locale ==1.0.*,
semigroups ==0.8.*,
split ==0.1.*
Exposed-modules:
Penny,
Penny.Cabin,
Penny.Cabin.Allocate,
Penny.Cabin.Balance,
Penny.Cabin.Balance.Parser,
Penny.Cabin.Balance.Help,
Penny.Cabin.Balance.Options,
Penny.Cabin.Balance.Tree,
Penny.Cabin.Chunk,
Penny.Cabin.Chunk.Switch,
Penny.Cabin.Colors,
Penny.Cabin.Colors.DarkBackground,
Penny.Cabin.Colors.LightBackground,
Penny.Cabin.Interface,
Penny.Cabin.Meta,
Penny.Cabin.Options,
Penny.Cabin.Posts,
Penny.Cabin.Posts.Allocate,
Penny.Cabin.Posts.Allocated,
Penny.Cabin.Posts.BottomRows,
Penny.Cabin.Posts.Fields,
Penny.Cabin.Posts.Growers,
Penny.Cabin.Posts.Chunk,
Penny.Cabin.Posts.Help,
Penny.Cabin.Posts.Meta,
Penny.Cabin.Posts.Options,
Penny.Cabin.Posts.Parser,
Penny.Cabin.Posts.Spacers,
Penny.Cabin.Row,
Penny.Cabin.TextFormat,
Penny.Copper,
Penny.Copper.Account,
Penny.Copper.Amount,
Penny.Copper.Comments,
Penny.Copper.Commodity,
Penny.Copper.DateTime,
Penny.Copper.Entry,
Penny.Copper.Flag,
Penny.Copper.Item,
Penny.Copper.Memos.Posting,
Penny.Copper.Memos.Transaction,
Penny.Copper.Number,
Penny.Copper.Payees,
Penny.Copper.Posting,
Penny.Copper.Price,
Penny.Copper.Qty,
Penny.Copper.Tags,
Penny.Copper.TopLine,
Penny.Copper.Transaction,
Penny.Copper.Util,
Penny.Liberty,
Penny.Liberty.Expressions,
Penny.Liberty.Expressions.Infix,
Penny.Liberty.Expressions.RPN,
Penny.Lincoln,
Penny.Lincoln.Balance,
Penny.Lincoln.Bits,
Penny.Lincoln.Bits.Account,
Penny.Lincoln.Bits.Amount,
Penny.Lincoln.Bits.Commodity,
Penny.Lincoln.Bits.DateTime,
Penny.Lincoln.Bits.DrCr,
Penny.Lincoln.Bits.Entry,
Penny.Lincoln.Bits.Flag,
Penny.Lincoln.Bits.Memo,
Penny.Lincoln.Bits.Number,
Penny.Lincoln.Bits.Payee,
Penny.Lincoln.Bits.Price,
Penny.Lincoln.Bits.PricePoint,
Penny.Lincoln.Bits.Qty,
Penny.Lincoln.Bits.Tags,
Penny.Lincoln.Builders,
Penny.Lincoln.Family,
Penny.Lincoln.Family.Child,
Penny.Lincoln.Family.Family,
Penny.Lincoln.Family.Siblings,
Penny.Lincoln.HasText,
Penny.Lincoln.Meta,
Penny.Lincoln.NestedMap,
Penny.Lincoln.Predicates,
Penny.Lincoln.PriceDb,
Penny.Lincoln.Queries,
Penny.Lincoln.Serial,
Penny.Lincoln.TextNonEmpty,
Penny.Lincoln.Transaction,
Penny.Lincoln.Transaction.Unverified,
Penny.Shield,
Penny.Zinc,
Penny.Zinc.Error,
Penny.Zinc.Help,
Penny.Zinc.Parser,
Penny.Zinc.Parser.Defaults,
Penny.Zinc.Parser.Filter,
Penny.Zinc.Parser.Ledgers,
Penny.Zinc.Parser.Report
ghc-options: -Wall
if flag(debug)
ghc-options: -auto-all -caf-all
Flag debug
Description: turns on some debugging options
Default: False