How to create transaction in GnuCash in response to an email?

0 votes

I would like to create a script which is triggered by an email filter which, when run, creates two transactions in GnuCash. I see that GnuCash has Python bindings but the documentation is sparse at best... a better term would be "nonexistent".

Is it possible to write a script which will create transactions in GnuCash? If so, what would the very basic code look like? I just need a starting point; once I have that I can script this fairly well myself.

Sep 5, 2018 in Python by bug_seeker
• 14,970 points

1 answer to this question.

Your answer

Your name to display (optional):
Privacy: Your email address will only be used for sending these notifications.
0 votes

Here's a template, along with a couple of account lookup functions which are sorely lacking in the library. You can place all of the transaction code into a function, then hand in whatever data you need to create the two custom transactions. Then just call the transaction function from your email listener, and you should be in business.

from gnucash import Session, Account, Transaction, Split, GncNumeric
import gnucash
from datetime import datetime

def lookup_account_by_path(parent, path):
    acc = parent.lookup_by_name(path[0])
    if acc.get_instance() == None:
        raise Exception('Account path {} not found'.format(':'.join(path)))
    if len(path) > 1:
        return lookup_account_by_path(acc, path[1:])
    return acc

def lookup_account(root, name):
    path = name.split(':')
    return lookup_account_by_path(root, path)

session = Session("/path/to/file.gnucash") #, ignore_lock=True)
   # or use URI string: ('mysql://USER:PASSWORD@HOST/DATABASE')

today =
book = # All actions are performed through the book object (or its children)
root = book.get_root_account() # Parent of all accounts
currency = book.get_table().lookup('ISO4217', "USD")
tx = Transaction(book)
tx.SetDatePostedTS(today) # or another datetime object for the transaction's "register date"
tx.SetDescription("Transaction Description!")
#tx.SetNum(int_variable) # if you need a transaction number

sp1 = Split(book) # First half of transaction
# The lookup string needs to match your account path exactly.
sp1.SetAccount(lookup_account(root, "Expenses:Some Expense Account"))
# amount is an int (no $ or .), so $5.23 becomes amount=523
sp1.SetValue(GncNumeric(amount, 100)) # Assuming you only have one split
# For multiple splits, you need to make sure the totals all balance out.
sp1.SetAmount(GncNumeric(amount, 100))
sp1.SetMemo("Split Memo!") # optional

sp2 = Split(book) # Need a balancing split
sp2.SetAccount(lookup_account(root, "Assets:Current Assets:Checking"))
sp2.SetMemo("Other Split Memo!") # optional

tx.CommitEdit() # Finish editing transaction
answered Sep 5, 2018 by Priyaj
• 56,120 points

Related Questions In Python

+4 votes
7 answers
0 votes
1 answer

how to exit a python script in an if statement

This works fine for me: while True: ...READ MORE

answered Sep 19, 2018 in Python by bug_seeker
• 14,970 points
0 votes
1 answer

How to break for loop in an if statement

You can break out of each loop ...READ MORE

answered Nov 16, 2018 in Python by Jino
• 5,520 points
0 votes
1 answer

How to correctly return an a dictionary as an output in zappier code using python?

David here, from the Zapier Platform team. ...READ MORE

answered Dec 3, 2018 in Python by charlie_brown
• 7,710 points
0 votes
1 answer

how can i count the items in a list?

suppose you have a list a = [0,1,2,3,4,5,6,7,8,9,10] now ...READ MORE

answered May 2 in Python by Mohammad
• 1,400 points
+1 vote
1 answer
+1 vote
1 answer

How to print an error in Python?

For Python 2.6 and later and Python ...READ MORE

answered Aug 23, 2018 in Python by Priyaj
• 56,120 points

© 2018 Brain4ce Education Solutions Pvt. Ltd. All rights Reserved.
"PMP®","PMI®", "PMI-ACP®" and "PMBOK®" are registered marks of the Project Management Institute, Inc. MongoDB®, Mongo and the leaf logo are the registered trademarks of MongoDB, Inc.