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. Simple enough?

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 (the web server otherwise has some 
links into a web-served source rendering).



> 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 really convenient for reporting IMO: 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've been rather obsessed with this rewrite. I hadn't touched beancount for 
years,
and all of a sudden all these new ideas are coming to me. The new internal 
data
structures are 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 6 or 7 simple "struct" data types). One issue with old beancount
is that the internals were mutable and ugly, and at some point I
stopped extending it (it smelled). 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). Basically, I want the parser output to be 
so simple and reusable that anyone can write tools against it. The main
version is written in Python3.

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 that uses go's built-in port of yacc--it's old-school. There's no
C++, only C (nothing against C++--I do a lot at work-- but this will
work everywhere and should be a breeze to install).

It should be easy for me to improve my grammar faster with
this parser, 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 it 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
the most important project that inspired me to write this in the first 
place,
kudos to John for many of the most important simplications--I want 
my new version of this to focus on these aspects:

- really narrow down to the very bare essentials, it should be as simple
  as it possibly can. This means some features will go away. (I've been
  able to solve my bookkeeping problems without most of the exotic 
  stuff.)

- 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 and easy to understand,

- 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. Simple. 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, and I've generalized some of the concepts I had introduced
  in beancount (e.g. "events" which allow you to track days).  Oh, and 
  auto-reload, and the server should support all possible "views" (all
  transactions, by-year, by-tag, by-payee, and by-"event period".

- add a lot of support for positions and risk, currency exposure, and other
  investment-related tasks (I sold my home and so I have to do more of
  this now, and finally figured out how to deal with lots and cost 
correctly,
  something that I had never really done very well with beancount
  previously--now I've got it all figured out),

- make importing easier, i.e., automatically filing imported inputs and
  PDF statements into a mirrored hierarchy of files (same hierarchy as 
  for accounts with a simple convention to automatically create entries
  that show up in the "registers" with links to the document PDFs),
  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.

The base system will do all that, and more. I think there can be a lot of
cool ideas around importing (e.g. converting PDF files into text/xml and
comparing that with the contents of the ledger to guess on an account
they should be associated with).

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 concept. I want to do a workshop or 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 or
two 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 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. This is the core of it.
Everything else is just fluff to display the data under different
projections and subsets.

I'm about 70% done. The web UI already works better than "old
beancount." I'm going to share some output soon.

It's not really published anywhere yet--I tend to just code my projects
and then use them myself, though they're all on my own public code 
repository,
I don't spend a lot of time to "sell" what I do--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 mess right now, I'm in creative mode and spitting ideas there
faster than I can organize them, 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. It 
already works better than beancount.

If you're in the mood to collaborate, one obvious candidate is to reuse
the simplified input syntax. If you feel like doing that, you should be 
able to use

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

I've been wanting to write an ANTLR version of the parser, but have
been reserving this for after everything else is done. You could use that
from your Scala app via Java interop and we could possibly use each 
other's input files, possibly cross-check each
other's reports. I would actually use this parser from Clojure myself
(my own pet favourite in the JVM ecosystem).  This is just an idea. 
I'll likely do that soon after the dust settles.

Another crazy coding weekend ahead...



--
Martin



On Friday, May 31, 2013 12:32:45 PM UTC-4, 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 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 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.
>
> 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 :)
>
> 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.


Reply via email to