I love to see these custom solutions. Really glad the API's working for you.
BTW, there's a function that will gather a mapping of the open/close directories here: https://bitbucket.org/blais/beancount/src/377fdf5891e427f1f6041e7d257915a17e784745/beancount/core/getters.py?at=default&fileviewer=file-view-default#getters.py-264 Might be useful (but it does look like you don't need it). Cheers, On Mon, May 1, 2017 at 11:08 AM, <[email protected]> wrote: > Thank you very much for your answers. > In the end I took your advice and defined metadata on the account's Open > directive: > > 2017-03-01 open > *Assets:Credits:CLIENT* name: "Client's Company Name" > address: "1234 somewhere, someplace 0000 USA" > e-mail: "[email protected]" > > And accessed the metadata in Python directly: > > #!/usr/bin/env python3 > from beancount.core import data > import re > > def get_open_meta(entries, acct_regex): > """ > Return a dictionary formed from combining the metadata dictionaries > of all 'Open' statements for accounts matching 'acct_regex'. > > Will return an empty dicionary if no accounts matched. > > Done this say so that metadata from multiple related accounts can be > gathered > into one set, which can then be queried. > """ > meta = {} > for ent in entries: > if type(ent) == data.Open and re.match(acct_regex, ent.account): > meta.update(ent.meta) > return meta > > > # MAIN > if __name__ == "__main__" : > from beancount import loader > entries, errors, options = loader.load_file("somefile.beancount") > meta = get_open_meta(entries, '.*CLIENT') #client metadata > > print(""" > {0} > {1} > {2}""".format(meta['name'], #will error if 'name' not defined > ' \n'.join(meta['address'].split('; ')), #allows multiple > lines as 'line1; line2' > meta.get('e-mail')) #doesn't barf if e-mail isn't specified > ) > > > > On Wednesday, April 26, 2017 at 5:07:14 PM UTC+2, [email protected] wrote: >> >> Hello All, >> >> Is there a way to query directives which are not transactions? >> Currently I'm seeing this: >> >> beancount> select * where type != "transaction" >> >> (empty) >> >> beancount> >> >> >> >> The problem I'm trying to solve is invoice generation: want to store >> client-specific metadata (e.g.: address) in the ledger somewhere; then >> query them and have the results be the various fields of the generated >> invoice. >> >> An example might be: >> >> 2017-03-01 note *Assets:Credits:CLIENT* "Via Lungolago 13, >> CH-6900 Lugano" #address >> >> And an example query might be: >> >> SELECT last(narration) FROM (type = "note") AND ("address" in tags) >> WHERE account = "*Assets:Credits:CLIENT*" >> ... assuming that a note's text field is referred to as "narration". >> >> This would have the advantage of being able to declare new addresses if >> the client moves. >> The #address tag is so that other notes may exist without breaking this >> query. >> >> >> >> I'm not sure if this is the way this problem should be solved, maybe a >> different approach is best? >> >> Thank you very much, >> >> 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]. > 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/fd6fd747-fc78-48f1-a86e-5e282a8676d2%40googlegroups.com > <https://groups.google.com/d/msgid/beancount/fd6fd747-fc78-48f1-a86e-5e282a8676d2%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/CAK21%2BhO41YhPW%2BLhcBdVV36epGWNAj5eyUP6jzUHpnMhcJKj8A%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
