Hi Harshad, Notes below.

On Fri, May 31, 2013, at 12:32, Harshad RJ wrote:
> Hi all,
>
> Have a little project to announce: Abandon
> <https://github.com/hrj/abandon>
>
> *What is it?* A cross platform, double-entry accounting system with a
> syntax similar to ledger's. Comes with two interfaces: a command line
> mode and an interactive GUI for reports.
>
> *Why? *I am quite happy with ledger, and when I first came across it I
> immediately switched to using it for my own accounts. However, when I
> had to show the reports to my accountants and auditors, they weren't
> all that gung-ho.
>
> They needed an interactive system in which they could, for example,
> select an account (with keyboard / mouse) and view only its details,
> and then change the grouping or sorting order, etc. They are not tech-
> savy enough to fiddle with command line parameters (although they are
> smart in other ways).
>
> The beancount <https://github.com/jwiegley/beancount> project seems
> suited for this. However, I thought the complexity of running a web
> server would

I've been working with my accountant through beancount for years.

I agree with you about the complexity of running a web server.

So I don't do that: I just run a "wget" on the output and zip that into
an archive that I email him. I hope this doesn't come as a
"whydidn'tIthinkofthat" moment.

He unzips the file on his Mac and is able to browse through all the HTML
reports, balance sheet, income statement, "registers" and what not--it's
all been sucked into static files. We've been doing this for several
years now; the only thing I wish it did is invert the negative amounts
for Income, Equity and Liabilities (the new version will do that, more
below) so I would not have had to explain this to him (he gets it, but I
think it's better for reporting to be able to just go back to the
credits/debits world, only at final display time).

There's even a switch to make the web server not serve the "source" in
order to avoid disclosing some personal notes and account numbers and
what-not (my personal input file is rich with details), I turn that on
before I suck in the HTML files.



> be too much for tech-non-savy folks. Also, for development, it is
> easier I think to develop a desktop application than a web server.

I beg to differ, but I think it's awesome that you built something the
way  you like it :-)

Web apps are so convenient for reporting: you can refer to specific
pages via unique URLs, cut-and-paste everywhere, and share them on the
network, and rendering looks better than more GUI desktop libraries at
this point.



> I could have extended the ledger code base itself, but I am not very
> comfortable developing an application in C++ (though I am familiar
> with it and used it previously). I have developed Abandon in Scala
> instead.

That's awesome.



> So, that's the story behind Abandon. I have spent only 4 weeks on it;
> hence it has the barest minimum of features (though sufficient for my
> use). Many * many* features are missing as of now, the most glaring of
> which is currency support. The reason I am sharing this is that
> somebody might have a similar use-case as mine and could benefit from
> it. And oh, I would benefit too from any criticisms and ideas :)

After many years using beancount for "real world" finances (my own
personal financial life, joint accounts with my wife, and my company's
finances), I've had a few insights recently about how to track positions
for capital gains reporting correctly (had never been fully carried out
in beancount, I have a great little set of data structures now) and 
what I think are a few great ideas for rebuilding the now rather crufty 
internals of beancount, and dealing with currency conversions 
(not a trivial problem in a system that is not "homed" to any "currency").

So I'm smack-in-the-middle of a FROM-SCRATCH REWRITE of it. I haven't
slept much in the last few weeks... every free hour is spent on this,
I'm totally obsessed with this rewrite. I hadn't touch beancount for years,
and all of a sudden all the ideas are hitting me. The new internal data
structures will be simplified A LOT. One of my goals on this rewrite is
to take 5+ years experience using beancount and strip away all the
features that aren't useful. The result is a much simplified and
immutable data structure (a simple list of entries, each of which may
take one of 5-6 simple "struct" data types). One issue with beancount
is that the internals were mutable and ugly, and at some point I
stopped extending it. Now with this really simple new parser output,
the simplicity of what you get from it really entices me to go all the
way and add a lot of reports, e.g. currency exposure for positions, and
some new features (e.g. automatic filing of scanned documents and
making them available through the interface, "goals" a.k.a budgeting,
and a bunch of new ideas).

In addition, by simplifying the syntax, I redesigned the input grammar a
little bit in order to be able to use a parser generator. I have a C
flex/bison parser which feeds a Python3 builder (most of the code is
python3), and a somewhat experimental parser written in Google's "go"
language. It should be easy for me to evolve the grammar faster with
this, and I've been looking to do that for a while :-)  The new syntax
is still pretty close to Ledger's, but will be incompatible
unfortunately. You can have a look at my new syntax on the 
cheatsheet here:

  https://hg.furius.ca/public/beancount/raw-file/tip/doc/cheatsheet.org

However, my focus is on maintaining simplicity. Whereas Ledger is a
fantastic breeding ground for new ideas and explorations--and was
originally the source of what inspired me to write this in the first place,
kudos to John--I want my new version of this to

- really narrow down to the very bare essentials, it should be simple,

- provide a parser for the language that outputs a very simple data
  structure so that other people can use it to build new kinds of
  reports and importing tools, text-based or otherwise; this is crucial,
  the output data structure is minimal,

- write a killer web front-end for it with more reports and views, with ideally
  little or even no command-line options of any kind. You just run it, and
  everything else should be some clicks away. At this point I've got
  opening balance sheet, balance sheet, income statement, statement of
  positions and currency exposure, list of "conversions", and other
  new stuff.

- make importing easier, i.e., automatically filing imported inputs and
  PDF statements into a mirrorred hierarchy of files (same as for accounts)
  and then for the web front-end to link to each account's documents, as
  well as providing a library that given a set of partial transactions
  can try to automatically categorize them.

I then want to spend some time on EDUCATION, i.e., doing presentations
to explain to people how spending an hour every two weeks updating a
single text file can result in all of those reports, and providing
example transactions for all the usual kinds of operation that occurs in
one's financial life. They should be able to look things up by example in
the documentation.  I'm always surprised at how few people--even smart
people, I work with a lot of really smart people!-- don't know anything
about this "method of counting." The double-entry method should be
taught in high-school IMO! It's just a clever method for counting, with a
really simple data structure.  I want to do a workshop/presentation to get
people started, but before that, I want to have a really stripped-
down rewrite ready to go and tested really solid. I'm about a month away.

I've also defined a small set of primitives which filter those lists of
entries and return modified lists in order to perform the common
operations required for reporting. The result is a nearly purely
functional set of surprisingly simple operations for "transferring"
(from income to equity/net-income), "summarizing" (for opening-
balances), "padding" (automatic balance adjustments), inserting
unrealized capital gains into subaccounts, and realizing this simple 
list into a tree of accounts for reporting.

I'm about 70% done. The web UI already works better than "old
beancount." 

It's not really published anywhere yet, but if you feel courageous, 
you're welcome to clone my repo, switch to branch "parser" and 
look at 
  bin/bean2-* 
  lib/python/beancount2/* 

Also, check out the TODO file at the root.
It's a bit of a mess right now, I'm in creative mode, but I'll be
cleaning up all the wood chips really neatly after I'm done building
the furniture, if you see what I mean. This is meant to be a full
replacement of beancount, cleaner and better in every way.

If you're in the mood to collaborate, one obvious candidate is to use a 
common input syntax.  If you'd like to do that, you should be able to use

  lib/python/beancount2/parser/lexer.l
  lib/python/beancount2/parser/grammar.y

I've been wanting to write an ANTLR version of the parser, but have
been reserving this for after everything else is done. If you'd like to
do that, you could use it from your Scala app via Java interop and we
could both use each other's input files, possibly cross-check each
other's reports. I would actually use that myself, using it from Clojure
(my own pet favourite in the JVM ecosystem).


--
Martin



> cheers,
> -- 
> *Harshad RJ* <http://lavadip.com>
> 
> -- 
> 
> --- 
> You received this message because you are subscribed to the Google Groups 
> "Ledger" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
> 
> 

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"Ledger" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to