Hi Dave, If you haven't come across it yet, you might be interested in Fava [1] as well. It's a web-wrapper (using on Flask) around Beancount, providing you a convenient way to record transactions and generate various reports. It's intended to make the barrier of entry to using plaintext accounting as low as possible, without preventing you from using the more powerful features such as scripting and plugins.
[1] https://beancount.github.io/fava/ On Tue, Jun 13, 2017 at 12:03 PM, Dave The Happy Singer < [email protected]> wrote: > Hi Martin, > > Thanks so much for the very thorough responses. I'm glad (?) I could help > you find some issues to fix. I'll sit down and digest your solutions in > more depth this evening and follow the tickets in case I need them. I'm > sure I'll be able to get things moving with the information you've provided. > > (I was vaguely aware of plaintext accounting but I only properly > discovered it this weekend and I'm excited by the possibilities. I'm a > Python dev so hopefully once I've got my head around the conceptual stuff I > hope I'll be able to contribute back in some way). > > Thanks again for you time! > > Dave > > On Tue, 13 Jun 2017 at 13:26 Martin Blais <[email protected]> wrote: > >> One more thing: If you disambiguate the cost currency in your reducing >> transaction, the FIFO method is working fine: >> >> >> 2013-11-27 open Assets:AU:Coinjar:BTC BTC "FIFO" >> ... >> 2014-01-05 * "Deposit Cold storage" >> Assets:AU:ColdStorage:BTC 1.0 BTC {} >> Assets:AU:Coinjar:BTC -1.0 BTC {AUD} >> >> >> Or if you don't care about the cost basis in ColdStorage (you lose it): >> >> 2013-11-27 open Assets:AU:Coinjar:BTC BTC "FIFO" >> ... >> 2014-01-05 * "Deposit Cold storage" >> Assets:AU:ColdStorage:BTC 1.0 BTC @ >> Assets:AU:Coinjar:BTC -1.0 BTC {AUD} >> >> This also works: >> >> 2014-01-05 * "Deposit Cold storage" >> Assets:AU:ColdStorage:BTC 1.0 BTC @ AUD >> Assets:AU:Coinjar:BTC -1.0 BTC {} >> >> >> Both of these do what you'd expect them to, that is, it gets translated >> to this transaction: >> >> Hash:c33deeb52a4546640770ddbe49eeb805 >> Location: /home/blais/r/q/beancount-data/user/smile/smile1.beancount:25 >> >> ------------ Balances before transaction >> >> Assets:AU:ColdStorage:BTC >> >> Assets:AU:Coinjar:BTC 0.14161 BTC {1059.247228303085940258456324 >> AUD, 2013-11-27} >> Assets:AU:Coinjar:BTC 0.118776 BTC {1262.881390179834309961608406 >> AUD, 2013-11-29} >> Assets:AU:Coinjar:BTC 0.149156 BTC {1005.658505189197886776261096 >> AUD, 2013-12-10} >> Assets:AU:Coinjar:BTC 0.673358 BTC {742.5470552068884605217432629 >> AUD, 2013-12-17} >> Assets:AU:Coinjar:BTC 0.230398 BTC {651.0473181190808947994340229 >> AUD, 2013-12-19} >> >> >> ------------ Transaction >> >> 2014-01-05 * "Deposit Cold storage" >> Assets:AU:ColdStorage:BTC 1.000000 BTC @ >> 888.4428491233489466227474835 AUD ; 888.4428491233489466227474835 AUD >> Assets:AU:Coinjar:BTC -0.141610 BTC {1059.25 AUD, 2013-11-27} >> ; -150.0000000000000000000000000 AUD >> Assets:AU:Coinjar:BTC -0.118776 BTC {1262.88 AUD, 2013-11-29} >> ; -150.0000000000000000000000000 AUD >> Assets:AU:Coinjar:BTC -0.149156 BTC {1005.66 AUD, 2013-12-10} >> ; -150.0000000000000000000000000 AUD >> Assets:AU:Coinjar:BTC -0.590458 BTC {742.55 AUD, 2013-12-17} >> ; -438.4428491233489466227474835 AUD >> >> >> Tolerances: BTC=0.000005 >> Basis: (-888.4428491233489466227474835 AUD) >> >> ------------ Balances after transaction >> >> * Assets:AU:ColdStorage:BTC >> 1.0 BTC >> >> * Assets:AU:Coinjar:BTC 0.082900 BTC {742.5470552068884605217432629 >> AUD, 2013-12-17} >> Assets:AU:Coinjar:BTC 0.230398 BTC {651.0473181190808947994340229 >> AUD, 2013-12-19} >> >> >> >> And the following one succeeds just fine. >> >> I think this is the best solution of all ofthose, just >> - make sure you use cost basis consistently >> - clearly indicate the cost currency when you're using automatic matching >> / inference >> >> I'll fix the tickets anyhow, but if you do this, nothing should change. >> >> >> >> >> >> On Mon, Jun 12, 2017 at 11:17 PM, Martin Blais <[email protected]> wrote: >> >>> (Apologies for the long response, you've triggered an interesting corner >>> case which may require a fix.) >>> >>> The error you made here (deducting 1.0 BTC from the account with >>> existing positions without specifying the cost basis) brings up an >>> interesting corner case. >>> >>> >>> The following is sufficient to trigger the error: >>> >>> >>> 2013-11-27 open Assets:AU:Coinjar:BTC BTC >>> 2013-11-27 open Assets:AU:Coinjar:Cash AUD >>> 2013-11-27 open Assets:AU:ColdStorage:BTC BTC >>> >>> 2014-01-05 * "Deposit Cold storage" >>> Assets:AU:ColdStorage:BTC 1.0 BTC >>> Assets:AU:Coinjar:BTC -1.0 BTC >>> >>> 2014-01-28 * "Buy BTC" >>> Assets:AU:Coinjar:BTC 0.162288 BTC >>> {924.2827565808932268559597752 AUD} >>> Assets:AU:Coinjar:Cash -150.00 AUD >>> >>> >>> What's happening is that after the first transaction the Coinjar:BTC >>> account contains a negative number of units of BTC: >>> >>> bean-doctor context smile1.beancount 6 >>> Hash:f7a2fba6639dd0ec5d52abce3788f32d >>> Location: /home/blais/r/q/beancount-data/user/smile/smile1.beancount:5 >>> >>> ------------ Balances before transaction >>> >>> Assets:AU:ColdStorage:BTC >>> >>> Assets:AU:Coinjar:BTC >>> >>> >>> ------------ Transaction >>> >>> 2014-01-05 * "Deposit Cold storage" >>> Assets:AU:ColdStorage:BTC 1.0 BTC >>> Assets:AU:Coinjar:BTC -1.0 BTC >>> >>> >>> Tolerances: BTC=0.05 >>> >>> ------------ Balances after transaction >>> >>> * Assets:AU:ColdStorage:BTC >>> 1.0 BTC >>> >>> * Assets:AU:Coinjar:BTC >>> -1.0 BTC >>> >>> >>> "Adding" BTC to this negative inventory essentially means a "reduction" >>> of the negative number of BTC (you're reducing the short position). >>> Since the second transaction is providing a cost basis and it has only a >>> single lot with no cost basis, it cannot find a lot that matches, so you >>> get an error. >>> This is WAI. >>> (But it does beg the question regarding whether lots without a cost >>> basis should be treated distinctly; so far I'm not convinced that they >>> should, I don't have a great use case for that, so they're not.) >>> >>> >>> >>> If I leave all the previous transactions, one gets into a slightly >>> different case: >>> >>> bean-doctor context smile1.beancount 27 >>> Hash:f7a2fba6639dd0ec5d52abce3788f32d >>> Location: /home/blais/r/q/beancount-data/user/smile/smile1.beancount:26 >>> >>> ------------ Balances before transaction >>> >>> Assets:AU:ColdStorage:BTC >>> >>> Assets:AU:Coinjar:BTC 0.14161 BTC {1059.247228303085940258456324 >>> AUD, 2013-11-27} >>> Assets:AU:Coinjar:BTC 0.118776 BTC {1262.881390179834309961608406 >>> AUD, 2013-11-29} >>> Assets:AU:Coinjar:BTC 0.149156 BTC {1005.658505189197886776261096 >>> AUD, 2013-12-10} >>> Assets:AU:Coinjar:BTC 0.673358 BTC {742.5470552068884605217432629 >>> AUD, 2013-12-17} >>> Assets:AU:Coinjar:BTC 0.230398 BTC {651.0473181190808947994340229 >>> AUD, 2013-12-19} >>> >>> >>> ------------ Transaction >>> >>> 2014-01-05 * "Deposit Cold storage" >>> Assets:AU:ColdStorage:BTC 1.000000 BTC >>> Assets:AU:Coinjar:BTC -1.000000 BTC >>> >>> >>> Tolerances: BTC=0.05 >>> >>> ------------ Balances after transaction >>> >>> * Assets:AU:ColdStorage:BTC >>> 1.0 BTC >>> >>> Assets:AU:Coinjar:BTC 0.14161 BTC {1059.247228303085940258456324 >>> AUD, 2013-11-27} >>> Assets:AU:Coinjar:BTC 0.118776 BTC {1262.881390179834309961608406 >>> AUD, 2013-11-29} >>> Assets:AU:Coinjar:BTC 0.149156 BTC {1005.658505189197886776261096 >>> AUD, 2013-12-10} >>> Assets:AU:Coinjar:BTC 0.673358 BTC {742.5470552068884605217432629 >>> AUD, 2013-12-17} >>> Assets:AU:Coinjar:BTC 0.230398 BTC {651.0473181190808947994340229 >>> AUD, 2013-12-19} >>> * Assets:AU:Coinjar:BTC >>> -1.0 BTC >>> >>> >>> Here, in theory (excluding the last transaction), there are enough BTC >>> to cover the -1.0 reduction and keep the balance positive: >>> >>> bean-query smile1.beancount "select account, sum(units(position)) group >>> by 1" >>> account sum_units_positi >>> ------------------------- ---------------- >>> Assets:AU:Coinjar:BTC 0.313298 BTC >>> Assets:AU:Coinjar:Cash -1100.00 AUD >>> Assets:AU:ColdStorage:BTC 1.0 BTC >>> >>> >>> The real problem is that the transaction removing -1.0 BTC from the >>> Coinjar:BTC should have failed and raised an error message. It's a bug that >>> it did not (I'll have to address that; I'm quite surprised this wasn't >>> covered by my unit tests - thanks for bringing up that question). >>> >>> Ticket: >>> https://bitbucket.org/blais/beancount/issues/167/ >>> reductions-without-a-cost-basis-should >>> >>> Now, with the default booking method (STRICT) If you reduce an existing >>> position, you should have to provide the cost basis you want to book >>> against. Given the frequency with which those transactions appear to occur, >>> explicitly selecting each of the lots to reduce in order to move your 1.0 >>> BTC to cold storage would be a pain in the butt. I think you'll want >>> something easier. >>> >>> Normally, you can set that account's booking algorithm to something >>> else, e.g. "FIFO", which would select the lots for you: >>> >>> 2013-11-27 open Assets:AU:Coinjar:BTC BTC "FIFO" >>> ... >>> 2014-01-05 * "Deposit Cold storage" >>> Assets:AU:ColdStorage:BTC 1.0 BTC >>> Assets:AU:Coinjar:BTC -1.0 BTC {} >>> >>> >>> But this appears to trigger another bug! >>> Congratulations, you've found two at once (finding one is reasonably >>> rare these days). >>> >>> Tickets: >>> https://bitbucket.org/blais/beancount/issues/168/fifo- >>> without-a-cost-currency-appears-to >>> >>> >>> I'm going to fix those, but in any case, you shouldn't be able to reduce >>> an inventory with lots with -1.0 BTC. >>> Either you'll have to select the lots explicltly, or let one of the >>> automatic booking methods do it for you. >>> In any case, you should probably never mix operations at cost (with >>> {...}) with those not at cost (without {...}) on a single account. >>> >>> In the meantime, you can disable the booking algorithm by setting the >>> method to "NONE": >>> >>> 2013-11-27 open Assets:AU:Coinjar:BTC BTC "NONE" >>> ... >>> 2014-01-05 * "Deposit Cold storage" >>> Assets:AU:ColdStorage:BTC 1.0 BTC >>> Assets:AU:Coinjar:BTC -1.0 BTC >>> >>> This effectively replicates the Ledger model. The resulting inventory >>> will have all the transactions in it, and you can sum up the resulting >>> number of UNITS() or COST() and these numbers will be correct. However, the >>> detailed contents of the inventory will appear messy. But it works. >>> >>> I think the way forward is for me to fix the two bugs and for you to use >>> the FIFO method thereafter. >>> >>> Or... it's also possible that you're not attempting to track cost basis. >>> If that's the case you can just use price conversions (with @ ...). >>> If you used price conversions, there are no lots (well, just a single >>> lot with no cost basis). >>> >>> I hope this helps, >>> >>> >>> >>> >>> >>> On Mon, Jun 12, 2017 at 12:48 AM, <[email protected]> wrote: >>> >>>> Hi there, >>>> >>>> I'm new to beancount and I'm trying to use it to bring sanity to some >>>> old Bitcoin transactions. >>>> >>>> I start off making the odd purchase of BTC in Australian dollars using >>>> the Coinjar service with one beancount account for BTC and one for AUD. >>>> >>>> However, once I move 1.0 BTC out of my Coinjar BTC account into a paper >>>> wallet, subsequent purchases throw an error in bean-check: >>>> >>>> No position matches "Posting(account='Assets:AU:Coinjar:BTC', >>>> units=0.162288 BTC, >>>> cost=CostSpec(number_per=Decimal('924.2827565808932268559597752'), >>>> number_total=None, currency='AUD', date=None, label=None, merge=False), >>>> price=None, flag=None, meta={'lineno': 24, 'filename': >>>> '/home/dave/fin/accounts/bitcoin-test.beancount'})" against balance >>>> (-1.0 BTC, 0.230398 BTC {651.0473181190808947994340229 AUD, 2013-12-19}, >>>> 0.673358 BTC {742.5470552068884605217432629 AUD, 2013-12-17}, 0.149156 BTC >>>> {1005.658505189197886776261096 AUD, 2013-12-10}, 0.14161 BTC >>>> {1059.247228303085940258456324 AUD, 2013-11-27}, 0.118776 BTC >>>> {1262.881390179834309961608406 AUD, 2013-11-29}) >>>> >>>> But of course no existing position matches; this is a new lot I'm >>>> purchasing. Here's a simple sample file to reproduce. Could someone perhaps >>>> clarify where I've gone wrong? Thanks for your time; I've read the >>>> documentation on booking trades several times but I'm afraid I can't make >>>> sense of this error. >>>> >>>> >>>> 2013-11-27 open Assets:AU:Coinjar:BTC BTC >>>> 2013-11-27 open Assets:AU:Coinjar:Cash AUD >>>> 2013-11-27 open Assets:AU:ColdStorage:BTC BTC >>>> >>>> >>>> 2013-11-27 * "Buy BTC" >>>> Assets:AU:Coinjar:BTC 0.14161 BTC >>>> {1059.247228303085940258456324 AUD} >>>> Assets:AU:Coinjar:Cash -150.00 AUD >>>> 2013-11-29 * "Buy BTC" >>>> Assets:AU:Coinjar:BTC 0.118776 BTC >>>> {1262.881390179834309961608406 AUD} >>>> Assets:AU:Coinjar:Cash -150.00 AUD >>>> 2013-12-10 * "Buy BTC" >>>> Assets:AU:Coinjar:BTC 0.149156 BTC >>>> {1005.658505189197886776261096 AUD} >>>> Assets:AU:Coinjar:Cash -150.00 AUD >>>> 2013-12-17 * "Buy BTC" >>>> Assets:AU:Coinjar:BTC 0.673358 BTC >>>> {742.5470552068884605217432629 AUD} >>>> Assets:AU:Coinjar:Cash -500.00 AUD >>>> 2013-12-19 * "Buy BTC" >>>> Assets:AU:Coinjar:BTC 0.230398 BTC >>>> {651.0473181190808947994340229 AUD} >>>> Assets:AU:Coinjar:Cash -150.00 AUD >>>> 2014-01-05 * "Deposit Cold storage" >>>> Assets:AU:ColdStorage:BTC 1.0 BTC >>>> Assets:AU:Coinjar:BTC -1.0 BTC >>>> ; The following tx now throws an error though it is syntactically >>>> identical to the >>>> ; purchases above. Why? >>>> 2014-01-28 * "Buy BTC" >>>> Assets:AU:Coinjar:BTC 0.162288 BTC >>>> {924.2827565808932268559597752 AUD} >>>> Assets:AU:Coinjar:Cash -150.00 AUD >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Beancount" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> To view this discussion on the web visit https://groups.google.com/d/ >>>> msgid/beancount/2beb84b0-8f10-4c40-b6d5-abfa2b77cda5%40googlegroups.com >>>> <https://groups.google.com/d/msgid/beancount/2beb84b0-8f10-4c40-b6d5-abfa2b77cda5%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "Beancount" group. >> To unsubscribe from this topic, visit https://groups.google.com/d/ >> topic/beancount/Qvbcq-Sk5NY/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> [email protected]. >> To post to this group, send email to [email protected]. >> To view this discussion on the web visit https://groups.google.com/d/ >> msgid/beancount/CAK21%2BhOkq9PG746Ru2X-VQaZ9BRRTDgm% >> 2B5Z0h2Z2UvLH_nbGbQ%40mail.gmail.com >> <https://groups.google.com/d/msgid/beancount/CAK21%2BhOkq9PG746Ru2X-VQaZ9BRRTDgm%2B5Z0h2Z2UvLH_nbGbQ%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > -- > You received this message because you are subscribed to the Google Groups > "Beancount" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > To view this discussion on the web visit https://groups.google.com/d/ > msgid/beancount/CAHkYY6X5h%2Bo-sVad2QirragiTG_wJEMnbyYDYZ_TbvhPg6n1ug% > 40mail.gmail.com > <https://groups.google.com/d/msgid/beancount/CAHkYY6X5h%2Bo-sVad2QirragiTG_wJEMnbyYDYZ_TbvhPg6n1ug%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- Best regards, Daniël Bos Your government is reading your email. Slow them down with encryption. My public key: http://goo.gl/gms497 (4096 bit RSA, id EF2D5D91) Fingerprint : D8D0 9FBE F075 F709 7B52 2F73 326C 2123 EF2D 5D91 -- You received this message because you are subscribed to the Google Groups "Beancount" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/CADPdpKbmhTYm_GWriJwZxaGYGYHP2AZT%2BrPH96fQnES37sk1hg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
