Hey Daniël, Thanks a lot but yep, I've already got Fava installed and I've started playing with it. I can see it's going to be really useful for ad-hoc stuff and for getting to grips with the fundamentals. I'm looking forward to it. As, I imagine, my tax accountant would be if he knew I was motivated for once...
On Tue, 13 Jun 2017 at 14:38 Daniël Bos <[email protected]> wrote: > 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 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/CADPdpKbmhTYm_GWriJwZxaGYGYHP2AZT%2BrPH96fQnES37sk1hg%40mail.gmail.com > <https://groups.google.com/d/msgid/beancount/CADPdpKbmhTYm_GWriJwZxaGYGYHP2AZT%2BrPH96fQnES37sk1hg%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/CAHkYY6WCOxLm-KqNLvusOBidzry%2B70z4YE-wbbg7d%3Du72JqejA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
