Thank you sir; understood.
Really appreciate the help :)

best,

Sirio

On Friday, May 26, 2017 at 1:53:39 PM UTC-4, Martin Blais wrote:
>
> Hi Sirio,
> IIRC the SQL client doesn't use nor respect the functionality implemented 
> by DisplayContext:
>
> https://bitbucket.org/blais/beancount/src/tip/TODO?fileviewer=file-view-default#TODO-480
> I want to rewrite the SQL client entirely at some point, and I figured I'd 
> leave that for the rewrite.
>
> Read this doc for info on tolerances:
> http://furius.ca/beancount/doc/tolerances
>
> Also, reading the source code of the DisplayContext and its related 
> classes should provide a good overview of how that's all implemented:
>
> https://bitbucket.org/blais/beancount/src/tip/beancount/core/display_context.py
>
>
>
>
>
> On Fri, May 26, 2017 at 9:21 AM, <[email protected] <javascript:>> wrote:
>
>> Ciao Martin,
>>
>> I'm building some reporting/form generation on top of Beancount, and have 
>> a question about how best to handle rounding/tolerance in the code.
>>
>> The problem I'm trying to solve is to safely assert invariants which will 
>> detect accounting errors.
>>
>> Let me give an example:
>>
>>
>> from beancount.query.query import run_query
>> from beancount.query.query_render import render_text
>> from beancount.core.amount import Amount, mul as amount_mul
>> from beancount.core.number import Decimal
>>
>>
>> def total_query_(entries, options, currency, query_string):
>>     '''Runs a query, then returns the last value (or 0 if no result) as 
>> an Amount
>>     '''
>>     qy_types, qy_rows = run_query(entries, options, query_string)
>>     if len(qy_rows):
>>         return qy_rows[-1].total.get_units(currency)
>>     else:
>>         return Amount(Decimal('0.00'), currency)
>>
>>
>> taxable_earnings = total_query_(entries, options, currency,
>>     '''SELECT sum(position) as total
>>     WHERE account ~ "EarningsBlahBlah"
>>     '''.format(fiscal_quarter.query())
>>     )
>>
>> tax_owed = total_query_(entries, options, currency,
>>     '''SELECT sum(position) as total
>>     WHERE account ~ "SpecificTaxAccount"
>>     '''.format(fiscal_quarter.query())
>>     )
>>
>> tax_rate = Decimal('0.07')
>> currency = 'WHATEVER'
>>
>> # invariant: bookings to SpecificTaxAccount must equal EarningsBlahBlah 
>> times the tax rate
>> assert amount_mul(taxable_earnings, tax_rate) == tax_owed, (
>>     'taxable earnings {0} * {1} = {2} != tax_owed {3}'.format(
>>             taxable_earnings, tax_rate,
>>             amount_mul(taxable_earnings, tax_rate),
>>             tax_owed)
>>     )
>>
>> This might fail because 1.4188 != 1.42
>> However, accounting errors might create a (perfectly valid, error-free) 
>> ledger where there is much more discrepancy between the figures - and I 
>> need to catch that.
>>
>> As a note, I'm running with:
>>
>> option  "inferred_tolerance_default"    "*:0.005"
>>
>> It's not immediately obvious to me how to best plug into Beancount's 
>> "standard" rounding approach (and TBH I don't fully understand that 
>> approach yet :P)
>>
>> I could of course just hack something like this:
>>
>> assert round(amount_mul(taxable_earnings, tax_rate).number, 2) == 
>> round(tax_owed.number, 2)
>>
>> ... but that's so ugly it hurts and I'm also hard-coding a rounding value 
>> disregarding beancount's tolerance figures.
>>
>> Any advice is appreciated.
>>
>> Thank you and all the best,
>>
>> Sirio
>>
>> -- 
>> 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] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/beancount/2ddc2c79-952c-448d-ad95-ddf6490b9b2a%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/beancount/2ddc2c79-952c-448d-ad95-ddf6490b9b2a%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 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/60bff553-9052-460c-87cd-2344511d5269%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to